From s.hauer at pengutronix.de  Mon Aug  2 01:37:12 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 2 Aug 2010 07:37:12 +0200
Subject: Porting to Marvell 88F5182?
In-Reply-To: <4C532D05.7020407@dawes.za.net>
References: <4C532D05.7020407@dawes.za.net>
Message-ID: <20100802053712.GI14113@pengutronix.de>

Hi Rogan,

On Fri, Jul 30, 2010 at 09:50:29PM +0200, Rogan Dawes wrote:
> Hi folks,
>
> I am trying to get a decent boot loader running on my DLink DNS323. It  
> was shipped with a severely crippled version of U-Boot, forked from  
> U-Boot 1.1.1, and heavily bastardized by Marvell.
>
> Recently, Albert Aribaud has added support for this chipset in U-Boot  
> master for his LaCie ED MiniV2, which is based on the same SoC, and I am  
> now trying to get my DLink DNS323 to work as well.
>
> I have managed to get just about everything to work, except for the  
> flash part, a Spansion S29GL064M90TFIR4 device. Unfortunately, there  
> seems to be some strange connections going on, and the standard U-Boot  
> CFI code does not recognise it.
>
> I see that there has been a lot of changes to the BareBox CFI code since  
> it was forked from U-Boot 1.2.0, and I was wondering if maybe that code  
> would be more successful.
>
> So, the question then:
>
> Given a working board definition in U-Boot master for an ARM926EJ-S  
> based Soc, how difficult is it to port this to current BareBox master?

The simplest port I can think of is the following patch which adds
minimal support for the pxa270. It supports 2nd stage only, so this
should be a good start for you. For getting this to run it's a good idea
to determine the tx register of your serial port under U-Boot. Just try
to do a 'mw <txreg> <0x55> under U-Boot. When you see a capital 'U' you
got it. You can then add

#include <asm/io.h>

	writel(0x55, txreg);

in the startup code in barebox to see if you get there.

Other what Eric suggested I recommend to just use the barebox.bin file.
You can start it with the 'go' command in U-Boot.

The patch is a bit out of date, so it probably won't apply directly.

Hope that helps

 Sascha


commit aed89d7f0294039b623f7ce68276e5e9ab026b00
Author: Sascha Hauer <s.hauer at pengutronix.de>
Date:   Sat Oct 10 17:45:10 2009 +0200

    pxa minimal port
    
    Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 441dfb6..6883f7e 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -21,6 +21,7 @@ config ARCH_TEXT_BASE
 	default 0x33fc0000 if MACH_A9M2440
 	default 0x23f00000 if MACH_MMCCPU
 	default 0xa0000000 if MACH_EUKREA_CPUIMX27
+	default 0xa3f00000 if MACH_PCM027
 
 config BOARDINFO
 	default "Synertronixx scb9328" if MACH_SCB9328
@@ -39,6 +40,7 @@ config BOARDINFO
 	default "Phytec phyCard-i.MX27" if MACH_PCA100
 	default "Bucyrus MMC-CPU" if MACH_MMCCPU
 	default "Eukrea CPUIMX27" if MACH_EUKREA_CPUIMX27
+	default "Phytec phyCORE-PXA270" if MACH_PCM027
 
 config BOARD_LINKER_SCRIPT
 	bool
@@ -90,6 +92,9 @@ config ARCH_AT91SAM9263
 	select ARCH_AT91SAM9
 	select MACH_HAS_LOWLEVEL_INIT
 
+config ARCH_PXA
+	bool
+
 choice
 	prompt "Select your board"
 
@@ -257,6 +262,14 @@ config MACH_EUKREA_CPUIMX27
 	  Say Y here if you are using Eukrea's CPUIMX27 equipped
 	  with a Freescale i.MX27 Processor
 
+config MACH_PCM027
+	bool "Phytec phyCORE-PXA270"
+	select HAS_CFI
+	select ARCH_PXA
+	help
+	  Say Y here if you are using a Phytec phyCORE PXA270
+	  board
+
 endchoice
 
 source arch/arm/mach-imx/Kconfig
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 83fe532..ae2de97 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -8,6 +8,7 @@ machine-$(CONFIG_ARCH_AT91RM9200)  := at91rm9200
 machine-$(CONFIG_ARCH_OMAP)        := omap
 machine-$(CONFIG_ARCH_AT91SAM9)    := at91sam9
 machine-$(CONFIG_ARCH_S3C24xx)     := s3c24xx
+machine-$(CONFIG_ARCH_PXA)         := pxa
 board-$(CONFIG_MACH_MX1ADS)	   := mx1ads
 board-$(CONFIG_MACH_ECO920)	   := eco920
 board-$(CONFIG_MACH_SCB9328)	   := scb9328
@@ -27,6 +28,7 @@ board-$(CONFIG_MACH_PCA100)        := phycard-i.MX27
 board-$(CONFIG_MACH_MMCCPU)        := mmccpu
 board-$(CONFIG_MACH_A9M2440)       := a9m2440
 board-$(CONFIG_MACH_EUKREA_CPUIMX27) := eukrea_cpuimx27
+board-$(CONFIG_MACH_PCM027)        := pcm027
 
 # FIXME "cpu-y" never used on ARM!
 cpu-$(CONFIG_ARM920T)              := arm920t
diff --git a/arch/arm/cpu/Makefile b/arch/arm/cpu/Makefile
index 3b6a6d7..c7e522e 100644
--- a/arch/arm/cpu/Makefile
+++ b/arch/arm/cpu/Makefile
@@ -9,6 +9,7 @@ obj-$(CONFIG_ARM926EJS) += start-arm.o
 obj-$(CONFIG_ARMCORTEXA8) += start-arm.o
 obj-$(CONFIG_ARCH_IMX31) += start-arm.o
 obj-$(CONFIG_ARCH_IMX35) += start-arm.o
+obj-$(CONFIG_ARCH_PXA) += start-arm.o
 obj-$(CONFIG_CMD_ARM_CPUINFO) += cpuinfo.o
 obj-$(CONFIG_MMU) += mmu.o
 obj-$(CONFIG_MMU) += cache.o
diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile
new file mode 100644
index 0000000..9b82b6d
--- /dev/null
+++ b/arch/arm/mach-pxa/Makefile
@@ -0,0 +1 @@
+obj-y	+= common.o clocksource.o
diff --git a/arch/arm/mach-pxa/clocksource.c b/arch/arm/mach-pxa/clocksource.c
new file mode 100644
index 0000000..309f1ab
--- /dev/null
+++ b/arch/arm/mach-pxa/clocksource.c
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2009 Sascha Hauer <s.hauer at pengutronix.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 <init.h>
+#include <clock.h>
+#include <asm/io.h>
+
+#define OSCR	0x40A00010
+
+uint64_t pxa_clocksource_read(void)
+{
+	return readl(OSCR);
+}
+
+static struct clocksource cs = {
+	.read	= pxa_clocksource_read,
+	.mask	= 0xffffffff,
+	.shift	= 20,
+};
+
+static int clocksource_init (void)
+{
+	cs.mult = clocksource_hz2mult(3250000, cs.shift);
+
+	init_clock(&cs);
+
+	return 0;
+}
+
+core_initcall(clocksource_init);
diff --git a/arch/arm/mach-pxa/common.c b/arch/arm/mach-pxa/common.c
new file mode 100644
index 0000000..3653109
--- /dev/null
+++ b/arch/arm/mach-pxa/common.c
@@ -0,0 +1,20 @@
+#include <common.h>
+#include <asm/io.h>
+
+#define OSMR3	0x40A0000C
+#define OSCR	0x40A00010
+#define OSSR	0x40A00014
+#define OWER	0x40A00018
+
+#define OWER_WME	(1 << 0)	/* Watch-dog Match Enable */
+#define OSSR_M3		(1 << 3)	/* Match status channel 3 */
+
+void reset_cpu(ulong addr)
+{
+	/* Initialize the watchdog and let it fire */
+	writel(OWER_WME, OWER);
+	writel(OSSR_M3, OSSR);
+	writel(readl(OSCR) + 368640, OSMR3);  /* ... in 100 ms */
+
+	while(1);
+}
diff --git a/board/pcm027/Makefile b/board/pcm027/Makefile
new file mode 100644
index 0000000..dcfc293
--- /dev/null
+++ b/board/pcm027/Makefile
@@ -0,0 +1 @@
+obj-y += board.o
diff --git a/board/pcm027/board.c b/board/pcm027/board.c
new file mode 100644
index 0000000..450700d
--- /dev/null
+++ b/board/pcm027/board.c
@@ -0,0 +1,86 @@
+/*
+ * (C) 2009 Pengutronix, Sascha Hauer <s.hauer at pengutronix.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 <init.h>
+#include <driver.h>
+#include <environment.h>
+#include <asm/armlinux.h>
+#include <asm/io.h>
+#include <partition.h>
+#include <asm/mach-types.h>
+#include <cfi_flash.h>
+
+static struct device_d network_dev = {
+        .name     = "smc91c111",
+        .map_base = 0x14000300,
+        .size     = 16,
+};
+
+static struct memory_platform_data sdram_pdata = {
+	.name	= "ram0",
+	.flags	= DEVFS_RDWR,
+};
+
+static struct device_d sdram_dev = {
+	.name     = "mem",
+	.map_base = 0xa0000000,
+	.size     = 64 * 1024 * 1024,
+	.platform_data = &sdram_pdata,
+};
+
+static struct device_d cfi_dev = {
+	.name     = "cfi_flash",
+	.map_base = 0x0,
+	.size     = 32 * 1024 * 1024,
+};
+
+static int pcm027_devices_init(void)
+{
+	register_device(&network_dev);
+	register_device(&sdram_dev);
+	register_device(&cfi_dev);
+
+	armlinux_add_dram(&sdram_dev);
+	armlinux_set_bootparams((void *)0xa0000100);
+	armlinux_set_architecture(MACH_TYPE_PCM027);
+
+	return 0;
+}
+
+device_initcall(pcm027_devices_init);
+
+static struct device_d pcm027_serial_device = {
+	.name     = "pxa_serial",
+	.map_base = 0x40100000,
+	.size     = 0x24,
+};
+
+static int pcm027_console_init(void)
+{
+	register_device(&pcm027_serial_device);
+	return 0;
+}
+
+console_initcall(pcm027_console_init);
+
diff --git a/board/pcm027/config.h b/board/pcm027/config.h
new file mode 100644
index 0000000..e69de29
diff --git a/board/pcm027/env/bin/_update b/board/pcm027/env/bin/_update
new file mode 100644
index 0000000..fb7cbe8
--- /dev/null
+++ b/board/pcm027/env/bin/_update
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+if [ -z "$part" -o -z "$image" ]; then
+	echo "define \$part and \$image"
+	exit 1
+fi
+
+if [ \! -e "$part" ]; then
+	echo "Partition $part does not exist"
+	exit 1
+fi
+
+if [ $# = 1 ]; then
+	image=$1
+fi
+
+if [ x$ip = xdhcp ]; then
+	dhcp
+fi
+
+ping $eth0.serverip
+if [ $? -ne 0 ] ; then
+	echo "update aborted"
+	exit 1
+fi
+
+unprotect $part
+
+echo
+echo "erasing partition $part"
+erase $part
+
+echo
+echo "flashing $image to $part"
+echo
+tftp $image $part
diff --git a/board/pcm027/env/bin/boot b/board/pcm027/env/bin/boot
new file mode 100644
index 0000000..6d87838
--- /dev/null
+++ b/board/pcm027/env/bin/boot
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+. /env/config
+
+if [ x$1 = xnet ]; then
+	root=net
+	kernel=net
+fi
+
+if [ x$1 = xnor ]; then
+	root=nor
+	kernel=nor
+fi
+
+if [ x$ip = xdhcp ]; then
+	bootargs="$bootargs ip=dhcp"
+else
+	bootargs="$bootargs ip=$eth0.ipaddr:$eth0.serverip:$eth0.gateway:$eth0.netmask:::"
+fi
+
+if [ x$root = xnor ]; then
+	bootargs="$bootargs root=$rootpart_nor rootfstype=jffs2"
+else
+	bootargs="$bootargs root=/dev/nfs nfsroot=$eth0.serverip:$nfsroot,v3,tcp"
+fi
+
+bootargs="$bootargs mtdparts=physmap-flash.0:$nor_parts"
+
+if [ $kernel = net ]; then
+	if [ x$ip = xdhcp ]; then
+		dhcp
+	fi
+	tftp $uimage uImage || exit 1
+	bootm uImage
+elif [ $kernel = nor ]; then
+	bootm /dev/nor0.kernel
+else
+	echo "please set kernel to either net or nor"
+fi
+
diff --git a/board/pcm027/env/bin/hush_hack b/board/pcm027/env/bin/hush_hack
new file mode 100644
index 0000000..5fffa92
--- /dev/null
+++ b/board/pcm027/env/bin/hush_hack
@@ -0,0 +1 @@
+nand -a /dev/nand0.*
diff --git a/board/pcm027/env/bin/init b/board/pcm027/env/bin/init
new file mode 100644
index 0000000..5a1ded6
--- /dev/null
+++ b/board/pcm027/env/bin/init
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+PATH=/env/bin
+export PATH
+
+. /env/config
+if [ -e /dev/nor0 ]; then
+	addpart /dev/nor0 $nor_parts
+fi
+
+if [ -e /dev/nand0 ]; then
+	addpart /dev/nand0 $nand_parts
+
+	# Uh, oh, hush first expands wildcards and then starts executing
+	# commands. What a bug!
+	source /env/bin/hush_hack
+fi
+
+if [ -z $eth0.ethaddr ]; then
+	while [ -z $eth0.ethaddr ]; do
+		readline "no MAC address set for eth0. please enter the one found on your board: " eth0.ethaddr
+	done
+	echo -a /env/config "eth0.ethaddr=$eth0.ethaddr"
+fi
+
+echo
+echo -n "Hit any key to stop autoboot: "
+timeout -a $autoboot_timeout
+if [ $? != 0 ]; then
+	echo
+	echo "type update_kernel nand|nor [<imagename>] to update kernel into flash"
+	echo "type update_root nand|nor [<imagename>] to update rootfs into flash"
+	echo
+	exit
+fi
+
+boot
diff --git a/board/pcm027/env/bin/update_kernel b/board/pcm027/env/bin/update_kernel
new file mode 100644
index 0000000..05c822d
--- /dev/null
+++ b/board/pcm027/env/bin/update_kernel
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+. /env/config
+
+image=$uimage
+if [ x$1 = xnand ]; then
+	part=/dev/nand0.kernel.bb
+elif [ x$1 = xnor ]; then
+	part=/dev/nor0.kernel
+else
+	echo "usage: $0 nor|nand [imagename]"
+	exit 1
+fi
+
+. /env/bin/_update $2
diff --git a/board/pcm027/env/bin/update_root b/board/pcm027/env/bin/update_root
new file mode 100644
index 0000000..eaf36eb
--- /dev/null
+++ b/board/pcm027/env/bin/update_root
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+. /env/config
+
+image=$uimage
+if [ x$1 = xnand ]; then
+	part=/dev/nand0.root.bb
+elif [ x$1 = xnor ]; then
+	part=/dev/nor0.root
+else
+	echo "usage: $0 nor|nand [imagename]"
+	exit 1
+fi
+
+. /env/bin/_update $2
+
diff --git a/board/pcm027/env/config b/board/pcm027/env/config
new file mode 100644
index 0000000..d5412a1
--- /dev/null
+++ b/board/pcm027/env/config
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+# can be either 'net', 'nor' or 'nand''
+kernel=net
+root=net
+
+uimage=uImage-pcm027
+jffs2=root-pcm037.jffs2
+
+autoboot_timeout=3
+
+nfsroot="/tmp"
+bootargs="console=ttyS0,115200"
+
+nor_parts="256k(uboot)ro,128k(ubootenv),1536k(kernel),-(root)"
+rootpart_nor="/dev/mtdblock3"
+
+# use 'dhcp' to do dhcp in uboot and in kernel
+ip=dhcp
+
+# or set your networking parameters here
+#eth0.ipaddr=a.b.c.d
+#eth0.netmask=a.b.c.d
+#eth0.gateway=a.b.c.d
+#eth0.serverip=a.b.c.d
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 6acce19..bac3f23 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -57,4 +57,8 @@ config DRIVER_SERIAL_S3C24X0_AUTOSYNC
 	  Say Y here if you want to use the auto flow feature of this
 	  UART. RTS and CTS will be handled by the hardware when enabled.
 
+config DRIVER_SERIAL_PXA
+	bool "PXA serial driver"
+	depends on ARCH_PXA
+
 endmenu
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index 3bc965c..2005254 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -13,3 +13,4 @@ obj-$(CONFIG_DRIVER_SERIAL_MPC5XXX)		+= serial_mpc5xxx.o
 obj-$(CONFIG_DRIVER_SERIAL_BLACKFIN)		+= serial_blackfin.o
 obj-$(CONFIG_DRIVER_SERIAL_NS16550)		+= serial_ns16550.o
 obj-$(CONFIG_DRIVER_SERIAL_S3C24X0)		+= serial_s3c24x0.o
+obj-$(CONFIG_DRIVER_SERIAL_PXA)			+= serial_pxa.o
diff --git a/drivers/serial/serial_pxa.c b/drivers/serial/serial_pxa.c
new file mode 100644
index 0000000..d37354c
--- /dev/null
+++ b/drivers/serial/serial_pxa.c
@@ -0,0 +1,179 @@
+/*
+ * (c) 2009 Sascha Hauer <s.hauer at pengutronix.de>
+ *
+ * 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 <driver.h>
+#include <init.h>
+#include <malloc.h>
+#include <asm/io.h>
+
+#define RBR		0x00  /* Receive Buffer Register (read only) */
+#define THR		0x00  /* Transmit Holding Register (write only) */
+#define IER		0x04  /* Interrupt Enable Register (read/write) */
+#define IIR		0x08  /* Interrupt ID Register (read only) */
+#define FCR		0x08  /* FIFO Control Register (write only) */
+#define LCR		0x0c  /* Line Control Register (read/write) */
+#define MCR		0x10  /* Modem Control Register (read/write) */
+#define LSR		0x14  /* Line Status Register (read only) */
+#define MSR		0x18  /* Modem Status Register (read only) */
+#define SPR		0x1c  /* Scratch Pad Register (read/write) */
+#define ISR		0x20  /* Infrared Selection Register (read/write) */
+#define DLL		0x00  /* Divisor Latch Low Register (DLAB = 1) (read/write) */
+#define DLH		0x04  /* Divisor Latch High Register (DLAB = 1) (read/write) */
+
+#define IER_DMAE	(1 << 7)	/* DMA Requests Enable */
+#define IER_UUE		(1 << 6)	/* UART Unit Enable */
+#define IER_NRZE	(1 << 5)	/* NRZ coding Enable */
+#define IER_RTIOE	(1 << 4)	/* Receiver Time Out Interrupt Enable */
+#define IER_MIE		(1 << 3)	/* Modem Interrupt Enable */
+#define IER_RLSE	(1 << 2)	/* Receiver Line Status Interrupt Enable */
+#define IER_TIE		(1 << 1)	/* Transmit Data request Interrupt Enable */
+#define IER_RAVIE	(1 << 0)	/* Receiver Data Available Interrupt Enable */
+
+#define IIR_FIFOES1	(1 << 7)	/* FIFO Mode Enable Status */
+#define IIR_FIFOES0	(1 << 6)	/* FIFO Mode Enable Status */
+#define IIR_TOD		(1 << 3)	/* Time Out Detected */
+#define IIR_IID2	(1 << 2)	/* Interrupt Source Encoded */
+#define IIR_IID1	(1 << 1)	/* Interrupt Source Encoded */
+#define IIR_IP		(1 << 0)	/* Interrupt Pending (active low) */
+
+#define FCR_ITL2	(1 << 7)	/* Interrupt Trigger Level */
+#define FCR_ITL1	(1 << 6)	/* Interrupt Trigger Level */
+#define FCR_RESETTF	(1 << 2)	/* Reset Transmitter FIFO */
+#define FCR_RESETRF	(1 << 1)	/* Reset Receiver FIFO */
+#define FCR_TRFIFOE	(1 << 0)	/* Transmit and Receive FIFO Enable */
+#define FCR_ITL_1	(0)
+#define FCR_ITL_8	(FCR_ITL1)
+#define FCR_ITL_16	(FCR_ITL2)
+#define FCR_ITL_32	(FCR_ITL2|FCR_ITL1)
+
+#define LCR_DLAB	(1 << 7)	/* Divisor Latch Access Bit */
+#define LCR_SB		(1 << 6)	/* Set Break */
+#define LCR_STKYP	(1 << 5)	/* Sticky Parity */
+#define LCR_EPS		(1 << 4)	/* Even Parity Select */
+#define LCR_PEN		(1 << 3)	/* Parity Enable */
+#define LCR_STB		(1 << 2)	/* Stop Bit */
+#define LCR_WLS1	(1 << 1)	/* Word Length Select */
+#define LCR_WLS0	(1 << 0)	/* Word Length Select */
+
+#define LSR_FIFOE	(1 << 7)	/* FIFO Error Status */
+#define LSR_TEMT	(1 << 6)	/* Transmitter Empty */
+#define LSR_TDRQ	(1 << 5)	/* Transmit Data Request */
+#define LSR_BI		(1 << 4)	/* Break Interrupt */
+#define LSR_FE		(1 << 3)	/* Framing Error */
+#define LSR_PE		(1 << 2)	/* Parity Error */
+#define LSR_OE		(1 << 1)	/* Overrun Error */
+#define LSR_DR		(1 << 0)	/* Data Ready */
+
+#define MCR_LOOP	(1 << 4)	*/
+#define MCR_OUT2	(1 << 3)	/* force MSR_DCD in loopback mode */
+#define MCR_OUT1	(1 << 2)	/* force MSR_RI in loopback mode */
+#define MCR_RTS		(1 << 1)	/* Request to Send */
+#define MCR_DTR		(1 << 0)	/* Data Terminal Ready */
+
+#define MSR_DCD		(1 << 7)	/* Data Carrier Detect */
+#define MSR_RI		(1 << 6)	/* Ring Indicator */
+#define MSR_DSR		(1 << 5)	/* Data Set Ready */
+#define MSR_CTS		(1 << 4)	/* Clear To Send */
+#define MSR_DDCD	(1 << 3)	/* Delta Data Carrier Detect */
+#define MSR_TERI	(1 << 2)	/* Trailing Edge Ring Indicator */
+#define MSR_DDSR	(1 << 1)	/* Delta Data Set Ready */
+#define MSR_DCTS	(1 << 0)	/* Delta Clear To Send */
+
+struct pxa_serial_priv {
+	struct console_device cdev;
+};
+
+static void pxa_serial_putc(struct console_device *cdev, char c)
+{
+	struct device_d *dev = cdev->dev;
+
+	while (!(readl(dev->map_base + LSR) & LSR_TEMT));
+
+	writel(c, dev->map_base + THR);
+}
+
+static int pxa_serial_tstc(struct console_device *cdev)
+{
+	struct device_d *dev = cdev->dev;
+
+	return readl(dev->map_base + LSR) & LSR_DR;
+}
+
+static int pxa_serial_getc(struct console_device *cdev)
+{
+	struct device_d *dev = cdev->dev;
+	unsigned char ch;
+
+	while (!(readl(dev->map_base + LSR) & LSR_DR));
+
+	ch = readl(dev->map_base + RBR) & 0xff;
+
+	return ch;
+}
+
+static void pxa_serial_flush(struct console_device *cdev)
+{
+}
+
+static int pxa_serial_setbaudrate(struct console_device *cdev, int baudrate)
+{
+	return 0;
+}
+
+static int pxa_serial_probe(struct device_d *dev)
+{
+	struct console_device *cdev;
+	struct pxa_serial_priv *priv;
+
+	priv = malloc(sizeof(*priv));
+	cdev = &priv->cdev;
+
+	dev->type_data = cdev;
+	cdev->dev = dev;
+	cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
+	cdev->tstc = pxa_serial_tstc;
+	cdev->putc = pxa_serial_putc;
+	cdev->getc = pxa_serial_getc;
+	cdev->flush = pxa_serial_flush;
+	cdev->setbrg = pxa_serial_setbaudrate;
+
+	console_register(cdev);
+
+	return 0;
+}
+
+static void pxa_serial_remove(struct device_d *dev)
+{
+	free(dev->type_data);
+}
+
+static struct driver_d pxa_serial_driver = {
+        .name   = "pxa_serial",
+        .probe  = pxa_serial_probe,
+	.remove = pxa_serial_remove,
+};
+
+static int pxa_serial_init(void)
+{
+	register_driver(&pxa_serial_driver);
+	return 0;
+}
+
+console_initcall(pxa_serial_init);

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Mon Aug  2 07:58:50 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon,  2 Aug 2010 14:58:50 +0300
Subject: [PATCH 0/3] arm/imx: serial number / UID support
Message-ID: <cover.1280749932.git.baruch@tkos.co.il>

This patch series adds support for the serial ATAG, and uses this functionality 
to pass the i.MX25 chip UID as a serial number to the Linux kernel.

Baruch Siach (3):
  arm: add support for the serial ATAG
  imx25: add support for UID read from eFuse
  mx25 3ds: set CPU UID

 arch/arm/boards/freescale-mx25-3-stack/3stack.c |    2 ++
 arch/arm/include/asm/armlinux.h                 |    4 ++++
 arch/arm/lib/armlinux.c                         |   19 +++++++++++++++++++
 arch/arm/mach-imx/imx25.c                       |   12 ++++++++++++
 arch/arm/mach-imx/include/mach/generic.h        |    1 +
 arch/arm/mach-imx/include/mach/imx25-regs.h     |    3 +++
 6 files changed, 41 insertions(+), 0 deletions(-)



From baruch at tkos.co.il  Mon Aug  2 07:58:51 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon,  2 Aug 2010 14:58:51 +0300
Subject: [PATCH 1/3] arm: add support for the serial ATAG
In-Reply-To: <cover.1280749932.git.baruch@tkos.co.il>
References: <cover.1280749932.git.baruch@tkos.co.il>
Message-ID: <531234713e1c3de945df03afb0a1dc96165bea22.1280749932.git.baruch@tkos.co.il>

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/include/asm/armlinux.h |    4 ++++
 arch/arm/lib/armlinux.c         |   19 +++++++++++++++++++
 2 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/arch/arm/include/asm/armlinux.h b/arch/arm/include/asm/armlinux.h
index f4104fb..a92d4c1 100644
--- a/arch/arm/include/asm/armlinux.h
+++ b/arch/arm/include/asm/armlinux.h
@@ -7,6 +7,7 @@ void armlinux_set_bootparams(void *params);
 void armlinux_set_architecture(int architecture);
 void armlinux_add_dram(struct device_d *dev);
 void armlinux_set_revision(unsigned int);
+void armlinux_set_serial(u64);
 #else
 static inline void armlinux_set_bootparams(void *params)
 {
@@ -24,6 +25,9 @@ static inline void armlinux_set_revision(unsigned int)
 {
 }
 
+void armlinux_set_serial(u64)
+{
+}
 #endif
 
 #endif /* __ARCH_ARMLINUX_H */
diff --git a/arch/arm/lib/armlinux.c b/arch/arm/lib/armlinux.c
index 17ae057..040fd34 100644
--- a/arch/arm/lib/armlinux.c
+++ b/arch/arm/lib/armlinux.c
@@ -46,6 +46,7 @@ static int armlinux_architecture = 0;
 static void *armlinux_bootparams = NULL;
 
 static unsigned int system_rev;
+static u64 system_serial;
 
 static void setup_start_tag(void)
 {
@@ -121,6 +122,19 @@ static void setup_revision_tag(void)
 	}
 }
 
+static void setup_serial_tag(void)
+{
+	if (system_serial) {
+		params->hdr.tag = ATAG_SERIAL;
+		params->hdr.size = tag_size(tag_serialnr);
+
+		params->u.serialnr.low  = system_serial & 0xffffffff;
+		params->u.serialnr.high = system_serial >> 32;
+
+		params = tag_next(params);
+	}
+}
+
 #if 0
 static void setup_initrd_tag(ulong initrd_start, ulong initrd_end)
 {
@@ -155,6 +169,7 @@ static void setup_tags(void)
 		setup_initrd_tag (initrd_start, initrd_end);
 #endif
 	setup_revision_tag();
+	setup_serial_tag();
 	setup_end_tag();
 
 	printf("commandline: %s\n"
@@ -186,6 +201,10 @@ void armlinux_set_revision(unsigned int rev)
 	system_rev = rev;
 }
 
+void armlinux_set_serial(u64 serial)
+{
+	system_serial = serial;
+}
 
 #ifdef CONFIG_CMD_BOOTM
 int do_bootm_linux(struct image_data *data)
-- 
1.7.1



From baruch at tkos.co.il  Mon Aug  2 07:58:52 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon,  2 Aug 2010 14:58:52 +0300
Subject: [PATCH 2/3] imx25: add support for UID read from eFuse
In-Reply-To: <cover.1280749932.git.baruch@tkos.co.il>
References: <cover.1280749932.git.baruch@tkos.co.il>
Message-ID: <13eb05d187d78209699157a4638dfc87414617a5.1280749932.git.baruch@tkos.co.il>

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/imx25.c                   |   12 ++++++++++++
 arch/arm/mach-imx/include/mach/generic.h    |    1 +
 arch/arm/mach-imx/include/mach/imx25-regs.h |    3 +++
 3 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-imx/imx25.c b/arch/arm/mach-imx/imx25.c
index 00a1e4e..de70247 100644
--- a/arch/arm/mach-imx/imx25.c
+++ b/arch/arm/mach-imx/imx25.c
@@ -16,6 +16,8 @@
  */
 
 #include <common.h>
+#include <mach/imx-regs.h>
+#include <asm/io.h>
 
 #include "gpio.h"
 
@@ -28,3 +30,13 @@ void *imx_gpio_base[] = {
 
 int imx_gpio_count = ARRAY_SIZE(imx_gpio_base) * 32;
 
+u64 imx_uid(void)
+{
+	u64 uid = 0;
+	int i;
+
+	for (i = 0; i < 8; i++)
+		uid = (uid << 8) | readb(IMX_IIM_BASE + IIM_UID + i*4);
+
+	return uid;
+}
diff --git a/arch/arm/mach-imx/include/mach/generic.h b/arch/arm/mach-imx/include/mach/generic.h
index 48ed336..4b89838 100644
--- a/arch/arm/mach-imx/include/mach/generic.h
+++ b/arch/arm/mach-imx/include/mach/generic.h
@@ -6,6 +6,7 @@ int imx_silicon_revision(void);
 #define IMX35_CHIP_REVISION_1_0   0x10
 #define IMX35_CHIP_REVISION_2_0   0x20
 
+u64 imx_uid(void);
 
 
 #ifdef CONFIG_ARCH_IMX1
diff --git a/arch/arm/mach-imx/include/mach/imx25-regs.h b/arch/arm/mach-imx/include/mach/imx25-regs.h
index e91e7b6..7c2b5f9 100644
--- a/arch/arm/mach-imx/include/mach/imx25-regs.h
+++ b/arch/arm/mach-imx/include/mach/imx25-regs.h
@@ -140,5 +140,8 @@
 /* important definition of some bits of WCR */
 #define WCR_WDE 0x04
 
+/* IIM fuse definitions */
+#define IIM_UID		0x820
+
 #endif /* __ASM_ARCH_MX25_REGS_H */
 
-- 
1.7.1



From baruch at tkos.co.il  Mon Aug  2 07:58:53 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon,  2 Aug 2010 14:58:53 +0300
Subject: [PATCH 3/3] mx25 3ds: set CPU UID
In-Reply-To: <cover.1280749932.git.baruch@tkos.co.il>
References: <cover.1280749932.git.baruch@tkos.co.il>
Message-ID: <00441e3bebcaabc865025474144786f495a3a3a0.1280749932.git.baruch@tkos.co.il>

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/boards/freescale-mx25-3-stack/3stack.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boards/freescale-mx25-3-stack/3stack.c b/arch/arm/boards/freescale-mx25-3-stack/3stack.c
index a77a02d..cd228cc 100644
--- a/arch/arm/boards/freescale-mx25-3-stack/3stack.c
+++ b/arch/arm/boards/freescale-mx25-3-stack/3stack.c
@@ -36,6 +36,7 @@
 #include <nand.h>
 #include <mach/imx-flash-header.h>
 #include <mach/iomux-mx25.h>
+#include <mach/generic.h>
 #include <linux/err.h>
 #include <i2c/i2c.h>
 #include <i2c/mc34704.h>
@@ -275,6 +276,7 @@ static int imx25_devices_init(void)
 	armlinux_add_dram(&sdram0_dev);
 	armlinux_set_bootparams((void *)0x80000100);
 	armlinux_set_architecture(MACH_TYPE_MX25_3DS);
+	armlinux_set_serial(imx_uid());
 
 	return 0;
 }
-- 
1.7.1



From plagnioj at jcrosoft.com  Mon Aug  2 08:02:13 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 2 Aug 2010 14:02:13 +0200
Subject: [PATCH 0/3] arm/imx: serial number / UID support
In-Reply-To: <cover.1280749932.git.baruch@tkos.co.il>
References: <cover.1280749932.git.baruch@tkos.co.il>
Message-ID: <20100802120213.GC13044@game.jcrosoft.org>

Hi,

	serial number is more for board ref than CPU ref
	as you can easly read it from the register.

	So why pass it via the ATAG?

Best Regards,
J.
On 14:58 Mon 02 Aug     , Baruch Siach wrote:
> This patch series adds support for the serial ATAG, and uses this functionality 
> to pass the i.MX25 chip UID as a serial number to the Linux kernel.
> 
> Baruch Siach (3):
>   arm: add support for the serial ATAG
>   imx25: add support for UID read from eFuse
>   mx25 3ds: set CPU UID
> 
>  arch/arm/boards/freescale-mx25-3-stack/3stack.c |    2 ++
>  arch/arm/include/asm/armlinux.h                 |    4 ++++
>  arch/arm/lib/armlinux.c                         |   19 +++++++++++++++++++
>  arch/arm/mach-imx/imx25.c                       |   12 ++++++++++++
>  arch/arm/mach-imx/include/mach/generic.h        |    1 +
>  arch/arm/mach-imx/include/mach/imx25-regs.h     |    3 +++
>  6 files changed, 41 insertions(+), 0 deletions(-)
> 
> 
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox


From u.kleine-koenig at pengutronix.de  Mon Aug  2 08:13:08 2010
From: u.kleine-koenig at pengutronix.de (Uwe =?iso-8859-1?Q?Kleine-K=F6nig?=)
Date: Mon, 2 Aug 2010 14:13:08 +0200
Subject: [PATCH 1/3] arm: add support for the serial ATAG
In-Reply-To: <531234713e1c3de945df03afb0a1dc96165bea22.1280749932.git.baruch@tkos.co.il>
References: <cover.1280749932.git.baruch@tkos.co.il>
	<531234713e1c3de945df03afb0a1dc96165bea22.1280749932.git.baruch@tkos.co.il>
Message-ID: <20100802121308.GA13900@pengutronix.de>

Hi Baruch,

> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> ---
>  arch/arm/include/asm/armlinux.h |    4 ++++
>  arch/arm/lib/armlinux.c         |   19 +++++++++++++++++++
>  2 files changed, 23 insertions(+), 0 deletions(-)
> 
I like it.  Last time I was tempted to implement this myself I would
have added a command to set the serial from the shell as in my case the
serial number was saved in env and passed to Linux via a kernel
parameter.

So you can count that as an Ack.

Thanks
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |


From s.hauer at pengutronix.de  Tue Aug  3 04:16:15 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Tue, 3 Aug 2010 10:16:15 +0200
Subject: v2010.08.0
Message-ID: <20100803081615.GL14113@pengutronix.de>

Hi all,

We have a new release: v2010.08.0. Quite much has happened this time as
the commit log shows. Thanks for all people working on this project.

Sascha

The following changes since commit 0db4be97f2ebd6cedad9c113ca49667c0b1e8d75:

  v2010.07.0 (2010-07-03 10:13:42 +0200)

are available in the git repository at:
  git://git.pengutronix.de/git/barebox.git ..BRANCH.NOT.VERIFIED..

Baruch Siach (10):
      mx25 3ds: fix build failure
      mx25: fix typo in imx25-regs.h
      mx25 3ds: cleanup lowlevel_init code
      mx25: add support for i2c
      i2c: add driver for the MC34704 PMIC
      mx25 3ds: add support for i2c master and PMIC
      mx25 3ds: fix fec initialization
      mx25 3ds: fix memory initialization
      nand_imx: fix "used uninitialized" warning on mx25
      bootz: give a proper error on open() failure

Eric Benard (1):
      Add support for Eukrea CPUIMX35

Eric B?nard (3):
      fix command loadb
      imx-ipu-fb: Add board specific hook to enable display
      imx-ipu-fb: do not enable framebuffer on startup

Ivo Clarysse (1):
      mx25 3ds: Fix compilation

Sascha Hauer (61):
      net: remove need for eth_halt/eth_open
      net: Implement a new network stack
      remove unused sntp.h
      implement dhcp using new network stack
      implement tftp using new network stack
      implement ping using new network stack
      implement nfs using new network stack
      net: consider rarp support as outdated. Remove it
      network drivers: call net_receive directly instead of NetReceive
      net: remove old network stack
      rework device parameters
      errno: add strings for network related error messages
      add netconsole support
      net: add dns support
      ping: resolv hostnames
      Merge branch 'net' into next
      pcm037: Add MMU support
      bootu: Allow passing in devices as parameter
      Allow to merge default environment from more than one directory
      include support for a simple pseudo number generator
      net: implement random_ether_addr
      net: use a random mac address if the current device does not have a valid address
      add a generic default environment
      pcm038: use generic default env
      pcm043: use generic default env
      pcm037: use generic default env
      pca100: use generic default env
      i.MX27: merge iomux pim definitions from kernel
      imxfb: Add board specific hook to enable display
      imxfb: do not enable framebuffer on startup
      memcpy cmd: Do not expect to read/write the whole chunk at once
      armlinux: reorder tag setup
      remove eco920 board support
      usbnet: remove unused dev member in struct usbnet
      i.MX serial: Use readl/writel instead of pointer deref
      i.MX clocksource: Use readl/writel instead of pointer deref
      i.MX27: Add some missing device base addresses
      fb: add a usage counter to prevent double enable/disable
      ehci: Make has_tt configurable via platform data
      ehci: Handle hub port reset properly
      usb: Check return value of host controller init
      ehci: use is_timeout for timeout instead of udelay counter
      ehci: Force a ehci_halt before trying to reset
      ehci: remove unused code
      add netconsole host script
      Merge remote branch 'origin/usb-pu' into next
      Merge remote branch 'origin/assorted-pu' into next
      tftp: remove unused variables
      add progression bar function
      cfi flash driver: Use generic progression bar function
      tftp: use generic progression bar
      tftp: Add push support
      nfs: Use generic progression bar
      nfs: resend requests after timeout
      tftp: update doxygen information
      Merge branch 'next'
      pca100: update defconfig
      pcm037: update defconfig
      pcm038: update defconfig
      pcm043: update defconfig
      Release v2010.08.0

Uwe Kleine-K?nig (2):
      trivial: fix typos concerning "hierarchy"
      trivial: fix typos concerning "instead"

 Documentation/users_manual.dox                     |    1 +
 Doxyfile                                           |    3 +-
 Makefile                                           |   17 +-
 TODO                                               |    4 +-
 arch/arm/Makefile                                  |    2 +-
 arch/arm/configs/eukrea_cpuimx35_defconfig         |  254 ++++
 arch/arm/configs/pca100_defconfig                  |   32 +-
 arch/arm/configs/pcm037_defconfig                  |   50 +-
 arch/arm/configs/pcm038_defconfig                  |   30 +-
 arch/arm/configs/pcm043_defconfig                  |   39 +-
 arch/arm/lib/armlinux.c                            |   66 +-
 arch/arm/mach-at91rm9200/Kconfig                   |    8 -
 arch/arm/mach-imx/Kconfig                          |   15 +
 arch/arm/mach-imx/clocksource.c                    |   18 +-
 arch/arm/mach-imx/include/mach/imx-ipu-fb.h        |    2 +
 arch/arm/mach-imx/include/mach/imx21-regs.h        |   33 -
 arch/arm/mach-imx/include/mach/imx25-regs.h        |    3 +-
 arch/arm/mach-imx/include/mach/imx27-regs.h        |   96 +--
 arch/arm/mach-imx/include/mach/imxfb.h             |    2 +
 arch/arm/mach-imx/include/mach/iomux-mx21.h        |  121 ++
 arch/arm/mach-imx/include/mach/iomux-mx25.h        |    4 +-
 arch/arm/mach-imx/include/mach/iomux-mx27.h        |  204 ++++
 arch/arm/mach-imx/include/mach/iomux-mx2x.h        |  230 ++++
 arch/arm/mach-imx/speed-imx25.c                    |    5 +
 board/eco920/Makefile                              |    2 -
 board/eco920/config.h                              |  134 ---
 board/eco920/config.mk                             |    1 -
 board/eco920/eco920.c                              |  211 ----
 board/eukrea_cpuimx27/eukrea_cpuimx27.c            |    3 +-
 board/eukrea_cpuimx35/Makefile                     |   25 +
 board/eukrea_cpuimx35/config.h                     |   23 +
 board/{pcm037 => eukrea_cpuimx35}/env/bin/_update  |    0
 board/eukrea_cpuimx35/env/bin/boot                 |   52 +
 .../{pcm037 => eukrea_cpuimx35}/env/bin/hush_hack  |    0
 board/{pcm043 => eukrea_cpuimx35}/env/bin/init     |   16 +-
 board/eukrea_cpuimx35/env/bin/update_kernel        |    8 +
 board/eukrea_cpuimx35/env/bin/update_root          |    8 +
 board/eukrea_cpuimx35/env/config                   |   27 +
 board/eukrea_cpuimx35/eukrea_cpuimx35.c            |  343 ++++++
 board/eukrea_cpuimx35/eukrea_cpuimx35.dox          |    4 +
 board/eukrea_cpuimx35/flash_header.c               |   60 +
 board/eukrea_cpuimx35/lowlevel.c                   |  218 ++++
 board/freescale-mx25-3-stack/3stack.c              |   84 +-
 board/freescale-mx25-3-stack/lowlevel_init.S       |   13 +-
 board/imx21ads/imx21ads.c                          |    1 +
 board/imx27ads/imx27ads.c                          |    3 +-
 board/pcm037/env/bin/boot                          |   47 -
 board/pcm037/env/bin/init                          |   37 -
 board/pcm037/env/bin/update_root                   |   16 -
 board/pcm037/env/config                            |   62 +-
 board/pcm037/pcm037.c                              |   31 +
 board/pcm038/env/bin/boot                          |   47 -
 board/pcm038/env/bin/update_kernel                 |   15 -
 board/pcm038/env/bin/update_root                   |   16 -
 board/pcm038/env/config                            |   62 +-
 board/pcm038/pcm038.c                              |    3 +-
 board/pcm043/env/bin/_update                       |   36 -
 board/pcm043/env/bin/boot                          |   47 -
 board/pcm043/env/bin/hush_hack                     |    1 -
 board/pcm043/env/bin/update_kernel                 |   15 -
 board/pcm043/env/config                            |   65 +-
 board/phycard-i.MX27/env/bin/_update               |   36 -
 board/phycard-i.MX27/env/bin/boot                  |   40 -
 board/phycard-i.MX27/env/bin/hush_hack             |    1 -
 board/phycard-i.MX27/env/bin/init                  |   37 -
 board/phycard-i.MX27/env/bin/update_kernel         |   15 -
 board/phycard-i.MX27/env/bin/update_root           |   16 -
 board/phycard-i.MX27/env/config                    |   57 +-
 board/phycard-i.MX27/pca100.c                      |    3 +-
 commands/edit.c                                    |    2 +-
 commands/loadb.c                                   |    2 +-
 commands/mem.c                                     |   30 +-
 commands/net.c                                     |   38 -
 common/Kconfig                                     |    4 +-
 common/Makefile                                    |    5 +-
 common/console.c                                   |   40 +-
 common/misc.c                                      |    7 +-
 {board/pcm038/env => defaultenv}/bin/_update       |    5 +-
 defaultenv/bin/boot                                |  109 ++
 {board/pcm038/env => defaultenv}/bin/hush_hack     |    0
 {board/pcm038/env => defaultenv}/bin/init          |   11 +-
 {board/pcm037/env => defaultenv}/bin/update_kernel |    2 +-
 .../update_root => defaultenv/bin/update_rootfs    |    4 +-
 drivers/i2c/Kconfig                                |    3 +
 drivers/i2c/Makefile                               |    1 +
 drivers/i2c/mc34704.c                              |  140 +++
 drivers/nand/nand.c                                |    7 +-
 drivers/nand/nand_imx.c                            |    2 +-
 drivers/net/at91_ether.c                           |    2 +-
 drivers/net/cs8900.c                               |    2 +-
 drivers/net/dm9000.c                               |    2 +-
 drivers/net/ep93xx.c                               |    4 +-
 drivers/net/fec_imx.c                              |    2 +-
 drivers/net/fec_mpc5200.c                          |    2 +-
 drivers/net/macb.c                                 |    2 +-
 drivers/net/netx_eth.c                             |    2 +-
 drivers/net/smc91111.c                             |    2 +-
 drivers/net/smc911x.c                              |    2 +-
 drivers/net/tap.c                                  |    2 +-
 drivers/net/usb/asix.c                             |   14 +-
 drivers/net/usb/usbnet.c                           |   11 +-
 drivers/nor/cfi_flash.c                            |    5 +-
 drivers/serial/serial_imx.c                        |  137 ++-
 drivers/usb/usb.c                                  |    5 +-
 drivers/usb/usb_ehci.h                             |    4 -
 drivers/usb/usb_ehci_core.c                        |   74 +-
 drivers/video/fb.c                                 |   26 +-
 drivers/video/imx-ipu-fb.c                         |   10 +-
 drivers/video/imx.c                                |   26 +-
 include/console.h                                  |    6 -
 include/driver.h                                   |    2 +-
 include/fb.h                                       |    6 +-
 include/i2c/mc34704.h                              |   26 +
 include/net.h                                      |  473 ++++----
 include/param.h                                    |   15 +-
 include/progress.h                                 |   15 +
 include/stdlib.h                                   |   16 +
 include/usb/ehci.h                                 |   10 +
 include/usb/usbnet.h                               |    2 -
 lib/Makefile                                       |    2 +
 lib/driver.c                                       |   12 +-
 lib/parameter.c                                    |  195 ++--
 lib/random.c                                       |   26 +
 lib/show_progress.c                                |   62 +
 net/Kconfig                                        |   19 +-
 net/Makefile                                       |    3 +-
 net/dhcp.c                                         |  491 +++-----
 net/dns.c                                          |  264 +++++
 net/eth.c                                          |   98 +-
 net/net.c                                          | 1244 ++++++++------------
 net/netconsole.c                                   |  228 ++++
 net/nfs.c                                          |  726 ++++++------
 net/ping.c                                         |  152 ++--
 net/rarp.c                                         |  101 --
 net/sntp.h                                         |   61 -
 net/tftp.c                                         |  447 +++++---
 scripts/genenv                                     |   17 +
 scripts/netconsole                                 |   59 +
 138 files changed, 5094 insertions(+), 3612 deletions(-)
 create mode 100644 arch/arm/configs/eukrea_cpuimx35_defconfig
 create mode 100644 arch/arm/mach-imx/include/mach/iomux-mx21.h
 create mode 100644 arch/arm/mach-imx/include/mach/iomux-mx27.h
 create mode 100644 arch/arm/mach-imx/include/mach/iomux-mx2x.h
 delete mode 100644 board/eco920/Makefile
 delete mode 100644 board/eco920/config.h
 delete mode 100644 board/eco920/config.mk
 delete mode 100644 board/eco920/eco920.c
 create mode 100644 board/eukrea_cpuimx35/Makefile
 create mode 100644 board/eukrea_cpuimx35/config.h
 rename board/{pcm037 => eukrea_cpuimx35}/env/bin/_update (100%)
 create mode 100644 board/eukrea_cpuimx35/env/bin/boot
 rename board/{pcm037 => eukrea_cpuimx35}/env/bin/hush_hack (100%)
 rename board/{pcm043 => eukrea_cpuimx35}/env/bin/init (67%)
 create mode 100644 board/eukrea_cpuimx35/env/bin/update_kernel
 create mode 100644 board/eukrea_cpuimx35/env/bin/update_root
 create mode 100644 board/eukrea_cpuimx35/env/config
 create mode 100644 board/eukrea_cpuimx35/eukrea_cpuimx35.c
 create mode 100644 board/eukrea_cpuimx35/eukrea_cpuimx35.dox
 create mode 100644 board/eukrea_cpuimx35/flash_header.c
 create mode 100644 board/eukrea_cpuimx35/lowlevel.c
 delete mode 100644 board/pcm037/env/bin/boot
 delete mode 100644 board/pcm037/env/bin/init
 delete mode 100644 board/pcm037/env/bin/update_root
 delete mode 100644 board/pcm038/env/bin/boot
 delete mode 100644 board/pcm038/env/bin/update_kernel
 delete mode 100644 board/pcm038/env/bin/update_root
 delete mode 100644 board/pcm043/env/bin/_update
 delete mode 100644 board/pcm043/env/bin/boot
 delete mode 100644 board/pcm043/env/bin/hush_hack
 delete mode 100644 board/pcm043/env/bin/update_kernel
 delete mode 100644 board/phycard-i.MX27/env/bin/_update
 delete mode 100644 board/phycard-i.MX27/env/bin/boot
 delete mode 100644 board/phycard-i.MX27/env/bin/hush_hack
 delete mode 100644 board/phycard-i.MX27/env/bin/init
 delete mode 100644 board/phycard-i.MX27/env/bin/update_kernel
 delete mode 100644 board/phycard-i.MX27/env/bin/update_root
 rename {board/pcm038/env => defaultenv}/bin/_update (86%)
 create mode 100644 defaultenv/bin/boot
 rename {board/pcm038/env => defaultenv}/bin/hush_hack (100%)
 rename {board/pcm038/env => defaultenv}/bin/init (59%)
 rename {board/pcm037/env => defaultenv}/bin/update_kernel (91%)
 rename board/pcm043/env/bin/update_root => defaultenv/bin/update_rootfs (91%)
 create mode 100644 drivers/i2c/mc34704.c
 create mode 100644 include/i2c/mc34704.h
 create mode 100644 include/progress.h
 create mode 100644 include/stdlib.h
 create mode 100644 include/usb/ehci.h
 create mode 100644 lib/random.c
 create mode 100644 lib/show_progress.c
 create mode 100644 net/dns.c
 create mode 100644 net/netconsole.c
 delete mode 100644 net/rarp.c
 delete mode 100644 net/sntp.h
 create mode 100755 scripts/genenv
 create mode 100755 scripts/netconsole
-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From plagnioj at jcrosoft.com  Tue Aug  3 08:51:42 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue, 3 Aug 2010 14:51:42 +0200
Subject: [PATCH 0/3] introduce clk framework
Message-ID: <20100803125142.GA9556@game.jcrosoft.org>

Hi,

The following changes since commit 139ec08127825f2fdc4d0386d26f1fad9f745c2c:

  Merge branch 'next' (2010-08-03 09:31:38 +0200)

Jean-Christophe PLAGNIOL-VILLARD (3):
      initcall: add postconsole_initcall
      clock: Introduce clock framework from Linux
      at91: implement clock framework

 arch/arm/boards/at91sam9260ek/config.h      |    2 +-
 arch/arm/boards/at91sam9263ek/config.h      |    2 +-
 arch/arm/boards/at91sam9263ek/init.c        |    3 -
 arch/arm/boards/mmccpu/config.h             |    2 +-
 arch/arm/boards/mmccpu/init.c               |    3 -
 arch/arm/boards/pm9263/config.h             |    2 +-
 arch/arm/boards/pm9263/init.c               |    3 -
 arch/arm/mach-at91/Makefile                 |    2 +-
 arch/arm/mach-at91/at91sam9260.c            |  207 ++++++++
 arch/arm/mach-at91/at91sam9260_devices.c    |   18 +-
 arch/arm/mach-at91/at91sam9263.c            |  217 +++++++++
 arch/arm/mach-at91/at91sam9263_devices.c    |   13 +-
 arch/arm/mach-at91/clock.c                  |  672 +++++++++++++++++++++++++++
 arch/arm/mach-at91/clock.h                  |   31 ++
 arch/arm/mach-at91/generic.h                |   14 +
 arch/arm/mach-at91/gpio.c                   |    3 +
 arch/arm/mach-at91/include/mach/at91_dbgu.h |   66 +++
 arch/arm/mach-at91/include/mach/clk.h       |   39 --
 arch/arm/mach-at91/include/mach/cpu.h       |  118 +++++
 arch/arm/mach-at91/include/mach/gpio.h      |    1 +
 drivers/net/macb.c                          |   11 +-
 drivers/serial/atmel.c                      |   32 ++-
 include/init.h                              |    1 +
 include/linux/clk.h                         |  158 +++++++
 24 files changed, 1545 insertions(+), 75 deletions(-)
 create mode 100644 arch/arm/mach-at91/clock.c
 create mode 100644 arch/arm/mach-at91/clock.h
 create mode 100644 arch/arm/mach-at91/generic.h
 create mode 100644 arch/arm/mach-at91/include/mach/at91_dbgu.h
 delete mode 100644 arch/arm/mach-at91/include/mach/clk.h
 create mode 100644 arch/arm/mach-at91/include/mach/cpu.h
 create mode 100644 include/linux/clk.h

Best Regards,
J.


From plagnioj at jcrosoft.com  Tue Aug  3 08:53:37 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue,  3 Aug 2010 14:53:37 +0200
Subject: [PATCH 1/3] initcall: add postconsole_initcall
In-Reply-To: <20100803125142.GA9556@game.jcrosoft.org>
References: <20100803125142.GA9556@game.jcrosoft.org>
Message-ID: <1280840019-11421-1-git-send-email-plagnioj@jcrosoft.com>

this will allow us to print information as soon as the console will be enable

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/init.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/include/init.h b/include/init.h
index eb606f3..c5dea07 100644
--- a/include/init.h
+++ b/include/init.h
@@ -11,6 +11,7 @@ typedef int (*initcall_t)(void);
 #define core_initcall(fn)		__define_initcall("0",fn,0)
 #define postcore_initcall(fn)		__define_initcall("1",fn,1)
 #define console_initcall(fn)		__define_initcall("2",fn,2)
+#define postconsole_initcall(fn)	__define_initcall("3",fn,3)
 #define coredevice_initcall(fn)		__define_initcall("4",fn,4)
 #define fs_initcall(fn)			__define_initcall("5",fn,5)
 #define device_initcall(fn)		__define_initcall("6",fn,6)
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug  3 08:53:38 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue,  3 Aug 2010 14:53:38 +0200
Subject: [PATCH 2/3] clock: Introduce clock framework from Linux
In-Reply-To: <1280840019-11421-1-git-send-email-plagnioj@jcrosoft.com>
References: <20100803125142.GA9556@game.jcrosoft.org>
	<1280840019-11421-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1280840019-11421-2-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/linux/clk.h |  158 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 158 insertions(+), 0 deletions(-)
 create mode 100644 include/linux/clk.h

diff --git a/include/linux/clk.h b/include/linux/clk.h
new file mode 100644
index 0000000..0cf86d7
--- /dev/null
+++ b/include/linux/clk.h
@@ -0,0 +1,158 @@
+/*
+ *  linux/include/linux/clk.h
+ *
+ *  Copyright (C) 2004 ARM Limited.
+ *  Written by Deep Blue Solutions Limited.
+ *
+ * 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.
+ */
+#ifndef __LINUX_CLK_H
+#define __LINUX_CLK_H
+
+struct device_d;
+
+/*
+ * The base API.
+ */
+
+
+/*
+ * struct clk - an machine class defined object / cookie.
+ */
+struct clk;
+
+/**
+ * clk_get - lookup and obtain a reference to a clock producer.
+ * @dev: device for clock "consumer"
+ * @id: clock comsumer ID
+ *
+ * Returns a struct clk corresponding to the clock producer, or
+ * valid IS_ERR() condition containing errno.  The implementation
+ * uses @dev and @id to determine the clock consumer, and thereby
+ * the clock producer.  (IOW, @id may be identical strings, but
+ * clk_get may return different clock producers depending on @dev.)
+ *
+ * Drivers must assume that the clock source is not enabled.
+ *
+ * clk_get should not be called from within interrupt context.
+ */
+struct clk *clk_get(struct device_d *dev, const char *id);
+
+/**
+ * clk_enable - inform the system when the clock source should be running.
+ * @clk: clock source
+ *
+ * If the clock can not be enabled/disabled, this should return success.
+ *
+ * Returns success (0) or negative errno.
+ */
+int clk_enable(struct clk *clk);
+
+/**
+ * clk_disable - inform the system when the clock source is no longer required.
+ * @clk: clock source
+ *
+ * Inform the system that a clock source is no longer required by
+ * a driver and may be shut down.
+ *
+ * Implementation detail: if the clock source is shared between
+ * multiple drivers, clk_enable() calls must be balanced by the
+ * same number of clk_disable() calls for the clock source to be
+ * disabled.
+ */
+void clk_disable(struct clk *clk);
+
+/**
+ * clk_get_rate - obtain the current clock rate (in Hz) for a clock source.
+ *		  This is only valid once the clock source has been enabled.
+ * @clk: clock source
+ */
+unsigned long clk_get_rate(struct clk *clk);
+
+/**
+ * clk_put	- "free" the clock source
+ * @clk: clock source
+ *
+ * Note: drivers must ensure that all clk_enable calls made on this
+ * clock source are balanced by clk_disable calls prior to calling
+ * this function.
+ *
+ * clk_put should not be called from within interrupt context.
+ */
+void clk_put(struct clk *clk);
+
+
+/*
+ * The remaining APIs are optional for machine class support.
+ */
+
+
+/**
+ * clk_round_rate - adjust a rate to the exact rate a clock can provide
+ * @clk: clock source
+ * @rate: desired clock rate in Hz
+ *
+ * Returns rounded clock rate in Hz, or negative errno.
+ */
+long clk_round_rate(struct clk *clk, unsigned long rate);
+ 
+/**
+ * clk_set_rate - set the clock rate for a clock source
+ * @clk: clock source
+ * @rate: desired clock rate in Hz
+ *
+ * Returns success (0) or negative errno.
+ */
+int clk_set_rate(struct clk *clk, unsigned long rate);
+ 
+/**
+ * clk_set_parent - set the parent clock source for this clock
+ * @clk: clock source
+ * @parent: parent clock source
+ *
+ * Returns success (0) or negative errno.
+ */
+int clk_set_parent(struct clk *clk, struct clk *parent);
+
+/**
+ * clk_get_parent - get the parent clock source for this clock
+ * @clk: clock source
+ *
+ * Returns struct clk corresponding to parent clock source, or
+ * valid IS_ERR() condition containing errno.
+ */
+struct clk *clk_get_parent(struct clk *clk);
+
+/**
+ * clk_get_sys - get a clock based upon the device name
+ * @dev_id: device name
+ * @con_id: connection ID
+ *
+ * Returns a struct clk corresponding to the clock producer, or
+ * valid IS_ERR() condition containing errno.  The implementation
+ * uses @dev_id and @con_id to determine the clock consumer, and
+ * thereby the clock producer. In contrast to clk_get() this function
+ * takes the device name instead of the device itself for identification.
+ *
+ * Drivers must assume that the clock source is not enabled.
+ *
+ * clk_get_sys should not be called from within interrupt context.
+ */
+struct clk *clk_get_sys(const char *dev_id, const char *con_id);
+
+/**
+ * clk_add_alias - add a new clock alias
+ * @alias: name for clock alias
+ * @alias_dev_name: device name
+ * @id: platform specific clock name
+ * @dev: device
+ *
+ * Allows using generic clock names for drivers by adding a new alias.
+ * Assumes clkdev, see clkdev.h for more info.
+ */
+int clk_add_alias(const char *alias, const char *alias_dev_name, char *id,
+			struct device_d *dev);
+
+#endif
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug  3 08:53:39 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue,  3 Aug 2010 14:53:39 +0200
Subject: [PATCH 3/3] at91: implement clock framework
In-Reply-To: <1280840019-11421-2-git-send-email-plagnioj@jcrosoft.com>
References: <20100803125142.GA9556@game.jcrosoft.org>
	<1280840019-11421-1-git-send-email-plagnioj@jcrosoft.com>
	<1280840019-11421-2-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1280840019-11421-3-git-send-email-plagnioj@jcrosoft.com>

this implementation is based on linux one
it will calculate all the clock dynamically instead of statictly
this will use also the new clock framework

it will also print the clock status after the console init

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/boards/at91sam9260ek/config.h      |    2 +-
 arch/arm/boards/at91sam9263ek/config.h      |    2 +-
 arch/arm/boards/at91sam9263ek/init.c        |    3 -
 arch/arm/boards/mmccpu/config.h             |    2 +-
 arch/arm/boards/mmccpu/init.c               |    3 -
 arch/arm/boards/pm9263/config.h             |    2 +-
 arch/arm/boards/pm9263/init.c               |    3 -
 arch/arm/mach-at91/Makefile                 |    2 +-
 arch/arm/mach-at91/at91sam9260.c            |  207 ++++++++
 arch/arm/mach-at91/at91sam9260_devices.c    |   18 +-
 arch/arm/mach-at91/at91sam9263.c            |  217 +++++++++
 arch/arm/mach-at91/at91sam9263_devices.c    |   13 +-
 arch/arm/mach-at91/clock.c                  |  672 +++++++++++++++++++++++++++
 arch/arm/mach-at91/clock.h                  |   31 ++
 arch/arm/mach-at91/generic.h                |   14 +
 arch/arm/mach-at91/gpio.c                   |    3 +
 arch/arm/mach-at91/include/mach/at91_dbgu.h |   66 +++
 arch/arm/mach-at91/include/mach/clk.h       |   39 --
 arch/arm/mach-at91/include/mach/cpu.h       |  118 +++++
 arch/arm/mach-at91/include/mach/gpio.h      |    1 +
 drivers/net/macb.c                          |   11 +-
 drivers/serial/atmel.c                      |   32 ++-
 22 files changed, 1386 insertions(+), 75 deletions(-)
 create mode 100644 arch/arm/mach-at91/clock.c
 create mode 100644 arch/arm/mach-at91/clock.h
 create mode 100644 arch/arm/mach-at91/generic.h
 create mode 100644 arch/arm/mach-at91/include/mach/at91_dbgu.h
 delete mode 100644 arch/arm/mach-at91/include/mach/clk.h
 create mode 100644 arch/arm/mach-at91/include/mach/cpu.h

diff --git a/arch/arm/boards/at91sam9260ek/config.h b/arch/arm/boards/at91sam9260ek/config.h
index afd8563..006820c 100644
--- a/arch/arm/boards/at91sam9260ek/config.h
+++ b/arch/arm/boards/at91sam9260ek/config.h
@@ -1,6 +1,6 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK  99328000        /* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK		18432000	/* 18.432 MHz crystal */
 
 #endif	/* __CONFIG_H */
diff --git a/arch/arm/boards/at91sam9263ek/config.h b/arch/arm/boards/at91sam9263ek/config.h
index 9cc8af2..bc33227 100644
--- a/arch/arm/boards/at91sam9263ek/config.h
+++ b/arch/arm/boards/at91sam9263ek/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK 100000000        /* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK		16367660	/* 16.367 MHz crystal */
 
 #define MASTER_PLL_MUL		171
 #define MASTER_PLL_DIV		14
diff --git a/arch/arm/boards/at91sam9263ek/init.c b/arch/arm/boards/at91sam9263ek/init.c
index 21803ca..61cd295 100644
--- a/arch/arm/boards/at91sam9263ek/init.c
+++ b/arch/arm/boards/at91sam9263ek/init.c
@@ -108,9 +108,6 @@ static int at91sam9263ek_devices_init(void)
 	at91_set_gpio_output(AT91_PIN_PB27, 1);
 	at91_set_gpio_value(AT91_PIN_PB27, 1); /* 1- enable, 0 - disable */
 
-	/* Enable clock */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
-
 	at91_add_device_sdram(64 * 1024 * 1024);
 	ek_add_device_nand();
 	at91_add_device_eth(&macb_pdata);
diff --git a/arch/arm/boards/mmccpu/config.h b/arch/arm/boards/mmccpu/config.h
index 1133b8f..422ac09 100644
--- a/arch/arm/boards/mmccpu/config.h
+++ b/arch/arm/boards/mmccpu/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK	99532800		/* peripheral = main / 2 */
+#define AT91_M1IN_CLOCK		18432000
 
 /* values */
 #define MASTER_PLL_MUL		54
diff --git a/arch/arm/boards/mmccpu/init.c b/arch/arm/boards/mmccpu/init.c
index e010a83..9a7d930 100644
--- a/arch/arm/boards/mmccpu/init.c
+++ b/arch/arm/boards/mmccpu/init.c
@@ -58,9 +58,6 @@ static int mmccpu_devices_init(void)
 	at91_set_gpio_output(AT91_PIN_PB27, 1);
 	at91_set_gpio_value(AT91_PIN_PB27, 1); /* 1- enable, 0 - disable */
 
-	/* Enable clock */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
-
 	at91_add_device_sdram(128 * 1024 * 1024);
 	at91_add_device_eth(&macb_pdata);
 	register_device(&cfi_dev);
diff --git a/arch/arm/boards/pm9263/config.h b/arch/arm/boards/pm9263/config.h
index 9a9c5cd..5252df2 100644
--- a/arch/arm/boards/pm9263/config.h
+++ b/arch/arm/boards/pm9263/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK  99328000        /* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK	18432000
 
 #define MASTER_PLL_DIV		6
 #define MASTER_PLL_MUL		65
diff --git a/arch/arm/boards/pm9263/init.c b/arch/arm/boards/pm9263/init.c
index 88b91ea..d5ed921 100644
--- a/arch/arm/boards/pm9263/init.c
+++ b/arch/arm/boards/pm9263/init.c
@@ -107,9 +107,6 @@ static int pm9263_devices_init(void)
 	at91_set_gpio_output(AT91_PIN_PB27, 1);
 	at91_set_gpio_value(AT91_PIN_PB27, 1); /* 1- enable, 0 - disable */
 
-	/* Enable clock */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
-
 	at91_add_device_sdram(64 * 1024 * 1024);
 	pm_add_device_nand();
 	at91_add_device_eth(&macb_pdata);
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index c848919..0f55883 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -1,4 +1,4 @@
-obj-y += clocksource.o gpio.o
+obj-y += clock.o clocksource.o gpio.o
 
 obj-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel_init.o
 
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
index 1a6e356..30d1a6a 100644
--- a/arch/arm/mach-at91/at91sam9260.c
+++ b/arch/arm/mach-at91/at91sam9260.c
@@ -2,22 +2,229 @@
 #include <gpio.h>
 #include <init.h>
 #include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+
+#include "generic.h"
+#include "clock.h"
+
+/* --------------------------------------------------------------------
+ *  Clocks
+ * -------------------------------------------------------------------- */
+
+/*
+ * The peripheral clocks.
+ */
+static struct clk pioA_clk = {
+	.name		= "pioA_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_PIOA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioB_clk = {
+	.name		= "pioB_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_PIOB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioC_clk = {
+	.name		= "pioC_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_PIOC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk adc_clk = {
+	.name		= "adc_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_ADC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart0_clk = {
+	.name		= "usart0_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart1_clk = {
+	.name		= "usart1_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart2_clk = {
+	.name		= "usart2_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc_clk = {
+	.name		= "mci_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_MCI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk udc_clk = {
+	.name		= "udc_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_UDP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twi_clk = {
+	.name		= "twi_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TWI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi0_clk = {
+	.name		= "spi0_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_SPI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi1_clk = {
+	.name		= "spi1_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_SPI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc_clk = {
+	.name		= "ssc_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_SSC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc0_clk = {
+	.name		= "tc0_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc1_clk = {
+	.name		= "tc1_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc2_clk = {
+	.name		= "tc2_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ohci_clk = {
+	.name		= "ohci_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_UHP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk macb_clk = {
+	.name		= "macb_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_EMAC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk isi_clk = {
+	.name		= "isi_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_ISI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart3_clk = {
+	.name		= "usart3_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US3,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart4_clk = {
+	.name		= "usart4_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US4,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart5_clk = {
+	.name		= "usart5_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US5,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc3_clk = {
+	.name		= "tc3_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC3,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc4_clk = {
+	.name		= "tc4_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC4,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc5_clk = {
+	.name		= "tc5_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC5,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+
+static struct clk *periph_clocks[] = {
+	&pioA_clk,
+	&pioB_clk,
+	&pioC_clk,
+	&adc_clk,
+	&usart0_clk,
+	&usart1_clk,
+	&usart2_clk,
+	&mmc_clk,
+	&udc_clk,
+	&twi_clk,
+	&spi0_clk,
+	&spi1_clk,
+	&ssc_clk,
+	&tc0_clk,
+	&tc1_clk,
+	&tc2_clk,
+	&ohci_clk,
+	&macb_clk,
+	&isi_clk,
+	&usart3_clk,
+	&usart4_clk,
+	&usart5_clk,
+	&tc3_clk,
+	&tc4_clk,
+	&tc5_clk,
+	// irq0 .. irq2
+};
+
+/*
+ * The two programmable clocks.
+ * You must configure pin multiplexing to bring these signals out.
+ */
+static struct clk pck0 = {
+	.name		= "pck0",
+	.pmc_mask	= AT91_PMC_PCK0,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 0,
+};
+static struct clk pck1 = {
+	.name		= "pck1",
+	.pmc_mask	= AT91_PMC_PCK1,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 1,
+};
+
+static void __init at91sam9260_register_clocks(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
+		clk_register(periph_clocks[i]);
+
+	clk_register(&pck0);
+	clk_register(&pck1);
+}
+
+/* --------------------------------------------------------------------
+ *  GPIO
+ * -------------------------------------------------------------------- */
 
 static struct at91_gpio_bank at91sam9260_gpio[] = {
 	{
 		.id		= AT91SAM9260_ID_PIOA,
 		.offset		= AT91_PIOA,
+		.clock		= &pioA_clk,
 	}, {
 		.id		= AT91SAM9260_ID_PIOB,
 		.offset		= AT91_PIOB,
+		.clock		= &pioB_clk,
 	}, {
 		.id		= AT91SAM9260_ID_PIOC,
 		.offset		= AT91_PIOC,
+		.clock		= &pioC_clk,
 	}
 };
 
 static int at91sam9260_initialize(void)
 {
+	/* Init clock subsystem */
+	at91_clock_init(AT91_MAIN_CLOCK);
+
+	/* Register the processor-specific clocks */
+	at91sam9260_register_clocks();
+
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9260_gpio, 3);
 	return 0;
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index 0cfe913..398a721 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -18,6 +18,8 @@
 #include <mach/gpio.h>
 #include <mach/io.h>
 
+#include "generic.h"
+
 static struct memory_platform_data sram_pdata = {
 	.name = "sram0",
 	.flags = DEVFS_RDWR,
@@ -107,8 +109,6 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 	if (data->det_pin)
 		at91_set_gpio_input(data->det_pin, 1);
 
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOC);
-
 	nand_dev.platform_data = data;
 	register_device(&nand_dev);
 }
@@ -233,37 +233,37 @@ void at91_register_uart(unsigned id, unsigned pins)
 	switch (id) {
 		case 0:		/* DBGU */
 			configure_dbgu_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
+			at91_clock_associate("mck", &dbgu_serial_device, "usart");
 			register_device(&dbgu_serial_device);
 			break;
 		case AT91SAM9260_ID_US0:
 			configure_usart0_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US0);
+			at91_clock_associate("usart0_clk", &uart0_serial_device, "usart");
 			register_device(&uart0_serial_device);
 			break;
 		case AT91SAM9260_ID_US1:
 			configure_usart1_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US1);
+			at91_clock_associate("usart1_clk", &uart1_serial_device, "usart");
 			register_device(&uart1_serial_device);
 			break;
 		case AT91SAM9260_ID_US2:
 			configure_usart2_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US2);
+			at91_clock_associate("usart2_clk", &uart2_serial_device, "usart");
 			register_device(&uart2_serial_device);
 			break;
 		case AT91SAM9260_ID_US3:
 			configure_usart3_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US3);
+			at91_clock_associate("usart3_clk", &uart3_serial_device, "usart");
 			register_device(&uart3_serial_device);
 			break;
 		case AT91SAM9260_ID_US4:
 			configure_usart4_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US4);
+			at91_clock_associate("usart4_clk", &uart4_serial_device, "usart");
 			register_device(&uart4_serial_device);
 			break;
 		case AT91SAM9260_ID_US5:
 			configure_usart5_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US5);
+			at91_clock_associate("usart5_clk", &uart5_serial_device, "usart");
 			register_device(&uart5_serial_device);
 			break;
 		default:
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
index 472b619..b0e3193 100644
--- a/arch/arm/mach-at91/at91sam9263.c
+++ b/arch/arm/mach-at91/at91sam9263.c
@@ -2,28 +2,245 @@
 #include <gpio.h>
 #include <init.h>
 #include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+
+#include "clock.h"
+#include "generic.h"
+
+/* --------------------------------------------------------------------
+ *  Clocks
+ * -------------------------------------------------------------------- */
+
+/*
+ * The peripheral clocks.
+ */
+static struct clk pioA_clk = {
+	.name		= "pioA_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PIOA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioB_clk = {
+	.name		= "pioB_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PIOB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioCDE_clk = {
+	.name		= "pioCDE_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PIOCDE,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart0_clk = {
+	.name		= "usart0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_US0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart1_clk = {
+	.name		= "usart1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_US1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart2_clk = {
+	.name		= "usart2_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_US2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc0_clk = {
+	.name		= "mci0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_MCI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc1_clk = {
+	.name		= "mci1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_MCI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk can_clk = {
+	.name		= "can_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_CAN,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twi_clk = {
+	.name		= "twi_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_TWI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi0_clk = {
+	.name		= "spi0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SPI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi1_clk = {
+	.name		= "spi1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SPI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc0_clk = {
+	.name		= "ssc0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SSC0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc1_clk = {
+	.name		= "ssc1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SSC1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ac97_clk = {
+	.name		= "ac97_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_AC97C,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tcb_clk = {
+	.name		= "tcb_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_TCB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pwm_clk = {
+	.name		= "pwm_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PWMC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk macb_clk = {
+	.name		= "macb_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_EMAC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk dma_clk = {
+	.name		= "dma_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_DMA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twodge_clk = {
+	.name		= "2dge_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_2DGE,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk udc_clk = {
+	.name		= "udc_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_UDP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk isi_clk = {
+	.name		= "isi_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_ISI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk lcdc_clk = {
+	.name		= "lcdc_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_LCDC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ohci_clk = {
+	.name		= "ohci_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_UHP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+
+static struct clk *periph_clocks[] = {
+	&pioA_clk,
+	&pioB_clk,
+	&pioCDE_clk,
+	&usart0_clk,
+	&usart1_clk,
+	&usart2_clk,
+	&mmc0_clk,
+	&mmc1_clk,
+	&can_clk,
+	&twi_clk,
+	&spi0_clk,
+	&spi1_clk,
+	&ssc0_clk,
+	&ssc1_clk,
+	&ac97_clk,
+	&tcb_clk,
+	&pwm_clk,
+	&macb_clk,
+	&twodge_clk,
+	&udc_clk,
+	&isi_clk,
+	&lcdc_clk,
+	&dma_clk,
+	&ohci_clk,
+	// irq0 .. irq1
+};
+
+/*
+ * The four programmable clocks.
+ * You must configure pin multiplexing to bring these signals out.
+ */
+static struct clk pck0 = {
+	.name		= "pck0",
+	.pmc_mask	= AT91_PMC_PCK0,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 0,
+};
+static struct clk pck1 = {
+	.name		= "pck1",
+	.pmc_mask	= AT91_PMC_PCK1,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 1,
+};
+static struct clk pck2 = {
+	.name		= "pck2",
+	.pmc_mask	= AT91_PMC_PCK2,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 2,
+};
+static struct clk pck3 = {
+	.name		= "pck3",
+	.pmc_mask	= AT91_PMC_PCK3,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 3,
+};
+
+static void __init at91sam9263_register_clocks(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
+		clk_register(periph_clocks[i]);
+
+	clk_register(&pck0);
+	clk_register(&pck1);
+	clk_register(&pck2);
+	clk_register(&pck3);
+}
+
+/* --------------------------------------------------------------------
+ *  GPIO
+ * -------------------------------------------------------------------- */
 
 static struct at91_gpio_bank at91sam9263_gpio[] = {
 	{
 		.id		= AT91SAM9263_ID_PIOA,
 		.offset		= AT91_PIOA,
+		.clock		= &pioA_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOB,
 		.offset		= AT91_PIOB,
+		.clock		= &pioB_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOCDE,
 		.offset		= AT91_PIOC,
+		.clock		= &pioCDE_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOCDE,
 		.offset		= AT91_PIOD,
+		.clock		= &pioCDE_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOCDE,
 		.offset		= AT91_PIOE,
+		.clock		= &pioCDE_clk,
 	}
 };
 
 static int at91sam9263_initialize(void)
 {
+	/* Init clock subsystem */
+	at91_clock_init(AT91_MAIN_CLOCK);
+
+	/* Register the processor-specific clocks */
+	at91sam9263_register_clocks();
+
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9263_gpio, 5);
 	return 0;
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
index 50a6348..7ebc32c 100644
--- a/arch/arm/mach-at91/at91sam9263_devices.c
+++ b/arch/arm/mach-at91/at91sam9263_devices.c
@@ -18,6 +18,8 @@
 #include <mach/gpio.h>
 #include <mach/io.h>
 
+#include "generic.h"
+
 static struct memory_platform_data ram_pdata = {
 	.name = "ram0",
 	.flags = DEVFS_RDWR,
@@ -106,9 +108,6 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 	if (data->det_pin)
 		at91_set_gpio_input(data->det_pin, 1);
 
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_PIOA |
-				      1 << AT91SAM9263_ID_PIOCDE);
-
 	nand_dev.platform_data = data;
 	register_device(&nand_dev);
 }
@@ -184,22 +183,22 @@ void at91_register_uart(unsigned id, unsigned pins)
 	switch (id) {
 		case 0:		/* DBGU */
 			configure_dbgu_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
+			at91_clock_associate("mck", &dbgu_serial_device, "usart");
 			register_device(&dbgu_serial_device);
 			break;
 		case AT91SAM9263_ID_US0:
 			configure_usart0_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_US0);
+			at91_clock_associate("usart0_clk", &uart0_serial_device, "usart");
 			register_device(&uart0_serial_device);
 			break;
 		case AT91SAM9263_ID_US1:
 			configure_usart1_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_US1);
+			at91_clock_associate("usart1_clk", &uart1_serial_device, "usart");
 			register_device(&uart1_serial_device);
 			break;
 		case AT91SAM9263_ID_US2:
 			configure_usart2_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_US2);
+			at91_clock_associate("usart2_clk", &uart2_serial_device, "usart");
 			register_device(&uart2_serial_device);
 			break;
 		default:
diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c
new file mode 100644
index 0000000..1912e5a
--- /dev/null
+++ b/arch/arm/mach-at91/clock.c
@@ -0,0 +1,672 @@
+/*
+ * linux/arch/arm/mach-at91/clock.c
+ *
+ * Copyright (C) 2005 David Brownell
+ * Copyright (C) 2005 Ivan Kokshaysky
+ *
+ * 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 <linux/list.h>
+#include <errno.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <init.h>
+
+#include <mach/hardware.h>
+#include <mach/io.h>
+#include <mach/at91_pmc.h>
+#include <mach/cpu.h>
+
+#include "clock.h"
+#include "generic.h"
+
+/*
+ * There's a lot more which can be done with clocks, including cpufreq
+ * integration, slow clock mode support (for system suspend), letting
+ * PLLB be used at other rates (on boards that don't need USB), etc.
+ */
+
+#define clk_is_primary(x)	((x)->type & CLK_TYPE_PRIMARY)
+#define clk_is_programmable(x)	((x)->type & CLK_TYPE_PROGRAMMABLE)
+#define clk_is_peripheral(x)	((x)->type & CLK_TYPE_PERIPHERAL)
+#define clk_is_sys(x)		((x)->type & CLK_TYPE_SYSTEM)
+
+
+/*
+ * Chips have some kind of clocks : group them by functionality
+ */
+#define cpu_has_utmi()		(  cpu_is_at91cap9() \
+				|| cpu_is_at91sam9rl())
+
+#define cpu_has_800M_plla()	(cpu_is_at91sam9g20())
+
+#define cpu_has_pllb()		(!cpu_is_at91sam9rl())
+
+#define cpu_has_upll()		(0)
+
+/* USB host HS & FS */
+#define cpu_has_uhp()		(!cpu_is_at91sam9rl())
+
+/* USB device FS only */
+#define cpu_has_udpfs()		(!cpu_is_at91sam9rl())
+
+
+static LIST_HEAD(clocks);
+
+static u32 at91_pllb_usb_init;
+
+/*
+ * Four primary clock sources:  two crystal oscillators (32K, main), and
+ * two PLLs.  PLLA usually runs the master clock; and PLLB must run at
+ * 48 MHz (unless no USB function clocks are needed).  The main clock and
+ * both PLLs are turned off to run in "slow clock mode" (system suspend).
+ */
+static struct clk clk32k = {
+	.name		= "clk32k",
+	.rate_hz	= AT91_SLOW_CLOCK,
+	.users		= 1,		/* always on */
+	.id		= 0,
+	.type		= CLK_TYPE_PRIMARY,
+};
+static struct clk main_clk = {
+	.name		= "main",
+	.pmc_mask	= AT91_PMC_MOSCS,	/* in PMC_SR */
+	.id		= 1,
+	.type		= CLK_TYPE_PRIMARY,
+};
+static struct clk plla = {
+	.name		= "plla",
+	.parent		= &main_clk,
+	.pmc_mask	= AT91_PMC_LOCKA,	/* in PMC_SR */
+	.id		= 2,
+	.type		= CLK_TYPE_PRIMARY | CLK_TYPE_PLL,
+};
+
+static void pllb_mode(struct clk *clk, int is_on)
+{
+	u32	value;
+
+	if (is_on) {
+		is_on = AT91_PMC_LOCKB;
+		value = at91_pllb_usb_init;
+	} else
+		value = 0;
+
+	// REVISIT: Add work-around for AT91RM9200 Errata #26 ?
+	at91_sys_write(AT91_CKGR_PLLBR, value);
+
+	do {
+		barrier();
+	} while ((at91_sys_read(AT91_PMC_SR) & AT91_PMC_LOCKB) != is_on);
+}
+
+static struct clk pllb = {
+	.name		= "pllb",
+	.parent		= &main_clk,
+	.pmc_mask	= AT91_PMC_LOCKB,	/* in PMC_SR */
+	.mode		= pllb_mode,
+	.id		= 3,
+	.type		= CLK_TYPE_PRIMARY | CLK_TYPE_PLL,
+};
+
+static void pmc_sys_mode(struct clk *clk, int is_on)
+{
+	if (is_on)
+		at91_sys_write(AT91_PMC_SCER, clk->pmc_mask);
+	else
+		at91_sys_write(AT91_PMC_SCDR, clk->pmc_mask);
+}
+
+static void pmc_uckr_mode(struct clk *clk, int is_on)
+{
+	unsigned int uckr = at91_sys_read(AT91_CKGR_UCKR);
+
+	if (is_on) {
+		is_on = AT91_PMC_LOCKU;
+		at91_sys_write(AT91_CKGR_UCKR, uckr | clk->pmc_mask);
+	} else
+		at91_sys_write(AT91_CKGR_UCKR, uckr & ~(clk->pmc_mask));
+
+	do {
+		barrier();
+	} while ((at91_sys_read(AT91_PMC_SR) & AT91_PMC_LOCKU) != is_on);
+}
+
+/* USB function clocks (PLLB must be 48 MHz) */
+static struct clk udpck = {
+	.name		= "udpck",
+	.parent		= &pllb,
+	.mode		= pmc_sys_mode,
+};
+static struct clk utmi_clk = {
+	.name		= "utmi_clk",
+	.parent		= &main_clk,
+	.pmc_mask	= AT91_PMC_UPLLEN,	/* in CKGR_UCKR */
+	.mode		= pmc_uckr_mode,
+	.type		= CLK_TYPE_PLL,
+};
+static struct clk uhpck = {
+	.name		= "uhpck",
+	/*.parent		= ... we choose parent at runtime */
+	.mode		= pmc_sys_mode,
+};
+
+
+/*
+ * The master clock is divided from the CPU clock (by 1-4).  It's used for
+ * memory, interfaces to on-chip peripherals, the AIC, and sometimes more
+ * (e.g baud rate generation).  It's sourced from one of the primary clocks.
+ */
+static struct clk mck = {
+	.name		= "mck",
+	.pmc_mask	= AT91_PMC_MCKRDY,	/* in PMC_SR */
+};
+
+static void pmc_periph_mode(struct clk *clk, int is_on)
+{
+	if (is_on)
+		at91_sys_write(AT91_PMC_PCER, clk->pmc_mask);
+	else
+		at91_sys_write(AT91_PMC_PCDR, clk->pmc_mask);
+}
+
+static struct clk *at91_css_to_clk(unsigned long css)
+{
+	switch (css) {
+		case AT91_PMC_CSS_SLOW:
+			return &clk32k;
+		case AT91_PMC_CSS_MAIN:
+			return &main_clk;
+		case AT91_PMC_CSS_PLLA:
+			return &plla;
+		case AT91_PMC_CSS_PLLB:
+			if (cpu_has_upll())
+				/* CSS_PLLB == CSS_UPLL */
+				return &utmi_clk;
+			else if (cpu_has_pllb())
+				return &pllb;
+	}
+
+	return NULL;
+}
+
+/*
+ * Associate a particular clock with a function (eg, "uart") and device.
+ * The drivers can then request the same 'function' with several different
+ * devices and not care about which clock name to use.
+ */
+void at91_clock_associate(const char *id, struct device_d *dev, const char *func)
+{
+	struct clk *clk = clk_get(NULL, id);
+
+	if (!dev || !clk || !IS_ERR(clk_get(dev, func)))
+		return;
+
+	clk->function = func;
+	clk->dev = dev;
+}
+
+/* clocks cannot be de-registered no refcounting necessary */
+struct clk *clk_get(struct device_d *dev, const char *id)
+{
+	struct clk *clk;
+
+	list_for_each_entry(clk, &clocks, node) {
+		if (strcmp(id, clk->name) == 0)
+			return clk;
+		if (clk->function && (dev == clk->dev) && strcmp(id, clk->function) == 0)
+			return clk;
+	}
+
+	return ERR_PTR(-ENOENT);
+}
+EXPORT_SYMBOL(clk_get);
+
+void clk_put(struct clk *clk)
+{
+}
+EXPORT_SYMBOL(clk_put);
+
+static void __clk_enable(struct clk *clk)
+{
+	if (clk->parent)
+		__clk_enable(clk->parent);
+	if (clk->users++ == 0 && clk->mode)
+		clk->mode(clk, 1);
+}
+
+int clk_enable(struct clk *clk)
+{
+	__clk_enable(clk);
+	return 0;
+}
+EXPORT_SYMBOL(clk_enable);
+
+static void __clk_disable(struct clk *clk)
+{
+	BUG_ON(clk->users == 0);
+	if (--clk->users == 0 && clk->mode)
+		clk->mode(clk, 0);
+	if (clk->parent)
+		__clk_disable(clk->parent);
+}
+
+void clk_disable(struct clk *clk)
+{
+	__clk_disable(clk);
+}
+EXPORT_SYMBOL(clk_disable);
+
+unsigned long clk_get_rate(struct clk *clk)
+{
+	unsigned long	rate;
+
+	for (;;) {
+		rate = clk->rate_hz;
+		if (rate || !clk->parent)
+			break;
+		clk = clk->parent;
+	}
+	return rate;
+}
+EXPORT_SYMBOL(clk_get_rate);
+
+/*------------------------------------------------------------------------*/
+
+#ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS
+
+/*
+ * For now, only the programmable clocks support reparenting (MCK could
+ * do this too, with care) or rate changing (the PLLs could do this too,
+ * ditto MCK but that's more for cpufreq).  Drivers may reparent to get
+ * a better rate match; we don't.
+ */
+
+long clk_round_rate(struct clk *clk, unsigned long rate)
+{
+	unsigned long	flags;
+	unsigned	prescale;
+	unsigned long	actual;
+
+	if (!clk_is_programmable(clk))
+		return -EINVAL;
+
+	actual = clk->parent->rate_hz;
+	for (prescale = 0; prescale < 7; prescale++) {
+		if (actual && actual <= rate)
+			break;
+		actual >>= 1;
+	}
+
+	return (prescale < 7) ? actual : -ENOENT;
+}
+EXPORT_SYMBOL(clk_round_rate);
+
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+	unsigned long	flags;
+	unsigned	prescale;
+	unsigned long	actual;
+
+	if (!clk_is_programmable(clk))
+		return -EINVAL;
+	if (clk->users)
+		return -EBUSY;
+
+	actual = clk->parent->rate_hz;
+	for (prescale = 0; prescale < 7; prescale++) {
+		if (actual && actual <= rate) {
+			u32	pckr;
+
+			pckr = at91_sys_read(AT91_PMC_PCKR(clk->id));
+			pckr &= AT91_PMC_CSS;	/* clock selection */
+			pckr |= prescale << 2;
+			at91_sys_write(AT91_PMC_PCKR(clk->id), pckr);
+			clk->rate_hz = actual;
+			break;
+		}
+		actual >>= 1;
+	}
+
+	return (prescale < 7) ? actual : -ENOENT;
+}
+EXPORT_SYMBOL(clk_set_rate);
+
+struct clk *clk_get_parent(struct clk *clk)
+{
+	return clk->parent;
+}
+EXPORT_SYMBOL(clk_get_parent);
+
+int clk_set_parent(struct clk *clk, struct clk *parent)
+{
+	unsigned long	flags;
+
+	if (clk->users)
+		return -EBUSY;
+	if (!clk_is_primary(parent) || !clk_is_programmable(clk))
+		return -EINVAL;
+
+	clk->rate_hz = parent->rate_hz;
+	clk->parent = parent;
+	at91_sys_write(AT91_PMC_PCKR(clk->id), parent->id);
+
+	return 0;
+}
+EXPORT_SYMBOL(clk_set_parent);
+
+/* establish PCK0..PCKN parentage and rate */
+static void init_programmable_clock(struct clk *clk)
+{
+	struct clk	*parent;
+	u32		pckr;
+
+	pckr = at91_sys_read(AT91_PMC_PCKR(clk->id));
+	parent = at91_css_to_clk(pckr & AT91_PMC_CSS);
+	clk->parent = parent;
+	clk->rate_hz = parent->rate_hz / (1 << ((pckr & AT91_PMC_PRES) >> 2));
+}
+
+#endif	/* CONFIG_AT91_PROGRAMMABLE_CLOCKS */
+
+/*------------------------------------------------------------------------*/
+
+/* Register a new clock */
+int clk_register(struct clk *clk)
+{
+	if (clk_is_peripheral(clk)) {
+		clk->parent = &mck;
+		clk->mode = pmc_periph_mode;
+		list_add_tail(&clk->node, &clocks);
+	}
+	else if (clk_is_sys(clk)) {
+		clk->parent = &mck;
+		clk->mode = pmc_sys_mode;
+
+		list_add_tail(&clk->node, &clocks);
+	}
+#ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS
+	else if (clk_is_programmable(clk)) {
+		clk->mode = pmc_sys_mode;
+		init_programmable_clock(clk);
+		list_add_tail(&clk->node, &clocks);
+	}
+#endif
+
+	return 0;
+}
+
+
+/*------------------------------------------------------------------------*/
+
+static u32 at91_pll_rate(struct clk *pll, u32 freq, u32 reg)
+{
+	unsigned mul, div;
+
+	div = reg & 0xff;
+	mul = (reg >> 16) & 0x7ff;
+	if (div && mul) {
+		freq /= div;
+		freq *= mul + 1;
+	} else
+		freq = 0;
+
+	return freq;
+}
+
+static u32 at91_usb_rate(struct clk *pll, u32 freq, u32 reg)
+{
+	if (pll == &pllb && (reg & AT91_PMC_USB96M))
+		return freq / 2;
+	else
+		return freq;
+}
+
+static unsigned at91_pll_calc(unsigned main_freq, unsigned out_freq)
+{
+	unsigned i, div = 0, mul = 0, diff = 1 << 30;
+	unsigned ret = (out_freq > 155000000) ? 0xbe00 : 0x3e00;
+
+	/* PLL output max 240 MHz (or 180 MHz per errata) */
+	if (out_freq > 240000000)
+		goto fail;
+
+	for (i = 1; i < 256; i++) {
+		int diff1;
+		unsigned input, mul1;
+
+		/*
+		 * PLL input between 1MHz and 32MHz per spec, but lower
+		 * frequences seem necessary in some cases so allow 100K.
+		 * Warning: some newer products need 2MHz min.
+		 */
+		input = main_freq / i;
+		if (cpu_is_at91sam9g20() && input < 2000000)
+			continue;
+		if (input < 100000)
+			continue;
+		if (input > 32000000)
+			continue;
+
+		mul1 = out_freq / input;
+		if (cpu_is_at91sam9g20() && mul > 63)
+			continue;
+		if (mul1 > 2048)
+			continue;
+		if (mul1 < 2)
+			goto fail;
+
+		diff1 = out_freq - input * mul1;
+		if (diff1 < 0)
+			diff1 = -diff1;
+		if (diff > diff1) {
+			diff = diff1;
+			div = i;
+			mul = mul1;
+			if (diff == 0)
+				break;
+		}
+	}
+	if (i == 256 && diff > (out_freq >> 5))
+		goto fail;
+	return ret | ((mul - 1) << 16) | div;
+fail:
+	return 0;
+}
+
+static struct clk *const standard_pmc_clocks[] = {
+	/* four primary clocks */
+	&clk32k,
+	&main_clk,
+	&plla,
+
+	/* MCK */
+	&mck
+};
+
+/* PLLB generated USB full speed clock init */
+static void at91_pllb_usbfs_clock_init(unsigned long main_clock)
+{
+	/*
+	 * USB clock init:  choose 48 MHz PLLB value,
+	 * disable 48MHz clock during usb peripheral suspend.
+	 *
+	 * REVISIT:  assumes MCK doesn't derive from PLLB!
+	 */
+	uhpck.parent = &pllb;
+
+	at91_pllb_usb_init = at91_pll_calc(main_clock, 48000000 * 2) | AT91_PMC_USB96M;
+	pllb.rate_hz = at91_pll_rate(&pllb, main_clock, at91_pllb_usb_init);
+	if (cpu_is_at91rm9200()) {
+		uhpck.pmc_mask = AT91RM9200_PMC_UHP;
+		udpck.pmc_mask = AT91RM9200_PMC_UDP;
+		at91_sys_write(AT91_PMC_SCER, AT91RM9200_PMC_MCKUDP);
+	} else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || cpu_is_at91sam9263() || cpu_is_at91sam9g20()) {
+		uhpck.pmc_mask = AT91SAM926x_PMC_UHP;
+		udpck.pmc_mask = AT91SAM926x_PMC_UDP;
+	} else if (cpu_is_at91cap9()) {
+		uhpck.pmc_mask = AT91CAP9_PMC_UHP;
+	}
+	at91_sys_write(AT91_CKGR_PLLBR, 0);
+
+	udpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init);
+	uhpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init);
+}
+
+/* UPLL generated USB full speed clock init */
+static void at91_upll_usbfs_clock_init(unsigned long main_clock)
+{
+	/*
+	 * USB clock init: choose 480 MHz from UPLL,
+	 */
+	unsigned int usbr = AT91_PMC_USBS_UPLL;
+
+	/* Setup divider by 10 to reach 48 MHz */
+	usbr |= ((10 - 1) << 8) & AT91_PMC_OHCIUSBDIV;
+
+	at91_sys_write(AT91_PMC_USB, usbr);
+
+	/* Now set uhpck values */
+	uhpck.parent = &utmi_clk;
+	uhpck.pmc_mask = AT91SAM926x_PMC_UHP;
+	uhpck.rate_hz = utmi_clk.parent->rate_hz;
+	uhpck.rate_hz /= 1 + ((at91_sys_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8);
+}
+
+int at91_clock_init(unsigned long main_clock)
+{
+	unsigned tmp, freq, mckr;
+	int i;
+
+	/*
+	 * When the bootloader initialized the main oscillator correctly,
+	 * there's no problem using the cycle counter.  But if it didn't,
+	 * or when using oscillator bypass mode, we must be told the speed
+	 * of the main clock.
+	 */
+	if (!main_clock) {
+		do {
+			tmp = at91_sys_read(AT91_CKGR_MCFR);
+		} while (!(tmp & AT91_PMC_MAINRDY));
+		main_clock = (tmp & AT91_PMC_MAINF) * (AT91_SLOW_CLOCK / 16);
+	}
+	main_clk.rate_hz = main_clock;
+
+	/* report if PLLA is more than mildly overclocked */
+	plla.rate_hz = at91_pll_rate(&plla, main_clock, at91_sys_read(AT91_CKGR_PLLAR));
+
+	if (cpu_has_upll() && !cpu_has_pllb()) {
+		/* setup UTMI clock as the fourth primary clock
+		 * (instead of pllb) */
+		utmi_clk.type |= CLK_TYPE_PRIMARY;
+		utmi_clk.id = 3;
+	}
+
+	/*
+	 * USB HS clock init
+	 */
+	if (cpu_has_utmi())
+		/*
+		 * multiplier is hard-wired to 40
+		 * (obtain the USB High Speed 480 MHz when input is 12 MHz)
+		 */
+		utmi_clk.rate_hz = 40 * utmi_clk.parent->rate_hz;
+
+	/*
+	 * USB FS clock init
+	 */
+	if (cpu_has_pllb())
+		at91_pllb_usbfs_clock_init(main_clock);
+	if (cpu_has_upll())
+		/* assumes that we choose UPLL for USB and not PLLA */
+		at91_upll_usbfs_clock_init(main_clock);
+
+	/*
+	 * MCK and CPU derive from one of those primary clocks.
+	 * For now, assume this parentage won't change.
+	 */
+	mckr = at91_sys_read(AT91_PMC_MCKR);
+	mck.parent = at91_css_to_clk(mckr & AT91_PMC_CSS);
+	freq = mck.parent->rate_hz;
+	freq /= (1 << ((mckr & AT91_PMC_PRES) >> 2));				/* prescale */
+	if (cpu_is_at91rm9200()) {
+		mck.rate_hz = freq / (1 + ((mckr & AT91_PMC_MDIV) >> 8));	/* mdiv */
+	} else if (cpu_is_at91sam9g20()) {
+		mck.rate_hz = (mckr & AT91_PMC_MDIV) ?
+			freq / ((mckr & AT91_PMC_MDIV) >> 7) : freq;	/* mdiv ; (x >> 7) = ((x >> 8) * 2) */
+		if (mckr & AT91_PMC_PDIV)
+			freq /= 2;		/* processor clock division */
+	} else {
+		mck.rate_hz = freq / (1 << ((mckr & AT91_PMC_MDIV) >> 8));      /* mdiv */
+	}
+
+	/* Register the PMC's standard clocks */
+	for (i = 0; i < ARRAY_SIZE(standard_pmc_clocks); i++)
+		list_add_tail(&standard_pmc_clocks[i]->node, &clocks);
+
+	if (cpu_has_pllb())
+		list_add_tail(&pllb.node, &clocks);
+
+	if (cpu_has_uhp())
+		list_add_tail(&uhpck.node, &clocks);
+
+	if (cpu_has_udpfs())
+		list_add_tail(&udpck.node, &clocks);
+
+	if (cpu_has_utmi())
+		list_add_tail(&utmi_clk.node, &clocks);
+
+	/* MCK and CPU clock are "always on" */
+	clk_enable(&mck);
+
+	return 0;
+}
+
+static int at91_clock_display(void)
+{
+	if ((!cpu_has_800M_plla() && plla.rate_hz > 209000000)
+	   || (cpu_has_800M_plla() && plla.rate_hz > 800000000))
+		pr_info("Clocks: PLLA overclocked, %ld MHz\n", plla.rate_hz / 1000000);
+
+	printf("Clocks: CPU %u MHz, master %u MHz, main %u.%03u MHz\n",
+		mck.parent->rate_hz / 1000000, (unsigned) mck.rate_hz / 1000000,
+		(unsigned) main_clk.rate_hz / 1000000,
+		((unsigned) main_clk.rate_hz % 1000000) / 1000);
+
+	return 0;
+}
+postconsole_initcall(at91_clock_display);
+
+/*
+ * Several unused clocks may be active.  Turn them off.
+ */
+static int at91_clock_reset(void)
+{
+	unsigned long pcdr = 0;
+	unsigned long scdr = 0;
+	struct clk *clk;
+
+	list_for_each_entry(clk, &clocks, node) {
+		if (clk->users > 0)
+			continue;
+
+		if (clk->mode == pmc_periph_mode)
+			pcdr |= clk->pmc_mask;
+
+		if (clk->mode == pmc_sys_mode)
+			scdr |= clk->pmc_mask;
+
+		pr_debug("Clocks: disable unused %s\n", clk->name);
+	}
+
+	at91_sys_write(AT91_PMC_PCDR, pcdr);
+	at91_sys_write(AT91_PMC_SCDR, scdr);
+
+	return 0;
+}
+late_initcall(at91_clock_reset);
diff --git a/arch/arm/mach-at91/clock.h b/arch/arm/mach-at91/clock.h
new file mode 100644
index 0000000..6f05732
--- /dev/null
+++ b/arch/arm/mach-at91/clock.h
@@ -0,0 +1,31 @@
+/*
+ * linux/arch/arm/mach-at91/clock.h
+ *
+ * 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.
+ */
+
+#define CLK_TYPE_PRIMARY	0x1
+#define CLK_TYPE_PLL		0x2
+#define CLK_TYPE_PROGRAMMABLE	0x4
+#define CLK_TYPE_PERIPHERAL	0x8
+#define CLK_TYPE_SYSTEM		0x10
+
+
+struct clk {
+	struct list_head node;
+	const char	*name;		/* unique clock name */
+	const char	*function;	/* function of the clock */
+	struct device_d	*dev;		/* device associated with function */
+	unsigned long	rate_hz;
+	struct clk	*parent;
+	u32		pmc_mask;
+	void		(*mode)(struct clk *, int);
+	unsigned	id:2;		/* PCK0..3, or 32k/main/a/b */
+	unsigned	type;		/* clock type */
+	u16		users;
+};
+
+
+extern int __init clk_register(struct clk *clk);
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h
new file mode 100644
index 0000000..b3a029d
--- /dev/null
+++ b/arch/arm/mach-at91/generic.h
@@ -0,0 +1,14 @@
+/*
+ * linux/arch/arm/mach-at91/generic.h
+ *
+ *  Copyright (C) 2005 David Brownell
+ *
+ * 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.
+ */
+
+ /* Clocks */
+extern int __init at91_clock_init(unsigned long main_clock);
+struct device_d;
+extern void __init at91_clock_associate(const char *id, struct device_d *dev, const char *func);
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c
index 1cafaf7..b257128 100644
--- a/arch/arm/mach-at91/gpio.c
+++ b/arch/arm/mach-at91/gpio.c
@@ -22,6 +22,7 @@
  */
 
 #include <common.h>
+#include <linux/clk.h>
 #include <errno.h>
 #include <asm/io.h>
 #include <mach/gpio.h>
@@ -245,6 +246,8 @@ int at91_gpio_init(struct at91_gpio_bank *data, int nr_banks)
 		data->regbase = data->offset +
 			(void __iomem *)AT91_BASE_SYS;
 
+		/* enable PIO controller's clock */
+		clk_enable(data->clock);
 
 		/* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */
 		if (last && last->id == data->id)
diff --git a/arch/arm/mach-at91/include/mach/at91_dbgu.h b/arch/arm/mach-at91/include/mach/at91_dbgu.h
new file mode 100644
index 0000000..6dcaa77
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/at91_dbgu.h
@@ -0,0 +1,66 @@
+/*
+ * arch/arm/mach-at91/include/mach/at91_dbgu.h
+ *
+ * Copyright (C) 2005 Ivan Kokshaysky
+ * Copyright (C) SAN People
+ *
+ * Debug Unit (DBGU) - System peripherals registers.
+ * Based on AT91RM9200 datasheet revision E.
+ *
+ * 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 AT91_DBGU_H
+#define AT91_DBGU_H
+
+#ifdef AT91_DBGU
+#define AT91_DBGU_CR		(AT91_DBGU + 0x00)	/* Control Register */
+#define AT91_DBGU_MR		(AT91_DBGU + 0x04)	/* Mode Register */
+#define AT91_DBGU_IER		(AT91_DBGU + 0x08)	/* Interrupt Enable Register */
+#define		AT91_DBGU_TXRDY		(1 << 1)		/* Transmitter Ready */
+#define		AT91_DBGU_TXEMPTY	(1 << 9)		/* Transmitter Empty */
+#define AT91_DBGU_IDR		(AT91_DBGU + 0x0c)	/* Interrupt Disable Register */
+#define AT91_DBGU_IMR		(AT91_DBGU + 0x10)	/* Interrupt Mask Register */
+#define AT91_DBGU_SR		(AT91_DBGU + 0x14)	/* Status Register */
+#define AT91_DBGU_RHR		(AT91_DBGU + 0x18)	/* Receiver Holding Register */
+#define AT91_DBGU_THR		(AT91_DBGU + 0x1c)	/* Transmitter Holding Register */
+#define AT91_DBGU_BRGR		(AT91_DBGU + 0x20)	/* Baud Rate Generator Register */
+
+#define AT91_DBGU_CIDR		(AT91_DBGU + 0x40)	/* Chip ID Register */
+#define AT91_DBGU_EXID		(AT91_DBGU + 0x44)	/* Chip ID Extension Register */
+#define AT91_DBGU_FNR		(AT91_DBGU + 0x48)	/* Force NTRST Register [SAM9 only] */
+#define		AT91_DBGU_FNTRST	(1 << 0)		/* Force NTRST */
+
+#endif /* AT91_DBGU */
+
+/*
+ * Some AT91 parts that don't have full DEBUG units still support the ID
+ * and extensions register.
+ */
+#define		AT91_CIDR_VERSION	(0x1f << 0)		/* Version of the Device */
+#define		AT91_CIDR_EPROC		(7    << 5)		/* Embedded Processor */
+#define		AT91_CIDR_NVPSIZ	(0xf  << 8)		/* Nonvolatile Program Memory Size */
+#define		AT91_CIDR_NVPSIZ2	(0xf  << 12)		/* Second Nonvolatile Program Memory Size */
+#define		AT91_CIDR_SRAMSIZ	(0xf  << 16)		/* Internal SRAM Size */
+#define			AT91_CIDR_SRAMSIZ_1K	(1 << 16)
+#define			AT91_CIDR_SRAMSIZ_2K	(2 << 16)
+#define			AT91_CIDR_SRAMSIZ_112K	(4 << 16)
+#define			AT91_CIDR_SRAMSIZ_4K	(5 << 16)
+#define			AT91_CIDR_SRAMSIZ_80K	(6 << 16)
+#define			AT91_CIDR_SRAMSIZ_160K	(7 << 16)
+#define			AT91_CIDR_SRAMSIZ_8K	(8 << 16)
+#define			AT91_CIDR_SRAMSIZ_16K	(9 << 16)
+#define			AT91_CIDR_SRAMSIZ_32K	(10 << 16)
+#define			AT91_CIDR_SRAMSIZ_64K	(11 << 16)
+#define			AT91_CIDR_SRAMSIZ_128K	(12 << 16)
+#define			AT91_CIDR_SRAMSIZ_256K	(13 << 16)
+#define			AT91_CIDR_SRAMSIZ_96K	(14 << 16)
+#define			AT91_CIDR_SRAMSIZ_512K	(15 << 16)
+#define		AT91_CIDR_ARCH		(0xff << 20)		/* Architecture Identifier */
+#define		AT91_CIDR_NVPTYP	(7    << 28)		/* Nonvolatile Program Memory Type */
+#define		AT91_CIDR_EXT		(1    << 31)		/* Extension Flag */
+
+#endif
diff --git a/arch/arm/mach-at91/include/mach/clk.h b/arch/arm/mach-at91/include/mach/clk.h
deleted file mode 100644
index a9c0683..0000000
--- a/arch/arm/mach-at91/include/mach/clk.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * (C) Copyright 2007
- * Stelian Pop <stelian.pop at leadtechdesign.com>
- * Lead Tech Design <www.leadtechdesign.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
- */
-#ifndef __ASM_ARM_ARCH_CLK_H__
-#define __ASM_ARM_ARCH_CLK_H__
-
-#include <mach/hardware.h>
-
-static inline unsigned long get_macb_pclk_rate(unsigned int dev_id)
-{
-	return AT91_MASTER_CLOCK;
-}
-
-static inline unsigned long get_usart_clk_rate(unsigned int dev_id)
-{
-	return AT91_MASTER_CLOCK;
-}
-
-#endif /* __ASM_ARM_ARCH_CLK_H__ */
diff --git a/arch/arm/mach-at91/include/mach/cpu.h b/arch/arm/mach-at91/include/mach/cpu.h
new file mode 100644
index 0000000..c554c3e
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/cpu.h
@@ -0,0 +1,118 @@
+/*
+ * arch/arm/mach-at91/include/mach/cpu.h
+ *
+ *  Copyright (C) 2006 SAN People
+ *
+ * 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 __ASM_ARCH_CPU_H
+#define __ASM_ARCH_CPU_H
+
+#include <mach/hardware.h>
+#include <mach/at91_dbgu.h>
+
+
+#define ARCH_ID_AT91RM9200	0x09290780
+#define ARCH_ID_AT91SAM9260	0x019803a0
+#define ARCH_ID_AT91SAM9261	0x019703a0
+#define ARCH_ID_AT91SAM9263	0x019607a0
+#define ARCH_ID_AT91SAM9G20	0x019905a0
+#define ARCH_ID_AT91SAM9RL64	0x019b03a0
+#define ARCH_ID_AT91CAP9	0x039A03A0
+
+#define ARCH_ID_AT91SAM9XE128	0x329973a0
+#define ARCH_ID_AT91SAM9XE256	0x329a93a0
+#define ARCH_ID_AT91SAM9XE512	0x329aa3a0
+
+#define ARCH_ID_AT91M40800	0x14080044
+#define ARCH_ID_AT91R40807	0x44080746
+#define ARCH_ID_AT91M40807	0x14080745
+#define ARCH_ID_AT91R40008	0x44000840
+
+static inline unsigned long at91_cpu_identify(void)
+{
+	return (at91_sys_read(AT91_DBGU_CIDR) & ~AT91_CIDR_VERSION);
+}
+
+
+#define ARCH_FAMILY_AT91X92	0x09200000
+#define ARCH_FAMILY_AT91SAM9	0x01900000
+#define ARCH_FAMILY_AT91SAM9XE	0x02900000
+
+static inline unsigned long at91_arch_identify(void)
+{
+	return (at91_sys_read(AT91_DBGU_CIDR) & AT91_CIDR_ARCH);
+}
+
+#ifdef CONFIG_ARCH_AT91CAP9
+#include <mach/at91_pmc.h>
+
+#define ARCH_REVISION_CAP9_B	0x399
+#define ARCH_REVISION_CAP9_C	0x601
+
+static inline unsigned long at91cap9_rev_identify(void)
+{
+	return (at91_sys_read(AT91_PMC_VER));
+}
+#endif
+
+#ifdef CONFIG_ARCH_AT91RM9200
+#define cpu_is_at91rm9200()	(at91_cpu_identify() == ARCH_ID_AT91RM9200)
+#else
+#define cpu_is_at91rm9200()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9260
+#define cpu_is_at91sam9xe()	(at91_arch_identify() == ARCH_FAMILY_AT91SAM9XE)
+#define cpu_is_at91sam9260()	((at91_cpu_identify() == ARCH_ID_AT91SAM9260) || cpu_is_at91sam9xe())
+#else
+#define cpu_is_at91sam9xe()	(0)
+#define cpu_is_at91sam9260()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9G20
+#define cpu_is_at91sam9g20()	(at91_cpu_identify() == ARCH_ID_AT91SAM9G20)
+#else
+#define cpu_is_at91sam9g20()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9261
+#define cpu_is_at91sam9261()	(at91_cpu_identify() == ARCH_ID_AT91SAM9261)
+#else
+#define cpu_is_at91sam9261()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9263
+#define cpu_is_at91sam9263()	(at91_cpu_identify() == ARCH_ID_AT91SAM9263)
+#else
+#define cpu_is_at91sam9263()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9RL
+#define cpu_is_at91sam9rl()	(at91_cpu_identify() == ARCH_ID_AT91SAM9RL64)
+#else
+#define cpu_is_at91sam9rl()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91CAP9
+#define cpu_is_at91cap9()	(at91_cpu_identify() == ARCH_ID_AT91CAP9)
+#define cpu_is_at91cap9_revB()	(at91cap9_rev_identify() == ARCH_REVISION_CAP9_B)
+#define cpu_is_at91cap9_revC()	(at91cap9_rev_identify() == ARCH_REVISION_CAP9_C)
+#else
+#define cpu_is_at91cap9()	(0)
+#define cpu_is_at91cap9_revB()	(0)
+#define cpu_is_at91cap9_revC()	(0)
+#endif
+
+/*
+ * Since this is ARM, we will never run on any AVR32 CPU. But these
+ * definitions may reduce clutter in common drivers.
+ */
+#define cpu_is_at32ap7000()	(0)
+
+#endif
diff --git a/arch/arm/mach-at91/include/mach/gpio.h b/arch/arm/mach-at91/include/mach/gpio.h
index 76d53ba..7e1a9a8 100644
--- a/arch/arm/mach-at91/include/mach/gpio.h
+++ b/arch/arm/mach-at91/include/mach/gpio.h
@@ -241,6 +241,7 @@ struct at91_gpio_bank {
 	struct at91_gpio_bank *next;	/* bank sharing same IRQ/clock/... */
 	unsigned short id;		/* peripheral ID */
 	unsigned long offset;		/* offset from system peripheral base */
+	struct clk *clock;
 };
 
 extern int at91_gpio_init(struct at91_gpio_bank *data, int nr_banks);
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 4feeed0..6864119 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -48,7 +48,7 @@
 #include <errno.h>
 #include <asm/io.h>
 #include <mach/board.h>
-#include <mach/clk.h>
+#include <linux/clk.h>
 
 #include "macb.h"
 
@@ -412,6 +412,9 @@ static int macb_probe(struct device_d *dev)
 	unsigned long macb_hz;
 	u32 ncfgr;
 	struct at91_ether_platform_data *pdata;
+#if defined(CONFIG_ARCH_AT91)
+	struct clk *pclk;
+#endif
 
 	if (!dev->platform_data) {
 		printf("macb: no platform_data\n");
@@ -450,7 +453,13 @@ static int macb_probe(struct device_d *dev)
 	 * Do some basic initialization so that we at least can talk
 	 * to the PHY
 	 */
+#if defined(CONFIG_ARCH_AT91)
+	pclk = clk_get(dev, "macb_clk");
+	clk_enable(pclk);
+	macb_hz = clk_get_rate(pclk);
+#else
 	macb_hz = get_macb_pclk_rate(0);
+#endif
 	if (macb_hz < 20000000)
 		ncfgr = MACB_BF(CLK, MACB_CLK_DIV8);
 	else if (macb_hz < 40000000)
diff --git a/drivers/serial/atmel.c b/drivers/serial/atmel.c
index e9e8116..b99ec4d 100644
--- a/drivers/serial/atmel.c
+++ b/drivers/serial/atmel.c
@@ -22,7 +22,7 @@
 #include <init.h>
 #include <malloc.h>
 #include <asm/io.h>
-#include <mach/clk.h>
+#include <linux/clk.h>
 
 /* USART3 register offsets */
 #define USART3_CR				0x0000
@@ -309,6 +309,21 @@
 		    << USART3_##name##_OFFSET))		\
 	 | USART3_BF(name,value))
 
+/*
+ * We wrap our port structure around the generic console_device.
+ */
+struct atmel_uart_port {
+	struct console_device	uart;		/* uart */
+	struct clk		*clk;		/* uart clock */
+	u32			uartclk;
+};
+
+static inline struct atmel_uart_port *
+to_atmel_uart_port(struct console_device *uart)
+{
+	return container_of(uart, struct atmel_uart_port, uart);
+}
+
 static void atmel_serial_putc(struct console_device *cdev, char c)
 {
 	struct device_d *dev = cdev->dev;
@@ -336,16 +351,15 @@ static int atmel_serial_getc(struct console_device *cdev)
 static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate)
 {
 	struct device_d *dev = cdev->dev;
+	struct atmel_uart_port *uart = to_atmel_uart_port(cdev);
 	unsigned long divisor;
-	unsigned long usart_hz;
 
 	/*
 	 *              Master Clock
 	 * Baud Rate = --------------
 	 *                16 * CD
 	 */
-	usart_hz = get_usart_clk_rate(0);
-	divisor = (usart_hz / 16 + baudrate / 2) / baudrate;
+	divisor = (uart->uartclk / 16 + baudrate / 2) / baudrate;
 	writel(USART3_BF(CD, divisor), dev->map_base + USART3_BRGR);
 
 	return 0;
@@ -359,6 +373,11 @@ static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate)
 static int atmel_serial_init_port(struct console_device *cdev)
 {
 	struct device_d *dev = cdev->dev;
+	struct atmel_uart_port *uart = to_atmel_uart_port(cdev);
+
+	uart->clk = clk_get(dev, "usart");
+	clk_enable(uart->clk);
+	uart->uartclk = clk_get_rate(uart->clk);
 
 	writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), dev->map_base + USART3_CR);
 
@@ -376,9 +395,12 @@ static int atmel_serial_init_port(struct console_device *cdev)
 
 static int atmel_serial_probe(struct device_d *dev)
 {
+	struct atmel_uart_port *uart;
 	struct console_device *cdev;
 
-	cdev = malloc(sizeof(struct console_device));
+	uart = malloc(sizeof(struct atmel_uart_port));
+
+	cdev = &uart->uart;
 	dev->type_data = cdev;
 	cdev->dev = dev;
 	cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
-- 
1.7.1



From m.grzeschik at pengutronix.de  Tue Aug  3 13:50:46 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Tue, 3 Aug 2010 19:50:46 +0200
Subject: [PATCH] beagle: add missing nand headerfile
Message-ID: <20100803175046.GA15525@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 arch/arm/boards/omap/board-beagle.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boards/omap/board-beagle.c b/arch/arm/boards/omap/board-beagle.c
index a4cbf31..da59a93 100644
--- a/arch/arm/boards/omap/board-beagle.c
+++ b/arch/arm/boards/omap/board-beagle.c
@@ -66,6 +66,7 @@
 #include <mach/control.h>
 #include <mach/omap3-mux.h>
 #include <mach/gpmc.h>
+#include <mach/gpmc_nand.h>
 #include "board.h"
 
 /******************** Board Boot Time *******************/
-- 
1.7.1



From m.grzeschik at pengutronix.de  Tue Aug  3 13:51:51 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Tue, 3 Aug 2010 19:51:51 +0200
Subject: [PATCH] omap clock: bugfix remove silicon offset sil_index
Message-ID: <20100803175151.GA15605@pengutronix.de>

In omap3_clock_core.S we have just clock values for the ES2
revision, so we should not set any silicon index.

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 arch/arm/mach-omap/omap3_clock.c |   10 +---------
 1 files changed, 1 insertions(+), 9 deletions(-)

diff --git a/arch/arm/mach-omap/omap3_clock.c b/arch/arm/mach-omap/omap3_clock.c
index f1b3b07..13e8729 100644
--- a/arch/arm/mach-omap/omap3_clock.c
+++ b/arch/arm/mach-omap/omap3_clock.c
@@ -148,7 +148,7 @@ void prcm_init(void)
 {
 	int xip_safe;
 	u32 osc_clk = 0, sys_clkin_sel = 0;
-	u32 clk_index, sil_index;
+	u32 clk_index, sil_index = 0;
 	struct dpll_param *dpll_param_p;
 #ifdef CONFIG_OMAP3_COPY_CLOCK_SRAM
 	int p0, p1, p2, p3;
@@ -176,14 +176,6 @@ void prcm_init(void)
 		clk_index = sys_clkin_sel;
 	}
 
-	/* The DPLL tables are defined according to sysclk value and
-	 * silicon revision. The clk_index value will be used to get
-	 * the values for that input sysclk from the DPLL param table
-	 * and sil_index will get the values for that SysClk for the
-	 * appropriate silicon rev.
-	 */
-	if (get_cpu_rev() >= CPU_ES2)
-		sil_index = 1;
 	/* Unlock MPU DPLL (slows things down, and needed later) */
 	sr32(CM_REG(CLKEN_PLL_MPU), 0, 3, PLL_LOW_POWER_BYPASS);
 	wait_on_value((0x1 << 0), 0, CM_REG(IDLEST_PLL_MPU), LDELAY);
-- 
1.7.1



From s.hauer at pengutronix.de  Tue Aug  3 16:23:11 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Tue, 3 Aug 2010 22:23:11 +0200
Subject: [PATCH 3/3] at91: implement clock framework
In-Reply-To: <1280840019-11421-3-git-send-email-plagnioj@jcrosoft.com>
References: <20100803125142.GA9556@game.jcrosoft.org>
	<1280840019-11421-1-git-send-email-plagnioj@jcrosoft.com>
	<1280840019-11421-2-git-send-email-plagnioj@jcrosoft.com>
	<1280840019-11421-3-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100803202311.GO14113@pengutronix.de>

Hi Jean-Christophe,

That was fast ;)

On Tue, Aug 03, 2010 at 02:53:39PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> this implementation is based on linux one
> it will calculate all the clock dynamically instead of statictly
> this will use also the new clock framework

I think it's a good idea to leave a pointer to the Linux version this
code is from. This will help us find relevant changes for barebox in the
Linux history.

> 
> +
> +static struct clk *periph_clocks[] = {
> +	&pioA_clk,
> +	&pioB_clk,
> +	&pioC_clk,
> +	&adc_clk,
> +	&usart0_clk,
> +	&usart1_clk,
> +	&usart2_clk,
> +	&mmc_clk,
> +	&udc_clk,
> +	&twi_clk,
> +	&spi0_clk,
> +	&spi1_clk,
> +	&ssc_clk,
> +	&tc0_clk,
> +	&tc1_clk,
> +	&tc2_clk,
> +	&ohci_clk,
> +	&macb_clk,
> +	&isi_clk,
> +	&usart3_clk,
> +	&usart4_clk,
> +	&usart5_clk,
> +	&tc3_clk,
> +	&tc4_clk,
> +	&tc5_clk,
> +	// irq0 .. irq2
> +};
> +
> +/*
> + * The two programmable clocks.
> + * You must configure pin multiplexing to bring these signals out.
> + */
> +static struct clk pck0 = {
> +	.name		= "pck0",
> +	.pmc_mask	= AT91_PMC_PCK0,
> +	.type		= CLK_TYPE_PROGRAMMABLE,
> +	.id		= 0,
> +};
> +static struct clk pck1 = {
> +	.name		= "pck1",
> +	.pmc_mask	= AT91_PMC_PCK1,
> +	.type		= CLK_TYPE_PROGRAMMABLE,
> +	.id		= 1,
> +};
> +
> +static void __init at91sam9260_register_clocks(void)
> +{
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
> +		clk_register(periph_clocks[i]);
> +
> +	clk_register(&pck0);
> +	clk_register(&pck1);

Any special reason these are not registered in the array above other
that they are not peripheral clocks?
I just saw that it's the same in Linux, so probably this is the reason.

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From plagnioj at jcrosoft.com  Tue Aug  3 21:33:15 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 03:33:15 +0200
Subject: [PATCH 3/3 v2] at91: implement clock framework
In-Reply-To: <1280840019-11421-3-git-send-email-plagnioj@jcrosoft.com>
References: <1280840019-11421-3-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1280885595-18026-1-git-send-email-plagnioj@jcrosoft.com>

this implementation is based on linux one (v2.6.35-rc5-76-gd0c6f62)
it will calculate all the clock dynamically instead of statictly
this will use also the new clock framework

it will also print the clock status after the console init

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
v2:
upadate against mainline kernel
and add ref on which revision it's based on

Best Regards,
J.
 arch/arm/boards/at91sam9260ek/config.h      |    2 +-
 arch/arm/boards/at91sam9263ek/config.h      |    2 +-
 arch/arm/boards/at91sam9263ek/init.c        |    3 -
 arch/arm/boards/mmccpu/config.h             |    2 +-
 arch/arm/boards/mmccpu/init.c               |    3 -
 arch/arm/boards/pm9263/config.h             |    2 +-
 arch/arm/boards/pm9263/init.c               |    3 -
 arch/arm/mach-at91/Makefile                 |    2 +-
 arch/arm/mach-at91/at91sam9260.c            |  207 ++++++++
 arch/arm/mach-at91/at91sam9260_devices.c    |   18 +-
 arch/arm/mach-at91/at91sam9263.c            |  217 ++++++++
 arch/arm/mach-at91/at91sam9263_devices.c    |   13 +-
 arch/arm/mach-at91/clock.c                  |  718 +++++++++++++++++++++++++++
 arch/arm/mach-at91/clock.h                  |   31 ++
 arch/arm/mach-at91/generic.h                |   14 +
 arch/arm/mach-at91/gpio.c                   |    3 +
 arch/arm/mach-at91/include/mach/at91_dbgu.h |   66 +++
 arch/arm/mach-at91/include/mach/clk.h       |   39 --
 arch/arm/mach-at91/include/mach/cpu.h       |  158 ++++++
 arch/arm/mach-at91/include/mach/gpio.h      |    1 +
 drivers/net/macb.c                          |   11 +-
 drivers/serial/atmel.c                      |   32 +-
 22 files changed, 1472 insertions(+), 75 deletions(-)
 create mode 100644 arch/arm/mach-at91/clock.c
 create mode 100644 arch/arm/mach-at91/clock.h
 create mode 100644 arch/arm/mach-at91/generic.h
 create mode 100644 arch/arm/mach-at91/include/mach/at91_dbgu.h
 delete mode 100644 arch/arm/mach-at91/include/mach/clk.h
 create mode 100644 arch/arm/mach-at91/include/mach/cpu.h

diff --git a/arch/arm/boards/at91sam9260ek/config.h b/arch/arm/boards/at91sam9260ek/config.h
index afd8563..006820c 100644
--- a/arch/arm/boards/at91sam9260ek/config.h
+++ b/arch/arm/boards/at91sam9260ek/config.h
@@ -1,6 +1,6 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK  99328000        /* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK		18432000	/* 18.432 MHz crystal */
 
 #endif	/* __CONFIG_H */
diff --git a/arch/arm/boards/at91sam9263ek/config.h b/arch/arm/boards/at91sam9263ek/config.h
index 9cc8af2..bc33227 100644
--- a/arch/arm/boards/at91sam9263ek/config.h
+++ b/arch/arm/boards/at91sam9263ek/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK 100000000        /* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK		16367660	/* 16.367 MHz crystal */
 
 #define MASTER_PLL_MUL		171
 #define MASTER_PLL_DIV		14
diff --git a/arch/arm/boards/at91sam9263ek/init.c b/arch/arm/boards/at91sam9263ek/init.c
index 21803ca..61cd295 100644
--- a/arch/arm/boards/at91sam9263ek/init.c
+++ b/arch/arm/boards/at91sam9263ek/init.c
@@ -108,9 +108,6 @@ static int at91sam9263ek_devices_init(void)
 	at91_set_gpio_output(AT91_PIN_PB27, 1);
 	at91_set_gpio_value(AT91_PIN_PB27, 1); /* 1- enable, 0 - disable */
 
-	/* Enable clock */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
-
 	at91_add_device_sdram(64 * 1024 * 1024);
 	ek_add_device_nand();
 	at91_add_device_eth(&macb_pdata);
diff --git a/arch/arm/boards/mmccpu/config.h b/arch/arm/boards/mmccpu/config.h
index 1133b8f..422ac09 100644
--- a/arch/arm/boards/mmccpu/config.h
+++ b/arch/arm/boards/mmccpu/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK	99532800		/* peripheral = main / 2 */
+#define AT91_M1IN_CLOCK		18432000
 
 /* values */
 #define MASTER_PLL_MUL		54
diff --git a/arch/arm/boards/mmccpu/init.c b/arch/arm/boards/mmccpu/init.c
index e010a83..9a7d930 100644
--- a/arch/arm/boards/mmccpu/init.c
+++ b/arch/arm/boards/mmccpu/init.c
@@ -58,9 +58,6 @@ static int mmccpu_devices_init(void)
 	at91_set_gpio_output(AT91_PIN_PB27, 1);
 	at91_set_gpio_value(AT91_PIN_PB27, 1); /* 1- enable, 0 - disable */
 
-	/* Enable clock */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
-
 	at91_add_device_sdram(128 * 1024 * 1024);
 	at91_add_device_eth(&macb_pdata);
 	register_device(&cfi_dev);
diff --git a/arch/arm/boards/pm9263/config.h b/arch/arm/boards/pm9263/config.h
index 9a9c5cd..5252df2 100644
--- a/arch/arm/boards/pm9263/config.h
+++ b/arch/arm/boards/pm9263/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK  99328000        /* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK	18432000
 
 #define MASTER_PLL_DIV		6
 #define MASTER_PLL_MUL		65
diff --git a/arch/arm/boards/pm9263/init.c b/arch/arm/boards/pm9263/init.c
index 88b91ea..d5ed921 100644
--- a/arch/arm/boards/pm9263/init.c
+++ b/arch/arm/boards/pm9263/init.c
@@ -107,9 +107,6 @@ static int pm9263_devices_init(void)
 	at91_set_gpio_output(AT91_PIN_PB27, 1);
 	at91_set_gpio_value(AT91_PIN_PB27, 1); /* 1- enable, 0 - disable */
 
-	/* Enable clock */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
-
 	at91_add_device_sdram(64 * 1024 * 1024);
 	pm_add_device_nand();
 	at91_add_device_eth(&macb_pdata);
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index c848919..0f55883 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -1,4 +1,4 @@
-obj-y += clocksource.o gpio.o
+obj-y += clock.o clocksource.o gpio.o
 
 obj-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel_init.o
 
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
index 1a6e356..30d1a6a 100644
--- a/arch/arm/mach-at91/at91sam9260.c
+++ b/arch/arm/mach-at91/at91sam9260.c
@@ -2,22 +2,229 @@
 #include <gpio.h>
 #include <init.h>
 #include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+
+#include "generic.h"
+#include "clock.h"
+
+/* --------------------------------------------------------------------
+ *  Clocks
+ * -------------------------------------------------------------------- */
+
+/*
+ * The peripheral clocks.
+ */
+static struct clk pioA_clk = {
+	.name		= "pioA_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_PIOA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioB_clk = {
+	.name		= "pioB_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_PIOB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioC_clk = {
+	.name		= "pioC_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_PIOC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk adc_clk = {
+	.name		= "adc_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_ADC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart0_clk = {
+	.name		= "usart0_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart1_clk = {
+	.name		= "usart1_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart2_clk = {
+	.name		= "usart2_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc_clk = {
+	.name		= "mci_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_MCI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk udc_clk = {
+	.name		= "udc_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_UDP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twi_clk = {
+	.name		= "twi_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TWI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi0_clk = {
+	.name		= "spi0_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_SPI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi1_clk = {
+	.name		= "spi1_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_SPI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc_clk = {
+	.name		= "ssc_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_SSC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc0_clk = {
+	.name		= "tc0_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc1_clk = {
+	.name		= "tc1_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc2_clk = {
+	.name		= "tc2_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ohci_clk = {
+	.name		= "ohci_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_UHP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk macb_clk = {
+	.name		= "macb_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_EMAC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk isi_clk = {
+	.name		= "isi_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_ISI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart3_clk = {
+	.name		= "usart3_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US3,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart4_clk = {
+	.name		= "usart4_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US4,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart5_clk = {
+	.name		= "usart5_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US5,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc3_clk = {
+	.name		= "tc3_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC3,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc4_clk = {
+	.name		= "tc4_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC4,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc5_clk = {
+	.name		= "tc5_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC5,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+
+static struct clk *periph_clocks[] = {
+	&pioA_clk,
+	&pioB_clk,
+	&pioC_clk,
+	&adc_clk,
+	&usart0_clk,
+	&usart1_clk,
+	&usart2_clk,
+	&mmc_clk,
+	&udc_clk,
+	&twi_clk,
+	&spi0_clk,
+	&spi1_clk,
+	&ssc_clk,
+	&tc0_clk,
+	&tc1_clk,
+	&tc2_clk,
+	&ohci_clk,
+	&macb_clk,
+	&isi_clk,
+	&usart3_clk,
+	&usart4_clk,
+	&usart5_clk,
+	&tc3_clk,
+	&tc4_clk,
+	&tc5_clk,
+	// irq0 .. irq2
+};
+
+/*
+ * The two programmable clocks.
+ * You must configure pin multiplexing to bring these signals out.
+ */
+static struct clk pck0 = {
+	.name		= "pck0",
+	.pmc_mask	= AT91_PMC_PCK0,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 0,
+};
+static struct clk pck1 = {
+	.name		= "pck1",
+	.pmc_mask	= AT91_PMC_PCK1,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 1,
+};
+
+static void __init at91sam9260_register_clocks(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
+		clk_register(periph_clocks[i]);
+
+	clk_register(&pck0);
+	clk_register(&pck1);
+}
+
+/* --------------------------------------------------------------------
+ *  GPIO
+ * -------------------------------------------------------------------- */
 
 static struct at91_gpio_bank at91sam9260_gpio[] = {
 	{
 		.id		= AT91SAM9260_ID_PIOA,
 		.offset		= AT91_PIOA,
+		.clock		= &pioA_clk,
 	}, {
 		.id		= AT91SAM9260_ID_PIOB,
 		.offset		= AT91_PIOB,
+		.clock		= &pioB_clk,
 	}, {
 		.id		= AT91SAM9260_ID_PIOC,
 		.offset		= AT91_PIOC,
+		.clock		= &pioC_clk,
 	}
 };
 
 static int at91sam9260_initialize(void)
 {
+	/* Init clock subsystem */
+	at91_clock_init(AT91_MAIN_CLOCK);
+
+	/* Register the processor-specific clocks */
+	at91sam9260_register_clocks();
+
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9260_gpio, 3);
 	return 0;
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index 0cfe913..398a721 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -18,6 +18,8 @@
 #include <mach/gpio.h>
 #include <mach/io.h>
 
+#include "generic.h"
+
 static struct memory_platform_data sram_pdata = {
 	.name = "sram0",
 	.flags = DEVFS_RDWR,
@@ -107,8 +109,6 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 	if (data->det_pin)
 		at91_set_gpio_input(data->det_pin, 1);
 
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOC);
-
 	nand_dev.platform_data = data;
 	register_device(&nand_dev);
 }
@@ -233,37 +233,37 @@ void at91_register_uart(unsigned id, unsigned pins)
 	switch (id) {
 		case 0:		/* DBGU */
 			configure_dbgu_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
+			at91_clock_associate("mck", &dbgu_serial_device, "usart");
 			register_device(&dbgu_serial_device);
 			break;
 		case AT91SAM9260_ID_US0:
 			configure_usart0_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US0);
+			at91_clock_associate("usart0_clk", &uart0_serial_device, "usart");
 			register_device(&uart0_serial_device);
 			break;
 		case AT91SAM9260_ID_US1:
 			configure_usart1_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US1);
+			at91_clock_associate("usart1_clk", &uart1_serial_device, "usart");
 			register_device(&uart1_serial_device);
 			break;
 		case AT91SAM9260_ID_US2:
 			configure_usart2_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US2);
+			at91_clock_associate("usart2_clk", &uart2_serial_device, "usart");
 			register_device(&uart2_serial_device);
 			break;
 		case AT91SAM9260_ID_US3:
 			configure_usart3_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US3);
+			at91_clock_associate("usart3_clk", &uart3_serial_device, "usart");
 			register_device(&uart3_serial_device);
 			break;
 		case AT91SAM9260_ID_US4:
 			configure_usart4_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US4);
+			at91_clock_associate("usart4_clk", &uart4_serial_device, "usart");
 			register_device(&uart4_serial_device);
 			break;
 		case AT91SAM9260_ID_US5:
 			configure_usart5_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US5);
+			at91_clock_associate("usart5_clk", &uart5_serial_device, "usart");
 			register_device(&uart5_serial_device);
 			break;
 		default:
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
index 472b619..b0e3193 100644
--- a/arch/arm/mach-at91/at91sam9263.c
+++ b/arch/arm/mach-at91/at91sam9263.c
@@ -2,28 +2,245 @@
 #include <gpio.h>
 #include <init.h>
 #include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+
+#include "clock.h"
+#include "generic.h"
+
+/* --------------------------------------------------------------------
+ *  Clocks
+ * -------------------------------------------------------------------- */
+
+/*
+ * The peripheral clocks.
+ */
+static struct clk pioA_clk = {
+	.name		= "pioA_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PIOA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioB_clk = {
+	.name		= "pioB_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PIOB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioCDE_clk = {
+	.name		= "pioCDE_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PIOCDE,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart0_clk = {
+	.name		= "usart0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_US0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart1_clk = {
+	.name		= "usart1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_US1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart2_clk = {
+	.name		= "usart2_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_US2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc0_clk = {
+	.name		= "mci0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_MCI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc1_clk = {
+	.name		= "mci1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_MCI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk can_clk = {
+	.name		= "can_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_CAN,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twi_clk = {
+	.name		= "twi_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_TWI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi0_clk = {
+	.name		= "spi0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SPI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi1_clk = {
+	.name		= "spi1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SPI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc0_clk = {
+	.name		= "ssc0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SSC0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc1_clk = {
+	.name		= "ssc1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SSC1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ac97_clk = {
+	.name		= "ac97_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_AC97C,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tcb_clk = {
+	.name		= "tcb_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_TCB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pwm_clk = {
+	.name		= "pwm_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PWMC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk macb_clk = {
+	.name		= "macb_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_EMAC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk dma_clk = {
+	.name		= "dma_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_DMA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twodge_clk = {
+	.name		= "2dge_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_2DGE,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk udc_clk = {
+	.name		= "udc_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_UDP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk isi_clk = {
+	.name		= "isi_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_ISI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk lcdc_clk = {
+	.name		= "lcdc_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_LCDC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ohci_clk = {
+	.name		= "ohci_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_UHP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+
+static struct clk *periph_clocks[] = {
+	&pioA_clk,
+	&pioB_clk,
+	&pioCDE_clk,
+	&usart0_clk,
+	&usart1_clk,
+	&usart2_clk,
+	&mmc0_clk,
+	&mmc1_clk,
+	&can_clk,
+	&twi_clk,
+	&spi0_clk,
+	&spi1_clk,
+	&ssc0_clk,
+	&ssc1_clk,
+	&ac97_clk,
+	&tcb_clk,
+	&pwm_clk,
+	&macb_clk,
+	&twodge_clk,
+	&udc_clk,
+	&isi_clk,
+	&lcdc_clk,
+	&dma_clk,
+	&ohci_clk,
+	// irq0 .. irq1
+};
+
+/*
+ * The four programmable clocks.
+ * You must configure pin multiplexing to bring these signals out.
+ */
+static struct clk pck0 = {
+	.name		= "pck0",
+	.pmc_mask	= AT91_PMC_PCK0,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 0,
+};
+static struct clk pck1 = {
+	.name		= "pck1",
+	.pmc_mask	= AT91_PMC_PCK1,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 1,
+};
+static struct clk pck2 = {
+	.name		= "pck2",
+	.pmc_mask	= AT91_PMC_PCK2,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 2,
+};
+static struct clk pck3 = {
+	.name		= "pck3",
+	.pmc_mask	= AT91_PMC_PCK3,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 3,
+};
+
+static void __init at91sam9263_register_clocks(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
+		clk_register(periph_clocks[i]);
+
+	clk_register(&pck0);
+	clk_register(&pck1);
+	clk_register(&pck2);
+	clk_register(&pck3);
+}
+
+/* --------------------------------------------------------------------
+ *  GPIO
+ * -------------------------------------------------------------------- */
 
 static struct at91_gpio_bank at91sam9263_gpio[] = {
 	{
 		.id		= AT91SAM9263_ID_PIOA,
 		.offset		= AT91_PIOA,
+		.clock		= &pioA_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOB,
 		.offset		= AT91_PIOB,
+		.clock		= &pioB_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOCDE,
 		.offset		= AT91_PIOC,
+		.clock		= &pioCDE_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOCDE,
 		.offset		= AT91_PIOD,
+		.clock		= &pioCDE_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOCDE,
 		.offset		= AT91_PIOE,
+		.clock		= &pioCDE_clk,
 	}
 };
 
 static int at91sam9263_initialize(void)
 {
+	/* Init clock subsystem */
+	at91_clock_init(AT91_MAIN_CLOCK);
+
+	/* Register the processor-specific clocks */
+	at91sam9263_register_clocks();
+
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9263_gpio, 5);
 	return 0;
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
index 50a6348..7ebc32c 100644
--- a/arch/arm/mach-at91/at91sam9263_devices.c
+++ b/arch/arm/mach-at91/at91sam9263_devices.c
@@ -18,6 +18,8 @@
 #include <mach/gpio.h>
 #include <mach/io.h>
 
+#include "generic.h"
+
 static struct memory_platform_data ram_pdata = {
 	.name = "ram0",
 	.flags = DEVFS_RDWR,
@@ -106,9 +108,6 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 	if (data->det_pin)
 		at91_set_gpio_input(data->det_pin, 1);
 
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_PIOA |
-				      1 << AT91SAM9263_ID_PIOCDE);
-
 	nand_dev.platform_data = data;
 	register_device(&nand_dev);
 }
@@ -184,22 +183,22 @@ void at91_register_uart(unsigned id, unsigned pins)
 	switch (id) {
 		case 0:		/* DBGU */
 			configure_dbgu_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
+			at91_clock_associate("mck", &dbgu_serial_device, "usart");
 			register_device(&dbgu_serial_device);
 			break;
 		case AT91SAM9263_ID_US0:
 			configure_usart0_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_US0);
+			at91_clock_associate("usart0_clk", &uart0_serial_device, "usart");
 			register_device(&uart0_serial_device);
 			break;
 		case AT91SAM9263_ID_US1:
 			configure_usart1_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_US1);
+			at91_clock_associate("usart1_clk", &uart1_serial_device, "usart");
 			register_device(&uart1_serial_device);
 			break;
 		case AT91SAM9263_ID_US2:
 			configure_usart2_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_US2);
+			at91_clock_associate("usart2_clk", &uart2_serial_device, "usart");
 			register_device(&uart2_serial_device);
 			break;
 		default:
diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c
new file mode 100644
index 0000000..6fd09d5
--- /dev/null
+++ b/arch/arm/mach-at91/clock.c
@@ -0,0 +1,718 @@
+/*
+ * linux/arch/arm/mach-at91/clock.c
+ *
+ * Copyright (C) 2005 David Brownell
+ * Copyright (C) 2005 Ivan Kokshaysky
+ *
+ * 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 <linux/list.h>
+#include <errno.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <init.h>
+
+#include <mach/hardware.h>
+#include <mach/io.h>
+#include <mach/at91_pmc.h>
+#include <mach/cpu.h>
+
+#include "clock.h"
+#include "generic.h"
+
+/*
+ * There's a lot more which can be done with clocks, including cpufreq
+ * integration, slow clock mode support (for system suspend), letting
+ * PLLB be used at other rates (on boards that don't need USB), etc.
+ */
+
+#define clk_is_primary(x)	((x)->type & CLK_TYPE_PRIMARY)
+#define clk_is_programmable(x)	((x)->type & CLK_TYPE_PROGRAMMABLE)
+#define clk_is_peripheral(x)	((x)->type & CLK_TYPE_PERIPHERAL)
+#define clk_is_sys(x)		((x)->type & CLK_TYPE_SYSTEM)
+
+
+/*
+ * Chips have some kind of clocks : group them by functionality
+ */
+#define cpu_has_utmi()		(  cpu_is_at91cap9() \
+				|| cpu_is_at91sam9rl() \
+				|| cpu_is_at91sam9g45())
+
+#define cpu_has_800M_plla()	(  cpu_is_at91sam9g20() \
+				|| cpu_is_at91sam9g45())
+
+#define cpu_has_300M_plla()	(cpu_is_at91sam9g10())
+
+#define cpu_has_pllb()		(!(cpu_is_at91sam9rl() \
+				|| cpu_is_at91sam9g45()))
+
+#define cpu_has_upll()		(cpu_is_at91sam9g45())
+
+/* USB host HS & FS */
+#define cpu_has_uhp()		(!cpu_is_at91sam9rl())
+
+/* USB device FS only */
+#define cpu_has_udpfs()		(!(cpu_is_at91sam9rl() \
+				|| cpu_is_at91sam9g45()))
+
+static LIST_HEAD(clocks);
+
+static u32 at91_pllb_usb_init;
+
+/*
+ * Four primary clock sources:  two crystal oscillators (32K, main), and
+ * two PLLs.  PLLA usually runs the master clock; and PLLB must run at
+ * 48 MHz (unless no USB function clocks are needed).  The main clock and
+ * both PLLs are turned off to run in "slow clock mode" (system suspend).
+ */
+static struct clk clk32k = {
+	.name		= "clk32k",
+	.rate_hz	= AT91_SLOW_CLOCK,
+	.users		= 1,		/* always on */
+	.id		= 0,
+	.type		= CLK_TYPE_PRIMARY,
+};
+static struct clk main_clk = {
+	.name		= "main",
+	.pmc_mask	= AT91_PMC_MOSCS,	/* in PMC_SR */
+	.id		= 1,
+	.type		= CLK_TYPE_PRIMARY,
+};
+static struct clk plla = {
+	.name		= "plla",
+	.parent		= &main_clk,
+	.pmc_mask	= AT91_PMC_LOCKA,	/* in PMC_SR */
+	.id		= 2,
+	.type		= CLK_TYPE_PRIMARY | CLK_TYPE_PLL,
+};
+
+static void pllb_mode(struct clk *clk, int is_on)
+{
+	u32	value;
+
+	if (is_on) {
+		is_on = AT91_PMC_LOCKB;
+		value = at91_pllb_usb_init;
+	} else
+		value = 0;
+
+	// REVISIT: Add work-around for AT91RM9200 Errata #26 ?
+	at91_sys_write(AT91_CKGR_PLLBR, value);
+
+	do {
+		barrier();
+	} while ((at91_sys_read(AT91_PMC_SR) & AT91_PMC_LOCKB) != is_on);
+}
+
+static struct clk pllb = {
+	.name		= "pllb",
+	.parent		= &main_clk,
+	.pmc_mask	= AT91_PMC_LOCKB,	/* in PMC_SR */
+	.mode		= pllb_mode,
+	.id		= 3,
+	.type		= CLK_TYPE_PRIMARY | CLK_TYPE_PLL,
+};
+
+static void pmc_sys_mode(struct clk *clk, int is_on)
+{
+	if (is_on)
+		at91_sys_write(AT91_PMC_SCER, clk->pmc_mask);
+	else
+		at91_sys_write(AT91_PMC_SCDR, clk->pmc_mask);
+}
+
+static void pmc_uckr_mode(struct clk *clk, int is_on)
+{
+	unsigned int uckr = at91_sys_read(AT91_CKGR_UCKR);
+
+	if (cpu_is_at91sam9g45()) {
+		if (is_on)
+			uckr |= AT91_PMC_BIASEN;
+		else
+			uckr &= ~AT91_PMC_BIASEN;
+	}
+
+	if (is_on) {
+		is_on = AT91_PMC_LOCKU;
+		at91_sys_write(AT91_CKGR_UCKR, uckr | clk->pmc_mask);
+	} else
+		at91_sys_write(AT91_CKGR_UCKR, uckr & ~(clk->pmc_mask));
+
+	do {
+		barrier();
+	} while ((at91_sys_read(AT91_PMC_SR) & AT91_PMC_LOCKU) != is_on);
+}
+
+/* USB function clocks (PLLB must be 48 MHz) */
+static struct clk udpck = {
+	.name		= "udpck",
+	.parent		= &pllb,
+	.mode		= pmc_sys_mode,
+};
+static struct clk utmi_clk = {
+	.name		= "utmi_clk",
+	.parent		= &main_clk,
+	.pmc_mask	= AT91_PMC_UPLLEN,	/* in CKGR_UCKR */
+	.mode		= pmc_uckr_mode,
+	.type		= CLK_TYPE_PLL,
+};
+static struct clk uhpck = {
+	.name		= "uhpck",
+	/*.parent		= ... we choose parent at runtime */
+	.mode		= pmc_sys_mode,
+};
+
+
+/*
+ * The master clock is divided from the CPU clock (by 1-4).  It's used for
+ * memory, interfaces to on-chip peripherals, the AIC, and sometimes more
+ * (e.g baud rate generation).  It's sourced from one of the primary clocks.
+ */
+static struct clk mck = {
+	.name		= "mck",
+	.pmc_mask	= AT91_PMC_MCKRDY,	/* in PMC_SR */
+};
+
+static void pmc_periph_mode(struct clk *clk, int is_on)
+{
+	if (is_on)
+		at91_sys_write(AT91_PMC_PCER, clk->pmc_mask);
+	else
+		at91_sys_write(AT91_PMC_PCDR, clk->pmc_mask);
+}
+
+static struct clk *at91_css_to_clk(unsigned long css)
+{
+	switch (css) {
+		case AT91_PMC_CSS_SLOW:
+			return &clk32k;
+		case AT91_PMC_CSS_MAIN:
+			return &main_clk;
+		case AT91_PMC_CSS_PLLA:
+			return &plla;
+		case AT91_PMC_CSS_PLLB:
+			if (cpu_has_upll())
+				/* CSS_PLLB == CSS_UPLL */
+				return &utmi_clk;
+			else if (cpu_has_pllb())
+				return &pllb;
+	}
+
+	return NULL;
+}
+
+/*
+ * Associate a particular clock with a function (eg, "uart") and device.
+ * The drivers can then request the same 'function' with several different
+ * devices and not care about which clock name to use.
+ */
+void at91_clock_associate(const char *id, struct device_d *dev, const char *func)
+{
+	struct clk *clk = clk_get(NULL, id);
+
+	if (!dev || !clk || !IS_ERR(clk_get(dev, func)))
+		return;
+
+	clk->function = func;
+	clk->dev = dev;
+}
+
+/* clocks cannot be de-registered no refcounting necessary */
+struct clk *clk_get(struct device_d *dev, const char *id)
+{
+	struct clk *clk;
+
+	list_for_each_entry(clk, &clocks, node) {
+		if (strcmp(id, clk->name) == 0)
+			return clk;
+		if (clk->function && (dev == clk->dev) && strcmp(id, clk->function) == 0)
+			return clk;
+	}
+
+	return ERR_PTR(-ENOENT);
+}
+EXPORT_SYMBOL(clk_get);
+
+void clk_put(struct clk *clk)
+{
+}
+EXPORT_SYMBOL(clk_put);
+
+static void __clk_enable(struct clk *clk)
+{
+	if (clk->parent)
+		__clk_enable(clk->parent);
+	if (clk->users++ == 0 && clk->mode)
+		clk->mode(clk, 1);
+}
+
+int clk_enable(struct clk *clk)
+{
+	__clk_enable(clk);
+	return 0;
+}
+EXPORT_SYMBOL(clk_enable);
+
+static void __clk_disable(struct clk *clk)
+{
+	BUG_ON(clk->users == 0);
+	if (--clk->users == 0 && clk->mode)
+		clk->mode(clk, 0);
+	if (clk->parent)
+		__clk_disable(clk->parent);
+}
+
+void clk_disable(struct clk *clk)
+{
+	__clk_disable(clk);
+}
+EXPORT_SYMBOL(clk_disable);
+
+unsigned long clk_get_rate(struct clk *clk)
+{
+	unsigned long	rate;
+
+	for (;;) {
+		rate = clk->rate_hz;
+		if (rate || !clk->parent)
+			break;
+		clk = clk->parent;
+	}
+	return rate;
+}
+EXPORT_SYMBOL(clk_get_rate);
+
+/*------------------------------------------------------------------------*/
+
+#ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS
+
+/*
+ * For now, only the programmable clocks support reparenting (MCK could
+ * do this too, with care) or rate changing (the PLLs could do this too,
+ * ditto MCK but that's more for cpufreq).  Drivers may reparent to get
+ * a better rate match; we don't.
+ */
+
+long clk_round_rate(struct clk *clk, unsigned long rate)
+{
+	unsigned long	flags;
+	unsigned	prescale;
+	unsigned long	actual;
+	unsigned long	prev = ULONG_MAX;
+
+	if (!clk_is_programmable(clk))
+		return -EINVAL;
+
+	actual = clk->parent->rate_hz;
+	for (prescale = 0; prescale < 7; prescale++) {
+		if (actual > rate)
+			prev = actual;
+
+		if (actual && actual <= rate) {
+			if ((prev - rate) < (rate - actual)) {
+				actual = prev;
+				prescale--;
+			}
+			break;
+		}
+		actual >>= 1;
+	}
+
+	return (prescale < 7) ? actual : -ENOENT;
+}
+EXPORT_SYMBOL(clk_round_rate);
+
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+	unsigned long	flags;
+	unsigned	prescale;
+	unsigned long	actual;
+
+	if (!clk_is_programmable(clk))
+		return -EINVAL;
+	if (clk->users)
+		return -EBUSY;
+
+	actual = clk->parent->rate_hz;
+	for (prescale = 0; prescale < 7; prescale++) {
+		if (actual && actual <= rate) {
+			u32	pckr;
+
+			pckr = at91_sys_read(AT91_PMC_PCKR(clk->id));
+			pckr &= AT91_PMC_CSS;	/* clock selection */
+			pckr |= prescale << 2;
+			at91_sys_write(AT91_PMC_PCKR(clk->id), pckr);
+			clk->rate_hz = actual;
+			break;
+		}
+		actual >>= 1;
+	}
+
+	return (prescale < 7) ? actual : -ENOENT;
+}
+EXPORT_SYMBOL(clk_set_rate);
+
+struct clk *clk_get_parent(struct clk *clk)
+{
+	return clk->parent;
+}
+EXPORT_SYMBOL(clk_get_parent);
+
+int clk_set_parent(struct clk *clk, struct clk *parent)
+{
+	unsigned long	flags;
+
+	if (clk->users)
+		return -EBUSY;
+	if (!clk_is_primary(parent) || !clk_is_programmable(clk))
+		return -EINVAL;
+
+	if (cpu_is_at91sam9rl() && parent->id == AT91_PMC_CSS_PLLB)
+		return -EINVAL;
+
+	clk->rate_hz = parent->rate_hz;
+	clk->parent = parent;
+	at91_sys_write(AT91_PMC_PCKR(clk->id), parent->id);
+
+	return 0;
+}
+EXPORT_SYMBOL(clk_set_parent);
+
+/* establish PCK0..PCKN parentage and rate */
+static void init_programmable_clock(struct clk *clk)
+{
+	struct clk	*parent;
+	u32		pckr;
+
+	pckr = at91_sys_read(AT91_PMC_PCKR(clk->id));
+	parent = at91_css_to_clk(pckr & AT91_PMC_CSS);
+	clk->parent = parent;
+	clk->rate_hz = parent->rate_hz / (1 << ((pckr & AT91_PMC_PRES) >> 2));
+}
+
+#endif	/* CONFIG_AT91_PROGRAMMABLE_CLOCKS */
+
+/*------------------------------------------------------------------------*/
+
+/* Register a new clock */
+int clk_register(struct clk *clk)
+{
+	if (clk_is_peripheral(clk)) {
+		clk->parent = &mck;
+		clk->mode = pmc_periph_mode;
+		list_add_tail(&clk->node, &clocks);
+	}
+	else if (clk_is_sys(clk)) {
+		clk->parent = &mck;
+		clk->mode = pmc_sys_mode;
+
+		list_add_tail(&clk->node, &clocks);
+	}
+#ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS
+	else if (clk_is_programmable(clk)) {
+		clk->mode = pmc_sys_mode;
+		init_programmable_clock(clk);
+		list_add_tail(&clk->node, &clocks);
+	}
+#endif
+
+	return 0;
+}
+
+
+/*------------------------------------------------------------------------*/
+
+static u32 at91_pll_rate(struct clk *pll, u32 freq, u32 reg)
+{
+	unsigned mul, div;
+
+	div = reg & 0xff;
+	mul = (reg >> 16) & 0x7ff;
+	if (div && mul) {
+		freq /= div;
+		freq *= mul + 1;
+	} else
+		freq = 0;
+
+	return freq;
+}
+
+static u32 at91_usb_rate(struct clk *pll, u32 freq, u32 reg)
+{
+	if (pll == &pllb && (reg & AT91_PMC_USB96M))
+		return freq / 2;
+	else
+		return freq;
+}
+
+static unsigned at91_pll_calc(unsigned main_freq, unsigned out_freq)
+{
+	unsigned i, div = 0, mul = 0, diff = 1 << 30;
+	unsigned ret = (out_freq > 155000000) ? 0xbe00 : 0x3e00;
+
+	/* PLL output max 240 MHz (or 180 MHz per errata) */
+	if (out_freq > 240000000)
+		goto fail;
+
+	for (i = 1; i < 256; i++) {
+		int diff1;
+		unsigned input, mul1;
+
+		/*
+		 * PLL input between 1MHz and 32MHz per spec, but lower
+		 * frequences seem necessary in some cases so allow 100K.
+		 * Warning: some newer products need 2MHz min.
+		 */
+		input = main_freq / i;
+		if (cpu_is_at91sam9g20() && input < 2000000)
+			continue;
+		if (input < 100000)
+			continue;
+		if (input > 32000000)
+			continue;
+
+		mul1 = out_freq / input;
+		if (cpu_is_at91sam9g20() && mul > 63)
+			continue;
+		if (mul1 > 2048)
+			continue;
+		if (mul1 < 2)
+			goto fail;
+
+		diff1 = out_freq - input * mul1;
+		if (diff1 < 0)
+			diff1 = -diff1;
+		if (diff > diff1) {
+			diff = diff1;
+			div = i;
+			mul = mul1;
+			if (diff == 0)
+				break;
+		}
+	}
+	if (i == 256 && diff > (out_freq >> 5))
+		goto fail;
+	return ret | ((mul - 1) << 16) | div;
+fail:
+	return 0;
+}
+
+static struct clk *const standard_pmc_clocks[] = {
+	/* four primary clocks */
+	&clk32k,
+	&main_clk,
+	&plla,
+
+	/* MCK */
+	&mck
+};
+
+/* PLLB generated USB full speed clock init */
+static void at91_pllb_usbfs_clock_init(unsigned long main_clock)
+{
+	/*
+	 * USB clock init:  choose 48 MHz PLLB value,
+	 * disable 48MHz clock during usb peripheral suspend.
+	 *
+	 * REVISIT:  assumes MCK doesn't derive from PLLB!
+	 */
+	uhpck.parent = &pllb;
+
+	at91_pllb_usb_init = at91_pll_calc(main_clock, 48000000 * 2) | AT91_PMC_USB96M;
+	pllb.rate_hz = at91_pll_rate(&pllb, main_clock, at91_pllb_usb_init);
+	if (cpu_is_at91rm9200()) {
+		uhpck.pmc_mask = AT91RM9200_PMC_UHP;
+		udpck.pmc_mask = AT91RM9200_PMC_UDP;
+		at91_sys_write(AT91_PMC_SCER, AT91RM9200_PMC_MCKUDP);
+	} else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() ||
+		   cpu_is_at91sam9263() || cpu_is_at91sam9g20() ||
+		   cpu_is_at91sam9g10() || cpu_is_at572d940hf()) {
+		uhpck.pmc_mask = AT91SAM926x_PMC_UHP;
+		udpck.pmc_mask = AT91SAM926x_PMC_UDP;
+	} else if (cpu_is_at91cap9()) {
+		uhpck.pmc_mask = AT91CAP9_PMC_UHP;
+	}
+	at91_sys_write(AT91_CKGR_PLLBR, 0);
+
+	udpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init);
+	uhpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init);
+}
+
+/* UPLL generated USB full speed clock init */
+static void at91_upll_usbfs_clock_init(unsigned long main_clock)
+{
+	/*
+	 * USB clock init: choose 480 MHz from UPLL,
+	 */
+	unsigned int usbr = AT91_PMC_USBS_UPLL;
+
+	/* Setup divider by 10 to reach 48 MHz */
+	usbr |= ((10 - 1) << 8) & AT91_PMC_OHCIUSBDIV;
+
+	at91_sys_write(AT91_PMC_USB, usbr);
+
+	/* Now set uhpck values */
+	uhpck.parent = &utmi_clk;
+	uhpck.pmc_mask = AT91SAM926x_PMC_UHP;
+	uhpck.rate_hz = utmi_clk.parent->rate_hz;
+	uhpck.rate_hz /= 1 + ((at91_sys_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8);
+}
+
+static int pll_overclock = 0;
+
+int at91_clock_init(unsigned long main_clock)
+{
+	unsigned tmp, freq, mckr;
+	int i;
+
+	/*
+	 * When the bootloader initialized the main oscillator correctly,
+	 * there's no problem using the cycle counter.  But if it didn't,
+	 * or when using oscillator bypass mode, we must be told the speed
+	 * of the main clock.
+	 */
+	if (!main_clock) {
+		do {
+			tmp = at91_sys_read(AT91_CKGR_MCFR);
+		} while (!(tmp & AT91_PMC_MAINRDY));
+		main_clock = (tmp & AT91_PMC_MAINF) * (AT91_SLOW_CLOCK / 16);
+	}
+	main_clk.rate_hz = main_clock;
+
+	/* report if PLLA is more than mildly overclocked */
+	plla.rate_hz = at91_pll_rate(&plla, main_clock, at91_sys_read(AT91_CKGR_PLLAR));
+	if (cpu_has_300M_plla()) {
+		if (plla.rate_hz > 300000000)
+			pll_overclock = 1;
+	} else if (cpu_has_800M_plla()) {
+		if (plla.rate_hz > 800000000)
+			pll_overclock = 1;
+	} else {
+		if (plla.rate_hz > 209000000)
+			pll_overclock = 1;
+	}
+
+	if (cpu_is_at91sam9g45()) {
+		mckr = at91_sys_read(AT91_PMC_MCKR);
+		plla.rate_hz /= (1 << ((mckr & AT91_PMC_PLLADIV2) >> 12));	/* plla divisor by 2 */
+	}
+
+	if (!cpu_has_pllb() && cpu_has_upll()) {
+		/* setup UTMI clock as the fourth primary clock
+		 * (instead of pllb) */
+		utmi_clk.type |= CLK_TYPE_PRIMARY;
+		utmi_clk.id = 3;
+	}
+
+	/*
+	 * USB HS clock init
+	 */
+	if (cpu_has_utmi()) {
+		/*
+		 * multiplier is hard-wired to 40
+		 * (obtain the USB High Speed 480 MHz when input is 12 MHz)
+		 */
+		utmi_clk.rate_hz = 40 * utmi_clk.parent->rate_hz;
+	}
+
+	/*
+	 * USB FS clock init
+	 */
+	if (cpu_has_pllb())
+		at91_pllb_usbfs_clock_init(main_clock);
+	if (cpu_has_upll())
+		/* assumes that we choose UPLL for USB and not PLLA */
+		at91_upll_usbfs_clock_init(main_clock);
+
+	/*
+	 * MCK and CPU derive from one of those primary clocks.
+	 * For now, assume this parentage won't change.
+	 */
+	mckr = at91_sys_read(AT91_PMC_MCKR);
+	mck.parent = at91_css_to_clk(mckr & AT91_PMC_CSS);
+	freq = mck.parent->rate_hz;
+	freq /= (1 << ((mckr & AT91_PMC_PRES) >> 2));				/* prescale */
+	if (cpu_is_at91rm9200()) {
+		mck.rate_hz = freq / (1 + ((mckr & AT91_PMC_MDIV) >> 8));	/* mdiv */
+	} else if (cpu_is_at91sam9g20()) {
+		mck.rate_hz = (mckr & AT91_PMC_MDIV) ?
+			freq / ((mckr & AT91_PMC_MDIV) >> 7) : freq;	/* mdiv ; (x >> 7) = ((x >> 8) * 2) */
+		if (mckr & AT91_PMC_PDIV)
+			freq /= 2;		/* processor clock division */
+	} else if (cpu_is_at91sam9g45()) {
+		mck.rate_hz = (mckr & AT91_PMC_MDIV) == AT91SAM9_PMC_MDIV_3 ?
+			freq / 3 : freq / (1 << ((mckr & AT91_PMC_MDIV) >> 8));	/* mdiv */
+	} else {
+		mck.rate_hz = freq / (1 << ((mckr & AT91_PMC_MDIV) >> 8));      /* mdiv */
+	}
+
+	/* Register the PMC's standard clocks */
+	for (i = 0; i < ARRAY_SIZE(standard_pmc_clocks); i++)
+		list_add_tail(&standard_pmc_clocks[i]->node, &clocks);
+
+	if (cpu_has_pllb())
+		list_add_tail(&pllb.node, &clocks);
+
+	if (cpu_has_uhp())
+		list_add_tail(&uhpck.node, &clocks);
+
+	if (cpu_has_udpfs())
+		list_add_tail(&udpck.node, &clocks);
+
+	if (cpu_has_utmi())
+		list_add_tail(&utmi_clk.node, &clocks);
+
+	/* MCK and CPU clock are "always on" */
+	clk_enable(&mck);
+
+	return 0;
+}
+
+static int at91_clock_display(void)
+{
+	if (pll_overclock)
+		pr_info("Clocks: PLLA overclocked, %ld MHz\n", plla.rate_hz / 1000000);
+
+	printf("Clocks: CPU %u MHz, master %u MHz, main %u.%03u MHz\n",
+		mck.parent->rate_hz / 1000000, (unsigned) mck.rate_hz / 1000000,
+		(unsigned) main_clk.rate_hz / 1000000,
+		((unsigned) main_clk.rate_hz % 1000000) / 1000);
+
+	return 0;
+}
+postconsole_initcall(at91_clock_display);
+
+/*
+ * Several unused clocks may be active.  Turn them off.
+ */
+static int at91_clock_reset(void)
+{
+	unsigned long pcdr = 0;
+	unsigned long scdr = 0;
+	struct clk *clk;
+
+	list_for_each_entry(clk, &clocks, node) {
+		if (clk->users > 0)
+			continue;
+
+		if (clk->mode == pmc_periph_mode)
+			pcdr |= clk->pmc_mask;
+
+		if (clk->mode == pmc_sys_mode)
+			scdr |= clk->pmc_mask;
+
+		pr_debug("Clocks: disable unused %s\n", clk->name);
+	}
+
+	at91_sys_write(AT91_PMC_PCDR, pcdr);
+	at91_sys_write(AT91_PMC_SCDR, scdr);
+
+	return 0;
+}
+late_initcall(at91_clock_reset);
diff --git a/arch/arm/mach-at91/clock.h b/arch/arm/mach-at91/clock.h
new file mode 100644
index 0000000..c8ecd0c
--- /dev/null
+++ b/arch/arm/mach-at91/clock.h
@@ -0,0 +1,31 @@
+/*
+ * linux/arch/arm/mach-at91/clock.h
+ *
+ * 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.
+ */
+
+#define CLK_TYPE_PRIMARY	0x1
+#define CLK_TYPE_PLL		0x2
+#define CLK_TYPE_PROGRAMMABLE	0x4
+#define CLK_TYPE_PERIPHERAL	0x8
+#define CLK_TYPE_SYSTEM		0x10
+
+
+struct clk {
+	struct list_head node;
+	const char	*name;		/* unique clock name */
+	const char	*function;	/* function of the clock */
+	struct device_d	*dev;		/* device associated with function */
+	unsigned long	rate_hz;
+	struct clk	*parent;
+	u32		pmc_mask;
+	void		(*mode)(struct clk *, int);
+	unsigned	id:3;		/* PCK0..4, or 32k/main/a/b */
+	unsigned	type;		/* clock type */
+	u16		users;
+};
+
+
+extern int __init clk_register(struct clk *clk);
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h
new file mode 100644
index 0000000..b3a029d
--- /dev/null
+++ b/arch/arm/mach-at91/generic.h
@@ -0,0 +1,14 @@
+/*
+ * linux/arch/arm/mach-at91/generic.h
+ *
+ *  Copyright (C) 2005 David Brownell
+ *
+ * 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.
+ */
+
+ /* Clocks */
+extern int __init at91_clock_init(unsigned long main_clock);
+struct device_d;
+extern void __init at91_clock_associate(const char *id, struct device_d *dev, const char *func);
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c
index 1cafaf7..b257128 100644
--- a/arch/arm/mach-at91/gpio.c
+++ b/arch/arm/mach-at91/gpio.c
@@ -22,6 +22,7 @@
  */
 
 #include <common.h>
+#include <linux/clk.h>
 #include <errno.h>
 #include <asm/io.h>
 #include <mach/gpio.h>
@@ -245,6 +246,8 @@ int at91_gpio_init(struct at91_gpio_bank *data, int nr_banks)
 		data->regbase = data->offset +
 			(void __iomem *)AT91_BASE_SYS;
 
+		/* enable PIO controller's clock */
+		clk_enable(data->clock);
 
 		/* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */
 		if (last && last->id == data->id)
diff --git a/arch/arm/mach-at91/include/mach/at91_dbgu.h b/arch/arm/mach-at91/include/mach/at91_dbgu.h
new file mode 100644
index 0000000..6dcaa77
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/at91_dbgu.h
@@ -0,0 +1,66 @@
+/*
+ * arch/arm/mach-at91/include/mach/at91_dbgu.h
+ *
+ * Copyright (C) 2005 Ivan Kokshaysky
+ * Copyright (C) SAN People
+ *
+ * Debug Unit (DBGU) - System peripherals registers.
+ * Based on AT91RM9200 datasheet revision E.
+ *
+ * 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 AT91_DBGU_H
+#define AT91_DBGU_H
+
+#ifdef AT91_DBGU
+#define AT91_DBGU_CR		(AT91_DBGU + 0x00)	/* Control Register */
+#define AT91_DBGU_MR		(AT91_DBGU + 0x04)	/* Mode Register */
+#define AT91_DBGU_IER		(AT91_DBGU + 0x08)	/* Interrupt Enable Register */
+#define		AT91_DBGU_TXRDY		(1 << 1)		/* Transmitter Ready */
+#define		AT91_DBGU_TXEMPTY	(1 << 9)		/* Transmitter Empty */
+#define AT91_DBGU_IDR		(AT91_DBGU + 0x0c)	/* Interrupt Disable Register */
+#define AT91_DBGU_IMR		(AT91_DBGU + 0x10)	/* Interrupt Mask Register */
+#define AT91_DBGU_SR		(AT91_DBGU + 0x14)	/* Status Register */
+#define AT91_DBGU_RHR		(AT91_DBGU + 0x18)	/* Receiver Holding Register */
+#define AT91_DBGU_THR		(AT91_DBGU + 0x1c)	/* Transmitter Holding Register */
+#define AT91_DBGU_BRGR		(AT91_DBGU + 0x20)	/* Baud Rate Generator Register */
+
+#define AT91_DBGU_CIDR		(AT91_DBGU + 0x40)	/* Chip ID Register */
+#define AT91_DBGU_EXID		(AT91_DBGU + 0x44)	/* Chip ID Extension Register */
+#define AT91_DBGU_FNR		(AT91_DBGU + 0x48)	/* Force NTRST Register [SAM9 only] */
+#define		AT91_DBGU_FNTRST	(1 << 0)		/* Force NTRST */
+
+#endif /* AT91_DBGU */
+
+/*
+ * Some AT91 parts that don't have full DEBUG units still support the ID
+ * and extensions register.
+ */
+#define		AT91_CIDR_VERSION	(0x1f << 0)		/* Version of the Device */
+#define		AT91_CIDR_EPROC		(7    << 5)		/* Embedded Processor */
+#define		AT91_CIDR_NVPSIZ	(0xf  << 8)		/* Nonvolatile Program Memory Size */
+#define		AT91_CIDR_NVPSIZ2	(0xf  << 12)		/* Second Nonvolatile Program Memory Size */
+#define		AT91_CIDR_SRAMSIZ	(0xf  << 16)		/* Internal SRAM Size */
+#define			AT91_CIDR_SRAMSIZ_1K	(1 << 16)
+#define			AT91_CIDR_SRAMSIZ_2K	(2 << 16)
+#define			AT91_CIDR_SRAMSIZ_112K	(4 << 16)
+#define			AT91_CIDR_SRAMSIZ_4K	(5 << 16)
+#define			AT91_CIDR_SRAMSIZ_80K	(6 << 16)
+#define			AT91_CIDR_SRAMSIZ_160K	(7 << 16)
+#define			AT91_CIDR_SRAMSIZ_8K	(8 << 16)
+#define			AT91_CIDR_SRAMSIZ_16K	(9 << 16)
+#define			AT91_CIDR_SRAMSIZ_32K	(10 << 16)
+#define			AT91_CIDR_SRAMSIZ_64K	(11 << 16)
+#define			AT91_CIDR_SRAMSIZ_128K	(12 << 16)
+#define			AT91_CIDR_SRAMSIZ_256K	(13 << 16)
+#define			AT91_CIDR_SRAMSIZ_96K	(14 << 16)
+#define			AT91_CIDR_SRAMSIZ_512K	(15 << 16)
+#define		AT91_CIDR_ARCH		(0xff << 20)		/* Architecture Identifier */
+#define		AT91_CIDR_NVPTYP	(7    << 28)		/* Nonvolatile Program Memory Type */
+#define		AT91_CIDR_EXT		(1    << 31)		/* Extension Flag */
+
+#endif
diff --git a/arch/arm/mach-at91/include/mach/clk.h b/arch/arm/mach-at91/include/mach/clk.h
deleted file mode 100644
index a9c0683..0000000
--- a/arch/arm/mach-at91/include/mach/clk.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * (C) Copyright 2007
- * Stelian Pop <stelian.pop at leadtechdesign.com>
- * Lead Tech Design <www.leadtechdesign.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
- */
-#ifndef __ASM_ARM_ARCH_CLK_H__
-#define __ASM_ARM_ARCH_CLK_H__
-
-#include <mach/hardware.h>
-
-static inline unsigned long get_macb_pclk_rate(unsigned int dev_id)
-{
-	return AT91_MASTER_CLOCK;
-}
-
-static inline unsigned long get_usart_clk_rate(unsigned int dev_id)
-{
-	return AT91_MASTER_CLOCK;
-}
-
-#endif /* __ASM_ARM_ARCH_CLK_H__ */
diff --git a/arch/arm/mach-at91/include/mach/cpu.h b/arch/arm/mach-at91/include/mach/cpu.h
new file mode 100644
index 0000000..833659d
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/cpu.h
@@ -0,0 +1,158 @@
+/*
+ * arch/arm/mach-at91/include/mach/cpu.h
+ *
+ *  Copyright (C) 2006 SAN People
+ *
+ * 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 __ASM_ARCH_CPU_H
+#define __ASM_ARCH_CPU_H
+
+#include <mach/hardware.h>
+#include <mach/at91_dbgu.h>
+
+
+#define ARCH_ID_AT91RM9200	0x09290780
+#define ARCH_ID_AT91SAM9260	0x019803a0
+#define ARCH_ID_AT91SAM9261	0x019703a0
+#define ARCH_ID_AT91SAM9263	0x019607a0
+#define ARCH_ID_AT91SAM9G10	0x019903a0
+#define ARCH_ID_AT91SAM9G20	0x019905a0
+#define ARCH_ID_AT91SAM9RL64	0x019b03a0
+#define ARCH_ID_AT91SAM9G45	0x819b05a0
+#define ARCH_ID_AT91SAM9G45MRL	0x819b05a2	/* aka 9G45-ES2 & non ES lots */
+#define ARCH_ID_AT91SAM9G45ES	0x819b05a1	/* 9G45-ES (Engineering Sample) */
+#define ARCH_ID_AT91CAP9	0x039A03A0
+
+#define ARCH_ID_AT91SAM9XE128	0x329973a0
+#define ARCH_ID_AT91SAM9XE256	0x329a93a0
+#define ARCH_ID_AT91SAM9XE512	0x329aa3a0
+
+#define ARCH_ID_AT572D940HF	0x0e0303e0
+
+#define ARCH_ID_AT91M40800	0x14080044
+#define ARCH_ID_AT91R40807	0x44080746
+#define ARCH_ID_AT91M40807	0x14080745
+#define ARCH_ID_AT91R40008	0x44000840
+
+static inline unsigned long at91_cpu_identify(void)
+{
+	return (at91_sys_read(AT91_DBGU_CIDR) & ~AT91_CIDR_VERSION);
+}
+
+static inline unsigned long at91_cpu_fully_identify(void)
+{
+	return at91_sys_read(AT91_DBGU_CIDR);
+}
+
+#define ARCH_EXID_AT91SAM9M11	0x00000001
+#define ARCH_EXID_AT91SAM9M10	0x00000002
+#define ARCH_EXID_AT91SAM9G45	0x00000004
+
+static inline unsigned long at91_exid_identify(void)
+{
+	return at91_sys_read(AT91_DBGU_EXID);
+}
+
+
+#define ARCH_FAMILY_AT91X92	0x09200000
+#define ARCH_FAMILY_AT91SAM9	0x01900000
+#define ARCH_FAMILY_AT91SAM9XE	0x02900000
+
+static inline unsigned long at91_arch_identify(void)
+{
+	return (at91_sys_read(AT91_DBGU_CIDR) & AT91_CIDR_ARCH);
+}
+
+#ifdef CONFIG_ARCH_AT91CAP9
+#include <mach/at91_pmc.h>
+
+#define ARCH_REVISION_CAP9_B	0x399
+#define ARCH_REVISION_CAP9_C	0x601
+
+static inline unsigned long at91cap9_rev_identify(void)
+{
+	return (at91_sys_read(AT91_PMC_VER));
+}
+#endif
+
+#ifdef CONFIG_ARCH_AT91RM9200
+#define cpu_is_at91rm9200()	(at91_cpu_identify() == ARCH_ID_AT91RM9200)
+#else
+#define cpu_is_at91rm9200()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9260
+#define cpu_is_at91sam9xe()	(at91_arch_identify() == ARCH_FAMILY_AT91SAM9XE)
+#define cpu_is_at91sam9260()	((at91_cpu_identify() == ARCH_ID_AT91SAM9260) || cpu_is_at91sam9xe())
+#else
+#define cpu_is_at91sam9xe()	(0)
+#define cpu_is_at91sam9260()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9G20
+#define cpu_is_at91sam9g20()	(at91_cpu_identify() == ARCH_ID_AT91SAM9G20)
+#else
+#define cpu_is_at91sam9g20()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9261
+#define cpu_is_at91sam9261()	(at91_cpu_identify() == ARCH_ID_AT91SAM9261)
+#else
+#define cpu_is_at91sam9261()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9G10
+#define cpu_is_at91sam9g10()	((at91_cpu_identify() & ~AT91_CIDR_EXT)	== ARCH_ID_AT91SAM9G10)
+#else
+#define cpu_is_at91sam9g10()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9263
+#define cpu_is_at91sam9263()	(at91_cpu_identify() == ARCH_ID_AT91SAM9263)
+#else
+#define cpu_is_at91sam9263()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9RL
+#define cpu_is_at91sam9rl()	(at91_cpu_identify() == ARCH_ID_AT91SAM9RL64)
+#else
+#define cpu_is_at91sam9rl()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9G45
+#define cpu_is_at91sam9g45()	(at91_cpu_identify() == ARCH_ID_AT91SAM9G45)
+#define cpu_is_at91sam9g45es()	(at91_cpu_fully_identify() == ARCH_ID_AT91SAM9G45ES)
+#else
+#define cpu_is_at91sam9g45()	(0)
+#define cpu_is_at91sam9g45es()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91CAP9
+#define cpu_is_at91cap9()	(at91_cpu_identify() == ARCH_ID_AT91CAP9)
+#define cpu_is_at91cap9_revB()	(at91cap9_rev_identify() == ARCH_REVISION_CAP9_B)
+#define cpu_is_at91cap9_revC()	(at91cap9_rev_identify() == ARCH_REVISION_CAP9_C)
+#else
+#define cpu_is_at91cap9()	(0)
+#define cpu_is_at91cap9_revB()	(0)
+#define cpu_is_at91cap9_revC()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT572D940HF
+#define cpu_is_at572d940hf() (at91_cpu_identify() == ARCH_ID_AT572D940HF)
+#else
+#define cpu_is_at572d940hf() (0)
+#endif
+
+/*
+ * Since this is ARM, we will never run on any AVR32 CPU. But these
+ * definitions may reduce clutter in common drivers.
+ */
+#define cpu_is_at32ap7000()	(0)
+
+#endif
diff --git a/arch/arm/mach-at91/include/mach/gpio.h b/arch/arm/mach-at91/include/mach/gpio.h
index 76d53ba..7e1a9a8 100644
--- a/arch/arm/mach-at91/include/mach/gpio.h
+++ b/arch/arm/mach-at91/include/mach/gpio.h
@@ -241,6 +241,7 @@ struct at91_gpio_bank {
 	struct at91_gpio_bank *next;	/* bank sharing same IRQ/clock/... */
 	unsigned short id;		/* peripheral ID */
 	unsigned long offset;		/* offset from system peripheral base */
+	struct clk *clock;
 };
 
 extern int at91_gpio_init(struct at91_gpio_bank *data, int nr_banks);
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 4feeed0..6864119 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -48,7 +48,7 @@
 #include <errno.h>
 #include <asm/io.h>
 #include <mach/board.h>
-#include <mach/clk.h>
+#include <linux/clk.h>
 
 #include "macb.h"
 
@@ -412,6 +412,9 @@ static int macb_probe(struct device_d *dev)
 	unsigned long macb_hz;
 	u32 ncfgr;
 	struct at91_ether_platform_data *pdata;
+#if defined(CONFIG_ARCH_AT91)
+	struct clk *pclk;
+#endif
 
 	if (!dev->platform_data) {
 		printf("macb: no platform_data\n");
@@ -450,7 +453,13 @@ static int macb_probe(struct device_d *dev)
 	 * Do some basic initialization so that we at least can talk
 	 * to the PHY
 	 */
+#if defined(CONFIG_ARCH_AT91)
+	pclk = clk_get(dev, "macb_clk");
+	clk_enable(pclk);
+	macb_hz = clk_get_rate(pclk);
+#else
 	macb_hz = get_macb_pclk_rate(0);
+#endif
 	if (macb_hz < 20000000)
 		ncfgr = MACB_BF(CLK, MACB_CLK_DIV8);
 	else if (macb_hz < 40000000)
diff --git a/drivers/serial/atmel.c b/drivers/serial/atmel.c
index e9e8116..b99ec4d 100644
--- a/drivers/serial/atmel.c
+++ b/drivers/serial/atmel.c
@@ -22,7 +22,7 @@
 #include <init.h>
 #include <malloc.h>
 #include <asm/io.h>
-#include <mach/clk.h>
+#include <linux/clk.h>
 
 /* USART3 register offsets */
 #define USART3_CR				0x0000
@@ -309,6 +309,21 @@
 		    << USART3_##name##_OFFSET))		\
 	 | USART3_BF(name,value))
 
+/*
+ * We wrap our port structure around the generic console_device.
+ */
+struct atmel_uart_port {
+	struct console_device	uart;		/* uart */
+	struct clk		*clk;		/* uart clock */
+	u32			uartclk;
+};
+
+static inline struct atmel_uart_port *
+to_atmel_uart_port(struct console_device *uart)
+{
+	return container_of(uart, struct atmel_uart_port, uart);
+}
+
 static void atmel_serial_putc(struct console_device *cdev, char c)
 {
 	struct device_d *dev = cdev->dev;
@@ -336,16 +351,15 @@ static int atmel_serial_getc(struct console_device *cdev)
 static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate)
 {
 	struct device_d *dev = cdev->dev;
+	struct atmel_uart_port *uart = to_atmel_uart_port(cdev);
 	unsigned long divisor;
-	unsigned long usart_hz;
 
 	/*
 	 *              Master Clock
 	 * Baud Rate = --------------
 	 *                16 * CD
 	 */
-	usart_hz = get_usart_clk_rate(0);
-	divisor = (usart_hz / 16 + baudrate / 2) / baudrate;
+	divisor = (uart->uartclk / 16 + baudrate / 2) / baudrate;
 	writel(USART3_BF(CD, divisor), dev->map_base + USART3_BRGR);
 
 	return 0;
@@ -359,6 +373,11 @@ static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate)
 static int atmel_serial_init_port(struct console_device *cdev)
 {
 	struct device_d *dev = cdev->dev;
+	struct atmel_uart_port *uart = to_atmel_uart_port(cdev);
+
+	uart->clk = clk_get(dev, "usart");
+	clk_enable(uart->clk);
+	uart->uartclk = clk_get_rate(uart->clk);
 
 	writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), dev->map_base + USART3_CR);
 
@@ -376,9 +395,12 @@ static int atmel_serial_init_port(struct console_device *cdev)
 
 static int atmel_serial_probe(struct device_d *dev)
 {
+	struct atmel_uart_port *uart;
 	struct console_device *cdev;
 
-	cdev = malloc(sizeof(struct console_device));
+	uart = malloc(sizeof(struct atmel_uart_port));
+
+	cdev = &uart->uart;
 	dev->type_data = cdev;
 	cdev->dev = dev;
 	cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug  3 21:42:27 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed, 4 Aug 2010 03:42:27 +0200
Subject: [PATCH 0/6] common arm clkdev
Message-ID: <20100804014227.GA16337@game.jcrosoft.org>

Hi,

	this patch series add the arm common clkdev support with the support
	of the STm8815 soc which use is for the generic ARM amba serial API

Jean-Christophe PLAGNIOL-VILLARD (6):
      string: add strlcpy support
      arm: add common clkdev
      amba: add pl011
      arm: add Nomadik 8815 SoC support
      nand: driver for Nomadik 8815 SoC
      arm: add nhk8815 board support

 arch/arm/Kconfig                                   |   11 +
 arch/arm/Makefile                                  |    4 +-
 arch/arm/boards/nhk8815/Makefile                   |    1 +
 arch/arm/boards/nhk8815/env/bin/_update            |   36 +++
 arch/arm/boards/nhk8815/env/bin/boot               |   38 +++
 arch/arm/boards/nhk8815/env/bin/init               |   28 +++
 .../boards/nhk8815/env/bin/update_barebox_xmodem   |   19 ++
 arch/arm/boards/nhk8815/env/bin/update_kernel      |    8 +
 arch/arm/boards/nhk8815/env/bin/update_root        |    8 +
 arch/arm/boards/nhk8815/env/config                 |   32 +++
 arch/arm/boards/nhk8815/setup.c                    |  106 +++++++++
 arch/arm/common/Kconfig                            |    2 +
 arch/arm/common/Makefile                           |    5 +
 arch/arm/common/clkdev.c                           |  160 +++++++++++++
 arch/arm/configs/nhk8815_defconfig                 |  232 ++++++++++++++++++
 arch/arm/include/asm/clkdev.h                      |   30 +++
 arch/arm/mach-nomadik/8815.c                       |   76 ++++++
 arch/arm/mach-nomadik/Kconfig                      |   24 ++
 arch/arm/mach-nomadik/Makefile                     |    3 +
 arch/arm/mach-nomadik/clock.c                      |   52 ++++
 arch/arm/mach-nomadik/clock.h                      |   14 ++
 arch/arm/mach-nomadik/include/mach/board.h         |   28 +++
 arch/arm/mach-nomadik/include/mach/clkdev.h        |    7 +
 arch/arm/mach-nomadik/include/mach/fsmc.h          |   28 +++
 arch/arm/mach-nomadik/include/mach/hardware.h      |   91 +++++++
 arch/arm/mach-nomadik/include/mach/mtu.h           |   46 ++++
 arch/arm/mach-nomadik/include/mach/nand.h          |   16 ++
 arch/arm/mach-nomadik/include/mach/timex.h         |    6 +
 arch/arm/mach-nomadik/reset.c                      |   36 +++
 arch/arm/mach-nomadik/timer.c                      |   81 +++++++
 drivers/mtd/nand/Kconfig                           |    5 +
 drivers/mtd/nand/Makefile                          |    1 +
 drivers/mtd/nand/nomadik_nand.c                    |  248 ++++++++++++++++++++
 drivers/serial/Kconfig                             |    9 +
 drivers/serial/Makefile                            |    1 +
 drivers/serial/amba-pl011.c                        |  192 +++++++++++++++
 include/linux/amba/serial.h                        |  164 +++++++++++++
 include/linux/string.h                             |    3 +
 include/stdio.h                                    |    1 +
 lib/string.c                                       |   26 ++
 lib/vsprintf.c                                     |   25 ++
 41 files changed, 1902 insertions(+), 1 deletions(-)
 create mode 100644 arch/arm/boards/nhk8815/Makefile
 create mode 100644 arch/arm/boards/nhk8815/config.h
 create mode 100644 arch/arm/boards/nhk8815/env/bin/_update
 create mode 100644 arch/arm/boards/nhk8815/env/bin/boot
 create mode 100644 arch/arm/boards/nhk8815/env/bin/init
 create mode 100644 arch/arm/boards/nhk8815/env/bin/update_barebox_xmodem
 create mode 100644 arch/arm/boards/nhk8815/env/bin/update_kernel
 create mode 100644 arch/arm/boards/nhk8815/env/bin/update_root
 create mode 100644 arch/arm/boards/nhk8815/env/config
 create mode 100644 arch/arm/boards/nhk8815/setup.c
 create mode 100644 arch/arm/common/Kconfig
 create mode 100644 arch/arm/common/Makefile
 create mode 100644 arch/arm/common/clkdev.c
 create mode 100644 arch/arm/configs/nhk8815_defconfig
 create mode 100644 arch/arm/include/asm/clkdev.h
 create mode 100644 arch/arm/mach-nomadik/8815.c
 create mode 100644 arch/arm/mach-nomadik/Kconfig
 create mode 100644 arch/arm/mach-nomadik/Makefile
 create mode 100644 arch/arm/mach-nomadik/clock.c
 create mode 100644 arch/arm/mach-nomadik/clock.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/board.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/clkdev.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/fsmc.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/hardware.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/mtu.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/nand.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/timex.h
 create mode 100644 arch/arm/mach-nomadik/reset.c
 create mode 100644 arch/arm/mach-nomadik/timer.c
 create mode 100644 drivers/mtd/nand/nomadik_nand.c
 create mode 100644 drivers/serial/amba-pl011.c
 create mode 100644 include/linux/amba/serial.h

Best Regards,
J.


From plagnioj at jcrosoft.com  Tue Aug  3 21:43:56 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 03:43:56 +0200
Subject: [PATCH 3/6] amba: add pl011
In-Reply-To: <1280886239-19133-2-git-send-email-plagnioj@jcrosoft.com>
References: <20100804014227.GA16337@game.jcrosoft.org>
	<1280886239-19133-1-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-2-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1280886239-19133-3-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
Cc: Andrea GALLO <andrea.gallo at stericsson.com>
Cc: Gael SALLES <gael.salles at stericsson.com>
---
 arch/arm/Kconfig            |    3 +
 drivers/serial/Kconfig      |    9 ++
 drivers/serial/Makefile     |    1 +
 drivers/serial/amba-pl011.c |  192 +++++++++++++++++++++++++++++++++++++++++++
 include/linux/amba/serial.h |  164 ++++++++++++++++++++++++++++++++++++
 5 files changed, 369 insertions(+), 0 deletions(-)
 create mode 100644 drivers/serial/amba-pl011.c
 create mode 100644 include/linux/amba/serial.h

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index ed05a89..53b7783 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -18,6 +18,9 @@ config ARM
 	select HAVE_CONFIGURABLE_TEXT_BASE
 	default y
 
+config ARM_AMBA
+	bool
+
 menu "System Type"
 
 choice
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 8a5056b..c7ea2d9 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -4,6 +4,15 @@ config DRIVER_SERIAL_ARM_DCC
 	depends on ARM
 	bool "ARM Debug Communications Channel (DCC) serial driver"
 
+config SERIAL_AMBA_PL011
+	bool "ARM AMBA PL011 serial port support"
+	depends on ARM_AMBA
+	help
+	  This selects the ARM(R) AMBA(R) PrimeCell PL011 UART.  If you have
+	  an Integrator/PP2, Integrator/CP or Versatile platform, say Y here.
+
+	  If unsure, say N.
+
 config DRIVER_SERIAL_IMX
 	depends on ARCH_IMX
 	default y
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index 9f203bb..959290e 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -5,6 +5,7 @@
 # serial_pl010.o
 # serial_xuartlite.o
 obj-$(CONFIG_DRIVER_SERIAL_ARM_DCC)		+= arm_dcc.o
+obj-$(CONFIG_SERIAL_AMBA_PL011) += amba-pl011.o
 obj-$(CONFIG_DRIVER_SERIAL_IMX)			+= serial_imx.o
 obj-$(CONFIG_DRIVER_SERIAL_ATMEL)		+= atmel.o
 obj-$(CONFIG_DRIVER_SERIAL_NETX)		+= serial_netx.o
diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c
new file mode 100644
index 0000000..07508d0
--- /dev/null
+++ b/drivers/serial/amba-pl011.c
@@ -0,0 +1,192 @@
+/*
+ * (C) Copyright 2000
+ * Rob Taylor, Flying Pig Systems. robt at flyingpig.com.
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin at arm.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
+ */
+
+/* Simple U-Boot driver for the PrimeCell PL010/PL011 UARTs */
+
+#include <common.h>
+#include <driver.h>
+#include <init.h>
+#include <malloc.h>
+#include <asm/io.h>
+#include <linux/amba/serial.h>
+#include <linux/clk.h>
+
+/*
+ * We wrap our port structure around the generic console_device.
+ */
+struct amba_uart_port {
+	struct console_device	uart;		/* uart */
+	struct clk		*clk;		/* uart clock */
+	u32			uartclk;
+};
+
+static inline struct amba_uart_port *
+to_amba_uart_port(struct console_device *uart)
+{
+	return container_of(uart, struct amba_uart_port, uart);
+}
+
+static int pl011_setbaudrate(struct console_device *cdev, int baudrate)
+{
+	struct device_d *dev = cdev->dev;
+	struct amba_uart_port *uart = to_amba_uart_port(cdev);
+	unsigned int temp;
+	unsigned int divider;
+	unsigned int remainder;
+	unsigned int fraction;
+
+	/*
+	 ** Set baud rate
+	 **
+	 ** IBRD = UART_CLK / (16 * BAUD_RATE)
+	 ** FBRD = ROUND((64 * MOD(UART_CLK,(16 * BAUD_RATE))) / (16 * BAUD_RATE))
+	 */
+	temp = 16 * baudrate;
+	divider = uart->uartclk / temp;
+	remainder = uart->uartclk % temp;
+	temp = (8 * remainder) / baudrate;
+	fraction = (temp >> 1) + (temp & 1);
+
+	writel(divider, dev->map_base + UART011_IBRD);
+	writel(fraction, dev->map_base + UART011_FBRD);
+
+	return 0;
+}
+
+static void pl011_putc(struct console_device *cdev, char c)
+{
+	struct device_d *dev = cdev->dev;
+
+	/* Wait until there is space in the FIFO */
+	while (readl(dev->map_base + UART01x_FR) & UART01x_FR_TXFF);
+
+	/* Send the character */
+	writel(c, dev->map_base + UART01x_DR);
+}
+
+static int pl011_getc(struct console_device *cdev)
+{
+	struct device_d *dev = cdev->dev;
+	unsigned int data;
+
+	/* Wait until there is data in the FIFO */
+	while (readl(dev->map_base + UART01x_FR) & UART01x_FR_RXFE);
+
+	data = readl(dev->map_base + UART01x_DR);
+
+	/* Check for an error flag */
+	if (data & 0xffffff00) {
+		/* Clear the error */
+		writel(0xffffffff, dev->map_base + UART01x_ECR);
+		return -1;
+	}
+
+	return (int)data;
+}
+
+static int pl011_tstc(struct console_device *cdev)
+{
+	struct device_d *dev = cdev->dev;
+
+	return !(readl(dev->map_base + UART01x_FR) & UART01x_FR_RXFE);
+}
+
+int pl011_init_port (struct console_device *cdev)
+{
+	struct device_d *dev = cdev->dev;
+	struct amba_uart_port *uart = to_amba_uart_port(cdev);
+
+	/*
+	 ** First, disable everything.
+	 */
+	writel(0x0, dev->map_base + UART011_CR);
+
+	/*
+	 * Try to enable the clock producer.
+	 */
+	clk_enable(uart->clk);
+
+	uart->uartclk = clk_get_rate(uart->clk);
+
+	/*
+	 * set baud rate
+	 */
+	pl011_setbaudrate(cdev, 115200);
+	/*
+	 ** Set the UART to be 8 bits, 1 stop bit, no parity, fifo enabled.
+	 */
+	writel((UART01x_LCRH_WLEN_8 | UART01x_LCRH_FEN),
+	       dev->map_base + UART011_LCRH);
+
+	/*
+	 ** Finally, enable the UART
+	 */
+	writel((UART01x_CR_UARTEN | UART011_CR_TXE | UART011_CR_RXE),
+	       dev->map_base + UART011_CR);
+
+	return 0;
+}
+
+static int pl011_probe(struct device_d *dev)
+{
+	struct amba_uart_port *uart;
+	struct console_device *cdev;
+
+	uart = malloc(sizeof(struct amba_uart_port));
+
+	uart->clk = clk_get(dev, NULL);
+
+	cdev = &uart->uart;
+	dev->type_data = cdev;
+	cdev->dev = dev;
+	cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
+	cdev->tstc = pl011_tstc;
+	cdev->putc = pl011_putc;
+	cdev->getc = pl011_getc;
+	cdev->setbrg = pl011_setbaudrate;
+
+	pl011_init_port(cdev);
+
+	/* Enable UART */
+
+	console_register(cdev);
+
+	return 0;
+}
+
+static struct driver_d pl011_driver = {
+	.name = "uart-pl011",
+	.probe = pl011_probe,
+};
+
+static int pl011_init(void)
+{
+	register_driver(&pl011_driver);
+	return 0;
+}
+
+console_initcall(pl011_init);
diff --git a/include/linux/amba/serial.h b/include/linux/amba/serial.h
new file mode 100644
index 0000000..f4d7bf8
--- /dev/null
+++ b/include/linux/amba/serial.h
@@ -0,0 +1,164 @@
+/*
+ *  linux/include/linux/amba/serial.h
+ *
+ *  Internal header file for AMBA serial ports
+ *
+ *  Copyright (C) ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd.
+ *
+ * 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_ARM_HARDWARE_SERIAL_AMBA_H
+#define ASM_ARM_HARDWARE_SERIAL_AMBA_H
+
+/* -------------------------------------------------------------------------------
+ *  From AMBA UART (PL010) Block Specification
+ * -------------------------------------------------------------------------------
+ *  UART Register Offsets.
+ */
+#define UART01x_DR		0x00	/* Data read or written from the interface. */
+#define UART01x_RSR		0x04	/* Receive status register (Read). */
+#define UART01x_ECR		0x04	/* Error clear register (Write). */
+#define UART010_LCRH		0x08	/* Line control register, high byte. */
+#define UART010_LCRM		0x0C	/* Line control register, middle byte. */
+#define UART010_LCRL		0x10	/* Line control register, low byte. */
+#define UART010_CR		0x14	/* Control register. */
+#define UART01x_FR		0x18	/* Flag register (Read only). */
+#define UART010_IIR		0x1C	/* Interrupt indentification register (Read). */
+#define UART010_ICR		0x1C	/* Interrupt clear register (Write). */
+#define UART01x_ILPR		0x20	/* IrDA low power counter register. */
+#define UART011_IBRD		0x24	/* Integer baud rate divisor register. */
+#define UART011_FBRD		0x28	/* Fractional baud rate divisor register. */
+#define UART011_LCRH		0x2c	/* Line control register. */
+#define UART011_CR		0x30	/* Control register. */
+#define UART011_IFLS		0x34	/* Interrupt fifo level select. */
+#define UART011_IMSC		0x38	/* Interrupt mask. */
+#define UART011_RIS		0x3c	/* Raw interrupt status. */
+#define UART011_MIS		0x40	/* Masked interrupt status. */
+#define UART011_ICR		0x44	/* Interrupt clear register. */
+#define UART011_DMACR		0x48	/* DMA control register. */
+
+#define UART011_DR_OE		(1 << 11)
+#define UART011_DR_BE		(1 << 10)
+#define UART011_DR_PE		(1 << 9)
+#define UART011_DR_FE		(1 << 8)
+
+#define UART01x_RSR_OE		0x08
+#define UART01x_RSR_BE		0x04
+#define UART01x_RSR_PE		0x02
+#define UART01x_RSR_FE		0x01
+
+#define UART011_FR_RI		0x100
+#define UART011_FR_TXFE		0x080
+#define UART011_FR_RXFF		0x040
+#define UART01x_FR_TXFF		0x020
+#define UART01x_FR_RXFE		0x010
+#define UART01x_FR_BUSY		0x008
+#define UART01x_FR_DCD		0x004
+#define UART01x_FR_DSR		0x002
+#define UART01x_FR_CTS		0x001
+#define UART01x_FR_TMSK		(UART01x_FR_TXFF + UART01x_FR_BUSY)
+
+#define UART011_CR_CTSEN	0x8000	/* CTS hardware flow control */
+#define UART011_CR_RTSEN	0x4000	/* RTS hardware flow control */
+#define UART011_CR_OUT2		0x2000	/* OUT2 */
+#define UART011_CR_OUT1		0x1000	/* OUT1 */
+#define UART011_CR_RTS		0x0800	/* RTS */
+#define UART011_CR_DTR		0x0400	/* DTR */
+#define UART011_CR_RXE		0x0200	/* receive enable */
+#define UART011_CR_TXE		0x0100	/* transmit enable */
+#define UART011_CR_LBE		0x0080	/* loopback enable */
+#define UART010_CR_RTIE		0x0040
+#define UART010_CR_TIE		0x0020
+#define UART010_CR_RIE		0x0010
+#define UART010_CR_MSIE		0x0008
+#define UART01x_CR_IIRLP	0x0004	/* SIR low power mode */
+#define UART01x_CR_SIREN	0x0002	/* SIR enable */
+#define UART01x_CR_UARTEN	0x0001	/* UART enable */
+
+#define UART011_LCRH_SPS	0x80
+#define UART01x_LCRH_WLEN_8	0x60
+#define UART01x_LCRH_WLEN_7	0x40
+#define UART01x_LCRH_WLEN_6	0x20
+#define UART01x_LCRH_WLEN_5	0x00
+#define UART01x_LCRH_FEN	0x10
+#define UART01x_LCRH_STP2	0x08
+#define UART01x_LCRH_EPS	0x04
+#define UART01x_LCRH_PEN	0x02
+#define UART01x_LCRH_BRK	0x01
+
+#define UART010_IIR_RTIS	0x08
+#define UART010_IIR_TIS		0x04
+#define UART010_IIR_RIS		0x02
+#define UART010_IIR_MIS		0x01
+
+#define UART011_IFLS_RX1_8	(0 << 3)
+#define UART011_IFLS_RX2_8	(1 << 3)
+#define UART011_IFLS_RX4_8	(2 << 3)
+#define UART011_IFLS_RX6_8	(3 << 3)
+#define UART011_IFLS_RX7_8	(4 << 3)
+#define UART011_IFLS_TX1_8	(0 << 0)
+#define UART011_IFLS_TX2_8	(1 << 0)
+#define UART011_IFLS_TX4_8	(2 << 0)
+#define UART011_IFLS_TX6_8	(3 << 0)
+#define UART011_IFLS_TX7_8	(4 << 0)
+/* special values for ST vendor with deeper fifo */
+#define UART011_IFLS_RX_HALF	(5 << 3)
+#define UART011_IFLS_TX_HALF	(5 << 0)
+
+#define UART011_OEIM		(1 << 10)	/* overrun error interrupt mask */
+#define UART011_BEIM		(1 << 9)	/* break error interrupt mask */
+#define UART011_PEIM		(1 << 8)	/* parity error interrupt mask */
+#define UART011_FEIM		(1 << 7)	/* framing error interrupt mask */
+#define UART011_RTIM		(1 << 6)	/* receive timeout interrupt mask */
+#define UART011_TXIM		(1 << 5)	/* transmit interrupt mask */
+#define UART011_RXIM		(1 << 4)	/* receive interrupt mask */
+#define UART011_DSRMIM		(1 << 3)	/* DSR interrupt mask */
+#define UART011_DCDMIM		(1 << 2)	/* DCD interrupt mask */
+#define UART011_CTSMIM		(1 << 1)	/* CTS interrupt mask */
+#define UART011_RIMIM		(1 << 0)	/* RI interrupt mask */
+
+#define UART011_OEIS		(1 << 10)	/* overrun error interrupt status */
+#define UART011_BEIS		(1 << 9)	/* break error interrupt status */
+#define UART011_PEIS		(1 << 8)	/* parity error interrupt status */
+#define UART011_FEIS		(1 << 7)	/* framing error interrupt status */
+#define UART011_RTIS		(1 << 6)	/* receive timeout interrupt status */
+#define UART011_TXIS		(1 << 5)	/* transmit interrupt status */
+#define UART011_RXIS		(1 << 4)	/* receive interrupt status */
+#define UART011_DSRMIS		(1 << 3)	/* DSR interrupt status */
+#define UART011_DCDMIS		(1 << 2)	/* DCD interrupt status */
+#define UART011_CTSMIS		(1 << 1)	/* CTS interrupt status */
+#define UART011_RIMIS		(1 << 0)	/* RI interrupt status */
+
+#define UART011_OEIC		(1 << 10)	/* overrun error interrupt clear */
+#define UART011_BEIC		(1 << 9)	/* break error interrupt clear */
+#define UART011_PEIC		(1 << 8)	/* parity error interrupt clear */
+#define UART011_FEIC		(1 << 7)	/* framing error interrupt clear */
+#define UART011_RTIC		(1 << 6)	/* receive timeout interrupt clear */
+#define UART011_TXIC		(1 << 5)	/* transmit interrupt clear */
+#define UART011_RXIC		(1 << 4)	/* receive interrupt clear */
+#define UART011_DSRMIC		(1 << 3)	/* DSR interrupt clear */
+#define UART011_DCDMIC		(1 << 2)	/* DCD interrupt clear */
+#define UART011_CTSMIC		(1 << 1)	/* CTS interrupt clear */
+#define UART011_RIMIC		(1 << 0)	/* RI interrupt clear */
+
+#define UART011_DMAONERR	(1 << 2)	/* disable dma on error */
+#define UART011_TXDMAE		(1 << 1)	/* enable transmit dma */
+#define UART011_RXDMAE		(1 << 0)	/* enable receive dma */
+
+#define UART01x_RSR_ANY		(UART01x_RSR_OE|UART01x_RSR_BE|UART01x_RSR_PE|UART01x_RSR_FE)
+#define UART01x_FR_MODEM_ANY	(UART01x_FR_DCD|UART01x_FR_DSR|UART01x_FR_CTS)
+
+#endif
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug  3 21:43:55 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 03:43:55 +0200
Subject: [PATCH 2/6] arm: add common clkdev
In-Reply-To: <1280886239-19133-1-git-send-email-plagnioj@jcrosoft.com>
References: <20100804014227.GA16337@game.jcrosoft.org>
	<1280886239-19133-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1280886239-19133-2-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
Cc: Andrea GALLO <andrea.gallo at stericsson.com>
Cc: Gael SALLES <gael.salles at stericsson.com>
---
 arch/arm/Kconfig              |    1 +
 arch/arm/Makefile             |    2 +-
 arch/arm/common/Kconfig       |    2 +
 arch/arm/common/Makefile      |    5 ++
 arch/arm/common/clkdev.c      |  160 +++++++++++++++++++++++++++++++++++++++++
 arch/arm/include/asm/clkdev.h |   30 ++++++++
 lib/vsprintf.c                |   25 +++++++
 7 files changed, 224 insertions(+), 1 deletions(-)
 create mode 100644 arch/arm/common/Kconfig
 create mode 100644 arch/arm/common/Makefile
 create mode 100644 arch/arm/common/clkdev.c
 create mode 100644 arch/arm/include/asm/clkdev.h

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 92ec417..ed05a89 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -53,6 +53,7 @@ config ARCH_S3C24xx
 
 endchoice
 
+source arch/arm/common/Kconfig
 source arch/arm/cpu/Kconfig
 source arch/arm/mach-at91/Kconfig
 source arch/arm/mach-at91rm9200/Kconfig
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 8b4d64c..bd78259 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -130,7 +130,7 @@ MACH :=
 endif
 
 common-y += $(BOARD) $(MACH)
-common-y += arch/arm/lib/ arch/arm/cpu/
+common-y += arch/arm/lib/ arch/arm/cpu/ arch/arm/common/
 
 lds-$(CONFIG_GENERIC_LINKER_SCRIPT)	:= arch/arm/lib/barebox.lds
 lds-$(CONFIG_BOARD_LINKER_SCRIPT)	:= $(BOARD)/barebox.lds
diff --git a/arch/arm/common/Kconfig b/arch/arm/common/Kconfig
new file mode 100644
index 0000000..e749e45
--- /dev/null
+++ b/arch/arm/common/Kconfig
@@ -0,0 +1,2 @@
+config COMMON_CLKDEV
+	bool
diff --git a/arch/arm/common/Makefile b/arch/arm/common/Makefile
new file mode 100644
index 0000000..9cc8834
--- /dev/null
+++ b/arch/arm/common/Makefile
@@ -0,0 +1,5 @@
+#
+# Makefile for the linux kernel.
+#
+
+obj-$(CONFIG_COMMON_CLKDEV)	+= clkdev.o
diff --git a/arch/arm/common/clkdev.c b/arch/arm/common/clkdev.c
new file mode 100644
index 0000000..4d25356
--- /dev/null
+++ b/arch/arm/common/clkdev.c
@@ -0,0 +1,160 @@
+/*
+ *  arch/arm/common/clkdev.c
+ *
+ *  Copyright (C) 2008 Russell King.
+ *
+ * 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.
+ *
+ * Helper for the clk API to assist looking up a struct clk.
+ */
+
+#include <common.h>
+#include <linux/list.h>
+#include <errno.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <init.h>
+#include <malloc.h>
+#include <stdio.h>
+
+#include <asm/clkdev.h>
+#include <mach/clkdev.h>
+
+static LIST_HEAD(clocks);
+
+/*
+ * Find the correct struct clk for the device and connection ID.
+ * We do slightly fuzzy matching here:
+ *  An entry with a NULL ID is assumed to be a wildcard.
+ *  If an entry has a device ID, it must match
+ *  If an entry has a connection ID, it must match
+ * Then we take the most specific entry - with the following
+ * order of precidence: dev+con > dev only > con only.
+ */
+static struct clk *clk_find(const char *dev_id, const char *con_id)
+{
+	struct clk_lookup *p;
+	struct clk *clk = NULL;
+	int match, best = 0;
+
+	list_for_each_entry(p, &clocks, node) {
+		match = 0;
+		if (p->dev_id) {
+			if (!dev_id || strcmp(p->dev_id, dev_id))
+				continue;
+			match += 2;
+		}
+		if (p->con_id) {
+			if (!con_id || strcmp(p->con_id, con_id))
+				continue;
+			match += 1;
+		}
+		if (match == 0)
+			continue;
+
+		if (match > best) {
+			clk = p->clk;
+			best = match;
+		}
+	}
+	return clk;
+}
+
+struct clk *clk_get_sys(const char *dev_id, const char *con_id)
+{
+	struct clk *clk;
+
+	clk = clk_find(dev_id, con_id);
+	if (clk && !__clk_get(clk))
+		clk = NULL;
+
+	return clk ? clk : ERR_PTR(-ENOENT);
+}
+EXPORT_SYMBOL(clk_get_sys);
+
+struct clk *clk_get(struct device_d *dev, const char *con_id)
+{
+	const char *dev_id = dev ? dev_name(dev) : NULL;
+
+	return clk_get_sys(dev_id, con_id);
+}
+EXPORT_SYMBOL(clk_get);
+
+void clk_put(struct clk *clk)
+{
+	__clk_put(clk);
+}
+EXPORT_SYMBOL(clk_put);
+
+void clkdev_add(struct clk_lookup *cl)
+{
+	list_add_tail(&cl->node, &clocks);
+}
+EXPORT_SYMBOL(clkdev_add);
+
+#define MAX_DEV_ID	20
+#define MAX_CON_ID	16
+
+struct clk_lookup_alloc {
+	struct clk_lookup cl;
+	char	dev_id[MAX_DEV_ID];
+	char	con_id[MAX_CON_ID];
+};
+
+struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id,
+	const char *dev_fmt, ...)
+{
+	struct clk_lookup_alloc *cla;
+
+	cla = kzalloc(sizeof(*cla), GFP_KERNEL);
+	if (!cla)
+		return NULL;
+
+	cla->cl.clk = clk;
+	if (con_id) {
+		strlcpy(cla->con_id, con_id, sizeof(cla->con_id));
+		cla->cl.con_id = cla->con_id;
+	}
+
+	if (dev_fmt) {
+		va_list ap;
+
+		va_start(ap, dev_fmt);
+		vscnprintf(cla->dev_id, sizeof(cla->dev_id), dev_fmt, ap);
+		cla->cl.dev_id = cla->dev_id;
+		va_end(ap);
+	}
+
+	return &cla->cl;
+}
+EXPORT_SYMBOL(clkdev_alloc);
+
+int clk_add_alias(const char *alias, const char *alias_dev_name, char *id,
+	struct device_d *dev)
+{
+	struct clk *r = clk_get(dev, id);
+	struct clk_lookup *l;
+
+	if (IS_ERR(r))
+		return PTR_ERR(r);
+
+	l = clkdev_alloc(r, alias, alias_dev_name);
+	clk_put(r);
+	if (!l)
+		return -ENODEV;
+	clkdev_add(l);
+	return 0;
+}
+EXPORT_SYMBOL(clk_add_alias);
+
+/*
+ * clkdev_drop - remove a clock dynamically allocated
+ */
+void clkdev_drop(struct clk_lookup *cl)
+{
+	list_del(&cl->node);
+	kfree(cl);
+}
+EXPORT_SYMBOL(clkdev_drop);
diff --git a/arch/arm/include/asm/clkdev.h b/arch/arm/include/asm/clkdev.h
new file mode 100644
index 0000000..b6ec7c6
--- /dev/null
+++ b/arch/arm/include/asm/clkdev.h
@@ -0,0 +1,30 @@
+/*
+ *  arch/arm/include/asm/clkdev.h
+ *
+ *  Copyright (C) 2008 Russell King.
+ *
+ * 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.
+ *
+ * Helper for the clk API to assist looking up a struct clk.
+ */
+#ifndef __ASM_CLKDEV_H
+#define __ASM_CLKDEV_H
+
+struct clk;
+
+struct clk_lookup {
+	struct list_head	node;
+	const char		*dev_id;
+	const char		*con_id;
+	struct clk		*clk;
+};
+
+struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id,
+	const char *dev_fmt, ...);
+
+void clkdev_add(struct clk_lookup *cl);
+void clkdev_drop(struct clk_lookup *cl);
+
+#endif
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 91ad613..6066845 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -515,6 +515,31 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
 EXPORT_SYMBOL(vsnprintf);
 
 /**
+ * vscnprintf - Format a string and place it in a buffer
+ * @buf: The buffer to place the result into
+ * @size: The size of the buffer, including the trailing null space
+ * @fmt: The format string to use
+ * @args: Arguments for the format string
+ *
+ * The return value is the number of characters which have been written into
+ * the @buf not including the trailing '\0'. If @size is <= 0 the function
+ * returns 0.
+ *
+ * Call this function if you are already dealing with a va_list.
+ * You probably want scnprintf() instead.
+ *
+ * See the vsnprintf() documentation for format string extensions over C99.
+ */
+int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
+{
+	int i;
+
+	i=vsnprintf(buf,size,fmt,args);
+	return (i >= size) ? (size - 1) : i;
+}
+EXPORT_SYMBOL(vscnprintf);
+
+/**
  * vsprintf - Format a string and place it in a buffer
  * @buf: The buffer to place the result into
  * @fmt: The format string to use
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug  3 21:43:54 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 03:43:54 +0200
Subject: [PATCH 1/6] string: add strlcpy support
In-Reply-To: <20100804014227.GA16337@game.jcrosoft.org>
References: <20100804014227.GA16337@game.jcrosoft.org>
Message-ID: <1280886239-19133-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
Cc: Andrea GALLO <andrea.gallo at stericsson.com>
Cc: Gael SALLES <gael.salles at stericsson.com>
---
 include/linux/string.h |    3 +++
 include/stdio.h        |    1 +
 lib/string.c           |   26 ++++++++++++++++++++++++++
 3 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/include/linux/string.h b/include/linux/string.h
index 20b0829..62d743e 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -38,6 +38,9 @@ extern char * strcpy(char *,const char *);
 #ifndef __HAVE_ARCH_STRNCPY
 extern char * strncpy(char *,const char *, __kernel_size_t);
 #endif
+#ifndef __HAVE_ARCH_STRLCPY
+size_t strlcpy(char *, const char *, size_t);
+#endif
 #ifndef __HAVE_ARCH_STRCAT
 extern char * strcat(char *, const char *);
 #endif
diff --git a/include/stdio.h b/include/stdio.h
index d591b6a..8bc45fa 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -36,6 +36,7 @@ int	vsprintf(char *buf, const char *fmt, va_list args);
 char	*asprintf(const char *fmt, ...);
 char	*vasprintf(const char *fmt, va_list ap);
 int	vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
+int	vscnprintf(char *buf, size_t size, const char *fmt, va_list args);
 
 /* stderr */
 #define eputc(c)		console_putc(CONSOLE_STDERR, c)
diff --git a/lib/string.c b/lib/string.c
index cbb13d3..77435aa 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -62,6 +62,32 @@ char * strncpy(char * dest,const char *src,size_t count)
 #endif
 EXPORT_SYMBOL(strncpy);
 
+#ifndef __HAVE_ARCH_STRLCPY
+/**
+ * strlcpy - Copy a %NUL terminated string into a sized buffer
+ * @dest: Where to copy the string to
+ * @src: Where to copy the string from
+ * @size: size of destination buffer
+ *
+ * Compatible with *BSD: the result is always a valid
+ * NUL-terminated string that fits in the buffer (unless,
+ * of course, the buffer size is zero). It does not pad
+ * out the result like strncpy() does.
+ */
+size_t strlcpy(char *dest, const char *src, size_t size)
+{
+	size_t ret = strlen(src);
+
+	if (size) {
+		size_t len = (ret >= size) ? size - 1 : ret;
+		memcpy(dest, src, len);
+		dest[len] = '\0';
+	}
+	return ret;
+}
+EXPORT_SYMBOL(strlcpy);
+#endif
+
 #ifndef __HAVE_ARCH_STRCAT
 /**
  * strcat - Append one %NUL-terminated string to another
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug  3 21:43:58 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 03:43:58 +0200
Subject: [PATCH 5/6] nand: driver for Nomadik 8815 SoC
In-Reply-To: <1280886239-19133-4-git-send-email-plagnioj@jcrosoft.com>
References: <20100804014227.GA16337@game.jcrosoft.org>
	<1280886239-19133-1-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-2-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-3-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-4-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1280886239-19133-5-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
Cc: Andrea GALLO <andrea.gallo at stericsson.com>
Cc: Gael SALLES <gael.salles at stericsson.com>
---
 arch/arm/mach-nomadik/include/mach/nand.h |   16 ++
 drivers/mtd/nand/Kconfig                  |    5 +
 drivers/mtd/nand/Makefile                 |    1 +
 drivers/mtd/nand/nomadik_nand.c           |  248 +++++++++++++++++++++++++++++
 4 files changed, 270 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-nomadik/include/mach/nand.h
 create mode 100644 drivers/mtd/nand/nomadik_nand.c

diff --git a/arch/arm/mach-nomadik/include/mach/nand.h b/arch/arm/mach-nomadik/include/mach/nand.h
new file mode 100644
index 0000000..265fe53
--- /dev/null
+++ b/arch/arm/mach-nomadik/include/mach/nand.h
@@ -0,0 +1,16 @@
+#ifndef __ASM_ARCH_NAND_H
+#define __ASM_ARCH_NAND_H
+
+struct nomadik_nand_platform_data {
+	unsigned long data_va;
+	unsigned long cmd_va;
+	unsigned long addr_va;
+	int options;
+	int (*init) (void);
+};
+
+#define NAND_IO_DATA	0x40000000
+#define NAND_IO_CMD	0x40800000
+#define NAND_IO_ADDR	0x41000000
+
+#endif				/* __ASM_ARCH_NAND_H */
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
index ddc0c34..475499a 100644
--- a/drivers/mtd/nand/Kconfig
+++ b/drivers/mtd/nand/Kconfig
@@ -97,5 +97,10 @@ config MTD_NAND_DISKONCHIP_BBTWRITE
 	  load time (assuming you build diskonchip as a module) with the module
 	  parameter "inftl_bbt_write=1".
 
+config MTD_NAND_NOMADIK
+	tristate "ST Nomadik 8815 NAND support"
+	depends on ARCH_NOMADIK
+	help
+	  Driver for the NAND flash controller on the Nomadik, with ECC.
 
 endif
diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
index 73f7346..bac39e7 100644
--- a/drivers/mtd/nand/Makefile
+++ b/drivers/mtd/nand/Makefile
@@ -5,6 +5,7 @@ obj-$(CONFIG_MTD_NAND_IDS)		+= nand_ids.o
 obj-$(CONFIG_NAND)			+= nand_base.o nand_bbt.o
 
 obj-$(CONFIG_MTD_NAND_DISKONCHIP)	+= diskonchip.o
+obj-$(CONFIG_MTD_NAND_NOMADIK)		+= nomadik_nand.o
 obj-$(CONFIG_NAND_IMX)			+= nand_imx.o
 obj-$(CONFIG_NAND_OMAP_GPMC)		+= nand_omap_gpmc.o
 obj-$(CONFIG_NAND_ATMEL)		+= atmel_nand.o
diff --git a/drivers/mtd/nand/nomadik_nand.c b/drivers/mtd/nand/nomadik_nand.c
new file mode 100644
index 0000000..673fd88
--- /dev/null
+++ b/drivers/mtd/nand/nomadik_nand.c
@@ -0,0 +1,248 @@
+/*
+ *  drivers/mtd/nand/nomadik_nand.c
+ *
+ *  Overview:
+ *  	Driver for on-board NAND flash on Nomadik Platforms
+ *
+ * Copyright (C) 2007 STMicroelectronics Pvt. Ltd.
+ * Author: Sachin Verma <sachin.verma at st.com>
+ *
+ * Copyright (C) 2009 Alessandro Rubini
+ *
+ * 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.
+ *
+ */
+
+#include <common.h>
+#include <driver.h>
+#include <malloc.h>
+#include <init.h>
+
+#include <linux/types.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+
+#include <asm/io.h>
+#include <mach/nand.h>
+#include <mach/fsmc.h>
+
+#include <errno.h>
+
+struct nomadik_nand_host {
+	struct mtd_info		mtd;
+	struct nand_chip	nand;
+	void __iomem *cmd_va;
+	void __iomem *addr_va;
+	struct nand_bbt_descr *bbt_desc;
+};
+
+static inline int parity(int b) /* uses low 8 bits: returns 0 or all-1 */
+{
+	b = b ^ (b >> 4);
+	b = b ^ (b >> 2);
+	return (b ^ (b >> 1)) & 1
+		? ~0 : 0;
+}
+
+/*
+ * This is the ECC routine used in hardware, according to the manual.
+ * HW claims to make the calculation but not the correction. However,
+ * I haven't managed to get the desired data out of it; so do it in sw.
+ * There is problably some errata involved, but currently miss the info.
+ */
+static int nomadik_ecc512_calc(struct mtd_info *mtd, const u_char *data,
+			u_char *ecc)
+{
+	int gpar = 0;
+	int i, val, par;
+	int pbits = 0;		/* P8, P16, ... P2048 */
+	int pprime = 0;		/* P8', P16', ... P2048' */
+	int lowbits;		/* P1, P2, P4 and primes */
+
+	for (i = 0; i < 512; i++) {
+		par = parity((val = data[i]));
+		gpar ^= val;
+		pbits ^= (i & par);
+	}
+	/*
+	 * Ok, now gpar is global parity (xor of all bytes)
+	 * pbits are all the parity bits (non-prime ones)
+	 */
+	par = parity(gpar);
+	pprime = pbits ^ par;
+	/* Put low bits in the right position for ecc[2] (bits 7..2) */
+	lowbits = 0
+		| (parity(gpar & 0xf0) & 0x80)	/* P4  */
+		| (parity(gpar & 0x0f) & 0x40)	/* P4' */
+		| (parity(gpar & 0xcc) & 0x20)	/* P2  */
+		| (parity(gpar & 0x33) & 0x10)	/* P2' */
+		| (parity(gpar & 0xaa) & 0x08)	/* P1  */
+		| (parity(gpar & 0x55) & 0x04);	/* P1' */
+
+	ecc[2] = ~(lowbits | ((pbits & 0x100) >> 7) | ((pprime & 0x100) >> 8));
+	/* now intermix bits for ecc[1] (P1024..P128') and ecc[0] (P64..P8') */
+	ecc[1] = ~(    (pbits & 0x80) >> 0  | ((pprime & 0x80) >> 1)
+		    | ((pbits & 0x40) >> 1) | ((pprime & 0x40) >> 2)
+		    | ((pbits & 0x20) >> 2) | ((pprime & 0x20) >> 3)
+		    | ((pbits & 0x10) >> 3) | ((pprime & 0x10) >> 4));
+
+	ecc[0] = ~(    (pbits & 0x8) << 4  | ((pprime & 0x8) << 3)
+		    | ((pbits & 0x4) << 3) | ((pprime & 0x4) << 2)
+		    | ((pbits & 0x2) << 2) | ((pprime & 0x2) << 1)
+		    | ((pbits & 0x1) << 1) | ((pprime & 0x1) << 0));
+	return 0;
+}
+
+static int nomadik_ecc512_correct(struct mtd_info *mtd, uint8_t *dat,
+				uint8_t *r_ecc, uint8_t *c_ecc)
+{
+	struct nand_chip *chip = mtd->priv;
+	uint32_t r, c, d, diff; /*read, calculated, xor of them */
+
+	if (!memcmp(r_ecc, c_ecc, chip->ecc.bytes))
+		return 0;
+
+	/* Reorder the bytes into ascending-order 24 bits -- see manual */
+	r = r_ecc[2] << 22 | r_ecc[1] << 14 | r_ecc[0] << 6 | r_ecc[2] >> 2;
+	c = c_ecc[2] << 22 | c_ecc[1] << 14 | c_ecc[0] << 6 | c_ecc[2] >> 2;
+	diff = (r ^ c) & ((1 << 24) - 1); /* use 24 bits only */
+
+	/* If 12 bits are different, one per pair, it's correctable */
+	if (((diff | (diff>>1)) & 0x555555) == 0x555555) {
+		int bit = ((diff & 2) >> 1)
+			| ((diff & 0x8) >> 2) | ((diff & 0x20) >> 3);
+		int byte;
+
+		d = diff >> 6; /* remove bit-order info */
+		byte =  ((d & 2) >> 1)
+			| ((d & 0x8) >> 2) | ((d & 0x20) >> 3)
+			| ((d & 0x80) >> 4) | ((d & 0x200) >> 5)
+			| ((d & 0x800) >> 6) | ((d & 0x2000) >> 7)
+			| ((d & 0x8000) >> 8) | ((d & 0x20000) >> 9);
+		/* correct the single bit */
+		dat[byte] ^= 1 << bit;
+		return 0;
+	}
+	/* If 1 bit only differs, it's one bit error in ECC, ignore */
+	if ((diff ^ (1 << (ffs(diff) - 1))) == 0)
+		return 0;
+	/* Otherwise, uncorrectable */
+	return -1;
+}
+
+static struct nand_ecclayout nomadik_ecc_layout = {
+	.eccbytes = 3 * 4,
+	.eccpos = { /* each subpage has 16 bytes: pos 2,3,4 hosts ECC */
+		0x02, 0x03, 0x04,
+		0x12, 0x13, 0x14,
+		0x22, 0x23, 0x24,
+		0x32, 0x33, 0x34},
+	/* let's keep bytes 5,6,7 for us, just in case we change ECC algo */
+	.oobfree = { {0x08, 0x08}, {0x18, 0x08}, {0x28, 0x08}, {0x38, 0x08} },
+};
+
+static void nomadik_ecc_control(struct mtd_info *mtd, int mode)
+{
+	/* No need to enable hw ecc, it's on by default */
+}
+
+static void nomadik_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
+{
+	struct nand_chip *nand = mtd->priv;
+	struct nomadik_nand_host *host = nand->priv;
+
+	if (cmd == NAND_CMD_NONE)
+		return;
+
+	if (ctrl & NAND_CLE)
+		writeb(cmd, host->cmd_va);
+	else
+		writeb(cmd, host->addr_va);
+}
+
+static int nomadik_nand_probe(struct device_d *dev)
+{
+	struct nomadik_nand_platform_data *pdata = dev->platform_data;
+	struct nomadik_nand_host *host;
+	struct mtd_info *mtd;
+	struct nand_chip *nand;
+	int ret = 0;
+
+	/* Allocate memory for the device structure (and zero it) */
+	host = kzalloc(sizeof(struct nomadik_nand_host), GFP_KERNEL);
+	if (!host) {
+		dev_err(dev, "Failed to allocate device structure.\n");
+		return -ENOMEM;
+	}
+
+	/* Call the client's init function, if any */
+	if (pdata->init && (ret = pdata->init()) < 0) {
+		dev_err(dev, "Init function failed\n");
+		goto err;
+	}
+
+	host->cmd_va = (void __iomem*)pdata->cmd_va;
+	host->addr_va = (void __iomem*)pdata->addr_va;
+
+	/* Link all private pointers */
+	mtd = &host->mtd;
+	nand = &host->nand;
+	mtd->priv = nand;
+	nand->priv = host;
+
+	nand->IO_ADDR_R = (void __iomem*)pdata->data_va;
+	nand->IO_ADDR_W = (void __iomem*)pdata->data_va;
+	nand->cmd_ctrl = nomadik_cmd_ctrl;
+
+	nand->ecc.mode = NAND_ECC_HW;
+	nand->ecc.layout = &nomadik_ecc_layout;
+	nand->ecc.calculate = nomadik_ecc512_calc;
+	nand->ecc.correct = nomadik_ecc512_correct;
+	nand->ecc.hwctl = nomadik_ecc_control;
+	nand->ecc.size = 512;
+	nand->ecc.bytes = 3;
+
+	nand->options = pdata->options;
+
+	/*
+	 * Scan to find existance of the device
+	 */
+	if (nand_scan(&host->mtd, 1)) {
+		ret = -ENXIO;
+		goto err;
+	}
+
+	pr_info("Registering %s as whole device\n", mtd->name);
+	add_mtd_device(mtd);
+
+	return 0;
+
+err:
+	kfree(host);
+	return ret;
+}
+
+static struct driver_d nomadik_nand_driver = {
+	.probe = nomadik_nand_probe,
+	.name = "nomadik_nand",
+};
+
+static int __init nand_nomadik_init(void)
+{
+	pr_info("Nomadik NAND driver\n");
+	return register_driver(&nomadik_nand_driver);
+}
+
+device_initcall(nand_nomadik_init);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("ST Microelectronics (sachin.verma at st.com)");
+MODULE_DESCRIPTION("NAND driver for Nomadik Platform");
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug  3 21:43:57 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 03:43:57 +0200
Subject: [PATCH 4/6] arm: add Nomadik 8815 SoC support
In-Reply-To: <1280886239-19133-3-git-send-email-plagnioj@jcrosoft.com>
References: <20100804014227.GA16337@game.jcrosoft.org>
	<1280886239-19133-1-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-2-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-3-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1280886239-19133-4-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
Cc: Andrea GALLO <andrea.gallo at stericsson.com>
Cc: Gael SALLES <gael.salles at stericsson.com>
---
 arch/arm/Kconfig                              |    7 ++
 arch/arm/Makefile                             |    1 +
 arch/arm/mach-nomadik/8815.c                  |   76 +++++++++++++++++++++
 arch/arm/mach-nomadik/Kconfig                 |   11 +++
 arch/arm/mach-nomadik/Makefile                |    3 +
 arch/arm/mach-nomadik/clock.c                 |   52 ++++++++++++++
 arch/arm/mach-nomadik/clock.h                 |   14 ++++
 arch/arm/mach-nomadik/include/mach/board.h    |   28 ++++++++
 arch/arm/mach-nomadik/include/mach/clkdev.h   |    7 ++
 arch/arm/mach-nomadik/include/mach/fsmc.h     |   28 ++++++++
 arch/arm/mach-nomadik/include/mach/hardware.h |   91 +++++++++++++++++++++++++
 arch/arm/mach-nomadik/include/mach/mtu.h      |   46 +++++++++++++
 arch/arm/mach-nomadik/include/mach/timex.h    |    6 ++
 arch/arm/mach-nomadik/reset.c                 |   36 ++++++++++
 arch/arm/mach-nomadik/timer.c                 |   81 ++++++++++++++++++++++
 15 files changed, 487 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-nomadik/8815.c
 create mode 100644 arch/arm/mach-nomadik/Kconfig
 create mode 100644 arch/arm/mach-nomadik/Makefile
 create mode 100644 arch/arm/mach-nomadik/clock.c
 create mode 100644 arch/arm/mach-nomadik/clock.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/board.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/clkdev.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/fsmc.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/hardware.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/mtu.h
 create mode 100644 arch/arm/mach-nomadik/include/mach/timex.h
 create mode 100644 arch/arm/mach-nomadik/reset.c
 create mode 100644 arch/arm/mach-nomadik/timer.c

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 53b7783..82dbfda 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -47,6 +47,12 @@ config ARCH_NETX
 	bool "Hilscher NetX based"
 	select CPU_ARM926T
 
+config ARCH_NOMADIK
+	bool "STMicroelectronics Nomadik"
+	select CPU_ARM926T
+	help
+	 Support for the Nomadik platform by ST-Ericsson
+
 config ARCH_OMAP
 	bool "TI OMAP"
 
@@ -63,6 +69,7 @@ source arch/arm/mach-at91rm9200/Kconfig
 source arch/arm/mach-ep93xx/Kconfig
 source arch/arm/mach-imx/Kconfig
 source arch/arm/mach-netx/Kconfig
+source arch/arm/mach-nomadik/Kconfig
 source arch/arm/mach-omap/Kconfig
 source arch/arm/mach-s3c24xx/Kconfig
 
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index bd78259..4d6a76d 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -42,6 +42,7 @@ machine-$(CONFIG_ARCH_AT91)		:= at91
 machine-$(CONFIG_ARCH_AT91RM9200)	:= at91rm9200
 machine-$(CONFIG_ARCH_EP93XX)		:= ep93xx
 machine-$(CONFIG_ARCH_IMX)		:= imx
+machine-$(CONFIG_ARCH_NOMADIK)		:= nomadik
 machine-$(CONFIG_ARCH_NETX)		:= netx
 machine-$(CONFIG_ARCH_OMAP)		:= omap
 machine-$(CONFIG_ARCH_S3C24xx)		:= s3c24xx
diff --git a/arch/arm/mach-nomadik/8815.c b/arch/arm/mach-nomadik/8815.c
new file mode 100644
index 0000000..8598f14
--- /dev/null
+++ b/arch/arm/mach-nomadik/8815.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnio at jcrosoft.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; version 2 of
+ * the License.
+ *
+ * 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 <init.h>
+#include <asm/hardware.h>
+#include <mach/hardware.h>
+#include <asm/armlinux.h>
+#include <asm/mach-types.h>
+
+#include "clock.h"
+
+static struct clk st8815_clk_48 = {
+       .rate = 48 * 1000 * 1000,
+};
+
+static struct memory_platform_data ram_pdata = {
+	.name = "ram0",
+	.flags = DEVFS_RDWR,
+};
+
+static struct device_d sdram_dev = {
+	.name = "mem",
+	.map_base = 0x00000000,
+	.platform_data = &ram_pdata,
+};
+
+void st8815_add_device_sdram(u32 size)
+{
+	sdram_dev.size = size;
+	register_device(&sdram_dev);
+	armlinux_add_dram(&sdram_dev);
+}
+
+static struct device_d uart0_serial_device = {
+	.name = "uart-pl011",
+	.map_base = NOMADIK_UART0_BASE,
+	.size = 4096,
+};
+
+static struct device_d uart1_serial_device = {
+	.name = "uart-pl011",
+	.map_base = NOMADIK_UART1_BASE,
+	.size = 4096,
+};
+
+void st8815_register_uart(unsigned id)
+{
+	switch (id) {
+	case 0:
+		nmdk_clk_create(&st8815_clk_48, uart0_serial_device.name);
+		register_device(&uart0_serial_device);
+		break;
+	case 1:
+		nmdk_clk_create(&st8815_clk_48, uart1_serial_device.name);
+		register_device(&uart1_serial_device);
+		break;
+	}
+}
diff --git a/arch/arm/mach-nomadik/Kconfig b/arch/arm/mach-nomadik/Kconfig
new file mode 100644
index 0000000..4cf3f7b
--- /dev/null
+++ b/arch/arm/mach-nomadik/Kconfig
@@ -0,0 +1,11 @@
+if ARCH_NOMADIK
+
+choice
+	prompt "Nomadik boards"
+
+endchoice
+
+config NOMADIK_8815
+	bool
+
+endif
diff --git a/arch/arm/mach-nomadik/Makefile b/arch/arm/mach-nomadik/Makefile
new file mode 100644
index 0000000..1d77c4c
--- /dev/null
+++ b/arch/arm/mach-nomadik/Makefile
@@ -0,0 +1,3 @@
+
+obj-y	+= clock.o reset.o timer.o
+obj-y	+= 8815.o
diff --git a/arch/arm/mach-nomadik/clock.c b/arch/arm/mach-nomadik/clock.c
new file mode 100644
index 0000000..c74e0c1
--- /dev/null
+++ b/arch/arm/mach-nomadik/clock.c
@@ -0,0 +1,52 @@
+/*
+ * linux/arch/arm/mach-nomadik/clock.c
+ *
+ * Copyright (C) 2009 Alessandro Rubini
+ */
+#include <common.h>
+#include <errno.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <init.h>
+#include <asm/clkdev.h>
+
+#include "clock.h"
+
+/*
+ * The nomadik board uses generic clocks, but the serial pl011 file
+ * calls clk_enable(), clk_disable(), clk_get_rate(), so we provide them
+ */
+unsigned long clk_get_rate(struct clk *clk)
+{
+	return clk->rate;
+}
+EXPORT_SYMBOL(clk_get_rate);
+
+/* enable and disable do nothing */
+int clk_enable(struct clk *clk)
+{
+	return 0;
+}
+EXPORT_SYMBOL(clk_enable);
+
+void clk_disable(struct clk *clk)
+{
+}
+EXPORT_SYMBOL(clk_disable);
+
+int __clk_get(struct clk *clk)
+{
+	return 1;
+}
+
+/* Create a clock structure with the given name */
+int nmdk_clk_create(struct clk *clk, const char *dev_id)
+{
+	struct clk_lookup *clkdev;
+
+	clkdev = clkdev_alloc(clk, NULL, dev_id);
+	if (!clkdev)
+		return -ENOMEM;
+	clkdev_add(clkdev);
+	return 0;
+}
diff --git a/arch/arm/mach-nomadik/clock.h b/arch/arm/mach-nomadik/clock.h
new file mode 100644
index 0000000..eade4a6
--- /dev/null
+++ b/arch/arm/mach-nomadik/clock.h
@@ -0,0 +1,14 @@
+/*
+ * linux/arch/arm/mach-nomadik/clock.h
+ *
+ * Copyright (C) 2009 Alessandro Rubini
+ *
+ * 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.
+ */
+struct clk {
+	unsigned long	rate;
+};
+
+int nmdk_clk_create(struct clk *clk, const char *dev_id);
diff --git a/arch/arm/mach-nomadik/include/mach/board.h b/arch/arm/mach-nomadik/include/mach/board.h
new file mode 100644
index 0000000..b4979fe
--- /dev/null
+++ b/arch/arm/mach-nomadik/include/mach/board.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnio at jcrosoft.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; version 2 of
+ * the License.
+ *
+ * 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_ARCH_BOARD_H
+#define __ASM_ARCH_BOARD_H
+
+void st8815_add_device_sdram(u32 size);
+
+void st8815_register_uart(unsigned id);
+
+#endif
diff --git a/arch/arm/mach-nomadik/include/mach/clkdev.h b/arch/arm/mach-nomadik/include/mach/clkdev.h
new file mode 100644
index 0000000..04b37a8
--- /dev/null
+++ b/arch/arm/mach-nomadik/include/mach/clkdev.h
@@ -0,0 +1,7 @@
+#ifndef __ASM_MACH_CLKDEV_H
+#define __ASM_MACH_CLKDEV_H
+
+#define __clk_get(clk) ({ 1; })
+#define __clk_put(clk) do { } while (0)
+
+#endif
diff --git a/arch/arm/mach-nomadik/include/mach/fsmc.h b/arch/arm/mach-nomadik/include/mach/fsmc.h
new file mode 100644
index 0000000..e010c72
--- /dev/null
+++ b/arch/arm/mach-nomadik/include/mach/fsmc.h
@@ -0,0 +1,28 @@
+/* Definitions for the Nomadik FSMC "Flexible Static Memory controller" */
+
+#ifndef __ASM_ARCH_FSMC_H
+#define __ASM_ARCH_FSMC_H
+
+#include <mach/hardware.h>
+/*
+ * Register list
+ */
+
+/* bus control reg. and bus timing reg. for CS0..CS3 */
+#define FSMC_BCR(x)     (NOMADIK_FSMC_VA + (x << 3))
+#define FSMC_BTR(x)     (NOMADIK_FSMC_VA + (x << 3) + 0x04)
+
+/* PC-card and NAND:
+ * PCR = control register
+ * PMEM = memory timing
+ * PATT = attribute timing
+ * PIO = I/O timing
+ * PECCR = ECC result
+ */
+#define FSMC_PCR(x)     (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x00)
+#define FSMC_PMEM(x)    (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x08)
+#define FSMC_PATT(x)    (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x0c)
+#define FSMC_PIO(x)     (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x10)
+#define FSMC_PECCR(x)   (NOMADIK_FSMC_VA + ((2 + x) << 5) + 0x14)
+
+#endif /* __ASM_ARCH_FSMC_H */
diff --git a/arch/arm/mach-nomadik/include/mach/hardware.h b/arch/arm/mach-nomadik/include/mach/hardware.h
new file mode 100644
index 0000000..0f9bd95
--- /dev/null
+++ b/arch/arm/mach-nomadik/include/mach/hardware.h
@@ -0,0 +1,91 @@
+/*
+ * This file contains the hardware definitions of the Nomadik.
+ *
+ * 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_ARCH_HARDWARE_H
+#define __ASM_ARCH_HARDWARE_H
+
+/* Nomadik registers live from 0x1000.0000 to 0x1023.0000 -- currently */
+#define NOMADIK_IO_VIRTUAL	0xF0000000	/* VA of IO */
+#define NOMADIK_IO_PHYSICAL	0x10000000	/* PA of IO */
+#define NOMADIK_IO_SIZE		0x00300000	/* 3MB for all regs */
+
+#ifndef CONFIG_MMU
+#define io_p2v(x) (x)
+#define io_v2p(x) (x)
+#else
+#define io_p2v(x) ((x) - NOMADIK_IO_PHYSICAL + NOMADIK_IO_VIRTUAL)
+#define io_v2p(x) ((x) - NOMADIK_IO_VIRTUAL + NOMADIK_IO_PHYSICAL)
+#endif
+
+#define IO_ADDRESS(x) (io_p2v(x)) /* used in asm and more */
+
+/*
+ * Base address defination for Nomadik Onchip Logic Block
+ */
+#define NOMADIK_FSMC_BASE	0x10100000	/* FSMC registers */
+#define NOMADIK_SDRAMC_BASE	0x10110000	/* SDRAM Controller */
+#define NOMADIK_CLCDC_BASE	0x10120000	/* CLCD Controller */
+#define NOMADIK_MDIF_BASE	0x10120000	/* MDIF */
+#define NOMADIK_DMA0_BASE	0x10130000	/* DMA0 Controller */
+#define NOMADIK_IC_BASE		0x10140000	/* Vectored Irq Controller */
+#define NOMADIK_DMA1_BASE	0x10150000	/* DMA1 Controller */
+#define NOMADIK_USB_BASE	0x10170000	/* USB-OTG conf reg base */
+#define NOMADIK_CRYP_BASE	0x10180000	/* Crypto processor */
+#define NOMADIK_SHA1_BASE	0x10190000	/* SHA-1 Processor */
+#define NOMADIK_XTI_BASE	0x101A0000	/* XTI */
+#define NOMADIK_RNG_BASE	0x101B0000	/* Random number generator */
+#define NOMADIK_SRC_BASE	0x101E0000	/* SRC base */
+#define NOMADIK_WDOG_BASE	0x101E1000	/* Watchdog */
+#define NOMADIK_MTU0_BASE	0x101E2000	/* Multiple Timer 0 */
+#define NOMADIK_MTU1_BASE	0x101E3000	/* Multiple Timer 1 */
+#define NOMADIK_GPIO0_BASE	0x101E4000	/* GPIO0 */
+#define NOMADIK_GPIO1_BASE	0x101E5000	/* GPIO1 */
+#define NOMADIK_GPIO2_BASE	0x101E6000	/* GPIO2 */
+#define NOMADIK_GPIO3_BASE	0x101E7000	/* GPIO3 */
+#define NOMADIK_RTC_BASE	0x101E8000	/* Real Time Clock base */
+#define NOMADIK_PMU_BASE	0x101E9000	/* Power Management Unit */
+#define NOMADIK_OWM_BASE	0x101EA000	/* One wire master */
+#define NOMADIK_SCR_BASE	0x101EF000	/* Secure Control registers */
+#define NOMADIK_MSP2_BASE	0x101F0000	/* MSP 2 interface */
+#define NOMADIK_MSP1_BASE	0x101F1000	/* MSP 1 interface */
+#define NOMADIK_UART2_BASE	0x101F2000	/* UART 2 interface */
+#define NOMADIK_SSIRx_BASE	0x101F3000	/* SSI 8-ch rx interface */
+#define NOMADIK_SSITx_BASE	0x101F4000	/* SSI 8-ch tx interface */
+#define NOMADIK_MSHC_BASE	0x101F5000	/* Memory Stick(Pro) Host */
+#define NOMADIK_SDI_BASE	0x101F6000	/* SD-card/MM-Card */
+#define NOMADIK_I2C1_BASE	0x101F7000	/* I2C1 interface */
+#define NOMADIK_I2C0_BASE	0x101F8000	/* I2C0 interface */
+#define NOMADIK_MSP0_BASE	0x101F9000	/* MSP 0 interface */
+#define NOMADIK_FIRDA_BASE	0x101FA000	/* FIrDA interface */
+#define NOMADIK_UART1_BASE	0x101FB000	/* UART 1 interface */
+#define NOMADIK_SSP_BASE	0x101FC000	/* SSP interface */
+#define NOMADIK_UART0_BASE	0x101FD000	/* UART 0 interface */
+#define NOMADIK_SGA_BASE	0x101FE000	/* SGA interface */
+#define NOMADIK_L2CC_BASE	0x10210000	/* L2 Cache controller */
+
+/* Other ranges, not for p2v/v2p */
+#define NOMADIK_BACKUP_RAM	0x80010000
+#define NOMADIK_EBROM		0x80000000	/* Embedded boot ROM */
+#define NOMADIK_HAMACV_DMEM_BASE 0xA0100000	/* HAMACV Data Memory Start */
+#define NOMADIK_HAMACV_DMEM_END	0xA01FFFFF	/* HAMACV Data Memory End */
+#define NOMADIK_HAMACA_DMEM	0xA0200000	/* HAMACA Data Memory Space */
+
+#define NOMADIK_FSMC_VA		IO_ADDRESS(NOMADIK_FSMC_BASE)
+#define NOMADIK_MTU0_VA		IO_ADDRESS(NOMADIK_MTU0_BASE)
+#define NOMADIK_MTU1_VA		IO_ADDRESS(NOMADIK_MTU1_BASE)
+
+#endif /* __ASM_ARCH_HARDWARE_H */
diff --git a/arch/arm/mach-nomadik/include/mach/mtu.h b/arch/arm/mach-nomadik/include/mach/mtu.h
new file mode 100644
index 0000000..9095d86
--- /dev/null
+++ b/arch/arm/mach-nomadik/include/mach/mtu.h
@@ -0,0 +1,46 @@
+#ifndef __ASM_ARCH_MTU_H
+#define __ASM_ARCH_MTU_H
+
+/*
+ * The MTU device hosts four different counters, with 4 set of
+ * registers. These are register names.
+ */
+
+#define MTU_IMSC	0x00	/* Interrupt mask set/clear */
+#define MTU_RIS		0x04	/* Raw interrupt status */
+#define MTU_MIS		0x08	/* Masked interrupt status */
+#define MTU_ICR		0x0C	/* Interrupt clear register */
+
+/* per-timer registers take 0..3 as argument */
+#define MTU_LR(x)	(0x10 + 0x10 * (x) + 0x00)	/* Load value */
+#define MTU_VAL(x)	(0x10 + 0x10 * (x) + 0x04)	/* Current value */
+
+#define MTU_CR(x)	(0x10 + 0x10 * (x) + 0x08)	/* Control reg */
+#define MTU_BGLR(x)	(0x10 + 0x10 * (x) + 0x0c)	/* At next overflow */
+
+
+/* bits for the control register */
+#define MTU_CRn_ENA		0x80
+#define MTU_CRn_PERIODIC	0x40	/* if 0 = free-running */
+#define MTU_CRn_PRESCALE_MASK	0x0c
+#define MTU_CRn_PRESCALE_1	0x00
+#define MTU_CRn_PRESCALE_16	0x04
+#define MTU_CRn_PRESCALE_256	0x08
+#define MTU_CRn_32BITS		0x02
+#define MTU_CRn_ONESHOT		0x01	/* if 0 = wraps reloading from BGLR*/
+
+/* Other registers are usual amba/primecell registers, currently not used */
+#define MTU_ITCR	0xff0
+#define MTU_ITOP	0xff4
+
+#define MTU_PERIPH_ID0	0xfe0
+#define MTU_PERIPH_ID1	0xfe4
+#define MTU_PERIPH_ID2	0xfe8
+#define MTU_PERIPH_ID3	0xfeC
+
+#define MTU_PCELL0	0xff0
+#define MTU_PCELL1	0xff4
+#define MTU_PCELL2	0xff8
+#define MTU_PCELL3	0xffC
+
+#endif /* __ASM_ARCH_MTU_H */
diff --git a/arch/arm/mach-nomadik/include/mach/timex.h b/arch/arm/mach-nomadik/include/mach/timex.h
new file mode 100644
index 0000000..b2b41fa
--- /dev/null
+++ b/arch/arm/mach-nomadik/include/mach/timex.h
@@ -0,0 +1,6 @@
+#ifndef __ASM_ARCH_TIMEX_H
+#define __ASM_ARCH_TIMEX_H
+
+#define CLOCK_TICK_RATE	2400000
+
+#endif
diff --git a/arch/arm/mach-nomadik/reset.c b/arch/arm/mach-nomadik/reset.c
new file mode 100644
index 0000000..d55f278
--- /dev/null
+++ b/arch/arm/mach-nomadik/reset.c
@@ -0,0 +1,36 @@
+/*
+ *  mach-nomadik/include/mach/system.h
+ *
+ *  Copyright (C) 2008 STMicroelectronics
+ *
+ * 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
+ *
+ * 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/io.h>
+#include <mach/hardware.h>
+
+void __noreturn reset_cpu(unsigned long addr)
+{
+	void __iomem *src_rstsr = (void *)(NOMADIK_SRC_BASE + 0x18);
+
+	/* FIXME: use egpio when implemented */
+
+	/* Write anything to Reset status register */
+	writel(1, src_rstsr);
+
+	/* Not reached */
+	while (1);
+}
+EXPORT_SYMBOL(reset_cpu);
diff --git a/arch/arm/mach-nomadik/timer.c b/arch/arm/mach-nomadik/timer.c
new file mode 100644
index 0000000..12e56f0
--- /dev/null
+++ b/arch/arm/mach-nomadik/timer.c
@@ -0,0 +1,81 @@
+/*
+ * linux/arch/arm/mach-nomadik/timer.c
+ *
+ * Copyright (C) 2008 STMicroelectronics
+ * Copyright (C) 2009 Alessandro Rubini, somewhat based on at91sam926x
+ *
+ * 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 <common.h>
+#include <init.h>
+#include <clock.h>
+#include <asm/io.h>
+#include <mach/hardware.h>
+#include <mach/mtu.h>
+#include <mach/timex.h>
+
+/* Initial value for SRC control register: all timers use MXTAL/8 source */
+#define SRC_CR_INIT_MASK	0x00007fff
+#define SRC_CR_INIT_VAL		0x2aaa8000
+
+static u32	nmdk_cycle;		/* write-once */
+static __iomem void *mtu_base;
+
+/*
+ * clocksource: the MTU device is a decrementing counters, so we negate
+ * the value being read.
+ */
+static uint64_t nmdk_read_timer(void)
+{
+	return nmdk_cycle - readl(mtu_base + MTU_VAL(0));
+}
+
+static struct clocksource nmdk_clksrc = {
+	.read	= nmdk_read_timer,
+	.shift	= 20,
+	.mask	= 0xffffffff,
+};
+
+static void nmdk_timer_reset(void)
+{
+	u32 cr;
+
+	writel(0, mtu_base + MTU_CR(0)); /* off */
+
+	/* configure load and background-load, and fire it up */
+	writel(nmdk_cycle, mtu_base + MTU_LR(0));
+	writel(nmdk_cycle, mtu_base + MTU_BGLR(0));
+	cr = MTU_CRn_PRESCALE_1 | MTU_CRn_32BITS;
+	writel(cr, mtu_base + MTU_CR(0));
+	writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(0));
+}
+
+static int nmdk_timer_init(void)
+{
+	u32 src_cr;
+	unsigned long rate;
+
+	rate = CLOCK_TICK_RATE; /* 2.4MHz */
+	nmdk_cycle = (rate + 1000 / 2) / 1000;
+
+	/* Configure timer sources in "system reset controller" ctrl reg */
+	src_cr = readl(NOMADIK_SRC_BASE);
+	src_cr &= SRC_CR_INIT_MASK;
+	src_cr |= SRC_CR_INIT_VAL;
+	writel(src_cr, NOMADIK_SRC_BASE);
+
+	/* Save global pointer to mtu, used by functions above */
+	mtu_base = (void *)NOMADIK_MTU0_BASE;
+
+	/* Init the timer and register clocksource */
+	nmdk_timer_reset();
+
+	nmdk_clksrc.mult = clocksource_hz2mult(rate, nmdk_clksrc.shift);
+
+	init_clock(&nmdk_clksrc);
+
+	return 0;
+}
+core_initcall(nmdk_timer_init);
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug  3 21:43:59 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 03:43:59 +0200
Subject: [PATCH 6/6] arm: add nhk8815 board support
In-Reply-To: <1280886239-19133-5-git-send-email-plagnioj@jcrosoft.com>
References: <20100804014227.GA16337@game.jcrosoft.org>
	<1280886239-19133-1-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-2-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-3-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-4-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-5-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1280886239-19133-6-git-send-email-plagnioj@jcrosoft.com>

with the following support

uart 0 & 1
network
nand

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
Cc: Andrea GALLO <andrea.gallo at stericsson.com>
Cc: Gael SALLES <gael.salles at stericsson.com>
---
 arch/arm/Makefile                                  |    1 +
 arch/arm/boards/nhk8815/Makefile                   |    1 +
 arch/arm/boards/nhk8815/env/bin/_update            |   36 +++
 arch/arm/boards/nhk8815/env/bin/boot               |   38 ++++
 arch/arm/boards/nhk8815/env/bin/init               |   28 +++
 .../boards/nhk8815/env/bin/update_barebox_xmodem   |   19 ++
 arch/arm/boards/nhk8815/env/bin/update_kernel      |    8 +
 arch/arm/boards/nhk8815/env/bin/update_root        |    8 +
 arch/arm/boards/nhk8815/env/config                 |   32 +++
 arch/arm/boards/nhk8815/setup.c                    |  106 +++++++++
 arch/arm/configs/nhk8815_defconfig                 |  232 ++++++++++++++++++++
 arch/arm/mach-nomadik/Kconfig                      |   13 +
 12 files changed, 522 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/boards/nhk8815/Makefile
 create mode 100644 arch/arm/boards/nhk8815/config.h
 create mode 100644 arch/arm/boards/nhk8815/env/bin/_update
 create mode 100644 arch/arm/boards/nhk8815/env/bin/boot
 create mode 100644 arch/arm/boards/nhk8815/env/bin/init
 create mode 100644 arch/arm/boards/nhk8815/env/bin/update_barebox_xmodem
 create mode 100644 arch/arm/boards/nhk8815/env/bin/update_kernel
 create mode 100644 arch/arm/boards/nhk8815/env/bin/update_root
 create mode 100644 arch/arm/boards/nhk8815/env/config
 create mode 100644 arch/arm/boards/nhk8815/setup.c
 create mode 100644 arch/arm/configs/nhk8815_defconfig

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 4d6a76d..4827fe9 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -70,6 +70,7 @@ board-$(CONFIG_MACH_IMX21ADS)			:= imx21ads
 board-$(CONFIG_MACH_IMX27ADS)			:= imx27ads
 board-$(CONFIG_MACH_MMCCPU)			:= mmccpu
 board-$(CONFIG_MACH_MX1ADS)			:= mx1ads
+board-$(CONFIG_MACH_NOMADIK_8815NHK)		:= nhk8815
 board-$(CONFIG_MACH_NXDB500)			:= netx
 board-$(CONFIG_ARCH_OMAP)			:= omap
 board-$(CONFIG_MACH_PCA100)			:= phycard-i.MX27
diff --git a/arch/arm/boards/nhk8815/Makefile b/arch/arm/boards/nhk8815/Makefile
new file mode 100644
index 0000000..2b9dba4
--- /dev/null
+++ b/arch/arm/boards/nhk8815/Makefile
@@ -0,0 +1 @@
+obj-y += setup.o
diff --git a/arch/arm/boards/nhk8815/config.h b/arch/arm/boards/nhk8815/config.h
new file mode 100644
index 0000000..e69de29
diff --git a/arch/arm/boards/nhk8815/env/bin/_update b/arch/arm/boards/nhk8815/env/bin/_update
new file mode 100644
index 0000000..fb7cbe8
--- /dev/null
+++ b/arch/arm/boards/nhk8815/env/bin/_update
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+if [ -z "$part" -o -z "$image" ]; then
+	echo "define \$part and \$image"
+	exit 1
+fi
+
+if [ \! -e "$part" ]; then
+	echo "Partition $part does not exist"
+	exit 1
+fi
+
+if [ $# = 1 ]; then
+	image=$1
+fi
+
+if [ x$ip = xdhcp ]; then
+	dhcp
+fi
+
+ping $eth0.serverip
+if [ $? -ne 0 ] ; then
+	echo "update aborted"
+	exit 1
+fi
+
+unprotect $part
+
+echo
+echo "erasing partition $part"
+erase $part
+
+echo
+echo "flashing $image to $part"
+echo
+tftp $image $part
diff --git a/arch/arm/boards/nhk8815/env/bin/boot b/arch/arm/boards/nhk8815/env/bin/boot
new file mode 100644
index 0000000..fd8d957
--- /dev/null
+++ b/arch/arm/boards/nhk8815/env/bin/boot
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+. /env/config
+
+if [ x$1 = xflash ]; then
+	root=flash
+	kernel=flash
+fi
+
+if [ x$1 = xnet ]; then
+	root=net
+	kernel=net
+fi
+
+if [ x$ip = xdhcp ]; then
+	bootargs="$bootargs ip=dhcp"
+else
+	bootargs="$bootargs ip=$eth0.ipaddr:$eth0.serverip:$eth0.gateway:$eth0.netmask:::"
+fi
+
+if [ x$root = xflash ]; then
+	bootargs="$bootargs root=$rootpart rootfstype=jffs2"
+else
+	bootargs="$bootargs root=/dev/nfs nfsroot=192.168.23.111:$nfsroot"
+fi
+
+bootargs="$bootargs"
+
+if [ $kernel = net ]; then
+	if [ x$ip = xdhcp ]; then
+		dhcp
+	fi
+	tftp $uimage uImage
+	bootm uImage
+else
+	bootm /dev/nor0.kernel
+fi
+
diff --git a/arch/arm/boards/nhk8815/env/bin/init b/arch/arm/boards/nhk8815/env/bin/init
new file mode 100644
index 0000000..5b45a70
--- /dev/null
+++ b/arch/arm/boards/nhk8815/env/bin/init
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+PATH=/env/bin
+export PATH
+
+. /env/config
+
+if [ -e /dev/nand0 ]; then
+	addpart /dev/nand0 $nand_parts
+
+	# Uh, oh, hush first expands wildcards and then starts executing
+	# commands. What a bug!
+	source /env/bin/hush_hack
+fi
+
+echo
+echo -n "Hit any key to stop autoboot: "
+timeout -a $autoboot_timeout
+if [ $? != 0 ]; then
+	echo
+	echo "type update_kernel [<imagename>] to update kernel into flash"
+	echo "type udate_root [<imagename>] to update rootfs into flash"
+	echo "type update_barebox_xmodem nor to update barebox into flash"
+	echo
+	exit
+fi
+
+boot
diff --git a/arch/arm/boards/nhk8815/env/bin/update_barebox_xmodem b/arch/arm/boards/nhk8815/env/bin/update_barebox_xmodem
new file mode 100644
index 0000000..40f4ad3
--- /dev/null
+++ b/arch/arm/boards/nhk8815/env/bin/update_barebox_xmodem
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+. /env/config
+
+part=/dev/nand0.barebox
+
+loadb -f barebox.bin -c
+
+unprotect $part
+echo
+echo "erasing partition $part"
+erase $part
+
+echo
+echo "flashing barebox.bin to $part"
+echo
+cp barebox.bin $part
+crc32 -f barebox.bin
+crc32 -f $part
diff --git a/arch/arm/boards/nhk8815/env/bin/update_kernel b/arch/arm/boards/nhk8815/env/bin/update_kernel
new file mode 100644
index 0000000..db0f4c2
--- /dev/null
+++ b/arch/arm/boards/nhk8815/env/bin/update_kernel
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+. /env/config
+
+image=$uimage
+part=/dev/nand0.kernel
+
+. /env/bin/_update $1
diff --git a/arch/arm/boards/nhk8815/env/bin/update_root b/arch/arm/boards/nhk8815/env/bin/update_root
new file mode 100644
index 0000000..9530e84
--- /dev/null
+++ b/arch/arm/boards/nhk8815/env/bin/update_root
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+. /env/config
+
+image=$jffs2
+part=/dev/nand0.rootfs
+
+. /env/bin/_update $1
diff --git a/arch/arm/boards/nhk8815/env/config b/arch/arm/boards/nhk8815/env/config
new file mode 100644
index 0000000..2b50b25
--- /dev/null
+++ b/arch/arm/boards/nhk8815/env/config
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+# can be either 'net' or 'flash'
+kernel=net
+root=net
+
+# use 'dhcp' todo dhcp in uboot and in kernel
+ip=dhcp
+
+#
+# setup default ethernet address
+#
+#eth0.serverip=192.168.23.108
+
+# Partition			Size	Start
+# XloaderTOC + X-Loader		256KB	0x00000000
+# Memory init function		256KB	0x00040000
+# Barebox + env			2MB	0x00080000
+# Kernel Image			3MB	0x00280000
+# JFFS2 Root filesystem		22MB	0x00580000
+# JFFS2 User Data		100MB	0x01b80000
+
+nand_parts="256k(xloader)ro,256k(meminit),2M(uboot),3M(kernel),22M(rootfs),100M(userfs),384k(free),128k(ubootenv)"
+
+uimage=uImage-nhk15
+
+# use 'dhcp' to do dhcp in uboot and in kernel
+ip=dhcp
+
+autoboot_timeout=3
+
+bootargs="root=/dev/ram0 console=ttyAMA1,115200n8 init=linuxrc"
diff --git a/arch/arm/boards/nhk8815/setup.c b/arch/arm/boards/nhk8815/setup.c
new file mode 100644
index 0000000..e9295f6
--- /dev/null
+++ b/arch/arm/boards/nhk8815/setup.c
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnio at jcrosoft.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 <init.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <partition.h>
+#include <nand.h>
+#include <asm/armlinux.h>
+#include <asm/mach-types.h>
+#include <asm/io.h>
+
+#include <mach/hardware.h>
+#include <mach/board.h>
+#include <mach/nand.h>
+#include <mach/fsmc.h>
+
+static struct device_d nhk8815_network_dev = {
+	.name = "smc91c111",
+	.map_base = 0x34000300,
+	.size = 16,
+};
+
+static int nhk8815_nand_init(void)
+{
+	/* FSMC setup for nand chip select (8-bit nand in 8815NHK) */
+	writel(0x0000000E, FSMC_PCR(0));
+	writel(0x000D0A00, FSMC_PMEM(0));
+	writel(0x00100A00, FSMC_PATT(0));
+
+	/* enable access to the chip select area */
+	writel(readl(FSMC_PCR(0)) | 0x04, FSMC_PCR(0));
+
+	return 0;
+}
+
+static struct nomadik_nand_platform_data nhk8815_nand_data = {
+	.addr_va	= NAND_IO_ADDR,
+	.cmd_va		= NAND_IO_CMD,
+	.data_va	= NAND_IO_DATA,
+	.options	= NAND_COPYBACK | NAND_CACHEPRG | NAND_NO_PADDING \
+			| NAND_NO_READRDY | NAND_NO_AUTOINCR,
+	.init		= nhk8815_nand_init,
+};
+
+static struct device_d nhk8815_nand_device = {
+	.name		= "nomadik_nand",
+	.platform_data	= &nhk8815_nand_data,
+};
+
+static int nhk8815_devices_init(void)
+{
+	st8815_add_device_sdram(64 * 1024 *1024);
+
+	writel(0xC37800F0, NOMADIK_GPIO1_BASE + 0x20);
+	writel(0x00000000, NOMADIK_GPIO1_BASE + 0x24);
+	writel(0x00000000, NOMADIK_GPIO1_BASE + 0x28);
+	writel(readl(NOMADIK_SRC_BASE) | 0x8000, NOMADIK_SRC_BASE);
+
+	/* Set up SMCS1 for Ethernet: sram-like, enabled, timing values */
+	writel(0x0000305b, FSMC_BCR(1));
+	writel(0x00033f33, FSMC_BTR(1));
+
+	register_device(&nhk8815_network_dev);
+
+	register_device(&nhk8815_nand_device);
+
+	armlinux_set_architecture(MACH_TYPE_NOMADIK);
+	armlinux_set_bootparams((void *)(0x00000100));
+
+	devfs_add_partition("nand0", 0x0000000, 0x040000, PARTITION_FIXED, "xloader_raw");
+	devfs_add_partition("nand0", 0x0040000, 0x080000, PARTITION_FIXED, "meminit_raw");
+	devfs_add_partition("nand0", 0x0080000, 0x200000, PARTITION_FIXED, "self_raw");
+	dev_add_bb_dev("self_raw", "self0");
+	devfs_add_partition("nand0", 0x7FE0000, 0x020000, PARTITION_FIXED, "env_raw");
+	dev_add_bb_dev("env_raw", "env0");
+
+	return 0;
+}
+device_initcall(nhk8815_devices_init);
+
+static int nhk8815_console_init(void)
+{
+	st8815_register_uart(1);
+	return 0;
+}
+
+console_initcall(nhk8815_console_init);
diff --git a/arch/arm/configs/nhk8815_defconfig b/arch/arm/configs/nhk8815_defconfig
new file mode 100644
index 0000000..3c9126f
--- /dev/null
+++ b/arch/arm/configs/nhk8815_defconfig
@@ -0,0 +1,232 @@
+#
+# Automatically generated make config: don't edit
+# U-Boot version: 2.0.0-rc10
+# Mon Oct 12 18:36:24 2009
+#
+# CONFIG_BOARD_LINKER_SCRIPT is not set
+CONFIG_GENERIC_LINKER_SCRIPT=y
+CONFIG_ARM=y
+CONFIG_ARM_AMBA=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_AT91RM9200 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_NETX is not set
+CONFIG_ARCH_NOMADIK=y
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_S3C24xx is not set
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+
+#
+# processor features
+#
+CONFIG_ARCH_TEXT_BASE=0x03c00000
+CONFIG_BOARDINFO="NHK8815"
+CONFIG_MACH_NOMADIK_8815NHK=y
+CONFIG_NOMADIK_8815=y
+# CONFIG_AEABI is not set
+
+#
+# Arm specific settings         
+#
+CONFIG_CMD_ARM_CPUINFO=y
+CONFIG_CMDLINE_TAG=y
+CONFIG_SETUP_MEMORY_TAGS=y
+# CONFIG_INITRD_TAG is not set
+CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
+CONFIG_GREGORIAN_CALENDER=y
+CONFIG_HAS_KALLSYMS=y
+CONFIG_HAS_MODULES=y
+CONFIG_CMD_MEMORY=y
+CONFIG_ENV_HANDLING=y
+
+#
+# General Settings              
+#
+CONFIG_LOCALVERSION_AUTO=y
+
+#
+# memory layout                 
+#
+CONFIG_HAVE_CONFIGURABLE_TEXT_BASE=y
+CONFIG_TEXT_BASE=0x03F80000
+CONFIG_HAVE_CONFIGURABLE_MEMORY_LAYOUT=y
+CONFIG_MEMORY_LAYOUT_DEFAULT=y
+# CONFIG_MEMORY_LAYOUT_FIXED is not set
+CONFIG_STACK_SIZE=0x8000
+CONFIG_MALLOC_SIZE=0x400000
+# CONFIG_BROKEN is not set
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_PROMPT="Nomadik:"
+CONFIG_BAUDRATE=115200
+CONFIG_LONGHELP=y
+CONFIG_CBSIZE=1024
+CONFIG_MAXARGS=16
+CONFIG_SHELL_HUSH=y
+# CONFIG_SHELL_SIMPLE is not set
+CONFIG_GLOB=y
+CONFIG_PROMPT_HUSH_PS2="> "
+# CONFIG_HUSH_FANCY_PROMPT is not set
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+CONFIG_DYNAMIC_CRC_TABLE=y
+CONFIG_ERRNO_MESSAGES=y
+CONFIG_TIMESTAMP=y
+CONFIG_CONSOLE_FULL=y
+CONFIG_CONSOLE_ACTIVATE_FIRST=y
+# CONFIG_OF_FLAT_TREE is not set
+CONFIG_PARTITION=y
+CONFIG_DEFAULT_ENVIRONMENT=y
+CONFIG_DEFAULT_ENVIRONMENT_PATH="board/nhk8815/env"
+
+#
+# Debugging                     
+#
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_ENABLE_FLASH_NOISE is not set
+# CONFIG_ENABLE_PARTITION_NOISE is not set
+# CONFIG_ENABLE_DEVICE_NOISE is not set
+
+#
+# Commands                      
+#
+
+#
+# scripting                     
+#
+CONFIG_CMD_EDIT=y
+CONFIG_CMD_SLEEP=y
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_LOADENV=y
+CONFIG_CMD_EXPORT=y
+CONFIG_CMD_PRINTENV=y
+CONFIG_CMD_READLINE=y
+CONFIG_CMD_TRUE=y
+CONFIG_CMD_FALSE=y
+
+#
+# file commands                 
+#
+CONFIG_CMD_LS=y
+CONFIG_CMD_RM=y
+CONFIG_CMD_CAT=y
+CONFIG_CMD_MKDIR=y
+CONFIG_CMD_RMDIR=y
+CONFIG_CMD_CP=y
+CONFIG_CMD_PWD=y
+CONFIG_CMD_CD=y
+CONFIG_CMD_MOUNT=y
+CONFIG_CMD_UMOUNT=y
+
+#
+# console                       
+#
+CONFIG_CMD_CLEAR=y
+CONFIG_CMD_ECHO=y
+# CONFIG_CMD_ECHO_E is not set
+
+#
+# memory                        
+#
+# CONFIG_CMD_LOADB is not set
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_CRC=y
+CONFIG_CMD_MTEST=y
+# CONFIG_CMD_MTEST_ALTERNATIVE is not set
+
+#
+# flash                         
+#
+CONFIG_CMD_FLASH=y
+# CONFIG_CMD_UBI is not set
+
+#
+# booting                       
+#
+CONFIG_CMD_BOOTM=y
+CONFIG_CMD_BOOTM_ZLIB=y
+CONFIG_CMD_BOOTM_BZLIB=y
+CONFIG_CMD_BOOTM_SHOW_TYPE=y
+CONFIG_CMD_BOOTZ=y
+CONFIG_CMD_BOOTU=y
+# CONFIG_CMD_LINUX16 is not set
+CONFIG_CMD_RESET=y
+CONFIG_CMD_GO=y
+CONFIG_CMD_TIMEOUT=y
+CONFIG_CMD_PARTITION=y
+CONFIG_CMD_TEST=y
+CONFIG_CMD_VERSION=y
+CONFIG_CMD_HELP=y
+CONFIG_CMD_DEVINFO=y
+# CONFIG_CMD_UNLZO is not set
+CONFIG_NET=y
+CONFIG_NET_DHCP=y
+CONFIG_NET_NFS=y
+CONFIG_NET_PING=y
+CONFIG_NET_TFTP=y
+# CONFIG_NET_TFTP_PUSH is not set
+# CONFIG_NET_NETCONSOLE is not set
+# CONFIG_NET_RESOLV is not set
+
+#
+# Drivers                       
+#
+
+#
+# serial drivers                
+#
+# CONFIG_DRIVER_SERIAL_ARM_DCC is not set
+CONFIG_SERIAL_AMBA_PL011=y
+# CONFIG_DRIVER_SERIAL_NS16550 is not set
+CONFIG_MIIPHY=y
+
+#
+# Network drivers               
+#
+# CONFIG_DRIVER_NET_SMC911X is not set
+CONFIG_DRIVER_NET_SMC91111=y
+
+#
+# SPI drivers                   
+#
+# CONFIG_SPI is not set
+# CONFIG_I2C is not set
+
+#
+# flash drivers                 
+#
+# CONFIG_DRIVER_CFI is not set
+CONFIG_MTD=y
+CONFIG_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_ECC_SMC=y
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_NOMADIK=y
+# CONFIG_UBI is not set
+# CONFIG_ATA is not set
+# CONFIG_USB is not set
+# CONFIG_USB_GADGET is not set
+# CONFIG_VIDEO is not set
+
+#
+# Filesystem support            
+#
+# CONFIG_FS_CRAMFS is not set
+CONFIG_FS_RAMFS=y
+CONFIG_FS_DEVFS=y
+CONFIG_ZLIB=y
+CONFIG_BZLIB=y
+CONFIG_CRC32=y
+# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+# CONFIG_PROCESS_ESCAPE_SEQUENCE is not set
diff --git a/arch/arm/mach-nomadik/Kconfig b/arch/arm/mach-nomadik/Kconfig
index 4cf3f7b..64894c8 100644
--- a/arch/arm/mach-nomadik/Kconfig
+++ b/arch/arm/mach-nomadik/Kconfig
@@ -1,11 +1,24 @@
 if ARCH_NOMADIK
 
+config ARCH_TEXT_BASE
+	hex
+	default 0x03c00000 if MACH_NOMADIK_8815NHK
+
+config BOARDINFO
+	default "NHK8815" if MACH_NOMADIK_8815NHK
+
 choice
 	prompt "Nomadik boards"
 
+config MACH_NOMADIK_8815NHK
+	bool "ST 8815 Nomadik Hardware Kit (evaluation board)"
+	select NOMADIK_8815
+	select COMMON_CLKDEV
+
 endchoice
 
 config NOMADIK_8815
 	bool
+	select ARM_AMBA
 
 endif
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug  3 22:20:14 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 04:20:14 +0200
Subject: [PATCH] init.h: introduce fake define (__init & __initdata) to
	simplify the linux sync
Message-ID: <1280888414-22759-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/init.h |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/include/init.h b/include/init.h
index c5dea07..accc4d0 100644
--- a/include/init.h
+++ b/include/init.h
@@ -1,6 +1,12 @@
 #ifndef _INIT_H
 #define _INIT_H
 
+/*
+ * fake define to simplify the linux sync
+ */
+#define __init
+#define __initdata
+
 typedef int (*initcall_t)(void);
 
 #define __define_initcall(level,fn,id) \
-- 
1.7.1



From baruch at tkos.co.il  Wed Aug  4 01:20:23 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Wed, 4 Aug 2010 08:20:23 +0300
Subject: [PATCH 3/3 v2] at91: implement clock framework
In-Reply-To: <1280885595-18026-1-git-send-email-plagnioj@jcrosoft.com>
References: <1280840019-11421-3-git-send-email-plagnioj@jcrosoft.com>
	<1280885595-18026-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100804052022.GA17208@jasper.tkos.co.il>

Hi Jean-Christophe,

On Wed, Aug 04, 2010 at 03:33:15AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> this implementation is based on linux one (v2.6.35-rc5-76-gd0c6f62)
> it will calculate all the clock dynamically instead of statictly
> this will use also the new clock framework
> 
> it will also print the clock status after the console init
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
> v2:
> upadate against mainline kernel
> and add ref on which revision it's based on

[snip]

> diff --git a/arch/arm/boards/mmccpu/config.h b/arch/arm/boards/mmccpu/config.h
> index 1133b8f..422ac09 100644
> --- a/arch/arm/boards/mmccpu/config.h
> +++ b/arch/arm/boards/mmccpu/config.h
> @@ -1,7 +1,7 @@
>  #ifndef __CONFIG_H
>  #define __CONFIG_H
>  
> -#define AT91_MASTER_CLOCK	99532800		/* peripheral = main / 2 */
> +#define AT91_M1IN_CLOCK		18432000

s/M1IN/MAIN/ ?

baruch

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From plagnioj at jcrosoft.com  Wed Aug  4 02:06:36 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed, 4 Aug 2010 08:06:36 +0200
Subject: [PATCH 3/3 v2] at91: implement clock framework
In-Reply-To: <20100804052022.GA17208@jasper.tkos.co.il>
References: <1280840019-11421-3-git-send-email-plagnioj@jcrosoft.com>
	<1280885595-18026-1-git-send-email-plagnioj@jcrosoft.com>
	<20100804052022.GA17208@jasper.tkos.co.il>
Message-ID: <20100804060636.GB16337@game.jcrosoft.org>

On 08:20 Wed 04 Aug     , Baruch Siach wrote:
> Hi Jean-Christophe,
> 
> On Wed, Aug 04, 2010 at 03:33:15AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > this implementation is based on linux one (v2.6.35-rc5-76-gd0c6f62)
> > it will calculate all the clock dynamically instead of statictly
> > this will use also the new clock framework
> > 
> > it will also print the clock status after the console init
> > 
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> > ---
> > v2:
> > upadate against mainline kernel
> > and add ref on which revision it's based on
> 
> [snip]
> 
> > diff --git a/arch/arm/boards/mmccpu/config.h b/arch/arm/boards/mmccpu/config.h
> > index 1133b8f..422ac09 100644
> > --- a/arch/arm/boards/mmccpu/config.h
> > +++ b/arch/arm/boards/mmccpu/config.h
> > @@ -1,7 +1,7 @@
> >  #ifndef __CONFIG_H
> >  #define __CONFIG_H
> >  
> > -#define AT91_MASTER_CLOCK	99532800		/* peripheral = main / 2 */
> > +#define AT91_M1IN_CLOCK		18432000
> 
> s/M1IN/MAIN/ ?
nice

Best Regards,
J.


From plagnioj at jcrosoft.com  Wed Aug  4 02:12:56 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 08:12:56 +0200
Subject: [PATCH 3/3 v3] at91: implement clock framework
In-Reply-To: <1280885595-18026-1-git-send-email-plagnioj@jcrosoft.com>
References: <1280885595-18026-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1280902376-11891-1-git-send-email-plagnioj@jcrosoft.com>

this implementation is based on linux one (v2.6.35-rc5-76-gd0c6f62)
it will calculate all the clock dynamically instead of statictly
this will use also the new clock framework

it will also print the clock status after the console init

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
v3:

fix typo

Best Regards,
J.
 arch/arm/boards/at91sam9260ek/config.h      |    2 +-
 arch/arm/boards/at91sam9263ek/config.h      |    2 +-
 arch/arm/boards/at91sam9263ek/init.c        |    3 -
 arch/arm/boards/mmccpu/config.h             |    2 +-
 arch/arm/boards/mmccpu/init.c               |    3 -
 arch/arm/boards/pm9263/config.h             |    2 +-
 arch/arm/boards/pm9263/init.c               |    3 -
 arch/arm/mach-at91/Makefile                 |    2 +-
 arch/arm/mach-at91/at91sam9260.c            |  207 ++++++++
 arch/arm/mach-at91/at91sam9260_devices.c    |   18 +-
 arch/arm/mach-at91/at91sam9263.c            |  217 ++++++++
 arch/arm/mach-at91/at91sam9263_devices.c    |   13 +-
 arch/arm/mach-at91/clock.c                  |  718 +++++++++++++++++++++++++++
 arch/arm/mach-at91/clock.h                  |   31 ++
 arch/arm/mach-at91/generic.h                |   14 +
 arch/arm/mach-at91/gpio.c                   |    3 +
 arch/arm/mach-at91/include/mach/at91_dbgu.h |   66 +++
 arch/arm/mach-at91/include/mach/clk.h       |   39 --
 arch/arm/mach-at91/include/mach/cpu.h       |  158 ++++++
 arch/arm/mach-at91/include/mach/gpio.h      |    1 +
 drivers/net/macb.c                          |   11 +-
 drivers/serial/atmel.c                      |   32 +-
 22 files changed, 1472 insertions(+), 75 deletions(-)
 create mode 100644 arch/arm/mach-at91/clock.c
 create mode 100644 arch/arm/mach-at91/clock.h
 create mode 100644 arch/arm/mach-at91/generic.h
 create mode 100644 arch/arm/mach-at91/include/mach/at91_dbgu.h
 delete mode 100644 arch/arm/mach-at91/include/mach/clk.h
 create mode 100644 arch/arm/mach-at91/include/mach/cpu.h

diff --git a/arch/arm/boards/at91sam9260ek/config.h b/arch/arm/boards/at91sam9260ek/config.h
index afd8563..006820c 100644
--- a/arch/arm/boards/at91sam9260ek/config.h
+++ b/arch/arm/boards/at91sam9260ek/config.h
@@ -1,6 +1,6 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK  99328000        /* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK		18432000	/* 18.432 MHz crystal */
 
 #endif	/* __CONFIG_H */
diff --git a/arch/arm/boards/at91sam9263ek/config.h b/arch/arm/boards/at91sam9263ek/config.h
index 9cc8af2..bc33227 100644
--- a/arch/arm/boards/at91sam9263ek/config.h
+++ b/arch/arm/boards/at91sam9263ek/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK 100000000        /* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK		16367660	/* 16.367 MHz crystal */
 
 #define MASTER_PLL_MUL		171
 #define MASTER_PLL_DIV		14
diff --git a/arch/arm/boards/at91sam9263ek/init.c b/arch/arm/boards/at91sam9263ek/init.c
index 21803ca..61cd295 100644
--- a/arch/arm/boards/at91sam9263ek/init.c
+++ b/arch/arm/boards/at91sam9263ek/init.c
@@ -108,9 +108,6 @@ static int at91sam9263ek_devices_init(void)
 	at91_set_gpio_output(AT91_PIN_PB27, 1);
 	at91_set_gpio_value(AT91_PIN_PB27, 1); /* 1- enable, 0 - disable */
 
-	/* Enable clock */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
-
 	at91_add_device_sdram(64 * 1024 * 1024);
 	ek_add_device_nand();
 	at91_add_device_eth(&macb_pdata);
diff --git a/arch/arm/boards/mmccpu/config.h b/arch/arm/boards/mmccpu/config.h
index 1133b8f..c37d5eb 100644
--- a/arch/arm/boards/mmccpu/config.h
+++ b/arch/arm/boards/mmccpu/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK	99532800		/* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK		18432000
 
 /* values */
 #define MASTER_PLL_MUL		54
diff --git a/arch/arm/boards/mmccpu/init.c b/arch/arm/boards/mmccpu/init.c
index e010a83..9a7d930 100644
--- a/arch/arm/boards/mmccpu/init.c
+++ b/arch/arm/boards/mmccpu/init.c
@@ -58,9 +58,6 @@ static int mmccpu_devices_init(void)
 	at91_set_gpio_output(AT91_PIN_PB27, 1);
 	at91_set_gpio_value(AT91_PIN_PB27, 1); /* 1- enable, 0 - disable */
 
-	/* Enable clock */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
-
 	at91_add_device_sdram(128 * 1024 * 1024);
 	at91_add_device_eth(&macb_pdata);
 	register_device(&cfi_dev);
diff --git a/arch/arm/boards/pm9263/config.h b/arch/arm/boards/pm9263/config.h
index 9a9c5cd..5252df2 100644
--- a/arch/arm/boards/pm9263/config.h
+++ b/arch/arm/boards/pm9263/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_MASTER_CLOCK  99328000        /* peripheral = main / 2 */
+#define AT91_MAIN_CLOCK	18432000
 
 #define MASTER_PLL_DIV		6
 #define MASTER_PLL_MUL		65
diff --git a/arch/arm/boards/pm9263/init.c b/arch/arm/boards/pm9263/init.c
index 88b91ea..d5ed921 100644
--- a/arch/arm/boards/pm9263/init.c
+++ b/arch/arm/boards/pm9263/init.c
@@ -107,9 +107,6 @@ static int pm9263_devices_init(void)
 	at91_set_gpio_output(AT91_PIN_PB27, 1);
 	at91_set_gpio_value(AT91_PIN_PB27, 1); /* 1- enable, 0 - disable */
 
-	/* Enable clock */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_EMAC);
-
 	at91_add_device_sdram(64 * 1024 * 1024);
 	pm_add_device_nand();
 	at91_add_device_eth(&macb_pdata);
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index c848919..0f55883 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -1,4 +1,4 @@
-obj-y += clocksource.o gpio.o
+obj-y += clock.o clocksource.o gpio.o
 
 obj-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel_init.o
 
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c
index 1a6e356..30d1a6a 100644
--- a/arch/arm/mach-at91/at91sam9260.c
+++ b/arch/arm/mach-at91/at91sam9260.c
@@ -2,22 +2,229 @@
 #include <gpio.h>
 #include <init.h>
 #include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+
+#include "generic.h"
+#include "clock.h"
+
+/* --------------------------------------------------------------------
+ *  Clocks
+ * -------------------------------------------------------------------- */
+
+/*
+ * The peripheral clocks.
+ */
+static struct clk pioA_clk = {
+	.name		= "pioA_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_PIOA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioB_clk = {
+	.name		= "pioB_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_PIOB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioC_clk = {
+	.name		= "pioC_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_PIOC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk adc_clk = {
+	.name		= "adc_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_ADC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart0_clk = {
+	.name		= "usart0_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart1_clk = {
+	.name		= "usart1_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart2_clk = {
+	.name		= "usart2_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc_clk = {
+	.name		= "mci_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_MCI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk udc_clk = {
+	.name		= "udc_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_UDP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twi_clk = {
+	.name		= "twi_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TWI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi0_clk = {
+	.name		= "spi0_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_SPI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi1_clk = {
+	.name		= "spi1_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_SPI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc_clk = {
+	.name		= "ssc_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_SSC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc0_clk = {
+	.name		= "tc0_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc1_clk = {
+	.name		= "tc1_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc2_clk = {
+	.name		= "tc2_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ohci_clk = {
+	.name		= "ohci_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_UHP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk macb_clk = {
+	.name		= "macb_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_EMAC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk isi_clk = {
+	.name		= "isi_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_ISI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart3_clk = {
+	.name		= "usart3_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US3,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart4_clk = {
+	.name		= "usart4_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US4,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart5_clk = {
+	.name		= "usart5_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_US5,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc3_clk = {
+	.name		= "tc3_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC3,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc4_clk = {
+	.name		= "tc4_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC4,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc5_clk = {
+	.name		= "tc5_clk",
+	.pmc_mask	= 1 << AT91SAM9260_ID_TC5,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+
+static struct clk *periph_clocks[] = {
+	&pioA_clk,
+	&pioB_clk,
+	&pioC_clk,
+	&adc_clk,
+	&usart0_clk,
+	&usart1_clk,
+	&usart2_clk,
+	&mmc_clk,
+	&udc_clk,
+	&twi_clk,
+	&spi0_clk,
+	&spi1_clk,
+	&ssc_clk,
+	&tc0_clk,
+	&tc1_clk,
+	&tc2_clk,
+	&ohci_clk,
+	&macb_clk,
+	&isi_clk,
+	&usart3_clk,
+	&usart4_clk,
+	&usart5_clk,
+	&tc3_clk,
+	&tc4_clk,
+	&tc5_clk,
+	// irq0 .. irq2
+};
+
+/*
+ * The two programmable clocks.
+ * You must configure pin multiplexing to bring these signals out.
+ */
+static struct clk pck0 = {
+	.name		= "pck0",
+	.pmc_mask	= AT91_PMC_PCK0,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 0,
+};
+static struct clk pck1 = {
+	.name		= "pck1",
+	.pmc_mask	= AT91_PMC_PCK1,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 1,
+};
+
+static void __init at91sam9260_register_clocks(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
+		clk_register(periph_clocks[i]);
+
+	clk_register(&pck0);
+	clk_register(&pck1);
+}
+
+/* --------------------------------------------------------------------
+ *  GPIO
+ * -------------------------------------------------------------------- */
 
 static struct at91_gpio_bank at91sam9260_gpio[] = {
 	{
 		.id		= AT91SAM9260_ID_PIOA,
 		.offset		= AT91_PIOA,
+		.clock		= &pioA_clk,
 	}, {
 		.id		= AT91SAM9260_ID_PIOB,
 		.offset		= AT91_PIOB,
+		.clock		= &pioB_clk,
 	}, {
 		.id		= AT91SAM9260_ID_PIOC,
 		.offset		= AT91_PIOC,
+		.clock		= &pioC_clk,
 	}
 };
 
 static int at91sam9260_initialize(void)
 {
+	/* Init clock subsystem */
+	at91_clock_init(AT91_MAIN_CLOCK);
+
+	/* Register the processor-specific clocks */
+	at91sam9260_register_clocks();
+
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9260_gpio, 3);
 	return 0;
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
index 0cfe913..398a721 100644
--- a/arch/arm/mach-at91/at91sam9260_devices.c
+++ b/arch/arm/mach-at91/at91sam9260_devices.c
@@ -18,6 +18,8 @@
 #include <mach/gpio.h>
 #include <mach/io.h>
 
+#include "generic.h"
+
 static struct memory_platform_data sram_pdata = {
 	.name = "sram0",
 	.flags = DEVFS_RDWR,
@@ -107,8 +109,6 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 	if (data->det_pin)
 		at91_set_gpio_input(data->det_pin, 1);
 
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_PIOC);
-
 	nand_dev.platform_data = data;
 	register_device(&nand_dev);
 }
@@ -233,37 +233,37 @@ void at91_register_uart(unsigned id, unsigned pins)
 	switch (id) {
 		case 0:		/* DBGU */
 			configure_dbgu_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
+			at91_clock_associate("mck", &dbgu_serial_device, "usart");
 			register_device(&dbgu_serial_device);
 			break;
 		case AT91SAM9260_ID_US0:
 			configure_usart0_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US0);
+			at91_clock_associate("usart0_clk", &uart0_serial_device, "usart");
 			register_device(&uart0_serial_device);
 			break;
 		case AT91SAM9260_ID_US1:
 			configure_usart1_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US1);
+			at91_clock_associate("usart1_clk", &uart1_serial_device, "usart");
 			register_device(&uart1_serial_device);
 			break;
 		case AT91SAM9260_ID_US2:
 			configure_usart2_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US2);
+			at91_clock_associate("usart2_clk", &uart2_serial_device, "usart");
 			register_device(&uart2_serial_device);
 			break;
 		case AT91SAM9260_ID_US3:
 			configure_usart3_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US3);
+			at91_clock_associate("usart3_clk", &uart3_serial_device, "usart");
 			register_device(&uart3_serial_device);
 			break;
 		case AT91SAM9260_ID_US4:
 			configure_usart4_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US4);
+			at91_clock_associate("usart4_clk", &uart4_serial_device, "usart");
 			register_device(&uart4_serial_device);
 			break;
 		case AT91SAM9260_ID_US5:
 			configure_usart5_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9260_ID_US5);
+			at91_clock_associate("usart5_clk", &uart5_serial_device, "usart");
 			register_device(&uart5_serial_device);
 			break;
 		default:
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c
index 472b619..b0e3193 100644
--- a/arch/arm/mach-at91/at91sam9263.c
+++ b/arch/arm/mach-at91/at91sam9263.c
@@ -2,28 +2,245 @@
 #include <gpio.h>
 #include <init.h>
 #include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+
+#include "clock.h"
+#include "generic.h"
+
+/* --------------------------------------------------------------------
+ *  Clocks
+ * -------------------------------------------------------------------- */
+
+/*
+ * The peripheral clocks.
+ */
+static struct clk pioA_clk = {
+	.name		= "pioA_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PIOA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioB_clk = {
+	.name		= "pioB_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PIOB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioCDE_clk = {
+	.name		= "pioCDE_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PIOCDE,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart0_clk = {
+	.name		= "usart0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_US0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart1_clk = {
+	.name		= "usart1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_US1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart2_clk = {
+	.name		= "usart2_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_US2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc0_clk = {
+	.name		= "mci0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_MCI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc1_clk = {
+	.name		= "mci1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_MCI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk can_clk = {
+	.name		= "can_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_CAN,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twi_clk = {
+	.name		= "twi_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_TWI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi0_clk = {
+	.name		= "spi0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SPI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi1_clk = {
+	.name		= "spi1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SPI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc0_clk = {
+	.name		= "ssc0_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SSC0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc1_clk = {
+	.name		= "ssc1_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_SSC1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ac97_clk = {
+	.name		= "ac97_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_AC97C,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tcb_clk = {
+	.name		= "tcb_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_TCB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pwm_clk = {
+	.name		= "pwm_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_PWMC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk macb_clk = {
+	.name		= "macb_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_EMAC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk dma_clk = {
+	.name		= "dma_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_DMA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twodge_clk = {
+	.name		= "2dge_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_2DGE,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk udc_clk = {
+	.name		= "udc_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_UDP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk isi_clk = {
+	.name		= "isi_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_ISI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk lcdc_clk = {
+	.name		= "lcdc_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_LCDC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ohci_clk = {
+	.name		= "ohci_clk",
+	.pmc_mask	= 1 << AT91SAM9263_ID_UHP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+
+static struct clk *periph_clocks[] = {
+	&pioA_clk,
+	&pioB_clk,
+	&pioCDE_clk,
+	&usart0_clk,
+	&usart1_clk,
+	&usart2_clk,
+	&mmc0_clk,
+	&mmc1_clk,
+	&can_clk,
+	&twi_clk,
+	&spi0_clk,
+	&spi1_clk,
+	&ssc0_clk,
+	&ssc1_clk,
+	&ac97_clk,
+	&tcb_clk,
+	&pwm_clk,
+	&macb_clk,
+	&twodge_clk,
+	&udc_clk,
+	&isi_clk,
+	&lcdc_clk,
+	&dma_clk,
+	&ohci_clk,
+	// irq0 .. irq1
+};
+
+/*
+ * The four programmable clocks.
+ * You must configure pin multiplexing to bring these signals out.
+ */
+static struct clk pck0 = {
+	.name		= "pck0",
+	.pmc_mask	= AT91_PMC_PCK0,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 0,
+};
+static struct clk pck1 = {
+	.name		= "pck1",
+	.pmc_mask	= AT91_PMC_PCK1,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 1,
+};
+static struct clk pck2 = {
+	.name		= "pck2",
+	.pmc_mask	= AT91_PMC_PCK2,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 2,
+};
+static struct clk pck3 = {
+	.name		= "pck3",
+	.pmc_mask	= AT91_PMC_PCK3,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 3,
+};
+
+static void __init at91sam9263_register_clocks(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
+		clk_register(periph_clocks[i]);
+
+	clk_register(&pck0);
+	clk_register(&pck1);
+	clk_register(&pck2);
+	clk_register(&pck3);
+}
+
+/* --------------------------------------------------------------------
+ *  GPIO
+ * -------------------------------------------------------------------- */
 
 static struct at91_gpio_bank at91sam9263_gpio[] = {
 	{
 		.id		= AT91SAM9263_ID_PIOA,
 		.offset		= AT91_PIOA,
+		.clock		= &pioA_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOB,
 		.offset		= AT91_PIOB,
+		.clock		= &pioB_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOCDE,
 		.offset		= AT91_PIOC,
+		.clock		= &pioCDE_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOCDE,
 		.offset		= AT91_PIOD,
+		.clock		= &pioCDE_clk,
 	}, {
 		.id		= AT91SAM9263_ID_PIOCDE,
 		.offset		= AT91_PIOE,
+		.clock		= &pioCDE_clk,
 	}
 };
 
 static int at91sam9263_initialize(void)
 {
+	/* Init clock subsystem */
+	at91_clock_init(AT91_MAIN_CLOCK);
+
+	/* Register the processor-specific clocks */
+	at91sam9263_register_clocks();
+
 	/* Register GPIO subsystem */
 	at91_gpio_init(at91sam9263_gpio, 5);
 	return 0;
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
index 50a6348..7ebc32c 100644
--- a/arch/arm/mach-at91/at91sam9263_devices.c
+++ b/arch/arm/mach-at91/at91sam9263_devices.c
@@ -18,6 +18,8 @@
 #include <mach/gpio.h>
 #include <mach/io.h>
 
+#include "generic.h"
+
 static struct memory_platform_data ram_pdata = {
 	.name = "ram0",
 	.flags = DEVFS_RDWR,
@@ -106,9 +108,6 @@ void at91_add_device_nand(struct atmel_nand_data *data)
 	if (data->det_pin)
 		at91_set_gpio_input(data->det_pin, 1);
 
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_PIOA |
-				      1 << AT91SAM9263_ID_PIOCDE);
-
 	nand_dev.platform_data = data;
 	register_device(&nand_dev);
 }
@@ -184,22 +183,22 @@ void at91_register_uart(unsigned id, unsigned pins)
 	switch (id) {
 		case 0:		/* DBGU */
 			configure_dbgu_pins();
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
+			at91_clock_associate("mck", &dbgu_serial_device, "usart");
 			register_device(&dbgu_serial_device);
 			break;
 		case AT91SAM9263_ID_US0:
 			configure_usart0_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_US0);
+			at91_clock_associate("usart0_clk", &uart0_serial_device, "usart");
 			register_device(&uart0_serial_device);
 			break;
 		case AT91SAM9263_ID_US1:
 			configure_usart1_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_US1);
+			at91_clock_associate("usart1_clk", &uart1_serial_device, "usart");
 			register_device(&uart1_serial_device);
 			break;
 		case AT91SAM9263_ID_US2:
 			configure_usart2_pins(pins);
-			at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9263_ID_US2);
+			at91_clock_associate("usart2_clk", &uart2_serial_device, "usart");
 			register_device(&uart2_serial_device);
 			break;
 		default:
diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c
new file mode 100644
index 0000000..6fd09d5
--- /dev/null
+++ b/arch/arm/mach-at91/clock.c
@@ -0,0 +1,718 @@
+/*
+ * linux/arch/arm/mach-at91/clock.c
+ *
+ * Copyright (C) 2005 David Brownell
+ * Copyright (C) 2005 Ivan Kokshaysky
+ *
+ * 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 <linux/list.h>
+#include <errno.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <init.h>
+
+#include <mach/hardware.h>
+#include <mach/io.h>
+#include <mach/at91_pmc.h>
+#include <mach/cpu.h>
+
+#include "clock.h"
+#include "generic.h"
+
+/*
+ * There's a lot more which can be done with clocks, including cpufreq
+ * integration, slow clock mode support (for system suspend), letting
+ * PLLB be used at other rates (on boards that don't need USB), etc.
+ */
+
+#define clk_is_primary(x)	((x)->type & CLK_TYPE_PRIMARY)
+#define clk_is_programmable(x)	((x)->type & CLK_TYPE_PROGRAMMABLE)
+#define clk_is_peripheral(x)	((x)->type & CLK_TYPE_PERIPHERAL)
+#define clk_is_sys(x)		((x)->type & CLK_TYPE_SYSTEM)
+
+
+/*
+ * Chips have some kind of clocks : group them by functionality
+ */
+#define cpu_has_utmi()		(  cpu_is_at91cap9() \
+				|| cpu_is_at91sam9rl() \
+				|| cpu_is_at91sam9g45())
+
+#define cpu_has_800M_plla()	(  cpu_is_at91sam9g20() \
+				|| cpu_is_at91sam9g45())
+
+#define cpu_has_300M_plla()	(cpu_is_at91sam9g10())
+
+#define cpu_has_pllb()		(!(cpu_is_at91sam9rl() \
+				|| cpu_is_at91sam9g45()))
+
+#define cpu_has_upll()		(cpu_is_at91sam9g45())
+
+/* USB host HS & FS */
+#define cpu_has_uhp()		(!cpu_is_at91sam9rl())
+
+/* USB device FS only */
+#define cpu_has_udpfs()		(!(cpu_is_at91sam9rl() \
+				|| cpu_is_at91sam9g45()))
+
+static LIST_HEAD(clocks);
+
+static u32 at91_pllb_usb_init;
+
+/*
+ * Four primary clock sources:  two crystal oscillators (32K, main), and
+ * two PLLs.  PLLA usually runs the master clock; and PLLB must run at
+ * 48 MHz (unless no USB function clocks are needed).  The main clock and
+ * both PLLs are turned off to run in "slow clock mode" (system suspend).
+ */
+static struct clk clk32k = {
+	.name		= "clk32k",
+	.rate_hz	= AT91_SLOW_CLOCK,
+	.users		= 1,		/* always on */
+	.id		= 0,
+	.type		= CLK_TYPE_PRIMARY,
+};
+static struct clk main_clk = {
+	.name		= "main",
+	.pmc_mask	= AT91_PMC_MOSCS,	/* in PMC_SR */
+	.id		= 1,
+	.type		= CLK_TYPE_PRIMARY,
+};
+static struct clk plla = {
+	.name		= "plla",
+	.parent		= &main_clk,
+	.pmc_mask	= AT91_PMC_LOCKA,	/* in PMC_SR */
+	.id		= 2,
+	.type		= CLK_TYPE_PRIMARY | CLK_TYPE_PLL,
+};
+
+static void pllb_mode(struct clk *clk, int is_on)
+{
+	u32	value;
+
+	if (is_on) {
+		is_on = AT91_PMC_LOCKB;
+		value = at91_pllb_usb_init;
+	} else
+		value = 0;
+
+	// REVISIT: Add work-around for AT91RM9200 Errata #26 ?
+	at91_sys_write(AT91_CKGR_PLLBR, value);
+
+	do {
+		barrier();
+	} while ((at91_sys_read(AT91_PMC_SR) & AT91_PMC_LOCKB) != is_on);
+}
+
+static struct clk pllb = {
+	.name		= "pllb",
+	.parent		= &main_clk,
+	.pmc_mask	= AT91_PMC_LOCKB,	/* in PMC_SR */
+	.mode		= pllb_mode,
+	.id		= 3,
+	.type		= CLK_TYPE_PRIMARY | CLK_TYPE_PLL,
+};
+
+static void pmc_sys_mode(struct clk *clk, int is_on)
+{
+	if (is_on)
+		at91_sys_write(AT91_PMC_SCER, clk->pmc_mask);
+	else
+		at91_sys_write(AT91_PMC_SCDR, clk->pmc_mask);
+}
+
+static void pmc_uckr_mode(struct clk *clk, int is_on)
+{
+	unsigned int uckr = at91_sys_read(AT91_CKGR_UCKR);
+
+	if (cpu_is_at91sam9g45()) {
+		if (is_on)
+			uckr |= AT91_PMC_BIASEN;
+		else
+			uckr &= ~AT91_PMC_BIASEN;
+	}
+
+	if (is_on) {
+		is_on = AT91_PMC_LOCKU;
+		at91_sys_write(AT91_CKGR_UCKR, uckr | clk->pmc_mask);
+	} else
+		at91_sys_write(AT91_CKGR_UCKR, uckr & ~(clk->pmc_mask));
+
+	do {
+		barrier();
+	} while ((at91_sys_read(AT91_PMC_SR) & AT91_PMC_LOCKU) != is_on);
+}
+
+/* USB function clocks (PLLB must be 48 MHz) */
+static struct clk udpck = {
+	.name		= "udpck",
+	.parent		= &pllb,
+	.mode		= pmc_sys_mode,
+};
+static struct clk utmi_clk = {
+	.name		= "utmi_clk",
+	.parent		= &main_clk,
+	.pmc_mask	= AT91_PMC_UPLLEN,	/* in CKGR_UCKR */
+	.mode		= pmc_uckr_mode,
+	.type		= CLK_TYPE_PLL,
+};
+static struct clk uhpck = {
+	.name		= "uhpck",
+	/*.parent		= ... we choose parent at runtime */
+	.mode		= pmc_sys_mode,
+};
+
+
+/*
+ * The master clock is divided from the CPU clock (by 1-4).  It's used for
+ * memory, interfaces to on-chip peripherals, the AIC, and sometimes more
+ * (e.g baud rate generation).  It's sourced from one of the primary clocks.
+ */
+static struct clk mck = {
+	.name		= "mck",
+	.pmc_mask	= AT91_PMC_MCKRDY,	/* in PMC_SR */
+};
+
+static void pmc_periph_mode(struct clk *clk, int is_on)
+{
+	if (is_on)
+		at91_sys_write(AT91_PMC_PCER, clk->pmc_mask);
+	else
+		at91_sys_write(AT91_PMC_PCDR, clk->pmc_mask);
+}
+
+static struct clk *at91_css_to_clk(unsigned long css)
+{
+	switch (css) {
+		case AT91_PMC_CSS_SLOW:
+			return &clk32k;
+		case AT91_PMC_CSS_MAIN:
+			return &main_clk;
+		case AT91_PMC_CSS_PLLA:
+			return &plla;
+		case AT91_PMC_CSS_PLLB:
+			if (cpu_has_upll())
+				/* CSS_PLLB == CSS_UPLL */
+				return &utmi_clk;
+			else if (cpu_has_pllb())
+				return &pllb;
+	}
+
+	return NULL;
+}
+
+/*
+ * Associate a particular clock with a function (eg, "uart") and device.
+ * The drivers can then request the same 'function' with several different
+ * devices and not care about which clock name to use.
+ */
+void at91_clock_associate(const char *id, struct device_d *dev, const char *func)
+{
+	struct clk *clk = clk_get(NULL, id);
+
+	if (!dev || !clk || !IS_ERR(clk_get(dev, func)))
+		return;
+
+	clk->function = func;
+	clk->dev = dev;
+}
+
+/* clocks cannot be de-registered no refcounting necessary */
+struct clk *clk_get(struct device_d *dev, const char *id)
+{
+	struct clk *clk;
+
+	list_for_each_entry(clk, &clocks, node) {
+		if (strcmp(id, clk->name) == 0)
+			return clk;
+		if (clk->function && (dev == clk->dev) && strcmp(id, clk->function) == 0)
+			return clk;
+	}
+
+	return ERR_PTR(-ENOENT);
+}
+EXPORT_SYMBOL(clk_get);
+
+void clk_put(struct clk *clk)
+{
+}
+EXPORT_SYMBOL(clk_put);
+
+static void __clk_enable(struct clk *clk)
+{
+	if (clk->parent)
+		__clk_enable(clk->parent);
+	if (clk->users++ == 0 && clk->mode)
+		clk->mode(clk, 1);
+}
+
+int clk_enable(struct clk *clk)
+{
+	__clk_enable(clk);
+	return 0;
+}
+EXPORT_SYMBOL(clk_enable);
+
+static void __clk_disable(struct clk *clk)
+{
+	BUG_ON(clk->users == 0);
+	if (--clk->users == 0 && clk->mode)
+		clk->mode(clk, 0);
+	if (clk->parent)
+		__clk_disable(clk->parent);
+}
+
+void clk_disable(struct clk *clk)
+{
+	__clk_disable(clk);
+}
+EXPORT_SYMBOL(clk_disable);
+
+unsigned long clk_get_rate(struct clk *clk)
+{
+	unsigned long	rate;
+
+	for (;;) {
+		rate = clk->rate_hz;
+		if (rate || !clk->parent)
+			break;
+		clk = clk->parent;
+	}
+	return rate;
+}
+EXPORT_SYMBOL(clk_get_rate);
+
+/*------------------------------------------------------------------------*/
+
+#ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS
+
+/*
+ * For now, only the programmable clocks support reparenting (MCK could
+ * do this too, with care) or rate changing (the PLLs could do this too,
+ * ditto MCK but that's more for cpufreq).  Drivers may reparent to get
+ * a better rate match; we don't.
+ */
+
+long clk_round_rate(struct clk *clk, unsigned long rate)
+{
+	unsigned long	flags;
+	unsigned	prescale;
+	unsigned long	actual;
+	unsigned long	prev = ULONG_MAX;
+
+	if (!clk_is_programmable(clk))
+		return -EINVAL;
+
+	actual = clk->parent->rate_hz;
+	for (prescale = 0; prescale < 7; prescale++) {
+		if (actual > rate)
+			prev = actual;
+
+		if (actual && actual <= rate) {
+			if ((prev - rate) < (rate - actual)) {
+				actual = prev;
+				prescale--;
+			}
+			break;
+		}
+		actual >>= 1;
+	}
+
+	return (prescale < 7) ? actual : -ENOENT;
+}
+EXPORT_SYMBOL(clk_round_rate);
+
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+	unsigned long	flags;
+	unsigned	prescale;
+	unsigned long	actual;
+
+	if (!clk_is_programmable(clk))
+		return -EINVAL;
+	if (clk->users)
+		return -EBUSY;
+
+	actual = clk->parent->rate_hz;
+	for (prescale = 0; prescale < 7; prescale++) {
+		if (actual && actual <= rate) {
+			u32	pckr;
+
+			pckr = at91_sys_read(AT91_PMC_PCKR(clk->id));
+			pckr &= AT91_PMC_CSS;	/* clock selection */
+			pckr |= prescale << 2;
+			at91_sys_write(AT91_PMC_PCKR(clk->id), pckr);
+			clk->rate_hz = actual;
+			break;
+		}
+		actual >>= 1;
+	}
+
+	return (prescale < 7) ? actual : -ENOENT;
+}
+EXPORT_SYMBOL(clk_set_rate);
+
+struct clk *clk_get_parent(struct clk *clk)
+{
+	return clk->parent;
+}
+EXPORT_SYMBOL(clk_get_parent);
+
+int clk_set_parent(struct clk *clk, struct clk *parent)
+{
+	unsigned long	flags;
+
+	if (clk->users)
+		return -EBUSY;
+	if (!clk_is_primary(parent) || !clk_is_programmable(clk))
+		return -EINVAL;
+
+	if (cpu_is_at91sam9rl() && parent->id == AT91_PMC_CSS_PLLB)
+		return -EINVAL;
+
+	clk->rate_hz = parent->rate_hz;
+	clk->parent = parent;
+	at91_sys_write(AT91_PMC_PCKR(clk->id), parent->id);
+
+	return 0;
+}
+EXPORT_SYMBOL(clk_set_parent);
+
+/* establish PCK0..PCKN parentage and rate */
+static void init_programmable_clock(struct clk *clk)
+{
+	struct clk	*parent;
+	u32		pckr;
+
+	pckr = at91_sys_read(AT91_PMC_PCKR(clk->id));
+	parent = at91_css_to_clk(pckr & AT91_PMC_CSS);
+	clk->parent = parent;
+	clk->rate_hz = parent->rate_hz / (1 << ((pckr & AT91_PMC_PRES) >> 2));
+}
+
+#endif	/* CONFIG_AT91_PROGRAMMABLE_CLOCKS */
+
+/*------------------------------------------------------------------------*/
+
+/* Register a new clock */
+int clk_register(struct clk *clk)
+{
+	if (clk_is_peripheral(clk)) {
+		clk->parent = &mck;
+		clk->mode = pmc_periph_mode;
+		list_add_tail(&clk->node, &clocks);
+	}
+	else if (clk_is_sys(clk)) {
+		clk->parent = &mck;
+		clk->mode = pmc_sys_mode;
+
+		list_add_tail(&clk->node, &clocks);
+	}
+#ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS
+	else if (clk_is_programmable(clk)) {
+		clk->mode = pmc_sys_mode;
+		init_programmable_clock(clk);
+		list_add_tail(&clk->node, &clocks);
+	}
+#endif
+
+	return 0;
+}
+
+
+/*------------------------------------------------------------------------*/
+
+static u32 at91_pll_rate(struct clk *pll, u32 freq, u32 reg)
+{
+	unsigned mul, div;
+
+	div = reg & 0xff;
+	mul = (reg >> 16) & 0x7ff;
+	if (div && mul) {
+		freq /= div;
+		freq *= mul + 1;
+	} else
+		freq = 0;
+
+	return freq;
+}
+
+static u32 at91_usb_rate(struct clk *pll, u32 freq, u32 reg)
+{
+	if (pll == &pllb && (reg & AT91_PMC_USB96M))
+		return freq / 2;
+	else
+		return freq;
+}
+
+static unsigned at91_pll_calc(unsigned main_freq, unsigned out_freq)
+{
+	unsigned i, div = 0, mul = 0, diff = 1 << 30;
+	unsigned ret = (out_freq > 155000000) ? 0xbe00 : 0x3e00;
+
+	/* PLL output max 240 MHz (or 180 MHz per errata) */
+	if (out_freq > 240000000)
+		goto fail;
+
+	for (i = 1; i < 256; i++) {
+		int diff1;
+		unsigned input, mul1;
+
+		/*
+		 * PLL input between 1MHz and 32MHz per spec, but lower
+		 * frequences seem necessary in some cases so allow 100K.
+		 * Warning: some newer products need 2MHz min.
+		 */
+		input = main_freq / i;
+		if (cpu_is_at91sam9g20() && input < 2000000)
+			continue;
+		if (input < 100000)
+			continue;
+		if (input > 32000000)
+			continue;
+
+		mul1 = out_freq / input;
+		if (cpu_is_at91sam9g20() && mul > 63)
+			continue;
+		if (mul1 > 2048)
+			continue;
+		if (mul1 < 2)
+			goto fail;
+
+		diff1 = out_freq - input * mul1;
+		if (diff1 < 0)
+			diff1 = -diff1;
+		if (diff > diff1) {
+			diff = diff1;
+			div = i;
+			mul = mul1;
+			if (diff == 0)
+				break;
+		}
+	}
+	if (i == 256 && diff > (out_freq >> 5))
+		goto fail;
+	return ret | ((mul - 1) << 16) | div;
+fail:
+	return 0;
+}
+
+static struct clk *const standard_pmc_clocks[] = {
+	/* four primary clocks */
+	&clk32k,
+	&main_clk,
+	&plla,
+
+	/* MCK */
+	&mck
+};
+
+/* PLLB generated USB full speed clock init */
+static void at91_pllb_usbfs_clock_init(unsigned long main_clock)
+{
+	/*
+	 * USB clock init:  choose 48 MHz PLLB value,
+	 * disable 48MHz clock during usb peripheral suspend.
+	 *
+	 * REVISIT:  assumes MCK doesn't derive from PLLB!
+	 */
+	uhpck.parent = &pllb;
+
+	at91_pllb_usb_init = at91_pll_calc(main_clock, 48000000 * 2) | AT91_PMC_USB96M;
+	pllb.rate_hz = at91_pll_rate(&pllb, main_clock, at91_pllb_usb_init);
+	if (cpu_is_at91rm9200()) {
+		uhpck.pmc_mask = AT91RM9200_PMC_UHP;
+		udpck.pmc_mask = AT91RM9200_PMC_UDP;
+		at91_sys_write(AT91_PMC_SCER, AT91RM9200_PMC_MCKUDP);
+	} else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() ||
+		   cpu_is_at91sam9263() || cpu_is_at91sam9g20() ||
+		   cpu_is_at91sam9g10() || cpu_is_at572d940hf()) {
+		uhpck.pmc_mask = AT91SAM926x_PMC_UHP;
+		udpck.pmc_mask = AT91SAM926x_PMC_UDP;
+	} else if (cpu_is_at91cap9()) {
+		uhpck.pmc_mask = AT91CAP9_PMC_UHP;
+	}
+	at91_sys_write(AT91_CKGR_PLLBR, 0);
+
+	udpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init);
+	uhpck.rate_hz = at91_usb_rate(&pllb, pllb.rate_hz, at91_pllb_usb_init);
+}
+
+/* UPLL generated USB full speed clock init */
+static void at91_upll_usbfs_clock_init(unsigned long main_clock)
+{
+	/*
+	 * USB clock init: choose 480 MHz from UPLL,
+	 */
+	unsigned int usbr = AT91_PMC_USBS_UPLL;
+
+	/* Setup divider by 10 to reach 48 MHz */
+	usbr |= ((10 - 1) << 8) & AT91_PMC_OHCIUSBDIV;
+
+	at91_sys_write(AT91_PMC_USB, usbr);
+
+	/* Now set uhpck values */
+	uhpck.parent = &utmi_clk;
+	uhpck.pmc_mask = AT91SAM926x_PMC_UHP;
+	uhpck.rate_hz = utmi_clk.parent->rate_hz;
+	uhpck.rate_hz /= 1 + ((at91_sys_read(AT91_PMC_USB) & AT91_PMC_OHCIUSBDIV) >> 8);
+}
+
+static int pll_overclock = 0;
+
+int at91_clock_init(unsigned long main_clock)
+{
+	unsigned tmp, freq, mckr;
+	int i;
+
+	/*
+	 * When the bootloader initialized the main oscillator correctly,
+	 * there's no problem using the cycle counter.  But if it didn't,
+	 * or when using oscillator bypass mode, we must be told the speed
+	 * of the main clock.
+	 */
+	if (!main_clock) {
+		do {
+			tmp = at91_sys_read(AT91_CKGR_MCFR);
+		} while (!(tmp & AT91_PMC_MAINRDY));
+		main_clock = (tmp & AT91_PMC_MAINF) * (AT91_SLOW_CLOCK / 16);
+	}
+	main_clk.rate_hz = main_clock;
+
+	/* report if PLLA is more than mildly overclocked */
+	plla.rate_hz = at91_pll_rate(&plla, main_clock, at91_sys_read(AT91_CKGR_PLLAR));
+	if (cpu_has_300M_plla()) {
+		if (plla.rate_hz > 300000000)
+			pll_overclock = 1;
+	} else if (cpu_has_800M_plla()) {
+		if (plla.rate_hz > 800000000)
+			pll_overclock = 1;
+	} else {
+		if (plla.rate_hz > 209000000)
+			pll_overclock = 1;
+	}
+
+	if (cpu_is_at91sam9g45()) {
+		mckr = at91_sys_read(AT91_PMC_MCKR);
+		plla.rate_hz /= (1 << ((mckr & AT91_PMC_PLLADIV2) >> 12));	/* plla divisor by 2 */
+	}
+
+	if (!cpu_has_pllb() && cpu_has_upll()) {
+		/* setup UTMI clock as the fourth primary clock
+		 * (instead of pllb) */
+		utmi_clk.type |= CLK_TYPE_PRIMARY;
+		utmi_clk.id = 3;
+	}
+
+	/*
+	 * USB HS clock init
+	 */
+	if (cpu_has_utmi()) {
+		/*
+		 * multiplier is hard-wired to 40
+		 * (obtain the USB High Speed 480 MHz when input is 12 MHz)
+		 */
+		utmi_clk.rate_hz = 40 * utmi_clk.parent->rate_hz;
+	}
+
+	/*
+	 * USB FS clock init
+	 */
+	if (cpu_has_pllb())
+		at91_pllb_usbfs_clock_init(main_clock);
+	if (cpu_has_upll())
+		/* assumes that we choose UPLL for USB and not PLLA */
+		at91_upll_usbfs_clock_init(main_clock);
+
+	/*
+	 * MCK and CPU derive from one of those primary clocks.
+	 * For now, assume this parentage won't change.
+	 */
+	mckr = at91_sys_read(AT91_PMC_MCKR);
+	mck.parent = at91_css_to_clk(mckr & AT91_PMC_CSS);
+	freq = mck.parent->rate_hz;
+	freq /= (1 << ((mckr & AT91_PMC_PRES) >> 2));				/* prescale */
+	if (cpu_is_at91rm9200()) {
+		mck.rate_hz = freq / (1 + ((mckr & AT91_PMC_MDIV) >> 8));	/* mdiv */
+	} else if (cpu_is_at91sam9g20()) {
+		mck.rate_hz = (mckr & AT91_PMC_MDIV) ?
+			freq / ((mckr & AT91_PMC_MDIV) >> 7) : freq;	/* mdiv ; (x >> 7) = ((x >> 8) * 2) */
+		if (mckr & AT91_PMC_PDIV)
+			freq /= 2;		/* processor clock division */
+	} else if (cpu_is_at91sam9g45()) {
+		mck.rate_hz = (mckr & AT91_PMC_MDIV) == AT91SAM9_PMC_MDIV_3 ?
+			freq / 3 : freq / (1 << ((mckr & AT91_PMC_MDIV) >> 8));	/* mdiv */
+	} else {
+		mck.rate_hz = freq / (1 << ((mckr & AT91_PMC_MDIV) >> 8));      /* mdiv */
+	}
+
+	/* Register the PMC's standard clocks */
+	for (i = 0; i < ARRAY_SIZE(standard_pmc_clocks); i++)
+		list_add_tail(&standard_pmc_clocks[i]->node, &clocks);
+
+	if (cpu_has_pllb())
+		list_add_tail(&pllb.node, &clocks);
+
+	if (cpu_has_uhp())
+		list_add_tail(&uhpck.node, &clocks);
+
+	if (cpu_has_udpfs())
+		list_add_tail(&udpck.node, &clocks);
+
+	if (cpu_has_utmi())
+		list_add_tail(&utmi_clk.node, &clocks);
+
+	/* MCK and CPU clock are "always on" */
+	clk_enable(&mck);
+
+	return 0;
+}
+
+static int at91_clock_display(void)
+{
+	if (pll_overclock)
+		pr_info("Clocks: PLLA overclocked, %ld MHz\n", plla.rate_hz / 1000000);
+
+	printf("Clocks: CPU %u MHz, master %u MHz, main %u.%03u MHz\n",
+		mck.parent->rate_hz / 1000000, (unsigned) mck.rate_hz / 1000000,
+		(unsigned) main_clk.rate_hz / 1000000,
+		((unsigned) main_clk.rate_hz % 1000000) / 1000);
+
+	return 0;
+}
+postconsole_initcall(at91_clock_display);
+
+/*
+ * Several unused clocks may be active.  Turn them off.
+ */
+static int at91_clock_reset(void)
+{
+	unsigned long pcdr = 0;
+	unsigned long scdr = 0;
+	struct clk *clk;
+
+	list_for_each_entry(clk, &clocks, node) {
+		if (clk->users > 0)
+			continue;
+
+		if (clk->mode == pmc_periph_mode)
+			pcdr |= clk->pmc_mask;
+
+		if (clk->mode == pmc_sys_mode)
+			scdr |= clk->pmc_mask;
+
+		pr_debug("Clocks: disable unused %s\n", clk->name);
+	}
+
+	at91_sys_write(AT91_PMC_PCDR, pcdr);
+	at91_sys_write(AT91_PMC_SCDR, scdr);
+
+	return 0;
+}
+late_initcall(at91_clock_reset);
diff --git a/arch/arm/mach-at91/clock.h b/arch/arm/mach-at91/clock.h
new file mode 100644
index 0000000..c8ecd0c
--- /dev/null
+++ b/arch/arm/mach-at91/clock.h
@@ -0,0 +1,31 @@
+/*
+ * linux/arch/arm/mach-at91/clock.h
+ *
+ * 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.
+ */
+
+#define CLK_TYPE_PRIMARY	0x1
+#define CLK_TYPE_PLL		0x2
+#define CLK_TYPE_PROGRAMMABLE	0x4
+#define CLK_TYPE_PERIPHERAL	0x8
+#define CLK_TYPE_SYSTEM		0x10
+
+
+struct clk {
+	struct list_head node;
+	const char	*name;		/* unique clock name */
+	const char	*function;	/* function of the clock */
+	struct device_d	*dev;		/* device associated with function */
+	unsigned long	rate_hz;
+	struct clk	*parent;
+	u32		pmc_mask;
+	void		(*mode)(struct clk *, int);
+	unsigned	id:3;		/* PCK0..4, or 32k/main/a/b */
+	unsigned	type;		/* clock type */
+	u16		users;
+};
+
+
+extern int __init clk_register(struct clk *clk);
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h
new file mode 100644
index 0000000..b3a029d
--- /dev/null
+++ b/arch/arm/mach-at91/generic.h
@@ -0,0 +1,14 @@
+/*
+ * linux/arch/arm/mach-at91/generic.h
+ *
+ *  Copyright (C) 2005 David Brownell
+ *
+ * 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.
+ */
+
+ /* Clocks */
+extern int __init at91_clock_init(unsigned long main_clock);
+struct device_d;
+extern void __init at91_clock_associate(const char *id, struct device_d *dev, const char *func);
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c
index 1cafaf7..b257128 100644
--- a/arch/arm/mach-at91/gpio.c
+++ b/arch/arm/mach-at91/gpio.c
@@ -22,6 +22,7 @@
  */
 
 #include <common.h>
+#include <linux/clk.h>
 #include <errno.h>
 #include <asm/io.h>
 #include <mach/gpio.h>
@@ -245,6 +246,8 @@ int at91_gpio_init(struct at91_gpio_bank *data, int nr_banks)
 		data->regbase = data->offset +
 			(void __iomem *)AT91_BASE_SYS;
 
+		/* enable PIO controller's clock */
+		clk_enable(data->clock);
 
 		/* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */
 		if (last && last->id == data->id)
diff --git a/arch/arm/mach-at91/include/mach/at91_dbgu.h b/arch/arm/mach-at91/include/mach/at91_dbgu.h
new file mode 100644
index 0000000..6dcaa77
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/at91_dbgu.h
@@ -0,0 +1,66 @@
+/*
+ * arch/arm/mach-at91/include/mach/at91_dbgu.h
+ *
+ * Copyright (C) 2005 Ivan Kokshaysky
+ * Copyright (C) SAN People
+ *
+ * Debug Unit (DBGU) - System peripherals registers.
+ * Based on AT91RM9200 datasheet revision E.
+ *
+ * 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 AT91_DBGU_H
+#define AT91_DBGU_H
+
+#ifdef AT91_DBGU
+#define AT91_DBGU_CR		(AT91_DBGU + 0x00)	/* Control Register */
+#define AT91_DBGU_MR		(AT91_DBGU + 0x04)	/* Mode Register */
+#define AT91_DBGU_IER		(AT91_DBGU + 0x08)	/* Interrupt Enable Register */
+#define		AT91_DBGU_TXRDY		(1 << 1)		/* Transmitter Ready */
+#define		AT91_DBGU_TXEMPTY	(1 << 9)		/* Transmitter Empty */
+#define AT91_DBGU_IDR		(AT91_DBGU + 0x0c)	/* Interrupt Disable Register */
+#define AT91_DBGU_IMR		(AT91_DBGU + 0x10)	/* Interrupt Mask Register */
+#define AT91_DBGU_SR		(AT91_DBGU + 0x14)	/* Status Register */
+#define AT91_DBGU_RHR		(AT91_DBGU + 0x18)	/* Receiver Holding Register */
+#define AT91_DBGU_THR		(AT91_DBGU + 0x1c)	/* Transmitter Holding Register */
+#define AT91_DBGU_BRGR		(AT91_DBGU + 0x20)	/* Baud Rate Generator Register */
+
+#define AT91_DBGU_CIDR		(AT91_DBGU + 0x40)	/* Chip ID Register */
+#define AT91_DBGU_EXID		(AT91_DBGU + 0x44)	/* Chip ID Extension Register */
+#define AT91_DBGU_FNR		(AT91_DBGU + 0x48)	/* Force NTRST Register [SAM9 only] */
+#define		AT91_DBGU_FNTRST	(1 << 0)		/* Force NTRST */
+
+#endif /* AT91_DBGU */
+
+/*
+ * Some AT91 parts that don't have full DEBUG units still support the ID
+ * and extensions register.
+ */
+#define		AT91_CIDR_VERSION	(0x1f << 0)		/* Version of the Device */
+#define		AT91_CIDR_EPROC		(7    << 5)		/* Embedded Processor */
+#define		AT91_CIDR_NVPSIZ	(0xf  << 8)		/* Nonvolatile Program Memory Size */
+#define		AT91_CIDR_NVPSIZ2	(0xf  << 12)		/* Second Nonvolatile Program Memory Size */
+#define		AT91_CIDR_SRAMSIZ	(0xf  << 16)		/* Internal SRAM Size */
+#define			AT91_CIDR_SRAMSIZ_1K	(1 << 16)
+#define			AT91_CIDR_SRAMSIZ_2K	(2 << 16)
+#define			AT91_CIDR_SRAMSIZ_112K	(4 << 16)
+#define			AT91_CIDR_SRAMSIZ_4K	(5 << 16)
+#define			AT91_CIDR_SRAMSIZ_80K	(6 << 16)
+#define			AT91_CIDR_SRAMSIZ_160K	(7 << 16)
+#define			AT91_CIDR_SRAMSIZ_8K	(8 << 16)
+#define			AT91_CIDR_SRAMSIZ_16K	(9 << 16)
+#define			AT91_CIDR_SRAMSIZ_32K	(10 << 16)
+#define			AT91_CIDR_SRAMSIZ_64K	(11 << 16)
+#define			AT91_CIDR_SRAMSIZ_128K	(12 << 16)
+#define			AT91_CIDR_SRAMSIZ_256K	(13 << 16)
+#define			AT91_CIDR_SRAMSIZ_96K	(14 << 16)
+#define			AT91_CIDR_SRAMSIZ_512K	(15 << 16)
+#define		AT91_CIDR_ARCH		(0xff << 20)		/* Architecture Identifier */
+#define		AT91_CIDR_NVPTYP	(7    << 28)		/* Nonvolatile Program Memory Type */
+#define		AT91_CIDR_EXT		(1    << 31)		/* Extension Flag */
+
+#endif
diff --git a/arch/arm/mach-at91/include/mach/clk.h b/arch/arm/mach-at91/include/mach/clk.h
deleted file mode 100644
index a9c0683..0000000
--- a/arch/arm/mach-at91/include/mach/clk.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * (C) Copyright 2007
- * Stelian Pop <stelian.pop at leadtechdesign.com>
- * Lead Tech Design <www.leadtechdesign.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
- */
-#ifndef __ASM_ARM_ARCH_CLK_H__
-#define __ASM_ARM_ARCH_CLK_H__
-
-#include <mach/hardware.h>
-
-static inline unsigned long get_macb_pclk_rate(unsigned int dev_id)
-{
-	return AT91_MASTER_CLOCK;
-}
-
-static inline unsigned long get_usart_clk_rate(unsigned int dev_id)
-{
-	return AT91_MASTER_CLOCK;
-}
-
-#endif /* __ASM_ARM_ARCH_CLK_H__ */
diff --git a/arch/arm/mach-at91/include/mach/cpu.h b/arch/arm/mach-at91/include/mach/cpu.h
new file mode 100644
index 0000000..833659d
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/cpu.h
@@ -0,0 +1,158 @@
+/*
+ * arch/arm/mach-at91/include/mach/cpu.h
+ *
+ *  Copyright (C) 2006 SAN People
+ *
+ * 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 __ASM_ARCH_CPU_H
+#define __ASM_ARCH_CPU_H
+
+#include <mach/hardware.h>
+#include <mach/at91_dbgu.h>
+
+
+#define ARCH_ID_AT91RM9200	0x09290780
+#define ARCH_ID_AT91SAM9260	0x019803a0
+#define ARCH_ID_AT91SAM9261	0x019703a0
+#define ARCH_ID_AT91SAM9263	0x019607a0
+#define ARCH_ID_AT91SAM9G10	0x019903a0
+#define ARCH_ID_AT91SAM9G20	0x019905a0
+#define ARCH_ID_AT91SAM9RL64	0x019b03a0
+#define ARCH_ID_AT91SAM9G45	0x819b05a0
+#define ARCH_ID_AT91SAM9G45MRL	0x819b05a2	/* aka 9G45-ES2 & non ES lots */
+#define ARCH_ID_AT91SAM9G45ES	0x819b05a1	/* 9G45-ES (Engineering Sample) */
+#define ARCH_ID_AT91CAP9	0x039A03A0
+
+#define ARCH_ID_AT91SAM9XE128	0x329973a0
+#define ARCH_ID_AT91SAM9XE256	0x329a93a0
+#define ARCH_ID_AT91SAM9XE512	0x329aa3a0
+
+#define ARCH_ID_AT572D940HF	0x0e0303e0
+
+#define ARCH_ID_AT91M40800	0x14080044
+#define ARCH_ID_AT91R40807	0x44080746
+#define ARCH_ID_AT91M40807	0x14080745
+#define ARCH_ID_AT91R40008	0x44000840
+
+static inline unsigned long at91_cpu_identify(void)
+{
+	return (at91_sys_read(AT91_DBGU_CIDR) & ~AT91_CIDR_VERSION);
+}
+
+static inline unsigned long at91_cpu_fully_identify(void)
+{
+	return at91_sys_read(AT91_DBGU_CIDR);
+}
+
+#define ARCH_EXID_AT91SAM9M11	0x00000001
+#define ARCH_EXID_AT91SAM9M10	0x00000002
+#define ARCH_EXID_AT91SAM9G45	0x00000004
+
+static inline unsigned long at91_exid_identify(void)
+{
+	return at91_sys_read(AT91_DBGU_EXID);
+}
+
+
+#define ARCH_FAMILY_AT91X92	0x09200000
+#define ARCH_FAMILY_AT91SAM9	0x01900000
+#define ARCH_FAMILY_AT91SAM9XE	0x02900000
+
+static inline unsigned long at91_arch_identify(void)
+{
+	return (at91_sys_read(AT91_DBGU_CIDR) & AT91_CIDR_ARCH);
+}
+
+#ifdef CONFIG_ARCH_AT91CAP9
+#include <mach/at91_pmc.h>
+
+#define ARCH_REVISION_CAP9_B	0x399
+#define ARCH_REVISION_CAP9_C	0x601
+
+static inline unsigned long at91cap9_rev_identify(void)
+{
+	return (at91_sys_read(AT91_PMC_VER));
+}
+#endif
+
+#ifdef CONFIG_ARCH_AT91RM9200
+#define cpu_is_at91rm9200()	(at91_cpu_identify() == ARCH_ID_AT91RM9200)
+#else
+#define cpu_is_at91rm9200()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9260
+#define cpu_is_at91sam9xe()	(at91_arch_identify() == ARCH_FAMILY_AT91SAM9XE)
+#define cpu_is_at91sam9260()	((at91_cpu_identify() == ARCH_ID_AT91SAM9260) || cpu_is_at91sam9xe())
+#else
+#define cpu_is_at91sam9xe()	(0)
+#define cpu_is_at91sam9260()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9G20
+#define cpu_is_at91sam9g20()	(at91_cpu_identify() == ARCH_ID_AT91SAM9G20)
+#else
+#define cpu_is_at91sam9g20()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9261
+#define cpu_is_at91sam9261()	(at91_cpu_identify() == ARCH_ID_AT91SAM9261)
+#else
+#define cpu_is_at91sam9261()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9G10
+#define cpu_is_at91sam9g10()	((at91_cpu_identify() & ~AT91_CIDR_EXT)	== ARCH_ID_AT91SAM9G10)
+#else
+#define cpu_is_at91sam9g10()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9263
+#define cpu_is_at91sam9263()	(at91_cpu_identify() == ARCH_ID_AT91SAM9263)
+#else
+#define cpu_is_at91sam9263()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9RL
+#define cpu_is_at91sam9rl()	(at91_cpu_identify() == ARCH_ID_AT91SAM9RL64)
+#else
+#define cpu_is_at91sam9rl()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91SAM9G45
+#define cpu_is_at91sam9g45()	(at91_cpu_identify() == ARCH_ID_AT91SAM9G45)
+#define cpu_is_at91sam9g45es()	(at91_cpu_fully_identify() == ARCH_ID_AT91SAM9G45ES)
+#else
+#define cpu_is_at91sam9g45()	(0)
+#define cpu_is_at91sam9g45es()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT91CAP9
+#define cpu_is_at91cap9()	(at91_cpu_identify() == ARCH_ID_AT91CAP9)
+#define cpu_is_at91cap9_revB()	(at91cap9_rev_identify() == ARCH_REVISION_CAP9_B)
+#define cpu_is_at91cap9_revC()	(at91cap9_rev_identify() == ARCH_REVISION_CAP9_C)
+#else
+#define cpu_is_at91cap9()	(0)
+#define cpu_is_at91cap9_revB()	(0)
+#define cpu_is_at91cap9_revC()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_AT572D940HF
+#define cpu_is_at572d940hf() (at91_cpu_identify() == ARCH_ID_AT572D940HF)
+#else
+#define cpu_is_at572d940hf() (0)
+#endif
+
+/*
+ * Since this is ARM, we will never run on any AVR32 CPU. But these
+ * definitions may reduce clutter in common drivers.
+ */
+#define cpu_is_at32ap7000()	(0)
+
+#endif
diff --git a/arch/arm/mach-at91/include/mach/gpio.h b/arch/arm/mach-at91/include/mach/gpio.h
index 76d53ba..7e1a9a8 100644
--- a/arch/arm/mach-at91/include/mach/gpio.h
+++ b/arch/arm/mach-at91/include/mach/gpio.h
@@ -241,6 +241,7 @@ struct at91_gpio_bank {
 	struct at91_gpio_bank *next;	/* bank sharing same IRQ/clock/... */
 	unsigned short id;		/* peripheral ID */
 	unsigned long offset;		/* offset from system peripheral base */
+	struct clk *clock;
 };
 
 extern int at91_gpio_init(struct at91_gpio_bank *data, int nr_banks);
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 4feeed0..6864119 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -48,7 +48,7 @@
 #include <errno.h>
 #include <asm/io.h>
 #include <mach/board.h>
-#include <mach/clk.h>
+#include <linux/clk.h>
 
 #include "macb.h"
 
@@ -412,6 +412,9 @@ static int macb_probe(struct device_d *dev)
 	unsigned long macb_hz;
 	u32 ncfgr;
 	struct at91_ether_platform_data *pdata;
+#if defined(CONFIG_ARCH_AT91)
+	struct clk *pclk;
+#endif
 
 	if (!dev->platform_data) {
 		printf("macb: no platform_data\n");
@@ -450,7 +453,13 @@ static int macb_probe(struct device_d *dev)
 	 * Do some basic initialization so that we at least can talk
 	 * to the PHY
 	 */
+#if defined(CONFIG_ARCH_AT91)
+	pclk = clk_get(dev, "macb_clk");
+	clk_enable(pclk);
+	macb_hz = clk_get_rate(pclk);
+#else
 	macb_hz = get_macb_pclk_rate(0);
+#endif
 	if (macb_hz < 20000000)
 		ncfgr = MACB_BF(CLK, MACB_CLK_DIV8);
 	else if (macb_hz < 40000000)
diff --git a/drivers/serial/atmel.c b/drivers/serial/atmel.c
index e9e8116..b99ec4d 100644
--- a/drivers/serial/atmel.c
+++ b/drivers/serial/atmel.c
@@ -22,7 +22,7 @@
 #include <init.h>
 #include <malloc.h>
 #include <asm/io.h>
-#include <mach/clk.h>
+#include <linux/clk.h>
 
 /* USART3 register offsets */
 #define USART3_CR				0x0000
@@ -309,6 +309,21 @@
 		    << USART3_##name##_OFFSET))		\
 	 | USART3_BF(name,value))
 
+/*
+ * We wrap our port structure around the generic console_device.
+ */
+struct atmel_uart_port {
+	struct console_device	uart;		/* uart */
+	struct clk		*clk;		/* uart clock */
+	u32			uartclk;
+};
+
+static inline struct atmel_uart_port *
+to_atmel_uart_port(struct console_device *uart)
+{
+	return container_of(uart, struct atmel_uart_port, uart);
+}
+
 static void atmel_serial_putc(struct console_device *cdev, char c)
 {
 	struct device_d *dev = cdev->dev;
@@ -336,16 +351,15 @@ static int atmel_serial_getc(struct console_device *cdev)
 static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate)
 {
 	struct device_d *dev = cdev->dev;
+	struct atmel_uart_port *uart = to_atmel_uart_port(cdev);
 	unsigned long divisor;
-	unsigned long usart_hz;
 
 	/*
 	 *              Master Clock
 	 * Baud Rate = --------------
 	 *                16 * CD
 	 */
-	usart_hz = get_usart_clk_rate(0);
-	divisor = (usart_hz / 16 + baudrate / 2) / baudrate;
+	divisor = (uart->uartclk / 16 + baudrate / 2) / baudrate;
 	writel(USART3_BF(CD, divisor), dev->map_base + USART3_BRGR);
 
 	return 0;
@@ -359,6 +373,11 @@ static int atmel_serial_setbaudrate(struct console_device *cdev, int baudrate)
 static int atmel_serial_init_port(struct console_device *cdev)
 {
 	struct device_d *dev = cdev->dev;
+	struct atmel_uart_port *uart = to_atmel_uart_port(cdev);
+
+	uart->clk = clk_get(dev, "usart");
+	clk_enable(uart->clk);
+	uart->uartclk = clk_get_rate(uart->clk);
 
 	writel(USART3_BIT(RSTRX) | USART3_BIT(RSTTX), dev->map_base + USART3_CR);
 
@@ -376,9 +395,12 @@ static int atmel_serial_init_port(struct console_device *cdev)
 
 static int atmel_serial_probe(struct device_d *dev)
 {
+	struct atmel_uart_port *uart;
 	struct console_device *cdev;
 
-	cdev = malloc(sizeof(struct console_device));
+	uart = malloc(sizeof(struct atmel_uart_port));
+
+	cdev = &uart->uart;
 	dev->type_data = cdev;
 	cdev->dev = dev;
 	cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug  4 02:14:33 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 08:14:33 +0200
Subject: [PATCH] stddef: introduce true/false enum
Message-ID: <1280902473-12183-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/linux/stddef.h |    5 +++++
 include/xyzModem.h     |    3 ---
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/include/linux/stddef.h b/include/linux/stddef.h
index 81e34c2..e366328 100644
--- a/include/linux/stddef.h
+++ b/include/linux/stddef.h
@@ -8,6 +8,11 @@
 #define NULL ((void *)0)
 #endif
 
+enum {
+	false	= 0,
+	true	= 1
+};
+
 #ifndef _SIZE_T
 #include <linux/types.h>
 #endif
diff --git a/include/xyzModem.h b/include/xyzModem.h
index 9723e73..a3ea768 100644
--- a/include/xyzModem.h
+++ b/include/xyzModem.h
@@ -97,9 +97,6 @@ typedef struct {
 #endif
 } connection_info_t;
 
-#define false 0
-#define true 1
-
 #endif
 
 
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug  4 02:15:33 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed,  4 Aug 2010 08:15:33 +0200
Subject: [PATCH] gitignore: ignore .orig and .patch files
Message-ID: <1280902533-12387-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 .gitignore |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore
index 6f04601..3577153 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,7 @@
 *.symtypes
 *.elf
 *.mcp
+*.orig
 
 #
 # Top-level generic files
@@ -59,3 +60,6 @@ series
 
 # cscope files
 cscope.*
+
+# patches
+*.patch
-- 
1.7.1



From s.hauer at pengutronix.de  Wed Aug  4 02:46:00 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Wed, 4 Aug 2010 08:46:00 +0200
Subject: [PATCH 3/6] amba: add pl011
In-Reply-To: <1280886239-19133-3-git-send-email-plagnioj@jcrosoft.com>
References: <20100804014227.GA16337@game.jcrosoft.org>
	<1280886239-19133-1-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-2-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-3-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100804064600.GQ14113@pengutronix.de>

On Wed, Aug 04, 2010 at 03:43:56AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> +++ b/drivers/serial/amba-pl011.c
> @@ -0,0 +1,192 @@
> +/*
> + * (C) Copyright 2000
> + * Rob Taylor, Flying Pig Systems. robt at flyingpig.com.
> + *
> + * (C) Copyright 2004
> + * ARM Ltd.
> + * Philippe Robin, <philippe.robin at arm.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
> + */
> +
> +/* Simple U-Boot driver for the PrimeCell PL010/PL011 UARTs */

We already have a driver for the pl010 in the tree, so I would expect
arguments like 'this one is much more flexible, drop the old one', or
'the pl011 is totally different' (which doesn't seem to be the case).

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Wed Aug  4 02:46:41 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Wed, 4 Aug 2010 09:46:41 +0300
Subject: [PATCH 0/3] arm/imx: serial number / UID support
In-Reply-To: <20100802120213.GC13044@game.jcrosoft.org>
References: <cover.1280749932.git.baruch@tkos.co.il>
	<20100802120213.GC13044@game.jcrosoft.org>
Message-ID: <20100804064641.GB17208@jasper.tkos.co.il>

Hi Jean-Christophe,

On Mon, Aug 02, 2010 at 02:02:13PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> 	serial number is more for board ref than CPU ref
> 	as you can easly read it from the register.
> 
> 	So why pass it via the ATAG?

The point of the serial number ATAG is to uniquely identify the system.  
Getting this unique ID from the CPU is as good as any other IMO. I'm not aware 
of any other UID source on the mx25 3DS system. Besides, having the serial 
number nicely listed in /proc/cpuinfo is far easier than reading registers.

Anyway, patches 1 and 2 in this series are useful on their own, I think. I 
intend to use this functionality for our own board. I've added the mx25 3ds 
two lines patch to justify the bloat :).

baruch

> Best Regards,
> J.
> On 14:58 Mon 02 Aug     , Baruch Siach wrote:
> > This patch series adds support for the serial ATAG, and uses this functionality 
> > to pass the i.MX25 chip UID as a serial number to the Linux kernel.
> > 
> > Baruch Siach (3):
> >   arm: add support for the serial ATAG
> >   imx25: add support for UID read from eFuse
> >   mx25 3ds: set CPU UID
> > 
> >  arch/arm/boards/freescale-mx25-3-stack/3stack.c |    2 ++
> >  arch/arm/include/asm/armlinux.h                 |    4 ++++
> >  arch/arm/lib/armlinux.c                         |   19 +++++++++++++++++++
> >  arch/arm/mach-imx/imx25.c                       |   12 ++++++++++++
> >  arch/arm/mach-imx/include/mach/generic.h        |    1 +
> >  arch/arm/mach-imx/include/mach/imx25-regs.h     |    3 +++
> >  6 files changed, 41 insertions(+), 0 deletions(-)

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From baruch at tkos.co.il  Wed Aug  4 02:50:08 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Wed, 4 Aug 2010 09:50:08 +0300
Subject: [PATCH] init.h: introduce fake define (__init & __initdata) to
	simplify the linux sync
In-Reply-To: <1280888414-22759-1-git-send-email-plagnioj@jcrosoft.com>
References: <1280888414-22759-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100804065008.GC17208@jasper.tkos.co.il>

Hi Jean-Christophe,

On Wed, Aug 04, 2010 at 04:20:14AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
>  include/init.h |    6 ++++++
>  1 files changed, 6 insertions(+), 0 deletions(-)
> 
> diff --git a/include/init.h b/include/init.h
> index c5dea07..accc4d0 100644
> --- a/include/init.h
> +++ b/include/init.h
> @@ -1,6 +1,12 @@
>  #ifndef _INIT_H
>  #define _INIT_H
>  
> +/*
> + * fake define to simplify the linux sync
> + */
> +#define __init
> +#define __initdata
> +

IMO, having useless __init/__initdata in the code adds noise, and reduces 
readability.  These can be easily removed as code gets moved from Linux to 
Barebox.

baruch

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From s.hauer at pengutronix.de  Wed Aug  4 03:42:53 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Wed, 4 Aug 2010 09:42:53 +0200
Subject: [PATCH] cfi_flash_intel: support 1024b buffer write
In-Reply-To: <1280483395-9043-1-git-send-email-eric@eukrea.com>
References: <1280483395-9043-1-git-send-email-eric@eukrea.com>
Message-ID: <20100804074253.GS14113@pengutronix.de>

On Fri, Jul 30, 2010 at 11:49:55AM +0200, Eric B?nard wrote:
> newer Numonyx Strataflash P3x have 1024b buffer, thus, it's possible
> to write a buffer size of 0x200 which the actual flash_write_cmd
> doesn't permit as it's limited to a uchar parameter.

So I guess these chips have 16 data lines?

Unfortunately this won't work when two of these are parallel. You'd have
to duplicate the command for the upper 16 bit.

Sascha

> 
> Signed-off-by: Eric B?nard <eric at eukrea.com>
> ---
>  drivers/nor/cfi_flash.c       |   11 +++++++++++
>  drivers/nor/cfi_flash.h       |    1 +
>  drivers/nor/cfi_flash_intel.c |    5 ++++-
>  3 files changed, 16 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c
> index fa5e5ee..6f45da6 100644
> --- a/drivers/nor/cfi_flash.c
> +++ b/drivers/nor/cfi_flash.c
> @@ -886,6 +886,17 @@ void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, u
>  	flash_write_word(info, cword, addr);
>  }
>  
> +void flash_write_cmd16 (struct flash_info *info, flash_sect_t sect, uint offset, ushort cmd)
> +{
> +
> +	uchar *addr;
> +	cfiword_t cword;
> +
> +	addr = flash_make_addr (info, sect, offset);
> +	cword.w = cmd;
> +	flash_write_word(info, cword, addr);
> +}
> +
>  int flash_isequal (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd)
>  {
>  	cfiptr_t cptr;
> diff --git a/drivers/nor/cfi_flash.h b/drivers/nor/cfi_flash.h
> index 057e56c..d7e6ea2 100644
> --- a/drivers/nor/cfi_flash.h
> +++ b/drivers/nor/cfi_flash.h
> @@ -189,6 +189,7 @@ extern struct cfi_cmd_set cfi_cmd_set_amd;
>  
>  int flash_isset (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
>  void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
> +void flash_write_cmd16 (struct flash_info * info, flash_sect_t sect, uint offset, ushort cmd);
>  flash_sect_t find_sector (struct flash_info *info, ulong addr);
>  int flash_status_check (struct flash_info *info, flash_sect_t sector,
>  			       uint64_t tout, char *prompt);
> diff --git a/drivers/nor/cfi_flash_intel.c b/drivers/nor/cfi_flash_intel.c
> index 4344760..96bf33f 100644
> --- a/drivers/nor/cfi_flash_intel.c
> +++ b/drivers/nor/cfi_flash_intel.c
> @@ -71,7 +71,10 @@ static int intel_flash_write_cfibuffer (struct flash_info *info, ulong dest, con
>  	/* reduce the number of loops by the width of the port	*/
>  	cnt = len >> (info->portwidth - 1);
>  
> -	flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
> +	if (cnt >= 0x100)
> +		flash_write_cmd16 (info, sector, 0, (ushort) cnt - 1);
> +	else
> +		flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
>  	while (cnt-- > 0) {
>  		if (bankwidth_is_1(info)) {
>  			*dst.cp++ = *src.cp++;
> -- 
> 1.6.3.3
> 
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From eric at eukrea.com  Wed Aug  4 03:48:48 2010
From: eric at eukrea.com (=?ISO-8859-15?Q?Eric_B=E9nard?=)
Date: Wed, 04 Aug 2010 09:48:48 +0200
Subject: [PATCH] cfi_flash_intel: support 1024b buffer write
In-Reply-To: <20100804074253.GS14113@pengutronix.de>
References: <1280483395-9043-1-git-send-email-eric@eukrea.com>
	<20100804074253.GS14113@pengutronix.de>
Message-ID: <4C591B60.7090204@eukrea.com>

Hi Sascha,

Le 04/08/2010 09:42, Sascha Hauer a ?crit :
> On Fri, Jul 30, 2010 at 11:49:55AM +0200, Eric B?nard wrote:
>> newer Numonyx Strataflash P3x have 1024b buffer, thus, it's possible
>> to write a buffer size of 0x200 which the actual flash_write_cmd
>> doesn't permit as it's limited to a uchar parameter.
>
> So I guess these chips have 16 data lines?
>
actual flash_write_cmd is also used on chips with 16 data lines (like 
P30 or P33 Numonyx).

>
 >Unfortunately this won't work when two of these are parallel. You'd have
> to duplicate the command for the upper 16 bit.
>
Does actual flash_write_cmd works when 2 chips are parallel ?

Eric

> Sascha
>
>>
>> Signed-off-by: Eric B?nard<eric at eukrea.com>
>> ---
>>   drivers/nor/cfi_flash.c       |   11 +++++++++++
>>   drivers/nor/cfi_flash.h       |    1 +
>>   drivers/nor/cfi_flash_intel.c |    5 ++++-
>>   3 files changed, 16 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c
>> index fa5e5ee..6f45da6 100644
>> --- a/drivers/nor/cfi_flash.c
>> +++ b/drivers/nor/cfi_flash.c
>> @@ -886,6 +886,17 @@ void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, u
>>   	flash_write_word(info, cword, addr);
>>   }
>>
>> +void flash_write_cmd16 (struct flash_info *info, flash_sect_t sect, uint offset, ushort cmd)
>> +{
>> +
>> +	uchar *addr;
>> +	cfiword_t cword;
>> +
>> +	addr = flash_make_addr (info, sect, offset);
>> +	cword.w = cmd;
>> +	flash_write_word(info, cword, addr);
>> +}
>> +
>>   int flash_isequal (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd)
>>   {
>>   	cfiptr_t cptr;
>> diff --git a/drivers/nor/cfi_flash.h b/drivers/nor/cfi_flash.h
>> index 057e56c..d7e6ea2 100644
>> --- a/drivers/nor/cfi_flash.h
>> +++ b/drivers/nor/cfi_flash.h
>> @@ -189,6 +189,7 @@ extern struct cfi_cmd_set cfi_cmd_set_amd;
>>
>>   int flash_isset (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
>>   void flash_write_cmd (struct flash_info *info, flash_sect_t sect, uint offset, uchar cmd);
>> +void flash_write_cmd16 (struct flash_info * info, flash_sect_t sect, uint offset, ushort cmd);
>>   flash_sect_t find_sector (struct flash_info *info, ulong addr);
>>   int flash_status_check (struct flash_info *info, flash_sect_t sector,
>>   			       uint64_t tout, char *prompt);
>> diff --git a/drivers/nor/cfi_flash_intel.c b/drivers/nor/cfi_flash_intel.c
>> index 4344760..96bf33f 100644
>> --- a/drivers/nor/cfi_flash_intel.c
>> +++ b/drivers/nor/cfi_flash_intel.c
>> @@ -71,7 +71,10 @@ static int intel_flash_write_cfibuffer (struct flash_info *info, ulong dest, con
>>   	/* reduce the number of loops by the width of the port	*/
>>   	cnt = len>>  (info->portwidth - 1);
>>
>> -	flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
>> +	if (cnt>= 0x100)
>> +		flash_write_cmd16 (info, sector, 0, (ushort) cnt - 1);
>> +	else
>> +		flash_write_cmd (info, sector, 0, (uchar) cnt - 1);
>>   	while (cnt-->  0) {
>>   		if (bankwidth_is_1(info)) {
>>   			*dst.cp++ = *src.cp++;
>> --
>> 1.6.3.3
>>
>>
>



From baruch at tkos.co.il  Wed Aug  4 03:55:09 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Wed,  4 Aug 2010 10:55:09 +0300
Subject: [PATCH] imx25: fix UID endianess
Message-ID: <4c20bb0835da4ee29ec620cc895a64562b06ff2e.1280908400.git.baruch@tkos.co.il>

Apparently, the UID is little-endian. Reverse endianess, and add a note in
comment.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/imx25.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-imx/imx25.c b/arch/arm/mach-imx/imx25.c
index de70247..70494aa 100644
--- a/arch/arm/mach-imx/imx25.c
+++ b/arch/arm/mach-imx/imx25.c
@@ -35,8 +35,14 @@ u64 imx_uid(void)
 	u64 uid = 0;
 	int i;
 
+	/*
+	 * This code assumes that the UID is stored little-endian. The 
+	 * Freescale AN3682 document is silent about the endianess, but
+	 * experimentation shows that this is the case. All other multi-byte
+	 * values in IIM are big-endian as per AN3682.
+	 */
 	for (i = 0; i < 8; i++)
-		uid = (uid << 8) | readb(IMX_IIM_BASE + IIM_UID + i*4);
+		uid |= (u64)readb(IMX_IIM_BASE + IIM_UID + i*4) << (i*8);
 
 	return uid;
 }
-- 
1.7.1



From s.hauer at pengutronix.de  Wed Aug  4 04:00:51 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Wed, 4 Aug 2010 10:00:51 +0200
Subject: [PATCH] cfi_flash_intel: support 1024b buffer write
In-Reply-To: <4C591B60.7090204@eukrea.com>
References: <1280483395-9043-1-git-send-email-eric@eukrea.com>
	<20100804074253.GS14113@pengutronix.de>
	<4C591B60.7090204@eukrea.com>
Message-ID: <20100804080051.GT14113@pengutronix.de>

On Wed, Aug 04, 2010 at 09:48:48AM +0200, Eric B?nard wrote:
> Hi Sascha,
>
> Le 04/08/2010 09:42, Sascha Hauer a ?crit :
>> On Fri, Jul 30, 2010 at 11:49:55AM +0200, Eric B?nard wrote:
>>> newer Numonyx Strataflash P3x have 1024b buffer, thus, it's possible
>>> to write a buffer size of 0x200 which the actual flash_write_cmd
>>> doesn't permit as it's limited to a uchar parameter.
>>
>> So I guess these chips have 16 data lines?
>>
> actual flash_write_cmd is also used on chips with 16 data lines (like  
> P30 or P33 Numonyx).

Yes. I meant that 8 wouldn't be enough because the command gets
wider than 8bit.

>
>>
> >Unfortunately this won't work when two of these are parallel. You'd have
>> to duplicate the command for the upper 16 bit.
>>
> Does actual flash_write_cmd works when 2 chips are parallel ?

At least it's supposed to ;)

See flash_make_cmd, it iterates over all bytes in info->portwidth and
writes cmd or 0 into the buffer depending on info->chipwidth.

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Wed Aug  4 04:04:10 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Wed,  4 Aug 2010 11:04:10 +0300
Subject: [PATCH] md: fix help text
Message-ID: <dc1d8290e67d38ef25daa2a86b8547afafa71ed3.1280909003.git.baruch@tkos.co.il>

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 commands/mem.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/commands/mem.c b/commands/mem.c
index bd1d349..d609805 100644
--- a/commands/mem.c
+++ b/commands/mem.c
@@ -217,7 +217,6 @@ static const __maybe_unused char cmd_md_help[] =
 "display (hexdump) a memory region.\n"
 "options:\n"
 "  -s <file>   display file (default /dev/mem)\n"
-"  -d <file>   write file (default /dev/mem)\n"
 "  -b          output in bytes\n"
 "  -w          output in halfwords (16bit)\n"
 "  -l          output in words (32bit)\n"
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:38:49 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed, 4 Aug 2010 11:38:49 +0200
Subject: [PATCH] beagle: add bootparams and architecture
Message-ID: <20100804093849.GA19882@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 arch/arm/boards/omap/board-beagle.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boards/omap/board-beagle.c b/arch/arm/boards/omap/board-beagle.c
index da59a93..5daad86 100644
--- a/arch/arm/boards/omap/board-beagle.c
+++ b/arch/arm/boards/omap/board-beagle.c
@@ -269,6 +269,8 @@ static int beagle_devices_init(void)
 	gpmc_generic_nand_devices_init(0, 16, 1);
 
 	armlinux_add_dram(&sdram_dev);
+	armlinux_set_bootparams((void *)0x80000100);
+	armlinux_set_architecture(MACH_TYPE_OMAP3_BEAGLE);
 failed:
 	return ret;
 }
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:05 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:05 +0200
Subject: [PATCH 01/13] i2c: Add missing defines for omap
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-2-git-send-email-m.grzeschik@pengutronix.de>

From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 include/i2c/i2c.h |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/include/i2c/i2c.h b/include/i2c/i2c.h
index c031bbb..2507d68 100644
--- a/include/i2c/i2c.h
+++ b/include/i2c/i2c.h
@@ -30,6 +30,8 @@ struct i2c_platform_data {
 #define I2C_NAME_SIZE	20
 
 #define I2C_M_RD		0x0001	/* read data, from slave to master */
+#define I2C_M_TEN               0x0010  /* this is a ten bit chip address */
+#define I2C_M_IGNORE_NAK        0x1000  /* if I2C_FUNC_PROTOCOL_MANGLING */
 
 /**
  * struct i2c_msg - an I2C transaction segment beginning with START
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:09 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:09 +0200
Subject: [PATCH 05/13] arm omap: Add cpu_is_ macros
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-6-git-send-email-m.grzeschik@pengutronix.de>

From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 arch/arm/mach-omap/include/mach/generic.h |   19 +++++++++++++++++++
 1 files changed, 19 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-omap/include/mach/generic.h

diff --git a/arch/arm/mach-omap/include/mach/generic.h b/arch/arm/mach-omap/include/mach/generic.h
new file mode 100644
index 0000000..a2dd229
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/generic.h
@@ -0,0 +1,19 @@
+
+/* I2C controller revisions */
+#define OMAP_I2C_REV_2			0x20
+
+/* I2C controller revisions present on specific hardware */
+#define OMAP_I2C_REV_ON_2430		0x36
+#define OMAP_I2C_REV_ON_3430		0x3C
+
+#ifdef CONFIG_ARCH_OMAP
+#define cpu_is_omap2430()	(1)
+#else
+#define cpu_is_omap2430()	(0)
+#endif
+
+#ifdef CONFIG_ARCH_OMAP3
+#define cpu_is_omap34xx()	(1)
+#else
+#define cpu_is_omap34xx()	(0)
+#endif
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:13 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:13 +0200
Subject: [PATCH 09/13] ehci: add remove function
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-10-git-send-email-m.grzeschik@pengutronix.de>

and stop the ehci controller before the kernel is trying to restart it.

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 drivers/usb/host/ehci-hcd.c |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 1c266f3..802c548 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -898,6 +898,7 @@ static int ehci_probe(struct device_d *dev)
 
 	ehci = xmalloc(sizeof(struct ehci_priv));
 	host = &ehci->host;
+	dev->priv = ehci;
 
 	if (pdata) {
 		ehci->flags = pdata->flags;
@@ -926,9 +927,16 @@ static int ehci_probe(struct device_d *dev)
 	return 0;
 }
 
+static void ehci_remove(struct device_d *dev)
+{
+	struct ehci_priv *ehci = dev->priv;
+	ehci_halt(ehci);
+}
+
 static struct driver_d ehci_driver = {
 	.name  = "ehci",
 	.probe = ehci_probe,
+	.remove = ehci_remove,
 };
 
 static int ehcil_init(void)
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:10 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:10 +0200
Subject: [PATCH 06/13] beagle: Add missing pinmux for usb
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-7-git-send-email-m.grzeschik@pengutronix.de>

From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 arch/arm/boards/omap/board-beagle.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boards/omap/board-beagle.c b/arch/arm/boards/omap/board-beagle.c
index 5daad86..01c6cd2 100644
--- a/arch/arm/boards/omap/board-beagle.c
+++ b/arch/arm/boards/omap/board-beagle.c
@@ -189,6 +189,20 @@ static void mux_config(void)
 	MUX_VAL(CP(HSUSB0_DATA7), (IEN | PTD | DIS | M0));
 	/* I2C1_SCL default mux mode is mode0 */
 	/* I2C1_SDA default mux mode is mode0 */
+	/* USB EHCI (port 2) */
+	MUX_VAL(CP(MCSPI1_CS3),		(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(MCSPI2_CLK),		(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(MCSPI2_SIMO),	(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(MCSPI2_SOMI),	(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(MCSPI2_CS0),		(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(MCSPI2_CS1),		(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(ETK_D10_ES2),	(IDIS | PTU | DIS | M3));
+	MUX_VAL(CP(ETK_D11_ES2),	(IDIS | PTU | DIS | M3));
+	MUX_VAL(CP(ETK_D12_ES2),	(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(ETK_D13_ES2),	(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(ETK_D14_ES2),	(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(ETK_D15_ES2),	(IEN  | PTU | DIS | M3));
+	MUX_VAL(CP(UART2_RX),		(IEN  | PTD | DIS | M4)) /*GPIO_147*/;
 }
 
 /**
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:11 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:11 +0200
Subject: [PATCH 07/13] ehci: Make has_tt configurable via platform data
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-8-git-send-email-m.grzeschik@pengutronix.de>

From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 drivers/usb/host/ehci-hcd.c |   13 ++++++++-----
 include/usb/ehci.h          |    2 ++
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 8995fa3..1c266f3 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -899,22 +899,25 @@ static int ehci_probe(struct device_d *dev)
 	ehci = xmalloc(sizeof(struct ehci_priv));
 	host = &ehci->host;
 
-	if (pdata)
+	if (pdata) {
 		ehci->flags = pdata->flags;
-	else
+		ehci->hccr = (void *)(dev->map_base + pdata->hccr_offset);
+		ehci->hcor = (void *)(dev->map_base + pdata->hcor_offset);
+	}
+	else {
 		/* default to EHCI_HAS_TT to not change behaviour of boards
 		 * with platform_data
 		 */
 		ehci->flags = EHCI_HAS_TT;
+		ehci->hccr = (void *)(dev->map_base + 0x100);
+		ehci->hcor = (void *)(dev->map_base + 0x140);
+	}
 
 	host->init = ehci_init;
 	host->submit_int_msg = submit_int_msg;
 	host->submit_control_msg = submit_control_msg;
 	host->submit_bulk_msg = submit_bulk_msg;
 
-	ehci->hccr = (void *)(dev->map_base + 0x100);
-	ehci->hcor = (void *)(dev->map_base + 0x140);
-
 	usb_register_host(host);
 
 	reg = HC_VERSION(ehci_readl(&ehci->hccr->cr_capbase));
diff --git a/include/usb/ehci.h b/include/usb/ehci.h
index 3304b60..2ec862c 100644
--- a/include/usb/ehci.h
+++ b/include/usb/ehci.h
@@ -5,6 +5,8 @@
 
 struct ehci_platform_data {
 	unsigned long flags;
+	unsigned long hccr_offset;
+	unsigned long hcor_offset;
 };
 
 #endif  /* __USB_EHCI_H */
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:12 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:12 +0200
Subject: [PATCH 08/13] ehci: set CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS to 16
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-9-git-send-email-m.grzeschik@pengutronix.de>

From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 drivers/usb/host/ehci.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index af49249..07a1768 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -23,7 +23,7 @@
 #define USB_EHCI_H
 
 #if !defined(CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS)
-#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS	2
+#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS	16
 #endif
 
 /* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:04 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:04 +0200
Subject: [PATCH 00/13] OMAP/Beagleboard ehci support
Message-ID: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>

Hi all,

this patchseries adds ehci support for the beagleboard, which includes
i2c-omap, twl4030 phy and ehci-omap support.

Michael Grzeschik (4):
  ehci: add remove function
  usb: add twl4030 phy support
  ehci: add omap support
  beagle: add usb support

Sascha Hauer (9):
  i2c: Add missing defines for omap
  arm omap: Add I2C driver
  add twl4030 support
  arm omap: Add gpio support
  arm omap: Add cpu_is_ macros
  beagle: Add missing pinmux for usb
  ehci: Make has_tt configurable via platform data
  ehci: set CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS to 16
  add beagle board defconfig

 arch/arm/boards/omap/Kconfig                      |    2 +
 arch/arm/boards/omap/board-beagle.c               |   58 ++
 arch/arm/configs/omap3530_beagle_defconfig        |  257 +++++++
 arch/arm/mach-omap/Kconfig                        |   15 +-
 arch/arm/mach-omap/Makefile                       |    1 +
 arch/arm/mach-omap/gpio.c                         |  206 ++++++
 arch/arm/mach-omap/include/mach/cm-regbits-34xx.h |  799 ++++++++++++++++++++
 arch/arm/mach-omap/include/mach/ehci.h            |  109 +++
 arch/arm/mach-omap/include/mach/generic.h         |   19 +
 arch/arm/mach-omap/include/mach/gpio.h            |   92 +++
 arch/arm/mach-omap/include/mach/omap3-clock.h     |   11 +
 arch/arm/mach-omap/include/mach/omap3-silicon.h   |    6 +
 drivers/i2c/Kconfig                               |    8 +
 drivers/i2c/Makefile                              |    2 +
 drivers/i2c/i2c-omap.c                            |  803 +++++++++++++++++++++
 drivers/i2c/twl4030.c                             |  186 +++++
 drivers/usb/host/Kconfig                          |    4 +
 drivers/usb/host/Makefile                         |    1 +
 drivers/usb/host/ehci-hcd.c                       |   21 +-
 drivers/usb/host/ehci-omap.c                      |  260 +++++++
 drivers/usb/host/ehci.h                           |    2 +-
 drivers/usb/otg/Kconfig                           |    3 +
 drivers/usb/otg/Makefile                          |    2 +
 drivers/usb/otg/twl4030.c                         |  199 +++++
 include/i2c/i2c.h                                 |    2 +
 include/i2c/twl4030.h                             |  461 ++++++++++++
 include/usb/ehci.h                                |    2 +
 include/usb/twl4030.h                             |   28 +
 28 files changed, 3550 insertions(+), 9 deletions(-)
 create mode 100644 arch/arm/configs/omap3530_beagle_defconfig
 create mode 100644 arch/arm/mach-omap/gpio.c
 create mode 100644 arch/arm/mach-omap/include/mach/cm-regbits-34xx.h
 create mode 100644 arch/arm/mach-omap/include/mach/ehci.h
 create mode 100644 arch/arm/mach-omap/include/mach/generic.h
 create mode 100644 arch/arm/mach-omap/include/mach/gpio.h
 create mode 100644 drivers/i2c/i2c-omap.c
 create mode 100644 drivers/i2c/twl4030.c
 create mode 100644 drivers/usb/host/ehci-omap.c
 create mode 100644 drivers/usb/otg/twl4030.c
 create mode 100644 include/i2c/twl4030.h
 create mode 100644 include/usb/twl4030.h

cheers,
Michael

--
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:16 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:16 +0200
Subject: [PATCH 12/13] beagle: add usb support
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-13-git-send-email-m.grzeschik@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 arch/arm/boards/omap/Kconfig        |    2 +
 arch/arm/boards/omap/board-beagle.c |   44 +++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boards/omap/Kconfig b/arch/arm/boards/omap/Kconfig
index d612064..6012227 100644
--- a/arch/arm/boards/omap/Kconfig
+++ b/arch/arm/boards/omap/Kconfig
@@ -48,6 +48,8 @@ config MACH_BEAGLE
 	select MACH_HAS_LOWLEVEL_INIT
 	select OMAP_CLOCK_ALL
 	select HAS_OMAP_NAND
+	select USB_EHCI_OMAP
+	select USB_TWL4030
 	  help
 	  Say Y here if you are using Beagle Board
 
diff --git a/arch/arm/boards/omap/board-beagle.c b/arch/arm/boards/omap/board-beagle.c
index 01c6cd2..c0b6b43 100644
--- a/arch/arm/boards/omap/board-beagle.c
+++ b/arch/arm/boards/omap/board-beagle.c
@@ -59,6 +59,7 @@
 #include <asm/io.h>
 #include <ns16550.h>
 #include <asm/armlinux.h>
+#include <asm/mach-types.h>
 #include <mach/silicon.h>
 #include <mach/sdrc.h>
 #include <mach/sys_info.h>
@@ -67,6 +68,10 @@
 #include <mach/omap3-mux.h>
 #include <mach/gpmc.h>
 #include <mach/gpmc_nand.h>
+#include <mach/ehci.h>
+#include <i2c/i2c.h>
+#include <linux/err.h>
+#include <usb/ehci.h>
 #include "board.h"
 
 /******************** Board Boot Time *******************/
@@ -268,6 +273,40 @@ static struct device_d sdram_dev = {
 	.platform_data = &sram_pdata,
 };
 
+static struct omap_hcd omap_ehci_pdata = {
+	.port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
+	.port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
+	.port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+	.phy_reset  = 1,
+	.reset_gpio_port[0]  = -EINVAL,
+	.reset_gpio_port[1]  = 147,
+	.reset_gpio_port[2]  = -EINVAL
+};
+
+static struct ehci_platform_data ehci_pdata = {
+	.flags = 0,
+	.hccr_offset = 0x100,
+	.hcor_offset = 0x110,
+};
+
+static struct device_d usbh_dev = {
+	.name     = "ehci",
+	.map_base = 0x48064700,
+	.size     = 4 * 1024,
+	.platform_data = &ehci_pdata,
+};
+
+static struct device_d i2c_dev = {
+	.name		= "i2c-omap",
+	.map_base	= OMAP_I2C1_BASE,
+};
+
+static struct i2c_board_info i2c_devices[] = {
+	{
+		I2C_BOARD_INFO("twl4030", 0x48),
+	},
+};
+
 static int beagle_devices_init(void)
 {
 	int ret;
@@ -276,6 +315,11 @@ static int beagle_devices_init(void)
 	if (ret)
 		goto failed;
 
+	i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));
+	register_device(&i2c_dev);
+
+	if (ehci_omap_init(&omap_ehci_pdata) >= 0)
+		register_device(&usbh_dev);
 #ifdef CONFIG_GPMC
 	/* WP is made high and WAIT1 active Low */
 	gpmc_generic_init(0x10);
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:17 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:17 +0200
Subject: [PATCH 13/13] add beagle board defconfig
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-14-git-send-email-m.grzeschik@pengutronix.de>

From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 arch/arm/configs/omap3530_beagle_defconfig |  257 ++++++++++++++++++++++++++++
 1 files changed, 257 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/configs/omap3530_beagle_defconfig

diff --git a/arch/arm/configs/omap3530_beagle_defconfig b/arch/arm/configs/omap3530_beagle_defconfig
new file mode 100644
index 0000000..9f9a875
--- /dev/null
+++ b/arch/arm/configs/omap3530_beagle_defconfig
@@ -0,0 +1,257 @@
+#
+# Automatically generated make config: don't edit
+# barebox version: 2010.06.0
+# Wed Jun 23 14:18:59 2010
+#
+# CONFIG_BOARD_LINKER_SCRIPT is not set
+CONFIG_GENERIC_LINKER_SCRIPT=y
+CONFIG_ARM=y
+
+#
+# System Type
+#
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_AT91RM9200 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_NETX is not set
+CONFIG_ARCH_OMAP=y
+# CONFIG_ARCH_S3C24xx is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_V7=y
+CONFIG_CPU_32v7=y
+
+#
+# processor features
+#
+CONFIG_ARCH_TEXT_BASE=0x80e80000
+CONFIG_BOARDINFO="Texas Instrument's Beagle"
+
+#
+# OMAP Features
+#
+CONFIG_ARCH_OMAP3=y
+CONFIG_OMAP_CONFIG_STACKSIZE=0x00008000
+CONFIG_OMAP_MALLOC_LEN=0x00008000
+CONFIG_OMAP_CLOCK_ALL=y
+CONFIG_OMAP_CLOCK_SOURCE_S32K=y
+CONFIG_OMAP3_CLOCK_CONFIG=y
+# CONFIG_OMAP3_COPY_CLOCK_SRAM is not set
+CONFIG_GPMC=y
+CONFIG_GPIO=y
+
+#
+# OMAP Platform Features
+#
+# CONFIG_MACH_OMAP343xSDP is not set
+CONFIG_MACH_BEAGLE=y
+# CONFIG_MACH_OMAP3EVM is not set
+CONFIG_HAS_OMAP_NAND=y
+CONFIG_MACH_OMAP_GPMC_NAND=y
+CONFIG_MACH_OMAP_GPMC_GENERICNAND=y
+# CONFIG_MACH_OMAP_GPMC_GENERICNAND_LP_X8 is not set
+CONFIG_MACH_OMAP_GPMC_GENERICNAND_LP_X16=y
+# CONFIG_MACH_OMAP_GPMC_GENERICNAND_SP_X8 is not set
+# CONFIG_MACH_OMAP_GPMC_GENERICNAND_SP_X16 is not set
+CONFIG_MACH_OMAP_CS=0x0
+CONFIG_AEABI=y
+
+#
+# Arm specific settings
+#
+CONFIG_CMD_ARM_CPUINFO=y
+# CONFIG_CPU_V7_DCACHE_SKIP is not set
+# CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS is not set
+CONFIG_HAS_KALLSYMS=y
+CONFIG_HAS_MODULES=y
+CONFIG_CMD_MEMORY=y
+CONFIG_ENV_HANDLING=y
+
+#
+# General Settings
+#
+CONFIG_LOCALVERSION_AUTO=y
+
+#
+# memory layout
+#
+CONFIG_HAVE_CONFIGURABLE_TEXT_BASE=y
+CONFIG_TEXT_BASE=0x81000000
+CONFIG_HAVE_CONFIGURABLE_MEMORY_LAYOUT=y
+CONFIG_MEMORY_LAYOUT_DEFAULT=y
+# CONFIG_MEMORY_LAYOUT_FIXED is not set
+CONFIG_STACK_SIZE=0x8000
+CONFIG_MALLOC_SIZE=0x400000
+# CONFIG_BROKEN is not set
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_MACH_HAS_LOWLEVEL_INIT=y
+CONFIG_MACH_DO_LOWLEVEL_INIT=y
+CONFIG_ARCH_HAS_LOWLEVEL_INIT=y
+CONFIG_PROMPT="barebox> "
+CONFIG_BAUDRATE=115200
+CONFIG_LONGHELP=y
+CONFIG_CBSIZE=1024
+CONFIG_MAXARGS=16
+CONFIG_SHELL_HUSH=y
+# CONFIG_SHELL_SIMPLE is not set
+CONFIG_GLOB=y
+CONFIG_PROMPT_HUSH_PS2="> "
+CONFIG_HUSH_FANCY_PROMPT=y
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+CONFIG_DYNAMIC_CRC_TABLE=y
+CONFIG_ERRNO_MESSAGES=y
+# CONFIG_TIMESTAMP is not set
+CONFIG_CONSOLE_FULL=y
+CONFIG_CONSOLE_ACTIVATE_FIRST=y
+# CONFIG_OF_FLAT_TREE is not set
+CONFIG_PARTITION=y
+# CONFIG_DEFAULT_ENVIRONMENT is not set
+
+#
+# Debugging
+#
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_ENABLE_FLASH_NOISE is not set
+# CONFIG_ENABLE_PARTITION_NOISE is not set
+# CONFIG_ENABLE_DEVICE_NOISE is not set
+
+#
+# Commands
+#
+
+#
+# scripting
+#
+CONFIG_CMD_EDIT=y
+CONFIG_CMD_SLEEP=y
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_LOADENV=y
+CONFIG_CMD_EXPORT=y
+CONFIG_CMD_PRINTENV=y
+CONFIG_CMD_READLINE=y
+CONFIG_CMD_TRUE=y
+CONFIG_CMD_FALSE=y
+
+#
+# file commands
+#
+CONFIG_CMD_LS=y
+CONFIG_CMD_RM=y
+CONFIG_CMD_CAT=y
+CONFIG_CMD_MKDIR=y
+CONFIG_CMD_RMDIR=y
+CONFIG_CMD_CP=y
+CONFIG_CMD_PWD=y
+CONFIG_CMD_CD=y
+CONFIG_CMD_MOUNT=y
+CONFIG_CMD_UMOUNT=y
+
+#
+# console
+#
+CONFIG_CMD_CLEAR=y
+CONFIG_CMD_ECHO=y
+CONFIG_CMD_ECHO_E=y
+
+#
+# memory
+#
+CONFIG_CMD_LOADB=y
+# CONFIG_CMD_MEMINFO is not set
+# CONFIG_CMD_CRC is not set
+# CONFIG_CMD_MTEST is not set
+
+#
+# flash
+#
+CONFIG_CMD_FLASH=y
+
+#
+# booting
+#
+# CONFIG_CMD_BOOTM is not set
+CONFIG_CMD_BOOTZ=y
+CONFIG_CMD_BOOTU=y
+# CONFIG_CMD_LINUX16 is not set
+CONFIG_CMD_RESET=y
+CONFIG_CMD_GO=y
+CONFIG_CMD_TIMEOUT=y
+CONFIG_CMD_PARTITION=y
+CONFIG_CMD_TEST=y
+CONFIG_CMD_VERSION=y
+CONFIG_CMD_HELP=y
+CONFIG_CMD_DEVINFO=y
+CONFIG_CMD_UNLZO=y
+CONFIG_CMD_I2C=y
+CONFIG_NET=y
+CONFIG_NET_DHCP=y
+CONFIG_NET_RARP=y
+CONFIG_NET_NFS=y
+CONFIG_NET_PING=y
+CONFIG_NET_TFTP=y
+
+#
+# Drivers
+#
+
+#
+# serial drivers
+#
+# CONFIG_DRIVER_SERIAL_ARM_DCC is not set
+CONFIG_DRIVER_SERIAL_NS16550=y
+CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
+CONFIG_MIIPHY=y
+
+#
+# Network drivers
+#
+# CONFIG_DRIVER_NET_SMC911X is not set
+# CONFIG_DRIVER_NET_SMC91111 is not set
+CONFIG_NET_USB=y
+CONFIG_NET_USB_ASIX=y
+
+#
+# SPI drivers
+#
+# CONFIG_SPI is not set
+CONFIG_I2C=y
+CONFIG_DRIVER_I2C_OMAP=y
+# CONFIG_DRIVER_I2C_MC13892 is not set
+# CONFIG_DRIVER_I2C_MC9SDZ60 is not set
+# CONFIG_DRIVER_I2C_LP3972 is not set
+CONFIG_DRIVER_I2C_TWL4030=y
+
+#
+# flash drivers
+#
+# CONFIG_DRIVER_CFI is not set
+CONFIG_NAND=y
+CONFIG_NAND_OMAP_GPMC=y
+# CONFIG_NAND_OMAP_GPMC_HWECC is not set
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_ATA is not set
+CONFIG_USB=y
+CONFIG_USB_EHCI=y
+# CONFIG_USB_ISP1504 is not set
+CONFIG_USB_TWL4030=y
+# CONFIG_USB_GADGET is not set
+# CONFIG_VIDEO is not set
+
+#
+# Filesystem support
+#
+# CONFIG_FS_CRAMFS is not set
+CONFIG_FS_RAMFS=y
+CONFIG_FS_DEVFS=y
+CONFIG_CRC32=y
+CONFIG_CRC16=y
+# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+CONFIG_PROCESS_ESCAPE_SEQUENCE=y
+CONFIG_LZO_DECOMPRESS=y
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:14 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:14 +0200
Subject: [PATCH 10/13] usb: add twl4030 phy support
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-11-git-send-email-m.grzeschik@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 drivers/usb/otg/Kconfig   |    3 +
 drivers/usb/otg/Makefile  |    2 +
 drivers/usb/otg/twl4030.c |  199 +++++++++++++++++++++++++++++++++++++++++++++
 include/usb/twl4030.h     |   28 +++++++
 4 files changed, 232 insertions(+), 0 deletions(-)
 create mode 100644 drivers/usb/otg/twl4030.c
 create mode 100644 include/usb/twl4030.h

diff --git a/drivers/usb/otg/Kconfig b/drivers/usb/otg/Kconfig
index 0191c87..de09cf3 100644
--- a/drivers/usb/otg/Kconfig
+++ b/drivers/usb/otg/Kconfig
@@ -4,3 +4,6 @@ config USB_ULPI
 config USB_ISP1504
 	select USB_ULPI
 	bool "ISP1504 Tranceiver support"
+
+config USB_TWL4030
+	bool "TWL4030 Tranceiver support"
diff --git a/drivers/usb/otg/Makefile b/drivers/usb/otg/Makefile
index 785f922..aa95cc9 100644
--- a/drivers/usb/otg/Makefile
+++ b/drivers/usb/otg/Makefile
@@ -1,2 +1,4 @@
 obj-$(CONFIG_USB_ULPI)		+= ulpi.o
 obj-$(CONFIG_USB_ISP1504)	+= isp1504.o
+obj-$(CONFIG_USB_TWL4030)	+= twl4030.o
+
diff --git a/drivers/usb/otg/twl4030.c b/drivers/usb/otg/twl4030.c
new file mode 100644
index 0000000..72edf25
--- /dev/null
+++ b/drivers/usb/otg/twl4030.c
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 2009 Wind River Systems, Inc.
+ * Tom Rix <Tom.Rix at windriver.com>
+ *
+ * This is file is based on
+ * repository git.gitorious.org/u-boot-omap3/mainline.git,
+ * branch omap3-dev-usb, file drivers/usb/gadget/twl4030_usb.c
+ *
+ * This is the unique part of its copyright :
+ *
+ * ------------------------------------------------------------------------
+ *
+ *  * (C) Copyright 2009 Atin Malaviya (atin.malaviya at gmail.com)
+ *
+ * Based on: twl4030_usb.c in linux 2.6 (drivers/i2c/chips/twl4030_usb.c)
+ * Copyright (C) 2004-2007 Texas Instruments
+ * Copyright (C) 2008 Nokia Corporation
+ * Contact: Felipe Balbi <felipe.balbi at nokia.com>
+ *
+ * Author: Atin Malaviya (atin.malaviya at gmail.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 <i2c/twl4030.h>
+#include <usb/twl4030.h>
+#include <clock.h>
+
+static int twl4030_usb_write(u8 address, u8 data)
+{
+	int ret;
+	struct twl4030 *twl4030 = twl4030_get();
+
+	ret = twl4030_reg_write(twl4030, address, data);
+	if (ret != 0)
+		printf("TWL4030:USB:Write[0x%x] Error %d\n", address, ret);
+
+	return ret;
+}
+
+static int twl4030_usb_read(u8 address)
+{
+	u8 data;
+	int ret;
+	struct twl4030 *twl4030 = twl4030_get();
+
+	ret = twl4030_reg_read(twl4030, address, &data);
+	if (ret == 0)
+		ret = data;
+	else
+		printf("TWL4030:USB:Read[0x%x] Error %d\n", address, ret);
+
+	return ret;
+}
+
+void twl4030_power_init(void)
+{
+	unsigned char byte;
+	struct twl4030 *twl4030 = twl4030_get();
+
+	/* set VAUX3 to 2.8V */
+	byte = TWL4030_PM_RECEIVER_DEV_GRP_P1;
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VAUX3_DEV_GRP, byte);
+	byte = TWL4030_PM_RECEIVER_VAUX3_VSEL_28;
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VAUX3_DEDICATED, byte);
+
+	/* set VPLL2 to 1.8V */
+	byte = TWL4030_PM_RECEIVER_DEV_GRP_ALL;
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VPLL2_DEV_GRP, byte);
+	byte = TWL4030_PM_RECEIVER_VPLL2_VSEL_18;
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VPLL2_DEDICATED, byte);
+
+	/* set VDAC to 1.8V */
+	byte = TWL4030_PM_RECEIVER_DEV_GRP_P1;
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VDAC_DEV_GRP, byte);
+	byte = TWL4030_PM_RECEIVER_VDAC_VSEL_18;
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VDAC_DEDICATED, byte);
+}
+
+static void twl4030_usb_ldo_init(void)
+{
+	struct twl4030 *twl4030 = twl4030_get();
+	/* Enable writing to power configuration registers */
+	twl4030_reg_write(twl4030, TWL4030_PM_MASTER_PROTECT_KEY, 0xC0);
+	twl4030_reg_write(twl4030, TWL4030_PM_MASTER_PROTECT_KEY, 0x0C);
+
+	/* put VUSB3V1 LDO in active state */
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VUSB_DEDICATED2, 0x00);
+
+	/* input to VUSB3V1 LDO is from VBAT, not VBUS */
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VUSB_DEDICATED1, 0x14);
+
+	/* turn on 3.1V regulator */
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VUSB3V1_DEV_GRP, 0x20);
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VUSB3V1_TYPE, 0x00);
+
+	/* turn on 1.5V regulator */
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VUSB1V5_DEV_GRP, 0x20);
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VUSB1V5_TYPE, 0x00);
+
+	/* turn on 1.8V regulator */
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VUSB1V8_DEV_GRP, 0x20);
+	twl4030_reg_write(twl4030, TWL4030_PM_RECEIVER_VUSB1V8_TYPE, 0x00);
+
+	/* disable access to power configuration registers */
+	twl4030_reg_write(twl4030, TWL4030_PM_MASTER_PROTECT_KEY, 0x0 );
+
+	twl4030_reg_write(twl4030, TWL4030_BASEADD_LED, 0x33); /* FIXME *need to enable LED to get USB power? */
+
+}
+
+static void twl4030_phy_power(void)
+{
+	u8 pwr, clk;
+	/* Power the PHY */
+	pwr = twl4030_usb_read(TWL4030_USB_PHY_PWR_CTRL);
+	pwr &= ~PHYPWD;
+	twl4030_usb_write(TWL4030_USB_PHY_PWR_CTRL, pwr);
+	/* Enable clocks */
+	clk = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL);
+	clk |= CLOCKGATING_EN | CLK32K_EN;
+	twl4030_usb_write(TWL4030_USB_PHY_CLK_CTRL, clk);
+}
+
+/*
+ * Initiaze the ULPI interface
+ * ULPI : Universal Transceiver Macrocell Low Pin Interface
+ * An interface between the USB link controller like musb and the
+ * the PHY or transceiver that drives the actual bus.
+ */
+int twl4030_usb_ulpi_init(void)
+{
+	u8 clk, sts, pwr;
+	uint64_t start;
+	long timeout = 1000 * 1000; /* 1 sec */;
+
+	/* power up the twl4030 */
+	twl4030_power_init();
+
+	/* twl4030 ldo init */
+	twl4030_usb_ldo_init();
+
+	/* Enable the twl4030 phy */
+	twl4030_phy_power();
+
+	/* Enable DPLL to access PHY registers over I2C */
+	clk = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL);
+	clk |= REQ_PHY_DPLL_CLK;
+	twl4030_usb_write(TWL4030_USB_PHY_CLK_CTRL, clk);
+
+	/* Check if the PHY DPLL is locked */
+	sts = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL_STS);
+	start = get_time_ns();
+	while (!(sts & PHY_DPLL_CLK)) {
+		udelay(10);
+		sts = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL_STS);
+		printf("Error:TWL4030:USB Timeout setting PHY DPLL clock\n");
+		if (is_timeout(start, timeout * USECOND)) {
+			return -ETIMEDOUT;
+		}
+	}
+
+	/*
+	 * There are two circuit blocks attached to the PHY,
+	 * Carkit and USB OTG.  Disable Carkit and enable USB OTG
+	 */
+	twl4030_usb_write(TWL4030_USB_IFC_CTRL_CLR, CARKITMODE);
+	pwr = twl4030_usb_read(TWL4030_USB_POWER_CTRL);
+	pwr |= OTG_ENAB;
+	twl4030_usb_write(TWL4030_USB_POWER_CTRL_SET, pwr);
+
+	/* Clear the opmode bits to ensure normal encode */
+	twl4030_usb_write(TWL4030_USB_FUNC_CTRL_CLR, OPMODE_MASK);
+
+	/* Clear the xcvrselect bits to enable the high speed transeiver */
+	twl4030_usb_write(TWL4030_USB_FUNC_CTRL_CLR, XCVRSELECT_MASK);
+
+	/* Let ULPI control the DPLL clock */
+	clk = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL);
+	clk &= ~REQ_PHY_DPLL_CLK;
+	twl4030_usb_write(TWL4030_USB_PHY_CLK_CTRL, clk);
+
+	return 0;
+}
diff --git a/include/usb/twl4030.h b/include/usb/twl4030.h
new file mode 100644
index 0000000..66f5156
--- /dev/null
+++ b/include/usb/twl4030.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2010 Michael Grzeschik <mgr at pengutronix.de>
+ * Copyright (C) 2010 Sascha Hauer <sha at pengutronix.de>
+ *
+ * This file is released under the GPLv2
+ *
+ */
+
+#ifndef __USB_TWL4030_H
+#define __USB_TWL4030_H
+
+/* Defines for bits in registers */
+#define OPMODE_MASK		(3 << 3)
+#define XCVRSELECT_MASK		(3 << 0)
+#define CARKITMODE		(1 << 2)
+#define OTG_ENAB		(1 << 5)
+#define PHYPWD			(1 << 0)
+#define CLOCKGATING_EN		(1 << 2)
+#define CLK32K_EN		(1 << 1)
+#define REQ_PHY_DPLL_CLK	(1 << 0)
+#define PHY_DPLL_CLK		(1 << 0)
+
+/*
+ * USB
+ */
+int twl4030_usb_ulpi_init(void);
+
+#endif /* __USB_TWL4030_H */
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:08 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:08 +0200
Subject: [PATCH 04/13] arm omap: Add gpio support
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-5-git-send-email-m.grzeschik@pengutronix.de>

From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 arch/arm/mach-omap/Kconfig             |   15 ++-
 arch/arm/mach-omap/Makefile            |    1 +
 arch/arm/mach-omap/gpio.c              |  206 ++++++++++++++++++++++++++++++++
 arch/arm/mach-omap/include/mach/gpio.h |   92 ++++++++++++++
 4 files changed, 311 insertions(+), 3 deletions(-)
 create mode 100644 arch/arm/mach-omap/gpio.c
 create mode 100644 arch/arm/mach-omap/include/mach/gpio.h

diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
index 158639e..630405b 100644
--- a/arch/arm/mach-omap/Kconfig
+++ b/arch/arm/mach-omap/Kconfig
@@ -78,9 +78,18 @@ config GPMC
 	depends on  (ARCH_OMAP2 || ARCH_OMAP3)
 	default y
 	help
-	 Enable this if you use Texas Instrument's General purpose Memory
-	 Controller(GPMC). GPMC allows you to configure devices such as NOR,
-	 NAND, OneNAND etc.
+	  Enable this if you use Texas Instrument's General purpose Memory
+	  Controller(GPMC). GPMC allows you to configure devices such as NOR,
+	  NAND, OneNAND etc.
+
+config GPIO
+	prompt "Support for GPIO configuration"
+	bool
+	select GENERIC_GPIO
+	depends on  (ARCH_OMAP2 || ARCH_OMAP3)
+	default y
+	help
+	  Enable this if you use Texas Instrument's General Purpose IO
 
 # Get the board specific configurations
 source arch/arm/boards/omap/Kconfig
diff --git a/arch/arm/mach-omap/Makefile b/arch/arm/mach-omap/Makefile
index f672dce..57bab99 100644
--- a/arch/arm/mach-omap/Makefile
+++ b/arch/arm/mach-omap/Makefile
@@ -24,3 +24,4 @@ obj-$(CONFIG_OMAP_CLOCK_SOURCE_S32K) += s32k_clksource.o
 obj-$(CONFIG_ARCH_OMAP3) += omap3_core.o omap3_generic.o
 obj-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock_core.o omap3_clock.o
 obj-$(CONFIG_GPMC) += gpmc.o
+obj-$(CONFIG_GPIO) += gpio.o
diff --git a/arch/arm/mach-omap/gpio.c b/arch/arm/mach-omap/gpio.c
new file mode 100644
index 0000000..240ac8e
--- /dev/null
+++ b/arch/arm/mach-omap/gpio.c
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2009 Wind River Systems, Inc.
+ * Tom Rix <Tom.Rix at windriver.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
+ *
+ * This work is derived from the linux 2.6.27 kernel source
+ * To fetch, use the kernel repository
+ * git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
+ * Use the v2.6.27 tag.
+ *
+ * Below is the original's header including its copyright
+ *
+ *  linux/arch/arm/plat-omap/gpio.c
+ *
+ * Support functions for OMAP GPIO
+ *
+ * Copyright (C) 2003-2005 Nokia Corporation
+ * Written by Juha Yrj??l?? <juha.yrjola at nokia.com>
+ *
+ * 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 <common.h>
+#include <mach/gpio.h>
+#include <asm/io.h>
+#include <errno.h>
+
+static struct gpio_bank gpio_bank_34xx[6] = {
+	{ (void *)OMAP34XX_GPIO1_BASE, METHOD_GPIO_24XX },
+	{ (void *)OMAP34XX_GPIO2_BASE, METHOD_GPIO_24XX },
+	{ (void *)OMAP34XX_GPIO3_BASE, METHOD_GPIO_24XX },
+	{ (void *)OMAP34XX_GPIO4_BASE, METHOD_GPIO_24XX },
+	{ (void *)OMAP34XX_GPIO5_BASE, METHOD_GPIO_24XX },
+	{ (void *)OMAP34XX_GPIO6_BASE, METHOD_GPIO_24XX },
+};
+
+static struct gpio_bank *gpio_bank = &gpio_bank_34xx[0];
+
+static inline struct gpio_bank *get_gpio_bank(int gpio)
+{
+	return &gpio_bank[gpio >> 5];
+}
+
+static inline int get_gpio_index(int gpio)
+{
+	return gpio & 0x1f;
+}
+
+static inline int gpio_valid(int gpio)
+{
+	if (gpio < 0)
+		return -1;
+	if (gpio < 192)
+		return 0;
+	return -1;
+}
+
+static int check_gpio(int gpio)
+{
+	if (gpio_valid(gpio) < 0) {
+		printf("ERROR : check_gpio: invalid GPIO %d\n", gpio);
+		return -1;
+	}
+	return 0;
+}
+
+void gpio_set_value(unsigned gpio, int value)
+{
+	struct gpio_bank *bank;
+	void *reg;
+	u32 l = 0;
+
+	if (check_gpio(gpio) < 0)
+		return;
+	bank = get_gpio_bank(gpio);
+	reg = bank->base;
+
+	switch (bank->method) {
+	case METHOD_GPIO_24XX:
+		if (value)
+			reg += OMAP24XX_GPIO_SETDATAOUT;
+		else
+			reg += OMAP24XX_GPIO_CLEARDATAOUT;
+		l = 1 << get_gpio_index(gpio);
+		break;
+	default:
+		printf("omap3-gpio unknown bank method %s %d\n",
+		       __FILE__, __LINE__);
+		return;
+	}
+	__raw_writel(l, reg);
+}
+
+int gpio_direction_input(unsigned gpio)
+{
+	struct gpio_bank *bank;
+	void *reg;
+	u32 val;
+
+	if (check_gpio(gpio) < 0)
+		return -EINVAL;
+	bank = get_gpio_bank(gpio);
+
+	reg = bank->base;
+
+	switch (bank->method) {
+	case METHOD_GPIO_24XX:
+		reg += OMAP24XX_GPIO_OE;
+		break;
+	default:
+		return -EINVAL;
+	}
+	val = __raw_readl(reg);
+	val |= 1 << get_gpio_index(gpio);
+	__raw_writel(val, reg);
+
+	return 0;
+}
+
+int gpio_direction_output(unsigned gpio, int value)
+{
+	struct gpio_bank *bank;
+	void *reg;
+	u32 val;
+
+	if (check_gpio(gpio) < 0)
+		return -EINVAL;
+	bank = get_gpio_bank(gpio);
+
+	reg = bank->base;
+
+	gpio_set_value(gpio, value);
+
+	switch (bank->method) {
+	case METHOD_GPIO_24XX:
+		reg += OMAP24XX_GPIO_OE;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	val = __raw_readl(reg);
+	val &= ~(1 << get_gpio_index(gpio));
+	__raw_writel(val, reg);
+
+	return 0;
+}
+
+int gpio_get_value(unsigned gpio)
+{
+	struct gpio_bank *bank;
+	void *reg;
+
+	if (check_gpio(gpio) < 0)
+		return -EINVAL;
+	bank = get_gpio_bank(gpio);
+	reg = bank->base;
+	switch (bank->method) {
+	case METHOD_GPIO_24XX:
+		reg += OMAP24XX_GPIO_DATAIN;
+		break;
+	default:
+		return -EINVAL;
+	}
+	return (__raw_readl(reg)
+			& (1 << get_gpio_index(gpio))) != 0;
+}
+
+static void _reset_gpio(int gpio)
+{
+	gpio_direction_input(gpio);
+}
+
+int omap_request_gpio(int gpio)
+{
+	if (check_gpio(gpio) < 0)
+		return -EINVAL;
+
+	return 0;
+}
+
+void omap_free_gpio(int gpio)
+{
+	struct gpio_bank *bank;
+
+	if (check_gpio(gpio) < 0)
+		return;
+	bank = get_gpio_bank(gpio);
+
+	_reset_gpio(gpio);
+}
diff --git a/arch/arm/mach-omap/include/mach/gpio.h b/arch/arm/mach-omap/include/mach/gpio.h
new file mode 100644
index 0000000..9840b6e
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/gpio.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2009 Wind River Systems, Inc.
+ * Tom Rix <Tom.Rix at windriver.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
+ *
+ * This work is derived from the linux 2.6.27 kernel source
+ * To fetch, use the kernel repository
+ * git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
+ * Use the v2.6.27 tag.
+ *
+ * Below is the original's header including its copyright
+ *
+ *  linux/arch/arm/plat-omap/gpio.c
+ *
+ * Support functions for OMAP GPIO
+ *
+ * Copyright (C) 2003-2005 Nokia Corporation
+ * Written by Juha Yrj??l?? <juha.yrjola at nokia.com>
+ *
+ * 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.
+ */
+#ifndef _GPIO_H
+#define _GPIO_H
+
+#define OMAP24XX_GPIO_REVISION		0x0000
+#define OMAP24XX_GPIO_SYSCONFIG		0x0010
+#define OMAP24XX_GPIO_SYSSTATUS		0x0014
+#define OMAP24XX_GPIO_IRQSTATUS1	0x0018
+#define OMAP24XX_GPIO_IRQSTATUS2	0x0028
+#define OMAP24XX_GPIO_IRQENABLE2	0x002c
+#define OMAP24XX_GPIO_IRQENABLE1	0x001c
+#define OMAP24XX_GPIO_WAKE_EN		0x0020
+#define OMAP24XX_GPIO_CTRL		0x0030
+#define OMAP24XX_GPIO_OE		0x0034
+#define OMAP24XX_GPIO_DATAIN		0x0038
+#define OMAP24XX_GPIO_DATAOUT		0x003c
+#define OMAP24XX_GPIO_LEVELDETECT0	0x0040
+#define OMAP24XX_GPIO_LEVELDETECT1	0x0044
+#define OMAP24XX_GPIO_RISINGDETECT	0x0048
+#define OMAP24XX_GPIO_FALLINGDETECT	0x004c
+#define OMAP24XX_GPIO_DEBOUNCE_EN	0x0050
+#define OMAP24XX_GPIO_DEBOUNCE_VAL	0x0054
+#define OMAP24XX_GPIO_CLEARIRQENABLE1	0x0060
+#define OMAP24XX_GPIO_SETIRQENABLE1	0x0064
+#define OMAP24XX_GPIO_CLEARWKUENA	0x0080
+#define OMAP24XX_GPIO_SETWKUENA		0x0084
+#define OMAP24XX_GPIO_CLEARDATAOUT	0x0090
+#define OMAP24XX_GPIO_SETDATAOUT	0x0094
+
+struct gpio_bank {
+	void *base;
+	int method;
+};
+
+/* OMAP3 GPIO registers */
+#define OMAP34XX_GPIO1_BASE		0x48310000
+#define OMAP34XX_GPIO2_BASE		0x49050000
+#define OMAP34XX_GPIO3_BASE		0x49052000
+#define OMAP34XX_GPIO4_BASE		0x49054000
+#define OMAP34XX_GPIO5_BASE		0x49056000
+#define OMAP34XX_GPIO6_BASE		0x49058000
+
+#define METHOD_GPIO_24XX	4
+
+/* This is the interface */
+
+/* Request a gpio before using it */
+int omap_request_gpio(int gpio);
+/* Reset and free a gpio after using it */
+void omap_free_gpio(int gpio);
+void gpio_set_value(unsigned gpio, int value);
+int gpio_get_value(unsigned gpio);
+int gpio_direction_output(unsigned gpio, int value);
+int gpio_direction_input(unsigned gpio);
+
+#endif /* _GPIO_H_ */
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:07 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:07 +0200
Subject: [PATCH 03/13] add twl4030 support
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-4-git-send-email-m.grzeschik@pengutronix.de>

From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 drivers/i2c/Kconfig   |    4 +
 drivers/i2c/Makefile  |    1 +
 drivers/i2c/twl4030.c |  186 ++++++++++++++++++++
 include/i2c/twl4030.h |  461 +++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 652 insertions(+), 0 deletions(-)
 create mode 100644 drivers/i2c/twl4030.c
 create mode 100644 include/i2c/twl4030.h

diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
index 147ea49..66a7cf7 100644
--- a/drivers/i2c/Kconfig
+++ b/drivers/i2c/Kconfig
@@ -23,4 +23,8 @@ config DRIVER_I2C_MC9SDZ60
 config DRIVER_I2C_LP3972
 	bool "LP3972 driver"
 
+config DRIVER_I2C_TWL4030
+	bool "TWL4030 driver"
+	select GPIO
+
 endif
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
index 9be8ab2..7d07cf0 100644
--- a/drivers/i2c/Makefile
+++ b/drivers/i2c/Makefile
@@ -7,3 +7,4 @@ obj-$(CONFIG_DRIVER_I2C_MC13892) += mc13892.o
 obj-$(CONFIG_DRIVER_I2C_MC34704) += mc34704.o
 obj-$(CONFIG_DRIVER_I2C_MC9SDZ60) += mc9sdz60.o
 obj-$(CONFIG_DRIVER_I2C_LP3972) += lp3972.o
+obj-$(CONFIG_DRIVER_I2C_TWL4030) += twl4030.o
diff --git a/drivers/i2c/twl4030.c b/drivers/i2c/twl4030.c
new file mode 100644
index 0000000..4d47fc8
--- /dev/null
+++ b/drivers/i2c/twl4030.c
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2010 Michael Grzeschik <mgr at pengutronix.de>
+ *
+ * This file is released under the GPLv2
+ *
+ */
+
+#include <common.h>
+#include <init.h>
+#include <driver.h>
+#include <xfuncs.h>
+#include <errno.h>
+
+#include <i2c/i2c.h>
+#include <i2c/twl4030.h>
+
+#define DRIVERNAME		"twl4030"
+
+#define to_twl4030(a)		container_of(a, struct twl4030, cdev)
+
+static struct twl4030 *twl_dev;
+
+struct twl4030 *twl4030_get(void)
+{
+	if (!twl_dev)
+		return NULL;
+
+	return twl_dev;
+}
+EXPORT_SYMBOL(twl4030_get);
+
+int twl4030_reg_read(struct twl4030 *twl4030, u16 reg, u8 *val)
+{
+	int ret;
+	struct i2c_msg xfer_msg[2];
+	struct i2c_msg *msg;
+	int i2c_addr;
+	unsigned char buf = reg & 0xff;
+
+	i2c_addr = twl4030->client->addr + (reg / 0x100);
+
+	/* [MSG1] fill the register address data */
+	msg = &xfer_msg[0];
+	msg->addr = i2c_addr;
+	msg->len = 1;
+	msg->flags = 0;	/* Read the register value */
+	msg->buf = &buf;
+	/* [MSG2] fill the data rx buffer */
+	msg = &xfer_msg[1];
+	msg->addr = i2c_addr;
+	msg->flags = I2C_M_RD;	/* Read the register value */
+	msg->len = 1;	/* only n bytes */
+	msg->buf = val;
+	ret = i2c_transfer(twl4030->client->adapter, &xfer_msg, 2);
+
+	/* i2c_transfer returns number of messages transferred */
+	if (ret < 0) {
+		pr_err("%s: failed to transfer all messages: %s\n", __func__, strerror(-ret));
+		return ret;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(twl4030_reg_read)
+
+int twl4030_reg_write(struct twl4030 *twl4030, u16 reg, u8 val)
+{
+	int ret;
+	struct i2c_msg xfer_msg[1];
+	struct i2c_msg *msg;
+	int i2c_addr;
+	u8 buf[2];
+
+	buf[0] = reg & 0xff;
+	buf[1] = val;
+
+	i2c_addr = twl4030->client->addr + (reg / 0x100);
+
+	/*
+	 * [MSG1]: fill the register address data
+	 * fill the data Tx buffer
+	 */
+	msg = xfer_msg;
+	msg->addr = i2c_addr;
+	msg->len = 2;
+	msg->flags = 0;
+	msg->buf = buf;
+	/* over write the first byte of buffer with the register address */
+	ret = i2c_transfer(twl4030->client->adapter, xfer_msg, 1);
+
+	/* i2c_transfer returns number of messages transferred */
+	if (ret < 0) {
+		pr_err("%s: failed to transfer all messages: %s\n", __func__, strerror(-ret));
+		return ret;
+	}
+	return 0;
+}
+EXPORT_SYMBOL(twl4030_reg_write)
+
+int twl4030_set_bits(struct twl4030 *twl4030, enum twl4030_reg reg, u32 mask, u32 val)
+{
+	u32 tmp;
+	int err;
+
+	err = twl4030_reg_read(twl4030, reg, &tmp);
+	tmp = (tmp & ~mask) | val;
+
+	if (!err)
+		err = twl4030_reg_write(twl4030, reg, tmp);
+
+	return err;
+}
+EXPORT_SYMBOL(twl4030_set_bits);
+
+static ssize_t twl_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
+{
+	struct twl4030 *priv = to_twl4030(cdev);
+	u8 *buf = _buf;
+	size_t i = count;
+	int err;
+
+	while (i) {
+		err = twl4030_reg_read(priv, offset, buf);
+		if (err)
+			return (ssize_t)err;
+		buf++;
+		i--;
+		offset++;
+	}
+
+	return count;
+}
+
+static ssize_t twl_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
+{
+	struct twl4030 *twl4030 = to_twl4030(cdev);
+	const u8 *buf = _buf;
+	size_t i = count;
+	int err;
+
+	while (i) {
+		err = twl4030_reg_write(twl4030, offset, *buf);
+		if (err)
+			return (ssize_t)err;
+		buf++;
+		i--;
+		offset++;
+	}
+
+	return count;
+}
+
+static struct file_operations twl_fops = {
+	.lseek	= dev_lseek_default,
+	.read	= twl_read,
+	.write	= twl_write,
+};
+
+static int twl_probe(struct device_d *dev)
+{
+	if (twl_dev)
+		return -EBUSY;
+
+	twl_dev = xzalloc(sizeof(struct twl4030));
+	twl_dev->cdev.name = DRIVERNAME;
+	twl_dev->client = to_i2c_client(dev);
+	twl_dev->cdev.size = 1024;
+	twl_dev->cdev.dev = dev;
+	twl_dev->cdev.ops = &twl_fops;
+
+	devfs_create(&twl_dev->cdev);
+
+	return 0;
+}
+
+static struct driver_d twl_driver = {
+	.name  = DRIVERNAME,
+	.probe = twl_probe,
+};
+
+static int twl_init(void)
+{
+        register_driver(&twl_driver);
+        return 0;
+}
+
+device_initcall(twl_init);
diff --git a/include/i2c/twl4030.h b/include/i2c/twl4030.h
new file mode 100644
index 0000000..c9fbae0
--- /dev/null
+++ b/include/i2c/twl4030.h
@@ -0,0 +1,461 @@
+/*
+ * Copyright (C) 2010 Michael Grzeschik <mgr at pengutronix.de>
+ * Copyright (C) 2010 Sascha Hauer <sha at pengutronix.de>
+ *
+ * This file is released under the GPLv2
+ *
+ */
+
+#ifndef __I2C_TWL4030_H
+#define __I2C_TWL4030_H
+
+#include <common.h>
+#include <i2c/i2c.h>
+#include <linux/err.h>
+
+/* LED */
+#define TWL4030_LED_LEDEN_LEDAON			(1 << 0)
+#define TWL4030_LED_LEDEN_LEDBON			(1 << 1)
+#define TWL4030_LED_LEDEN_LEDAPWM			(1 << 4)
+#define TWL4030_LED_LEDEN_LEDBPWM			(1 << 5)
+
+/* KEYPAD */
+#define TWL4030_KEYPAD_CTRL_KBD_ON			(1 << 6)
+#define TWL4030_KEYPAD_CTRL_RP_EN			(1 << 5)
+#define TWL4030_KEYPAD_CTRL_TOLE_EN			(1 << 4)
+#define TWL4030_KEYPAD_CTRL_TOE_EN			(1 << 3)
+#define TWL4030_KEYPAD_CTRL_LK_EN			(1 << 2)
+#define TWL4030_KEYPAD_CTRL_SOFTMODEN			(1 << 1)
+#define TWL4030_KEYPAD_CTRL_SOFT_NRST			(1 << 0)
+
+/* P[1-3]_SW_EVENTS */
+#define TWL4030_PM_MASTER_SW_EVENTS_STOPON_PWRON	(1 << 6)
+#define TWL4030_PM_MASTER_SW_EVENTS_STOPON_SYSEN	(1 << 5)
+#define TWL4030_PM_MASTER_SW_EVENTS_ENABLE_WARMRESET	(1 << 4)
+#define TWL4030_PM_MASTER_SW_EVENTS_LVL_WAKEUP		(1 << 3)
+#define TWL4030_PM_MASTER_SW_EVENTS_DEVACT		(1 << 2)
+#define TWL4030_PM_MASTER_SW_EVENTS_DEVSLP		(1 << 1)
+#define TWL4030_PM_MASTER_SW_EVENTS_DEVOFF		(1 << 0)
+
+
+enum twl4030_reg {
+	/* Register base addresses */
+	/* USB */
+	TWL4030_BASEADD_USB			= 0x0000,
+	/* AUD */
+	TWL4030_BASEADD_AUDIO_VOICE		= 0x0100,
+	TWL4030_BASEADD_GPIO			= 0x0198,
+	TWL4030_BASEADD_INTBR			= 0x0185,
+	TWL4030_BASEADD_PIH			= 0x0180,
+	TWL4030_BASEADD_TEST			= 0x014C,
+	/* AUX */
+	TWL4030_BASEADD_INTERRUPTS		= 0x02B9,
+	TWL4030_BASEADD_LED			= 0x02EE,
+	TWL4030_BASEADD_MADC			= 0x0200,
+	TWL4030_BASEADD_MAIN_CHARGE		= 0x0274,
+	TWL4030_BASEADD_PRECHARGE		= 0x02AA,
+	TWL4030_BASEADD_PWM0			= 0x02F8,
+	TWL4030_BASEADD_PWM1			= 0x02FB,
+	TWL4030_BASEADD_PWMA			= 0x02EF,
+	TWL4030_BASEADD_PWMB			= 0x02F1,
+	TWL4030_BASEADD_KEYPAD			= 0x02D2,
+	/* POWER */
+	TWL4030_BASEADD_BACKUP			= 0x0314,
+	TWL4030_BASEADD_INT			= 0x032E,
+	TWL4030_BASEADD_PM_MASTER		= 0x0336,
+	TWL4030_BASEADD_PM_RECIEVER		= 0x035B,
+	TWL4030_BASEADD_RTC			= 0x031C,
+	TWL4030_BASEADD_SECURED_REG		= 0x0300,
+
+	/* LED */
+	TWL4030_LED_LEDEN			= 0x02EE,
+
+	/*
+	 * Voltage Selection in PM Receiver Module
+	 */
+	TWL4030_PM_RECEIVER_VAUX2_VSEL_18	= 0x05,
+	TWL4030_PM_RECEIVER_VAUX3_VSEL_28	= 0x03,
+	TWL4030_PM_RECEIVER_VPLL2_VSEL_18	= 0x05,
+	TWL4030_PM_RECEIVER_VDAC_VSEL_18 	= 0x03,
+	TWL4030_PM_RECEIVER_VMMC1_VSEL_30	= 0x02,
+
+	/*
+	 * Device Selection in PM Receiver Module
+	 */
+	TWL4030_PM_RECEIVER_DEV_GRP_P1		= 0x20,
+	TWL4030_PM_RECEIVER_DEV_GRP_ALL		= 0xE0,
+
+	/*
+	* Power Management Master
+	*/
+	TWL4030_PM_MASTER_CFG_P1_TRANSITION	= 0x0336,
+	TWL4030_PM_MASTER_CFG_P2_TRANSITION	= 0x0337,
+	TWL4030_PM_MASTER_CFG_P3_TRANSITION	= 0x0338,
+	TWL4030_PM_MASTER_CFG_P123_TRANSITION	= 0x0339,
+	TWL4030_PM_MASTER_STS_BOOT		= 0x033A,
+	TWL4030_PM_MASTER_CFG_BOOT		= 0x033B,
+	TWL4030_PM_MASTER_SHUNDAN		= 0x033C,
+	TWL4030_PM_MASTER_BOOT_BCI		= 0x033D,
+	TWL4030_PM_MASTER_CFG_PWRANA1		= 0x033E,
+	TWL4030_PM_MASTER_CFG_PWRANA2		= 0x033F,
+	TWL4030_PM_MASTER_BGAP_TRIM		= 0x0340,
+	TWL4030_PM_MASTER_BACKUP_MISC_STS	= 0x0341,
+	TWL4030_PM_MASTER_BACKUP_MISC_CFG	= 0x0342,
+	TWL4030_PM_MASTER_BACKUP_MISC_TST	= 0x0343,
+	TWL4030_PM_MASTER_PROTECT_KEY		= 0x0344,
+	TWL4030_PM_MASTER_STS_HW_CONDITIONS	= 0x0345,
+	TWL4030_PM_MASTER_P1_SW_EVENTS		= 0x0346,
+	TWL4030_PM_MASTER_P2_SW_EVENTS		= 0x0347,
+	TWL4030_PM_MASTER_P3_SW_EVENTS		= 0x0348,
+	TWL4030_PM_MASTER_STS_P123_STATE	= 0x0349,
+	TWL4030_PM_MASTER_PB_CFG		= 0x034A,
+	TWL4030_PM_MASTER_PB_WORD_MSB		= 0x034B,
+	TWL4030_PM_MASTER_PB_WORD_LSB		= 0x034C,
+	TWL4030_PM_MASTER_SEQ_ADD_W2P		= 0x0352,
+	TWL4030_PM_MASTER_SEQ_ADD_P2A		= 0x0353,
+	TWL4030_PM_MASTER_SEQ_ADD_A2W		= 0x0354,
+	TWL4030_PM_MASTER_SEQ_ADD_A2S		= 0x0355,
+	TWL4030_PM_MASTER_SEQ_ADD_S2A12		= 0x0356,
+	TWL4030_PM_MASTER_SEQ_ADD_S2A3		= 0x0357,
+	TWL4030_PM_MASTER_SEQ_ADD_WARM		= 0x0358,
+	TWL4030_PM_MASTER_MEMORY_ADDRESS	= 0x0359,
+	TWL4030_PM_MASTER_MEMORY_DATA		= 0x035A,
+	TWL4030_PM_MASTER_SC_CONFIG		= 0x035B,
+	TWL4030_PM_MASTER_SC_DETECT1		= 0x035C,
+	TWL4030_PM_MASTER_SC_DETECT2		= 0x035D,
+	TWL4030_PM_MASTER_WATCHDOG_CFG		= 0x035E,
+	TWL4030_PM_MASTER_IT_CHECK_CFG		= 0x035F,
+	TWL4030_PM_MASTER_VIBRATOR_CFG		= 0x0360,
+	TWL4030_PM_MASTER_DCDC_GLOBAL_CFG	= 0x0361,
+	TWL4030_PM_MASTER_VDD1_TRIM1		= 0x0362,
+	TWL4030_PM_MASTER_VDD1_TRIM2		= 0x0363,
+	TWL4030_PM_MASTER_VDD2_TRIM1		= 0x0364,
+	TWL4030_PM_MASTER_VDD2_TRIM2		= 0x0365,
+	TWL4030_PM_MASTER_VIO_TRIM1		= 0x0366,
+	TWL4030_PM_MASTER_VIO_TRIM2		= 0x0367,
+	TWL4030_PM_MASTER_MISC_CFG		= 0x0368,
+	TWL4030_PM_MASTER_LS_TST_A		= 0x0369,
+	TWL4030_PM_MASTER_LS_TST_B		= 0x036A,
+	TWL4030_PM_MASTER_LS_TST_C		= 0x036B,
+	TWL4030_PM_MASTER_LS_TST_D		= 0x036C,
+	TWL4030_PM_MASTER_BB_CFG		= 0x036D,
+	TWL4030_PM_MASTER_MISC_TST		= 0x036E,
+	TWL4030_PM_MASTER_TRIM1			= 0x036F,
+
+	/* Power Managment Receiver */
+	TWL4030_PM_RECEIVER_SC_CONFIG		= 0x035B,
+	TWL4030_PM_RECEIVER_SC_DETECT1		= 0x035C,
+	TWL4030_PM_RECEIVER_SC_DETECT2		= 0x035D,
+	TWL4030_PM_RECEIVER_WATCHDOG_CFG	= 0x035E,
+	TWL4030_PM_RECEIVER_IT_CHECK_CFG	= 0x035F,
+	TWL4030_PM_RECEIVER_VIBRATOR_CFG	= 0x035F,
+	TWL4030_PM_RECEIVER_DC_TO_DC_CFG	= 0x0361,
+	TWL4030_PM_RECEIVER_VDD1_TRIM1		= 0x0362,
+	TWL4030_PM_RECEIVER_VDD1_TRIM2		= 0x0363,
+	TWL4030_PM_RECEIVER_VDD2_TRIM1		= 0x0364,
+	TWL4030_PM_RECEIVER_VDD2_TRIM2		= 0x0365,
+	TWL4030_PM_RECEIVER_VIO_TRIM1		= 0x0366,
+	TWL4030_PM_RECEIVER_VIO_TRIM2		= 0x0367,
+	TWL4030_PM_RECEIVER_MISC_CFG		= 0x0368,
+	TWL4030_PM_RECEIVER_LS_TST_A		= 0x0369,
+	TWL4030_PM_RECEIVER_LS_TST_B		= 0x036A,
+	TWL4030_PM_RECEIVER_LS_TST_C		= 0x036B,
+	TWL4030_PM_RECEIVER_LS_TST_D		= 0x036C,
+	TWL4030_PM_RECEIVER_BB_CFG		= 0x036D,
+	TWL4030_PM_RECEIVER_MISC_TST		= 0x036E,
+	TWL4030_PM_RECEIVER_TRIM1		= 0x036F,
+	TWL4030_PM_RECEIVER_TRIM2		= 0x0370,
+	TWL4030_PM_RECEIVER_DC_DC_TIMEOUT	= 0x0371,
+	TWL4030_PM_RECEIVER_VAUX1_DEV_GRP	= 0x0372,
+	TWL4030_PM_RECEIVER_VAUX1_TYPE		= 0x0373,
+	TWL4030_PM_RECEIVER_VAUX1_REMAP		= 0x0374,
+	TWL4030_PM_RECEIVER_VAUX1_DEDICATED	= 0x0375,
+	TWL4030_PM_RECEIVER_VAUX2_DEV_GRP	= 0x0376,
+	TWL4030_PM_RECEIVER_VAUX2_TYPE		= 0x0377,
+	TWL4030_PM_RECEIVER_VAUX2_REMAP		= 0x0378,
+	TWL4030_PM_RECEIVER_VAUX2_DEDICATED	= 0x0379,
+	TWL4030_PM_RECEIVER_VAUX3_DEV_GRP	= 0x037A,
+	TWL4030_PM_RECEIVER_VAUX3_TYPE		= 0x037B,
+	TWL4030_PM_RECEIVER_VAUX3_REMAP		= 0x037C,
+	TWL4030_PM_RECEIVER_VAUX3_DEDICATED	= 0x037D,
+	TWL4030_PM_RECEIVER_VAUX4_DEV_GRP	= 0x037E,
+	TWL4030_PM_RECEIVER_VAUX4_TYPE		= 0x037F,
+	TWL4030_PM_RECEIVER_VAUX4_REMAP		= 0x0380,
+	TWL4030_PM_RECEIVER_VAUX4_DEDICATED	= 0x0381,
+	TWL4030_PM_RECEIVER_VMMC1_DEV_GRP	= 0x0382,
+	TWL4030_PM_RECEIVER_VMMC1_TYPE		= 0x0383,
+	TWL4030_PM_RECEIVER_VMMC1_REMAP		= 0x0384,
+	TWL4030_PM_RECEIVER_VMMC1_DEDICATED	= 0x0385,
+	TWL4030_PM_RECEIVER_VMMC2_DEV_GRP	= 0x0386,
+	TWL4030_PM_RECEIVER_VMMC2_TYPE		= 0x0387,
+	TWL4030_PM_RECEIVER_VMMC2_REMAP		= 0x0388,
+	TWL4030_PM_RECEIVER_VMMC2_DEDICATED	= 0x0389,
+	TWL4030_PM_RECEIVER_VPLL1_DEV_GRP	= 0x038A,
+	TWL4030_PM_RECEIVER_VPLL1_TYPE		= 0x038B,
+	TWL4030_PM_RECEIVER_VPLL1_REMAP		= 0x038C,
+	TWL4030_PM_RECEIVER_VPLL1_DEDICATED	= 0x038D,
+	TWL4030_PM_RECEIVER_VPLL2_DEV_GRP	= 0x038E,
+	TWL4030_PM_RECEIVER_VPLL2_TYPE		= 0x038F,
+	TWL4030_PM_RECEIVER_VPLL2_REMAP		= 0x0390,
+	TWL4030_PM_RECEIVER_VPLL2_DEDICATED	= 0x0391,
+	TWL4030_PM_RECEIVER_VSIM_DEV_GRP	= 0x0392,
+	TWL4030_PM_RECEIVER_VSIM_TYPE		= 0x0393,
+	TWL4030_PM_RECEIVER_VSIM_REMAP		= 0x0394,
+	TWL4030_PM_RECEIVER_VSIM_DEDICATED	= 0x0395,
+	TWL4030_PM_RECEIVER_VDAC_DEV_GRP	= 0x0396,
+	TWL4030_PM_RECEIVER_VDAC_TYPE		= 0x0397,
+	TWL4030_PM_RECEIVER_VDAC_REMAP		= 0x0398,
+	TWL4030_PM_RECEIVER_VDAC_DEDICATED	= 0x0399,
+	TWL4030_PM_RECEIVER_VINTANA1_DEV_GRP	= 0x039A,
+	TWL4030_PM_RECEIVER_VINTANA1_TYP	= 0x039B,
+	TWL4030_PM_RECEIVER_VINTANA1_REMAP	= 0x039C,
+	TWL4030_PM_RECEIVER_VINTANA1_DEDICATED	= 0x039D,
+	TWL4030_PM_RECEIVER_VINTANA2_DEV_GRP	= 0x039E,
+	TWL4030_PM_RECEIVER_VINTANA2_TYPE	= 0x039F,
+	TWL4030_PM_RECEIVER_VINTANA2_REMAP	= 0x03A0,
+	TWL4030_PM_RECEIVER_VINTANA2_DEDICATED	= 0x03A1,
+	TWL4030_PM_RECEIVER_VINTDIG_DEV_GRP	= 0x03A2,
+	TWL4030_PM_RECEIVER_VINTDIG_TYPE	= 0x03A3,
+	TWL4030_PM_RECEIVER_VINTDIG_REMAP	= 0x03A4,
+	TWL4030_PM_RECEIVER_VINTDIG_DEDICATED	= 0x03A5,
+	TWL4030_PM_RECEIVER_VIO_DEV_GRP		= 0x03A6,
+	TWL4030_PM_RECEIVER_VIO_TYPE		= 0x03A7,
+	TWL4030_PM_RECEIVER_VIO_REMAP		= 0x03A8,
+	TWL4030_PM_RECEIVER_VIO_CFG		= 0x03A9,
+	TWL4030_PM_RECEIVER_VIO_MISC_CFG	= 0x03AA,
+	TWL4030_PM_RECEIVER_VIO_TEST1		= 0x03AB,
+	TWL4030_PM_RECEIVER_VIO_TEST2		= 0x03AC,
+	TWL4030_PM_RECEIVER_VIO_OSC		= 0x03AD,
+	TWL4030_PM_RECEIVER_VIO_RESERVED	= 0x03AE,
+	TWL4030_PM_RECEIVER_VIO_VSEL		= 0x03AF,
+	TWL4030_PM_RECEIVER_VDD1_DEV_GRP	= 0x03B0,
+	TWL4030_PM_RECEIVER_VDD1_TYPE		= 0x03B1,
+	TWL4030_PM_RECEIVER_VDD1_REMAP		= 0x03B2,
+	TWL4030_PM_RECEIVER_VDD1_CFG		= 0x03B3,
+	TWL4030_PM_RECEIVER_VDD1_MISC_CFG	= 0x03B4,
+	TWL4030_PM_RECEIVER_VDD1_TEST1		= 0x03B5,
+	TWL4030_PM_RECEIVER_VDD1_TEST2		= 0x03B6,
+	TWL4030_PM_RECEIVER_VDD1_OSC		= 0x03B7,
+	TWL4030_PM_RECEIVER_VDD1_RESERVED	= 0x03B8,
+	TWL4030_PM_RECEIVER_VDD1_VSEL		= 0x03B9,
+	TWL4030_PM_RECEIVER_VDD1_VMODE_CFG	= 0x03BA,
+	TWL4030_PM_RECEIVER_VDD1_VFLOOR		= 0x03BB,
+	TWL4030_PM_RECEIVER_VDD1_VROOF		= 0x03BC,
+	TWL4030_PM_RECEIVER_VDD1_STEP		= 0x03BD,
+	TWL4030_PM_RECEIVER_VDD2_DEV_GRP	= 0x03BE,
+	TWL4030_PM_RECEIVER_VDD2_TYPE		= 0x03BF,
+	TWL4030_PM_RECEIVER_VDD2_REMAP		= 0x03C0,
+	TWL4030_PM_RECEIVER_VDD2_CFG		= 0x03C1,
+	TWL4030_PM_RECEIVER_VDD2_MISC_CFG	= 0x03C2,
+	TWL4030_PM_RECEIVER_VDD2_TEST1		= 0x03C3,
+	TWL4030_PM_RECEIVER_VDD2_TEST2		= 0x03C4,
+	TWL4030_PM_RECEIVER_VDD2_OSC		= 0x03C5,
+	TWL4030_PM_RECEIVER_VDD2_RESERVED	= 0x03C6,
+	TWL4030_PM_RECEIVER_VDD2_VSEL		= 0x03C7,
+	TWL4030_PM_RECEIVER_VDD2_VMODE_CFG	= 0x03C8,
+	TWL4030_PM_RECEIVER_VDD2_VFLOOR		= 0x03C9,
+	TWL4030_PM_RECEIVER_VDD2_VROOF		= 0x03CA,
+	TWL4030_PM_RECEIVER_VDD2_STEP		= 0x03CB,
+	TWL4030_PM_RECEIVER_VUSB1V5_DEV_GRP	= 0x03CC,
+	TWL4030_PM_RECEIVER_VUSB1V5_TYPE	= 0x03CD,
+	TWL4030_PM_RECEIVER_VUSB1V5_REMAP	= 0x03CE,
+	TWL4030_PM_RECEIVER_VUSB1V8_DEV_GRP	= 0x03CF,
+	TWL4030_PM_RECEIVER_VUSB1V8_TYPE	= 0x03D0,
+	TWL4030_PM_RECEIVER_VUSB1V8_REMAP	= 0x03D1,
+	TWL4030_PM_RECEIVER_VUSB3V1_DEV_GRP	= 0x03D2,
+	TWL4030_PM_RECEIVER_VUSB3V1_TYPE	= 0x03D3,
+	TWL4030_PM_RECEIVER_VUSB3V1_REMAP	= 0x03D4,
+	TWL4030_PM_RECEIVER_VUSBCP_DEV_GRP	= 0x03D5,
+	TWL4030_PM_RECEIVER_VUSBCP_TYPE		= 0x03D6,
+	TWL4030_PM_RECEIVER_VUSBCP_REMAP	= 0x03D7,
+	TWL4030_PM_RECEIVER_VUSB_DEDICATED1	= 0x03D8,
+	TWL4030_PM_RECEIVER_VUSB_DEDICATED2	= 0x03D9,
+	TWL4030_PM_RECEIVER_REGEN_DEV_GRP	= 0x03DA,
+	TWL4030_PM_RECEIVER_REGEN_TYPE		= 0x03DB,
+	TWL4030_PM_RECEIVER_REGEN_REMAP		= 0x03DC,
+	TWL4030_PM_RECEIVER_NRESPWRON_DEV_GRP	= 0x03DD,
+	TWL4030_PM_RECEIVER_NRESPWRON_TYPE	= 0x03DE,
+	TWL4030_PM_RECEIVER_NRESPWRON_REMAP	= 0x03DF,
+	TWL4030_PM_RECEIVER_CLKEN_DEV_GRP	= 0x03E0,
+	TWL4030_PM_RECEIVER_CLKEN_TYPE		= 0x03E1,
+	TWL4030_PM_RECEIVER_CLKEN_REMAP		= 0x03E2,
+	TWL4030_PM_RECEIVER_SYSEN_DEV_GRP	= 0x03E3,
+	TWL4030_PM_RECEIVER_SYSEN_TYPE		= 0x03E4,
+	TWL4030_PM_RECEIVER_SYSEN_REMAP		= 0x03E5,
+	TWL4030_PM_RECEIVER_HFCLKOUT_DEV_GRP	= 0x03E6,
+	TWL4030_PM_RECEIVER_HFCLKOUT_TYPE	= 0x03E7,
+	TWL4030_PM_RECEIVER_HFCLKOUT_REMAP	= 0x03E8,
+	TWL4030_PM_RECEIVER_32KCLKOUT_DEV_GRP	= 0x03E9,
+	TWL4030_PM_RECEIVER_32KCLKOUT_TYPE	= 0x03EA,
+	TWL4030_PM_RECEIVER_32KCLKOUT_REMAP	= 0x03EB,
+	TWL4030_PM_RECEIVER_TRITON_RESET_DEV_GR	= 0x03EC,
+	TWL4030_PM_RECEIVER_TRITON_RESET_TYPE	= 0x03ED,
+	TWL4030_PM_RECEIVER_TRITON_RESET_REMAP	= 0x03EE,
+	TWL4030_PM_RECEIVER_MAINREF_DEV_GRP	= 0x03EF,
+	TWL4030_PM_RECEIVER_MAINREF_TYPE	= 0x03F0,
+	TWL4030_PM_RECEIVER_MAINREF_REMAP	= 0x03F1,
+
+	/* Keypad */
+	TWL4030_KEYPAD_KEYP_CTRL_REG		= 0x02D2,
+	TWL4030_KEYPAD_KEY_DEB_REG		= 0x02D3,
+	TWL4030_KEYPAD_LONG_KEY_REG1		= 0x02D4,
+	TWL4030_KEYPAD_LK_PTV_REG		= 0x02D5,
+	TWL4030_KEYPAD_TIME_OUT_REG1		= 0x02D6,
+	TWL4030_KEYPAD_TIME_OUT_REG2		= 0x02D7,
+	TWL4030_KEYPAD_KBC_REG			= 0x02D8,
+	TWL4030_KEYPAD_KBR_REG			= 0x02D9,
+	TWL4030_KEYPAD_KEYP_SMS			= 0x02DA,
+	TWL4030_KEYPAD_FULL_CODE_7_0		= 0x02DB,
+	TWL4030_KEYPAD_FULL_CODE_15_8		= 0x02DC,
+	TWL4030_KEYPAD_FULL_CODE_23_16		= 0x02DD,
+	TWL4030_KEYPAD_FULL_CODE_31_24		= 0x02DE,
+	TWL4030_KEYPAD_FULL_CODE_39_32		= 0x02DF,
+	TWL4030_KEYPAD_FULL_CODE_47_40		= 0x02E0,
+	TWL4030_KEYPAD_FULL_CODE_55_48		= 0x02E1,
+	TWL4030_KEYPAD_FULL_CODE_63_56		= 0x02E2,
+	TWL4030_KEYPAD_KEYP_ISR1		= 0x02E3,
+	TWL4030_KEYPAD_KEYP_IMR1		= 0x02E4,
+	TWL4030_KEYPAD_KEYP_ISR2		= 0x02E5,
+	TWL4030_KEYPAD_KEYP_IMR2		= 0x02E6,
+	TWL4030_KEYPAD_KEYP_SIR			= 0x02E7,
+	TWL4030_KEYPAD_KEYP_EDR			= 0x02E8,
+	TWL4030_KEYPAD_KEYP_SIH_CTRL		= 0x02E9,
+
+	/* USB */
+	TWL4030_USB_VENDOR_ID_LO		= 0x0000,
+	TWL4030_USB_VENDOR_ID_HI		= 0x0001,
+	TWL4030_USB_PRODUCT_ID_LO		= 0x0002,
+	TWL4030_USB_PRODUCT_ID_HI		= 0x0003,
+	TWL4030_USB_FUNC_CTRL			= 0x0004,
+	TWL4030_USB_FUNC_CTRL_SET		= 0x0005,
+	TWL4030_USB_FUNC_CTRL_CLR		= 0x0006,
+	TWL4030_USB_IFC_CTRL			= 0x0007,
+	TWL4030_USB_IFC_CTRL_SET		= 0x0008,
+	TWL4030_USB_IFC_CTRL_CLR		= 0x0009,
+	TWL4030_USB_OTG_CTRL			= 0x000A,
+	TWL4030_USB_OTG_CTRL_SET		= 0x000B,
+	TWL4030_USB_OTG_CTRL_CLR		= 0x000C,
+	TWL4030_USB_USB_INT_EN_RISE		= 0x000D,
+	TWL4030_USB_USB_INT_EN_RISE_SET		= 0x000E,
+	TWL4030_USB_USB_INT_EN_RISE_CLR		= 0x000F,
+	TWL4030_USB_USB_INT_EN_FALL		= 0x0010,
+	TWL4030_USB_USB_INT_EN_FALL_SET		= 0x0011,
+	TWL4030_USB_USB_INT_EN_FALL_CLR		= 0x0012,
+	TWL4030_USB_USB_INT_STS			= 0x0013,
+	TWL4030_USB_USB_INT_LATCH		= 0x0014,
+	TWL4030_USB_DEBUG			= 0x0015,
+	TWL4030_USB_SCRATCH_REG			= 0x0016,
+	TWL4030_USB_SCRATCH_REG_SET		= 0x0017,
+	TWL4030_USB_SCRATCH_REG_CLR		= 0x0018,
+	TWL4030_USB_CARKIT_CTRL			= 0x0019,
+	TWL4030_USB_CARKIT_CTRL_SET		= 0x001A,
+	TWL4030_USB_CARKIT_CTRL_CLR		= 0x001B,
+	TWL4030_USB_CARKIT_INT_DELAY		= 0x001C,
+	TWL4030_USB_CARKIT_INT_EN		= 0x001D,
+	TWL4030_USB_CARKIT_INT_EN_SET		= 0x001E,
+	TWL4030_USB_CARKIT_INT_EN_CLR		= 0x001F,
+	TWL4030_USB_CARKIT_INT_STS		= 0x0020,
+	TWL4030_USB_CARKIT_INT_LATCH		= 0x0021,
+	TWL4030_USB_CARKIT_PLS_CTRL		= 0x0022,
+	TWL4030_USB_CARKIT_PLS_CTRL_SET		= 0x0023,
+	TWL4030_USB_CARKIT_PLS_CTRL_CLR		= 0x0024,
+	TWL4030_USB_TRANS_POS_WIDTH		= 0x0025,
+	TWL4030_USB_TRANS_NEG_WIDTH		= 0x0026,
+	TWL4030_USB_RCV_PLTY_RECOVERY		= 0x0027,
+	TWL4030_USB_MCPC_CTRL			= 0x0030,
+	TWL4030_USB_MCPC_CTRL_SET		= 0x0031,
+	TWL4030_USB_MCPC_CTRL_CLR		= 0x0032,
+	TWL4030_USB_MCPC_IO_CTRL		= 0x0033,
+	TWL4030_USB_MCPC_IO_CTRL_SET		= 0x0034,
+	TWL4030_USB_MCPC_IO_CTRL_CLR		= 0x0035,
+	TWL4030_USB_MCPC_CTRL2			= 0x0036,
+	TWL4030_USB_MCPC_CTRL2_SET		= 0x0037,
+	TWL4030_USB_MCPC_CTRL2_CLR		= 0x0038,
+	TWL4030_USB_OTHER_FUNC_CTRL		= 0x0080,
+	TWL4030_USB_OTHER_FUNC_CTRL_SET		= 0x0081,
+	TWL4030_USB_OTHER_FUNC_CTRL_CLR		= 0x0082,
+	TWL4030_USB_OTHER_IFC_CTRL		= 0x0083,
+	TWL4030_USB_OTHER_IFC_CTRL_SET		= 0x0084,
+	TWL4030_USB_OTHER_IFC_CTRL_CLR		= 0x0085,
+	TWL4030_USB_OTHER_INT_EN_RISE_SET	= 0x0087,
+	TWL4030_USB_OTHER_INT_EN_RISE_CLR	= 0x0088,
+	TWL4030_USB_OTHER_INT_EN_FALL		= 0x0089,
+	TWL4030_USB_OTHER_INT_EN_FALL_SET	= 0x008A,
+	TWL4030_USB_OTHER_INT_EN_FALL_CLR	= 0x008B,
+	TWL4030_USB_OTHER_INT_STS		= 0x008C,
+	TWL4030_USB_OTHER_INT_LATCH		= 0x008D,
+	TWL4030_USB_ID_STATUS			= 0x0096,
+	TWL4030_USB_CARKIT_SM_1_INT_EN		= 0x0097,
+	TWL4030_USB_CARKIT_SM_1_INT_EN_SET	= 0x0098,
+	TWL4030_USB_CARKIT_SM_1_INT_EN_CLR	= 0x0099,
+	TWL4030_USB_CARKIT_SM_1_INT_STS		= 0x009A,
+	TWL4030_USB_CARKIT_SM_1_INT_LATCH	= 0x009B,
+	TWL4030_USB_CARKIT_SM_2_INT_EN		= 0x009C,
+	TWL4030_USB_CARKIT_SM_2_INT_EN_SET	= 0x009D,
+	TWL4030_USB_CARKIT_SM_2_INT_EN_CLR	= 0x009E,
+	TWL4030_USB_CARKIT_SM_2_INT_STS		= 0x009F,
+	TWL4030_USB_CARKIT_SM_2_INT_LATCH	= 0x00A0,
+	TWL4030_USB_CARKIT_SM_CTRL		= 0x00A1,
+	TWL4030_USB_CARKIT_SM_CTRL_SET		= 0x00A2,
+	TWL4030_USB_CARKIT_SM_CTRL_CLR		= 0x00A3,
+	TWL4030_USB_CARKIT_SM_CMD		= 0x00A4,
+	TWL4030_USB_CARKIT_SM_CMD_SET		= 0x00A5,
+	TWL4030_USB_CARKIT_SM_CMD_CLR		= 0x00A6,
+	TWL4030_USB_CARKIT_SM_CMD_STS		= 0x00A7,
+	TWL4030_USB_CARKIT_SM_STATUS		= 0x00A8,
+	TWL4030_USB_CARKIT_SM_ERR_STATUS	= 0x00AA,
+	TWL4030_USB_CARKIT_SM_CTRL_STATE	= 0x00AB,
+	TWL4030_USB_POWER_CTRL			= 0x00AC,
+	TWL4030_USB_POWER_CTRL_SET		= 0x00AD,
+	TWL4030_USB_POWER_CTRL_CLR		= 0x00AE,
+	TWL4030_USB_OTHER_IFC_CTRL2		= 0x00AF,
+	TWL4030_USB_OTHER_IFC_CTRL2_SET		= 0x00B0,
+	TWL4030_USB_OTHER_IFC_CTRL2_CLR		= 0x00B1,
+	TWL4030_USB_REG_CTRL_EN			= 0x00B2,
+	TWL4030_USB_REG_CTRL_EN_SET		= 0x00B3,
+	TWL4030_USB_REG_CTRL_EN_CLR		= 0x00B4,
+	TWL4030_USB_REG_CTRL_ERROR		= 0x00B5,
+	TWL4030_USB_OTHER_FUNC_CTRL2		= 0x00B8,
+	TWL4030_USB_OTHER_FUNC_CTRL2_SET	= 0x00B9,
+	TWL4030_USB_OTHER_FUNC_CTRL2_CLR	= 0x00BA,
+	TWL4030_USB_CARKIT_ANA_CTRL		= 0x00BB,
+	TWL4030_USB_CARKIT_ANA_CTRL_SET		= 0x00BC,
+	TWL4030_USB_CARKIT_ANA_CTRL_CLR		= 0x00BD,
+	TWL4030_USB_VBUS_DEBOUNCE		= 0x00C0,
+	TWL4030_USB_ID_DEBOUNCE			= 0x00C1,
+	TWL4030_USB_TPH_DP_CON_MIN		= 0x00C2,
+	TWL4030_USB_TPH_DP_CON_MAX		= 0x00C3,
+	TWL4030_USB_TCR_DP_CON_MIN		= 0x00C4,
+	TWL4030_USB_TCR_DP_CON_MAX		= 0x00C5,
+	TWL4030_USB_TPH_DP_PD_SHORT		= 0x00C6,
+	TWL4030_USB_TPH_CMD_DLY			= 0x00C7,
+	TWL4030_USB_TPH_DET_RST			= 0x00C8,
+	TWL4030_USB_TPH_AUD_BIAS		= 0x00C9,
+	TWL4030_USB_TCR_UART_DET_MIN		= 0x00CA,
+	TWL4030_USB_TCR_UART_DET_MAX		= 0x00CB,
+	TWL4030_USB_TPH_ID_INT_PW		= 0x00CD,
+	TWL4030_USB_TACC_ID_INT_WAIT		= 0x00CE,
+	TWL4030_USB_TACC_ID_INT_PW		= 0x00CF,
+	TWL4030_USB_TPH_CMD_WAIT		= 0x00D0,
+	TWL4030_USB_TPH_ACK_WAIT		= 0x00D1,
+	TWL4030_USB_TPH_DP_DISC_DET		= 0x00D2,
+	TWL4030_USB_VBAT_TIMER			= 0x00D3,
+	TWL4030_USB_CARKIT_4W_DEBUG		= 0x00E0,
+	TWL4030_USB_CARKIT_5W_DEBUG		= 0x00E1,
+	TWL4030_USB_PHY_PWR_CTRL		= 0x00FD,
+	TWL4030_USB_PHY_CLK_CTRL		= 0x00FE,
+	TWL4030_USB_PHY_CLK_CTRL_STS		= 0x00FF,
+};
+
+struct twl4030 {
+	struct cdev		cdev;
+	struct i2c_client	*client;
+};
+
+extern struct twl4030 *twl4030_get(void);
+
+extern int twl4030_reg_read(struct twl4030 *twl4030, u16 reg, u8 *val);
+extern int twl4030_reg_write(struct twl4030 *twl4030, u16 reg, u8 val);
+extern int twl4030_set_bits(struct twl4030 *twl4030, enum twl4030_reg reg, u32 mask, u32 val);
+
+#endif /* __I2C_TWL4030_H */
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:06 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:06 +0200
Subject: [PATCH 02/13] arm omap: Add I2C driver
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-3-git-send-email-m.grzeschik@pengutronix.de>

From: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 drivers/i2c/Kconfig    |    4 +
 drivers/i2c/Makefile   |    1 +
 drivers/i2c/i2c-omap.c |  803 ++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 808 insertions(+), 0 deletions(-)
 create mode 100644 drivers/i2c/i2c-omap.c

diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
index a9ee411..147ea49 100644
--- a/drivers/i2c/Kconfig
+++ b/drivers/i2c/Kconfig
@@ -7,6 +7,10 @@ config DRIVER_I2C_IMX
 	bool "i.MX I2C Master driver"
 	depends on ARCH_IMX
 
+config DRIVER_I2C_OMAP
+	bool "OMAP I2C Master driver"
+	depends on ARCH_OMAP
+
 config DRIVER_I2C_MC13892
 	bool "MC13892 a.k.a. PMIC driver"
 
diff --git a/drivers/i2c/Makefile b/drivers/i2c/Makefile
index 13e5804..9be8ab2 100644
--- a/drivers/i2c/Makefile
+++ b/drivers/i2c/Makefile
@@ -1,6 +1,7 @@
 obj-$(CONFIG_I2C) += i2c.o
 
 obj-$(CONFIG_DRIVER_I2C_IMX) += i2c-imx.o
+obj-$(CONFIG_DRIVER_I2C_OMAP) += i2c-omap.o
 
 obj-$(CONFIG_DRIVER_I2C_MC13892) += mc13892.o
 obj-$(CONFIG_DRIVER_I2C_MC34704) += mc34704.o
diff --git a/drivers/i2c/i2c-omap.c b/drivers/i2c/i2c-omap.c
new file mode 100644
index 0000000..8e7a8b5
--- /dev/null
+++ b/drivers/i2c/i2c-omap.c
@@ -0,0 +1,803 @@
+/*
+ * TI OMAP I2C master mode driver
+ *
+ * Copyright (C) 2003 MontaVista Software, Inc.
+ * Copyright (C) 2005 Nokia Corporation
+ * Copyright (C) 2004 - 2007 Texas Instruments.
+ *
+ * Originally written by MontaVista Software, Inc.
+ * Additional contributions by:
+ *	Tony Lindgren <tony at atomide.com>
+ *	Imre Deak <imre.deak at nokia.com>
+ *	Juha Yrj??l?? <juha.yrjola at solidboot.com>
+ *	Syed Khasim <x0khasim at ti.com>
+ *	Nishant Menon <nm at ti.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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/* #include <linux/delay.h> */
+
+
+#include <clock.h>
+#include <common.h>
+#include <driver.h>
+#include <gpio.h>
+#include <init.h>
+#include <malloc.h>
+#include <types.h>
+#include <xfuncs.h>
+
+#include <linux/err.h>
+
+#include <asm/io.h>
+#include <i2c/i2c.h>
+#include <mach/generic.h>
+#include <mach/omap3-clock.h>
+
+#define OMAP_I2C_SIZE		0x3f
+#define OMAP1_I2C_BASE		0xfffb3800
+#define OMAP2_I2C_BASE1		0x48070000
+#define OMAP2_I2C_BASE2		0x48072000
+#define OMAP2_I2C_BASE3		0x48060000
+
+/* This will be the driver name */
+#define DRIVER_NAME "i2c-omap"
+
+#define OMAP_I2C_REV_REG		0x00
+#define OMAP_I2C_IE_REG			0x04
+#define OMAP_I2C_STAT_REG		0x08
+#define OMAP_I2C_IV_REG			0x0c
+/* For OMAP3 I2C_IV has changed to I2C_WE (wakeup enable) */
+#define OMAP_I2C_WE_REG			0x0c
+#define OMAP_I2C_SYSS_REG		0x10
+#define OMAP_I2C_BUF_REG		0x14
+#define OMAP_I2C_CNT_REG		0x18
+#define OMAP_I2C_DATA_REG		0x1c
+#define OMAP_I2C_SYSC_REG		0x20
+#define OMAP_I2C_CON_REG		0x24
+#define OMAP_I2C_OA_REG			0x28
+#define OMAP_I2C_SA_REG			0x2c
+#define OMAP_I2C_PSC_REG		0x30
+#define OMAP_I2C_SCLL_REG		0x34
+#define OMAP_I2C_SCLH_REG		0x38
+#define OMAP_I2C_SYSTEST_REG		0x3c
+#define OMAP_I2C_BUFSTAT_REG		0x40
+
+/* I2C Interrupt Enable Register (OMAP_I2C_IE): */
+#define OMAP_I2C_IE_XDR		(1 << 14)	/* TX Buffer drain int enable */
+#define OMAP_I2C_IE_RDR		(1 << 13)	/* RX Buffer drain int enable */
+#define OMAP_I2C_IE_XRDY	(1 << 4)	/* TX data ready int enable */
+#define OMAP_I2C_IE_RRDY	(1 << 3)	/* RX data ready int enable */
+#define OMAP_I2C_IE_ARDY	(1 << 2)	/* Access ready int enable */
+#define OMAP_I2C_IE_NACK	(1 << 1)	/* No ack interrupt enable */
+#define OMAP_I2C_IE_AL		(1 << 0)	/* Arbitration lost int ena */
+
+/* I2C Status Register (OMAP_I2C_STAT): */
+#define OMAP_I2C_STAT_XDR	(1 << 14)	/* TX Buffer draining */
+#define OMAP_I2C_STAT_RDR	(1 << 13)	/* RX Buffer draining */
+#define OMAP_I2C_STAT_BB	(1 << 12)	/* Bus busy */
+#define OMAP_I2C_STAT_ROVR	(1 << 11)	/* Receive overrun */
+#define OMAP_I2C_STAT_XUDF	(1 << 10)	/* Transmit underflow */
+#define OMAP_I2C_STAT_AAS	(1 << 9)	/* Address as slave */
+#define OMAP_I2C_STAT_AD0	(1 << 8)	/* Address zero */
+#define OMAP_I2C_STAT_XRDY	(1 << 4)	/* Transmit data ready */
+#define OMAP_I2C_STAT_RRDY	(1 << 3)	/* Receive data ready */
+#define OMAP_I2C_STAT_ARDY	(1 << 2)	/* Register access ready */
+#define OMAP_I2C_STAT_NACK	(1 << 1)	/* No ack interrupt enable */
+#define OMAP_I2C_STAT_AL	(1 << 0)	/* Arbitration lost int ena */
+
+/* I2C WE wakeup enable register */
+#define OMAP_I2C_WE_XDR_WE	(1 << 14)	/* TX drain wakup */
+#define OMAP_I2C_WE_RDR_WE	(1 << 13)	/* RX drain wakeup */
+#define OMAP_I2C_WE_AAS_WE	(1 << 9)	/* Address as slave wakeup*/
+#define OMAP_I2C_WE_BF_WE	(1 << 8)	/* Bus free wakeup */
+#define OMAP_I2C_WE_STC_WE	(1 << 6)	/* Start condition wakeup */
+#define OMAP_I2C_WE_GC_WE	(1 << 5)	/* General call wakeup */
+#define OMAP_I2C_WE_DRDY_WE	(1 << 3)	/* TX/RX data ready wakeup */
+#define OMAP_I2C_WE_ARDY_WE	(1 << 2)	/* Reg access ready wakeup */
+#define OMAP_I2C_WE_NACK_WE	(1 << 1)	/* No acknowledgment wakeup */
+#define OMAP_I2C_WE_AL_WE	(1 << 0)	/* Arbitration lost wakeup */
+
+#define OMAP_I2C_WE_ALL		(OMAP_I2C_WE_XDR_WE | OMAP_I2C_WE_RDR_WE | \
+				OMAP_I2C_WE_AAS_WE | OMAP_I2C_WE_BF_WE | \
+				OMAP_I2C_WE_STC_WE | OMAP_I2C_WE_GC_WE | \
+				OMAP_I2C_WE_DRDY_WE | OMAP_I2C_WE_ARDY_WE | \
+				OMAP_I2C_WE_NACK_WE | OMAP_I2C_WE_AL_WE)
+
+/* I2C Buffer Configuration Register (OMAP_I2C_BUF): */
+#define OMAP_I2C_BUF_RDMA_EN	(1 << 15)	/* RX DMA channel enable */
+#define OMAP_I2C_BUF_RXFIF_CLR	(1 << 14)	/* RX FIFO Clear */
+#define OMAP_I2C_BUF_XDMA_EN	(1 << 7)	/* TX DMA channel enable */
+#define OMAP_I2C_BUF_TXFIF_CLR	(1 << 6)	/* TX FIFO Clear */
+
+/* I2C Configuration Register (OMAP_I2C_CON): */
+#define OMAP_I2C_CON_EN		(1 << 15)	/* I2C module enable */
+#define OMAP_I2C_CON_BE		(1 << 14)	/* Big endian mode */
+#define OMAP_I2C_CON_OPMODE_HS	(1 << 12)	/* High Speed support */
+#define OMAP_I2C_CON_STB	(1 << 11)	/* Start byte mode (master) */
+#define OMAP_I2C_CON_MST	(1 << 10)	/* Master/slave mode */
+#define OMAP_I2C_CON_TRX	(1 << 9)	/* TX/RX mode (master only) */
+#define OMAP_I2C_CON_XA		(1 << 8)	/* Expand address */
+#define OMAP_I2C_CON_RM		(1 << 2)	/* Repeat mode (master only) */
+#define OMAP_I2C_CON_STP	(1 << 1)	/* Stop cond (master only) */
+#define OMAP_I2C_CON_STT	(1 << 0)	/* Start condition (master) */
+
+/* I2C SCL time value when Master */
+#define OMAP_I2C_SCLL_HSSCLL	8
+#define OMAP_I2C_SCLH_HSSCLH	8
+
+/* I2C System Test Register (OMAP_I2C_SYSTEST): */
+#ifdef DEBUG
+#define OMAP_I2C_SYSTEST_ST_EN		(1 << 15)	/* System test enable */
+#define OMAP_I2C_SYSTEST_FREE		(1 << 14)	/* Free running mode */
+#define OMAP_I2C_SYSTEST_TMODE_MASK	(3 << 12)	/* Test mode select */
+#define OMAP_I2C_SYSTEST_TMODE_SHIFT	(12)		/* Test mode select */
+#define OMAP_I2C_SYSTEST_SCL_I		(1 << 3)	/* SCL line sense in */
+#define OMAP_I2C_SYSTEST_SCL_O		(1 << 2)	/* SCL line drive out */
+#define OMAP_I2C_SYSTEST_SDA_I		(1 << 1)	/* SDA line sense in */
+#define OMAP_I2C_SYSTEST_SDA_O		(1 << 0)	/* SDA line drive out */
+#endif
+
+/* OCP_SYSSTATUS bit definitions */
+#define SYSS_RESETDONE_MASK		(1 << 0)
+
+/* OCP_SYSCONFIG bit definitions */
+#define SYSC_CLOCKACTIVITY_MASK		(0x3 << 8)
+#define SYSC_SIDLEMODE_MASK		(0x3 << 3)
+#define SYSC_ENAWAKEUP_MASK		(1 << 2)
+#define SYSC_SOFTRESET_MASK		(1 << 1)
+#define SYSC_AUTOIDLE_MASK		(1 << 0)
+
+#define SYSC_IDLEMODE_SMART		0x2
+#define SYSC_CLOCKACTIVITY_FCLK		0x2
+
+
+struct omap_i2c_struct {
+	void 			*base;
+	struct resource		*ioarea;
+	u32			speed;		/* Speed of bus in Khz */
+	u16			cmd_err;
+	u8			*buf;
+	size_t			buf_len;
+	struct i2c_adapter	adapter;
+	u8			fifo_size;	/* use as flag and value
+						 * fifo_size==0 implies no fifo
+						 * if set, should be trsh+1
+						 */
+	u8			rev;
+	unsigned		b_hw:1;		/* bad h/w fixes */
+	u16			iestate;	/* Saved interrupt register */
+	u16			pscstate;
+	u16			scllstate;
+	u16			sclhstate;
+	u16			bufstate;
+	u16			syscstate;
+	u16			westate;
+};
+#define to_omap_i2c_struct(a)	container_of(a, struct omap_i2c_struct, adapter)
+
+
+static inline void omap_i2c_write_reg(struct omap_i2c_struct *i2c_omap,
+				      int reg, u16 val)
+{
+	__raw_writew(val, i2c_omap->base + reg);
+}
+
+static inline u16 omap_i2c_read_reg(struct omap_i2c_struct *i2c_omap, int reg)
+{
+	return __raw_readw(i2c_omap->base + reg);
+}
+
+static void omap_i2c_unidle(struct omap_i2c_struct *i2c_omap)
+{
+	if (cpu_is_omap34xx()) {
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG, 0);
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_PSC_REG, i2c_omap->pscstate);
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_SCLL_REG, i2c_omap->scllstate);
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_SCLH_REG, i2c_omap->sclhstate);
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_BUF_REG, i2c_omap->bufstate);
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_SYSC_REG, i2c_omap->syscstate);
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_WE_REG, i2c_omap->westate);
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN);
+	}
+
+	/*
+	 * Don't write to this register if the IE state is 0 as it can
+	 * cause deadlock.
+	 */
+	if (i2c_omap->iestate)
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_IE_REG, i2c_omap->iestate);
+}
+
+static void omap_i2c_idle(struct omap_i2c_struct *i2c_omap)
+{
+	u16 iv;
+
+	i2c_omap->iestate = omap_i2c_read_reg(i2c_omap, OMAP_I2C_IE_REG);
+	/* omap_i2c_write_reg(i2c_omap, OMAP_I2C_IE_REG, 0); */
+	if (i2c_omap->rev < OMAP_I2C_REV_2) {
+		iv = omap_i2c_read_reg(i2c_omap, OMAP_I2C_IV_REG); /* Read clears */
+	} else {
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_STAT_REG, i2c_omap->iestate);
+
+		/* Flush posted write before the i2c_omap->idle store occurs */
+		omap_i2c_read_reg(i2c_omap, OMAP_I2C_STAT_REG);
+	}
+}
+
+static int omap_i2c_init(struct omap_i2c_struct *i2c_omap)
+{
+	u16 psc = 0, scll = 0, sclh = 0, buf = 0;
+	u16 fsscll = 0, fssclh = 0, hsscll = 0, hssclh = 0;
+	uint64_t start;
+
+	unsigned long fclk_rate = 12000000;
+	unsigned long internal_clk = 0;
+
+	if (i2c_omap->rev >= OMAP_I2C_REV_2) {
+		/* Disable I2C controller before soft reset */
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG,
+			omap_i2c_read_reg(i2c_omap, OMAP_I2C_CON_REG) &
+				~(OMAP_I2C_CON_EN));
+
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_SYSC_REG, SYSC_SOFTRESET_MASK);
+		/* For some reason we need to set the EN bit before the
+		 * reset done bit gets set. */
+		start = get_time_ns();
+
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN);
+		while (!(omap_i2c_read_reg(i2c_omap, OMAP_I2C_SYSS_REG) &
+			 SYSS_RESETDONE_MASK)) {
+			if (is_timeout(start, MSECOND)) {
+				dev_warn(i2c_omap->adapter.dev, "timeout waiting "
+						"for controller reset\n");
+				return -ETIMEDOUT;
+			}
+			mdelay(1);
+		}
+
+		/* SYSC register is cleared by the reset; rewrite it */
+		if (i2c_omap->rev == OMAP_I2C_REV_ON_2430) {
+
+			omap_i2c_write_reg(i2c_omap, OMAP_I2C_SYSC_REG,
+					   SYSC_AUTOIDLE_MASK);
+
+		} else if (i2c_omap->rev >= OMAP_I2C_REV_ON_3430) {
+			i2c_omap->syscstate = SYSC_AUTOIDLE_MASK;
+			i2c_omap->syscstate |= SYSC_ENAWAKEUP_MASK;
+			i2c_omap->syscstate |= (SYSC_IDLEMODE_SMART <<
+			      __ffs(SYSC_SIDLEMODE_MASK));
+			i2c_omap->syscstate |= (SYSC_CLOCKACTIVITY_FCLK <<
+			      __ffs(SYSC_CLOCKACTIVITY_MASK));
+
+			omap_i2c_write_reg(i2c_omap, OMAP_I2C_SYSC_REG,
+							i2c_omap->syscstate);
+			/*
+			 * Enabling all wakup sources to stop I2C freezing on
+			 * WFI instruction.
+			 * REVISIT: Some wkup sources might not be needed.
+			 */
+			i2c_omap->westate = OMAP_I2C_WE_ALL;
+			omap_i2c_write_reg(i2c_omap, OMAP_I2C_WE_REG, i2c_omap->westate);
+		}
+	}
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG, 0);
+
+	/* omap1 handling is missing here */
+
+	if (cpu_is_omap2430() || cpu_is_omap34xx()) {
+
+		/*
+		 * HSI2C controller internal clk rate should be 19.2 Mhz for
+		 * HS and for all modes on 2430. On 34xx we can use lower rate
+		 * to get longer filter period for better noise suppression.
+		 * The filter is iclk (fclk for HS) period.
+		 */
+		if (i2c_omap->speed > 400 || cpu_is_omap2430())
+			internal_clk = 19200;
+		else if (i2c_omap->speed > 100)
+			internal_clk = 9600;
+		else
+			internal_clk = 4000;
+		fclk_rate = 96000000 / 1000;
+
+		/* Compute prescaler divisor */
+		psc = fclk_rate / internal_clk;
+		psc = psc - 1;
+
+		/* If configured for High Speed */
+		if (i2c_omap->speed > 400) {
+			unsigned long scl;
+
+			/* For first phase of HS mode */
+			scl = internal_clk / 400;
+			fsscll = scl - (scl / 3) - 7;
+			fssclh = (scl / 3) - 5;
+
+			/* For second phase of HS mode */
+			scl = fclk_rate / i2c_omap->speed;
+			hsscll = scl - (scl / 3) - 7;
+			hssclh = (scl / 3) - 5;
+		} else if (i2c_omap->speed > 100) {
+			unsigned long scl;
+
+			/* Fast mode */
+			scl = internal_clk / i2c_omap->speed;
+			fsscll = scl - (scl / 3) - 7;
+			fssclh = (scl / 3) - 5;
+		} else {
+			/* Standard mode */
+			fsscll = internal_clk / (i2c_omap->speed * 2) - 7;
+			fssclh = internal_clk / (i2c_omap->speed * 2) - 5;
+		}
+		scll = (hsscll << OMAP_I2C_SCLL_HSSCLL) | fsscll;
+		sclh = (hssclh << OMAP_I2C_SCLH_HSSCLH) | fssclh;
+	} else {
+		/* Program desired operating rate */
+		fclk_rate /= (psc + 1) * 1000;
+		if (psc > 2)
+			psc = 2;
+		scll = fclk_rate / (i2c_omap->speed * 2) - 7 + psc;
+		sclh = fclk_rate / (i2c_omap->speed * 2) - 7 + psc;
+	}
+
+	/* Setup clock prescaler to obtain approx 12MHz I2C module clock: */
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_PSC_REG, psc);
+
+	/* SCL low and high time values */
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_SCLL_REG, scll);
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_SCLH_REG, sclh);
+
+	if (i2c_omap->fifo_size) {
+		/* Note: setup required fifo size - 1. RTRSH and XTRSH */
+		buf = (i2c_omap->fifo_size - 1) << 8 | OMAP_I2C_BUF_RXFIF_CLR |
+			(i2c_omap->fifo_size - 1) | OMAP_I2C_BUF_TXFIF_CLR;
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_BUF_REG, buf);
+	}
+
+	/* Take the I2C module out of reset: */
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN);
+
+	/* Enable interrupts */
+	i2c_omap->iestate = (OMAP_I2C_IE_XRDY | OMAP_I2C_IE_RRDY |
+			OMAP_I2C_IE_ARDY | OMAP_I2C_IE_NACK |
+			OMAP_I2C_IE_AL)  | ((i2c_omap->fifo_size) ?
+				(OMAP_I2C_IE_RDR | OMAP_I2C_IE_XDR) : 0);
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_IE_REG, i2c_omap->iestate);
+	if (cpu_is_omap34xx()) {
+		i2c_omap->pscstate = psc;
+		i2c_omap->scllstate = scll;
+		i2c_omap->sclhstate = sclh;
+		i2c_omap->bufstate = buf;
+	}
+	return 0;
+}
+
+/*
+ * Waiting on Bus Busy
+ */
+static int omap_i2c_wait_for_bb(struct i2c_adapter *adapter)
+{
+	uint64_t start;
+	struct omap_i2c_struct *i2c_omap = to_omap_i2c_struct(adapter);
+
+	start = get_time_ns();
+	while (omap_i2c_read_reg(i2c_omap, OMAP_I2C_STAT_REG) & OMAP_I2C_STAT_BB) {
+		if (is_timeout(start, MSECOND)) {
+			dev_warn(adapter->dev, "timeout waiting for bus ready\n");
+			return -ETIMEDOUT;
+		}
+	}
+
+	return 0;
+}
+
+static inline void
+omap_i2c_ack_stat(struct omap_i2c_struct *i2c_omap, u16 stat)
+{
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_STAT_REG, stat);
+}
+
+static int
+omap_i2c_isr(struct omap_i2c_struct *dev)
+{
+	u16 bits;
+	u16 stat, w;
+	int err, count = 0;
+
+	bits = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG);
+	while ((stat = (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG))) & bits) {
+		dev_dbg(dev->adapter.dev, "IRQ (ISR = 0x%04x)\n", stat);
+		if (count++ == 100) {
+			dev_warn(dev->adapter.dev, "Too much work in one IRQ\n");
+			break;
+		}
+
+		err = 0;
+complete:
+		/*
+		 * Ack the stat in one go, but [R/X]DR and [R/X]RDY should be
+		 * acked after the data operation is complete.
+		 * Ref: TRM SWPU114Q Figure 18-31
+		 */
+		omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat &
+				~(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
+				OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
+
+		if (stat & OMAP_I2C_STAT_NACK) {
+			err |= OMAP_I2C_STAT_NACK;
+			omap_i2c_write_reg(dev, OMAP_I2C_CON_REG,
+					   OMAP_I2C_CON_STP);
+		}
+		if (stat & OMAP_I2C_STAT_AL) {
+			dev_err(dev->adapter.dev, "Arbitration lost\n");
+			err |= OMAP_I2C_STAT_AL;
+		}
+		if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
+					OMAP_I2C_STAT_AL)) {
+			omap_i2c_ack_stat(dev, stat &
+				(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
+				OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
+			return 0;
+		}
+		if (stat & (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR)) {
+			u8 num_bytes = 1;
+			if (dev->fifo_size) {
+				if (stat & OMAP_I2C_STAT_RRDY)
+					num_bytes = dev->fifo_size;
+				else    /* read RXSTAT on RDR interrupt */
+					num_bytes = (omap_i2c_read_reg(dev,
+							OMAP_I2C_BUFSTAT_REG)
+							>> 8) & 0x3F;
+			}
+			while (num_bytes) {
+				num_bytes--;
+				w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG);
+				if (dev->buf_len) {
+					*dev->buf++ = w;
+					dev->buf_len--;
+					/* Data reg from 2430 is 8 bit wide */
+					if (!cpu_is_omap2430() &&
+							!cpu_is_omap34xx()) {
+						if (dev->buf_len) {
+							*dev->buf++ = w >> 8;
+							dev->buf_len--;
+						}
+					}
+				} else {
+					if (stat & OMAP_I2C_STAT_RRDY)
+						dev_err(dev->adapter.dev,
+							"RRDY IRQ while no data"
+								" requested\n");
+					if (stat & OMAP_I2C_STAT_RDR)
+						dev_err(dev->adapter.dev,
+							"RDR IRQ while no data"
+								" requested\n");
+					break;
+				}
+			}
+			omap_i2c_ack_stat(dev,
+				stat & (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR));
+			continue;
+		}
+		if (stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)) {
+			u8 num_bytes = 1;
+			if (dev->fifo_size) {
+				if (stat & OMAP_I2C_STAT_XRDY)
+					num_bytes = dev->fifo_size;
+				else    /* read TXSTAT on XDR interrupt */
+					num_bytes = omap_i2c_read_reg(dev,
+							OMAP_I2C_BUFSTAT_REG)
+							& 0x3F;
+			}
+			while (num_bytes) {
+				num_bytes--;
+				w = 0;
+				if (dev->buf_len) {
+					w = *dev->buf++;
+					dev->buf_len--;
+					/* Data reg from  2430 is 8 bit wide */
+					if (!cpu_is_omap2430() &&
+							!cpu_is_omap34xx()) {
+						if (dev->buf_len) {
+							w |= *dev->buf++ << 8;
+							dev->buf_len--;
+						}
+					}
+				} else {
+					if (stat & OMAP_I2C_STAT_XRDY)
+						dev_err(dev->adapter.dev,
+							"XRDY IRQ while no "
+							"data to send\n");
+					if (stat & OMAP_I2C_STAT_XDR)
+						dev_err(dev->adapter.dev,
+							"XDR IRQ while no "
+							"data to send\n");
+					break;
+				}
+
+				/*
+				 * OMAP3430 Errata 1.153: When an XRDY/XDR
+				 * is hit, wait for XUDF before writing data
+				 * to DATA_REG. Otherwise some data bytes can
+				 * be lost while transferring them from the
+				 * memory to the I2C interface.
+				 */
+
+				if (dev->rev <= OMAP_I2C_REV_ON_3430) {
+						while (!(stat & OMAP_I2C_STAT_XUDF)) {
+							if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
+								omap_i2c_ack_stat(dev, stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
+								err |= OMAP_I2C_STAT_XUDF;
+								goto complete;
+							}
+							stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
+						}
+				}
+
+				omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w);
+			}
+			omap_i2c_ack_stat(dev,
+				stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
+			continue;
+		}
+		if (stat & OMAP_I2C_STAT_ROVR) {
+			dev_err(dev->adapter.dev, "Receive overrun\n");
+			dev->cmd_err |= OMAP_I2C_STAT_ROVR;
+		}
+		if (stat & OMAP_I2C_STAT_XUDF) {
+			dev_err(dev->adapter.dev, "Transmit underflow\n");
+			dev->cmd_err |= OMAP_I2C_STAT_XUDF;
+		}
+	}
+
+	return -EBUSY;
+}
+
+
+/*
+ * Low level master read/write transaction.
+ */
+static int omap_i2c_xfer_msg(struct i2c_adapter *adapter,
+			     struct i2c_msg *msg, int stop)
+{
+	struct omap_i2c_struct *i2c_omap = to_omap_i2c_struct(adapter);
+	uint64_t start;
+	u16 con;
+	u16 w;
+	int ret = 0;
+
+
+	dev_dbg(adapter->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n",
+		msg->addr, msg->len, msg->flags, stop);
+
+	if (msg->len == 0)
+		return -EINVAL;
+
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_SA_REG, msg->addr);
+
+	/* REVISIT: Could the STB bit of I2C_CON be used with probing? */
+	i2c_omap->buf = msg->buf;
+	i2c_omap->buf_len = msg->len;
+
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_CNT_REG, i2c_omap->buf_len);
+
+	/* Clear the FIFO Buffers */
+	w = omap_i2c_read_reg(i2c_omap, OMAP_I2C_BUF_REG);
+	w |= OMAP_I2C_BUF_RXFIF_CLR | OMAP_I2C_BUF_TXFIF_CLR;
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_BUF_REG, w);
+
+	i2c_omap->cmd_err = 0;
+
+	w = OMAP_I2C_CON_EN | OMAP_I2C_CON_MST | OMAP_I2C_CON_STT;
+
+	/* High speed configuration */
+	if (i2c_omap->speed > 400)
+		w |= OMAP_I2C_CON_OPMODE_HS;
+
+	if (msg->flags & I2C_M_TEN)
+		w |= OMAP_I2C_CON_XA;
+	if (!(msg->flags & I2C_M_RD))
+		w |= OMAP_I2C_CON_TRX;
+
+	if (!i2c_omap->b_hw && stop)
+		w |= OMAP_I2C_CON_STP;
+
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG, w);
+
+	/*
+	 * Don't write stt and stp together on some hardware.
+	 */
+	if (i2c_omap->b_hw && stop) {
+		start = get_time_ns();
+		con = omap_i2c_read_reg(i2c_omap, OMAP_I2C_CON_REG);
+		while (con & OMAP_I2C_CON_STT) {
+			con = omap_i2c_read_reg(i2c_omap, OMAP_I2C_CON_REG);
+
+			/* Let the user know if i2c is in a bad state */
+			if (is_timeout(start, MSECOND)) {
+				dev_err(adapter->dev, "controller timed out "
+				"waiting for start condition to finish\n");
+				return -ETIMEDOUT;
+			}
+		}
+
+		w |= OMAP_I2C_CON_STP;
+		w &= ~OMAP_I2C_CON_STT;
+		omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG, w);
+	}
+
+	/*
+	 * REVISIT: We should abort the transfer on signals, but the bus goes
+	 * into arbitration and we're currently unable to recover from it.
+	 */
+	start = get_time_ns();
+	ret = omap_i2c_isr(i2c_omap);
+	while (ret){
+		ret = omap_i2c_isr(i2c_omap);
+		if (is_timeout(start, MSECOND)) {
+				dev_err(adapter->dev, "timed out on polling for"
+				"open i2c message handling\n");
+				return -ETIMEDOUT;
+			}
+	}
+
+	i2c_omap->buf_len = 0;
+	if (likely(!i2c_omap->cmd_err))
+		return 0;
+
+	/* We have an error */
+	if (i2c_omap->cmd_err & (OMAP_I2C_STAT_AL | OMAP_I2C_STAT_ROVR |
+			    OMAP_I2C_STAT_XUDF)) {
+		omap_i2c_init(i2c_omap);
+		return -EIO;
+	}
+
+	if (i2c_omap->cmd_err & OMAP_I2C_STAT_NACK) {
+		if (msg->flags & I2C_M_IGNORE_NAK)
+			return 0;
+		if (stop) {
+			w = omap_i2c_read_reg(i2c_omap, OMAP_I2C_CON_REG);
+			w |= OMAP_I2C_CON_STP;
+			omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG, w);
+		}
+		return -EREMOTEIO;
+	}
+	return -EIO;
+}
+
+
+/*
+ * Prepare controller for a transaction and call omap_i2c_xfer_msg
+ * to do the work during IRQ processing.
+ */
+static int
+omap_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg msgs[], int num)
+{
+	struct omap_i2c_struct *i2c_omap = to_omap_i2c_struct(adapter);
+	int i;
+	int r;
+
+	omap_i2c_unidle(i2c_omap);
+
+	r = omap_i2c_wait_for_bb(adapter);
+	if (r < 0)
+		goto out;
+
+	for (i = 0; i < num; i++) {
+		r = omap_i2c_xfer_msg(adapter, &msgs[i], (i == (num - 1)));
+		if (r != 0)
+			break;
+	}
+
+	if (r == 0)
+		r = num;
+out:
+	omap_i2c_idle(i2c_omap);
+	return r;
+}
+
+static int __init
+i2c_omap_probe(struct device_d *pdev)
+{
+	struct omap_i2c_struct	*i2c_omap;
+	/* struct i2c_platform_data *pdata; */
+	/* unsigned long base = pdev->map_base; */
+	int r;
+	u32 speed = 0;
+
+	i2c_omap = kzalloc(sizeof(struct omap_i2c_struct), GFP_KERNEL);
+	if (!i2c_omap) {
+		r = -ENOMEM;
+		goto err_free_mem;
+	}
+
+	if (pdev->platform_data != NULL)
+		speed = *(u32 *)pdev->platform_data;
+	else
+		speed = 100;	/* Defualt speed */
+
+	i2c_omap->speed = speed;
+	i2c_omap->base = (void*)pdev->map_base;
+	printf ("I2C probe\n");
+	omap_i2c_unidle(i2c_omap);
+
+	i2c_omap->rev = omap_i2c_read_reg(i2c_omap, OMAP_I2C_REV_REG) & 0xff;
+	/* i2c_omap->base = OMAP2_I2C_BASE3; */
+
+	if (cpu_is_omap2430() || cpu_is_omap34xx()) {
+		u16 s;
+
+		/* Set up the fifo size - Get total size */
+		s = (omap_i2c_read_reg(i2c_omap, OMAP_I2C_BUFSTAT_REG) >> 14) & 0x3;
+		i2c_omap->fifo_size = 0x8 << s;
+
+		/*
+		 * Set up notification threshold as half the total available
+		 * size. This is to ensure that we can handle the status on int
+		 * call back latencies.
+		 */
+		i2c_omap->fifo_size = (i2c_omap->fifo_size / 2);
+		i2c_omap->b_hw = 1; /* Enable hardware fixes */
+	}
+
+	/* reset ASAP, clearing any IRQs */
+	omap_i2c_init(i2c_omap);
+
+	dev_info(pdev, "bus %d rev%d.%d at %d kHz\n",
+		 pdev->id, i2c_omap->rev >> 4, i2c_omap->rev & 0xf, i2c_omap->speed);
+
+	omap_i2c_idle(i2c_omap);
+
+	i2c_omap->adapter.master_xfer	= omap_i2c_xfer,
+	i2c_omap->adapter.nr = pdev->id;
+	i2c_omap->adapter.dev = pdev;
+
+	/* i2c device drivers may be active on return from add_adapter() */
+	r = i2c_add_numbered_adapter(&i2c_omap->adapter);
+	if (r) {
+		dev_err(pdev, "failure adding adapter\n");
+		goto err_unuse_clocks;
+	}
+
+	return 0;
+
+err_unuse_clocks:
+	omap_i2c_write_reg(i2c_omap, OMAP_I2C_CON_REG, 0);
+	omap_i2c_idle(i2c_omap);
+
+err_free_mem:
+	kfree(i2c_omap);
+
+	return r;
+}
+
+static struct driver_d omap_i2c_driver = {
+	.probe		= i2c_omap_probe,
+	.name		= DRIVER_NAME,
+};
+
+/* I2C may be needed to bring up other drivers */
+static int __init omap_i2c_init_driver(void)
+{
+	return register_driver(&omap_i2c_driver);
+}
+device_initcall(omap_i2c_init_driver);
+
+MODULE_AUTHOR("MontaVista Software, Inc. (and others)");
+MODULE_DESCRIPTION("TI OMAP I2C bus adapter");
+MODULE_LICENSE("GPL");
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug  4 05:59:15 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed,  4 Aug 2010 11:59:15 +0200
Subject: [PATCH 11/13] ehci: add omap support
In-Reply-To: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1280915957-2910-12-git-send-email-m.grzeschik@pengutronix.de>

with cm-regbits-34xx.h and codebase from linux kernel

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 arch/arm/mach-omap/include/mach/cm-regbits-34xx.h |  799 +++++++++++++++++++++
 arch/arm/mach-omap/include/mach/ehci.h            |  109 +++
 arch/arm/mach-omap/include/mach/omap3-clock.h     |   11 +
 arch/arm/mach-omap/include/mach/omap3-silicon.h   |    6 +
 drivers/usb/host/Kconfig                          |    4 +
 drivers/usb/host/Makefile                         |    1 +
 drivers/usb/host/ehci-omap.c                      |  260 +++++++
 7 files changed, 1190 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-omap/include/mach/cm-regbits-34xx.h
 create mode 100644 arch/arm/mach-omap/include/mach/ehci.h
 create mode 100644 drivers/usb/host/ehci-omap.c

diff --git a/arch/arm/mach-omap/include/mach/cm-regbits-34xx.h b/arch/arm/mach-omap/include/mach/cm-regbits-34xx.h
new file mode 100644
index 0000000..16a0201
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/cm-regbits-34xx.h
@@ -0,0 +1,799 @@
+#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_34XX_H
+#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_34XX_H
+
+/*
+ * OMAP3430 Clock Management register bits
+ *
+ * Copyright (C) 2007-2008 Texas Instruments, Inc.
+ * Copyright (C) 2007-2008 Nokia Corporation
+ *
+ * Written by Paul Walmsley
+ *
+ * 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.
+ */
+
+/* Bits shared between registers */
+
+/* CM_FCLKEN1_CORE and CM_ICLKEN1_CORE shared bits */
+#define OMAP3430ES2_EN_MMC3_MASK			(1 << 30)
+#define OMAP3430ES2_EN_MMC3_SHIFT			30
+#define OMAP3430_EN_MSPRO_MASK				(1 << 23)
+#define OMAP3430_EN_MSPRO_SHIFT				23
+#define OMAP3430_EN_HDQ_MASK				(1 << 22)
+#define OMAP3430_EN_HDQ_SHIFT				22
+#define OMAP3430ES1_EN_FSHOSTUSB_MASK			(1 << 5)
+#define OMAP3430ES1_EN_FSHOSTUSB_SHIFT			5
+#define OMAP3430ES1_EN_D2D_MASK				(1 << 3)
+#define OMAP3430ES1_EN_D2D_SHIFT			3
+#define OMAP3430_EN_SSI_MASK				(1 << 0)
+#define OMAP3430_EN_SSI_SHIFT				0
+
+/* CM_FCLKEN3_CORE and CM_ICLKEN3_CORE shared bits */
+#define OMAP3430ES2_EN_USBTLL_SHIFT			2
+#define OMAP3430ES2_EN_USBTLL_MASK			(1 << 2)
+
+/* CM_FCLKEN_WKUP and CM_ICLKEN_WKUP shared bits */
+#define OMAP3430_EN_WDT2_MASK				(1 << 5)
+#define OMAP3430_EN_WDT2_SHIFT				5
+
+/* CM_ICLKEN_CAM, CM_FCLKEN_CAM shared bits */
+#define OMAP3430_EN_CAM_MASK				(1 << 0)
+#define OMAP3430_EN_CAM_SHIFT				0
+
+/* CM_FCLKEN_PER, CM_ICLKEN_PER shared bits */
+#define OMAP3430_EN_WDT3_MASK				(1 << 12)
+#define OMAP3430_EN_WDT3_SHIFT				12
+
+/* CM_CLKSEL2_EMU, CM_CLKSEL3_EMU shared bits */
+#define OMAP3430_OVERRIDE_ENABLE_MASK			(1 << 19)
+
+
+/* Bits specific to each register */
+
+/* CM_FCLKEN_IVA2 */
+#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK		(1 << 0)
+#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT		0
+
+/* CM_CLKEN_PLL_IVA2 */
+#define OMAP3430_IVA2_DPLL_RAMPTIME_SHIFT		8
+#define OMAP3430_IVA2_DPLL_RAMPTIME_MASK		(0x3 << 8)
+#define OMAP3430_IVA2_DPLL_FREQSEL_SHIFT		4
+#define OMAP3430_IVA2_DPLL_FREQSEL_MASK			(0xf << 4)
+#define OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT		3
+#define OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_MASK		(1 << 3)
+#define OMAP3430_EN_IVA2_DPLL_SHIFT			0
+#define OMAP3430_EN_IVA2_DPLL_MASK			(0x7 << 0)
+
+/* CM_IDLEST_IVA2 */
+#define OMAP3430_ST_IVA2_MASK				(1 << 0)
+
+/* CM_IDLEST_PLL_IVA2 */
+#define OMAP3430_ST_IVA2_CLK_SHIFT			0
+#define OMAP3430_ST_IVA2_CLK_MASK			(1 << 0)
+
+/* CM_AUTOIDLE_PLL_IVA2 */
+#define OMAP3430_AUTO_IVA2_DPLL_SHIFT			0
+#define OMAP3430_AUTO_IVA2_DPLL_MASK			(0x7 << 0)
+
+/* CM_CLKSEL1_PLL_IVA2 */
+#define OMAP3430_IVA2_CLK_SRC_SHIFT			19
+#define OMAP3430_IVA2_CLK_SRC_MASK			(0x3 << 19)
+#define OMAP3430_IVA2_DPLL_MULT_SHIFT			8
+#define OMAP3430_IVA2_DPLL_MULT_MASK			(0x7ff << 8)
+#define OMAP3430_IVA2_DPLL_DIV_SHIFT			0
+#define OMAP3430_IVA2_DPLL_DIV_MASK			(0x7f << 0)
+
+/* CM_CLKSEL2_PLL_IVA2 */
+#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_SHIFT		0
+#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK		(0x1f << 0)
+
+/* CM_CLKSTCTRL_IVA2 */
+#define OMAP3430_CLKTRCTRL_IVA2_SHIFT			0
+#define OMAP3430_CLKTRCTRL_IVA2_MASK			(0x3 << 0)
+
+/* CM_CLKSTST_IVA2 */
+#define OMAP3430_CLKACTIVITY_IVA2_SHIFT			0
+#define OMAP3430_CLKACTIVITY_IVA2_MASK			(1 << 0)
+
+/* CM_REVISION specific bits */
+
+/* CM_SYSCONFIG specific bits */
+
+/* CM_CLKEN_PLL_MPU */
+#define OMAP3430_MPU_DPLL_RAMPTIME_SHIFT		8
+#define OMAP3430_MPU_DPLL_RAMPTIME_MASK			(0x3 << 8)
+#define OMAP3430_MPU_DPLL_FREQSEL_SHIFT			4
+#define OMAP3430_MPU_DPLL_FREQSEL_MASK			(0xf << 4)
+#define OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT		3
+#define OMAP3430_EN_MPU_DPLL_DRIFTGUARD_MASK		(1 << 3)
+#define OMAP3430_EN_MPU_DPLL_SHIFT			0
+#define OMAP3430_EN_MPU_DPLL_MASK			(0x7 << 0)
+
+/* CM_IDLEST_MPU */
+#define OMAP3430_ST_MPU_MASK				(1 << 0)
+
+/* CM_IDLEST_PLL_MPU */
+#define OMAP3430_ST_MPU_CLK_SHIFT			0
+#define OMAP3430_ST_MPU_CLK_MASK			(1 << 0)
+
+/* CM_AUTOIDLE_PLL_MPU */
+#define OMAP3430_AUTO_MPU_DPLL_SHIFT			0
+#define OMAP3430_AUTO_MPU_DPLL_MASK			(0x7 << 0)
+
+/* CM_CLKSEL1_PLL_MPU */
+#define OMAP3430_MPU_CLK_SRC_SHIFT			19
+#define OMAP3430_MPU_CLK_SRC_MASK			(0x3 << 19)
+#define OMAP3430_MPU_DPLL_MULT_SHIFT			8
+#define OMAP3430_MPU_DPLL_MULT_MASK			(0x7ff << 8)
+#define OMAP3430_MPU_DPLL_DIV_SHIFT			0
+#define OMAP3430_MPU_DPLL_DIV_MASK			(0x7f << 0)
+
+/* CM_CLKSEL2_PLL_MPU */
+#define OMAP3430_MPU_DPLL_CLKOUT_DIV_SHIFT		0
+#define OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK		(0x1f << 0)
+
+/* CM_CLKSTCTRL_MPU */
+#define OMAP3430_CLKTRCTRL_MPU_SHIFT			0
+#define OMAP3430_CLKTRCTRL_MPU_MASK			(0x3 << 0)
+
+/* CM_CLKSTST_MPU */
+#define OMAP3430_CLKACTIVITY_MPU_SHIFT			0
+#define OMAP3430_CLKACTIVITY_MPU_MASK			(1 << 0)
+
+/* CM_FCLKEN1_CORE specific bits */
+#define OMAP3430_EN_MODEM_MASK				(1 << 31)
+#define OMAP3430_EN_MODEM_SHIFT				31
+
+/* CM_ICLKEN1_CORE specific bits */
+#define OMAP3430_EN_ICR_MASK				(1 << 29)
+#define OMAP3430_EN_ICR_SHIFT				29
+#define OMAP3430_EN_AES2_MASK				(1 << 28)
+#define OMAP3430_EN_AES2_SHIFT				28
+#define OMAP3430_EN_SHA12_MASK				(1 << 27)
+#define OMAP3430_EN_SHA12_SHIFT				27
+#define OMAP3430_EN_DES2_MASK				(1 << 26)
+#define OMAP3430_EN_DES2_SHIFT				26
+#define OMAP3430ES1_EN_FAC_MASK				(1 << 8)
+#define OMAP3430ES1_EN_FAC_SHIFT			8
+#define OMAP3430_EN_MAILBOXES_MASK			(1 << 7)
+#define OMAP3430_EN_MAILBOXES_SHIFT			7
+#define OMAP3430_EN_OMAPCTRL_MASK			(1 << 6)
+#define OMAP3430_EN_OMAPCTRL_SHIFT			6
+#define OMAP3430_EN_SAD2D_MASK				(1 << 3)
+#define OMAP3430_EN_SAD2D_SHIFT				3
+#define OMAP3430_EN_SDRC_MASK				(1 << 1)
+#define OMAP3430_EN_SDRC_SHIFT				1
+
+/* AM35XX specific CM_ICLKEN1_CORE bits */
+#define AM35XX_EN_IPSS_MASK				(1 << 4)
+#define AM35XX_EN_IPSS_SHIFT				4
+#define AM35XX_EN_UART4_MASK				(1 << 23)
+#define AM35XX_EN_UART4_SHIFT				23
+
+/* CM_ICLKEN2_CORE */
+#define OMAP3430_EN_PKA_MASK				(1 << 4)
+#define OMAP3430_EN_PKA_SHIFT				4
+#define OMAP3430_EN_AES1_MASK				(1 << 3)
+#define OMAP3430_EN_AES1_SHIFT				3
+#define OMAP3430_EN_RNG_MASK				(1 << 2)
+#define OMAP3430_EN_RNG_SHIFT				2
+#define OMAP3430_EN_SHA11_MASK				(1 << 1)
+#define OMAP3430_EN_SHA11_SHIFT				1
+#define OMAP3430_EN_DES1_MASK				(1 << 0)
+#define OMAP3430_EN_DES1_SHIFT				0
+
+/* CM_ICLKEN3_CORE */
+#define OMAP3430_EN_MAD2D_SHIFT				3
+#define OMAP3430_EN_MAD2D_MASK				(1 << 3)
+
+/* CM_FCLKEN3_CORE specific bits */
+#define OMAP3430ES2_EN_TS_SHIFT				1
+#define OMAP3430ES2_EN_TS_MASK				(1 << 1)
+#define OMAP3430ES2_EN_CPEFUSE_SHIFT			0
+#define OMAP3430ES2_EN_CPEFUSE_MASK			(1 << 0)
+
+/* CM_IDLEST1_CORE specific bits */
+#define OMAP3430ES2_ST_MMC3_SHIFT			30
+#define OMAP3430ES2_ST_MMC3_MASK			(1 << 30)
+#define OMAP3430_ST_ICR_SHIFT				29
+#define OMAP3430_ST_ICR_MASK				(1 << 29)
+#define OMAP3430_ST_AES2_SHIFT				28
+#define OMAP3430_ST_AES2_MASK				(1 << 28)
+#define OMAP3430_ST_SHA12_SHIFT				27
+#define OMAP3430_ST_SHA12_MASK				(1 << 27)
+#define OMAP3430_ST_DES2_SHIFT				26
+#define OMAP3430_ST_DES2_MASK				(1 << 26)
+#define OMAP3430_ST_MSPRO_SHIFT				23
+#define OMAP3430_ST_MSPRO_MASK				(1 << 23)
+#define OMAP3430_ST_HDQ_SHIFT				22
+#define OMAP3430_ST_HDQ_MASK				(1 << 22)
+#define OMAP3430ES1_ST_FAC_SHIFT			8
+#define OMAP3430ES1_ST_FAC_MASK				(1 << 8)
+#define OMAP3430ES2_ST_SSI_IDLE_SHIFT			8
+#define OMAP3430ES2_ST_SSI_IDLE_MASK			(1 << 8)
+#define OMAP3430_ST_MAILBOXES_SHIFT			7
+#define OMAP3430_ST_MAILBOXES_MASK			(1 << 7)
+#define OMAP3430_ST_OMAPCTRL_SHIFT			6
+#define OMAP3430_ST_OMAPCTRL_MASK			(1 << 6)
+#define OMAP3430_ST_SDMA_SHIFT				2
+#define OMAP3430_ST_SDMA_MASK				(1 << 2)
+#define OMAP3430_ST_SDRC_SHIFT				1
+#define OMAP3430_ST_SDRC_MASK				(1 << 1)
+#define OMAP3430_ST_SSI_STDBY_SHIFT			0
+#define OMAP3430_ST_SSI_STDBY_MASK			(1 << 0)
+
+/* AM35xx specific CM_IDLEST1_CORE bits */
+#define AM35XX_ST_IPSS_SHIFT				5
+#define AM35XX_ST_IPSS_MASK 				(1 << 5)
+
+/* CM_IDLEST2_CORE */
+#define OMAP3430_ST_PKA_SHIFT				4
+#define OMAP3430_ST_PKA_MASK				(1 << 4)
+#define OMAP3430_ST_AES1_SHIFT				3
+#define OMAP3430_ST_AES1_MASK				(1 << 3)
+#define OMAP3430_ST_RNG_SHIFT				2
+#define OMAP3430_ST_RNG_MASK				(1 << 2)
+#define OMAP3430_ST_SHA11_SHIFT				1
+#define OMAP3430_ST_SHA11_MASK				(1 << 1)
+#define OMAP3430_ST_DES1_SHIFT				0
+#define OMAP3430_ST_DES1_MASK				(1 << 0)
+
+/* CM_IDLEST3_CORE */
+#define OMAP3430ES2_ST_USBTLL_SHIFT			2
+#define OMAP3430ES2_ST_USBTLL_MASK			(1 << 2)
+#define OMAP3430ES2_ST_CPEFUSE_SHIFT			0
+#define OMAP3430ES2_ST_CPEFUSE_MASK			(1 << 0)
+
+/* CM_AUTOIDLE1_CORE */
+#define OMAP3430_AUTO_MODEM_MASK			(1 << 31)
+#define OMAP3430_AUTO_MODEM_SHIFT			31
+#define OMAP3430ES2_AUTO_MMC3_MASK			(1 << 30)
+#define OMAP3430ES2_AUTO_MMC3_SHIFT			30
+#define OMAP3430ES2_AUTO_ICR_MASK			(1 << 29)
+#define OMAP3430ES2_AUTO_ICR_SHIFT			29
+#define OMAP3430_AUTO_AES2_MASK				(1 << 28)
+#define OMAP3430_AUTO_AES2_SHIFT			28
+#define OMAP3430_AUTO_SHA12_MASK			(1 << 27)
+#define OMAP3430_AUTO_SHA12_SHIFT			27
+#define OMAP3430_AUTO_DES2_MASK				(1 << 26)
+#define OMAP3430_AUTO_DES2_SHIFT			26
+#define OMAP3430_AUTO_MMC2_MASK				(1 << 25)
+#define OMAP3430_AUTO_MMC2_SHIFT			25
+#define OMAP3430_AUTO_MMC1_MASK				(1 << 24)
+#define OMAP3430_AUTO_MMC1_SHIFT			24
+#define OMAP3430_AUTO_MSPRO_MASK			(1 << 23)
+#define OMAP3430_AUTO_MSPRO_SHIFT			23
+#define OMAP3430_AUTO_HDQ_MASK				(1 << 22)
+#define OMAP3430_AUTO_HDQ_SHIFT				22
+#define OMAP3430_AUTO_MCSPI4_MASK			(1 << 21)
+#define OMAP3430_AUTO_MCSPI4_SHIFT			21
+#define OMAP3430_AUTO_MCSPI3_MASK			(1 << 20)
+#define OMAP3430_AUTO_MCSPI3_SHIFT			20
+#define OMAP3430_AUTO_MCSPI2_MASK			(1 << 19)
+#define OMAP3430_AUTO_MCSPI2_SHIFT			19
+#define OMAP3430_AUTO_MCSPI1_MASK			(1 << 18)
+#define OMAP3430_AUTO_MCSPI1_SHIFT			18
+#define OMAP3430_AUTO_I2C3_MASK				(1 << 17)
+#define OMAP3430_AUTO_I2C3_SHIFT			17
+#define OMAP3430_AUTO_I2C2_MASK				(1 << 16)
+#define OMAP3430_AUTO_I2C2_SHIFT			16
+#define OMAP3430_AUTO_I2C1_MASK				(1 << 15)
+#define OMAP3430_AUTO_I2C1_SHIFT			15
+#define OMAP3430_AUTO_UART2_MASK			(1 << 14)
+#define OMAP3430_AUTO_UART2_SHIFT			14
+#define OMAP3430_AUTO_UART1_MASK			(1 << 13)
+#define OMAP3430_AUTO_UART1_SHIFT			13
+#define OMAP3430_AUTO_GPT11_MASK			(1 << 12)
+#define OMAP3430_AUTO_GPT11_SHIFT			12
+#define OMAP3430_AUTO_GPT10_MASK			(1 << 11)
+#define OMAP3430_AUTO_GPT10_SHIFT			11
+#define OMAP3430_AUTO_MCBSP5_MASK			(1 << 10)
+#define OMAP3430_AUTO_MCBSP5_SHIFT			10
+#define OMAP3430_AUTO_MCBSP1_MASK			(1 << 9)
+#define OMAP3430_AUTO_MCBSP1_SHIFT			9
+#define OMAP3430ES1_AUTO_FAC_MASK			(1 << 8)
+#define OMAP3430ES1_AUTO_FAC_SHIFT			8
+#define OMAP3430_AUTO_MAILBOXES_MASK			(1 << 7)
+#define OMAP3430_AUTO_MAILBOXES_SHIFT			7
+#define OMAP3430_AUTO_OMAPCTRL_MASK			(1 << 6)
+#define OMAP3430_AUTO_OMAPCTRL_SHIFT			6
+#define OMAP3430ES1_AUTO_FSHOSTUSB_MASK			(1 << 5)
+#define OMAP3430ES1_AUTO_FSHOSTUSB_SHIFT		5
+#define OMAP3430_AUTO_HSOTGUSB_MASK			(1 << 4)
+#define OMAP3430_AUTO_HSOTGUSB_SHIFT			4
+#define OMAP3430ES1_AUTO_D2D_MASK			(1 << 3)
+#define OMAP3430ES1_AUTO_D2D_SHIFT			3
+#define OMAP3430_AUTO_SAD2D_MASK			(1 << 3)
+#define OMAP3430_AUTO_SAD2D_SHIFT			3
+#define OMAP3430_AUTO_SSI_MASK				(1 << 0)
+#define OMAP3430_AUTO_SSI_SHIFT				0
+
+/* CM_AUTOIDLE2_CORE */
+#define OMAP3430_AUTO_PKA_MASK				(1 << 4)
+#define OMAP3430_AUTO_PKA_SHIFT				4
+#define OMAP3430_AUTO_AES1_MASK				(1 << 3)
+#define OMAP3430_AUTO_AES1_SHIFT			3
+#define OMAP3430_AUTO_RNG_MASK				(1 << 2)
+#define OMAP3430_AUTO_RNG_SHIFT				2
+#define OMAP3430_AUTO_SHA11_MASK			(1 << 1)
+#define OMAP3430_AUTO_SHA11_SHIFT			1
+#define OMAP3430_AUTO_DES1_MASK				(1 << 0)
+#define OMAP3430_AUTO_DES1_SHIFT			0
+
+/* CM_AUTOIDLE3_CORE */
+#define	OMAP3430ES2_AUTO_USBHOST			(1 << 0)
+#define	OMAP3430ES2_AUTO_USBHOST_SHIFT			0
+#define	OMAP3430ES2_AUTO_USBTLL				(1 << 2)
+#define OMAP3430ES2_AUTO_USBTLL_SHIFT			2
+#define OMAP3430ES2_AUTO_USBTLL_MASK			(1 << 2)
+#define OMAP3430_AUTO_MAD2D_SHIFT			3
+#define OMAP3430_AUTO_MAD2D_MASK			(1 << 3)
+
+/* CM_CLKSEL_CORE */
+#define OMAP3430_CLKSEL_SSI_SHIFT			8
+#define OMAP3430_CLKSEL_SSI_MASK			(0xf << 8)
+#define OMAP3430_CLKSEL_GPT11_MASK			(1 << 7)
+#define OMAP3430_CLKSEL_GPT11_SHIFT			7
+#define OMAP3430_CLKSEL_GPT10_MASK			(1 << 6)
+#define OMAP3430_CLKSEL_GPT10_SHIFT			6
+#define OMAP3430ES1_CLKSEL_FSHOSTUSB_SHIFT		4
+#define OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK		(0x3 << 4)
+#define OMAP3430_CLKSEL_L4_SHIFT			2
+#define OMAP3430_CLKSEL_L4_MASK				(0x3 << 2)
+#define OMAP3430_CLKSEL_L3_SHIFT			0
+#define OMAP3430_CLKSEL_L3_MASK				(0x3 << 0)
+#define OMAP3630_CLKSEL_96M_SHIFT			12
+#define OMAP3630_CLKSEL_96M_MASK			(0x3 << 12)
+
+/* CM_CLKSTCTRL_CORE */
+#define OMAP3430ES1_CLKTRCTRL_D2D_SHIFT			4
+#define OMAP3430ES1_CLKTRCTRL_D2D_MASK			(0x3 << 4)
+#define OMAP3430_CLKTRCTRL_L4_SHIFT			2
+#define OMAP3430_CLKTRCTRL_L4_MASK			(0x3 << 2)
+#define OMAP3430_CLKTRCTRL_L3_SHIFT			0
+#define OMAP3430_CLKTRCTRL_L3_MASK			(0x3 << 0)
+
+/* CM_CLKSTST_CORE */
+#define OMAP3430ES1_CLKACTIVITY_D2D_SHIFT		2
+#define OMAP3430ES1_CLKACTIVITY_D2D_MASK		(1 << 2)
+#define OMAP3430_CLKACTIVITY_L4_SHIFT			1
+#define OMAP3430_CLKACTIVITY_L4_MASK			(1 << 1)
+#define OMAP3430_CLKACTIVITY_L3_SHIFT			0
+#define OMAP3430_CLKACTIVITY_L3_MASK			(1 << 0)
+
+/* CM_FCLKEN_GFX */
+#define OMAP3430ES1_EN_3D_MASK				(1 << 2)
+#define OMAP3430ES1_EN_3D_SHIFT				2
+#define OMAP3430ES1_EN_2D_MASK				(1 << 1)
+#define OMAP3430ES1_EN_2D_SHIFT				1
+
+/* CM_ICLKEN_GFX specific bits */
+
+/* CM_IDLEST_GFX specific bits */
+
+/* CM_CLKSEL_GFX specific bits */
+
+/* CM_SLEEPDEP_GFX specific bits */
+
+/* CM_CLKSTCTRL_GFX */
+#define OMAP3430ES1_CLKTRCTRL_GFX_SHIFT			0
+#define OMAP3430ES1_CLKTRCTRL_GFX_MASK			(0x3 << 0)
+
+/* CM_CLKSTST_GFX */
+#define OMAP3430ES1_CLKACTIVITY_GFX_SHIFT		0
+#define OMAP3430ES1_CLKACTIVITY_GFX_MASK		(1 << 0)
+
+/* CM_FCLKEN_SGX */
+#define OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT		1
+#define OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_MASK		(1 << 1)
+
+/* CM_IDLEST_SGX */
+#define OMAP3430ES2_ST_SGX_SHIFT			1
+#define OMAP3430ES2_ST_SGX_MASK				(1 << 1)
+
+/* CM_ICLKEN_SGX */
+#define OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT		0
+#define OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_MASK		(1 << 0)
+
+/* CM_CLKSEL_SGX */
+#define OMAP3430ES2_CLKSEL_SGX_SHIFT			0
+#define OMAP3430ES2_CLKSEL_SGX_MASK			(0x7 << 0)
+
+/* CM_CLKSTCTRL_SGX */
+#define OMAP3430ES2_CLKTRCTRL_SGX_SHIFT			0
+#define OMAP3430ES2_CLKTRCTRL_SGX_MASK			(0x3 << 0)
+
+/* CM_CLKSTST_SGX */
+#define OMAP3430ES2_CLKACTIVITY_SGX_SHIFT		0
+#define OMAP3430ES2_CLKACTIVITY_SGX_MASK		(1 << 0)
+
+/* CM_FCLKEN_WKUP specific bits */
+#define OMAP3430ES2_EN_USIMOCP_SHIFT			9
+#define OMAP3430ES2_EN_USIMOCP_MASK			(1 << 9)
+
+/* CM_ICLKEN_WKUP specific bits */
+#define OMAP3430_EN_WDT1_MASK				(1 << 4)
+#define OMAP3430_EN_WDT1_SHIFT				4
+#define OMAP3430_EN_32KSYNC_MASK			(1 << 2)
+#define OMAP3430_EN_32KSYNC_SHIFT			2
+
+/* CM_IDLEST_WKUP specific bits */
+#define OMAP3430ES2_ST_USIMOCP_SHIFT			9
+#define OMAP3430ES2_ST_USIMOCP_MASK			(1 << 9)
+#define OMAP3430_ST_WDT2_SHIFT				5
+#define OMAP3430_ST_WDT2_MASK				(1 << 5)
+#define OMAP3430_ST_WDT1_SHIFT				4
+#define OMAP3430_ST_WDT1_MASK				(1 << 4)
+#define OMAP3430_ST_32KSYNC_SHIFT			2
+#define OMAP3430_ST_32KSYNC_MASK			(1 << 2)
+
+/* CM_AUTOIDLE_WKUP */
+#define OMAP3430ES2_AUTO_USIMOCP_MASK			(1 << 9)
+#define OMAP3430ES2_AUTO_USIMOCP_SHIFT			9
+#define OMAP3430_AUTO_WDT2_MASK				(1 << 5)
+#define OMAP3430_AUTO_WDT2_SHIFT			5
+#define OMAP3430_AUTO_WDT1_MASK				(1 << 4)
+#define OMAP3430_AUTO_WDT1_SHIFT			4
+#define OMAP3430_AUTO_GPIO1_MASK			(1 << 3)
+#define OMAP3430_AUTO_GPIO1_SHIFT			3
+#define OMAP3430_AUTO_32KSYNC_MASK			(1 << 2)
+#define OMAP3430_AUTO_32KSYNC_SHIFT			2
+#define OMAP3430_AUTO_GPT12_MASK			(1 << 1)
+#define OMAP3430_AUTO_GPT12_SHIFT			1
+#define OMAP3430_AUTO_GPT1_MASK				(1 << 0)
+#define OMAP3430_AUTO_GPT1_SHIFT			0
+
+/* CM_CLKSEL_WKUP */
+#define OMAP3430ES2_CLKSEL_USIMOCP_MASK			(0xf << 3)
+#define OMAP3430_CLKSEL_RM_SHIFT			1
+#define OMAP3430_CLKSEL_RM_MASK				(0x3 << 1)
+#define OMAP3430_CLKSEL_GPT1_SHIFT			0
+#define OMAP3430_CLKSEL_GPT1_MASK			(1 << 0)
+
+/* CM_CLKEN_PLL */
+#define OMAP3430_PWRDN_EMU_PERIPH_SHIFT			31
+#define OMAP3430_PWRDN_CAM_SHIFT			30
+#define OMAP3430_PWRDN_DSS1_SHIFT			29
+#define OMAP3430_PWRDN_TV_SHIFT				28
+#define OMAP3430_PWRDN_96M_SHIFT			27
+#define OMAP3430_PERIPH_DPLL_RAMPTIME_SHIFT		24
+#define OMAP3430_PERIPH_DPLL_RAMPTIME_MASK		(0x3 << 24)
+#define OMAP3430_PERIPH_DPLL_FREQSEL_SHIFT		20
+#define OMAP3430_PERIPH_DPLL_FREQSEL_MASK		(0xf << 20)
+#define OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT	19
+#define OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_MASK		(1 << 19)
+#define OMAP3430_EN_PERIPH_DPLL_SHIFT			16
+#define OMAP3430_EN_PERIPH_DPLL_MASK			(0x7 << 16)
+#define OMAP3430_PWRDN_EMU_CORE_SHIFT			12
+#define OMAP3430_CORE_DPLL_RAMPTIME_SHIFT		8
+#define OMAP3430_CORE_DPLL_RAMPTIME_MASK		(0x3 << 8)
+#define OMAP3430_CORE_DPLL_FREQSEL_SHIFT		4
+#define OMAP3430_CORE_DPLL_FREQSEL_MASK			(0xf << 4)
+#define OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT		3
+#define OMAP3430_EN_CORE_DPLL_DRIFTGUARD_MASK		(1 << 3)
+#define OMAP3430_EN_CORE_DPLL_SHIFT			0
+#define OMAP3430_EN_CORE_DPLL_MASK			(0x7 << 0)
+
+/* CM_CLKEN2_PLL */
+#define OMAP3430ES2_EN_PERIPH2_DPLL_LPMODE_SHIFT	10
+#define OMAP3430ES2_PERIPH2_DPLL_RAMPTIME_MASK		(0x3 << 8)
+#define OMAP3430ES2_PERIPH2_DPLL_FREQSEL_SHIFT		4
+#define OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK		(0xf << 4)
+#define OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT	3
+#define OMAP3430ES2_EN_PERIPH2_DPLL_SHIFT		0
+#define OMAP3430ES2_EN_PERIPH2_DPLL_MASK		(0x7 << 0)
+
+/* CM_IDLEST_CKGEN */
+#define OMAP3430_ST_54M_CLK_MASK			(1 << 5)
+#define OMAP3430_ST_12M_CLK_MASK			(1 << 4)
+#define OMAP3430_ST_48M_CLK_MASK			(1 << 3)
+#define OMAP3430_ST_96M_CLK_MASK			(1 << 2)
+#define OMAP3430_ST_PERIPH_CLK_SHIFT			1
+#define OMAP3430_ST_PERIPH_CLK_MASK			(1 << 1)
+#define OMAP3430_ST_CORE_CLK_SHIFT			0
+#define OMAP3430_ST_CORE_CLK_MASK			(1 << 0)
+
+/* CM_IDLEST2_CKGEN */
+#define OMAP3430ES2_ST_USIM_CLK_SHIFT			2
+#define OMAP3430ES2_ST_USIM_CLK_MASK			(1 << 2)
+#define OMAP3430ES2_ST_120M_CLK_SHIFT			1
+#define OMAP3430ES2_ST_120M_CLK_MASK			(1 << 1)
+#define OMAP3430ES2_ST_PERIPH2_CLK_SHIFT		0
+#define OMAP3430ES2_ST_PERIPH2_CLK_MASK			(1 << 0)
+
+/* CM_AUTOIDLE_PLL */
+#define OMAP3430_AUTO_PERIPH_DPLL_SHIFT			3
+#define OMAP3430_AUTO_PERIPH_DPLL_MASK			(0x7 << 3)
+#define OMAP3430_AUTO_CORE_DPLL_SHIFT			0
+#define OMAP3430_AUTO_CORE_DPLL_MASK			(0x7 << 0)
+
+/* CM_AUTOIDLE2_PLL */
+#define OMAP3430ES2_AUTO_PERIPH2_DPLL_SHIFT		0
+#define OMAP3430ES2_AUTO_PERIPH2_DPLL_MASK		(0x7 << 0)
+
+/* CM_CLKSEL1_PLL */
+/* Note that OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK was (0x3 << 27) on 3430ES1 */
+#define OMAP3430_CORE_DPLL_CLKOUT_DIV_SHIFT		27
+#define OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK		(0x1f << 27)
+#define OMAP3430_CORE_DPLL_MULT_SHIFT			16
+#define OMAP3430_CORE_DPLL_MULT_MASK			(0x7ff << 16)
+#define OMAP3430_CORE_DPLL_DIV_SHIFT			8
+#define OMAP3430_CORE_DPLL_DIV_MASK			(0x7f << 8)
+#define OMAP3430_SOURCE_96M_SHIFT			6
+#define OMAP3430_SOURCE_96M_MASK			(1 << 6)
+#define OMAP3430_SOURCE_54M_SHIFT			5
+#define OMAP3430_SOURCE_54M_MASK			(1 << 5)
+#define OMAP3430_SOURCE_48M_SHIFT			3
+#define OMAP3430_SOURCE_48M_MASK			(1 << 3)
+
+/* CM_CLKSEL2_PLL */
+#define OMAP3430_PERIPH_DPLL_MULT_SHIFT			8
+#define OMAP3430_PERIPH_DPLL_MULT_MASK			(0x7ff << 8)
+#define OMAP3630_PERIPH_DPLL_MULT_MASK			(0xfff << 8)
+#define OMAP3430_PERIPH_DPLL_DIV_SHIFT			0
+#define OMAP3430_PERIPH_DPLL_DIV_MASK			(0x7f << 0)
+#define OMAP3630_PERIPH_DPLL_DCO_SEL_SHIFT		21
+#define OMAP3630_PERIPH_DPLL_DCO_SEL_MASK		(0x7 << 21)
+#define OMAP3630_PERIPH_DPLL_SD_DIV_SHIFT		24
+#define OMAP3630_PERIPH_DPLL_SD_DIV_MASK		(0xff << 24)
+
+/* CM_CLKSEL3_PLL */
+#define OMAP3430_DIV_96M_SHIFT				0
+#define OMAP3430_DIV_96M_MASK				(0x1f << 0)
+#define OMAP3630_DIV_96M_MASK				(0x3f << 0)
+
+/* CM_CLKSEL4_PLL */
+#define OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT		8
+#define OMAP3430ES2_PERIPH2_DPLL_MULT_MASK		(0x7ff << 8)
+#define OMAP3430ES2_PERIPH2_DPLL_DIV_SHIFT		0
+#define OMAP3430ES2_PERIPH2_DPLL_DIV_MASK		(0x7f << 0)
+
+/* CM_CLKSEL5_PLL */
+#define OMAP3430ES2_DIV_120M_SHIFT			0
+#define OMAP3430ES2_DIV_120M_MASK			(0x1f << 0)
+
+/* CM_CLKOUT_CTRL */
+#define OMAP3430_CLKOUT2_EN_SHIFT			7
+#define OMAP3430_CLKOUT2_EN_MASK			(1 << 7)
+#define OMAP3430_CLKOUT2_DIV_SHIFT			3
+#define OMAP3430_CLKOUT2_DIV_MASK			(0x7 << 3)
+#define OMAP3430_CLKOUT2SOURCE_SHIFT			0
+#define OMAP3430_CLKOUT2SOURCE_MASK			(0x3 << 0)
+
+/* CM_FCLKEN_DSS */
+#define OMAP3430_EN_TV_MASK				(1 << 2)
+#define OMAP3430_EN_TV_SHIFT				2
+#define OMAP3430_EN_DSS2_MASK				(1 << 1)
+#define OMAP3430_EN_DSS2_SHIFT				1
+#define OMAP3430_EN_DSS1_MASK				(1 << 0)
+#define OMAP3430_EN_DSS1_SHIFT				0
+
+/* CM_ICLKEN_DSS */
+#define OMAP3430_CM_ICLKEN_DSS_EN_DSS_MASK		(1 << 0)
+#define OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT		0
+
+/* CM_IDLEST_DSS */
+#define OMAP3430ES2_ST_DSS_IDLE_SHIFT			1
+#define OMAP3430ES2_ST_DSS_IDLE_MASK			(1 << 1)
+#define OMAP3430ES2_ST_DSS_STDBY_SHIFT			0
+#define OMAP3430ES2_ST_DSS_STDBY_MASK			(1 << 0)
+#define OMAP3430ES1_ST_DSS_SHIFT			0
+#define OMAP3430ES1_ST_DSS_MASK				(1 << 0)
+
+/* CM_AUTOIDLE_DSS */
+#define OMAP3430_AUTO_DSS_MASK				(1 << 0)
+#define OMAP3430_AUTO_DSS_SHIFT				0
+
+/* CM_CLKSEL_DSS */
+#define OMAP3430_CLKSEL_TV_SHIFT			8
+#define OMAP3430_CLKSEL_TV_MASK				(0x1f << 8)
+#define OMAP3630_CLKSEL_TV_MASK				(0x3f << 8)
+#define OMAP3430_CLKSEL_DSS1_SHIFT			0
+#define OMAP3430_CLKSEL_DSS1_MASK			(0x1f << 0)
+#define OMAP3630_CLKSEL_DSS1_MASK			(0x3f << 0)
+
+/* CM_SLEEPDEP_DSS specific bits */
+
+/* CM_CLKSTCTRL_DSS */
+#define OMAP3430_CLKTRCTRL_DSS_SHIFT			0
+#define OMAP3430_CLKTRCTRL_DSS_MASK			(0x3 << 0)
+
+/* CM_CLKSTST_DSS */
+#define OMAP3430_CLKACTIVITY_DSS_SHIFT			0
+#define OMAP3430_CLKACTIVITY_DSS_MASK			(1 << 0)
+
+/* CM_FCLKEN_CAM specific bits */
+#define OMAP3430_EN_CSI2_MASK				(1 << 1)
+#define OMAP3430_EN_CSI2_SHIFT				1
+
+/* CM_ICLKEN_CAM specific bits */
+
+/* CM_IDLEST_CAM */
+#define OMAP3430_ST_CAM_MASK				(1 << 0)
+
+/* CM_AUTOIDLE_CAM */
+#define OMAP3430_AUTO_CAM_MASK				(1 << 0)
+#define OMAP3430_AUTO_CAM_SHIFT				0
+
+/* CM_CLKSEL_CAM */
+#define OMAP3430_CLKSEL_CAM_SHIFT			0
+#define OMAP3430_CLKSEL_CAM_MASK			(0x1f << 0)
+#define OMAP3630_CLKSEL_CAM_MASK			(0x3f << 0)
+
+/* CM_SLEEPDEP_CAM specific bits */
+
+/* CM_CLKSTCTRL_CAM */
+#define OMAP3430_CLKTRCTRL_CAM_SHIFT			0
+#define OMAP3430_CLKTRCTRL_CAM_MASK			(0x3 << 0)
+
+/* CM_CLKSTST_CAM */
+#define OMAP3430_CLKACTIVITY_CAM_SHIFT			0
+#define OMAP3430_CLKACTIVITY_CAM_MASK			(1 << 0)
+
+/* CM_FCLKEN_PER specific bits */
+
+/* CM_ICLKEN_PER specific bits */
+
+/* CM_IDLEST_PER */
+#define OMAP3430_ST_WDT3_SHIFT				12
+#define OMAP3430_ST_WDT3_MASK				(1 << 12)
+#define OMAP3430_ST_MCBSP4_SHIFT			2
+#define OMAP3430_ST_MCBSP4_MASK				(1 << 2)
+#define OMAP3430_ST_MCBSP3_SHIFT			1
+#define OMAP3430_ST_MCBSP3_MASK				(1 << 1)
+#define OMAP3430_ST_MCBSP2_SHIFT			0
+#define OMAP3430_ST_MCBSP2_MASK				(1 << 0)
+
+/* CM_AUTOIDLE_PER */
+#define OMAP3430_AUTO_GPIO6_MASK			(1 << 17)
+#define OMAP3430_AUTO_GPIO6_SHIFT			17
+#define OMAP3430_AUTO_GPIO5_MASK			(1 << 16)
+#define OMAP3430_AUTO_GPIO5_SHIFT			16
+#define OMAP3430_AUTO_GPIO4_MASK			(1 << 15)
+#define OMAP3430_AUTO_GPIO4_SHIFT			15
+#define OMAP3430_AUTO_GPIO3_MASK			(1 << 14)
+#define OMAP3430_AUTO_GPIO3_SHIFT			14
+#define OMAP3430_AUTO_GPIO2_MASK			(1 << 13)
+#define OMAP3430_AUTO_GPIO2_SHIFT			13
+#define OMAP3430_AUTO_WDT3_MASK				(1 << 12)
+#define OMAP3430_AUTO_WDT3_SHIFT			12
+#define OMAP3430_AUTO_UART3_MASK			(1 << 11)
+#define OMAP3430_AUTO_UART3_SHIFT			11
+#define OMAP3430_AUTO_GPT9_MASK				(1 << 10)
+#define OMAP3430_AUTO_GPT9_SHIFT			10
+#define OMAP3430_AUTO_GPT8_MASK				(1 << 9)
+#define OMAP3430_AUTO_GPT8_SHIFT			9
+#define OMAP3430_AUTO_GPT7_MASK				(1 << 8)
+#define OMAP3430_AUTO_GPT7_SHIFT			8
+#define OMAP3430_AUTO_GPT6_MASK				(1 << 7)
+#define OMAP3430_AUTO_GPT6_SHIFT			7
+#define OMAP3430_AUTO_GPT5_MASK				(1 << 6)
+#define OMAP3430_AUTO_GPT5_SHIFT			6
+#define OMAP3430_AUTO_GPT4_MASK				(1 << 5)
+#define OMAP3430_AUTO_GPT4_SHIFT			5
+#define OMAP3430_AUTO_GPT3_MASK				(1 << 4)
+#define OMAP3430_AUTO_GPT3_SHIFT			4
+#define OMAP3430_AUTO_GPT2_MASK				(1 << 3)
+#define OMAP3430_AUTO_GPT2_SHIFT			3
+#define OMAP3430_AUTO_MCBSP4_MASK			(1 << 2)
+#define OMAP3430_AUTO_MCBSP4_SHIFT			2
+#define OMAP3430_AUTO_MCBSP3_MASK			(1 << 1)
+#define OMAP3430_AUTO_MCBSP3_SHIFT			1
+#define OMAP3430_AUTO_MCBSP2_MASK			(1 << 0)
+#define OMAP3430_AUTO_MCBSP2_SHIFT			0
+
+/* CM_CLKSEL_PER */
+#define OMAP3430_CLKSEL_GPT9_MASK			(1 << 7)
+#define OMAP3430_CLKSEL_GPT9_SHIFT			7
+#define OMAP3430_CLKSEL_GPT8_MASK			(1 << 6)
+#define OMAP3430_CLKSEL_GPT8_SHIFT			6
+#define OMAP3430_CLKSEL_GPT7_MASK			(1 << 5)
+#define OMAP3430_CLKSEL_GPT7_SHIFT			5
+#define OMAP3430_CLKSEL_GPT6_MASK			(1 << 4)
+#define OMAP3430_CLKSEL_GPT6_SHIFT			4
+#define OMAP3430_CLKSEL_GPT5_MASK			(1 << 3)
+#define OMAP3430_CLKSEL_GPT5_SHIFT			3
+#define OMAP3430_CLKSEL_GPT4_MASK			(1 << 2)
+#define OMAP3430_CLKSEL_GPT4_SHIFT			2
+#define OMAP3430_CLKSEL_GPT3_MASK			(1 << 1)
+#define OMAP3430_CLKSEL_GPT3_SHIFT			1
+#define OMAP3430_CLKSEL_GPT2_MASK			(1 << 0)
+#define OMAP3430_CLKSEL_GPT2_SHIFT			0
+
+/* CM_SLEEPDEP_PER specific bits */
+#define OMAP3430_CM_SLEEPDEP_PER_EN_IVA2_MASK		(1 << 2)
+
+/* CM_CLKSTCTRL_PER */
+#define OMAP3430_CLKTRCTRL_PER_SHIFT			0
+#define OMAP3430_CLKTRCTRL_PER_MASK			(0x3 << 0)
+
+/* CM_CLKSTST_PER */
+#define OMAP3430_CLKACTIVITY_PER_SHIFT			0
+#define OMAP3430_CLKACTIVITY_PER_MASK			(1 << 0)
+
+/* CM_CLKSEL1_EMU */
+#define OMAP3430_DIV_DPLL4_SHIFT			24
+#define OMAP3430_DIV_DPLL4_MASK				(0x1f << 24)
+#define OMAP3630_DIV_DPLL4_MASK				(0x3f << 24)
+#define OMAP3430_DIV_DPLL3_SHIFT			16
+#define OMAP3430_DIV_DPLL3_MASK				(0x1f << 16)
+#define OMAP3430_CLKSEL_TRACECLK_SHIFT			11
+#define OMAP3430_CLKSEL_TRACECLK_MASK			(0x7 << 11)
+#define OMAP3430_CLKSEL_PCLK_SHIFT			8
+#define OMAP3430_CLKSEL_PCLK_MASK			(0x7 << 8)
+#define OMAP3430_CLKSEL_PCLKX2_SHIFT			6
+#define OMAP3430_CLKSEL_PCLKX2_MASK			(0x3 << 6)
+#define OMAP3430_CLKSEL_ATCLK_SHIFT			4
+#define OMAP3430_CLKSEL_ATCLK_MASK			(0x3 << 4)
+#define OMAP3430_TRACE_MUX_CTRL_SHIFT			2
+#define OMAP3430_TRACE_MUX_CTRL_MASK			(0x3 << 2)
+#define OMAP3430_MUX_CTRL_SHIFT				0
+#define OMAP3430_MUX_CTRL_MASK				(0x3 << 0)
+
+/* CM_CLKSTCTRL_EMU */
+#define OMAP3430_CLKTRCTRL_EMU_SHIFT			0
+#define OMAP3430_CLKTRCTRL_EMU_MASK			(0x3 << 0)
+
+/* CM_CLKSTST_EMU */
+#define OMAP3430_CLKACTIVITY_EMU_SHIFT			0
+#define OMAP3430_CLKACTIVITY_EMU_MASK			(1 << 0)
+
+/* CM_CLKSEL2_EMU specific bits */
+#define OMAP3430_CORE_DPLL_EMU_MULT_SHIFT		8
+#define OMAP3430_CORE_DPLL_EMU_MULT_MASK		(0x7ff << 8)
+#define OMAP3430_CORE_DPLL_EMU_DIV_SHIFT		0
+#define OMAP3430_CORE_DPLL_EMU_DIV_MASK			(0x7f << 0)
+
+/* CM_CLKSEL3_EMU specific bits */
+#define OMAP3430_PERIPH_DPLL_EMU_MULT_SHIFT		8
+#define OMAP3430_PERIPH_DPLL_EMU_MULT_MASK		(0x7ff << 8)
+#define OMAP3430_PERIPH_DPLL_EMU_DIV_SHIFT		0
+#define OMAP3430_PERIPH_DPLL_EMU_DIV_MASK		(0x7f << 0)
+
+/* CM_POLCTRL */
+#define OMAP3430_CLKOUT2_POL_MASK			(1 << 0)
+
+/* CM_IDLEST_NEON */
+#define OMAP3430_ST_NEON_MASK				(1 << 0)
+
+/* CM_CLKSTCTRL_NEON */
+#define OMAP3430_CLKTRCTRL_NEON_SHIFT			0
+#define OMAP3430_CLKTRCTRL_NEON_MASK			(0x3 << 0)
+
+/* CM_FCLKEN_USBHOST */
+#define OMAP3430ES2_EN_USBHOST2_SHIFT			1
+#define OMAP3430ES2_EN_USBHOST2_MASK			(1 << 1)
+#define OMAP3430ES2_EN_USBHOST1_SHIFT			0
+#define OMAP3430ES2_EN_USBHOST1_MASK			(1 << 0)
+
+/* CM_ICLKEN_USBHOST */
+#define OMAP3430ES2_EN_USBHOST_SHIFT			0
+#define OMAP3430ES2_EN_USBHOST_MASK			(1 << 0)
+
+/* CM_IDLEST_USBHOST */
+#define OMAP3430ES2_ST_USBHOST_IDLE_SHIFT		1
+#define OMAP3430ES2_ST_USBHOST_IDLE_MASK		(1 << 1)
+#define OMAP3430ES2_ST_USBHOST_STDBY_SHIFT		0
+#define OMAP3430ES2_ST_USBHOST_STDBY_MASK		(1 << 0)
+
+/* CM_AUTOIDLE_USBHOST */
+#define OMAP3430ES2_AUTO_USBHOST_SHIFT			0
+#define OMAP3430ES2_AUTO_USBHOST_MASK			(1 << 0)
+
+/* CM_SLEEPDEP_USBHOST */
+#define OMAP3430ES2_EN_MPU_SHIFT			1
+#define OMAP3430ES2_EN_MPU_MASK				(1 << 1)
+#define OMAP3430ES2_EN_IVA2_SHIFT			2
+#define OMAP3430ES2_EN_IVA2_MASK			(1 << 2)
+
+/* CM_CLKSTCTRL_USBHOST */
+#define OMAP3430ES2_CLKTRCTRL_USBHOST_SHIFT		0
+#define OMAP3430ES2_CLKTRCTRL_USBHOST_MASK		(3 << 0)
+
+/* CM_CLKSTST_USBHOST */
+#define OMAP3430ES2_CLKACTIVITY_USBHOST_SHIFT		0
+#define OMAP3430ES2_CLKACTIVITY_USBHOST_MASK		(1 << 0)
+
+#endif
diff --git a/arch/arm/mach-omap/include/mach/ehci.h b/arch/arm/mach-omap/include/mach/ehci.h
new file mode 100644
index 0000000..cccb9ad
--- /dev/null
+++ b/arch/arm/mach-omap/include/mach/ehci.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2010 Michael Grzeschik <mgr at pengutronix.de>
+ *
+ * This file is released under the GPLv2
+ *
+ */
+
+#ifndef __OMAP_EHCI_H
+#define __OMAP_EHCI_H
+
+/* TLL Register Set */
+#define	OMAP_USBTLL_REVISION				(0x00)
+#define	OMAP_USBTLL_SYSCONFIG				(0x10)
+#define	OMAP_USBTLL_SYSCONFIG_CACTIVITY			(1 << 8)
+#define	OMAP_USBTLL_SYSCONFIG_SIDLEMODE			(1 << 3)
+#define	OMAP_USBTLL_SYSCONFIG_ENAWAKEUP			(1 << 2)
+#define	OMAP_USBTLL_SYSCONFIG_SOFTRESET			(1 << 1)
+#define	OMAP_USBTLL_SYSCONFIG_AUTOIDLE			(1 << 0)
+
+#define	OMAP_USBTLL_SYSSTATUS				(0x14)
+#define	OMAP_USBTLL_SYSSTATUS_RESETDONE			(1 << 0)
+
+#define	OMAP_USBTLL_IRQSTATUS				(0x18)
+#define	OMAP_USBTLL_IRQENABLE				(0x1C)
+
+#define	OMAP_TLL_SHARED_CONF				(0x30)
+#define	OMAP_TLL_SHARED_CONF_USB_90D_DDR_EN		(1 << 6)
+#define	OMAP_TLL_SHARED_CONF_USB_180D_SDR_EN		(1 << 5)
+#define	OMAP_TLL_SHARED_CONF_USB_DIVRATION		(1 << 2)
+#define	OMAP_TLL_SHARED_CONF_FCLK_REQ			(1 << 1)
+#define	OMAP_TLL_SHARED_CONF_FCLK_IS_ON			(1 << 0)
+
+#define	OMAP_TLL_CHANNEL_CONF(num)			(0x040 + 0x004 * num)
+#define	OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF		(1 << 11)
+#define	OMAP_TLL_CHANNEL_CONF_ULPI_ULPIAUTOIDLE		(1 << 10)
+#define	OMAP_TLL_CHANNEL_CONF_UTMIAUTOIDLE		(1 << 9)
+#define	OMAP_TLL_CHANNEL_CONF_ULPIDDRMODE		(1 << 8)
+#define	OMAP_TLL_CHANNEL_CONF_CHANEN			(1 << 0)
+
+#define	OMAP_TLL_ULPI_FUNCTION_CTRL(num)		(0x804 + 0x100 * num)
+#define	OMAP_TLL_ULPI_INTERFACE_CTRL(num)		(0x807 + 0x100 * num)
+#define	OMAP_TLL_ULPI_OTG_CTRL(num)			(0x80A + 0x100 * num)
+#define	OMAP_TLL_ULPI_INT_EN_RISE(num)			(0x80D + 0x100 * num)
+#define	OMAP_TLL_ULPI_INT_EN_FALL(num)			(0x810 + 0x100 * num)
+#define	OMAP_TLL_ULPI_INT_STATUS(num)			(0x813 + 0x100 * num)
+#define	OMAP_TLL_ULPI_INT_LATCH(num)			(0x814 + 0x100 * num)
+#define	OMAP_TLL_ULPI_DEBUG(num)			(0x815 + 0x100 * num)
+#define	OMAP_TLL_ULPI_SCRATCH_REGISTER(num)		(0x816 + 0x100 * num)
+
+#define OMAP_TLL_CHANNEL_COUNT				3
+#define OMAP_TLL_CHANNEL_1_EN_MASK			(1 << 1)
+#define OMAP_TLL_CHANNEL_2_EN_MASK			(1 << 2)
+#define OMAP_TLL_CHANNEL_3_EN_MASK			(1 << 4)
+
+/* UHH Register Set */
+#define	OMAP_UHH_REVISION				(0x00)
+#define	OMAP_UHH_SYSCONFIG				(0x10)
+#define	OMAP_UHH_SYSCONFIG_MIDLEMODE			(1 << 12)
+#define	OMAP_UHH_SYSCONFIG_CACTIVITY			(1 << 8)
+#define	OMAP_UHH_SYSCONFIG_SIDLEMODE			(1 << 3)
+#define	OMAP_UHH_SYSCONFIG_ENAWAKEUP			(1 << 2)
+#define	OMAP_UHH_SYSCONFIG_SOFTRESET			(1 << 1)
+#define	OMAP_UHH_SYSCONFIG_AUTOIDLE			(1 << 0)
+
+#define	OMAP_UHH_SYSSTATUS				(0x14)
+#define	OMAP_UHH_HOSTCONFIG				(0x40)
+#define	OMAP_UHH_HOSTCONFIG_ULPI_BYPASS			(1 << 0)
+#define	OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS		(1 << 0)
+#define	OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS		(1 << 11)
+#define	OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS		(1 << 12)
+#define OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN		(1 << 2)
+#define OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN		(1 << 3)
+#define OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN		(1 << 4)
+#define OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN		(1 << 5)
+#define OMAP_UHH_HOSTCONFIG_P1_CONNECT_STATUS		(1 << 8)
+#define OMAP_UHH_HOSTCONFIG_P2_CONNECT_STATUS		(1 << 9)
+#define OMAP_UHH_HOSTCONFIG_P3_CONNECT_STATUS		(1 << 10)
+
+#define	OMAP_UHH_DEBUG_CSR				(0x44)
+
+/* EHCI Register Set */
+#define	EHCI_INSNREG05_ULPI				(0xA4)
+#define	EHCI_INSNREG05_ULPI_CONTROL_SHIFT		31
+#define	EHCI_INSNREG05_ULPI_PORTSEL_SHIFT		24
+#define	EHCI_INSNREG05_ULPI_OPSEL_SHIFT			22
+#define	EHCI_INSNREG05_ULPI_REGADD_SHIFT		16
+#define	EHCI_INSNREG05_ULPI_EXTREGADD_SHIFT		8
+#define	EHCI_INSNREG05_ULPI_WRDATA_SHIFT		0
+
+#define OMAP3_HS_USB_PORTS      3
+
+enum ehci_hcd_omap_mode {
+        EHCI_HCD_OMAP_MODE_UNKNOWN,
+        EHCI_HCD_OMAP_MODE_PHY,
+        EHCI_HCD_OMAP_MODE_TLL,
+};
+
+struct omap_hcd {
+        enum ehci_hcd_omap_mode         port_mode[OMAP3_HS_USB_PORTS];
+        unsigned                        phy_reset:1;
+
+        /* have to be valid if phy_reset is true and portx is in phy mode */
+        int     reset_gpio_port[OMAP3_HS_USB_PORTS];
+};
+
+void omap_usb_utmi_init(struct omap_hcd *omap, u8 tll_channel_mask);
+int ehci_omap_init(struct omap_hcd *omap);
+
+#endif /* __OMAP_EHCI_H */
diff --git a/arch/arm/mach-omap/include/mach/omap3-clock.h b/arch/arm/mach-omap/include/mach/omap3-clock.h
index 22694f2..b655fe3 100644
--- a/arch/arm/mach-omap/include/mach/omap3-clock.h
+++ b/arch/arm/mach-omap/include/mach/omap3-clock.h
@@ -43,8 +43,11 @@
 #define CM_CLKSEL1_PLL_MPU	0X0940
 #define CM_CLKSEL2_PLL_MPU	0X0944
 #define CM_FCLKEN1_CORE		0X0A00
+#define CM_FCLKEN3_CORE		0X0A08
 #define CM_ICLKEN1_CORE		0X0A10
 #define CM_ICLKEN2_CORE		0X0A14
+#define CM_ICLKEN3_CORE		0X0A18
+#define CM_AIDLE3_CORE		0X0A38
 #define CM_CLKSEL_CORE		0X0A40
 #define CM_FCLKEN_GFX		0X0B00
 #define CM_ICLKEN_GFX		0X0B10
@@ -54,10 +57,13 @@
 #define CM_CLKSEL_WKUP		0X0C40
 #define CM_IDLEST_WKUP		0X0C20
 #define CM_CLKEN_PLL		0X0D00
+#define CM_CLKEN2_PLL		0X0D04
 #define CM_IDLEST_CKGEN		0X0D20
 #define CM_CLKSEL1_PLL		0X0D40
 #define CM_CLKSEL2_PLL		0X0D44
 #define CM_CLKSEL3_PLL		0X0D48
+#define CM_CLKSEL4_PLL		0X0D4C
+#define CM_CLKSEL5_PLL		0X0D50
 #define CM_FCLKEN_DSS		0X0E00
 #define CM_ICLKEN_DSS		0X0E10
 #define CM_CLKSEL_DSS		0X0E40
@@ -68,6 +74,11 @@
 #define CM_ICLKEN_PER		0X1010
 #define CM_CLKSEL_PER		0X1040
 #define CM_CLKSEL1_EMU		0X1140
+#define CM_FCLKEN_USBH		0x1400
+#define CM_ICLKEN_USBH		0x1410
+#define CM_AIDLE_USBH		0x1430
+#define CM_SLEEPD_USBH		0x1444
+#define CM_CLKSTCTRL_USBH	0x1448
 
 /** PRM Clock Regs */
 #define PRM_REG(REGNAME)	(OMAP_PRM_BASE + PRM_##REGNAME)
diff --git a/arch/arm/mach-omap/include/mach/omap3-silicon.h b/arch/arm/mach-omap/include/mach/omap3-silicon.h
index dde2412..62e612b 100644
--- a/arch/arm/mach-omap/include/mach/omap3-silicon.h
+++ b/arch/arm/mach-omap/include/mach/omap3-silicon.h
@@ -100,6 +100,12 @@
 /** MPU WDT Definition */
 #define OMAP_MPU_WDTIMER_BASE	OMAP_WDTIMER2_BASE
 
+#define OMAP_HSUSB_OTG_BASE    (OMAP_L4_CORE_BASE + 0xAB000)
+#define OMAP_USBTLL_BASE       (OMAP_L4_CORE_BASE + 0x62000)
+#define OMAP_UHH_CONFIG_BASE   (OMAP_L4_CORE_BASE + 0x64000)
+#define OMAP_OHCI_BASE         (OMAP_L4_CORE_BASE + 0x64400)
+#define OMAP_EHCI_BASE         (OMAP_L4_CORE_BASE + 0x64800)
+
 /** Interrupt Vector base address */
 #define OMAP_SRAM_INTVECT	0x4020F800
 #define OMAP_SRAM_INTVECT_COPYSIZE	0x64
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index e1549e8..145f7d1 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -1,2 +1,6 @@
 config USB_EHCI
 	bool "EHCI driver"
+
+config USB_EHCI_OMAP
+	depends on ARCH_OMAP3
+	bool "OMAP EHCI driver"
diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
index 6c48e3a..a334b08 100644
--- a/drivers/usb/host/Makefile
+++ b/drivers/usb/host/Makefile
@@ -1 +1,2 @@
 obj-$(CONFIG_USB_EHCI)		+= ehci-hcd.o
+obj-$(CONFIG_USB_EHCI_OMAP)	+= ehci-omap.o
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
new file mode 100644
index 0000000..0c30c52
--- /dev/null
+++ b/drivers/usb/host/ehci-omap.c
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2010 Michael Grzeschik <mgr at pengutronix.de>
+ *
+ * This file is released under the GPLv2
+ *
+ */
+
+/*
+ * OMAP USBHOST Register addresses: VIRTUAL ADDRESSES
+ */
+
+/*-------------------------------------------------------------------------*/
+
+#include <i2c/twl4030.h>
+#include <usb/twl4030.h>
+#include <mach/ehci.h>
+#include <common.h>
+#include <asm/io.h>
+#include <clock.h>
+#include <gpio.h>
+#include <mach/omap3-silicon.h>
+#include <mach/omap3-clock.h>
+#include <mach/cm-regbits-34xx.h>
+#include <mach/sys_info.h>
+
+void omap_usb_utmi_init(struct omap_hcd *omap, u8 tll_channel_mask)
+{
+	unsigned reg;
+	int i;
+
+	/* Program the 3 TLL channels upfront */
+	for (i = 0; i < OMAP_TLL_CHANNEL_COUNT; i++) {
+		reg = __raw_readl(OMAP_USBTLL_BASE + OMAP_TLL_CHANNEL_CONF(i));
+
+		/* Disable AutoIdle, BitStuffing and use SDR Mode */
+		reg &= ~(OMAP_TLL_CHANNEL_CONF_UTMIAUTOIDLE
+				| OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF
+				| OMAP_TLL_CHANNEL_CONF_ULPIDDRMODE);
+		__raw_writel(reg, OMAP_USBTLL_BASE + OMAP_TLL_CHANNEL_CONF(i));
+	}
+
+	/* Program Common TLL register */
+	reg = __raw_readl(OMAP_USBTLL_BASE + OMAP_TLL_SHARED_CONF);
+	reg |= (OMAP_TLL_SHARED_CONF_FCLK_IS_ON
+			| OMAP_TLL_SHARED_CONF_USB_DIVRATION
+			| OMAP_TLL_SHARED_CONF_USB_180D_SDR_EN);
+	reg &= ~OMAP_TLL_SHARED_CONF_USB_90D_DDR_EN;
+
+	__raw_writel(reg, OMAP_USBTLL_BASE + OMAP_TLL_SHARED_CONF);
+
+	/* Enable channels now */
+	for (i = 0; i < OMAP_TLL_CHANNEL_COUNT; i++) {
+		reg = __raw_readl(OMAP_USBTLL_BASE + OMAP_TLL_CHANNEL_CONF(i));
+
+		/* Enable only the reg that is needed */
+		if (!(tll_channel_mask & 1<<i))
+			continue;
+
+		reg |= OMAP_TLL_CHANNEL_CONF_CHANEN;
+		__raw_writel(reg, OMAP_USBTLL_BASE + OMAP_TLL_CHANNEL_CONF(i));
+
+		__raw_writeb(0xbe,
+			OMAP_USBTLL_BASE + OMAP_TLL_ULPI_SCRATCH_REGISTER(i));
+	}
+}
+
+int ehci_omap_init(struct omap_hcd *omap)
+{
+	uint64_t start;
+	int timeout = 1000;
+	u8 tll_ch_mask = 0;
+	u32 v = 0;
+
+	if (twl4030_usb_ulpi_init()) {
+		printf("ERROR: %s Could not initialize PHY\n",
+			__PRETTY_FUNCTION__);
+		return -EINVAL;
+	}
+
+
+	v = __raw_readl(CM_REG(CLKSEL4_PLL));
+	v |= (12 << OMAP3430ES2_PERIPH2_DPLL_DIV_SHIFT);
+	v |= (120 << OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT);
+	__raw_writel(v, CM_REG(CLKSEL4_PLL));
+
+	v = __raw_readl(CM_REG(CLKSEL5_PLL));
+	v |= (1 << OMAP3430ES2_DIV_120M_SHIFT);
+	__raw_writel(v, CM_REG(CLKSEL5_PLL));
+
+	v = __raw_readl(CM_REG(CLKEN2_PLL));
+	v |= (7 << OMAP3430ES2_PERIPH2_DPLL_FREQSEL_SHIFT);
+	v |= (7 << OMAP3430ES2_EN_PERIPH2_DPLL_SHIFT);
+	__raw_writel(v, CM_REG(CLKEN2_PLL));
+
+	/* PRCM settings for USBHOST:
+	* Interface clk un-related to domain transition
+	*/
+
+	v = __raw_readl(CM_REG(AIDLE_USBH));
+	v |= (0 << OMAP3430ES2_AUTO_USBHOST_SHIFT);
+	__raw_writel(v, CM_REG(AIDLE_USBH));
+
+        /* Disable sleep dependency with MPU and IVA */
+
+	v = __raw_readl(CM_REG(SLEEPD_USBH));
+	v |= (0 << OMAP3430ES2_EN_MPU_SHIFT);
+	v |= (0 << OMAP3430ES2_EN_IVA2_SHIFT);
+	__raw_writel(v, CM_REG(SLEEPD_USBH));
+
+	/* Disable Automatic transition of clock */
+	v = __raw_readl(CM_REG(CLKSTCTRL_USBH));
+	v |= (0 << OMAP3430ES2_CLKTRCTRL_USBHOST_SHIFT);
+	__raw_writel(v, CM_REG(CLKSTCTRL_USBH));
+
+	/* Enable Clocks for USBHOST */
+
+	/* enable usbhost_ick */
+	v = __raw_readl(CM_REG(ICLKEN_USBH));
+	v |= (1 << OMAP3430ES2_EN_USBHOST_SHIFT);
+	__raw_writel(v, CM_REG(ICLKEN_USBH));
+
+	/* enable usbhost_120m_fck */
+	v = __raw_readl(CM_REG(FCLKEN_USBH));
+	v |= (1 << OMAP3430ES2_EN_USBHOST2_SHIFT);
+	__raw_writel(v, CM_REG(FCLKEN_USBH));
+
+	/* enable usbhost_48m_fck */
+	v = __raw_readl(CM_REG(FCLKEN_USBH));
+	v |= (1 << OMAP3430ES2_EN_USBHOST1_SHIFT);
+	__raw_writel(v, CM_REG(FCLKEN_USBH));
+
+	if (omap->phy_reset) {
+		/* Refer: ISSUE1 */
+		if (omap->reset_gpio_port[0] != -EINVAL) {
+			gpio_direction_output(omap->reset_gpio_port[0], 0);
+		}
+
+		if (omap->reset_gpio_port[1] != -EINVAL) {
+			gpio_direction_output(omap->reset_gpio_port[1], 0);
+		}
+
+		/* Hold the PHY in RESET for enough time till DIR is high */
+		mdelay(10);
+	}
+
+	/* enable usbtll_fck  */
+	v = __raw_readl(CM_REG(FCLKEN3_CORE));
+	v |= (1 << OMAP3430ES2_EN_USBTLL_SHIFT);
+	__raw_writel(v, CM_REG(FCLKEN3_CORE));
+
+	/* Configure TLL for 60Mhz clk for ULPI */
+	/* enable usbtll_ick */
+	v = __raw_readl(CM_REG(ICLKEN3_CORE));
+	v |= (1 << OMAP3430ES2_EN_USBTLL_SHIFT);
+	__raw_writel(v, CM_REG(ICLKEN3_CORE));
+
+	v = __raw_readl(CM_REG(AIDLE3_CORE));
+	v |= (0 << OMAP3430ES2_AUTO_USBTLL_SHIFT);
+	__raw_writel(v, CM_REG(AIDLE3_CORE));
+
+	/* perform TLL soft reset, and wait until reset is complete */
+	__raw_writel(OMAP_USBTLL_SYSCONFIG_SOFTRESET,
+				OMAP_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
+
+	/* Wait for TLL reset to complete */
+	start = get_time_ns();
+
+	while (!(__raw_readl(OMAP_USBTLL_BASE + OMAP_USBTLL_SYSSTATUS)
+			& OMAP_USBTLL_SYSSTATUS_RESETDONE)) {
+		if (is_timeout(start, timeout * USECOND)) {
+			return -ETIMEDOUT;
+		}
+	}
+
+	/* (1<<3) = no idle mode only for initial debugging */
+	__raw_writel(OMAP_USBTLL_SYSCONFIG_ENAWAKEUP |
+			OMAP_USBTLL_SYSCONFIG_SIDLEMODE |
+			OMAP_USBTLL_SYSCONFIG_CACTIVITY, OMAP_USBTLL_BASE + OMAP_USBTLL_SYSCONFIG);
+
+	/* Put UHH in NoIdle/NoStandby mode */
+	v = __raw_readl(OMAP_UHH_CONFIG_BASE + OMAP_UHH_SYSCONFIG);
+	v |= (OMAP_UHH_SYSCONFIG_ENAWAKEUP
+			| OMAP_UHH_SYSCONFIG_SIDLEMODE
+			| OMAP_UHH_SYSCONFIG_CACTIVITY
+			| OMAP_UHH_SYSCONFIG_MIDLEMODE);
+	v &= ~OMAP_UHH_SYSCONFIG_AUTOIDLE;
+	__raw_writel(v, OMAP_UHH_CONFIG_BASE + OMAP_UHH_SYSCONFIG);
+
+	v = __raw_readl(OMAP_UHH_CONFIG_BASE + OMAP_UHH_HOSTCONFIG);
+	/* setup ULPI bypass and burst configurations */
+	v |= (OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN
+			| OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN
+			| OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN);
+	v &= ~OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN;
+
+	if (omap->port_mode[0] == EHCI_HCD_OMAP_MODE_UNKNOWN)
+		v &= ~OMAP_UHH_HOSTCONFIG_P1_CONNECT_STATUS;
+	if (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_UNKNOWN)
+		v &= ~OMAP_UHH_HOSTCONFIG_P2_CONNECT_STATUS;
+	if (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_UNKNOWN)
+		v &= ~OMAP_UHH_HOSTCONFIG_P3_CONNECT_STATUS;
+
+	/* Bypass the TLL module for PHY mode operation */
+	 if (get_cpu_rev() <= CPU_ES2P1) {
+		if ((omap->port_mode[0] == EHCI_HCD_OMAP_MODE_PHY) ||
+			(omap->port_mode[1] == EHCI_HCD_OMAP_MODE_PHY) ||
+				(omap->port_mode[2] == EHCI_HCD_OMAP_MODE_PHY))
+			v &= ~OMAP_UHH_HOSTCONFIG_ULPI_BYPASS;
+		else
+			v |= OMAP_UHH_HOSTCONFIG_ULPI_BYPASS;
+	} else {
+		if (omap->port_mode[0] == EHCI_HCD_OMAP_MODE_PHY)
+			v &= ~OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS;
+		else if (omap->port_mode[0] == EHCI_HCD_OMAP_MODE_TLL)
+			v |= OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS;
+
+		if (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_PHY)
+			v &= ~OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS;
+		else if (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_TLL)
+			v |= OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS;
+
+		if (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_PHY)
+			v &= ~OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS;
+		else if (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_TLL)
+			v |= OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS;
+
+	}
+	__raw_writel(v, OMAP_UHH_CONFIG_BASE + OMAP_UHH_HOSTCONFIG);
+
+	if ((omap->port_mode[0] == EHCI_HCD_OMAP_MODE_TLL) ||
+		(omap->port_mode[1] == EHCI_HCD_OMAP_MODE_TLL) ||
+			(omap->port_mode[2] == EHCI_HCD_OMAP_MODE_TLL)) {
+
+		if (omap->port_mode[0] == EHCI_HCD_OMAP_MODE_TLL)
+			tll_ch_mask |= OMAP_TLL_CHANNEL_1_EN_MASK;
+		if (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_TLL)
+			tll_ch_mask |= OMAP_TLL_CHANNEL_2_EN_MASK;
+		if (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_TLL)
+			tll_ch_mask |= OMAP_TLL_CHANNEL_3_EN_MASK;
+
+		/* Enable UTMI mode for required TLL channels */
+		omap_usb_utmi_init(omap, tll_ch_mask);
+	}
+
+	if (omap->phy_reset) {
+		/* Refer ISSUE1:
+		 * Hold the PHY in RESET for enough time till
+		 * PHY is settled and ready
+		 */
+		udelay(10);
+
+		if (omap->reset_gpio_port[0] != -EINVAL)
+			gpio_direction_output(omap->reset_gpio_port[0], 1);
+
+		if (omap->reset_gpio_port[1] != -EINVAL)
+			gpio_direction_output(omap->reset_gpio_port[1], 1);
+	}
+
+	return 0;
+}
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug  4 06:24:02 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed, 4 Aug 2010 12:24:02 +0200
Subject: [PATCH] init.h: introduce fake define (__init & __initdata) to
	simplify the linux sync
In-Reply-To: <20100804065008.GC17208@jasper.tkos.co.il>
References: <1280888414-22759-1-git-send-email-plagnioj@jcrosoft.com>
	<20100804065008.GC17208@jasper.tkos.co.il>
Message-ID: <20100804102402.GA12545@game.jcrosoft.org>

> >  
> > +/*
> > + * fake define to simplify the linux sync
> > + */
> > +#define __init
> > +#define __initdata
> > +
> 
> IMO, having useless __init/__initdata in the code adds noise, and reduces 
> readability.  These can be easily removed as code gets moved from Linux to 
> Barebox.

but make impossible to apply patch directly or very quickly update the code
so this will make the job of maintainance easier

Best Regards,
J.


From plagnioj at jcrosoft.com  Wed Aug  4 06:25:45 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed, 4 Aug 2010 12:25:45 +0200
Subject: [PATCH 0/3] arm/imx: serial number / UID support
In-Reply-To: <20100804064641.GB17208@jasper.tkos.co.il>
References: <cover.1280749932.git.baruch@tkos.co.il>
	<20100802120213.GC13044@game.jcrosoft.org>
	<20100804064641.GB17208@jasper.tkos.co.il>
Message-ID: <20100804102545.GB12545@game.jcrosoft.org>

On 09:46 Wed 04 Aug     , Baruch Siach wrote:
> Hi Jean-Christophe,
> 
> On Mon, Aug 02, 2010 at 02:02:13PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > 	serial number is more for board ref than CPU ref
> > 	as you can easly read it from the register.
> > 
> > 	So why pass it via the ATAG?
> 
> The point of the serial number ATAG is to uniquely identify the system.  
> Getting this unique ID from the CPU is as good as any other IMO. I'm not aware 
> of any other UID source on the mx25 3DS system. Besides, having the serial 
> number nicely listed in /proc/cpuinfo is far easier than reading registers.
> 
> Anyway, patches 1 and 2 in this series are useful on their own, I think. I 
> intend to use this functionality for our own board. I've added the mx25 3ds 
> two lines patch to justify the bloat :).
I agree about the other patch I just do not think we need to pass the CPUID to
the kernel as he can easly get it by himself IMHO

Best Regards,
J.


From baruch at tkos.co.il  Wed Aug  4 09:24:38 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Wed,  4 Aug 2010 16:24:38 +0300
Subject: [PATCH] mw: fix help text
Message-ID: <82244fa27764bff2dc26690b4c96fddda64ab616.1280928219.git.baruch@tkos.co.il>

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 commands/mem.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/commands/mem.c b/commands/mem.c
index d609805..8a4267c 100644
--- a/commands/mem.c
+++ b/commands/mem.c
@@ -292,7 +292,9 @@ static int do_mem_mw(struct command *cmdtp, int argc, char *argv[])
 static const __maybe_unused char cmd_mw_help[] =
 "Usage: mw [OPTIONS] <region> <value(s)>\n"
 "Write value(s) to the specifies region.\n"
-"see 'help md' for supported options.\n";
+"options:\n"
+"  -b, -w, -l	use byte, halfword, or word accesses\n"
+"  -d <file>	write file (default /dev/mem)\n";
 
 BAREBOX_CMD_START(mw)
 	.cmd		= do_mem_mw,
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug  4 09:51:05 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed, 4 Aug 2010 15:51:05 +0200
Subject: [PATCH 3/6] amba: add pl011
In-Reply-To: <20100804064600.GQ14113@pengutronix.de>
References: <20100804014227.GA16337@game.jcrosoft.org>
	<1280886239-19133-1-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-2-git-send-email-plagnioj@jcrosoft.com>
	<1280886239-19133-3-git-send-email-plagnioj@jcrosoft.com>
	<20100804064600.GQ14113@pengutronix.de>
Message-ID: <20100804135105.GC12545@game.jcrosoft.org>

On 08:46 Wed 04 Aug     , Sascha Hauer wrote:
> On Wed, Aug 04, 2010 at 03:43:56AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > +++ b/drivers/serial/amba-pl011.c
> > @@ -0,0 +1,192 @@
> > +/*
> > + * (C) Copyright 2000
> > + * Rob Taylor, Flying Pig Systems. robt at flyingpig.com.
> > + *
> > + * (C) Copyright 2004
> > + * ARM Ltd.
> > + * Philippe Robin, <philippe.robin at arm.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
> > + */
> > +
> > +/* Simple U-Boot driver for the PrimeCell PL010/PL011 UARTs */
> 
> We already have a driver for the pl010 in the tree, so I would expect
> arguments like 'this one is much more flexible, drop the old one', or
> 'the pl011 is totally different' (which doesn't seem to be the case).
Yes this new driver is flexible and multi instance
yes I'm working a new path to add the PL010 on it too
and one of the issue of the current one is that you can not calculate the
baudrate based on the uart base clock on contrary on the new one who use the
clk framework. So yes I plan to add the PL010 on it too but after I've put the
clock framework on the sock that use it and drop the old one

Best Regards,
J.
> 
> Sascha
> 
> 
> -- 
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Thu Aug  5 07:23:17 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Thu,  5 Aug 2010 14:23:17 +0300
Subject: [PATCH 1/2] misc: introduce string_to_bin
Message-ID: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>

Factor out string_to_bin from string_to_ethaddr. string_to_bin is useful for
other hex data strings.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 include/common.h |    1 +
 lib/misc.c       |   29 +++++++++++++++++++++++++++++
 net/net.c        |   17 +----------------
 3 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/include/common.h b/include/common.h
index 0edc778..f600eb0 100644
--- a/include/common.h
+++ b/include/common.h
@@ -127,6 +127,7 @@ struct memarea_info {
 
 int spec_str_to_info(const char *str, struct memarea_info *info);
 int parse_area_spec(const char *str, ulong *start, ulong *size);
+int string_to_bin(const char *str, u8 *buf, unsigned int buflen);
 
 /* Just like simple_strtoul(), but this one honors a K/M/G suffix */
 unsigned long strtoul_suffix(const char *str, char **endp, int base);
diff --git a/lib/misc.c b/lib/misc.c
index 549b960..7735725 100644
--- a/lib/misc.c
+++ b/lib/misc.c
@@ -107,3 +107,32 @@ int parse_area_spec(const char *str, ulong *start, ulong *size)
 	return -1;
 }
 EXPORT_SYMBOL(parse_area_spec);
+
+/*
+ * This function parses strings in the form "xx:xx:xx...", where x is an
+ * hexadecimal digit.
+ */
+int string_to_bin(const char *str, u8 *buf, unsigned int buflen)
+{
+	int i;
+	char *e;
+
+	if (!str || strlen(str) != buflen*3 - 1)
+		return -1;
+
+	for (i = 0; i < buflen-1; i++)
+		if (str[i*3 + 2] != ':')
+			return -1;
+
+	for (i = 0; str[i]; i++)
+		if (!isxdigit(str[i]) && !(str[i] == ':'))
+			return -1;
+
+	for (i = 0; i < buflen; i++) {
+		buf[i] = simple_strtoul(str, &e, 16);
+		str = e + 1;
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL(string_to_bin);
diff --git a/net/net.c b/net/net.c
index 8d99595..017de8b 100644
--- a/net/net.c
+++ b/net/net.c
@@ -161,22 +161,7 @@ void print_IPaddr (IPaddr_t x)
 
 int string_to_ethaddr(const char *str, char *enetaddr)
 {
-	int reg;
-	char *e;
-
-        if (!str || strlen(str) != 17)
-                return -1;
-
-        if (str[2] != ':' || str[5] != ':' || str[8] != ':' ||
-                        str[11] != ':' || str[14] != ':')
-                return -1;
-
-	for (reg = 0; reg < 6; ++reg) {
-		enetaddr[reg] = simple_strtoul (str, &e, 16);
-			str = e + 1;
-	}
-
-	return 0;
+	return string_to_bin(str, enetaddr, 6);
 }
 
 void ethaddr_to_string(const unsigned char *enetaddr, char *str)
-- 
1.7.1



From baruch at tkos.co.il  Thu Aug  5 07:23:18 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Thu,  5 Aug 2010 14:23:18 +0300
Subject: [PATCH 2/2] setser: new command to set serial number on ARM
In-Reply-To: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
References: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
Message-ID: <7a1057f8529fef23994321d48ab50c64a362dfeb.1281007209.git.baruch@tkos.co.il>

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 commands/Kconfig  |    8 ++++++++
 commands/Makefile |    1 +
 commands/setser.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 52 insertions(+), 0 deletions(-)
 create mode 100644 commands/setser.c

diff --git a/commands/Kconfig b/commands/Kconfig
index 1ffc826..9d11a8b 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -231,6 +231,14 @@ config CMD_BOOTU
 	   compile in the 'bootu' command to start raw (uncompressed)
 	   Linux images
 
+config CMD_SETSER
+	tristate
+	depends on ARM
+	prompt "setser"
+	help
+	  compile in the 'setser' command to set the 64bit serial number to be 
+	  passed to the Linux kernel upon boot
+
 config CMD_LINUX16
 	tristate
 	default y if X86
diff --git a/commands/Makefile b/commands/Makefile
index b99f042..276af85 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -1,4 +1,5 @@
 obj-$(CONFIG_CMD_BOOTM)		+= bootm.o
+obj-$(CONFIG_CMD_SETSER)	+= setser.o
 obj-$(CONFIG_CMD_LINUX16)	+= linux16.o
 obj-$(CONFIG_CMD_LOADB)		+= loadb.o xyzModem.o
 obj-$(CONFIG_CMD_LOADY)		+= loadb.o xyzModem.o
diff --git a/commands/setser.c b/commands/setser.c
new file mode 100644
index 0000000..ef4fb0a
--- /dev/null
+++ b/commands/setser.c
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
+ *	Orex Computed Radiography
+ *
+ * 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.
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <common.h>
+#include <command.h>
+#include <asm/armlinux.h>
+#include <asm/byteorder.h>
+
+static int do_setser(struct command *cmdtp, int argc, char *argv[])
+{
+	int ret;
+	u8 buf[8];
+
+	if (argc != 2)
+		return COMMAND_ERROR_USAGE;
+
+	ret = string_to_bin(argv[1], buf, 8);
+	if (ret < 0)
+		return COMMAND_ERROR_USAGE;
+
+	armlinux_set_serial(be64_to_cpup((u64 *)buf));
+
+	return 0;
+}
+
+static const __maybe_unused char cmd_setser_help[] =
+"Usage: setser xx:xx:xx:xx:xx:xx:xx:xx\n"
+"Set 64bit serial number to pass to the Linux kernel\n";
+
+BAREBOX_CMD_START(setser)
+	.cmd	= do_setser,
+	.usage	= "set serial number",
+	BAREBOX_CMD_HELP(cmd_setser_help)
+BAREBOX_CMD_END
-- 
1.7.1



From plagnioj at jcrosoft.com  Thu Aug  5 08:23:49 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 5 Aug 2010 14:23:49 +0200
Subject: [PATCH 1/2] misc: introduce string_to_bin
In-Reply-To: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
References: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
Message-ID: <20100805122349.GC24069@game.jcrosoft.org>

Hi,

	how about use the kernel printf format instead

Best Regards,
J.
On 14:23 Thu 05 Aug     , Baruch Siach wrote:
> Factor out string_to_bin from string_to_ethaddr. string_to_bin is useful for
> other hex data strings.
> 
> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> ---
>  include/common.h |    1 +
>  lib/misc.c       |   29 +++++++++++++++++++++++++++++
>  net/net.c        |   17 +----------------
>  3 files changed, 31 insertions(+), 16 deletions(-)
> 
> diff --git a/include/common.h b/include/common.h
> index 0edc778..f600eb0 100644
> --- a/include/common.h
> +++ b/include/common.h
> @@ -127,6 +127,7 @@ struct memarea_info {
>  
>  int spec_str_to_info(const char *str, struct memarea_info *info);
>  int parse_area_spec(const char *str, ulong *start, ulong *size);
> +int string_to_bin(const char *str, u8 *buf, unsigned int buflen);
>  
>  /* Just like simple_strtoul(), but this one honors a K/M/G suffix */
>  unsigned long strtoul_suffix(const char *str, char **endp, int base);
> diff --git a/lib/misc.c b/lib/misc.c
> index 549b960..7735725 100644
> --- a/lib/misc.c
> +++ b/lib/misc.c
> @@ -107,3 +107,32 @@ int parse_area_spec(const char *str, ulong *start, ulong *size)
>  	return -1;
>  }
>  EXPORT_SYMBOL(parse_area_spec);
> +
> +/*
> + * This function parses strings in the form "xx:xx:xx...", where x is an
> + * hexadecimal digit.
> + */
> +int string_to_bin(const char *str, u8 *buf, unsigned int buflen)
> +{
> +	int i;
> +	char *e;
> +
> +	if (!str || strlen(str) != buflen*3 - 1)
> +		return -1;
> +
> +	for (i = 0; i < buflen-1; i++)
> +		if (str[i*3 + 2] != ':')
> +			return -1;
> +
> +	for (i = 0; str[i]; i++)
> +		if (!isxdigit(str[i]) && !(str[i] == ':'))
> +			return -1;
> +
> +	for (i = 0; i < buflen; i++) {
> +		buf[i] = simple_strtoul(str, &e, 16);
> +		str = e + 1;
> +	}
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL(string_to_bin);
> diff --git a/net/net.c b/net/net.c
> index 8d99595..017de8b 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -161,22 +161,7 @@ void print_IPaddr (IPaddr_t x)
>  
>  int string_to_ethaddr(const char *str, char *enetaddr)
>  {
> -	int reg;
> -	char *e;
> -
> -        if (!str || strlen(str) != 17)
> -                return -1;
> -
> -        if (str[2] != ':' || str[5] != ':' || str[8] != ':' ||
> -                        str[11] != ':' || str[14] != ':')
> -                return -1;
> -
> -	for (reg = 0; reg < 6; ++reg) {
> -		enetaddr[reg] = simple_strtoul (str, &e, 16);
> -			str = e + 1;
> -	}
> -
> -	return 0;
> +	return string_to_bin(str, enetaddr, 6);
>  }
>  
>  void ethaddr_to_string(const unsigned char *enetaddr, char *str)
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox


From baruch at tkos.co.il  Thu Aug  5 08:43:07 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Thu, 5 Aug 2010 15:43:07 +0300
Subject: [PATCH 1/2] misc: introduce string_to_bin
In-Reply-To: <20100805122349.GC24069@game.jcrosoft.org>
References: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
	<20100805122349.GC24069@game.jcrosoft.org>
Message-ID: <20100805124307.GC3004@jasper.tkos.co.il>

Hi Jean-Christophe,

On Thu, Aug 05, 2010 at 02:23:49PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> 	how about use the kernel printf format instead

How can I use printf to convert a string representation to binary?

baruch

> On 14:23 Thu 05 Aug     , Baruch Siach wrote:
> > Factor out string_to_bin from string_to_ethaddr. string_to_bin is useful for
> > other hex data strings.
> > 
> > Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> > ---
> >  include/common.h |    1 +
> >  lib/misc.c       |   29 +++++++++++++++++++++++++++++
> >  net/net.c        |   17 +----------------
> >  3 files changed, 31 insertions(+), 16 deletions(-)
> > 
> > diff --git a/include/common.h b/include/common.h
> > index 0edc778..f600eb0 100644
> > --- a/include/common.h
> > +++ b/include/common.h
> > @@ -127,6 +127,7 @@ struct memarea_info {
> >  
> >  int spec_str_to_info(const char *str, struct memarea_info *info);
> >  int parse_area_spec(const char *str, ulong *start, ulong *size);
> > +int string_to_bin(const char *str, u8 *buf, unsigned int buflen);
> >  
> >  /* Just like simple_strtoul(), but this one honors a K/M/G suffix */
> >  unsigned long strtoul_suffix(const char *str, char **endp, int base);
> > diff --git a/lib/misc.c b/lib/misc.c
> > index 549b960..7735725 100644
> > --- a/lib/misc.c
> > +++ b/lib/misc.c
> > @@ -107,3 +107,32 @@ int parse_area_spec(const char *str, ulong *start, ulong *size)
> >  	return -1;
> >  }
> >  EXPORT_SYMBOL(parse_area_spec);
> > +
> > +/*
> > + * This function parses strings in the form "xx:xx:xx...", where x is an
> > + * hexadecimal digit.
> > + */
> > +int string_to_bin(const char *str, u8 *buf, unsigned int buflen)
> > +{
> > +	int i;
> > +	char *e;
> > +
> > +	if (!str || strlen(str) != buflen*3 - 1)
> > +		return -1;
> > +
> > +	for (i = 0; i < buflen-1; i++)
> > +		if (str[i*3 + 2] != ':')
> > +			return -1;
> > +
> > +	for (i = 0; str[i]; i++)
> > +		if (!isxdigit(str[i]) && !(str[i] == ':'))
> > +			return -1;
> > +
> > +	for (i = 0; i < buflen; i++) {
> > +		buf[i] = simple_strtoul(str, &e, 16);
> > +		str = e + 1;
> > +	}
> > +
> > +	return 0;
> > +}
> > +EXPORT_SYMBOL(string_to_bin);
> > diff --git a/net/net.c b/net/net.c
> > index 8d99595..017de8b 100644
> > --- a/net/net.c
> > +++ b/net/net.c
> > @@ -161,22 +161,7 @@ void print_IPaddr (IPaddr_t x)
> >  
> >  int string_to_ethaddr(const char *str, char *enetaddr)
> >  {
> > -	int reg;
> > -	char *e;
> > -
> > -        if (!str || strlen(str) != 17)
> > -                return -1;
> > -
> > -        if (str[2] != ':' || str[5] != ':' || str[8] != ':' ||
> > -                        str[11] != ':' || str[14] != ':')
> > -                return -1;
> > -
> > -	for (reg = 0; reg < 6; ++reg) {
> > -		enetaddr[reg] = simple_strtoul (str, &e, 16);
> > -			str = e + 1;
> > -	}
> > -
> > -	return 0;
> > +	return string_to_bin(str, enetaddr, 6);
> >  }
> >  
> >  void ethaddr_to_string(const unsigned char *enetaddr, char *str)
> > -- 
> > 1.7.1

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From plagnioj at jcrosoft.com  Thu Aug  5 09:41:14 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 5 Aug 2010 15:41:14 +0200
Subject: [PATCH 1/2] misc: introduce string_to_bin
In-Reply-To: <20100805124307.GC3004@jasper.tkos.co.il>
References: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
	<20100805122349.GC24069@game.jcrosoft.org>
	<20100805124307.GC3004@jasper.tkos.co.il>
Message-ID: <20100805134114.GE24069@game.jcrosoft.org>

Hi,
On 15:43 Thu 05 Aug     , Baruch Siach wrote:
> Hi Jean-Christophe,
> 
> On Thu, Aug 05, 2010 at 02:23:49PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > 	how about use the kernel printf format instead
> 
> How can I use printf to convert a string representation to binary?
as example for ethernet address on the kernel we use %M or for UUID we %U to
print it in the right format. so take a look on vsprintf.c

Best Regards,
J.


From baruch at tkos.co.il  Thu Aug  5 10:13:04 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Thu, 5 Aug 2010 17:13:04 +0300
Subject: [PATCH 1/2] misc: introduce string_to_bin
In-Reply-To: <20100805134114.GE24069@game.jcrosoft.org>
References: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
	<20100805122349.GC24069@game.jcrosoft.org>
	<20100805124307.GC3004@jasper.tkos.co.il>
	<20100805134114.GE24069@game.jcrosoft.org>
Message-ID: <20100805141304.GD3004@jasper.tkos.co.il>

Hi Jean-Christophe,

On Thu, Aug 05, 2010 at 03:41:14PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 15:43 Thu 05 Aug     , Baruch Siach wrote:
> > On Thu, Aug 05, 2010 at 02:23:49PM +0200, Jean-Christophe PLAGNIOL-VILLARD 
> > wrote:
> > > 	how about use the kernel printf format instead
> > 
> > How can I use printf to convert a string representation to binary?
> as example for ethernet address on the kernel we use %M or for UUID we %U to
> print it in the right format. so take a look on vsprintf.c

This is good for converting binary values to strings, not the other way around 
as we do here.

baruch

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From m.grzeschik at pengutronix.de  Fri Aug  6 08:36:08 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Fri, 6 Aug 2010 14:36:08 +0200
Subject: [PATCH] omap nand: bugfix configure ecc order
Message-ID: <20100806123608.GA536@pengutronix.de>

This repairs a bug which came with patch "0cb00c1 omap nand: cleanup"
We first have to set ecc.layout before we can use it and should
do the nand_scan_tail after we set the ecc.mode.

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 drivers/mtd/nand/nand_omap_gpmc.c |   42 ++++++++++++++++++------------------
 1 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/drivers/mtd/nand/nand_omap_gpmc.c b/drivers/mtd/nand/nand_omap_gpmc.c
index 1363808..aef6820 100644
--- a/drivers/mtd/nand/nand_omap_gpmc.c
+++ b/drivers/mtd/nand/nand_omap_gpmc.c
@@ -498,24 +498,6 @@ static int gpmc_nand_probe(struct device_d *pdev)
 	/* State my controller */
 	nand->controller = &oinfo->controller;
 
-	if (pdata->plat_options & NAND_HWECC_ENABLE) {
-		/* Program how many columns we expect+
-		 * enable the cs we want and enable the engine
-		 */
-		oinfo->ecc_config = (pdata->cs << 1) |
-		    ((nand->options & NAND_BUSWIDTH_16) ?
-		     (0x1 << 7) : 0x0) | 0x1;
-		nand->ecc.hwctl = omap_enable_hwecc;
-		nand->ecc.calculate = omap_calculate_ecc;
-		nand->ecc.correct = omap_correct_data;
-		nand->ecc.mode = NAND_ECC_HW;
-		nand->ecc.size = 512;
-		nand->ecc.bytes = 3;
-		nand->ecc.steps = nand->ecc.layout->eccbytes / nand->ecc.bytes;
-		oinfo->ecc_parity_pairs = 12;
-	} else
-		nand->ecc.mode = NAND_ECC_SOFT;
-
 	/* All information is ready.. now lets call setup, if present */
 	if (pdata->nand_setup) {
 		err = pdata->nand_setup(pdata);
@@ -566,15 +548,33 @@ static int gpmc_nand_probe(struct device_d *pdev)
 		goto out_release_mem;
 	}
 
+	if (pdata->plat_options & NAND_HWECC_ENABLE)
+		nand->ecc.layout = layout;
+
+	if (pdata->plat_options & NAND_HWECC_ENABLE) {
+		/* Program how many columns we expect+
+		 * enable the cs we want and enable the engine
+		 */
+		oinfo->ecc_config = (pdata->cs << 1) |
+		    ((nand->options & NAND_BUSWIDTH_16) ?
+		     (0x1 << 7) : 0x0) | 0x1;
+		nand->ecc.hwctl = omap_enable_hwecc;
+		nand->ecc.calculate = omap_calculate_ecc;
+		nand->ecc.correct = omap_correct_data;
+		nand->ecc.mode = NAND_ECC_HW;
+		nand->ecc.size = 512;
+		nand->ecc.bytes = 3;
+		nand->ecc.steps = nand->ecc.layout->eccbytes / nand->ecc.bytes;
+		oinfo->ecc_parity_pairs = 12;
+	} else
+		nand->ecc.mode = NAND_ECC_SOFT;
+
 	/* second phase scan */
 	if (nand_scan_tail(minfo)) {
 		err = -ENXIO;
 		goto out_release_mem;
 	}
 
-	if (pdata->plat_options & NAND_HWECC_ENABLE)
-		nand->ecc.layout = layout;
-
 	/* We are all set to register with the system now! */
 	err = add_mtd_device(minfo);
 	if (err) {
-- 
1.7.1



From plagnioj at jcrosoft.com  Sat Aug  7 02:21:03 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sat,  7 Aug 2010 08:21:03 +0200
Subject: [PATCH] net: rework the mii support
Message-ID: <1281162063-27005-1-git-send-email-plagnioj@jcrosoft.com>

this rework is done in order to add a phylib and allow to have phy driver support

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
This apply on next branch

Best Regards,
J.
 arch/arm/configs/a9m2410_defconfig                 |    2 +-
 arch/arm/configs/a9m2440_defconfig                 |    2 +-
 arch/arm/configs/at91sam9260ek_defconfig           |    2 +-
 arch/arm/configs/at91sam9261ek_defconfig           |    2 +-
 arch/arm/configs/at91sam9263ek_defconfig           |    2 +-
 arch/arm/configs/edb93xx_defconfig                 |    2 +-
 arch/arm/configs/eukrea_cpuimx25_defconfig         |    2 +-
 arch/arm/configs/eukrea_cpuimx27_defconfig         |    2 +-
 arch/arm/configs/eukrea_cpuimx35_defconfig         |    2 +-
 arch/arm/configs/freescale_mx25_3stack_defconfig   |    2 +-
 arch/arm/configs/freescale_mx35_3stack_defconfig   |    2 +-
 arch/arm/configs/mmccpu_defconfig                  |    2 +-
 arch/arm/configs/neso_defconfig                    |    2 +-
 arch/arm/configs/netx_nxdb500_defconfig            |    2 +-
 arch/arm/configs/nhk8815_defconfig                 |    2 +-
 arch/arm/configs/omap3530_beagle_defconfig         |    2 +-
 arch/arm/configs/pca100_defconfig                  |    2 +-
 arch/arm/configs/pcm037_defconfig                  |    2 +-
 arch/arm/configs/pcm038_defconfig                  |    2 +-
 arch/arm/configs/pcm043_defconfig                  |    2 +-
 arch/arm/configs/pm9261_defconfig                  |    2 +-
 arch/arm/configs/pm9263_defconfig                  |    2 +-
 arch/arm/configs/scb9328_defconfig                 |    2 +-
 arch/blackfin/configs/ipe337_defconfig             |    2 +-
 .../m68k/configs/phycore_kpukdr1_5475num_defconfig |    2 +-
 arch/m68k/configs/phycore_mcf54xx_defconfig        |    2 +-
 arch/ppc/configs/pcm030_defconfig                  |    2 +-
 drivers/net/Kconfig                                |   18 +-
 drivers/net/Makefile                               |    2 +-
 drivers/net/at91_ether.c                           |   10 +-
 drivers/net/dm9000.c                               |   33 ++--
 drivers/net/ep93xx.c                               |   37 ++--
 drivers/net/ep93xx.h                               |    2 +-
 drivers/net/fec_imx.c                              |   33 ++--
 drivers/net/fec_imx.h                              |    2 +-
 drivers/net/fec_mpc5200.c                          |   35 ++--
 drivers/net/fec_mpc5200.h                          |    2 +-
 drivers/net/macb.c                                 |   33 ++--
 drivers/net/miidev.c                               |  228 +++++++++++++++++++
 drivers/net/miiphy.c                               |  224 -------------------
 drivers/net/netx_eth.c                             |   37 ++--
 drivers/net/smc91111.c                             |   32 ++--
 drivers/net/smc911x.c                              |   33 ++--
 drivers/net/usb/Kconfig                            |    2 +-
 drivers/net/usb/asix.c                             |   26 +--
 drivers/net/usb/usbnet.c                           |    6 +-
 include/linux/mii.h                                |  232 ++++++++++++++++++++
 include/miidev.h                                   |   62 ++++++
 include/miiphy.h                                   |  158 -------------
 include/usb/usbnet.h                               |    4 +-
 net/eth.c                                          |    2 +-
 51 files changed, 713 insertions(+), 594 deletions(-)
 create mode 100644 drivers/net/miidev.c
 delete mode 100644 drivers/net/miiphy.c
 create mode 100644 include/linux/mii.h
 create mode 100644 include/miidev.h
 delete mode 100644 include/miiphy.h

diff --git a/arch/arm/configs/a9m2410_defconfig b/arch/arm/configs/a9m2410_defconfig
index 9e888fc..e9fa74c 100644
--- a/arch/arm/configs/a9m2410_defconfig
+++ b/arch/arm/configs/a9m2410_defconfig
@@ -198,7 +198,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_S3C24X0=y
 # CONFIG_DRIVER_SERIAL_S3C24X0_AUTOSYNC is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/a9m2440_defconfig b/arch/arm/configs/a9m2440_defconfig
index f69dcfd..b7a26bc 100644
--- a/arch/arm/configs/a9m2440_defconfig
+++ b/arch/arm/configs/a9m2440_defconfig
@@ -200,7 +200,7 @@ CONFIG_NET_TFTP=y
 CONFIG_DRIVER_SERIAL_S3C24X0=y
 # CONFIG_DRIVER_SERIAL_S3C24X0_AUTOSYNC is not set
 CONFIG_HAS_CS8900=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/at91sam9260ek_defconfig b/arch/arm/configs/at91sam9260ek_defconfig
index b40485b..0387b71 100644
--- a/arch/arm/configs/at91sam9260ek_defconfig
+++ b/arch/arm/configs/at91sam9260ek_defconfig
@@ -185,7 +185,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/at91sam9261ek_defconfig b/arch/arm/configs/at91sam9261ek_defconfig
index cb9ea75..c586857 100644
--- a/arch/arm/configs/at91sam9261ek_defconfig
+++ b/arch/arm/configs/at91sam9261ek_defconfig
@@ -195,7 +195,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
 CONFIG_HAS_DM9000=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/at91sam9263ek_defconfig b/arch/arm/configs/at91sam9263ek_defconfig
index d423c2f..ae4006c 100644
--- a/arch/arm/configs/at91sam9263ek_defconfig
+++ b/arch/arm/configs/at91sam9263ek_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/edb93xx_defconfig b/arch/arm/configs/edb93xx_defconfig
index d8fe23f..936bd47 100644
--- a/arch/arm/configs/edb93xx_defconfig
+++ b/arch/arm/configs/edb93xx_defconfig
@@ -199,7 +199,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_PL010=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/eukrea_cpuimx25_defconfig b/arch/arm/configs/eukrea_cpuimx25_defconfig
index 14f06c2..abafc72 100644
--- a/arch/arm/configs/eukrea_cpuimx25_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx25_defconfig
@@ -211,7 +211,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/eukrea_cpuimx27_defconfig b/arch/arm/configs/eukrea_cpuimx27_defconfig
index c7f6b78..13df567 100644
--- a/arch/arm/configs/eukrea_cpuimx27_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx27_defconfig
@@ -219,7 +219,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 CONFIG_DRIVER_SERIAL_NS16550=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/eukrea_cpuimx35_defconfig b/arch/arm/configs/eukrea_cpuimx35_defconfig
index 7c5b49a..77f5246 100644
--- a/arch/arm/configs/eukrea_cpuimx35_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx35_defconfig
@@ -214,7 +214,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/freescale_mx25_3stack_defconfig b/arch/arm/configs/freescale_mx25_3stack_defconfig
index fd7dd42..b45b995 100644
--- a/arch/arm/configs/freescale_mx25_3stack_defconfig
+++ b/arch/arm/configs/freescale_mx25_3stack_defconfig
@@ -201,7 +201,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/freescale_mx35_3stack_defconfig b/arch/arm/configs/freescale_mx35_3stack_defconfig
index 4321fbc..ff3ba6a 100644
--- a/arch/arm/configs/freescale_mx35_3stack_defconfig
+++ b/arch/arm/configs/freescale_mx35_3stack_defconfig
@@ -201,7 +201,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/mmccpu_defconfig b/arch/arm/configs/mmccpu_defconfig
index a8c41e7..e196a0c 100644
--- a/arch/arm/configs/mmccpu_defconfig
+++ b/arch/arm/configs/mmccpu_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/neso_defconfig b/arch/arm/configs/neso_defconfig
index 3f2a978..03673f2 100644
--- a/arch/arm/configs/neso_defconfig
+++ b/arch/arm/configs/neso_defconfig
@@ -212,7 +212,7 @@ CONFIG_NET_RESOLV=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/netx_nxdb500_defconfig b/arch/arm/configs/netx_nxdb500_defconfig
index 95afb5e..7047d6b 100644
--- a/arch/arm/configs/netx_nxdb500_defconfig
+++ b/arch/arm/configs/netx_nxdb500_defconfig
@@ -184,7 +184,7 @@ CONFIG_NET_TFTP=y
 CONFIG_DRIVER_SERIAL_NETX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_HAS_NETX_ETHER=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/nhk8815_defconfig b/arch/arm/configs/nhk8815_defconfig
index 1488838..21d596f 100644
--- a/arch/arm/configs/nhk8815_defconfig
+++ b/arch/arm/configs/nhk8815_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_SERIAL_AMBA_PL011=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/omap3530_beagle_defconfig b/arch/arm/configs/omap3530_beagle_defconfig
index 9f9a875..85eded8 100644
--- a/arch/arm/configs/omap3530_beagle_defconfig
+++ b/arch/arm/configs/omap3530_beagle_defconfig
@@ -205,7 +205,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_NS16550=y
 CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pca100_defconfig b/arch/arm/configs/pca100_defconfig
index accc6ef..5053bf6 100644
--- a/arch/arm/configs/pca100_defconfig
+++ b/arch/arm/configs/pca100_defconfig
@@ -210,7 +210,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pcm037_defconfig b/arch/arm/configs/pcm037_defconfig
index bb67995..bfee2b2 100644
--- a/arch/arm/configs/pcm037_defconfig
+++ b/arch/arm/configs/pcm037_defconfig
@@ -211,7 +211,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pcm038_defconfig b/arch/arm/configs/pcm038_defconfig
index 2925c9c..a2b31f2 100644
--- a/arch/arm/configs/pcm038_defconfig
+++ b/arch/arm/configs/pcm038_defconfig
@@ -211,7 +211,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pcm043_defconfig b/arch/arm/configs/pcm043_defconfig
index 31c65f1..b374c7c 100644
--- a/arch/arm/configs/pcm043_defconfig
+++ b/arch/arm/configs/pcm043_defconfig
@@ -213,7 +213,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pm9261_defconfig b/arch/arm/configs/pm9261_defconfig
index a135ef7..e7b55c3 100644
--- a/arch/arm/configs/pm9261_defconfig
+++ b/arch/arm/configs/pm9261_defconfig
@@ -196,7 +196,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
 CONFIG_HAS_DM9000=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/pm9263_defconfig b/arch/arm/configs/pm9263_defconfig
index d5ee46a..da7a856 100644
--- a/arch/arm/configs/pm9263_defconfig
+++ b/arch/arm/configs/pm9263_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/scb9328_defconfig b/arch/arm/configs/scb9328_defconfig
index 7dc56dd..eaf7bd4 100644
--- a/arch/arm/configs/scb9328_defconfig
+++ b/arch/arm/configs/scb9328_defconfig
@@ -201,7 +201,7 @@ CONFIG_NET_TFTP=y
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_HAS_DM9000=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/blackfin/configs/ipe337_defconfig b/arch/blackfin/configs/ipe337_defconfig
index 33fd2fc..e5667dc 100644
--- a/arch/blackfin/configs/ipe337_defconfig
+++ b/arch/blackfin/configs/ipe337_defconfig
@@ -146,7 +146,7 @@ CONFIG_NET_TFTP=y
 #
 CONFIG_DRIVER_SERIAL_BLACKFIN=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig b/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig
index bb91152..d868808 100644
--- a/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig
+++ b/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig
@@ -163,7 +163,7 @@ CONFIG_NET_TFTP=y
 # serial drivers
 #
 CONFIG_DRIVER_SERIAL_MCFV4E=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/m68k/configs/phycore_mcf54xx_defconfig b/arch/m68k/configs/phycore_mcf54xx_defconfig
index f64ca8b..ca3387a 100644
--- a/arch/m68k/configs/phycore_mcf54xx_defconfig
+++ b/arch/m68k/configs/phycore_mcf54xx_defconfig
@@ -163,7 +163,7 @@ CONFIG_NET_TFTP=y
 # serial drivers                
 #
 CONFIG_DRIVER_SERIAL_MCFV4E=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/ppc/configs/pcm030_defconfig b/arch/ppc/configs/pcm030_defconfig
index efdfb52..56d8844 100644
--- a/arch/ppc/configs/pcm030_defconfig
+++ b/arch/ppc/configs/pcm030_defconfig
@@ -154,7 +154,7 @@ CONFIG_NET_TFTP=y
 #
 CONFIG_DRIVER_SERIAL_MPC5XXX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 0955562..18b5bc0 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -10,7 +10,7 @@ config HAS_AT91_ETHER
 config HAS_NETX_ETHER
 	bool
 
-config MIIPHY
+config MIIDEV
 	bool
 
 menu "Network drivers               "
@@ -22,7 +22,7 @@ config DRIVER_NET_CS8900
 
 config DRIVER_NET_SMC911X
 	bool "smc911x ethernet driver"
-	select MIIPHY
+	select MIIDEV
 	help
 	  This option enables support for the SMSC LAN9[12]1[567]
 	  ethernet chip.
@@ -35,7 +35,7 @@ config DRIVER_NET_SMC911X_ADDRESS_SHIFT
 
 config DRIVER_NET_SMC91111
 	bool "smc91111 ethernet driver"
-	select MIIPHY
+	select MIIDEV
 	help
 	  This option enables support for the SMSC LAN91C111
 	  ethernet chip.
@@ -43,12 +43,12 @@ config DRIVER_NET_SMC91111
 config DRIVER_NET_DM9000
 	bool "Davicom dm9000 ethernet driver"
 	depends on HAS_DM9000
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_NETX
 	bool "Hilscher Netx ethernet driver"
 	depends on HAS_NETX_ETHER
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_AT91_ETHER
 	bool "at91 ethernet driver"
@@ -57,22 +57,22 @@ config DRIVER_NET_AT91_ETHER
 config DRIVER_NET_MPC5200
 	bool "MPC5200 Ethernet driver"
 	depends on ARCH_MPC5200
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_FEC_IMX
 	bool "i.MX FEC Ethernet driver"
 	depends on ARCH_HAS_FEC_IMX
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_EP93XX
 	bool "EP93xx Ethernet driver"
 	depends on ARCH_EP93XX
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_MACB
 	bool "macb Ethernet driver"
 	depends on ARCH_AT91
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_TAP
 	bool "tap Ethernet driver"
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 1b6f104..96d3d32 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -9,5 +9,5 @@ obj-$(CONFIG_DRIVER_NET_FEC_IMX)	+= fec_imx.o
 obj-$(CONFIG_DRIVER_NET_EP93XX)		+= ep93xx.o
 obj-$(CONFIG_DRIVER_NET_MACB)		+= macb.o
 obj-$(CONFIG_DRIVER_NET_TAP)		+= tap.o
-obj-$(CONFIG_MIIPHY)			+= miiphy.o
+obj-$(CONFIG_MIIDEV)			+= miidev.o
 obj-$(CONFIG_NET_USB)			+= usb/
diff --git a/drivers/net/at91_ether.c b/drivers/net/at91_ether.c
index 3c4f4b0..4563ff3 100644
--- a/drivers/net/at91_ether.c
+++ b/drivers/net/at91_ether.c
@@ -24,7 +24,7 @@
 #include <at91rm9200_net.h>
 #include <init.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <driver.h>
 
@@ -208,7 +208,7 @@ static void at91rm9200_eth_halt (struct eth_device *edev)
 };
 
 #if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
-int  at91rm9200_miiphy_read(char *devname, unsigned char addr,
+int  at91rm9200_miidev_read(char *devname, unsigned char addr,
 		unsigned char reg, unsigned short * value)
 {
 	at91rm9200_EmacEnableMDIO (p_mac);
@@ -217,7 +217,7 @@ int  at91rm9200_miiphy_read(char *devname, unsigned char addr,
 	return 0;
 }
 
-int  at91rm9200_miiphy_write(char *devname, unsigned char addr,
+int  at91rm9200_miidev_write(char *devname, unsigned char addr,
 		unsigned char reg, unsigned short value)
 {
 	at91rm9200_EmacEnableMDIO (p_mac);
@@ -228,10 +228,10 @@ int  at91rm9200_miiphy_write(char *devname, unsigned char addr,
 
 #endif	/* defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII) */
 
-int at91rm9200_miiphy_initialize(void)
+int at91rm9200_miidev_initialize(void)
 {
 #if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
-	miiphy_register("at91rm9200phy", at91rm9200_miiphy_read, at91rm9200_miiphy_write);
+	mii_register("at91rm9200phy", at91rm9200_miidev_read, at91rm9200_miidev_write);
 #endif
 	return 0;
 }
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 5f61ddc..0fff05f 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -46,7 +46,7 @@
 #include <command.h>
 #include <driver.h>
 #include <clock.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <net.h>
 #include <init.h>
@@ -167,7 +167,7 @@
 struct dm9000_priv {
 	unsigned long iobase;
 	unsigned long iodata;
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	int buswidth;
 };
 
@@ -200,9 +200,9 @@ static void DM9000_iow(struct dm9000_priv *priv, int reg, u8 value)
 	writeb(value, priv->iodata);
 }
 
-static int dm9000_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-		uint8_t reg, uint16_t * val)
+static int dm9000_phy_read(struct mii_device *mdev, int addr, int reg)
 {
+	int val;
 	struct eth_device *edev = mdev->edev;
 	struct dm9000_priv *priv = edev->priv;
 
@@ -211,15 +211,14 @@ static int dm9000_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
 	DM9000_iow(priv, DM9000_EPCR, 0xc);	/* Issue phyxcer read command */
 	udelay(100);			/* Wait read complete */
 	DM9000_iow(priv, DM9000_EPCR, 0x0);	/* Clear phyxcer read command */
-	*val = (DM9000_ior(priv, DM9000_EPDRH) << 8) | DM9000_ior(priv, DM9000_EPDRL);
+	val = (DM9000_ior(priv, DM9000_EPDRH) << 8) | DM9000_ior(priv, DM9000_EPDRL);
 
 	/* The read data keeps on REG_0D & REG_0E */
 	debug("phy_read(%d): %d\n", reg, val);
-	return 0;
+	return val;
 }
 
-static int dm9000_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-	uint8_t reg, uint16_t val)
+static int dm9000_phy_write(struct mii_device *mdev, int addr, int reg, int val)
 {
 	struct eth_device *edev = mdev->edev;
 	struct dm9000_priv *priv = edev->priv;
@@ -268,8 +267,8 @@ static int dm9000_eth_open(struct eth_device *edev)
 {
 	struct dm9000_priv *priv = (struct dm9000_priv *)edev->priv;
 
-	miiphy_wait_aneg(&priv->miiphy);
-	miiphy_print_status(&priv->miiphy);
+	miidev_wait_aneg(&priv->miidev);
+	miidev_print_status(&priv->miidev);
 	return 0;
 }
 
@@ -466,7 +465,7 @@ static int dm9000_init_dev(struct eth_device *edev)
 {
 	struct dm9000_priv *priv = (struct dm9000_priv *)edev->priv;
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 	return 0;
 }
 
@@ -524,13 +523,13 @@ static int dm9000_probe(struct device_d *dev)
 	DM9000_iow(priv, DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);	/* RX enable */
 	DM9000_iow(priv, DM9000_IMR, IMR_PAR);	/* Enable TX/RX interrupt mask */
 
-	priv->miiphy.read = dm9000_phy_read;
-	priv->miiphy.write = dm9000_phy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
-	priv->miiphy.edev = edev;
+	priv->miidev.read = dm9000_phy_read;
+	priv->miidev.write = dm9000_phy_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
+	priv->miidev.edev = edev;
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
         return 0;
diff --git a/drivers/net/ep93xx.c b/drivers/net/ep93xx.c
index c6c4671..851f6af 100644
--- a/drivers/net/ep93xx.c
+++ b/drivers/net/ep93xx.c
@@ -34,16 +34,15 @@
 #include <command.h>
 #include <init.h>
 #include <malloc.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <asm/io.h>
 #include <linux/types.h>
 #include <mach/ep93xx-regs.h>
 #include "ep93xx.h"
 
-static int ep93xx_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-			uint8_t phy_reg, uint16_t *value);
-static int ep93xx_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-			uint8_t phy_reg, uint16_t value);
+static int ep93xx_phy_read(struct mii_device *mdev, int phy_addr, int phy_reg);
+static int ep93xx_phy_write(struct mii_device *mdev, int phy_addr, int phy_reg,
+			    int value);
 
 static inline struct ep93xx_eth_priv *ep93xx_get_priv(struct eth_device *edev)
 {
@@ -497,10 +496,10 @@ static int ep93xx_eth_probe(struct device_d *dev)
 	edev->get_ethaddr = ep93xx_eth_get_ethaddr;
 	edev->set_ethaddr = ep93xx_eth_set_ethaddr;
 
-	priv->miiphy.read = ep93xx_phy_read;
-	priv->miiphy.write = ep93xx_phy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
+	priv->miidev.read = ep93xx_phy_read;
+	priv->miidev.write = ep93xx_phy_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
 
 	priv->tx_dq.base = calloc(NUMTXDESC,
 				sizeof(struct tx_descriptor));
@@ -530,7 +529,7 @@ static int ep93xx_eth_probe(struct device_d *dev)
 		goto eth_probe_failed_3;
 	}
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
 	ret = 0;
@@ -573,11 +572,10 @@ eth_probe_done:
 /**
  * Read a 16-bit value from an MII register.
  */
-static int ep93xx_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-			uint8_t phy_reg, uint16_t *value)
+static int ep93xx_phy_read(struct mii_device *mdev, int phy_addr, int phy_reg)
 {
 	struct mac_regs *regs = ep93xx_get_regs(mdev->edev);
-	int ret = -1;
+	int value = -1;
 	uint32_t self_ctl;
 
 	pr_debug("+ep93xx_phy_read\n");
@@ -604,26 +602,23 @@ static int ep93xx_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
 	while (readl(&regs->miists) & MIISTS_BUSY)
 		; /* noop */
 
-	*value = (unsigned short)readl(&regs->miidata);
+	value = (unsigned short)readl(&regs->miidata);
 
 	/* Restore the saved SelfCTL value and return. */
 	writel(self_ctl, &regs->selfctl);
 
-	ret = 0;
-
 	pr_debug("-ep93xx_phy_read\n");
 
-	return ret;
+	return value;
 }
 
 /**
  * Write a 16-bit value to an MII register.
  */
-static int ep93xx_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
+static int ep93xx_phy_write(struct mii_device *mdev, uint8_t phy_addr,
 			uint8_t phy_reg, uint16_t value)
 {
 	struct mac_regs *regs = ep93xx_get_regs(mdev->edev);
-	int ret = -1;
 	uint32_t self_ctl;
 
 	pr_debug("+ep93xx_phy_write\n");
@@ -651,11 +646,9 @@ static int ep93xx_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
 	/* Restore the saved SelfCTL value and return. */
 	writel(self_ctl, &regs->selfctl);
 
-	ret = 0;
-
 	pr_debug("-ep93xx_phy_write\n");
 
-	return ret;
+	return 0;
 }
 
 static struct driver_d ep93xx_eth_driver = {
diff --git a/drivers/net/ep93xx.h b/drivers/net/ep93xx.h
index ae45c54..875715f 100644
--- a/drivers/net/ep93xx.h
+++ b/drivers/net/ep93xx.h
@@ -141,7 +141,7 @@ struct ep93xx_eth_priv {
 	struct tx_descriptor_queue	tx_dq;
 	struct tx_status_queue		tx_sq;
 
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 };
 
 #endif
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 40a7543..9a2acb1 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -22,9 +22,9 @@
 #include <malloc.h>
 #include <net.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <driver.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <fec.h>
 
 #include <asm/mmu.h>
@@ -46,8 +46,7 @@ struct fec_frame {
 /*
  * MII-interface related functions
  */
-static int fec_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t * retVal)
+static int fec_miidev_read(struct mii_device *mdev, int phyAddr, int regAddr)
 {
 	struct eth_device *edev = mdev->edev;
 	struct fec_priv *fec = (struct fec_priv *)edev->priv;
@@ -87,13 +86,11 @@ static int fec_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
 	/*
 	 * it's now safe to read the PHY's register
 	 */
-	*retVal = readl(fec->regs + FEC_MII_DATA);
-
-	return 0;
+	return readl(fec->regs + FEC_MII_DATA);
 }
 
-static int fec_miiphy_write(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t data)
+static int fec_miidev_write(struct mii_device *mdev, int phyAddr,
+	int regAddr, int data)
 {
 	struct eth_device *edev = mdev->edev;
 	struct fec_priv *fec = (struct fec_priv *)edev->priv;
@@ -317,7 +314,7 @@ static int fec_init(struct eth_device *dev)
 	writel(FEC_MAX_PKT_SIZE, fec->regs + FEC_EMRBR);
 
 	if (fec->xcv_type != SEVENWIRE)
-		miiphy_restart_aneg(&fec->miiphy);
+		miidev_restart_aneg(&fec->miidev);
 
 	return 0;
 }
@@ -351,10 +348,10 @@ static int fec_open(struct eth_device *edev)
 	fec_rx_task_enable(fec);
 
 	if (fec->xcv_type != SEVENWIRE) {
-		ret = miiphy_wait_aneg(&fec->miiphy);
+		ret = miidev_wait_aneg(&fec->miidev);
 		if (ret)
 			return ret;
-		miiphy_print_status(&fec->miiphy);
+		miidev_print_status(&fec->miidev);
 	}
 
 	return 0;
@@ -583,13 +580,13 @@ static int fec_probe(struct device_d *dev)
 	fec->xcv_type = pdata->xcv_type;
 
 	if (fec->xcv_type != SEVENWIRE) {
-		fec->miiphy.read = fec_miiphy_read;
-		fec->miiphy.write = fec_miiphy_write;
-		fec->miiphy.address = pdata->phy_addr;
-		fec->miiphy.flags = pdata->xcv_type == MII10 ? MIIPHY_FORCE_10 : 0;
-		fec->miiphy.edev = edev;
+		fec->miidev.read = fec_miidev_read;
+		fec->miidev.write = fec_miidev_write;
+		fec->miidev.address = pdata->phy_addr;
+		fec->miidev.flags = pdata->xcv_type == MII10 ? MIIDEV_FORCE_10 : 0;
+		fec->miidev.edev = edev;
 
-		miiphy_register(&fec->miiphy);
+		mii_register(&fec->miidev);
 	}
 
 	eth_register(edev);
diff --git a/drivers/net/fec_imx.h b/drivers/net/fec_imx.h
index 353799c..e1473a4 100644
--- a/drivers/net/fec_imx.h
+++ b/drivers/net/fec_imx.h
@@ -141,7 +141,7 @@ struct fec_priv {
 	int rbd_index;				/* next receive BD to read   */
 	struct buffer_descriptor *tbd_base;	/* TBD ring                  */
 	int tbd_index;				/* next transmit BD to write */
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 };
 
 /**
diff --git a/drivers/net/fec_mpc5200.c b/drivers/net/fec_mpc5200.c
index ce9a21d..f239c68 100644
--- a/drivers/net/fec_mpc5200.c
+++ b/drivers/net/fec_mpc5200.c
@@ -11,12 +11,12 @@
 #include <malloc.h>
 #include <net.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <driver.h>
 #include <mach/sdma.h>
 #include <mach/fec.h>
 #include <mach/clocks.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include "fec_mpc5200.h"
 
 #define CONFIG_PHY_ADDR 1 /* FIXME */
@@ -31,8 +31,7 @@ typedef struct {
 /*
  * MII-interface related functions
  */
-static int fec5xxx_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t * retVal)
+static int fec5xxx_miidev_read(struct mii_device *mdev, int phyAddr, int regAddr)
 {
 	struct eth_device *edev = mdev->edev;
 	mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)edev->priv;
@@ -68,13 +67,11 @@ static int fec5xxx_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
 	/*
 	 * it's now safe to read the PHY's register
 	 */
-	*retVal = (uint16_t) fec->eth->mii_data;
-
-	return 0;
+	return fec->eth->mii_data;
 }
 
-static int fec5xxx_miiphy_write(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t data)
+static int fec5xxx_miidev_write(struct mii_device *mdev, int phyAddr,
+	int regAddr, int data)
 {
 	struct eth_device *edev = mdev->edev;
 	mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)edev->priv;
@@ -385,7 +382,7 @@ static int mpc5xxx_fec_init(struct eth_device *dev)
 	debug("mpc5xxx_fec_init... Done \n");
 
 	if (fec->xcv_type != SEVENWIRE)
-		miiphy_restart_aneg(&fec->miiphy);
+		miidev_restart_aneg(&fec->miidev);
 
 	return 0;
 }
@@ -416,8 +413,8 @@ static int mpc5xxx_fec_open(struct eth_device *edev)
 	SDMA_TASK_ENABLE(FEC_RECV_TASK_NO);
 
 	if (fec->xcv_type != SEVENWIRE) {
-		miiphy_wait_aneg(&fec->miiphy);
-		miiphy_print_status(&fec->miiphy);
+		miidev_wait_aneg(&fec->miidev);
+		miidev_print_status(&fec->miidev);
 	}
 
 	return 0;
@@ -559,7 +556,7 @@ static int mpc5xxx_fec_send(struct eth_device *dev, void *eth_data,
 	 */
 	if (fec->xcv_type != SEVENWIRE) {
 		uint16_t phyStatus;
-		fec5xxx_miiphy_read(&fec->miiphy, 0, 0x1, &phyStatus);
+		fec5xxx_miidev_read(&fec->miidev, 0, 0x1, &phyStatus);
 	}
 
 	/*
@@ -685,13 +682,13 @@ int mpc5xxx_fec_probe(struct device_d *dev)
 	loadtask(0, 2);
 
 	if (fec->xcv_type != SEVENWIRE) {
-		fec->miiphy.read = fec5xxx_miiphy_read;
-		fec->miiphy.write = fec5xxx_miiphy_write;
-		fec->miiphy.address = CONFIG_PHY_ADDR;
-		fec->miiphy.flags = pdata->xcv_type == MII10 ? MIIPHY_FORCE_10 : 0;
-		fec->miiphy.edev = edev;
+		fec->miidev.read = fec5xxx_miidev_read;
+		fec->miidev.write = fec5xxx_miidev_write;
+		fec->miidev.address = CONFIG_PHY_ADDR;
+		fec->miidev.flags = pdata->xcv_type == MII10 ? MIIDEV_FORCE_10 : 0;
+		fec->miidev.edev = edev;
 
-		miiphy_register(&fec->miiphy);
+		mii_register(&fec->miidev);
 	}
 
 	eth_register(edev);
diff --git a/drivers/net/fec_mpc5200.h b/drivers/net/fec_mpc5200.h
index 9eabc1e..f6da3e5 100644
--- a/drivers/net/fec_mpc5200.h
+++ b/drivers/net/fec_mpc5200.h
@@ -260,7 +260,7 @@ typedef struct {
 	uint16_t usedTbdIndex;		/* next transmit BD to clean */
 	uint16_t cleanTbdNum;		/* the number of available transmit BDs */
 
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 } mpc5xxx_fec_priv;
 
 /* Ethernet parameter area */
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 6864119..df3b6af 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -44,7 +44,7 @@
 #include <malloc.h>
 #include <xfuncs.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <errno.h>
 #include <asm/io.h>
 #include <mach/board.h>
@@ -98,7 +98,7 @@ struct macb_device {
 	const struct device	*dev;
 	struct eth_device	netdev;
 
-	struct miiphy_device	miiphy;
+	struct mii_device	miidev;
 
 	unsigned int		flags;
 };
@@ -214,8 +214,8 @@ static int macb_open(struct eth_device *edev)
 
 	debug("%s\n", __func__);
 
-	miiphy_wait_aneg(&macb->miiphy);
-	miiphy_print_status(&macb->miiphy);
+	miidev_wait_aneg(&macb->miidev);
+	miidev_print_status(&macb->miidev);
 
 	ncfgr = readl(macb->regs + MACB_NCFGR);
 	ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD));
@@ -293,8 +293,7 @@ static void macb_halt(struct eth_device *edev)
 	writel(MACB_BIT(CLRSTAT), macb->regs + MACB_NCR);
 }
 
-static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
-		uint8_t reg, uint16_t * value)
+static int macb_phy_read(struct mii_device *mdev, int addr, int reg)
 {
 	struct eth_device *edev = mdev->edev;
 	struct macb_device *macb = edev->priv;
@@ -303,6 +302,7 @@ static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
 	unsigned long netstat;
 	unsigned long frame;
 	int iflag;
+	int value;
 	uint64_t start;
 
 	debug("%s\n", __func__);
@@ -331,7 +331,7 @@ static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
 	} while (!(netstat & MACB_BIT(IDLE)));
 
 	frame = readl(macb->regs + MACB_MAN);
-	*value = MACB_BFEXT(DATA, frame);
+	value = MACB_BFEXT(DATA, frame);
 
 	iflag = disable_interrupts();
 	netctl = readl(macb->regs + MACB_NCR);
@@ -340,11 +340,10 @@ static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
 	if (iflag)
 		enable_interrupts();
 
-	return 0;
+	return value;
 }
 
-static int macb_phy_write(struct miiphy_device *mdev, uint8_t addr,
-	uint8_t reg, uint16_t value)
+static int macb_phy_write(struct mii_device *mdev, int addr, int reg, int value)
 {
 	struct eth_device *edev = mdev->edev;
 	struct macb_device *macb = edev->priv;
@@ -435,12 +434,12 @@ static int macb_probe(struct device_d *dev)
 	edev->get_ethaddr = macb_get_ethaddr;
 	edev->set_ethaddr = macb_set_ethaddr;
 
-	macb->miiphy.read = macb_phy_read;
-	macb->miiphy.write = macb_phy_write;
-	macb->miiphy.address = pdata->phy_addr;
-	macb->miiphy.flags = pdata->flags & AT91SAM_ETHER_FORCE_LINK ?
-		MIIPHY_FORCE_LINK : 0;
-	macb->miiphy.edev = edev;
+	macb->miidev.read = macb_phy_read;
+	macb->miidev.write = macb_phy_write;
+	macb->miidev.address = pdata->phy_addr;
+	macb->miidev.flags = pdata->flags & AT91SAM_ETHER_FORCE_LINK ?
+		MIIDEV_FORCE_LINK : 0;
+	macb->miidev.edev = edev;
 	macb->flags = pdata->flags;
 
 	macb->rx_buffer = xmalloc(CFG_MACB_RX_BUFFER_SIZE); 
@@ -471,7 +470,7 @@ static int macb_probe(struct device_d *dev)
 
 	writel(ncfgr, macb->regs + MACB_NCFGR);
 
-	miiphy_register(&macb->miiphy);
+	mii_register(&macb->miidev);
 	eth_register(edev);
 
 	return 0;
diff --git a/drivers/net/miidev.c b/drivers/net/miidev.c
new file mode 100644
index 0000000..343eb40
--- /dev/null
+++ b/drivers/net/miidev.c
@@ -0,0 +1,228 @@
+/*
+ * miidev.c - generic phy abstraction
+ *
+ * Copyright (c) 2007 Sascha Hauer <s.hauer at pengutronix.de>, Pengutronix
+ *
+ * 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 version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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 <driver.h>
+#include <init.h>
+#include <miidev.h>
+#include <clock.h>
+#include <net.h>
+#include <malloc.h>
+
+int miidev_restart_aneg(struct mii_device *mdev)
+{
+	uint16_t status;
+	int timeout;
+
+	/*
+	 * Reset PHY, then delay 300ns
+	 */
+	mii_write(mdev, mdev->address, MII_BMCR, BMCR_RESET);
+
+	if (mdev->flags & MIIDEV_FORCE_LINK)
+		return 0;
+
+	udelay(1000);
+
+	if (mdev->flags & MIIDEV_FORCE_10) {
+		printf("Forcing 10 Mbps ethernet link... ");
+		status = mii_read(mdev, mdev->address, MII_BMSR);
+		mii_write(mdev, mdev->address, MII_BMCR, BMCR_FULLDPLX | BMCR_CTST);
+
+		timeout = 20;
+		do {	/* wait for link status to go down */
+			udelay(10000);
+			if ((timeout--) == 0) {
+				debug("hmmm, should not have waited...");
+				break;
+			}
+			status = mii_read(mdev, mdev->address, MII_BMSR);
+		} while (status & BMSR_LSTATUS);
+
+	} else {	/* MII100 */
+		/*
+		 * Set the auto-negotiation advertisement register bits
+		 */
+		status = mii_read(mdev, mdev->address, MII_ADVERTISE);
+		status |= ADVERTISE_ALL;
+		mii_write(mdev, mdev->address, MII_ADVERTISE, status);
+
+		mii_write(mdev, mdev->address, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
+	}
+
+	return 0;
+}
+
+int miidev_wait_aneg(struct mii_device *mdev)
+{
+	uint64_t start;
+	int status;
+
+	if (mdev->flags & MIIDEV_FORCE_LINK)
+		return 0;
+
+	/*
+	 * Wait for AN completion
+	 */
+	start = get_time_ns();
+	do {
+		if (is_timeout(start, 5 * SECOND)) {
+			printf("%s: Autonegotiation timeout\n", mdev->cdev.name);
+			return -1;
+		}
+
+		status = mii_read(mdev, mdev->address, MII_BMSR);
+		if (status < 0) {
+			printf("%s: Autonegotiation failed. status: 0x%04x\n", mdev->cdev.name, status);
+			return -1;
+		}
+	} while (!(status & BMSR_LSTATUS));
+
+	return 0;
+}
+
+int miidev_print_status(struct mii_device *mdev)
+{
+	int bmsr, bmcr, lpa;
+	char *duplex;
+	int speed;
+
+	if (mdev->flags & MIIDEV_FORCE_LINK) {
+		printf("Forcing link present...\n");
+		return 0;
+	}
+
+	bmsr = mii_read(mdev, mdev->address, MII_BMSR);
+	if (bmsr < 0)
+		goto err_out;
+	bmcr = mii_read(mdev, mdev->address, MII_BMCR);
+	if (bmcr < 0)
+		goto err_out;
+	lpa = mii_read(mdev, mdev->address, MII_LPA);
+	if (lpa < 0)
+		goto err_out;
+
+	printf("%s: Link is %s", mdev->cdev.name,
+			bmsr & BMSR_LSTATUS ? "up" : "down");
+
+	if (bmcr & BMCR_ANENABLE) {
+		duplex = lpa & LPA_DUPLEX ? "Full" : "Half";
+		speed = lpa & LPA_100 ? 100 : 10;
+	} else {
+		duplex = bmcr & BMCR_FULLDPLX ? "Full" : "Half";
+		speed = bmcr & BMCR_SPEED100 ? 100 : 10;
+	}
+
+	printf(" - %d/%s\n", speed, duplex);
+
+	return 0;
+err_out:
+	printf("%s: failed to read\n", mdev->cdev.name);
+	return -1;
+}
+
+static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
+{
+	int i = count;
+	uint16_t *buf = _buf;
+	struct mii_device *mdev = cdev->priv;
+
+	while (i > 1) {
+		*buf = mii_read(mdev, mdev->address, offset);
+		buf++;
+		i -= 2;
+		offset++;
+	}
+
+	return count;
+}
+
+static ssize_t miidev_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
+{
+	int i = count;
+	const uint16_t *buf = _buf;
+	struct mii_device *mdev = cdev->priv;
+
+	while (i > 1) {
+		mii_write(mdev, mdev->address, offset, *buf);
+		buf++;
+		i -= 2;
+		offset++;
+	}
+
+	return count;
+}
+
+static struct file_operations miidev_ops = {
+	.read  = miidev_read,
+	.write = miidev_write,
+	.lseek = dev_lseek_default,
+};
+
+static int miidev_probe(struct device_d *dev)
+{
+	struct mii_device *mdev = dev->priv;
+
+	mdev->cdev.name = asprintf("phy%d", dev->id);
+	mdev->cdev.size = 32;
+	mdev->cdev.ops = &miidev_ops;
+	mdev->cdev.priv = mdev;
+	mdev->cdev.dev = dev;
+	devfs_create(&mdev->cdev);
+	return 0;
+}
+
+static void miidev_remove(struct device_d *dev)
+{
+	struct mii_device *mdev = dev->priv;
+
+	free(mdev->cdev.name);
+	devfs_remove(&mdev->cdev);
+}
+
+static struct driver_d miidev_drv = {
+        .name  = "miidev",
+        .probe = miidev_probe,
+	.remove = miidev_remove,
+};
+
+int mii_register(struct mii_device *mdev)
+{
+	mdev->dev.priv = mdev;
+	strcpy(mdev->dev.name, "miidev");
+
+	return register_device(&mdev->dev);
+}
+
+void mii_unregister(struct mii_device *mdev)
+{
+	unregister_device(&mdev->dev);
+}
+
+static int miidev_init(void)
+{
+	register_driver(&miidev_drv);
+	return 0;
+}
+
+device_initcall(miidev_init);
+
diff --git a/drivers/net/miiphy.c b/drivers/net/miiphy.c
deleted file mode 100644
index 12aa7a6..0000000
--- a/drivers/net/miiphy.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * miiphy.c - generic phy abstraction
- *
- * Copyright (c) 2007 Sascha Hauer <s.hauer at pengutronix.de>, Pengutronix
- *
- * 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 version 2
- * as published by the Free Software Foundation.
- *
- * 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 <driver.h>
-#include <init.h>
-#include <miiphy.h>
-#include <clock.h>
-#include <net.h>
-#include <malloc.h>
-
-int miiphy_restart_aneg(struct miiphy_device *mdev)
-{
-	uint16_t status;
-	int timeout;
-
-	/*
-	 * Reset PHY, then delay 300ns
-	 */
-	mdev->write(mdev, mdev->address, MII_BMCR, BMCR_RESET);
-
-	if (mdev->flags & MIIPHY_FORCE_LINK)
-		return 0;
-
-	udelay(1000);
-
-	if (mdev->flags & MIIPHY_FORCE_10) {
-		printf("Forcing 10 Mbps ethernet link... ");
-		mdev->read(mdev, mdev->address, MII_BMSR, &status);
-		mdev->write(mdev, mdev->address, MII_BMCR, BMCR_FULLDPLX | BMCR_CTST);
-
-		timeout = 20;
-		do {	/* wait for link status to go down */
-			udelay(10000);
-			if ((timeout--) == 0) {
-				debug("hmmm, should not have waited...");
-				break;
-			}
-			mdev->read(mdev, mdev->address, MII_BMSR, &status);
-		} while (status & BMSR_LSTATUS);
-
-	} else {	/* MII100 */
-		/*
-		 * Set the auto-negotiation advertisement register bits
-		 */
-		mdev->read(mdev, mdev->address, MII_ADVERTISE, &status);
-		status |= ADVERTISE_ALL;
-		mdev->write(mdev, mdev->address, MII_ADVERTISE, status);
-
-		mdev->write(mdev, mdev->address, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
-	}
-
-	return 0;
-}
-
-int miiphy_wait_aneg(struct miiphy_device *mdev)
-{
-	uint64_t start;
-	uint16_t status;
-
-	if (mdev->flags & MIIPHY_FORCE_LINK)
-		return 0;
-
-	/*
-	 * Wait for AN completion
-	 */
-	start = get_time_ns();
-	do {
-		if (is_timeout(start, 5 * SECOND)) {
-			printf("%s: Autonegotiation timeout\n", mdev->cdev.name);
-			return -1;
-		}
-
-		if (mdev->read(mdev, mdev->address, MII_BMSR, &status)) {
-			printf("%s: Autonegotiation failed. status: 0x%04x\n", mdev->cdev.name, status);
-			return -1;
-		}
-	} while (!(status & BMSR_LSTATUS));
-
-	return 0;
-}
-
-int miiphy_print_status(struct miiphy_device *mdev)
-{
-	uint16_t bmsr, bmcr, lpa;
-	char *duplex;
-	int speed;
-
-	if (mdev->flags & MIIPHY_FORCE_LINK) {
-		printf("Forcing link present...\n");
-		return 0;
-	}
-
-	if (mdev->read(mdev, mdev->address, MII_BMSR, &bmsr) != 0)
-		goto err_out;
-	if (mdev->read(mdev, mdev->address, MII_BMCR, &bmcr) != 0)
-		goto err_out;
-	if (mdev->read(mdev, mdev->address, MII_LPA, &lpa) != 0)
-		goto err_out;
-
-	printf("%s: Link is %s", mdev->cdev.name,
-			bmsr & BMSR_LSTATUS ? "up" : "down");
-
-	if (bmcr & BMCR_ANENABLE) {
-		duplex = lpa & LPA_DUPLEX ? "Full" : "Half";
-		speed = lpa & LPA_100 ? 100 : 10;
-	} else {
-		duplex = bmcr & BMCR_FULLDPLX ? "Full" : "Half";
-		speed = bmcr & BMCR_SPEED100 ? 100 : 10;
-	}
-
-	printf(" - %d/%s\n", speed, duplex);
-
-	return 0;
-err_out:
-	printf("%s: failed to read\n", mdev->cdev.name);
-	return -1;
-}
-
-static ssize_t miiphy_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
-{
-	int i = count;
-	uint16_t *buf = _buf;
-	struct miiphy_device *mdev = cdev->priv;
-
-	while (i > 1) {
-		mdev->read(mdev, mdev->address, offset, buf);
-		buf++;
-		i -= 2;
-		offset++;
-	}
-
-	return count;
-}
-
-static ssize_t miiphy_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
-{
-	int i = count;
-	const uint16_t *buf = _buf;
-	struct miiphy_device *mdev = cdev->priv;
-
-	while (i > 1) {
-		mdev->write(mdev, mdev->address, offset, *buf);
-		buf++;
-		i -= 2;
-		offset++;
-	}
-
-	return count;
-}
-
-static struct file_operations miiphy_ops = {
-	.read  = miiphy_read,
-	.write = miiphy_write,
-	.lseek = dev_lseek_default,
-};
-
-static int miiphy_probe(struct device_d *dev)
-{
-	struct miiphy_device *mdev = dev->priv;
-
-	mdev->cdev.name = asprintf("phy%d", dev->id);
-	mdev->cdev.size = 32;
-	mdev->cdev.ops = &miiphy_ops;
-	mdev->cdev.priv = mdev;
-	mdev->cdev.dev = dev;
-	devfs_create(&mdev->cdev);
-	return 0;
-}
-
-static void miiphy_remove(struct device_d *dev)
-{
-	struct miiphy_device *mdev = dev->priv;
-
-	free(mdev->cdev.name);
-	devfs_remove(&mdev->cdev);
-}
-
-static struct driver_d miiphy_drv = {
-        .name  = "miiphy",
-        .probe = miiphy_probe,
-	.remove = miiphy_remove,
-};
-
-int miiphy_register(struct miiphy_device *mdev)
-{
-	mdev->dev.priv = mdev;
-	strcpy(mdev->dev.name, "miiphy");
-
-	return register_device(&mdev->dev);
-}
-
-void miiphy_unregister(struct miiphy_device *mdev)
-{
-	unregister_device(&mdev->dev);
-}
-
-static int miiphy_init(void)
-{
-	register_driver(&miiphy_drv);
-	return 0;
-}
-
-device_initcall(miiphy_init);
-
diff --git a/drivers/net/netx_eth.c b/drivers/net/netx_eth.c
index f2d7b4a..c3083f7 100644
--- a/drivers/net/netx_eth.c
+++ b/drivers/net/netx_eth.c
@@ -2,12 +2,12 @@
 #include <command.h>
 #include <net.h>
 #include <asm/io.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <mach/netx-xc.h>
 #include <mach/netx-eth.h>
 #include <mach/netx-regs.h>
 #include <xfuncs.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <init.h>
 #include <driver.h>
 
@@ -48,7 +48,7 @@
 #define CON_FIFO_PORT_LO(xcno)  (6 + ((xcno) << 3))    /* Index of the FIFO where sent Data packages are confirmed */
 
 struct netx_eth_priv {
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	int xcno;
 };
 
@@ -119,25 +119,28 @@ static int netx_eth_rx (struct eth_device *edev)
 	return 0;
 }
 
-static int netx_miiphy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-		uint8_t reg, uint16_t * val)
+static int netx_miidev_read(struct mii_device *mdev, int phy_addr, int reg)
 {
+	int value;
+
 	MIIMU_REG = MIIMU_SNRDY | MIIMU_PREAMBLE | MIIMU_PHYADDR(phy_addr) |
 	            MIIMU_REGADDR(reg) | MIIMU_PHY_NRES;
 
 	while(MIIMU_REG & MIIMU_SNRDY);
 
-	*val = MIIMU_REG >> 16;
+	value = MIIMU_REG >> 16;
 
-/*	printf("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n",__FUNCTION__,addr,reg,*value); */
+	debug("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n", __FUNCTION__,
+	      addr, reg, value)
 
-	return 0;
+	return value;
 }
 
-static int netx_miiphy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-	uint8_t reg, uint16_t val)
+static int netx_miidev_write(struct mii_device *mdev, int phy_addr,
+	int reg, int val)
 {
-/*	printf("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n",__FUNCTION__,addr,reg,value); */
+	debug("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n",__FUNCTION__,
+	      addr, reg, val);
 
 	MIIMU_REG = MIIMU_SNRDY | MIIMU_PREAMBLE | MIIMU_PHYADDR(phy_addr) |
 	            MIIMU_REGADDR(reg) | MIIMU_PHY_NRES | MIIMU_OPMODE_WRITE |
@@ -187,7 +190,7 @@ static int netx_eth_init_dev(struct eth_device *edev)
 	for (i = 2; i <= 18; i++)
 		PFIFO_REG( PFIFO_BASE(EMPTY_PTR_FIFO(xcno)) ) = FIFO_PTR_FRAMENO(i) | FIFO_PTR_SEGMENT(xcno);
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 	return 0;
 }
 
@@ -257,13 +260,13 @@ static int netx_eth_probe(struct device_d *dev)
 	edev->get_ethaddr = netx_eth_get_ethaddr;
 	edev->set_ethaddr = netx_eth_set_ethaddr;
 
-	priv->miiphy.read = netx_miiphy_read;
-	priv->miiphy.write = netx_miiphy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
+	priv->miidev.read = netx_miidev_read;
+	priv->miidev.write = netx_miidev_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
 
 	netx_eth_init_phy();
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
         return 0;
diff --git a/drivers/net/smc91111.c b/drivers/net/smc91111.c
index 58ebaa9..605a7d8 100644
--- a/drivers/net/smc91111.c
+++ b/drivers/net/smc91111.c
@@ -67,7 +67,7 @@
 
 #include <command.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <init.h>
 #include <xfuncs.h>
@@ -451,7 +451,7 @@ struct accessors {
 };
 
 struct smc91c111_priv {
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	struct accessors a;
 	unsigned long base;
 };
@@ -621,8 +621,8 @@ static void smc_wait_mmu_release_complete(struct smc91c111_priv *priv)
 	}
 }
 
-static int smc91c111_phy_write(struct miiphy_device *mdev, uint8_t phyaddr,
-	uint8_t phyreg, uint16_t phydata)
+static int smc91c111_phy_write(struct mii_device *mdev, int phyaddr,
+	int phyreg, int phydata)
 {
 	struct eth_device *edev = mdev->edev;
 	struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
@@ -723,8 +723,7 @@ static int smc91c111_phy_write(struct miiphy_device *mdev, uint8_t phyaddr,
 	return 0;
 }
 
-static int smc91c111_phy_read(struct miiphy_device *mdev, uint8_t phyaddr,
-		uint8_t phyreg, uint16_t * val)
+static int smc91c111_phy_read(struct mii_device *mdev, int phyaddr, int phyreg)
 {
 	struct eth_device *edev = mdev->edev;
 	struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
@@ -827,8 +826,7 @@ static int smc91c111_phy_read(struct miiphy_device *mdev, uint8_t phyaddr,
 			phydata |= 0x0001;
 	}
 
-	*val = phydata;
-	return 0;
+	return phydata;
 }
 
 static void smc91c111_reset(struct eth_device *edev)
@@ -896,8 +894,8 @@ static int smc91c111_eth_open(struct eth_device *edev)
 	struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
 	smc91c111_enable(edev);
 
-	miiphy_wait_aneg(&priv->miiphy);
-	miiphy_print_status(&priv->miiphy);
+	miidev_wait_aneg(&priv->miidev);
+	miidev_print_status(&priv->miidev);
 
 	return 0;
 }
@@ -1287,7 +1285,7 @@ static int smc91c111_init_dev(struct eth_device *edev)
 	SMC_SELECT_BANK(priv, 0);
 	SMC_outw(priv, RPC_DEFAULT, RPC_REG);
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 
 	return 0;
 }
@@ -1314,16 +1312,16 @@ static int smc91c111_probe(struct device_d *dev)
 	edev->get_ethaddr = smc91c111_get_ethaddr;
 	edev->set_ethaddr = smc91c111_set_ethaddr;
 
-	priv->miiphy.read = smc91c111_phy_read;
-	priv->miiphy.write = smc91c111_phy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
-	priv->miiphy.edev = edev;
+	priv->miidev.read = smc91c111_phy_read;
+	priv->miidev.write = smc91c111_phy_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
+	priv->miidev.edev = edev;
 	priv->base = dev->map_base;
 
 	smc91c111_reset(edev);
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
 	return 0;
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c
index ca320d5..b559590 100644
--- a/drivers/net/smc911x.c
+++ b/drivers/net/smc911x.c
@@ -30,7 +30,7 @@
 
 #include <command.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <init.h>
 #include <xfuncs.h>
@@ -367,7 +367,7 @@
 #define CHIP_9218	0x118a
 
 struct smc911x_priv {
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	unsigned long base;
 };
 
@@ -465,8 +465,7 @@ static int smc911x_set_ethaddr(struct eth_device *edev, unsigned char *m)
 	return 0;
 }
 
-static int smc911x_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-		uint8_t reg, uint16_t * val)
+static int smc911x_phy_read(struct mii_device *mdev, int phy_addr, int reg)
 {
 	struct eth_device *edev = mdev->edev;
 
@@ -477,13 +476,11 @@ static int smc911x_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
 
 	while (smc911x_get_mac_csr(edev, MII_ACC) & MII_ACC_MII_BUSY);
 
-	*val = smc911x_get_mac_csr(edev, MII_DATA);
-
-	return 0;
+	return smc911x_get_mac_csr(edev, MII_DATA);
 }
 
-static int smc911x_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-	uint8_t reg, uint16_t val)
+static int smc911x_phy_write(struct mii_device *mdev, int phy_addr,
+	int reg, int val)
 {
 	struct eth_device *edev = mdev->edev;
 
@@ -579,8 +576,8 @@ static int smc911x_eth_open(struct eth_device *edev)
 {
 	struct smc911x_priv *priv = (struct smc911x_priv *)edev->priv;
 
-	miiphy_wait_aneg(&priv->miiphy);
-	miiphy_print_status(&priv->miiphy);
+	miidev_wait_aneg(&priv->miidev);
+	miidev_print_status(&priv->miidev);
 
 	/* Turn on Tx + Rx */
 	smc911x_enable(edev);
@@ -681,7 +678,7 @@ static int smc911x_init_dev(struct eth_device *edev)
 	smc911x_set_mac_csr(edev, MAC_CR, MAC_CR_TXEN | MAC_CR_RXEN |
 			MAC_CR_HBDIS);
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 
 	return 0;
 }
@@ -729,17 +726,17 @@ static int smc911x_probe(struct device_d *dev)
 	edev->get_ethaddr = smc911x_get_ethaddr;
 	edev->set_ethaddr = smc911x_set_ethaddr;
 
-	priv->miiphy.read = smc911x_phy_read;
-	priv->miiphy.write = smc911x_phy_write;
-	priv->miiphy.address = 1;
-	priv->miiphy.flags = 0;
-	priv->miiphy.edev = edev;
+	priv->miidev.read = smc911x_phy_read;
+	priv->miidev.write = smc911x_phy_write;
+	priv->miidev.address = 1;
+	priv->miidev.flags = 0;
+	priv->miidev.edev = edev;
 	priv->base = dev->map_base;
 
 	smc911x_reset(edev);
 	smc911x_phy_reset(edev);
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
         return 0;
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 972fa40..6482626 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -5,7 +5,7 @@ menuconfig NET_USB
 if NET_USB
 
 config NET_USB_ASIX
-	select MIIPHY
+	select MIIDEV
 	bool "Asix compatible"
 
 endif
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c
index ca71b34..d148925 100644
--- a/drivers/net/usb/asix.c
+++ b/drivers/net/usb/asix.c
@@ -1,7 +1,7 @@
 #include <common.h>
 #include <init.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <usb/usb.h>
 #include <usb/usbnet.h>
 #include <errno.h>
@@ -231,8 +231,7 @@ static inline int asix_set_hw_mii(struct usbnet *dev)
 	return ret;
 }
 
-static int asix_mdio_read(struct miiphy_device *mdev, uint8_t phy_id,
-		uint8_t loc, uint16_t *val)
+static int asix_mdio_read(struct mii_device *mdev, int phy_id, int loc)
 {
 	struct eth_device *eth = mdev->edev;
 	struct usbnet *dev = eth->priv;
@@ -246,13 +245,10 @@ static int asix_mdio_read(struct miiphy_device *mdev, uint8_t phy_id,
 	dev_dbg(&dev->edev.dev, "asix_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x",
 			phy_id, loc, le16_to_cpu(res));
 
-	*val = le16_to_cpu(res);
-
-	return 0;
+	return le16_to_cpu(res);
 }
 
-static int asix_mdio_write(struct miiphy_device *mdev, uint8_t phy_id,
-		uint8_t loc, uint16_t val)
+static int asix_mdio_write(struct mii_device *mdev, int phy_id, int loc, int val)
 {
 	struct eth_device *eth = mdev->edev;
 	struct usbnet *dev = eth->priv;
@@ -473,13 +469,13 @@ static int asix_tx_fixup(struct usbnet *dev,
 
 static int asix_init_mii(struct usbnet *dev)
 {
-	dev->miiphy.read = asix_mdio_read;
-	dev->miiphy.write = asix_mdio_write;
-	dev->miiphy.address = asix_get_phy_addr(dev);
-	dev->miiphy.flags = 0;
-	dev->miiphy.edev = &dev->edev;
+	dev->miidev.read = asix_mdio_read;
+	dev->miidev.write = asix_mdio_write;
+	dev->miidev.address = asix_get_phy_addr(dev);
+	dev->miidev.flags = 0;
+	dev->miidev.edev = &dev->edev;
 
-	return miiphy_register(&dev->miiphy);
+	return mii_register(&dev->miidev);
 }
 
 static int ax88172_link_reset(struct usbnet *dev)
@@ -634,7 +630,7 @@ out:
 
 static void asix_unbind(struct usbnet *dev)
 {
-	miiphy_unregister(&dev->miiphy);
+	mii_unregister(&dev->miidev);
 }
 
 static struct driver_info ax8817x_info = {
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index cc170f6..983d464 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -160,7 +160,7 @@ static int usbnet_init(struct eth_device *edev)
                 return ret;
         }
 
-	miiphy_restart_aneg(&dev->miiphy);
+	miidev_restart_aneg(&dev->miidev);
 
 	return 0;
 }
@@ -171,10 +171,10 @@ static int usbnet_open(struct eth_device *edev)
 
 	dev_dbg(&edev->dev, "%s\n",__func__);
 
-	if (miiphy_wait_aneg(&dev->miiphy))
+	if (miidev_wait_aneg(&dev->miidev))
 		return -1;
 
-	miiphy_print_status(&dev->miiphy);
+	miidev_print_status(&dev->miidev);
 
 	return 0;
 }
diff --git a/include/linux/mii.h b/include/linux/mii.h
new file mode 100644
index 0000000..7345172
--- /dev/null
+++ b/include/linux/mii.h
@@ -0,0 +1,232 @@
+/*
+ * linux/mii.h: definitions for MII-compatible transceivers
+ * Originally drivers/net/sunhme.h.
+ *
+ * Copyright (C) 1996, 1999, 2001 David S. Miller (davem at redhat.com)
+ */
+
+#ifndef __LINUX_MII_H__
+#define __LINUX_MII_H__
+
+/* Generic MII registers. */
+
+#define MII_BMCR            0x00        /* Basic mode control register */
+#define MII_BMSR            0x01        /* Basic mode status register  */
+#define MII_PHYSID1         0x02        /* PHYS ID 1                   */
+#define MII_PHYSID2         0x03        /* PHYS ID 2                   */
+#define MII_ADVERTISE       0x04        /* Advertisement control reg   */
+#define MII_LPA             0x05        /* Link partner ability reg    */
+#define MII_EXPANSION       0x06        /* Expansion register          */
+#define MII_CTRL1000        0x09        /* 1000BASE-T control          */
+#define MII_STAT1000        0x0a        /* 1000BASE-T status           */
+#define MII_ESTATUS	    0x0f	/* Extended Status */
+#define MII_DCOUNTER        0x12        /* Disconnect counter          */
+#define MII_FCSCOUNTER      0x13        /* False carrier counter       */
+#define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */
+#define MII_RERRCOUNTER     0x15        /* Receive error counter       */
+#define MII_SREVISION       0x16        /* Silicon revision            */
+#define MII_RESV1           0x17        /* Reserved...                 */
+#define MII_LBRERROR        0x18        /* Lpback, rx, bypass error    */
+#define MII_PHYADDR         0x19        /* PHY address                 */
+#define MII_RESV2           0x1a        /* Reserved...                 */
+#define MII_TPISTATUS       0x1b        /* TPI status for 10mbps       */
+#define MII_NCONFIG         0x1c        /* Network interface config    */
+
+/* Basic mode control register. */
+#define BMCR_SPEED_MASK		0x2040	/* 10/100/1000		       */
+#define BMCR_SPEED10		0x0000	/* Select 10Mbps	       */
+#define BMCR_RESV               0x003f  /* Unused...                   */
+#define BMCR_SPEED1000		0x0040  /* MSB of Speed (1000)         */
+#define BMCR_CTST               0x0080  /* Collision test              */
+#define BMCR_FULLDPLX           0x0100  /* Full duplex                 */
+#define BMCR_ANRESTART          0x0200  /* Auto negotiation restart    */
+#define BMCR_ISOLATE            0x0400  /* Disconnect DP83840 from MII */
+#define BMCR_PDOWN              0x0800  /* Powerdown the DP83840       */
+#define BMCR_ANENABLE           0x1000  /* Enable auto negotiation     */
+#define BMCR_SPEED100           0x2000  /* Select 100Mbps              */
+#define BMCR_LOOPBACK           0x4000  /* TXD loopback bits           */
+#define BMCR_RESET              0x8000  /* Reset the DP83840           */
+
+/* Basic mode status register. */
+#define BMSR_ERCAP              0x0001  /* Ext-reg capability          */
+#define BMSR_JCD                0x0002  /* Jabber detected             */
+#define BMSR_LSTATUS            0x0004  /* Link status                 */
+#define BMSR_ANEGCAPABLE        0x0008  /* Able to do auto-negotiation */
+#define BMSR_RFAULT             0x0010  /* Remote fault detected       */
+#define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */
+#define BMSR_RESV               0x00c0  /* Unused...                   */
+#define BMSR_ESTATEN		0x0100	/* Extended Status in R15 */
+#define BMSR_100HALF2           0x0200  /* Can do 100BASE-T2 HDX */
+#define BMSR_100FULL2           0x0400  /* Can do 100BASE-T2 FDX */
+#define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */
+#define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */
+#define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */
+#define BMSR_100FULL            0x4000  /* Can do 100mbps, full-duplex */
+#define BMSR_100BASE4           0x8000  /* Can do 100mbps, 4k packets  */
+
+/* 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_1000XFULL     0x0020  /* Try for 1000BASE-X full-duplex */
+#define ADVERTISE_10FULL        0x0040  /* Try for 10mbps full-duplex  */
+#define ADVERTISE_1000XHALF     0x0040  /* Try for 1000BASE-X half-duplex */
+#define ADVERTISE_100HALF       0x0080  /* Try for 100mbps half-duplex */
+#define ADVERTISE_1000XPAUSE    0x0080  /* Try for 1000BASE-X pause    */
+#define ADVERTISE_100FULL       0x0100  /* Try for 100mbps full-duplex */
+#define ADVERTISE_1000XPSE_ASYM 0x0100  /* Try for 1000BASE-X asym pause */
+#define ADVERTISE_100BASE4      0x0200  /* Try for 100mbps 4k packets  */
+#define ADVERTISE_PAUSE_CAP     0x0400  /* Try for pause               */
+#define ADVERTISE_PAUSE_ASYM    0x0800  /* Try for asymetric pause     */
+#define ADVERTISE_RESV          0x1000  /* 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)
+
+/* Link partner ability register. */
+#define LPA_SLCT                0x001f  /* Same as advertise selector  */
+#define LPA_10HALF              0x0020  /* Can do 10mbps half-duplex   */
+#define LPA_1000XFULL           0x0020  /* Can do 1000BASE-X full-duplex */
+#define LPA_10FULL              0x0040  /* Can do 10mbps full-duplex   */
+#define LPA_1000XHALF           0x0040  /* Can do 1000BASE-X half-duplex */
+#define LPA_100HALF             0x0080  /* Can do 100mbps half-duplex  */
+#define LPA_1000XPAUSE          0x0080  /* Can do 1000BASE-X pause     */
+#define LPA_100FULL             0x0100  /* Can do 100mbps full-duplex  */
+#define LPA_1000XPAUSE_ASYM     0x0100  /* Can do 1000BASE-X pause asym*/
+#define LPA_100BASE4            0x0200  /* Can do 100mbps 4k packets   */
+#define LPA_PAUSE_CAP           0x0400  /* Can pause                   */
+#define LPA_PAUSE_ASYM          0x0800  /* Can pause asymetrically     */
+#define LPA_RESV                0x1000  /* Unused...                   */
+#define LPA_RFAULT              0x2000  /* Link partner faulted        */
+#define LPA_LPACK               0x4000  /* Link partner acked us       */
+#define LPA_NPAGE               0x8000  /* Next page bit               */
+
+#define LPA_DUPLEX		(LPA_10FULL | LPA_100FULL)
+#define LPA_100			(LPA_100FULL | LPA_100HALF | LPA_100BASE4)
+
+/* Expansion register for auto-negotiation. */
+#define EXPANSION_NWAY          0x0001  /* Can do N-way auto-nego      */
+#define EXPANSION_LCWP          0x0002  /* Got new RX page code word   */
+#define EXPANSION_ENABLENPAGE   0x0004  /* This enables npage words    */
+#define EXPANSION_NPCAPABLE     0x0008  /* Link partner supports npage */
+#define EXPANSION_MFAULTS       0x0010  /* Multiple faults detected    */
+#define EXPANSION_RESV          0xffe0  /* Unused...                   */
+
+#define ESTATUS_1000_TFULL	0x2000	/* Can do 1000BT Full */
+#define ESTATUS_1000_THALF	0x1000	/* Can do 1000BT Half */
+
+/* N-way test register. */
+#define NWAYTEST_RESV1          0x00ff  /* Unused...                   */
+#define NWAYTEST_LOOPBACK       0x0100  /* Enable loopback for N-way   */
+#define NWAYTEST_RESV2          0xfe00  /* Unused...                   */
+
+/* 1000BASE-T Control register */
+#define ADVERTISE_1000FULL      0x0200  /* Advertise 1000BASE-T full duplex */
+#define ADVERTISE_1000HALF      0x0100  /* Advertise 1000BASE-T half duplex */
+
+/* 1000BASE-T Status register */
+#define LPA_1000LOCALRXOK       0x2000  /* Link partner local receiver status */
+#define LPA_1000REMRXOK         0x1000  /* Link partner remote receiver status */
+#define LPA_1000FULL            0x0800  /* Link partner 1000BASE-T full duplex */
+#define LPA_1000HALF            0x0400  /* Link partner 1000BASE-T half duplex */
+
+/* Flow control flags */
+#define FLOW_CTRL_TX		0x01
+#define FLOW_CTRL_RX		0x02
+
+/**
+ * mii_nway_result
+ * @negotiated: value of MII ANAR and'd with ANLPAR
+ *
+ * Given a set of MII abilities, check each bit and returns the
+ * currently supported media, in the priority order defined by
+ * IEEE 802.3u.  We use LPA_xxx constants but note this is not the
+ * value of LPA solely, as described above.
+ *
+ * The one exception to IEEE 802.3u is that 100baseT4 is placed
+ * between 100T-full and 100T-half.  If your phy does not support
+ * 100T4 this is fine.  If your phy places 100T4 elsewhere in the
+ * priority order, you will need to roll your own function.
+ */
+static inline unsigned int mii_nway_result (unsigned int negotiated)
+{
+	unsigned int ret;
+
+	if (negotiated & LPA_100FULL)
+		ret = LPA_100FULL;
+	else if (negotiated & LPA_100BASE4)
+		ret = LPA_100BASE4;
+	else if (negotiated & LPA_100HALF)
+		ret = LPA_100HALF;
+	else if (negotiated & LPA_10FULL)
+		ret = LPA_10FULL;
+	else
+		ret = LPA_10HALF;
+
+	return ret;
+}
+
+/**
+ * mii_duplex
+ * @duplex_lock: Non-zero if duplex is locked at full
+ * @negotiated: value of MII ANAR and'd with ANLPAR
+ *
+ * A small helper function for a common case.  Returns one
+ * if the media is operating or locked at full duplex, and
+ * returns zero otherwise.
+ */
+static inline unsigned int mii_duplex (unsigned int duplex_lock,
+				       unsigned int negotiated)
+{
+	if (duplex_lock)
+		return 1;
+	if (mii_nway_result(negotiated) & LPA_DUPLEX)
+		return 1;
+	return 0;
+}
+
+/**
+ * mii_advertise_flowctrl - get flow control advertisement flags
+ * @cap: Flow control capabilities (FLOW_CTRL_RX, FLOW_CTRL_TX or both)
+ */
+static inline u16 mii_advertise_flowctrl(int cap)
+{
+	u16 adv = 0;
+
+	if (cap & FLOW_CTRL_RX)
+		adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
+	if (cap & FLOW_CTRL_TX)
+		adv ^= ADVERTISE_PAUSE_ASYM;
+
+	return adv;
+}
+
+/**
+ * mii_resolve_flowctrl_fdx
+ * @lcladv: value of MII ADVERTISE register
+ * @rmtadv: value of MII LPA register
+ *
+ * Resolve full duplex flow control as per IEEE 802.3-2005 table 28B-3
+ */
+static inline u8 mii_resolve_flowctrl_fdx(u16 lcladv, u16 rmtadv)
+{
+	u8 cap = 0;
+
+	if (lcladv & rmtadv & ADVERTISE_PAUSE_CAP) {
+		cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
+	} else if (lcladv & rmtadv & ADVERTISE_PAUSE_ASYM) {
+		if (lcladv & ADVERTISE_PAUSE_CAP)
+			cap = FLOW_CTRL_RX;
+		else if (rmtadv & ADVERTISE_PAUSE_CAP)
+			cap = FLOW_CTRL_TX;
+	}
+
+	return cap;
+}
+
+#endif /* __LINUX_MII_H__ */
diff --git a/include/miidev.h b/include/miidev.h
new file mode 100644
index 0000000..6f653d9
--- /dev/null
+++ b/include/miidev.h
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2001
+ * Gerald Van Baren, Custom IDEAS, vanbaren at cideas.com.
+ *
+ * (C) Copyright 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.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
+ */
+#ifndef __MIIDEV_H__
+#define __MIIDEV_H__
+
+#include <driver.h>
+#include <linux/mii.h>
+
+#define MIIDEV_FORCE_10		(1 << 0)
+#define MIIDEV_FORCE_LINK	(1 << 1)
+
+struct mii_device {
+	struct device_d dev;
+
+	int address;	/* The address the phy has on the bus */
+	int	(*read) (struct mii_device *dev, int addr, int reg);
+	int	(*write) (struct mii_device *dev, int addr, int reg, int value);
+
+	int flags;
+
+	struct eth_device *edev;
+	struct cdev cdev;
+};
+
+int mii_register(struct mii_device *dev);
+void mii_unregister(struct mii_device *mdev);
+int miidev_restart_aneg(struct mii_device *mdev);
+int miidev_wait_aneg(struct mii_device *mdev);
+int miidev_print_status(struct mii_device *mdev);
+
+static int inline mii_write(struct mii_device *dev, int addr, int reg, int value)
+{
+	return dev->write(dev, addr, reg, value);
+}
+
+static int inline mii_read(struct mii_device *dev, int addr, int reg)
+{
+	return dev->read(dev, addr, reg);
+}
+#endif /* __MIIDEV_H__ */
diff --git a/include/miiphy.h b/include/miiphy.h
deleted file mode 100644
index 67f1b1c..0000000
--- a/include/miiphy.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * linux/mii.h: definitions for MII-compatible transceivers
- * Originally drivers/net/sunhme.h.
- *
- * Copyright (C) 1996, 1999, 2001 David S. Miller (davem at redhat.com)
- */
-
-#ifndef _MII_PHY_H_
-#define _MII_PHY_H_
-
-#include <driver.h>
-
-#define MIIPHY_FORCE_10		(1 << 0)
-#define MIIPHY_FORCE_LINK	(1 << 1)
-
-#define MII_BMCR            0x00        /* Basic mode control register */
-#define MII_BMSR            0x01        /* Basic mode status register  */
-#define MII_PHYSID1         0x02        /* PHYS ID 1                   */
-#define MII_PHYSID2         0x03        /* PHYS ID 2                   */
-#define MII_ADVERTISE       0x04        /* Advertisement control reg   */
-#define MII_LPA             0x05        /* Link partner ability reg    */
-#define MII_EXPANSION       0x06        /* Expansion register          */
-#define MII_CTRL1000        0x09        /* 1000BASE-T control          */
-#define MII_STAT1000        0x0a        /* 1000BASE-T status           */
-#define MII_ESTATUS	    0x0f	/* Extended Status             */
-#define MII_DCOUNTER        0x12        /* Disconnect counter          */
-#define MII_FCSCOUNTER      0x13        /* False carrier counter       */
-#define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */
-#define MII_RERRCOUNTER     0x15        /* Receive error counter       */
-#define MII_SREVISION       0x16        /* Silicon revision            */
-#define MII_RESV1           0x17        /* Reserved...                 */
-#define MII_LBRERROR        0x18        /* Lpback, rx, bypass error    */
-#define MII_PHYADDR         0x19        /* PHY address                 */
-#define MII_RESV2           0x1a        /* Reserved...                 */
-#define MII_TPISTATUS       0x1b        /* TPI status for 10mbps       */
-#define MII_NCONFIG         0x1c        /* Network interface config    */
-
-/* Basic mode control register. */
-#define BMCR_RESV               0x003f  /* Unused...                   */
-#define BMCR_SPEED1000		0x0040  /* MSB of Speed (1000)         */
-#define BMCR_CTST               0x0080  /* Collision test              */
-#define BMCR_FULLDPLX           0x0100  /* Full duplex                 */
-#define BMCR_ANRESTART          0x0200  /* Auto negotiation restart    */
-#define BMCR_ISOLATE            0x0400  /* Disconnect DP83840 from MII */
-#define BMCR_PDOWN              0x0800  /* Powerdown the DP83840       */
-#define BMCR_ANENABLE           0x1000  /* Enable auto negotiation     */
-#define BMCR_SPEED100           0x2000  /* Select 100Mbps              */
-#define BMCR_LOOPBACK           0x4000  /* TXD loopback bits           */
-#define BMCR_RESET              0x8000  /* Reset the DP83840           */
-
-/* Basic mode status register. */
-#define BMSR_ERCAP              0x0001  /* Ext-reg capability          */
-#define BMSR_JCD                0x0002  /* Jabber detected             */
-#define BMSR_LSTATUS            0x0004  /* Link status                 */
-#define BMSR_ANEGCAPABLE        0x0008  /* Able to do auto-negotiation */
-#define BMSR_RFAULT             0x0010  /* Remote fault detected       */
-#define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */
-#define BMSR_RESV               0x00c0  /* Unused...                   */
-#define BMSR_ESTATEN		0x0100	/* Extended Status in R15      */
-#define BMSR_100HALF2           0x0200  /* Can do 100BASE-T2 HDX       */
-#define BMSR_100FULL2           0x0400  /* Can do 100BASE-T2 FDX       */
-#define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */
-#define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */
-#define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */
-#define BMSR_100FULL            0x4000  /* Can do 100mbps, full-duplex */
-#define BMSR_100BASE4           0x8000  /* Can do 100mbps, 4k packets  */
-
-/* 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_1000XFULL     0x0020  /* Try for 1000BASE-X full-duplex */
-#define ADVERTISE_10FULL        0x0040  /* Try for 10mbps full-duplex  */
-#define ADVERTISE_1000XHALF     0x0040  /* Try for 1000BASE-X half-duplex */
-#define ADVERTISE_100HALF       0x0080  /* Try for 100mbps half-duplex */
-#define ADVERTISE_1000XPAUSE    0x0080  /* Try for 1000BASE-X pause    */
-#define ADVERTISE_100FULL       0x0100  /* Try for 100mbps full-duplex */
-#define ADVERTISE_1000XPSE_ASYM 0x0100  /* Try for 1000BASE-X asym pause */
-#define ADVERTISE_100BASE4      0x0200  /* Try for 100mbps 4k packets  */
-#define ADVERTISE_PAUSE_CAP     0x0400  /* Try for pause               */
-#define ADVERTISE_PAUSE_ASYM    0x0800  /* Try for asymetric pause     */
-#define ADVERTISE_RESV          0x1000  /* 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)
-
-/* Link partner ability register. */
-#define LPA_SLCT                0x001f  /* Same as advertise selector  */
-#define LPA_10HALF              0x0020  /* Can do 10mbps half-duplex   */
-#define LPA_1000XFULL           0x0020  /* Can do 1000BASE-X full-duplex */
-#define LPA_10FULL              0x0040  /* Can do 10mbps full-duplex   */
-#define LPA_1000XHALF           0x0040  /* Can do 1000BASE-X half-duplex */
-#define LPA_100HALF             0x0080  /* Can do 100mbps half-duplex  */
-#define LPA_1000XPAUSE          0x0080  /* Can do 1000BASE-X pause     */
-#define LPA_100FULL             0x0100  /* Can do 100mbps full-duplex  */
-#define LPA_1000XPAUSE_ASYM     0x0100  /* Can do 1000BASE-X pause asym*/
-#define LPA_100BASE4            0x0200  /* Can do 100mbps 4k packets   */
-#define LPA_PAUSE_CAP           0x0400  /* Can pause                   */
-#define LPA_PAUSE_ASYM          0x0800  /* Can pause asymetrically     */
-#define LPA_RESV                0x1000  /* Unused...                   */
-#define LPA_RFAULT              0x2000  /* Link partner faulted        */
-#define LPA_LPACK               0x4000  /* Link partner acked us       */
-#define LPA_NPAGE               0x8000  /* Next page bit               */
-
-#define LPA_DUPLEX		(LPA_10FULL | LPA_100FULL)
-#define LPA_100			(LPA_100FULL | LPA_100HALF | LPA_100BASE4)
-
-/* Expansion register for auto-negotiation. */
-#define EXPANSION_NWAY          0x0001  /* Can do N-way auto-nego      */
-#define EXPANSION_LCWP          0x0002  /* Got new RX page code word   */
-#define EXPANSION_ENABLENPAGE   0x0004  /* This enables npage words    */
-#define EXPANSION_NPCAPABLE     0x0008  /* Link partner supports npage */
-#define EXPANSION_MFAULTS       0x0010  /* Multiple faults detected    */
-#define EXPANSION_RESV          0xffe0  /* Unused...                   */
-
-#define ESTATUS_1000_TFULL	0x2000	/* Can do 1000BT Full */
-#define ESTATUS_1000_THALF	0x1000	/* Can do 1000BT Half */
-
-/* N-way test register. */
-#define NWAYTEST_RESV1          0x00ff  /* Unused...                   */
-#define NWAYTEST_LOOPBACK       0x0100  /* Enable loopback for N-way   */
-#define NWAYTEST_RESV2          0xfe00  /* Unused...                   */
-
-/* 1000BASE-T Control register */
-#define ADVERTISE_1000FULL      0x0200  /* Advertise 1000BASE-T full duplex */
-#define ADVERTISE_1000HALF      0x0100  /* Advertise 1000BASE-T half duplex */
-
-/* 1000BASE-T Status register */
-#define LPA_1000LOCALRXOK       0x2000  /* Link partner local receiver status */
-#define LPA_1000REMRXOK         0x1000  /* Link partner remote receiver status */
-#define LPA_1000FULL            0x0800  /* Link partner 1000BASE-T full duplex */
-#define LPA_1000HALF            0x0400  /* Link partner 1000BASE-T half duplex */
-
-struct miiphy_device {
-	struct device_d dev;
-
-	int address;	/* The address the phy has on the bus */
-	int (*read)(struct miiphy_device *mdev, uint8_t phy_addr, uint8_t reg_addr, uint16_t *value);
-	int (*write)(struct miiphy_device *mdev, uint8_t phy_addr, uint8_t reg_addr, uint16_t data);
-
-	int flags;
-
-	struct eth_device *edev;
-	struct cdev cdev;
-};
-
-int miiphy_register(struct miiphy_device *mdev);
-void miiphy_unregister(struct miiphy_device *mdev);
-int miiphy_restart_aneg(struct miiphy_device *mdev);
-int miiphy_wait_aneg(struct miiphy_device *mdev);
-int miiphy_print_status(struct miiphy_device *mdev);
-
-#endif
diff --git a/include/usb/usbnet.h b/include/usb/usbnet.h
index e3ea373..1609b2e 100644
--- a/include/usb/usbnet.h
+++ b/include/usb/usbnet.h
@@ -23,7 +23,7 @@
 #define	__LINUX_USB_USBNET_H
 
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 
 /* interface from usbnet core to each USB networking link we handle */
 struct usbnet {
@@ -40,7 +40,7 @@ struct usbnet {
 
 	/* protocol/interface state */
 	struct eth_device	edev;
-	struct miiphy_device	miiphy;
+	struct mii_device	miidev;
 
 	int			msg_enable;
 	unsigned long		data [5];
diff --git a/net/eth.c b/net/eth.c
index 4d58191..cfb0fef 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -26,7 +26,7 @@
 #include <driver.h>
 #include <init.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <errno.h>
 #include <malloc.h>
 
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug  8 00:17:53 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun,  8 Aug 2010 06:17:53 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
Message-ID: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>

this will add also the support of the new ncurse interface nconfig

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 Makefile                                   |    2 +-
 common/Kconfig                             |   13 +
 scripts/kconfig/.gitignore                 |    4 +
 scripts/kconfig/Makefile                   |  175 ++-
 scripts/kconfig/POTFILES.in                |    7 +
 scripts/kconfig/check.sh                   |   14 +
 scripts/kconfig/conf.c                     |  424 ++++----
 scripts/kconfig/confdata.c                 |  506 ++++++---
 scripts/kconfig/expr.c                     |   63 +-
 scripts/kconfig/expr.h                     |  106 ++-
 scripts/kconfig/gconf.c                    |  145 +--
 scripts/kconfig/gconf.glade                |   30 +-
 scripts/kconfig/kxgettext.c                |    8 +-
 scripts/kconfig/lex.zconf.c_shipped        |  127 ++-
 scripts/kconfig/lkc.h                      |   30 +-
 scripts/kconfig/lkc_proto.h                |    9 +-
 scripts/kconfig/lxdialog/BIG.FAT.WARNING   |    2 +-
 scripts/kconfig/lxdialog/check-lxdialog.sh |   20 +-
 scripts/kconfig/lxdialog/checklist.c       |   17 +-
 scripts/kconfig/lxdialog/dialog.h          |   11 +-
 scripts/kconfig/lxdialog/inputbox.c        |   10 +-
 scripts/kconfig/lxdialog/menubox.c         |   28 +-
 scripts/kconfig/lxdialog/textbox.c         |    2 +-
 scripts/kconfig/lxdialog/util.c            |   34 +-
 scripts/kconfig/lxdialog/yesno.c           |    4 +-
 scripts/kconfig/mconf.c                    |  262 ++---
 scripts/kconfig/menu.c                     |  211 +++-
 scripts/kconfig/nconf.c                    | 1568 ++++++++++++++++++++++++++
 scripts/kconfig/nconf.gui.c                |  617 ++++++++++
 scripts/kconfig/nconf.h                    |   95 ++
 scripts/kconfig/qconf.cc                   |  255 +++--
 scripts/kconfig/qconf.h                    |   17 +-
 scripts/kconfig/streamline_config.pl       |  422 +++++++
 scripts/kconfig/symbol.c                   |  501 +++++++--
 scripts/kconfig/util.c                     |   44 +-
 scripts/kconfig/zconf.gperf                |    6 +-
 scripts/kconfig/zconf.hash.c_shipped       |  225 ++--
 scripts/kconfig/zconf.l                    |   21 +-
 scripts/kconfig/zconf.tab.c_shipped        | 1665 +++++++++++++++-------------
 scripts/kconfig/zconf.y                    |   62 +-
 40 files changed, 5758 insertions(+), 2004 deletions(-)
 create mode 100755 scripts/kconfig/check.sh
 create mode 100644 scripts/kconfig/nconf.c
 create mode 100644 scripts/kconfig/nconf.gui.c
 create mode 100644 scripts/kconfig/nconf.h
 create mode 100644 scripts/kconfig/streamline_config.pl

diff --git a/Makefile b/Makefile
index 8a09f32..8dc9981 100644
--- a/Makefile
+++ b/Makefile
@@ -305,7 +305,7 @@ KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
 KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 
 export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
-export ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
+export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
 export CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE
 export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
 
diff --git a/common/Kconfig b/common/Kconfig
index c07c638..6556c62 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -1,3 +1,16 @@
+config ARCH
+	string
+	option env="ARCH"
+
+config KERNELVERSION
+	string
+	option env="KERNELVERSION"
+
+config DEFCONFIG_LIST
+	string
+	option defconfig_list
+	default "$ARCH_DEFCONFIG"
+	default "arch/$ARCH/defconfig"
 
 config GREGORIAN_CALENDER
 	bool
diff --git a/scripts/kconfig/.gitignore b/scripts/kconfig/.gitignore
index b49584c..624f650 100644
--- a/scripts/kconfig/.gitignore
+++ b/scripts/kconfig/.gitignore
@@ -8,12 +8,16 @@ lex.*.c
 zconf.hash.c
 *.moc
 lkc_defs.h
+gconf.glade.h
+*.pot
+*.mo
 
 #
 # configuration programs
 #
 conf
 mconf
+nconf
 qconf
 gconf
 kxgettext
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
index 8986a48..de934de 100644
--- a/scripts/kconfig/Makefile
+++ b/scripts/kconfig/Makefile
@@ -2,106 +2,161 @@
 # Kernel configuration targets
 # These targets are used from top-level makefile
 
-PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config
+PHONY += oldconfig xconfig gconfig menuconfig config silentoldconfig update-po-config \
+	localmodconfig localyesconfig
+
+ifdef KBUILD_KCONFIG
+Kconfig := $(KBUILD_KCONFIG)
+else
+Kconfig := arch/$(SRCARCH)/Kconfig
+endif
 
 xconfig: $(obj)/qconf
-	$< arch/$(ARCH)/Kconfig
+	$< $(Kconfig)
 
 gconfig: $(obj)/gconf
-	$< arch/$(ARCH)/Kconfig
+	$< $(Kconfig)
 
 menuconfig: $(obj)/mconf
-	$< arch/$(ARCH)/Kconfig
+	$< $(Kconfig)
 
 config: $(obj)/conf
-	$< arch/$(ARCH)/Kconfig
+	$< --oldaskconfig $(Kconfig)
+
+nconfig: $(obj)/nconf
+	$< $(Kconfig)
 
 oldconfig: $(obj)/conf
-	$< -o arch/$(ARCH)/Kconfig
+	$< --$@ $(Kconfig)
 
 silentoldconfig: $(obj)/conf
-	$< -s arch/$(ARCH)/Kconfig
+	$(Q)mkdir -p include/generated
+	$< --$@ $(Kconfig)
+
+# if no path is given, then use src directory to find file
+ifdef LSMOD
+LSMOD_F := $(LSMOD)
+ifeq ($(findstring /,$(LSMOD)),)
+  LSMOD_F := $(objtree)/$(LSMOD)
+endif
+endif
 
-# Create new linux.po file
+localmodconfig: $(obj)/streamline_config.pl $(obj)/conf
+	$(Q)mkdir -p include/generated
+	$(Q)perl $< $(srctree) $(Kconfig) $(LSMOD_F) > .tmp.config
+	$(Q)if [ -f .config ]; then 					\
+			cmp -s .tmp.config .config ||			\
+			(mv -f .config .config.old.1;			\
+			 mv -f .tmp.config .config;			\
+			 $(obj)/conf --silentoldconfig $(Kconfig);	\
+			 mv -f .config.old.1 .config.old)		\
+	else								\
+			mv -f .tmp.config .config;			\
+			$(obj)/conf --silentoldconfig $(Kconfig);	\
+	fi
+	$(Q)rm -f .tmp.config
+
+localyesconfig: $(obj)/streamline_config.pl $(obj)/conf
+	$(Q)mkdir -p include/generated
+	$(Q)perl $< $(srctree) $(Kconfig) $(LSMOD_F) > .tmp.config
+	$(Q)sed -i s/=m/=y/ .tmp.config
+	$(Q)if [ -f .config ]; then					\
+			cmp -s .tmp.config .config ||			\
+			(mv -f .config .config.old.1;			\
+			 mv -f .tmp.config .config;			\
+			 $(obj)/conf --silentoldconfig $(Kconfig);	\
+			 mv -f .config.old.1 .config.old)		\
+	else								\
+			mv -f .tmp.config .config;			\
+			$(obj)/conf --silentoldconfig $(Kconfig);	\
+	fi
+	$(Q)rm -f .tmp.config
+
+# Create new linux.pot file
 # Adjust charset to UTF-8 in .po file to accept UTF-8 in Kconfig files
 # The symlink is used to repair a deficiency in arch/um
-update-po-config: $(obj)/kxgettext
-	xgettext --default-domain=linux                  \
+update-po-config: $(obj)/kxgettext $(obj)/gconf.glade.h
+	$(Q)echo "  GEN config"
+	$(Q)xgettext --default-domain=linux              \
 	    --add-comments --keyword=_ --keyword=N_      \
 	    --from-code=UTF-8                            \
 	    --files-from=scripts/kconfig/POTFILES.in     \
 	    --output $(obj)/config.pot
 	$(Q)sed -i s/CHARSET/UTF-8/ $(obj)/config.pot
 	$(Q)ln -fs Kconfig.i386 arch/um/Kconfig.arch
-	(for i in `ls arch/`;                            \
-	do                                               \
-	    $(obj)/kxgettext arch/$$i/Kconfig;           \
-	done ) >> $(obj)/config.pot
-	msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
+	$(Q)(for i in `ls arch/*/Kconfig`;               \
+	    do                                           \
+		echo "  GEN $$i";                        \
+		$(obj)/kxgettext $$i                     \
+		     >> $(obj)/config.pot;               \
+	    done )
+	$(Q)msguniq --sort-by-file --to-code=UTF-8 $(obj)/config.pot \
 	    --output $(obj)/linux.pot
 	$(Q)rm -f arch/um/Kconfig.arch
 	$(Q)rm -f $(obj)/config.pot
 
-PHONY += randconfig allyesconfig allnoconfig allmodconfig defconfig
+PHONY += allnoconfig allyesconfig allmodconfig alldefconfig randconfig
 
-randconfig: $(obj)/conf
-	$< -r arch/$(ARCH)/Kconfig
+allnoconfig allyesconfig allmodconfig alldefconfig randconfig: $(obj)/conf
+	$< --$@ $(Kconfig)
 
-allyesconfig: $(obj)/conf
-	$< -y arch/$(ARCH)/Kconfig
+PHONY += listnewconfig oldnoconfig savedefconfig defconfig
 
-allnoconfig: $(obj)/conf
-	$< -n arch/$(ARCH)/Kconfig
+listnewconfig oldnoconfig: $(obj)/conf
+	$< --$@ $(Kconfig)
 
-allmodconfig: $(obj)/conf
-	$< -m arch/$(ARCH)/Kconfig
+savedefconfig: $(obj)/conf
+	$< --$@=defconfig $(Kconfig)
 
 defconfig: $(obj)/conf
 ifeq ($(KBUILD_DEFCONFIG),)
-	$< -d arch/$(ARCH)/Kconfig
+	$< --defconfig $(Kconfig)
 else
-	@echo *** Default configuration is based on '$(KBUILD_DEFCONFIG)'
-	$(Q)$< -D arch/$(ARCH)/configs/$(KBUILD_DEFCONFIG) arch/$(ARCH)/Kconfig
+	@echo "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
+	$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
 endif
 
 %_defconfig: $(obj)/conf
-	$(Q)$< -D arch/$(ARCH)/configs/$@ arch/$(ARCH)/Kconfig
+	$(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
 
 # Help text used by make help
 help:
 	@echo  '  config	  - Update current config utilising a line-oriented program'
+	@echo  '  nconfig         - Update current config utilising a ncurses menu based program'
 	@echo  '  menuconfig	  - Update current config utilising a menu based program'
 	@echo  '  xconfig	  - Update current config utilising a QT based front-end'
 	@echo  '  gconfig	  - Update current config utilising a GTK based front-end'
 	@echo  '  oldconfig	  - Update current config utilising a provided .config as base'
-	@echo  '  silentoldconfig - Same as oldconfig, but quietly'
-	@echo  '  randconfig	  - New config with random answer to all options'
-	@echo  '  defconfig	  - New config with default answer to all options'
-	@echo  '  allmodconfig	  - New config selecting modules when possible'
-	@echo  '  allyesconfig	  - New config where all options are accepted with yes'
+	@echo  '  localmodconfig  - Update current config disabling modules not loaded'
+	@echo  '  localyesconfig  - Update current config converting local mods to core'
+	@echo  '  silentoldconfig - Same as oldconfig, but quietly, additionally update deps'
+	@echo  '  defconfig	  - New config with default from ARCH supplied defconfig'
+	@echo  '  savedefconfig   - Save current config as ./defconfig (minimal config)'
 	@echo  '  allnoconfig	  - New config where all options are answered with no'
+	@echo  '  allyesconfig	  - New config where all options are accepted with yes'
+	@echo  '  allmodconfig	  - New config selecting modules when possible'
+	@echo  '  alldefconfig    - New config with all symbols set to default'
+	@echo  '  randconfig	  - New config with random answer to all options'
+	@echo  '  listnewconfig   - List new options'
+	@echo  '  oldnoconfig     - Same as silentoldconfig but set new symbols to n (unset)'
 
 # lxdialog stuff
 check-lxdialog  := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
 
-# Use reursively expanded variables so we do not call gcc unless
+# Use recursively expanded variables so we do not call gcc unless
 # we really need to do so. (Do not call gcc as part of make mrproper)
 HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
 HOST_LOADLIBES   = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
 
 HOST_EXTRACFLAGS += -DLOCALE
 
-PHONY += $(obj)/dochecklxdialog
-$(obj)/dochecklxdialog:
-	$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_LOADLIBES)
-
-always := dochecklxdialog
-
 
 # ===========================================================================
 # Shared Makefile for the various kconfig executables:
 # conf:	  Used for defconfig, oldconfig and related targets
-# mconf:  Used for the mconfig target.
+# nconf:  Used for the nconfig target.
+#         Utilizes ncurses
+# mconf:  Used for the menuconfig target
 #         Utilizes the lxdialog package
 # qconf:  Used for the xconfig target
 #         Based on QT which needs to be installed to compile it
@@ -113,11 +168,16 @@ lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
 lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o
 
 conf-objs	:= conf.o  zconf.tab.o
-mconf-objs	:= mconf.o zconf.tab.o $(lxdialog)
+mconf-objs     := mconf.o zconf.tab.o $(lxdialog)
+nconf-objs     := nconf.o zconf.tab.o nconf.gui.o
 kxgettext-objs	:= kxgettext.o zconf.tab.o
 
 hostprogs-y := conf qconf gconf kxgettext
 
+ifeq ($(MAKECMDGOALS),nconfig)
+	hostprogs-y += nconf
+endif
+
 ifeq ($(MAKECMDGOALS),menuconfig)
 	hostprogs-y += mconf
 endif
@@ -140,17 +200,20 @@ gconf-objs	:= gconf.o kconfig_load.o zconf.tab.o
 endif
 
 clean-files	:= lkc_defs.h qconf.moc .tmp_qtcheck \
-		   .tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c
-clean-files     += mconf qconf gconf
-
-# Needed for systems without gettext
-KBUILD_HAVE_NLS := $(shell \
-     if echo "\#include <libintl.h>" | $(HOSTCC) $(HOSTCFLAGS) -E - > /dev/null 2>&1 ; \
-     then echo yes ; \
-     else echo no ; fi)
-ifeq ($(KBUILD_HAVE_NLS),no)
-HOSTCFLAGS	+= -DKBUILD_NO_NLS
-endif
+		   .tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c gconf.glade.h
+clean-files     += mconf qconf gconf nconf
+clean-files     += config.pot linux.pot
+
+# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)
+PHONY += $(obj)/dochecklxdialog
+$(addprefix $(obj)/,$(lxdialog)): $(obj)/dochecklxdialog
+$(obj)/dochecklxdialog:
+	$(Q)$(CONFIG_SHELL) $(check-lxdialog) -check $(HOSTCC) $(HOST_EXTRACFLAGS) $(HOST_LOADLIBES)
+
+always := dochecklxdialog
+
+# Add environment specific flags
+HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) $(HOSTCFLAGS))
 
 # generated files seem to need this to find local include files
 HOSTCFLAGS_lex.zconf.o	:= -I$(src)
@@ -159,10 +222,11 @@ HOSTCFLAGS_zconf.tab.o	:= -I$(src)
 HOSTLOADLIBES_qconf	= $(KC_QT_LIBS) -ldl
 HOSTCXXFLAGS_qconf.o	= $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK
 
-HOSTLOADLIBES_gconf	= `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0`
+HOSTLOADLIBES_gconf	= `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` -ldl
 HOSTCFLAGS_gconf.o	= `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
                           -D LKC_DIRECT_LINK
 
+HOSTLOADLIBES_nconf	= -lmenu -lpanel -lncurses
 $(obj)/qconf.o: $(obj)/.tmp_qtcheck
 
 ifeq ($(qconf-target),1)
@@ -252,6 +316,9 @@ $(obj)/%.moc: $(src)/%.h
 $(obj)/lkc_defs.h: $(src)/lkc_proto.h
 	sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
 
+# Extract gconf menu items for I18N support
+$(obj)/gconf.glade.h: $(obj)/gconf.glade
+	intltool-extract --type=gettext/glade $(obj)/gconf.glade
 
 ###
 # The following requires flex/bison/gperf
diff --git a/scripts/kconfig/POTFILES.in b/scripts/kconfig/POTFILES.in
index cc94e46..9674573 100644
--- a/scripts/kconfig/POTFILES.in
+++ b/scripts/kconfig/POTFILES.in
@@ -1,5 +1,12 @@
+scripts/kconfig/lxdialog/checklist.c
+scripts/kconfig/lxdialog/inputbox.c
+scripts/kconfig/lxdialog/menubox.c
+scripts/kconfig/lxdialog/textbox.c
+scripts/kconfig/lxdialog/util.c
+scripts/kconfig/lxdialog/yesno.c
 scripts/kconfig/mconf.c
 scripts/kconfig/conf.c
 scripts/kconfig/confdata.c
 scripts/kconfig/gconf.c
+scripts/kconfig/gconf.glade.h
 scripts/kconfig/qconf.cc
diff --git a/scripts/kconfig/check.sh b/scripts/kconfig/check.sh
new file mode 100755
index 0000000..fa59cbf
--- /dev/null
+++ b/scripts/kconfig/check.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+# Needed for systems without gettext
+$* -xc -o /dev/null - > /dev/null 2>&1 << EOF
+#include <libintl.h>
+int main()
+{
+	gettext("");
+	return 0;
+}
+EOF
+if [ ! "$?" -eq "0"  ]; then
+	echo -DKBUILD_NO_NLS;
+fi
+
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
index 3ce2996..1269d97 100644
--- a/scripts/kconfig/conf.c
+++ b/scripts/kconfig/conf.c
@@ -3,13 +3,16 @@
  * Released under the terms of the GNU GPL v2.0.
  */
 
+#include <locale.h>
 #include <ctype.h>
-#include <stdlib.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
-#include <unistd.h>
 #include <time.h>
+#include <unistd.h>
+#include <getopt.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 
 #define LKC_DIRECT_LINK
 #include "lkc.h"
@@ -17,32 +20,38 @@
 static void conf(struct menu *menu);
 static void check_conf(struct menu *menu);
 
-enum {
-	ask_all,
-	ask_new,
-	ask_silent,
-	set_default,
-	set_yes,
-	set_mod,
-	set_no,
-	set_random
-} input_mode = ask_all;
+enum input_mode {
+	oldaskconfig,
+	silentoldconfig,
+	oldconfig,
+	allnoconfig,
+	allyesconfig,
+	allmodconfig,
+	alldefconfig,
+	randconfig,
+	defconfig,
+	savedefconfig,
+	listnewconfig,
+	oldnoconfig,
+} input_mode = oldaskconfig;
+
 char *defconfig_file;
 
 static int indent = 1;
 static int valid_stdin = 1;
+static int sync_kconfig;
 static int conf_cnt;
 static char line[128];
 static struct menu *rootEntry;
 
-static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
-
-static const char *get_help(struct menu *menu)
+static void print_help(struct menu *menu)
 {
-	if (menu_has_help(menu))
-		return menu_get_help(menu);
-	else
-		return nohelp_text;
+	struct gstr help = str_new();
+
+	menu_get_ext_help(menu, &help);
+
+	printf("\n%s\n", str_get(&help));
+	str_free(&help);
 }
 
 static void strip(char *str)
@@ -64,7 +73,7 @@ static void strip(char *str)
 
 static void check_stdin(void)
 {
-	if (!valid_stdin && input_mode == ask_silent) {
+	if (!valid_stdin) {
 		printf(_("aborted!\n\n"));
 		printf(_("Console input/output is redirected. "));
 		printf(_("Run 'make oldconfig' to update configuration.\n\n"));
@@ -75,10 +84,9 @@ static void check_stdin(void)
 static int conf_askvalue(struct symbol *sym, const char *def)
 {
 	enum symbol_type type = sym_get_type(sym);
-	tristate val;
 
 	if (!sym_has_value(sym))
-		printf("(NEW) ");
+		printf(_("(NEW) "));
 
 	line[0] = '\n';
 	line[1] = 0;
@@ -91,29 +99,17 @@ static int conf_askvalue(struct symbol *sym, const char *def)
 	}
 
 	switch (input_mode) {
-	case set_no:
-	case set_mod:
-	case set_yes:
-	case set_random:
-		if (sym_has_value(sym)) {
-			printf("%s\n", def);
-			return 0;
-		}
-		break;
-	case ask_new:
-	case ask_silent:
+	case oldconfig:
+	case silentoldconfig:
 		if (sym_has_value(sym)) {
 			printf("%s\n", def);
 			return 0;
 		}
 		check_stdin();
-	case ask_all:
+	case oldaskconfig:
 		fflush(stdout);
 		fgets(line, 128, stdin);
 		return 1;
-	case set_default:
-		printf("%s\n", def);
-		return 1;
 	default:
 		break;
 	}
@@ -127,63 +123,17 @@ static int conf_askvalue(struct symbol *sym, const char *def)
 	default:
 		;
 	}
-	switch (input_mode) {
-	case set_yes:
-		if (sym_tristate_within_range(sym, yes)) {
-			line[0] = 'y';
-			line[1] = '\n';
-			line[2] = 0;
-			break;
-		}
-	case set_mod:
-		if (type == S_TRISTATE) {
-			if (sym_tristate_within_range(sym, mod)) {
-				line[0] = 'm';
-				line[1] = '\n';
-				line[2] = 0;
-				break;
-			}
-		} else {
-			if (sym_tristate_within_range(sym, yes)) {
-				line[0] = 'y';
-				line[1] = '\n';
-				line[2] = 0;
-				break;
-			}
-		}
-	case set_no:
-		if (sym_tristate_within_range(sym, no)) {
-			line[0] = 'n';
-			line[1] = '\n';
-			line[2] = 0;
-			break;
-		}
-	case set_random:
-		do {
-			val = (tristate)(random() % 3);
-		} while (!sym_tristate_within_range(sym, val));
-		switch (val) {
-		case no: line[0] = 'n'; break;
-		case mod: line[0] = 'm'; break;
-		case yes: line[0] = 'y'; break;
-		}
-		line[1] = '\n';
-		line[2] = 0;
-		break;
-	default:
-		break;
-	}
 	printf("%s", line);
 	return 1;
 }
 
-int conf_string(struct menu *menu)
+static int conf_string(struct menu *menu)
 {
 	struct symbol *sym = menu->sym;
 	const char *def;
 
 	while (1) {
-		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
 		printf("(%s) ", sym->name);
 		def = sym_get_string_value(sym);
 		if (sym_get_string_value(sym))
@@ -196,7 +146,7 @@ int conf_string(struct menu *menu)
 		case '?':
 			/* print help */
 			if (line[1] == '\n') {
-				printf("\n%s\n", get_help(menu));
+				print_help(menu);
 				def = NULL;
 				break;
 			}
@@ -212,14 +162,12 @@ int conf_string(struct menu *menu)
 static int conf_sym(struct menu *menu)
 {
 	struct symbol *sym = menu->sym;
-	int type;
 	tristate oldval, newval;
 
 	while (1) {
-		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
 		if (sym->name)
 			printf("(%s) ", sym->name);
-		type = sym_get_type(sym);
 		putchar('[');
 		oldval = sym_get_tristate_value(sym);
 		switch (oldval) {
@@ -276,7 +224,7 @@ static int conf_sym(struct menu *menu)
 		if (sym_set_tristate_value(sym, newval))
 			return 0;
 help:
-		printf("\n%s\n", get_help(menu));
+		print_help(menu);
 	}
 }
 
@@ -284,11 +232,9 @@ static int conf_choice(struct menu *menu)
 {
 	struct symbol *sym, *def_sym;
 	struct menu *child;
-	int type;
 	bool is_new;
 
 	sym = menu->sym;
-	type = sym_get_type(sym);
 	is_new = !sym_has_value(sym);
 	if (sym_is_changable(sym)) {
 		conf_sym(menu);
@@ -306,7 +252,7 @@ static int conf_choice(struct menu *menu)
 		case no:
 			return 1;
 		case mod:
-			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+			printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
 			return 0;
 		case yes:
 			break;
@@ -316,7 +262,7 @@ static int conf_choice(struct menu *menu)
 	while (1) {
 		int cnt, def;
 
-		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+		printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
 		def_sym = sym_get_choice_value(sym);
 		cnt = def = 0;
 		line[0] = 0;
@@ -324,7 +270,7 @@ static int conf_choice(struct menu *menu)
 			if (!menu_is_visible(child))
 				continue;
 			if (!child->sym) {
-				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
+				printf("%*c %s\n", indent, '*', _(menu_get_prompt(child)));
 				continue;
 			}
 			cnt++;
@@ -333,14 +279,14 @@ static int conf_choice(struct menu *menu)
 				printf("%*c", indent, '>');
 			} else
 				printf("%*c", indent, ' ');
-			printf(" %d. %s", cnt, menu_get_prompt(child));
+			printf(" %d. %s", cnt, _(menu_get_prompt(child)));
 			if (child->sym->name)
 				printf(" (%s)", child->sym->name);
 			if (!sym_has_value(child->sym))
-				printf(" (NEW)");
+				printf(_(" (NEW)"));
 			printf("\n");
 		}
-		printf("%*schoice", indent - 1, "");
+		printf(_("%*schoice"), indent - 1, "");
 		if (cnt == 1) {
 			printf("[1]: 1\n");
 			goto conf_childs;
@@ -350,20 +296,20 @@ static int conf_choice(struct menu *menu)
 			printf("?");
 		printf("]: ");
 		switch (input_mode) {
-		case ask_new:
-		case ask_silent:
+		case oldconfig:
+		case silentoldconfig:
 			if (!is_new) {
 				cnt = def;
 				printf("%d\n", cnt);
 				break;
 			}
 			check_stdin();
-		case ask_all:
+		case oldaskconfig:
 			fflush(stdout);
 			fgets(line, 128, stdin);
 			strip(line);
 			if (line[0] == '?') {
-				printf("\n%s\n", get_help(menu));
+				print_help(menu);
 				continue;
 			}
 			if (!line[0])
@@ -373,14 +319,7 @@ static int conf_choice(struct menu *menu)
 			else
 				continue;
 			break;
-		case set_random:
-			def = (random() % cnt) + 1;
-		case set_default:
-		case set_yes:
-		case set_mod:
-		case set_no:
-			cnt = def;
-			printf("%d\n", cnt);
+		default:
 			break;
 		}
 
@@ -394,13 +333,13 @@ static int conf_choice(struct menu *menu)
 		if (!child)
 			continue;
 		if (line[strlen(line) - 1] == '?') {
-			printf("\n%s\n", get_help(child));
+			print_help(child);
 			continue;
 		}
 		sym_set_choice_value(sym, child->sym);
-		if (child->list) {
+		for (child = child->list; child; child = child->next) {
 			indent += 2;
-			conf(child->list);
+			conf(child);
 			indent -= 2;
 		}
 		return 1;
@@ -423,7 +362,10 @@ static void conf(struct menu *menu)
 
 		switch (prop->type) {
 		case P_MENU:
-			if (input_mode == ask_silent && rootEntry != menu) {
+			if ((input_mode == silentoldconfig ||
+			     input_mode == listnewconfig ||
+			     input_mode == oldnoconfig) &&
+			    rootEntry != menu) {
 				check_conf(menu);
 				return;
 			}
@@ -432,7 +374,7 @@ static void conf(struct menu *menu)
 			if (prompt)
 				printf("%*c\n%*c %s\n%*c\n",
 					indent, '*',
-					indent, '*', prompt,
+					indent, '*', _(prompt),
 					indent, '*');
 		default:
 			;
@@ -481,10 +423,16 @@ static void check_conf(struct menu *menu)
 	if (sym && !sym_has_value(sym)) {
 		if (sym_is_changable(sym) ||
 		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
-			if (!conf_cnt++)
-				printf(_("*\n* Restart config...\n*\n"));
-			rootEntry = menu_get_parent_menu(menu);
-			conf(rootEntry);
+			if (input_mode == listnewconfig) {
+				if (sym->name && !sym_is_choice_value(sym)) {
+					printf("CONFIG_%s\n", sym->name);
+				}
+			} else {
+				if (!conf_cnt++)
+					printf(_("*\n* Restart config...\n*\n"));
+				rootEntry = menu_get_parent_menu(menu);
+				conf(rootEntry);
+			}
 		}
 	}
 
@@ -492,99 +440,121 @@ static void check_conf(struct menu *menu)
 		check_conf(child);
 }
 
+static struct option long_opts[] = {
+	{"oldaskconfig",    no_argument,       NULL, oldaskconfig},
+	{"oldconfig",       no_argument,       NULL, oldconfig},
+	{"silentoldconfig", no_argument,       NULL, silentoldconfig},
+	{"defconfig",       optional_argument, NULL, defconfig},
+	{"savedefconfig",   required_argument, NULL, savedefconfig},
+	{"allnoconfig",     no_argument,       NULL, allnoconfig},
+	{"allyesconfig",    no_argument,       NULL, allyesconfig},
+	{"allmodconfig",    no_argument,       NULL, allmodconfig},
+	{"alldefconfig",    no_argument,       NULL, alldefconfig},
+	{"randconfig",      no_argument,       NULL, randconfig},
+	{"listnewconfig",   no_argument,       NULL, listnewconfig},
+	{"oldnoconfig",     no_argument,       NULL, oldnoconfig},
+	{NULL, 0, NULL, 0}
+};
+
 int main(int ac, char **av)
 {
-	int i = 1;
+	int opt;
 	const char *name;
 	struct stat tmpstat;
 
-	if (ac > i && av[i][0] == '-') {
-		switch (av[i++][1]) {
-		case 'o':
-			input_mode = ask_new;
-			break;
-		case 's':
-			input_mode = ask_silent;
-			valid_stdin = isatty(0) && isatty(1) && isatty(2);
-			break;
-		case 'd':
-			input_mode = set_default;
-			break;
-		case 'D':
-			input_mode = set_default;
-			defconfig_file = av[i++];
-			if (!defconfig_file) {
-				printf(_("%s: No default config file specified\n"),
-					av[0]);
-				exit(1);
-			}
-			break;
-		case 'n':
-			input_mode = set_no;
-			break;
-		case 'm':
-			input_mode = set_mod;
+	setlocale(LC_ALL, "");
+	bindtextdomain(PACKAGE, LOCALEDIR);
+	textdomain(PACKAGE);
+
+	while ((opt = getopt_long_only(ac, av, "", long_opts, NULL)) != -1) {
+		input_mode = (enum input_mode)opt;
+		switch (opt) {
+		case silentoldconfig:
+			sync_kconfig = 1;
 			break;
-		case 'y':
-			input_mode = set_yes;
+		case defconfig:
+		case savedefconfig:
+			defconfig_file = optarg;
 			break;
-		case 'r':
-			input_mode = set_random;
-			srandom(time(NULL));
+		case randconfig:
+		{
+			struct timeval now;
+			unsigned int seed;
+
+			/*
+			 * Use microseconds derived seed,
+			 * compensate for systems where it may be zero
+			 */
+			gettimeofday(&now, NULL);
+
+			seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
+			srand(seed);
 			break;
-		case 'h':
+		}
 		case '?':
-			fprintf(stderr, "See README for usage info\n");
-			exit(0);
+			fprintf(stderr, _("See README for usage info\n"));
+			exit(1);
+			break;
 		}
 	}
-  	name = av[i];
-	if (!name) {
+	if (ac == optind) {
 		printf(_("%s: Kconfig file missing\n"), av[0]);
 		exit(1);
 	}
+	name = av[optind];
 	conf_parse(name);
 	//zconfdump(stdout);
+	if (sync_kconfig) {
+		name = conf_get_configname();
+		if (stat(name, &tmpstat)) {
+			fprintf(stderr, _("***\n"
+				"*** You have not yet configured your barebox!\n"
+				"*** (missing barebox config file \"%s\")\n"
+				"***\n"
+				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+				"*** \"make menuconfig\" or \"make xconfig\").\n"
+				"***\n"), name);
+			exit(1);
+		}
+	}
+
 	switch (input_mode) {
-	case set_default:
+	case defconfig:
 		if (!defconfig_file)
 			defconfig_file = conf_get_default_confname();
 		if (conf_read(defconfig_file)) {
-			printf("***\n"
+			printf(_("***\n"
 				"*** Can't find default configuration \"%s\"!\n"
-				"***\n", defconfig_file);
+				"***\n"), defconfig_file);
 			exit(1);
 		}
 		break;
-	case ask_silent:
-		if (stat(".config", &tmpstat)) {
-			printf(_("***\n"
-				"*** You have not yet configured barebox!\n"
-				"*** (missing .config file)\n"
-				"***\n"
-				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
-				"*** \"make menuconfig\" or \"make xconfig\").\n"
-				"***\n"));
-			exit(1);
-		}
-	case ask_all:
-	case ask_new:
+	case savedefconfig:
 		conf_read(NULL);
 		break;
-	case set_no:
-	case set_mod:
-	case set_yes:
-	case set_random:
+	case silentoldconfig:
+	case oldaskconfig:
+	case oldconfig:
+	case listnewconfig:
+	case oldnoconfig:
+		conf_read(NULL);
+		break;
+	case allnoconfig:
+	case allyesconfig:
+	case allmodconfig:
+	case alldefconfig:
+	case randconfig:
 		name = getenv("KCONFIG_ALLCONFIG");
 		if (name && !stat(name, &tmpstat)) {
 			conf_read_simple(name, S_DEF_USER);
 			break;
 		}
 		switch (input_mode) {
-		case set_no:	 name = "allno.config"; break;
-		case set_mod:	 name = "allmod.config"; break;
-		case set_yes:	 name = "allyes.config"; break;
-		case set_random: name = "allrandom.config"; break;
+		case allnoconfig:	name = "allno.config"; break;
+		case allyesconfig:	name = "allyes.config"; break;
+		case allmodconfig:	name = "allmod.config"; break;
+		case alldefconfig:	name = "alldef.config"; break;
+		case randconfig:	name = "allrandom.config"; break;
 		default: break;
 		}
 		if (!stat(name, &tmpstat))
@@ -596,35 +566,81 @@ int main(int ac, char **av)
 		break;
 	}
 
-	if (input_mode != ask_silent) {
+	if (sync_kconfig) {
+		if (conf_get_changed()) {
+			name = getenv("KCONFIG_NOSILENTUPDATE");
+			if (name && *name) {
+				fprintf(stderr,
+					_("\n*** Barebox configuration requires explicit update.\n\n"));
+				return 1;
+			}
+		}
+		valid_stdin = isatty(0) && isatty(1) && isatty(2);
+	}
+
+	switch (input_mode) {
+	case allnoconfig:
+		conf_set_all_new_symbols(def_no);
+		break;
+	case allyesconfig:
+		conf_set_all_new_symbols(def_yes);
+		break;
+	case allmodconfig:
+		conf_set_all_new_symbols(def_mod);
+		break;
+	case alldefconfig:
+		conf_set_all_new_symbols(def_default);
+		break;
+	case randconfig:
+		conf_set_all_new_symbols(def_random);
+		break;
+	case defconfig:
+		conf_set_all_new_symbols(def_default);
+		break;
+	case savedefconfig:
+		break;
+	case oldaskconfig:
 		rootEntry = &rootmenu;
 		conf(&rootmenu);
-		if (input_mode == ask_all) {
-			input_mode = ask_silent;
-			valid_stdin = 1;
+		input_mode = silentoldconfig;
+		/* fall through */
+	case oldconfig:
+	case listnewconfig:
+	case oldnoconfig:
+	case silentoldconfig:
+		/* Update until a loop caused no more changes */
+		do {
+			conf_cnt = 0;
+			check_conf(&rootmenu);
+		} while (conf_cnt &&
+			 (input_mode != listnewconfig &&
+			  input_mode != oldnoconfig));
+		break;
+	}
+
+	if (sync_kconfig) {
+		/* silentoldconfig is used during the build so we shall update autoconf.
+		 * All other commands are only used to generate a config.
+		 */
+		if (conf_get_changed() && conf_write(NULL)) {
+			fprintf(stderr, _("\n*** Error during writing of the barebox configuration.\n\n"));
+			exit(1);
 		}
-	} else if (conf_get_changed()) {
-		name = getenv("KCONFIG_NOSILENTUPDATE");
-		if (name && *name) {
-			fprintf(stderr, _("\n*** Kernel configuration requires explicit update.\n\n"));
+		if (conf_write_autoconf()) {
+			fprintf(stderr, _("\n*** Error during update of the barebox configuration.\n\n"));
 			return 1;
 		}
-	} else
-		goto skip_check;
-
-	do {
-		conf_cnt = 0;
-		check_conf(&rootmenu);
-	} while (conf_cnt);
-	if (conf_write(NULL)) {
-		fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
-		return 1;
-	}
-skip_check:
-	if (input_mode == ask_silent && conf_write_autoconf()) {
-		fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
-		return 1;
+	} else if (input_mode == savedefconfig) {
+		if (conf_write_defconfig(defconfig_file)) {
+			fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"),
+			        defconfig_file);
+			return 1;
+		}
+	} else if (input_mode != listnewconfig) {
+		if (conf_write(NULL)) {
+			fprintf(stderr, _("\n*** Error during writing of the barebox configuration.\n\n"));
+			exit(1);
+		}
 	}
-
 	return 0;
 }
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 2b8f140..3e1a638 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -41,6 +41,13 @@ const char *conf_get_configname(void)
 	return name ? name : ".config";
 }
 
+const char *conf_get_autoconfig_name(void)
+{
+	char *name = getenv("KCONFIG_AUTOCONFIG");
+
+	return name ? name : "include/config/auto.conf";
+}
+
 static char *conf_expand_value(const char *in)
 {
 	struct symbol *sym;
@@ -83,6 +90,68 @@ char *conf_get_default_confname(void)
 	return name;
 }
 
+static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
+{
+	char *p2;
+
+	switch (sym->type) {
+	case S_TRISTATE:
+		if (p[0] == 'm') {
+			sym->def[def].tri = mod;
+			sym->flags |= def_flags;
+			break;
+		}
+	case S_BOOLEAN:
+		if (p[0] == 'y') {
+			sym->def[def].tri = yes;
+			sym->flags |= def_flags;
+			break;
+		}
+		if (p[0] == 'n') {
+			sym->def[def].tri = no;
+			sym->flags |= def_flags;
+			break;
+		}
+		conf_warning("symbol value '%s' invalid for %s", p, sym->name);
+		break;
+	case S_OTHER:
+		if (*p != '"') {
+			for (p2 = p; *p2 && !isspace(*p2); p2++)
+				;
+			sym->type = S_STRING;
+			goto done;
+		}
+	case S_STRING:
+		if (*p++ != '"')
+			break;
+		for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
+			if (*p2 == '"') {
+				*p2 = 0;
+				break;
+			}
+			memmove(p2, p2 + 1, strlen(p2));
+		}
+		if (!p2) {
+			conf_warning("invalid string found");
+			return 1;
+		}
+	case S_INT:
+	case S_HEX:
+	done:
+		if (sym_string_valid(sym, p)) {
+			sym->def[def].val = strdup(p);
+			sym->flags |= def_flags;
+		} else {
+			conf_warning("symbol value '%s' invalid for %s", p, sym->name);
+			return 1;
+		}
+		break;
+	default:
+		;
+	}
+	return 0;
+}
+
 int conf_read_simple(const char *name, int def)
 {
 	FILE *in = NULL;
@@ -101,8 +170,11 @@ int conf_read_simple(const char *name, int def)
 		if (in)
 			goto load;
 		sym_add_change_count(1);
-		if (!sym_defconfig_list)
+		if (!sym_defconfig_list) {
+			if (modules_sym)
+				sym_calc_value(modules_sym);
 			return 1;
+		}
 
 		for_all_defaults(sym_defconfig_list, prop) {
 			if (expr_calc_value(prop->visible.expr) == no ||
@@ -161,7 +233,7 @@ load:
 			if (def == S_DEF_USER) {
 				sym = sym_find(line + 9);
 				if (!sym) {
-					conf_warning("trying to assign nonexistent symbol %s", line + 9);
+					sym_add_change_count(1);
 					break;
 				}
 			} else {
@@ -170,8 +242,7 @@ load:
 					sym->type = S_BOOLEAN;
 			}
 			if (sym->flags & def_flags) {
-				conf_warning("trying to reassign symbol %s", sym->name);
-				break;
+				conf_warning("override: reassigning to symbol %s", sym->name);
 			}
 			switch (sym->type) {
 			case S_BOOLEAN:
@@ -201,7 +272,7 @@ load:
 			if (def == S_DEF_USER) {
 				sym = sym_find(line + 7);
 				if (!sym) {
-					conf_warning("trying to assign nonexistent symbol %s", line + 7);
+					sym_add_change_count(1);
 					break;
 				}
 			} else {
@@ -210,64 +281,10 @@ load:
 					sym->type = S_OTHER;
 			}
 			if (sym->flags & def_flags) {
-				conf_warning("trying to reassign symbol %s", sym->name);
-				break;
-			}
-			switch (sym->type) {
-			case S_TRISTATE:
-				if (p[0] == 'm') {
-					sym->def[def].tri = mod;
-					sym->flags |= def_flags;
-					break;
-				}
-			case S_BOOLEAN:
-				if (p[0] == 'y') {
-					sym->def[def].tri = yes;
-					sym->flags |= def_flags;
-					break;
-				}
-				if (p[0] == 'n') {
-					sym->def[def].tri = no;
-					sym->flags |= def_flags;
-					break;
-				}
-				conf_warning("symbol value '%s' invalid for %s", p, sym->name);
-				break;
-			case S_OTHER:
-				if (*p != '"') {
-					for (p2 = p; *p2 && !isspace(*p2); p2++)
-						;
-					sym->type = S_STRING;
-					goto done;
-				}
-			case S_STRING:
-				if (*p++ != '"')
-					break;
-				for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
-					if (*p2 == '"') {
-						*p2 = 0;
-						break;
-					}
-					memmove(p2, p2 + 1, strlen(p2));
-				}
-				if (!p2) {
-					conf_warning("invalid string found");
-					continue;
-				}
-			case S_INT:
-			case S_HEX:
-			done:
-				if (sym_string_valid(sym, p)) {
-					sym->def[def].val = strdup(p);
-					sym->flags |= def_flags;
-				} else {
-					conf_warning("symbol value '%s' invalid for %s", p, sym->name);
-					continue;
-				}
-				break;
-			default:
-				;
+				conf_warning("override: reassigning to symbol %s", sym->name);
 			}
+			if (conf_set_sym_val(sym, def, def_flags, p))
+				continue;
 			break;
 		case '\r':
 		case '\n':
@@ -288,14 +305,12 @@ load:
 				}
 				break;
 			case yes:
-				if (cs->def[def].tri != no) {
-					conf_warning("%s creates inconsistent choice state", sym->name);
-					cs->flags &= ~def_flags;
-				} else
-					cs->def[def].val = sym;
+				if (cs->def[def].tri != no)
+					conf_warning("override: %s changes choice state", sym->name);
+				cs->def[def].val = sym;
 				break;
 			}
-			cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri);
+			cs->def[def].tri = EXPR_OR(cs->def[def].tri, sym->def[def].tri);
 		}
 	}
 	fclose(in);
@@ -307,7 +322,7 @@ load:
 
 int conf_read(const char *name)
 {
-	struct symbol *sym;
+	struct symbol *sym, *choice_sym;
 	struct property *prop;
 	struct expr *e;
 	int i, flags;
@@ -348,9 +363,9 @@ int conf_read(const char *name)
 		 */
 		prop = sym_get_choice_prop(sym);
 		flags = sym->flags;
-		for (e = prop->expr; e; e = e->left.expr)
-			if (e->right.sym->visible != no)
-				flags &= e->right.sym->flags;
+		expr_list_for_each_sym(prop->expr, e, choice_sym)
+			if (choice_sym->visible != no)
+				flags &= choice_sym->flags;
 		sym->flags &= flags | ~SYMBOL_DEF_USER;
 	}
 
@@ -384,15 +399,149 @@ int conf_read(const char *name)
 	return 0;
 }
 
+/* Write a S_STRING */
+static void conf_write_string(bool headerfile, const char *name,
+                              const char *str, FILE *out)
+{
+	int l;
+	if (headerfile)
+		fprintf(out, "#define CONFIG_%s \"", name);
+	else
+		fprintf(out, "CONFIG_%s=\"", name);
+
+	while (1) {
+		l = strcspn(str, "\"\\");
+		if (l) {
+			fwrite(str, l, 1, out);
+			str += l;
+		}
+		if (!*str)
+			break;
+		fprintf(out, "\\%c", *str++);
+	}
+	fputs("\"\n", out);
+}
+
+static void conf_write_symbol(struct symbol *sym, enum symbol_type type,
+                              FILE *out, bool write_no)
+{
+	const char *str;
+
+	switch (type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (sym_get_tristate_value(sym)) {
+		case no:
+			if (write_no)
+				fprintf(out, "# CONFIG_%s is not set\n", sym->name);
+			break;
+		case mod:
+			fprintf(out, "CONFIG_%s=m\n", sym->name);
+			break;
+		case yes:
+			fprintf(out, "CONFIG_%s=y\n", sym->name);
+			break;
+		}
+		break;
+	case S_STRING:
+		conf_write_string(false, sym->name, sym_get_string_value(sym), out);
+		break;
+	case S_HEX:
+	case S_INT:
+		str = sym_get_string_value(sym);
+		fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
+		break;
+	case S_OTHER:
+	case S_UNKNOWN:
+		break;
+	}
+}
+
+/*
+ * Write out a minimal config.
+ * All values that has default values are skipped as this is redundant.
+ */
+int conf_write_defconfig(const char *filename)
+{
+	struct symbol *sym;
+	struct menu *menu;
+	FILE *out;
+
+	out = fopen(filename, "w");
+	if (!out)
+		return 1;
+
+	sym_clear_all_valid();
+
+	/* Traverse all menus to find all relevant symbols */
+	menu = rootmenu.list;
+
+	while (menu != NULL)
+	{
+		sym = menu->sym;
+		if (sym == NULL) {
+			if (!menu_is_visible(menu))
+				goto next_menu;
+		} else if (!sym_is_choice(sym)) {
+			sym_calc_value(sym);
+			if (!(sym->flags & SYMBOL_WRITE))
+				goto next_menu;
+			sym->flags &= ~SYMBOL_WRITE;
+			/* If we cannot change the symbol - skip */
+			if (!sym_is_changable(sym))
+				goto next_menu;
+			/* If symbol equals to default value - skip */
+			if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
+				goto next_menu;
+
+			/*
+			 * If symbol is a choice value and equals to the
+			 * default for a choice - skip.
+			 * But only if value equal to "y".
+			 */
+			if (sym_is_choice_value(sym)) {
+				struct symbol *cs;
+				struct symbol *ds;
+
+				cs = prop_get_symbol(sym_get_choice_prop(sym));
+				ds = sym_choice_default(cs);
+				if (sym == ds) {
+					if ((sym->type == S_BOOLEAN ||
+					sym->type == S_TRISTATE) &&
+					sym_get_tristate_value(sym) == yes)
+						goto next_menu;
+				}
+			}
+			conf_write_symbol(sym, sym->type, out, true);
+		}
+next_menu:
+		if (menu->list != NULL) {
+			menu = menu->list;
+		}
+		else if (menu->next != NULL) {
+			menu = menu->next;
+		} else {
+			while ((menu = menu->parent)) {
+				if (menu->next != NULL) {
+					menu = menu->next;
+					break;
+				}
+			}
+		}
+	}
+	fclose(out);
+	return 0;
+}
+
 int conf_write(const char *name)
 {
 	FILE *out;
 	struct symbol *sym;
 	struct menu *menu;
 	const char *basename;
-	char dirname[128], tmpname[128], newname[128];
-	int type, l;
 	const char *str;
+	char dirname[128], tmpname[128], newname[128];
+	enum symbol_type type;
 	time_t now;
 	int use_timestamp = 1;
 	char *env;
@@ -440,7 +589,7 @@ int conf_write(const char *name)
 
 	fprintf(out, _("#\n"
 		       "# Automatically generated make config: don't edit\n"
-		       "# barebox version: %s\n"
+		       "# Linux barebox version: %s\n"
 		       "%s%s"
 		       "#\n"),
 		     sym_get_string_value(sym),
@@ -472,50 +621,11 @@ int conf_write(const char *name)
 				if (modules_sym->curr.tri == no)
 					type = S_BOOLEAN;
 			}
-			switch (type) {
-			case S_BOOLEAN:
-			case S_TRISTATE:
-				switch (sym_get_tristate_value(sym)) {
-				case no:
-					fprintf(out, "# CONFIG_%s is not set\n", sym->name);
-					break;
-				case mod:
-					fprintf(out, "CONFIG_%s=m\n", sym->name);
-					break;
-				case yes:
-					fprintf(out, "CONFIG_%s=y\n", sym->name);
-					break;
-				}
-				break;
-			case S_STRING:
-				str = sym_get_string_value(sym);
-				fprintf(out, "CONFIG_%s=\"", sym->name);
-				while (1) {
-					l = strcspn(str, "\"\\");
-					if (l) {
-						fwrite(str, l, 1, out);
-						str += l;
-					}
-					if (!*str)
-						break;
-					fprintf(out, "\\%c", *str++);
-				}
-				fputs("\"\n", out);
-				break;
-			case S_HEX:
-				str = sym_get_string_value(sym);
-				if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
-					fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
-					break;
-				}
-			case S_INT:
-				str = sym_get_string_value(sym);
-				fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
-				break;
-			}
+			/* Write config symbol to file */
+			conf_write_symbol(sym, type, out, true);
 		}
 
-	next:
+next:
 		if (menu->list) {
 			menu = menu->list;
 			continue;
@@ -548,17 +658,16 @@ int conf_write(const char *name)
 	return 0;
 }
 
-int conf_split_config(void)
+static int conf_split_config(void)
 {
-	char *name, path[128];
+	const char *name;
+	char path[128];
 	char *s, *d, c;
 	struct symbol *sym;
 	struct stat sb;
 	int res, i, fd;
 
-	name = getenv("KCONFIG_AUTOCONFIG");
-	if (!name)
-		name = "include/config/auto.conf";
+	name = conf_get_autoconfig_name();
 	conf_read_simple(name, S_DEF_AUTO);
 
 	if (chdir("include/config"))
@@ -665,10 +774,10 @@ int conf_write_autoconf(void)
 {
 	struct symbol *sym;
 	const char *str;
-	char *name;
-	FILE *out, *out_h;
+	const char *name;
+	FILE *out, *tristate, *out_h;
 	time_t now;
-	int i, l;
+	int i;
 
 	sym_clear_all_valid();
 
@@ -681,9 +790,16 @@ int conf_write_autoconf(void)
 	if (!out)
 		return 1;
 
+	tristate = fopen(".tmpconfig_tristate", "w");
+	if (!tristate) {
+		fclose(out);
+		return 1;
+	}
+
 	out_h = fopen(".tmpconfig.h", "w");
 	if (!out_h) {
 		fclose(out);
+		fclose(tristate);
 		return 1;
 	}
 
@@ -692,13 +808,16 @@ int conf_write_autoconf(void)
 	time(&now);
 	fprintf(out, "#\n"
 		     "# Automatically generated make config: don't edit\n"
-		     "# barebox version: %s\n"
+		     "# Linux barebox version: %s\n"
 		     "# %s"
 		     "#\n",
 		     sym_get_string_value(sym), ctime(&now));
+	fprintf(tristate, "#\n"
+			  "# Automatically generated - do not edit\n"
+			  "\n");
 	fprintf(out_h, "/*\n"
 		       " * Automatically generated C config: don't edit\n"
-		       " * barebox version: %s\n"
+		       " * Linux barebox version: %s\n"
 		       " * %s"
 		       " */\n"
 		       "#define AUTOCONF_INCLUDED\n",
@@ -708,6 +827,11 @@ int conf_write_autoconf(void)
 		sym_calc_value(sym);
 		if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
 			continue;
+
+		/* write symbol to config file */
+		conf_write_symbol(sym, sym->type, out, false);
+
+		/* update autoconf and tristate files */
 		switch (sym->type) {
 		case S_BOOLEAN:
 		case S_TRISTATE:
@@ -715,45 +839,28 @@ int conf_write_autoconf(void)
 			case no:
 				break;
 			case mod:
-				fprintf(out, "CONFIG_%s=m\n", sym->name);
+				fprintf(tristate, "CONFIG_%s=M\n", sym->name);
 				fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
 				break;
 			case yes:
-				fprintf(out, "CONFIG_%s=y\n", sym->name);
+				if (sym->type == S_TRISTATE)
+					fprintf(tristate, "CONFIG_%s=Y\n",
+							sym->name);
 				fprintf(out_h, "#define CONFIG_%s 1\n", sym->name);
 				break;
 			}
 			break;
 		case S_STRING:
-			str = sym_get_string_value(sym);
-			fprintf(out, "CONFIG_%s=\"", sym->name);
-			fprintf(out_h, "#define CONFIG_%s \"", sym->name);
-			while (1) {
-				l = strcspn(str, "\"\\");
-				if (l) {
-					fwrite(str, l, 1, out);
-					fwrite(str, l, 1, out_h);
-					str += l;
-				}
-				if (!*str)
-					break;
-				fprintf(out, "\\%c", *str);
-				fprintf(out_h, "\\%c", *str);
-				str++;
-			}
-			fputs("\"\n", out);
-			fputs("\"\n", out_h);
+			conf_write_string(true, sym->name, sym_get_string_value(sym), out_h);
 			break;
 		case S_HEX:
 			str = sym_get_string_value(sym);
 			if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
-				fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
 				fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);
 				break;
 			}
 		case S_INT:
 			str = sym_get_string_value(sym);
-			fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
 			fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);
 			break;
 		default:
@@ -761,16 +868,20 @@ int conf_write_autoconf(void)
 		}
 	}
 	fclose(out);
+	fclose(tristate);
 	fclose(out_h);
 
 	name = getenv("KCONFIG_AUTOHEADER");
 	if (!name)
-		name = "include/linux/autoconf.h";
+		name = "include/generated/autoconf.h";
 	if (rename(".tmpconfig.h", name))
 		return 1;
-	name = getenv("KCONFIG_AUTOCONFIG");
+	name = getenv("KCONFIG_TRISTATE");
 	if (!name)
-		name = "include/config/auto.conf";
+		name = "include/config/tristate.conf";
+	if (rename(".tmpconfig_tristate", name))
+		return 1;
+	name = conf_get_autoconfig_name();
 	/*
 	 * This must be the last step, kbuild has a dependency on auto.conf
 	 * and this marks the successful completion of the previous steps.
@@ -807,3 +918,94 @@ void conf_set_changed_callback(void (*fn)(void))
 {
 	conf_changed_callback = fn;
 }
+
+
+void conf_set_all_new_symbols(enum conf_def_mode mode)
+{
+	struct symbol *sym, *csym;
+	struct property *prop;
+	struct expr *e;
+	int i, cnt, def;
+
+	for_all_symbols(i, sym) {
+		if (sym_has_value(sym))
+			continue;
+		switch (sym_get_type(sym)) {
+		case S_BOOLEAN:
+		case S_TRISTATE:
+			switch (mode) {
+			case def_yes:
+				sym->def[S_DEF_USER].tri = yes;
+				break;
+			case def_mod:
+				sym->def[S_DEF_USER].tri = mod;
+				break;
+			case def_no:
+				sym->def[S_DEF_USER].tri = no;
+				break;
+			case def_random:
+				cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2;
+				sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt);
+				break;
+			default:
+				continue;
+			}
+			if (!(sym_is_choice(sym) && mode == def_random))
+				sym->flags |= SYMBOL_DEF_USER;
+			break;
+		default:
+			break;
+		}
+
+	}
+
+	sym_clear_all_valid();
+
+	if (mode != def_random)
+		return;
+	/*
+	 * We have different type of choice blocks.
+	 * If curr.tri equal to mod then we can select several
+	 * choice symbols in one block.
+	 * In this case we do nothing.
+	 * If curr.tri equal yes then only one symbol can be
+	 * selected in a choice block and we set it to yes,
+	 * and the rest to no.
+	 */
+	for_all_symbols(i, csym) {
+		if (sym_has_value(csym) || !sym_is_choice(csym))
+			continue;
+
+		sym_calc_value(csym);
+
+		if (csym->curr.tri != yes)
+			continue;
+
+		prop = sym_get_choice_prop(csym);
+
+		/* count entries in choice block */
+		cnt = 0;
+		expr_list_for_each_sym(prop->expr, e, sym)
+			cnt++;
+
+		/*
+		 * find a random value and set it to yes,
+		 * set the rest to no so we have only one set
+		 */
+		def = (rand() % cnt);
+
+		cnt = 0;
+		expr_list_for_each_sym(prop->expr, e, sym) {
+			if (def == cnt++) {
+				sym->def[S_DEF_USER].tri = yes;
+				csym->def[S_DEF_USER].val = sym;
+			}
+			else {
+				sym->def[S_DEF_USER].tri = no;
+			}
+		}
+		csym->flags |= SYMBOL_DEF_USER;
+		/* clear VALID to get value calculated */
+		csym->flags &= ~(SYMBOL_VALID);
+	}
+}
diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c
index 6f98dbf..8f18e37 100644
--- a/scripts/kconfig/expr.c
+++ b/scripts/kconfig/expr.c
@@ -87,7 +87,7 @@ struct expr *expr_copy(struct expr *org)
 		break;
 	case E_AND:
 	case E_OR:
-	case E_CHOICE:
+	case E_LIST:
 		e->left.expr = expr_copy(org->left.expr);
 		e->right.expr = expr_copy(org->right.expr);
 		break;
@@ -217,7 +217,7 @@ int expr_eq(struct expr *e1, struct expr *e2)
 		expr_free(e2);
 		trans_count = old_count;
 		return res;
-	case E_CHOICE:
+	case E_LIST:
 	case E_RANGE:
 	case E_NONE:
 		/* panic */;
@@ -348,7 +348,7 @@ struct expr *expr_trans_bool(struct expr *e)
 /*
  * e1 || e2 -> ?
  */
-struct expr *expr_join_or(struct expr *e1, struct expr *e2)
+static struct expr *expr_join_or(struct expr *e1, struct expr *e2)
 {
 	struct expr *tmp;
 	struct symbol *sym1, *sym2;
@@ -412,7 +412,7 @@ struct expr *expr_join_or(struct expr *e1, struct expr *e2)
 	return NULL;
 }
 
-struct expr *expr_join_and(struct expr *e1, struct expr *e2)
+static struct expr *expr_join_and(struct expr *e1, struct expr *e2)
 {
 	struct expr *tmp;
 	struct symbol *sym1, *sym2;
@@ -648,7 +648,7 @@ struct expr *expr_transform(struct expr *e)
 	case E_EQUAL:
 	case E_UNEQUAL:
 	case E_SYMBOL:
-	case E_CHOICE:
+	case E_LIST:
 		break;
 	default:
 		e->left.expr = expr_transform(e->left.expr);
@@ -932,7 +932,7 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
 		break;
 	case E_SYMBOL:
 		return expr_alloc_comp(type, e->left.sym, sym);
-	case E_CHOICE:
+	case E_LIST:
 	case E_RANGE:
 	case E_NONE:
 		/* panic */;
@@ -955,14 +955,14 @@ tristate expr_calc_value(struct expr *e)
 	case E_AND:
 		val1 = expr_calc_value(e->left.expr);
 		val2 = expr_calc_value(e->right.expr);
-		return E_AND(val1, val2);
+		return EXPR_AND(val1, val2);
 	case E_OR:
 		val1 = expr_calc_value(e->left.expr);
 		val2 = expr_calc_value(e->right.expr);
-		return E_OR(val1, val2);
+		return EXPR_OR(val1, val2);
 	case E_NOT:
 		val1 = expr_calc_value(e->left.expr);
-		return E_NOT(val1);
+		return EXPR_NOT(val1);
 	case E_EQUAL:
 		sym_calc_value(e->left.sym);
 		sym_calc_value(e->right.sym);
@@ -1000,9 +1000,9 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2)
 		if (t2 == E_OR)
 			return 1;
 	case E_OR:
-		if (t2 == E_CHOICE)
+		if (t2 == E_LIST)
 			return 1;
-	case E_CHOICE:
+	case E_LIST:
 		if (t2 == 0)
 			return 1;
 	default:
@@ -1034,12 +1034,18 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
 		expr_print(e->left.expr, fn, data, E_NOT);
 		break;
 	case E_EQUAL:
-		fn(data, e->left.sym, e->left.sym->name);
+		if (e->left.sym->name)
+			fn(data, e->left.sym, e->left.sym->name);
+		else
+			fn(data, NULL, "<choice>");
 		fn(data, NULL, "=");
 		fn(data, e->right.sym, e->right.sym->name);
 		break;
 	case E_UNEQUAL:
-		fn(data, e->left.sym, e->left.sym->name);
+		if (e->left.sym->name)
+			fn(data, e->left.sym, e->left.sym->name);
+		else
+			fn(data, NULL, "<choice>");
 		fn(data, NULL, "!=");
 		fn(data, e->right.sym, e->right.sym->name);
 		break;
@@ -1053,11 +1059,11 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *
 		fn(data, NULL, " && ");
 		expr_print(e->right.expr, fn, data, E_AND);
 		break;
-	case E_CHOICE:
+	case E_LIST:
 		fn(data, e->right.sym, e->right.sym->name);
 		if (e->left.expr) {
 			fn(data, NULL, " ^ ");
-			expr_print(e->left.expr, fn, data, E_CHOICE);
+			expr_print(e->left.expr, fn, data, E_LIST);
 		}
 		break;
 	case E_RANGE:
@@ -1091,7 +1097,32 @@ void expr_fprint(struct expr *e, FILE *out)
 
 static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str)
 {
-	str_append((struct gstr*)data, str);
+	struct gstr *gs = (struct gstr*)data;
+	const char *sym_str = NULL;
+
+	if (sym)
+		sym_str = sym_get_string_value(sym);
+
+	if (gs->max_width) {
+		unsigned extra_length = strlen(str);
+		const char *last_cr = strrchr(gs->s, '\n');
+		unsigned last_line_length;
+
+		if (sym_str)
+			extra_length += 4 + strlen(sym_str);
+
+		if (!last_cr)
+			last_cr = gs->s;
+
+		last_line_length = strlen(gs->s) - (last_cr - gs->s);
+
+		if ((last_line_length + extra_length) > gs->max_width)
+			str_append(gs, "\\\n");
+	}
+
+	str_append(gs, str);
+	if (sym && sym->type != S_UNKNOWN)
+		str_printf(gs, " [=%s]", sym_str);
 }
 
 void expr_gstr_print(struct expr *e, struct gstr *gs)
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h
index a195986..6ee2e4f 100644
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -25,14 +25,13 @@ struct file {
 
 #define FILE_BUSY		0x0001
 #define FILE_SCANNED		0x0002
-#define FILE_PRINTED		0x0004
 
 typedef enum tristate {
 	no, mod, yes
 } tristate;
 
 enum expr_type {
-	E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
+	E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_LIST, E_SYMBOL, E_RANGE
 };
 
 union expr_data {
@@ -45,9 +44,12 @@ struct expr {
 	union expr_data left, right;
 };
 
-#define E_OR(dep1, dep2)	(((dep1)>(dep2))?(dep1):(dep2))
-#define E_AND(dep1, dep2)	(((dep1)<(dep2))?(dep1):(dep2))
-#define E_NOT(dep)		(2-(dep))
+#define EXPR_OR(dep1, dep2)	(((dep1)>(dep2))?(dep1):(dep2))
+#define EXPR_AND(dep1, dep2)	(((dep1)<(dep2))?(dep1):(dep2))
+#define EXPR_NOT(dep)		(2-(dep))
+
+#define expr_list_for_each_sym(l, e, s) \
+	for (e = (l); e && (s = e->right.sym); e = e->left.expr)
 
 struct expr_value {
 	struct expr *expr;
@@ -63,9 +65,13 @@ enum symbol_type {
 	S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
 };
 
+/* enum values are used as index to symbol.def[] */
 enum {
 	S_DEF_USER,		/* main user value */
-	S_DEF_AUTO,
+	S_DEF_AUTO,		/* values read from auto.conf */
+	S_DEF_DEF3,		/* Reserved for UI usage */
+	S_DEF_DEF4,		/* Reserved for UI usage */
+	S_DEF_COUNT
 };
 
 struct symbol {
@@ -73,51 +79,74 @@ struct symbol {
 	char *name;
 	enum symbol_type type;
 	struct symbol_value curr;
-	struct symbol_value def[4];
+	struct symbol_value def[S_DEF_COUNT];
 	tristate visible;
 	int flags;
 	struct property *prop;
+	struct expr_value dir_dep;
 	struct expr_value rev_dep;
 };
 
-#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
-
-#define SYMBOL_CONST		0x0001
-#define SYMBOL_CHECK		0x0008
-#define SYMBOL_CHOICE		0x0010
-#define SYMBOL_CHOICEVAL	0x0020
-#define SYMBOL_PRINTED		0x0040
-#define SYMBOL_VALID		0x0080
-#define SYMBOL_OPTIONAL		0x0100
-#define SYMBOL_WRITE		0x0200
-#define SYMBOL_CHANGED		0x0400
-#define SYMBOL_AUTO		0x1000
-#define SYMBOL_CHECKED		0x2000
-#define SYMBOL_WARNED		0x8000
-#define SYMBOL_DEF		0x10000
-#define SYMBOL_DEF_USER		0x10000
-#define SYMBOL_DEF_AUTO		0x20000
-#define SYMBOL_DEF3		0x40000
-#define SYMBOL_DEF4		0x80000
+#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
+
+#define SYMBOL_CONST      0x0001  /* symbol is const */
+#define SYMBOL_CHECK      0x0008  /* used during dependency checking */
+#define SYMBOL_CHOICE     0x0010  /* start of a choice block (null name) */
+#define SYMBOL_CHOICEVAL  0x0020  /* used as a value in a choice block */
+#define SYMBOL_VALID      0x0080  /* set when symbol.curr is calculated */
+#define SYMBOL_OPTIONAL   0x0100  /* choice is optional - values can be 'n' */
+#define SYMBOL_WRITE      0x0200  /* ? */
+#define SYMBOL_CHANGED    0x0400  /* ? */
+#define SYMBOL_AUTO       0x1000  /* value from environment variable */
+#define SYMBOL_CHECKED    0x2000  /* used during dependency checking */
+#define SYMBOL_WARNED     0x8000  /* warning has been issued */
+
+/* Set when symbol.def[] is used */
+#define SYMBOL_DEF        0x10000  /* First bit of SYMBOL_DEF */
+#define SYMBOL_DEF_USER   0x10000  /* symbol.def[S_DEF_USER] is valid */
+#define SYMBOL_DEF_AUTO   0x20000  /* symbol.def[S_DEF_AUTO] is valid */
+#define SYMBOL_DEF3       0x40000  /* symbol.def[S_DEF_3] is valid */
+#define SYMBOL_DEF4       0x80000  /* symbol.def[S_DEF_4] is valid */
 
 #define SYMBOL_MAXLENGTH	256
-#define SYMBOL_HASHSIZE		257
-#define SYMBOL_HASHMASK		0xff
-
+#define SYMBOL_HASHSIZE		9973
+
+/* A property represent the config options that can be associated
+ * with a config "symbol".
+ * Sample:
+ * config FOO
+ *         default y
+ *         prompt "foo prompt"
+ *         select BAR
+ * config BAZ
+ *         int "BAZ Value"
+ *         range 1..255
+ */
 enum prop_type {
-	P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
+	P_UNKNOWN,
+	P_PROMPT,   /* prompt "foo prompt" or "BAZ Value" */
+	P_COMMENT,  /* text associated with a comment */
+	P_MENU,     /* prompt associated with a menuconfig option */
+	P_DEFAULT,  /* default y */
+	P_CHOICE,   /* choice value */
+	P_SELECT,   /* select BAR */
+	P_RANGE,    /* range 7..100 (for a symbol) */
+	P_ENV,      /* value from environment variable */
+	P_SYMBOL,   /* where a symbol is defined */
 };
 
 struct property {
-	struct property *next;
-	struct symbol *sym;
-	enum prop_type type;
-	const char *text;
+	struct property *next;     /* next property - null if last */
+	struct symbol *sym;        /* the symbol for which the property is associated */
+	enum prop_type type;       /* type of property */
+	const char *text;          /* the prompt value - P_PROMPT, P_MENU, P_COMMENT */
 	struct expr_value visible;
-	struct expr *expr;
-	struct menu *menu;
-	struct file *file;
-	int lineno;
+	struct expr *expr;         /* the optional conditional part of the property */
+	struct menu *menu;         /* the menu the property are associated with
+	                            * valid for: P_SELECT, P_RANGE, P_CHOICE,
+	                            * P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */
+	struct file *file;         /* what file was this property defined */
+	int lineno;                /* what lineno was this property defined */
 };
 
 #define for_all_properties(sym, st, tok) \
@@ -136,6 +165,7 @@ struct menu {
 	struct symbol *sym;
 	struct property *prompt;
 	struct expr *dep;
+	struct expr *dir_dep;
 	unsigned int flags;
 	char *help;
 	struct file *file;
diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c
index 262908c..9b84fee 100644
--- a/scripts/kconfig/gconf.c
+++ b/scripts/kconfig/gconf.c
@@ -30,13 +30,16 @@ enum {
 	SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW
 };
 
+enum {
+	OPT_NORMAL, OPT_ALL, OPT_PROMPT
+};
+
 static gint view_mode = FULL_VIEW;
 static gboolean show_name = TRUE;
 static gboolean show_range = TRUE;
 static gboolean show_value = TRUE;
-static gboolean show_all = FALSE;
-static gboolean show_debug = FALSE;
 static gboolean resizeable = FALSE;
+static int opt_mode = OPT_NORMAL;
 
 GtkWidget *main_wnd = NULL;
 GtkWidget *tree1_w = NULL;	// left  frame
@@ -76,36 +79,7 @@ static void conf_changed(void);
 
 /* Helping/Debugging Functions */
 
-
-const char *dbg_print_stype(int val)
-{
-	static char buf[256];
-
-	bzero(buf, 256);
-
-	if (val == S_UNKNOWN)
-		strcpy(buf, "unknown");
-	if (val == S_BOOLEAN)
-		strcpy(buf, "boolean");
-	if (val == S_TRISTATE)
-		strcpy(buf, "tristate");
-	if (val == S_INT)
-		strcpy(buf, "int");
-	if (val == S_HEX)
-		strcpy(buf, "hex");
-	if (val == S_STRING)
-		strcpy(buf, "string");
-	if (val == S_OTHER)
-		strcpy(buf, "other");
-
-#ifdef DEBUG
-	printf("%s", buf);
-#endif
-
-	return buf;
-}
-
-const char *dbg_print_flags(int val)
+const char *dbg_sym_flags(int val)
 {
 	static char buf[256];
 
@@ -119,8 +93,6 @@ const char *dbg_print_flags(int val)
 		strcat(buf, "choice/");
 	if (val & SYMBOL_CHOICEVAL)
 		strcat(buf, "choiceval/");
-	if (val & SYMBOL_PRINTED)
-		strcat(buf, "printed/");
 	if (val & SYMBOL_VALID)
 		strcat(buf, "valid/");
 	if (val & SYMBOL_OPTIONAL)
@@ -133,40 +105,10 @@ const char *dbg_print_flags(int val)
 		strcat(buf, "auto/");
 
 	buf[strlen(buf) - 1] = '\0';
-#ifdef DEBUG
-	printf("%s", buf);
-#endif
-
-	return buf;
-}
-
-const char *dbg_print_ptype(int val)
-{
-	static char buf[256];
-
-	bzero(buf, 256);
-
-	if (val == P_UNKNOWN)
-		strcpy(buf, "unknown");
-	if (val == P_PROMPT)
-		strcpy(buf, "prompt");
-	if (val == P_COMMENT)
-		strcpy(buf, "comment");
-	if (val == P_MENU)
-		strcpy(buf, "menu");
-	if (val == P_DEFAULT)
-		strcpy(buf, "default");
-	if (val == P_CHOICE)
-		strcpy(buf, "choice");
-
-#ifdef DEBUG
-	printf("%s", buf);
-#endif
 
 	return buf;
 }
 
-
 void replace_button_icon(GladeXML * xml, GdkDrawable * window,
 			 GtkStyle * style, gchar * btn_name, gchar ** xpm)
 {
@@ -268,7 +210,7 @@ void init_main_window(const gchar * glade_file)
 					  /*"style", PANGO_STYLE_OBLIQUE, */
 					  NULL);
 
-	sprintf(title, _("Linux Kernel v%s Configuration"),
+	sprintf(title, _("Barebox v%s Configuration"),
 		getenv("KERNELVERSION"));
 	gtk_window_set_title(GTK_WINDOW(main_wnd), title);
 
@@ -457,16 +399,10 @@ static void text_insert_help(struct menu *menu)
 {
 	GtkTextBuffer *buffer;
 	GtkTextIter start, end;
-	const char *prompt = menu_get_prompt(menu);
-	gchar *name;
-	const char *help;
-
-	help = _(menu_get_help(menu));
+	const char *prompt = _(menu_get_prompt(menu));
+	struct gstr help = str_new();
 
-	if (menu->sym && menu->sym->name)
-		name = g_strdup_printf(_(menu->sym->name));
-	else
-		name = g_strdup("");
+	menu_get_ext_help(menu, &help);
 
 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w));
 	gtk_text_buffer_get_bounds(buffer, &start, &end);
@@ -476,14 +412,11 @@ static void text_insert_help(struct menu *menu)
 	gtk_text_buffer_get_end_iter(buffer, &end);
 	gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1,
 					 NULL);
-	gtk_text_buffer_insert_at_cursor(buffer, " ", 1);
-	gtk_text_buffer_get_end_iter(buffer, &end);
-	gtk_text_buffer_insert_with_tags(buffer, &end, name, -1, tag1,
-					 NULL);
 	gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2);
 	gtk_text_buffer_get_end_iter(buffer, &end);
-	gtk_text_buffer_insert_with_tags(buffer, &end, help, -1, tag2,
+	gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2,
 					 NULL);
+	str_free(&help);
 }
 
 
@@ -708,20 +641,29 @@ void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data)
 
 
 void
-on_show_all_options1_activate(GtkMenuItem * menuitem, gpointer user_data)
+on_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data)
 {
-	show_all = GTK_CHECK_MENU_ITEM(menuitem)->active;
+	opt_mode = OPT_NORMAL;
+	gtk_tree_store_clear(tree2);
+	display_tree(&rootmenu);	/* instead of update_tree to speed-up */
+}
+
 
+void
+on_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	opt_mode = OPT_ALL;
 	gtk_tree_store_clear(tree2);
-	display_tree(&rootmenu);	// instead of update_tree to speed-up
+	display_tree(&rootmenu);	/* instead of update_tree to speed-up */
 }
 
 
 void
-on_show_debug_info1_activate(GtkMenuItem * menuitem, gpointer user_data)
+on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data)
 {
-	show_debug = GTK_CHECK_MENU_ITEM(menuitem)->active;
-	update_tree(&rootmenu, NULL);
+	opt_mode = OPT_PROMPT;
+	gtk_tree_store_clear(tree2);
+	display_tree(&rootmenu);	/* instead of update_tree to speed-up */
 }
 
 
@@ -729,7 +671,7 @@ void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data)
 {
 	GtkWidget *dialog;
 	const gchar *intro_text = _(
-	    "Welcome to gkc, the GTK+ graphical kernel configuration tool\n"
+	    "Welcome to gkc, the GTK+ graphical barebox configuration tool\n"
 	    "for Linux.\n"
 	    "For each option, a blank box indicates the feature is disabled, a\n"
 	    "check indicates it is enabled, and a dot indicates that it is to\n"
@@ -1171,10 +1113,13 @@ static gchar **fill_row(struct menu *menu)
 	bzero(row, sizeof(row));
 
 	row[COL_OPTION] =
-	    g_strdup_printf("%s %s", menu_get_prompt(menu),
-			    sym && sym_has_value(sym) ? "(NEW)" : "");
+	    g_strdup_printf("%s %s", _(menu_get_prompt(menu)),
+			    sym && !sym_has_value(sym) ? "(NEW)" : "");
 
-	if (show_all && !menu_is_visible(menu))
+	if (opt_mode == OPT_ALL && !menu_is_visible(menu))
+		row[COL_COLOR] = g_strdup("DarkGray");
+	else if (opt_mode == OPT_PROMPT &&
+			menu_has_prompt(menu) && !menu_is_visible(menu))
 		row[COL_COLOR] = g_strdup("DarkGray");
 	else
 		row[COL_COLOR] = g_strdup("Black");
@@ -1221,7 +1166,7 @@ static gchar **fill_row(struct menu *menu)
 
 		if (def_menu)
 			row[COL_VALUE] =
-			    g_strdup(menu_get_prompt(def_menu));
+			    g_strdup(_(menu_get_prompt(def_menu)));
 	}
 	if (sym->flags & SYMBOL_CHOICEVAL)
 		row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);
@@ -1397,16 +1342,20 @@ static void update_tree(struct menu *src, GtkTreeIter * dst)
 		       menu2 ? menu_get_prompt(menu2) : "nil");
 #endif
 
-		if (!menu_is_visible(child1) && !show_all) {	// remove node
+		if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) ||
+		    (opt_mode == OPT_PROMPT && !menu_has_prompt(child1)) ||
+		    (opt_mode == OPT_ALL    && !menu_get_prompt(child1))) {
+
+			/* remove node */
 			if (gtktree_iter_find_node(dst, menu1) != NULL) {
 				memcpy(&tmp, child2, sizeof(GtkTreeIter));
 				valid = gtk_tree_model_iter_next(model2,
 								 child2);
 				gtk_tree_store_remove(tree2, &tmp);
 				if (!valid)
-					return;	// next parent
+					return;		/* next parent */
 				else
-					goto reparse;	// next child
+					goto reparse;	/* next child */
 			} else
 				continue;
 		}
@@ -1475,17 +1424,19 @@ static void display_tree(struct menu *menu)
 		    && (tree == tree2))
 			continue;
 
-		if (menu_is_visible(child) || show_all)
+		if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) ||
+		    (opt_mode == OPT_PROMPT && menu_has_prompt(child)) ||
+		    (opt_mode == OPT_ALL    && menu_get_prompt(child)))
 			place_node(child, fill_row(child));
 #ifdef DEBUG
 		printf("%*c%s: ", indent, ' ', menu_get_prompt(child));
 		printf("%s", child->flags & MENU_ROOT ? "rootmenu | " : "");
-		dbg_print_ptype(ptype);
+		printf("%s", prop_get_type_name(ptype));
 		printf(" | ");
 		if (sym) {
-			dbg_print_stype(sym->type);
+			printf("%s", sym_type_name(sym->type));
 			printf(" | ");
-			dbg_print_flags(sym->flags);
+			printf("%s", dbg_sym_flags(sym->flags));
 			printf("\n");
 		} else
 			printf("\n");
diff --git a/scripts/kconfig/gconf.glade b/scripts/kconfig/gconf.glade
index 803233f..d52b0a7 100644
--- a/scripts/kconfig/gconf.glade
+++ b/scripts/kconfig/gconf.glade
@@ -190,26 +190,40 @@
 		  </child>
 
 		  <child>
-		    <widget class="GtkCheckMenuItem" id="show_all_options1">
+		    <widget class="GtkRadioMenuItem" id="set_option_mode1">
+		      <property name="visible">True</property>
+		      <property name="tooltip" translatable="yes">Show normal options</property>
+		      <property name="label" translatable="yes">Show normal options</property>
+		      <property name="use_underline">True</property>
+		      <property name="active">True</property>
+		      <signal name="activate" handler="on_set_option_mode1_activate"/>
+		    </widget>
+		  </child>
+
+		  <child>
+		    <widget class="GtkRadioMenuItem" id="set_option_mode2">
 		      <property name="visible">True</property>
 		      <property name="tooltip" translatable="yes">Show all options</property>
 		      <property name="label" translatable="yes">Show all _options</property>
 		      <property name="use_underline">True</property>
 		      <property name="active">False</property>
-		      <signal name="activate" handler="on_show_all_options1_activate"/>
+		      <property name="group">set_option_mode1</property>
+		      <signal name="activate" handler="on_set_option_mode2_activate"/>
 		    </widget>
 		  </child>
 
 		  <child>
-		    <widget class="GtkCheckMenuItem" id="show_debug_info1">
+		    <widget class="GtkRadioMenuItem" id="set_option_mode3">
 		      <property name="visible">True</property>
-		      <property name="tooltip" translatable="yes">Show masked options</property>
-		      <property name="label" translatable="yes">Show _debug info</property>
+		      <property name="tooltip" translatable="yes">Show all options with prompts</property>
+		      <property name="label" translatable="yes">Show all prompt options</property>
 		      <property name="use_underline">True</property>
 		      <property name="active">False</property>
-		      <signal name="activate" handler="on_show_debug_info1_activate"/>
+		      <property name="group">set_option_mode1</property>
+		      <signal name="activate" handler="on_set_option_mode3_activate"/>
 		    </widget>
 		  </child>
+
 		</widget>
 	      </child>
 	    </widget>
@@ -547,7 +561,7 @@
 		  <property name="headers_visible">True</property>
 		  <property name="rules_hint">False</property>
 		  <property name="reorderable">False</property>
-		  <property name="enable_search">True</property>
+		  <property name="enable_search">False</property>
 		  <signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:58:22 GMT"/>
 		  <signal name="button_press_event" handler="on_treeview1_button_press_event" last_modification_time="Sun, 12 Jan 2003 16:03:52 GMT"/>
 		  <signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 16:11:44 GMT"/>
@@ -582,7 +596,7 @@
 		      <property name="headers_visible">True</property>
 		      <property name="rules_hint">False</property>
 		      <property name="reorderable">False</property>
-		      <property name="enable_search">True</property>
+		      <property name="enable_search">False</property>
 		      <signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:57:55 GMT"/>
 		      <signal name="button_press_event" handler="on_treeview2_button_press_event" last_modification_time="Sun, 12 Jan 2003 15:57:58 GMT"/>
 		      <signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 15:58:01 GMT"/>
diff --git a/scripts/kconfig/kxgettext.c b/scripts/kconfig/kxgettext.c
index 6eb72a7..dcc3fcc 100644
--- a/scripts/kconfig/kxgettext.c
+++ b/scripts/kconfig/kxgettext.c
@@ -43,6 +43,10 @@ static char *escape(const char* text, char *bf, int len)
 			++text;
 			goto next;
 		}
+		else if (*text == '\\') {
+			*bfp++ = '\\';
+			len--;
+		}
 		*bfp++ = *text++;
 next:
 		--len;
@@ -162,7 +166,7 @@ static int message__add(const char *msg, char *option, char *file, int lineno)
 	return rc;
 }
 
-void menu_build_message_list(struct menu *menu)
+static void menu_build_message_list(struct menu *menu)
 {
 	struct menu *child;
 
@@ -207,7 +211,7 @@ static void message__print_gettext_msgid_msgstr(struct message *self)
 	       "msgstr \"\"\n", self->msg);
 }
 
-void menu__xgettext(void)
+static void menu__xgettext(void)
 {
 	struct message *m = message__list;
 
diff --git a/scripts/kconfig/lex.zconf.c_shipped b/scripts/kconfig/lex.zconf.c_shipped
index 0fdc904..ca60fb7 100644
--- a/scripts/kconfig/lex.zconf.c_shipped
+++ b/scripts/kconfig/lex.zconf.c_shipped
@@ -5,10 +5,29 @@
 
 /* A lexical scanner generated by flex */
 
+#define yy_create_buffer zconf_create_buffer
+#define yy_delete_buffer zconf_delete_buffer
+#define yy_flex_debug zconf_flex_debug
+#define yy_init_buffer zconf_init_buffer
+#define yy_flush_buffer zconf_flush_buffer
+#define yy_load_buffer_state zconf_load_buffer_state
+#define yy_switch_to_buffer zconf_switch_to_buffer
+#define yyin zconfin
+#define yyleng zconfleng
+#define yylex zconflex
+#define yylineno zconflineno
+#define yyout zconfout
+#define yyrestart zconfrestart
+#define yytext zconftext
+#define yywrap zconfwrap
+#define yyalloc zconfalloc
+#define yyrealloc zconfrealloc
+#define yyfree zconffree
+
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 33
+#define YY_FLEX_SUBMINOR_VERSION 35
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -30,10 +49,10 @@
 
 /* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
 
-#if __STDC_VERSION__ >= 199901L
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
 
 /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
+ * if you want the limit (max/min) macros for int types. 
  */
 #ifndef __STDC_LIMIT_MACROS
 #define __STDC_LIMIT_MACROS 1
@@ -53,7 +72,6 @@ typedef int flex_int32_t;
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -84,6 +102,8 @@ typedef unsigned int flex_uint32_t;
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
@@ -93,11 +113,12 @@ typedef unsigned int flex_uint32_t;
 
 #else	/* ! __cplusplus */
 
-#if __STDC__
+/* C99 requires __STDC__ to be defined as 1. */
+#if defined (__STDC__)
 
 #define YY_USE_CONST
 
-#endif	/* __STDC__ */
+#endif	/* defined (__STDC__) */
 #endif	/* ! __cplusplus */
 
 #ifdef YY_USE_CONST
@@ -139,7 +160,15 @@ typedef unsigned int flex_uint32_t;
 
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 
 /* The state buf must be large enough to hold one state per character in the main buffer.
@@ -177,14 +206,9 @@ extern FILE *zconfin, *zconfout;
 
 #define unput(c) yyunput( c, (yytext_ptr)  )
 
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- */
-
 #ifndef YY_TYPEDEF_YY_SIZE_T
 #define YY_TYPEDEF_YY_SIZE_T
-typedef unsigned int yy_size_t;
+typedef size_t yy_size_t;
 #endif
 
 #ifndef YY_STRUCT_YY_BUFFER_STATE
@@ -335,7 +359,7 @@ void zconffree (void *  );
 
 /* Begin user sect3 */
 
-#define zconfwrap() 1
+#define zconfwrap(n) 1
 #define YY_SKIP_YYWRAP
 
 typedef unsigned char YY_CHAR;
@@ -748,6 +772,7 @@ int zconf_flex_debug = 0;
 #define YY_MORE_ADJ 0
 #define YY_RESTORE_YY_MORE_OFFSET
 char *zconftext;
+#define YY_NO_INPUT 1
 
 /*
  * Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>
@@ -785,7 +810,7 @@ static int last_ts, first_ts;
 static void zconf_endhelp(void);
 static void zconf_endfile(void);
 
-void new_string(void)
+static void new_string(void)
 {
 	text = malloc(START_STRSIZE);
 	text_asize = START_STRSIZE;
@@ -793,7 +818,7 @@ void new_string(void)
 	*text = 0;
 }
 
-void append_string(const char *str, int size)
+static void append_string(const char *str, int size)
 {
 	int new_size = text_size + size + 1;
 	if (new_size > text_asize) {
@@ -807,7 +832,7 @@ void append_string(const char *str, int size)
 	text[text_size] = 0;
 }
 
-void alloc_string(const char *str, int size)
+static void alloc_string(const char *str, int size)
 {
 	text = malloc(size + 1);
 	memcpy(text, str, size);
@@ -834,6 +859,35 @@ void alloc_string(const char *str, int size)
 
 static int yy_init_globals (void );
 
+/* Accessor methods to globals.
+   These are made visible to non-reentrant scanners for convenience. */
+
+int zconflex_destroy (void );
+
+int zconfget_debug (void );
+
+void zconfset_debug (int debug_flag  );
+
+YY_EXTRA_TYPE zconfget_extra (void );
+
+void zconfset_extra (YY_EXTRA_TYPE user_defined  );
+
+FILE *zconfget_in (void );
+
+void zconfset_in  (FILE * in_str  );
+
+FILE *zconfget_out (void );
+
+void zconfset_out  (FILE * out_str  );
+
+int zconfget_leng (void );
+
+char *zconfget_text (void );
+
+int zconfget_lineno (void );
+
+void zconfset_lineno (int line_number  );
+
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
  */
@@ -868,7 +922,12 @@ static int input (void );
 
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
@@ -876,7 +935,7 @@ static int input (void );
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout )
+#define ECHO do { if (fwrite( zconftext, zconfleng, 1, zconfout )) {} } while (0)
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -1256,6 +1315,11 @@ YY_RULE_SETUP
 case 32:
 YY_RULE_SETUP
 {
+		while (zconfleng) {
+			if ((zconftext[zconfleng-1] != ' ') && (zconftext[zconfleng-1] != '\t'))
+				break;
+			zconfleng--;
+		}
 		append_string(zconftext, zconfleng);
 		if (!first_ts)
 			first_ts = last_ts;
@@ -1511,7 +1575,7 @@ static int yy_get_next_buffer (void)
 
 		/* Read in more data. */
 		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-			(yy_n_chars), num_to_read );
+			(yy_n_chars), (size_t) num_to_read );
 
 		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
 		}
@@ -1535,6 +1599,14 @@ static int yy_get_next_buffer (void)
 	else
 		ret_val = EOB_ACT_CONTINUE_SCAN;
 
+	if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+		/* Extend the array by 50%, plus the number we really need. */
+		yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) zconfrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size  );
+		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+	}
+
 	(yy_n_chars) += number_to_move;
 	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
 	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
@@ -1921,7 +1993,9 @@ static void zconfensure_buffer_stack (void)
 		(yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
 								(num_to_alloc * sizeof(struct yy_buffer_state*)
 								);
-		
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in zconfensure_buffer_stack()" );
+								  
 		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
 				
 		(yy_buffer_stack_max) = num_to_alloc;
@@ -1939,6 +2013,8 @@ static void zconfensure_buffer_stack (void)
 								((yy_buffer_stack),
 								num_to_alloc * sizeof(struct yy_buffer_state*)
 								);
+		if ( ! (yy_buffer_stack) )
+			YY_FATAL_ERROR( "out of dynamic memory in zconfensure_buffer_stack()" );
 
 		/* zero only the new slots.*/
 		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
@@ -1997,8 +2073,8 @@ YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr )
 
 /** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
  * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * 
  * @return the newly allocated buffer state object.
  */
@@ -2255,7 +2331,7 @@ static void zconf_endhelp(void)
  * ./name
  * $(srctree)/name
  * The latter is used when srctree is separate from objtree
- * when compiling the kernel.
+ * when compiling the barebox.
  * Return NULL if file is not found.
  */
 FILE *zconf_fopen(const char *name)
@@ -2307,11 +2383,14 @@ void zconf_nextfile(const char *name)
 	current_buf = buf;
 
 	if (file->flags & FILE_BUSY) {
-		printf("recursive scan (%s)?\n", name);
+		printf("%s:%d: do not source '%s' from itself\n",
+		       zconf_curname(), zconf_lineno(), name);
 		exit(1);
 	}
 	if (file->flags & FILE_SCANNED) {
-		printf("file %s already scanned?\n", name);
+		printf("%s:%d: file '%s' is already sourced from '%s'\n",
+		       zconf_curname(), zconf_lineno(), name,
+		       file->parent->name);
 		exit(1);
 	}
 	file->flags |= FILE_BUSY;
diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h
index 8a07ee4..76db065 100644
--- a/scripts/kconfig/lkc.h
+++ b/scripts/kconfig/lkc.h
@@ -11,9 +11,9 @@
 #ifndef KBUILD_NO_NLS
 # include <libintl.h>
 #else
-# define gettext(Msgid) ((const char *) (Msgid))
-# define textdomain(Domainname) ((const char *) (Domainname))
-# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
+static inline const char *gettext(const char *txt) { return txt; }
+static inline void textdomain(const char *domainname) {}
+static inline void bindtextdomain(const char *name, const char *dir) {}
 #endif
 
 #ifdef __cplusplus
@@ -42,8 +42,17 @@ extern "C" {
 #define TF_PARAM	0x0002
 #define TF_OPTION	0x0004
 
+enum conf_def_mode {
+	def_default,
+	def_yes,
+	def_mod,
+	def_no,
+	def_random
+};
+
 #define T_OPT_MODULES		1
 #define T_OPT_DEFCONFIG_LIST	2
+#define T_OPT_ENV		3
 
 struct kconf_id {
 	int name;
@@ -65,15 +74,18 @@ char *zconf_curname(void);
 
 /* confdata.c */
 const char *conf_get_configname(void);
+const char *conf_get_autoconfig_name(void);
 char *conf_get_default_confname(void);
 void sym_set_change_count(int count);
 void sym_add_change_count(int count);
+void conf_set_all_new_symbols(enum conf_def_mode mode);
 
 /* kconfig_load.c */
 void kconfig_load(void);
 
 /* menu.c */
-void menu_init(void);
+void _menu_init(void);
+void menu_warn(struct menu *menu, const char *fmt, ...);
 struct menu *menu_add_menu(void);
 void menu_end_menu(void);
 void menu_add_entry(struct symbol *sym);
@@ -94,6 +106,11 @@ int file_write_dep(const char *name);
 struct gstr {
 	size_t len;
 	char  *s;
+	/*
+	* when max_width is not zero long lines in string s (if any) get
+	* wrapped not to exceed the max_width value
+	*/
+	int max_width;
 };
 struct gstr str_new(void);
 struct gstr str_assign(const char *s);
@@ -103,13 +120,18 @@ void str_printf(struct gstr *gs, const char *fmt, ...);
 const char *str_get(struct gstr *gs);
 
 /* symbol.c */
+extern struct expr *sym_env_list;
+
 void sym_init(void);
 void sym_clear_all_valid(void);
 void sym_set_all_changed(void);
 void sym_set_changed(struct symbol *sym);
+struct symbol *sym_choice_default(struct symbol *sym);
+const char *sym_get_string_default(struct symbol *sym);
 struct symbol *sym_check_deps(struct symbol *sym);
 struct property *prop_alloc(enum prop_type type, struct symbol *sym);
 struct symbol *prop_get_symbol(struct property *prop);
+struct property *sym_get_env_prop(struct symbol *sym);
 
 static inline tristate sym_get_tristate_value(struct symbol *sym)
 {
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h
index 4d09f6d..9a948c9 100644
--- a/scripts/kconfig/lkc_proto.h
+++ b/scripts/kconfig/lkc_proto.h
@@ -3,6 +3,7 @@
 P(conf_parse,void,(const char *name));
 P(conf_read,int,(const char *name));
 P(conf_read_simple,int,(const char *name, int));
+P(conf_write_defconfig,int,(const char *name));
 P(conf_write,int,(const char *name));
 P(conf_write_autoconf,int,(void));
 P(conf_get_changed,bool,(void));
@@ -11,17 +12,21 @@ P(conf_set_changed_callback, void,(void (*fn)(void)));
 /* menu.c */
 P(rootmenu,struct menu,);
 
-P(menu_is_visible,bool,(struct menu *menu));
+P(menu_is_visible, bool, (struct menu *menu));
+P(menu_has_prompt, bool, (struct menu *menu));
 P(menu_get_prompt,const char *,(struct menu *menu));
 P(menu_get_root_menu,struct menu *,(struct menu *menu));
 P(menu_get_parent_menu,struct menu *,(struct menu *menu));
 P(menu_has_help,bool,(struct menu *menu));
 P(menu_get_help,const char *,(struct menu *menu));
+P(get_symbol_str, void, (struct gstr *r, struct symbol *sym));
+P(get_relations_str, struct gstr, (struct symbol **sym_arr));
+P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
 
 /* symbol.c */
 P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
 
-P(sym_lookup,struct symbol *,(const char *name, int isconst));
+P(sym_lookup,struct symbol *,(const char *name, int flags));
 P(sym_find,struct symbol *,(const char *name));
 P(sym_re_search,struct symbol **,(const char *pattern));
 P(sym_type_name,const char *,(enum symbol_type type));
diff --git a/scripts/kconfig/lxdialog/BIG.FAT.WARNING b/scripts/kconfig/lxdialog/BIG.FAT.WARNING
index a8999d8..d8601eb 100644
--- a/scripts/kconfig/lxdialog/BIG.FAT.WARNING
+++ b/scripts/kconfig/lxdialog/BIG.FAT.WARNING
@@ -1,4 +1,4 @@
 This is NOT the official version of dialog.  This version has been
 significantly modified from the original.  It is for use by the Linux
-kernel configuration script.  Please do not bother Savio Lam with 
+barebox configuration script.  Please do not bother Savio Lam with 
 questions about this program.
diff --git a/scripts/kconfig/lxdialog/check-lxdialog.sh b/scripts/kconfig/lxdialog/check-lxdialog.sh
index 9681476..fcef0f5 100644
--- a/scripts/kconfig/lxdialog/check-lxdialog.sh
+++ b/scripts/kconfig/lxdialog/check-lxdialog.sh
@@ -36,19 +36,23 @@ trap "rm -f $tmp" 0 1 2 3 15
 
 # Check if we can link to ncurses
 check() {
-	echo "main() {}" | $cc -xc - -o $tmp 2> /dev/null
+        $cc -xc - -o $tmp 2>/dev/null <<'EOF'
+#include CURSES_LOC
+main() {}
+EOF
 	if [ $? != 0 ]; then
-		echo " *** Unable to find the ncurses libraries."          1>&2
-		echo " *** make menuconfig require the ncurses libraries"  1>&2
-		echo " *** "                                               1>&2
-		echo " *** Install ncurses (ncurses-devel) and try again"  1>&2
-		echo " *** "                                               1>&2
-		exit 1
+	    echo " *** Unable to find the ncurses libraries or the"       1>&2
+	    echo " *** required header files."                            1>&2
+	    echo " *** 'make menuconfig' requires the ncurses libraries." 1>&2
+	    echo " *** "                                                  1>&2
+	    echo " *** Install ncurses (ncurses-devel) and try again."    1>&2
+	    echo " *** "                                                  1>&2
+	    exit 1
 	fi
 }
 
 usage() {
-	printf "Usage: $0 [-check compiler options|-header|-library]\n"
+	printf "Usage: $0 [-check compiler options|-ccflags|-ldflags compiler options]\n"
 }
 
 if [ $# -eq 0 ]; then
diff --git a/scripts/kconfig/lxdialog/checklist.c b/scripts/kconfig/lxdialog/checklist.c
index cf69708..a2eb80f 100644
--- a/scripts/kconfig/lxdialog/checklist.c
+++ b/scripts/kconfig/lxdialog/checklist.c
@@ -31,6 +31,10 @@ static int list_width, check_x, item_x;
 static void print_item(WINDOW * win, int choice, int selected)
 {
 	int i;
+	char *list_item = malloc(list_width + 1);
+
+	strncpy(list_item, item_str(), list_width - item_x);
+	list_item[list_width - item_x] = '\0';
 
 	/* Clear 'residue' of last item */
 	wattrset(win, dlg.menubox.atr);
@@ -41,16 +45,18 @@ static void print_item(WINDOW * win, int choice, int selected)
 	wmove(win, choice, check_x);
 	wattrset(win, selected ? dlg.check_selected.atr
 		 : dlg.check.atr);
-	wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
+	if (!item_is_tag(':'))
+		wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
 
 	wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
-	mvwaddch(win, choice, item_x, item_str()[0]);
+	mvwaddch(win, choice, item_x, list_item[0]);
 	wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
-	waddstr(win, (char *)item_str() + 1);
+	waddstr(win, list_item + 1);
 	if (selected) {
 		wmove(win, choice, check_x + 1);
 		wrefresh(win);
 	}
+	free(list_item);
 }
 
 /*
@@ -97,8 +103,8 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
 	int x = width / 2 - 11;
 	int y = height - 2;
 
-	print_button(dialog, "Select", y, x, selected == 0);
-	print_button(dialog, " Help ", y, x + 14, selected == 1);
+	print_button(dialog, gettext("Select"), y, x, selected == 0);
+	print_button(dialog, gettext(" Help "), y, x + 14, selected == 1);
 
 	wmove(dialog, y, x + 1 + 14 * selected);
 	wrefresh(dialog);
@@ -174,6 +180,7 @@ do_resize:
 	check_x = 0;
 	item_foreach()
 		check_x = MAX(check_x, strlen(item_str()) + 4);
+	check_x = MIN(check_x, list_width);
 
 	check_x = (list_width - check_x) / 2;
 	item_x = check_x + 4;
diff --git a/scripts/kconfig/lxdialog/dialog.h b/scripts/kconfig/lxdialog/dialog.h
index 7e17eba..b5211fc 100644
--- a/scripts/kconfig/lxdialog/dialog.h
+++ b/scripts/kconfig/lxdialog/dialog.h
@@ -26,6 +26,12 @@
 #include <string.h>
 #include <stdbool.h>
 
+#ifndef KBUILD_NO_NLS
+# include <libintl.h>
+#else
+# define gettext(Msgid) ((const char *) (Msgid))
+#endif
+
 #ifdef __sun__
 #define CURS_MACROS
 #endif
@@ -187,10 +193,9 @@ int item_is_tag(char tag);
 int on_key_esc(WINDOW *win);
 int on_key_resize(void);
 
-void init_dialog(const char *backtitle);
+int init_dialog(const char *backtitle);
 void set_dialog_backtitle(const char *backtitle);
-void reset_dialog(void);
-void end_dialog(void);
+void end_dialog(int x, int y);
 void attr_clear(WINDOW * win, int height, int width, chtype attr);
 void dialog_clear(void);
 void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x);
diff --git a/scripts/kconfig/lxdialog/inputbox.c b/scripts/kconfig/lxdialog/inputbox.c
index 05e7206..dd8e587 100644
--- a/scripts/kconfig/lxdialog/inputbox.c
+++ b/scripts/kconfig/lxdialog/inputbox.c
@@ -31,8 +31,8 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
 	int x = width / 2 - 11;
 	int y = height - 2;
 
-	print_button(dialog, "  Ok  ", y, x, selected == 0);
-	print_button(dialog, " Help ", y, x + 14, selected == 1);
+	print_button(dialog, gettext("  Ok  "), y, x, selected == 0);
+	print_button(dialog, gettext(" Help "), y, x + 14, selected == 1);
 
 	wmove(dialog, y, x + 1 + 14 * selected);
 	wrefresh(dialog);
@@ -89,7 +89,7 @@ do_resize:
 	box_y = y + 2;
 	box_x = (width - box_width) / 2;
 	draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2,
-		 dlg.border.atr, dlg.dialog.atr);
+		 dlg.dialog.atr, dlg.border.atr);
 
 	print_buttons(dialog, height, width, 0);
 
@@ -180,7 +180,7 @@ do_resize:
 		case KEY_LEFT:
 			switch (button) {
 			case -1:
-				button = 1;	/* Indicates "Cancel" button is selected */
+				button = 1;	/* Indicates "Help" button is selected */
 				print_buttons(dialog, height, width, 1);
 				break;
 			case 0:
@@ -204,7 +204,7 @@ do_resize:
 				print_buttons(dialog, height, width, 0);
 				break;
 			case 0:
-				button = 1;	/* Indicates "Cancel" button is selected */
+				button = 1;	/* Indicates "Help" button is selected */
 				print_buttons(dialog, height, width, 1);
 				break;
 			case 1:
diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c
index 0d83159..1d60473 100644
--- a/scripts/kconfig/lxdialog/menubox.c
+++ b/scripts/kconfig/lxdialog/menubox.c
@@ -157,9 +157,9 @@ static void print_buttons(WINDOW * win, int height, int width, int selected)
 	int x = width / 2 - 16;
 	int y = height - 2;
 
-	print_button(win, "Select", y, x, selected == 0);
-	print_button(win, " Exit ", y, x + 12, selected == 1);
-	print_button(win, " Help ", y, x + 24, selected == 2);
+	print_button(win, gettext("Select"), y, x, selected == 0);
+	print_button(win, gettext(" Exit "), y, x + 12, selected == 1);
+	print_button(win, gettext(" Help "), y, x + 24, selected == 2);
 
 	wmove(win, y, x + 1 + 12 * selected);
 	wrefresh(win);
@@ -383,6 +383,10 @@ do_resize:
 		case 'n':
 		case 'm':
 		case '/':
+		case 'h':
+		case '?':
+		case 'z':
+		case '\n':
 			/* save scroll info */
 			*s_scroll = scroll;
 			delwin(menu);
@@ -390,8 +394,10 @@ do_resize:
 			item_set(scroll + choice);
 			item_set_selected(1);
 			switch (key) {
+			case 'h':
+			case '?':
+				return 2;
 			case 's':
-				return 3;
 			case 'y':
 				return 3;
 			case 'n':
@@ -402,18 +408,12 @@ do_resize:
 				return 6;
 			case '/':
 				return 7;
+			case 'z':
+				return 8;
+			case '\n':
+				return button;
 			}
 			return 0;
-		case 'h':
-		case '?':
-			button = 2;
-		case '\n':
-			*s_scroll = scroll;
-			delwin(menu);
-			delwin(dialog);
-			item_set(scroll + choice);
-			item_set_selected(1);
-			return button;
 		case 'e':
 		case 'x':
 			key = KEY_ESC;
diff --git a/scripts/kconfig/lxdialog/textbox.c b/scripts/kconfig/lxdialog/textbox.c
index fabfc1a..c704712 100644
--- a/scripts/kconfig/lxdialog/textbox.c
+++ b/scripts/kconfig/lxdialog/textbox.c
@@ -114,7 +114,7 @@ do_resize:
 
 	print_title(dialog, title, width);
 
-	print_button(dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
+	print_button(dialog, gettext(" Exit "), height - 2, width / 2 - 4, TRUE);
 	wnoutrefresh(dialog);
 	getyx(dialog, cur_y, cur_x);	/* Save cursor position */
 
diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c
index a1bddef..f2375ad 100644
--- a/scripts/kconfig/lxdialog/util.c
+++ b/scripts/kconfig/lxdialog/util.c
@@ -19,6 +19,8 @@
  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <stdarg.h>
+
 #include "dialog.h"
 
 struct dialog_info dlg;
@@ -266,31 +268,41 @@ void dialog_clear(void)
 /*
  * Do some initialization for dialog
  */
-void init_dialog(const char *backtitle)
+int init_dialog(const char *backtitle)
 {
-	dlg.backtitle = backtitle;
-	color_setup(getenv("MENUCONFIG_COLOR"));
-}
+	int height, width;
+
+	initscr();		/* Init curses */
+	getmaxyx(stdscr, height, width);
+	if (height < 19 || width < 80) {
+		endwin();
+		return -ERRDISPLAYTOOSMALL;
+	}
 
-void set_dialog_backtitle(const char *backtitle)
-{
 	dlg.backtitle = backtitle;
-}
+	color_setup(getenv("MENUCONFIG_COLOR"));
 
-void reset_dialog(void)
-{
-	initscr();		/* Init curses */
 	keypad(stdscr, TRUE);
 	cbreak();
 	noecho();
 	dialog_clear();
+
+	return 0;
+}
+
+void set_dialog_backtitle(const char *backtitle)
+{
+	dlg.backtitle = backtitle;
 }
 
 /*
  * End using dialog functions.
  */
-void end_dialog(void)
+void end_dialog(int x, int y)
 {
+	/* move cursor back to original position */
+	move(y, x);
+	refresh();
 	endwin();
 }
 
diff --git a/scripts/kconfig/lxdialog/yesno.c b/scripts/kconfig/lxdialog/yesno.c
index ee0a04e..4e6e809 100644
--- a/scripts/kconfig/lxdialog/yesno.c
+++ b/scripts/kconfig/lxdialog/yesno.c
@@ -29,8 +29,8 @@ static void print_buttons(WINDOW * dialog, int height, int width, int selected)
 	int x = width / 2 - 10;
 	int y = height - 2;
 
-	print_button(dialog, " Yes ", y, x, selected == 0);
-	print_button(dialog, "  No  ", y, x + 13, selected == 1);
+	print_button(dialog, gettext(" Yes "), y, x, selected == 0);
+	print_button(dialog, gettext("  No  "), y, x + 13, selected == 1);
 
 	wmove(dialog, y, x + 1 + 13 * selected);
 	wrefresh(dialog);
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 4f99c38..f658904 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -8,17 +8,13 @@
  * i18n, 2005, Arnaldo Carvalho de Melo <acme at conectiva.com.br>
  */
 
-#include <sys/ioctl.h>
-#include <sys/wait.h>
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
-#include <signal.h>
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
-#include <termios.h>
 #include <unistd.h>
 #include <locale.h>
 
@@ -29,15 +25,19 @@
 static const char mconf_readme[] = N_(
 "Overview\n"
 "--------\n"
-"Some barebox features may be built directly into barebox.\n"
+"Some barebox features may be built directly into the barebox.\n"
 "Some may be made into loadable runtime modules.  Some features\n"
 "may be completely removed altogether.  There are also certain\n"
 "barebox parameters which are not really features, but must be\n"
 "entered in as decimal or hexadecimal numbers or possibly text.\n"
 "\n"
-"Menu items beginning with [*], <M> or [ ] represent features\n"
-"configured to be built in, modularized or removed respectively.\n"
-"Pointed brackets <> represent module capable features.\n"
+"Menu items beginning with following braces represent features that\n"
+"  [ ] can be built in or removed\n"
+"  < > can be built in, modularized or removed\n"
+"  { } can be built in or modularized (selected by other feature)\n"
+"  - - are selected by other feature,\n"
+"while *, M or whitespace inside braces means to build in, build as\n"
+"a module or to exclude the feature respectively.\n"
 "\n"
 "To change any of these features, highlight it with the cursor\n"
 "keys and press <Y> to build it in, <M> to make it a module or\n"
@@ -67,13 +67,15 @@ static const char mconf_readme[] = N_(
 "             there is a delayed response which you may find annoying.\n"
 "\n"
 "   Also, the <TAB> and cursor keys will cycle between <Select>,\n"
-"   <Exit> and <Help>\n"
+"   <Exit> and <Help>.\n"
 "\n"
 "o  To get help with an item, use the cursor keys to highlight <Help>\n"
-"   and Press <ENTER>.\n"
+"   and press <ENTER>.\n"
 "\n"
 "   Shortcut: Press <H> or <?>.\n"
 "\n"
+"o  To toggle the display of hidden options, press <Z>.\n"
+"\n"
 "\n"
 "Radiolists  (Choice lists)\n"
 "-----------\n"
@@ -199,8 +201,6 @@ inputbox_instructions_string[] = N_(
 setmod_text[] = N_(
 	"This feature depends on another which has been configured as a module.\n"
 	"As a result, this feature will be built as a module."),
-nohelp_text[] = N_(
-	"There is no help available for this barebox option.\n"),
 load_config_text[] = N_(
 	"Enter the name of the configuration file you wish to load.  "
 	"Accept the name shown to restore the configuration you "
@@ -215,7 +215,7 @@ load_config_help[] = N_(
 	"to modify that configuration.\n"
 	"\n"
 	"If you are uncertain, then you have probably never used alternate\n"
-	"configuration files.  You should therefor leave this blank to abort.\n"),
+	"configuration files. You should therefore leave this blank to abort.\n"),
 save_config_text[] = N_(
 	"Enter a filename to which this configuration should be saved "
 	"as an alternate.  Leave blank to abort."),
@@ -271,11 +271,10 @@ search_help[] = N_(
 	"\n");
 
 static int indent;
-static struct termios ios_org;
-static int rows = 0, cols = 0;
 static struct menu *current_menu;
 static int child_count;
 static int single_menu_mode;
+static int show_all_options;
 
 static void conf(struct menu *menu);
 static void conf_choice(struct menu *menu);
@@ -286,113 +285,6 @@ static void show_textbox(const char *title, const char *text, int r, int c);
 static void show_helptext(const char *title, const char *text);
 static void show_help(struct menu *menu);
 
-static void init_wsize(void)
-{
-	struct winsize ws;
-	char *env;
-
-	if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) {
-		rows = ws.ws_row;
-		cols = ws.ws_col;
-	}
-
-	if (!rows) {
-		env = getenv("LINES");
-		if (env)
-			rows = atoi(env);
-		if (!rows)
-			rows = 24;
-	}
-	if (!cols) {
-		env = getenv("COLUMNS");
-		if (env)
-			cols = atoi(env);
-		if (!cols)
-			cols = 80;
-	}
-
-	if (rows < 19 || cols < 80) {
-		fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
-		fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
-		exit(1);
-	}
-
-	rows -= 4;
-	cols -= 5;
-}
-
-static void get_prompt_str(struct gstr *r, struct property *prop)
-{
-	int i, j;
-	struct menu *submenu[8], *menu;
-
-	str_printf(r, "Prompt: %s\n", prop->text);
-	str_printf(r, "  Defined at %s:%d\n", prop->menu->file->name,
-		prop->menu->lineno);
-	if (!expr_is_yes(prop->visible.expr)) {
-		str_append(r, "  Depends on: ");
-		expr_gstr_print(prop->visible.expr, r);
-		str_append(r, "\n");
-	}
-	menu = prop->menu->parent;
-	for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
-		submenu[i++] = menu;
-	if (i > 0) {
-		str_printf(r, "  Location:\n");
-		for (j = 4; --i >= 0; j += 2) {
-			menu = submenu[i];
-			str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
-			if (menu->sym) {
-				str_printf(r, " (%s [=%s])", menu->sym->name ?
-					menu->sym->name : "<choice>",
-					sym_get_string_value(menu->sym));
-			}
-			str_append(r, "\n");
-		}
-	}
-}
-
-static void get_symbol_str(struct gstr *r, struct symbol *sym)
-{
-	bool hit;
-	struct property *prop;
-
-	str_printf(r, "Symbol: %s [=%s]\n", sym->name,
-	                               sym_get_string_value(sym));
-	for_all_prompts(sym, prop)
-		get_prompt_str(r, prop);
-	hit = false;
-	for_all_properties(sym, prop, P_SELECT) {
-		if (!hit) {
-			str_append(r, "  Selects: ");
-			hit = true;
-		} else
-			str_printf(r, " && ");
-		expr_gstr_print(prop->expr, r);
-	}
-	if (hit)
-		str_append(r, "\n");
-	if (sym->rev_dep.expr) {
-		str_append(r, "  Selected by: ");
-		expr_gstr_print(sym->rev_dep.expr, r);
-		str_append(r, "\n");
-	}
-	str_append(r, "\n\n");
-}
-
-static struct gstr get_relations_str(struct symbol **sym_arr)
-{
-	struct symbol *sym;
-	struct gstr res = str_new();
-	int i;
-
-	for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
-		get_symbol_str(&res, sym);
-	if (!i)
-		str_append(&res, "No matches found.\n");
-	return res;
-}
-
 static char filename[PATH_MAX+1];
 static void set_config_filename(const char *config_filename)
 {
@@ -403,7 +295,7 @@ static void set_config_filename(const char *config_filename)
 	sym = sym_lookup("KERNELVERSION", 0);
 	sym_calc_value(sym);
 	size = snprintf(menu_backtitle, sizeof(menu_backtitle),
-	                _("%s - barebox v%s Configuration"),
+	                _("%s - Barebox v%s Configuration"),
 		        config_filename, sym_get_string_value(sym));
 	if (size >= sizeof(menu_backtitle))
 		menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
@@ -457,8 +349,16 @@ static void build_conf(struct menu *menu)
 	int type, tmp, doint = 2;
 	tristate val;
 	char ch;
-
-	if (!menu_is_visible(menu))
+	bool visible;
+
+	/*
+	 * note: menu_is_visible() has side effect that it will
+	 * recalc the value of the symbol.
+	 */
+	visible = menu_is_visible(menu);
+	if (show_all_options && !menu_has_prompt(menu))
+		return;
+	else if (!show_all_options && !visible)
 		return;
 
 	sym = menu->sym;
@@ -469,6 +369,7 @@ static void build_conf(struct menu *menu)
 			switch (prop->type) {
 			case P_MENU:
 				child_count++;
+				prompt = _(prompt);
 				if (single_menu_mode) {
 					item_make("%s%*c%s",
 						  menu->data ? "-->" : "++>",
@@ -481,10 +382,18 @@ static void build_conf(struct menu *menu)
 				if (single_menu_mode && menu->data)
 					goto conf_childs;
 				return;
+			case P_COMMENT:
+				if (prompt) {
+					child_count++;
+					item_make("   %*c*** %s ***", indent + 1, ' ', _(prompt));
+					item_set_tag(':');
+					item_set_data(menu);
+				}
+				break;
 			default:
 				if (prompt) {
 					child_count++;
-					item_make("---%*c%s", indent + 1, ' ', prompt);
+					item_make("---%*c%s", indent + 1, ' ', _(prompt));
 					item_set_tag(':');
 					item_set_data(menu);
 				}
@@ -528,10 +437,10 @@ static void build_conf(struct menu *menu)
 			item_set_data(menu);
 		}
 
-		item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+		item_add_str("%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
 		if (val == yes) {
 			if (def_menu) {
-				item_add_str(" (%s)", menu_get_prompt(def_menu));
+				item_add_str(" (%s)", _(menu_get_prompt(def_menu)));
 				item_add_str("  --->");
 				if (def_menu->list) {
 					indent += 2;
@@ -543,7 +452,7 @@ static void build_conf(struct menu *menu)
 		}
 	} else {
 		if (menu == current_menu) {
-			item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+			item_make("---%*c%s", indent + 1, ' ', _(menu_get_prompt(menu)));
 			item_set_tag(':');
 			item_set_data(menu);
 			goto conf_childs;
@@ -560,7 +469,7 @@ static void build_conf(struct menu *menu)
 				if (sym_is_changable(sym))
 					item_make("[%c]", val == no ? ' ' : '*');
 				else
-					item_make("---");
+					item_make("-%c-", val == no ? ' ' : '*');
 				item_set_tag('t');
 				item_set_data(menu);
 				break;
@@ -570,10 +479,13 @@ static void build_conf(struct menu *menu)
 				case mod: ch = 'M'; break;
 				default:  ch = ' '; break;
 				}
-				if (sym_is_changable(sym))
-					item_make("<%c>", ch);
-				else
-					item_make("---");
+				if (sym_is_changable(sym)) {
+					if (sym->rev_dep.tri == mod)
+						item_make("{%c}", ch);
+					else
+						item_make("<%c>", ch);
+				} else
+					item_make("-%c-", ch);
 				item_set_tag('t');
 				item_set_data(menu);
 				break;
@@ -583,17 +495,17 @@ static void build_conf(struct menu *menu)
 				tmp = indent - tmp + 4;
 				if (tmp < 0)
 					tmp = 0;
-				item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
+				item_add_str("%*c%s%s", tmp, ' ', _(menu_get_prompt(menu)),
 					     (sym_has_value(sym) || !sym_is_changable(sym)) ?
-					     "" : " (NEW)");
+					     "" : _(" (NEW)"));
 				item_set_tag('s');
 				item_set_data(menu);
 				goto conf_childs;
 			}
 		}
-		item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
+		item_add_str("%*c%s%s", indent + 1, ' ', _(menu_get_prompt(menu)),
 			  (sym_has_value(sym) || !sym_is_changable(sym)) ?
-			  "" : " (NEW)");
+			  "" : _(" (NEW)"));
 		if (menu->prompt->type == P_MENU) {
 			item_add_str("  --->");
 			return;
@@ -631,7 +543,7 @@ static void conf(struct menu *menu)
 			item_set_tag('S');
 		}
 		dialog_clear();
-		res = dialog_menu(prompt ? prompt : _("Main Menu"),
+		res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
 				  _(menu_instructions),
 				  active_menu, &s_scroll);
 		if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
@@ -678,7 +590,7 @@ static void conf(struct menu *menu)
 			if (sym)
 				show_help(submenu);
 			else
-				show_helptext("README", _(mconf_readme));
+				show_helptext(_("README"), _(mconf_readme));
 			break;
 		case 3:
 			if (item_is_tag('t')) {
@@ -705,6 +617,9 @@ static void conf(struct menu *menu)
 		case 7:
 			search_conf();
 			break;
+		case 8:
+			show_all_options = !show_all_options;
+			break;
 		}
 	}
 }
@@ -723,26 +638,17 @@ static void show_helptext(const char *title, const char *text)
 static void show_help(struct menu *menu)
 {
 	struct gstr help = str_new();
-	struct symbol *sym = menu->sym;
-
-	if (menu_has_help(menu))
-	{
-		if (sym->name) {
-			str_printf(&help, "CONFIG_%s:\n\n", sym->name);
-			str_append(&help, _(menu_get_help(menu)));
-			str_append(&help, "\n");
-		}
-	} else {
-		str_append(&help, nohelp_text);
-	}
-	get_symbol_str(&help, sym);
-	show_helptext(menu_get_prompt(menu), str_get(&help));
+
+	help.max_width = getmaxx(stdscr) - 10;
+	menu_get_ext_help(menu, &help);
+
+	show_helptext(_(menu_get_prompt(menu)), str_get(&help));
 	str_free(&help);
 }
 
 static void conf_choice(struct menu *menu)
 {
-	const char *prompt = menu_get_prompt(menu);
+	const char *prompt = _(menu_get_prompt(menu));
 	struct menu *child;
 	struct symbol *active;
 
@@ -756,7 +662,12 @@ static void conf_choice(struct menu *menu)
 		for (child = menu->list; child; child = child->next) {
 			if (!menu_is_visible(child))
 				continue;
-			item_make("%s", menu_get_prompt(child));
+			if (child->sym)
+				item_make("%s", _(menu_get_prompt(child)));
+			else {
+				item_make("*** %s ***", _(menu_get_prompt(child)));
+				item_set_tag(':');
+			}
 			item_set_data(child);
 			if (child->sym == active)
 				item_set_selected(1);
@@ -764,7 +675,7 @@ static void conf_choice(struct menu *menu)
 				item_set_tag('X');
 		}
 		dialog_clear();
-		res = dialog_checklist(prompt ? prompt : _("Main Menu"),
+		res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),
 					_(radiolist_instructions),
 					 15, 70, 6);
 		selected = item_activate_selected();
@@ -772,6 +683,9 @@ static void conf_choice(struct menu *menu)
 		case 0:
 			if (selected) {
 				child = item_data();
+				if (!child->sym)
+					break;
+
 				sym_set_tristate_value(child->sym, yes);
 			}
 			return;
@@ -797,7 +711,7 @@ static void conf_string(struct menu *menu)
 
 	while (1) {
 		int res;
-		char *heading;
+		const char *heading;
 
 		switch (sym_get_type(menu->sym)) {
 		case S_INT:
@@ -810,10 +724,10 @@ static void conf_string(struct menu *menu)
 			heading = _(inputbox_instructions_string);
 			break;
 		default:
-			heading = "Internal mconf error!";
+			heading = _("Internal mconf error!");
 		}
 		dialog_clear();
-		res = dialog_inputbox(prompt ? prompt : _("Main Menu"),
+		res = dialog_inputbox(prompt ? _(prompt) : _("Main Menu"),
 				      heading, 10, 75,
 				      sym_get_string_value(menu->sym));
 		switch (res) {
@@ -845,6 +759,7 @@ static void conf_load(void)
 				return;
 			if (!conf_read(dialog_input_result)) {
 				set_config_filename(dialog_input_result);
+				sym_set_change_count(1);
 				return;
 			}
 			show_textbox(NULL, _("File does not exist!"), 5, 38);
@@ -884,13 +799,9 @@ static void conf_save(void)
 	}
 }
 
-static void conf_cleanup(void)
-{
-	tcsetattr(1, TCSAFLUSH, &ios_org);
-}
-
 int main(int ac, char **av)
 {
+	int saved_x, saved_y;
 	char *mode;
 	int res;
 
@@ -907,11 +818,15 @@ int main(int ac, char **av)
 			single_menu_mode = 1;
 	}
 
-	tcgetattr(1, &ios_org);
-	atexit(conf_cleanup);
-	init_wsize();
-	reset_dialog();
-	init_dialog(NULL);
+	initscr();
+
+	getyx(stdscr, saved_y, saved_x);
+	if (init_dialog(NULL)) {
+		fprintf(stderr, N_("Your display is too small to run Menuconfig!\n"));
+		fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n"));
+		return 1;
+	}
+
 	set_config_filename(conf_get_configname());
 	do {
 		conf(&rootmenu);
@@ -925,7 +840,7 @@ int main(int ac, char **av)
 		else
 			res = -1;
 	} while (res == KEY_ESC);
-	end_dialog();
+	end_dialog(saved_x, saved_y);
 
 	switch (res) {
 	case 0:
@@ -938,8 +853,8 @@ int main(int ac, char **av)
 		}
 	case -1:
 		printf(_("\n\n"
-			"*** End of barebox configuration.\n"
-			"*** Execute 'make' to build barebox or try 'make help'."
+			"*** End of Linux barebox configuration.\n"
+			"*** Execute 'make' to build the barebox or try 'make help'."
 			"\n\n"));
 		break;
 	default:
@@ -950,3 +865,4 @@ int main(int ac, char **av)
 
 	return 0;
 }
+
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
index f9d0d91..5213527 100644
--- a/scripts/kconfig/menu.c
+++ b/scripts/kconfig/menu.c
@@ -9,13 +9,16 @@
 #define LKC_DIRECT_LINK
 #include "lkc.h"
 
+static const char nohelp_text[] = N_(
+	"There is no help available for this barebox option.\n");
+
 struct menu rootmenu;
 static struct menu **last_entry_ptr;
 
 struct file *file_list;
 struct file *current_file;
 
-static void menu_warn(struct menu *menu, const char *fmt, ...)
+void menu_warn(struct menu *menu, const char *fmt, ...)
 {
 	va_list ap;
 	va_start(ap, fmt);
@@ -35,7 +38,7 @@ static void prop_warn(struct property *prop, const char *fmt, ...)
 	va_end(ap);
 }
 
-void menu_init(void)
+void _menu_init(void)
 {
 	current_entry = current_menu = &rootmenu;
 	last_entry_ptr = &rootmenu.list;
@@ -55,6 +58,8 @@ void menu_add_entry(struct symbol *sym)
 	*last_entry_ptr = menu;
 	last_entry_ptr = &menu->next;
 	current_entry = menu;
+	if (sym)
+		menu_add_symbol(P_SYMBOL, sym, NULL);
 }
 
 void menu_end_entry(void)
@@ -74,7 +79,7 @@ void menu_end_menu(void)
 	current_menu = current_menu->parent;
 }
 
-struct expr *menu_check_dep(struct expr *e)
+static struct expr *menu_check_dep(struct expr *e)
 {
 	if (!e)
 		return e;
@@ -102,6 +107,7 @@ struct expr *menu_check_dep(struct expr *e)
 void menu_add_dep(struct expr *dep)
 {
 	current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
+	current_entry->dir_dep = current_entry->dep;
 }
 
 void menu_set_type(int type)
@@ -172,6 +178,9 @@ void menu_add_option(int token, char *arg)
 		else if (sym_defconfig_list != current_entry->sym)
 			zconf_error("trying to redefine defconfig symbol");
 		break;
+	case T_OPT_ENV:
+		prop_add_env(arg);
+		break;
 	}
 }
 
@@ -181,7 +190,7 @@ static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2)
 	       (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name));
 }
 
-void sym_check_prop(struct symbol *sym)
+static void sym_check_prop(struct symbol *sym)
 {
 	struct property *prop;
 	struct symbol *sym2;
@@ -191,7 +200,7 @@ void sym_check_prop(struct symbol *sym)
 			if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
 			    prop->expr->type != E_SYMBOL)
 				prop_warn(prop,
-				    "default for config symbol '%'"
+				    "default for config symbol '%s'"
 				    " must be a single symbol", sym->name);
 			break;
 		case P_SELECT:
@@ -200,12 +209,9 @@ void sym_check_prop(struct symbol *sym)
 				prop_warn(prop,
 				    "config symbol '%s' uses select, but is "
 				    "not boolean or tristate", sym->name);
-			else if (sym2->type == S_UNKNOWN)
-				prop_warn(prop,
-				    "'select' used by config symbol '%s' "
-				    "refers to undefined symbol '%s'",
-				    sym->name, sym2->name);
-			else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
+			else if (sym2->type != S_UNKNOWN &&
+			         sym2->type != S_BOOLEAN &&
+			         sym2->type != S_TRISTATE)
 				prop_warn(prop,
 				    "'%s' has wrong type. 'select' only "
 				    "accept arguments of boolean and "
@@ -235,15 +241,21 @@ void menu_finalize(struct menu *parent)
 	sym = parent->sym;
 	if (parent->list) {
 		if (sym && sym_is_choice(sym)) {
-			/* find the first choice value and find out choice type */
+			if (sym->type == S_UNKNOWN) {
+				/* find the first choice value to find out choice type */
+				current_entry = parent;
+				for (menu = parent->list; menu; menu = menu->next) {
+					if (menu->sym && menu->sym->type != S_UNKNOWN) {
+						menu_set_type(menu->sym->type);
+						break;
+					}
+				}
+			}
+			/* set the type of the remaining choice values */
 			for (menu = parent->list; menu; menu = menu->next) {
-				if (menu->sym) {
-					current_entry = parent;
-					menu_set_type(menu->sym->type);
-					current_entry = menu;
+				current_entry = menu;
+				if (menu->sym && menu->sym->type == S_UNKNOWN)
 					menu_set_type(sym->type);
-					break;
-				}
 			}
 			parentdep = expr_alloc_symbol(sym);
 		} else if (parent->prompt)
@@ -279,6 +291,10 @@ void menu_finalize(struct menu *parent)
 		for (menu = parent->list; menu; menu = menu->next)
 			menu_finalize(menu);
 	} else if (sym) {
+		/* ignore inherited dependencies for dir_dep */
+		sym->dir_dep.expr = expr_transform(expr_copy(parent->dir_dep));
+		sym->dir_dep.expr = expr_eliminate_dups(sym->dir_dep.expr);
+
 		basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
 		basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
 		basedep = expr_eliminate_dups(expr_transform(basedep));
@@ -311,27 +327,43 @@ void menu_finalize(struct menu *parent)
 		}
 	}
 	for (menu = parent->list; menu; menu = menu->next) {
-		if (sym && sym_is_choice(sym) && menu->sym) {
+		if (sym && sym_is_choice(sym) &&
+		    menu->sym && !sym_is_choice_value(menu->sym)) {
+			current_entry = menu;
 			menu->sym->flags |= SYMBOL_CHOICEVAL;
 			if (!menu->prompt)
 				menu_warn(menu, "choice value must have a prompt");
 			for (prop = menu->sym->prop; prop; prop = prop->next) {
-				if (prop->type == P_PROMPT && prop->menu != menu) {
-					prop_warn(prop, "choice values "
-					    "currently only support a "
-					    "single prompt");
-				}
 				if (prop->type == P_DEFAULT)
 					prop_warn(prop, "defaults for choice "
-					    "values not supported");
+						  "values not supported");
+				if (prop->menu == menu)
+					continue;
+				if (prop->type == P_PROMPT &&
+				    prop->menu->parent->sym != sym)
+					prop_warn(prop, "choice value used outside its choice group");
+			}
+			/* Non-tristate choice values of tristate choices must
+			 * depend on the choice being set to Y. The choice
+			 * values' dependencies were propagated to their
+			 * properties above, so the change here must be re-
+			 * propagated.
+			 */
+			if (sym->type == S_TRISTATE && menu->sym->type != S_TRISTATE) {
+				basedep = expr_alloc_comp(E_EQUAL, sym, &symbol_yes);
+				menu->dep = expr_alloc_and(basedep, menu->dep);
+				for (prop = menu->sym->prop; prop; prop = prop->next) {
+					if (prop->menu != menu)
+						continue;
+					prop->visible.expr = expr_alloc_and(expr_copy(basedep),
+									    prop->visible.expr);
+				}
 			}
-			current_entry = menu;
-			menu_set_type(sym->type);
 			menu_add_symbol(P_CHOICE, sym, NULL);
 			prop = sym_get_choice_prop(sym);
 			for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
 				;
-			*ep = expr_alloc_one(E_CHOICE, NULL);
+			*ep = expr_alloc_one(E_LIST, NULL);
 			(*ep)->right.sym = menu->sym;
 		}
 		if (menu->list && (!menu->prompt || !menu->prompt->text)) {
@@ -365,6 +397,13 @@ void menu_finalize(struct menu *parent)
 	}
 }
 
+bool menu_has_prompt(struct menu *menu)
+{
+	if (!menu->prompt)
+		return false;
+	return true;
+}
+
 bool menu_is_visible(struct menu *menu)
 {
 	struct menu *child;
@@ -373,6 +412,7 @@ bool menu_is_visible(struct menu *menu)
 
 	if (!menu->prompt)
 		return false;
+
 	sym = menu->sym;
 	if (sym) {
 		sym_calc_value(sym);
@@ -382,21 +422,27 @@ bool menu_is_visible(struct menu *menu)
 
 	if (visible != no)
 		return true;
+
 	if (!sym || sym_get_tristate_value(menu->sym) == no)
 		return false;
 
-	for (child = menu->list; child; child = child->next)
-		if (menu_is_visible(child))
+	for (child = menu->list; child; child = child->next) {
+		if (menu_is_visible(child)) {
+			if (sym)
+				sym->flags |= SYMBOL_DEF_USER;
 			return true;
+		}
+	}
+
 	return false;
 }
 
 const char *menu_get_prompt(struct menu *menu)
 {
 	if (menu->prompt)
-		return _(menu->prompt->text);
+		return menu->prompt->text;
 	else if (menu->sym)
-		return _(menu->sym->name);
+		return menu->sym->name;
 	return NULL;
 }
 
@@ -429,3 +475,104 @@ const char *menu_get_help(struct menu *menu)
 	else
 		return "";
 }
+
+static void get_prompt_str(struct gstr *r, struct property *prop)
+{
+	int i, j;
+	struct menu *submenu[8], *menu;
+
+	str_printf(r, _("Prompt: %s\n"), _(prop->text));
+	str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name,
+		prop->menu->lineno);
+	if (!expr_is_yes(prop->visible.expr)) {
+		str_append(r, _("  Depends on: "));
+		expr_gstr_print(prop->visible.expr, r);
+		str_append(r, "\n");
+	}
+	menu = prop->menu->parent;
+	for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
+		submenu[i++] = menu;
+	if (i > 0) {
+		str_printf(r, _("  Location:\n"));
+		for (j = 4; --i >= 0; j += 2) {
+			menu = submenu[i];
+			str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu)));
+			if (menu->sym) {
+				str_printf(r, " (%s [=%s])", menu->sym->name ?
+					menu->sym->name : _("<choice>"),
+					sym_get_string_value(menu->sym));
+			}
+			str_append(r, "\n");
+		}
+	}
+}
+
+void get_symbol_str(struct gstr *r, struct symbol *sym)
+{
+	bool hit;
+	struct property *prop;
+
+	if (sym && sym->name) {
+		str_printf(r, "Symbol: %s [=%s]\n", sym->name,
+			   sym_get_string_value(sym));
+		str_printf(r, "Type  : %s\n", sym_type_name(sym->type));
+		if (sym->type == S_INT || sym->type == S_HEX) {
+			prop = sym_get_range_prop(sym);
+			if (prop) {
+				str_printf(r, "Range : ");
+				expr_gstr_print(prop->expr, r);
+				str_append(r, "\n");
+			}
+		}
+	}
+	for_all_prompts(sym, prop)
+		get_prompt_str(r, prop);
+	hit = false;
+	for_all_properties(sym, prop, P_SELECT) {
+		if (!hit) {
+			str_append(r, "  Selects: ");
+			hit = true;
+		} else
+			str_printf(r, " && ");
+		expr_gstr_print(prop->expr, r);
+	}
+	if (hit)
+		str_append(r, "\n");
+	if (sym->rev_dep.expr) {
+		str_append(r, _("  Selected by: "));
+		expr_gstr_print(sym->rev_dep.expr, r);
+		str_append(r, "\n");
+	}
+	str_append(r, "\n\n");
+}
+
+struct gstr get_relations_str(struct symbol **sym_arr)
+{
+	struct symbol *sym;
+	struct gstr res = str_new();
+	int i;
+
+	for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
+		get_symbol_str(&res, sym);
+	if (!i)
+		str_append(&res, _("No matches found.\n"));
+	return res;
+}
+
+
+void menu_get_ext_help(struct menu *menu, struct gstr *help)
+{
+	struct symbol *sym = menu->sym;
+
+	if (menu_has_help(menu)) {
+		if (sym->name) {
+			str_printf(help, "CONFIG_%s:\n\n", sym->name);
+			str_append(help, _(menu_get_help(menu)));
+			str_append(help, "\n");
+		}
+	} else {
+		str_append(help, nohelp_text);
+	}
+	if (sym)
+		get_symbol_str(help, sym);
+}
diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c
new file mode 100644
index 0000000..b84948e
--- /dev/null
+++ b/scripts/kconfig/nconf.c
@@ -0,0 +1,1568 @@
+/*
+ * Copyright (C) 2008 Nir Tzachar <nir.tzachar at gmail.com?
+ * Released under the terms of the GNU GPL v2.0.
+ *
+ * Derived from menuconfig.
+ *
+ */
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+#include "nconf.h"
+
+static const char nconf_readme[] = N_(
+"Overview\n"
+"--------\n"
+"Some barebox features may be built directly into the barebox.\n"
+"Some may be made into loadable runtime modules.  Some features\n"
+"may be completely removed altogether.  There are also certain\n"
+"barebox parameters which are not really features, but must be\n"
+"entered in as decimal or hexadecimal numbers or possibly text.\n"
+"\n"
+"Menu items beginning with following braces represent features that\n"
+"  [ ] can be built in or removed\n"
+"  < > can be built in, modularized or removed\n"
+"  { } can be built in or modularized (selected by other feature)\n"
+"  - - are selected by other feature,\n"
+"  XXX cannot be selected. use Symbol Info to find out why,\n"
+"while *, M or whitespace inside braces means to build in, build as\n"
+"a module or to exclude the feature respectively.\n"
+"\n"
+"To change any of these features, highlight it with the cursor\n"
+"keys and press <Y> to build it in, <M> to make it a module or\n"
+"<N> to removed it.  You may also press the <Space Bar> to cycle\n"
+"through the available options (ie. Y->N->M->Y).\n"
+"\n"
+"Some additional keyboard hints:\n"
+"\n"
+"Menus\n"
+"----------\n"
+"o  Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
+"   you wish to change use <Enter> or <Space>. Goto submenu by \n"
+"   pressing <Enter> of <right-arrow>. Use <Esc> or <left-arrow> to go back.\n"
+"   Submenus are designated by \"--->\".\n"
+"\n"
+"   Shortcut: Press the option's highlighted letter (hotkey).\n"
+"             Pressing a hotkey more than once will sequence\n"
+"             through all visible items which use that hotkey.\n"
+"\n"
+"   You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
+"   unseen options into view.\n"
+"\n"
+"o  To exit a menu use the just press <ESC> <F5> <F8> or <left-arrow>.\n"
+"\n"
+"o  To get help with an item, press <F1>\n"
+"   Shortcut: Press <h> or <?>.\n"
+"\n"
+"\n"
+"Radiolists  (Choice lists)\n"
+"-----------\n"
+"o  Use the cursor keys to select the option you wish to set and press\n"
+"   <S> or the <SPACE BAR>.\n"
+"\n"
+"   Shortcut: Press the first letter of the option you wish to set then\n"
+"             press <S> or <SPACE BAR>.\n"
+"\n"
+"o  To see available help for the item, press <F1>\n"
+"   Shortcut: Press <H> or <?>.\n"
+"\n"
+"\n"
+"Data Entry\n"
+"-----------\n"
+"o  Enter the requested information and press <ENTER>\n"
+"   If you are entering hexadecimal values, it is not necessary to\n"
+"   add the '0x' prefix to the entry.\n"
+"\n"
+"o  For help, press <F1>.\n"
+"\n"
+"\n"
+"Text Box    (Help Window)\n"
+"--------\n"
+"o  Use the cursor keys to scroll up/down/left/right.  The VI editor\n"
+"   keys h,j,k,l function here as do <SPACE BAR> for those\n"
+"   who are familiar with less and lynx.\n"
+"\n"
+"o  Press <Enter>, <F1>, <F5>, <F7> or <Esc> to exit.\n"
+"\n"
+"\n"
+"Alternate Configuration Files\n"
+"-----------------------------\n"
+"nconfig supports the use of alternate configuration files for\n"
+"those who, for various reasons, find it necessary to switch\n"
+"between different barebox configurations.\n"
+"\n"
+"At the end of the main menu you will find two options.  One is\n"
+"for saving the current configuration to a file of your choosing.\n"
+"The other option is for loading a previously saved alternate\n"
+"configuration.\n"
+"\n"
+"Even if you don't use alternate configuration files, but you\n"
+"find during a nconfig session that you have completely messed\n"
+"up your settings, you may use the \"Load Alternate...\" option to\n"
+"restore your previously saved settings from \".config\" without\n"
+"restarting nconfig.\n"
+"\n"
+"Other information\n"
+"-----------------\n"
+"If you use nconfig in an XTERM window make sure you have your\n"
+"$TERM variable set to point to a xterm definition which supports color.\n"
+"Otherwise, nconfig will look rather bad.  nconfig will not\n"
+"display correctly in a RXVT window because rxvt displays only one\n"
+"intensity of color, bright.\n"
+"\n"
+"nconfig will display larger menus on screens or xterms which are\n"
+"set to display more than the standard 25 row by 80 column geometry.\n"
+"In order for this to work, the \"stty size\" command must be able to\n"
+"display the screen's current row and column geometry.  I STRONGLY\n"
+"RECOMMEND that you make sure you do NOT have the shell variables\n"
+"LINES and COLUMNS exported into your environment.  Some distributions\n"
+"export those variables via /etc/profile.  Some ncurses programs can\n"
+"become confused when those variables (LINES & COLUMNS) don't reflect\n"
+"the true screen size.\n"
+"\n"
+"Optional personality available\n"
+"------------------------------\n"
+"If you prefer to have all of the barebox options listed in a single\n"
+"menu, rather than the default multimenu hierarchy, run the nconfig\n"
+"with NCONFIG_MODE environment variable set to single_menu. Example:\n"
+"\n"
+"make NCONFIG_MODE=single_menu nconfig\n"
+"\n"
+"<Enter> will then unroll the appropriate category, or enfold it if it\n"
+"is already unrolled.\n"
+"\n"
+"Note that this mode can eventually be a little more CPU expensive\n"
+"(especially with a larger number of unrolled categories) than the\n"
+"default mode.\n"
+"\n"),
+menu_no_f_instructions[] = N_(
+" You do not have function keys support. Please follow the\n"
+" following instructions:\n"
+" Arrow keys navigate the menu.\n"
+" <Enter> or <right-arrow> selects submenus --->.\n"
+" Capital Letters are hotkeys.\n"
+" Pressing <Y> includes, <N> excludes, <M> modularizes features.\n"
+" Pressing SpaceBar toggles between the above options\n"
+" Press <Esc> or <left-arrow> to go back one menu, \n"
+" <?> or <h> for Help, </> for Search.\n"
+" <1> is interchangable with <F1>, <2> with <F2>, etc.\n"
+" Legend: [*] built-in  [ ] excluded  <M> module  < > module capable.\n"
+" <Esc> always leaves the current window\n"),
+menu_instructions[] = N_(
+" Arrow keys navigate the menu.\n"
+" <Enter> or <right-arrow> selects submenus --->.\n"
+" Capital Letters are hotkeys.\n"
+" Pressing <Y> includes, <N> excludes, <M> modularizes features.\n"
+" Pressing SpaceBar toggles between the above options\n"
+" Press <Esc>, <F3> or <left-arrow> to go back one menu, \n"
+" <?>, <F1> or <h> for Help, </> for Search.\n"
+" <1> is interchangable with <F1>, <2> with <F2>, etc.\n"
+" Legend: [*] built-in  [ ] excluded  <M> module  < > module capable.\n"
+" <Esc> always leaves the current window\n"),
+radiolist_instructions[] = N_(
+" Use the arrow keys to navigate this window or\n"
+" press the hotkey of the item you wish to select\n"
+" followed by the <SPACE BAR>.\n"
+" Press <?>, <F1> or <h> for additional information about this option.\n"),
+inputbox_instructions_int[] = N_(
+"Please enter a decimal value.\n"
+"Fractions will not be accepted.\n"
+"Press <RETURN> to accept, <ESC> to cancel."),
+inputbox_instructions_hex[] = N_(
+"Please enter a hexadecimal value.\n"
+"Press <RETURN> to accept, <ESC> to cancel."),
+inputbox_instructions_string[] = N_(
+"Please enter a string value.\n"
+"Press <RETURN> to accept, <ESC> to cancel."),
+setmod_text[] = N_(
+"This feature depends on another which\n"
+"has been configured as a module.\n"
+"As a result, this feature will be built as a module."),
+nohelp_text[] = N_(
+"There is no help available for this barebox option.\n"),
+load_config_text[] = N_(
+"Enter the name of the configuration file you wish to load.\n"
+"Accept the name shown to restore the configuration you\n"
+"last retrieved.  Leave blank to abort."),
+load_config_help[] = N_(
+"\n"
+"For various reasons, one may wish to keep several different barebox\n"
+"configurations available on a single machine.\n"
+"\n"
+"If you have saved a previous configuration in a file other than the\n"
+"barebox's default, entering the name of the file here will allow you\n"
+"to modify that configuration.\n"
+"\n"
+"If you are uncertain, then you have probably never used alternate\n"
+"configuration files.  You should therefor leave this blank to abort.\n"),
+save_config_text[] = N_(
+"Enter a filename to which this configuration should be saved\n"
+"as an alternate.  Leave blank to abort."),
+save_config_help[] = N_(
+"\n"
+"For various reasons, one may wish to keep different barebox\n"
+"configurations available on a single machine.\n"
+"\n"
+"Entering a file name here will allow you to later retrieve, modify\n"
+"and use the current configuration as an alternate to whatever\n"
+"configuration options you have selected at that time.\n"
+"\n"
+"If you are uncertain what all this means then you should probably\n"
+"leave this blank.\n"),
+search_help[] = N_(
+"\n"
+"Search for CONFIG_ symbols and display their relations.\n"
+"Regular expressions are allowed.\n"
+"Example: search for \"^FOO\"\n"
+"Result:\n"
+"-----------------------------------------------------------------\n"
+"Symbol: FOO [ = m]\n"
+"Prompt: Foo bus is used to drive the bar HW\n"
+"Defined at drivers/pci/Kconfig:47\n"
+"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
+"Location:\n"
+"  -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
+"    -> PCI support (PCI [ = y])\n"
+"      -> PCI access mode (<choice> [ = y])\n"
+"Selects: LIBCRC32\n"
+"Selected by: BAR\n"
+"-----------------------------------------------------------------\n"
+"o The line 'Prompt:' shows the text used in the menu structure for\n"
+"  this CONFIG_ symbol\n"
+"o The 'Defined at' line tell at what file / line number the symbol\n"
+"  is defined\n"
+"o The 'Depends on:' line tell what symbols needs to be defined for\n"
+"  this symbol to be visible in the menu (selectable)\n"
+"o The 'Location:' lines tell where in the menu structure this symbol\n"
+"  is located\n"
+"    A location followed by a [ = y] indicate that this is a selectable\n"
+"    menu item - and current value is displayed inside brackets.\n"
+"o The 'Selects:' line tell what symbol will be automatically\n"
+"  selected if this symbol is selected (y or m)\n"
+"o The 'Selected by' line tell what symbol has selected this symbol\n"
+"\n"
+"Only relevant lines are shown.\n"
+"\n\n"
+"Search examples:\n"
+"Examples: USB   = > find all CONFIG_ symbols containing USB\n"
+"          ^USB => find all CONFIG_ symbols starting with USB\n"
+"          USB$ => find all CONFIG_ symbols ending with USB\n"
+"\n");
+
+struct mitem {
+	char str[256];
+	char tag;
+	void *usrptr;
+	int is_hot;
+	int is_visible;
+};
+
+#define MAX_MENU_ITEMS 4096
+static int show_all_items;
+static int indent;
+static struct menu *current_menu;
+static int child_count;
+static int single_menu_mode;
+/* the window in which all information appears */
+static WINDOW *main_window;
+/* the largest size of the menu window */
+static int mwin_max_lines;
+static int mwin_max_cols;
+/* the window in which we show option buttons */
+static MENU *curses_menu;
+static ITEM *curses_menu_items[MAX_MENU_ITEMS];
+static struct mitem k_menu_items[MAX_MENU_ITEMS];
+static int items_num;
+static int global_exit;
+/* the currently selected button */
+const char *current_instructions = menu_instructions;
+/* this array is used to implement hot keys. it is updated in item_make and
+ * resetted in clean_items. It would be better to use a hash, but lets keep it
+ * simple... */
+#define MAX_SAME_KEY MAX_MENU_ITEMS
+struct {
+	int count;
+	int ptrs[MAX_MENU_ITEMS];
+} hotkeys[1<<(sizeof(char)*8)];
+
+static void conf(struct menu *menu);
+static void conf_choice(struct menu *menu);
+static void conf_string(struct menu *menu);
+static void conf_load(void);
+static void conf_save(void);
+static void show_help(struct menu *menu);
+static int do_exit(void);
+static void setup_windows(void);
+
+typedef void (*function_key_handler_t)(int *key, struct menu *menu);
+static void handle_f1(int *key, struct menu *current_item);
+static void handle_f2(int *key, struct menu *current_item);
+static void handle_f3(int *key, struct menu *current_item);
+static void handle_f4(int *key, struct menu *current_item);
+static void handle_f5(int *key, struct menu *current_item);
+static void handle_f6(int *key, struct menu *current_item);
+static void handle_f7(int *key, struct menu *current_item);
+static void handle_f8(int *key, struct menu *current_item);
+
+struct function_keys {
+	const char *key_str;
+	const char *func;
+	function_key key;
+	function_key_handler_t handler;
+};
+
+static const int function_keys_num = 8;
+struct function_keys function_keys[] = {
+	{
+		.key_str = "F1",
+		.func = "Help",
+		.key = F_HELP,
+		.handler = handle_f1,
+	},
+	{
+		.key_str = "F2",
+		.func = "Symbol Info",
+		.key = F_SYMBOL,
+		.handler = handle_f2,
+	},
+	{
+		.key_str = "F3",
+		.func = "Instructions",
+		.key = F_INSTS,
+		.handler = handle_f3,
+	},
+	{
+		.key_str = "F4",
+		.func = "Config",
+		.key = F_CONF,
+		.handler = handle_f4,
+	},
+	{
+		.key_str = "F5",
+		.func = "Back",
+		.key = F_BACK,
+		.handler = handle_f5,
+	},
+	{
+		.key_str = "F6",
+		.func = "Save",
+		.key = F_SAVE,
+		.handler = handle_f6,
+	},
+	{
+		.key_str = "F7",
+		.func = "Load",
+		.key = F_LOAD,
+		.handler = handle_f7,
+	},
+	{
+		.key_str = "F8",
+		.func = "Exit",
+		.key = F_EXIT,
+		.handler = handle_f8,
+	},
+};
+
+static void print_function_line(void)
+{
+	int i;
+	int offset = 1;
+	const int skip = 1;
+
+	for (i = 0; i < function_keys_num; i++) {
+		wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]);
+		mvwprintw(main_window, LINES-3, offset,
+				"%s",
+				function_keys[i].key_str);
+		wattrset(main_window, attributes[FUNCTION_TEXT]);
+		offset += strlen(function_keys[i].key_str);
+		mvwprintw(main_window, LINES-3,
+				offset, "%s",
+				function_keys[i].func);
+		offset += strlen(function_keys[i].func) + skip;
+	}
+	wattrset(main_window, attributes[NORMAL]);
+}
+
+/* help */
+static void handle_f1(int *key, struct menu *current_item)
+{
+	show_scroll_win(main_window,
+			_("README"), _(nconf_readme));
+	return;
+}
+
+/* symbole help */
+static void handle_f2(int *key, struct menu *current_item)
+{
+	show_help(current_item);
+	return;
+}
+
+/* instructions */
+static void handle_f3(int *key, struct menu *current_item)
+{
+	show_scroll_win(main_window,
+			_("Instructions"),
+			_(current_instructions));
+	return;
+}
+
+/* config */
+static void handle_f4(int *key, struct menu *current_item)
+{
+	int res = btn_dialog(main_window,
+			_("Show all symbols?"),
+			2,
+			"   <Show All>   ",
+			"<Don't show all>");
+	if (res == 0)
+		show_all_items = 1;
+	else if (res == 1)
+		show_all_items = 0;
+
+	return;
+}
+
+/* back */
+static void handle_f5(int *key, struct menu *current_item)
+{
+	*key = KEY_LEFT;
+	return;
+}
+
+/* save */
+static void handle_f6(int *key, struct menu *current_item)
+{
+	conf_save();
+	return;
+}
+
+/* load */
+static void handle_f7(int *key, struct menu *current_item)
+{
+	conf_load();
+	return;
+}
+
+/* exit */
+static void handle_f8(int *key, struct menu *current_item)
+{
+	do_exit();
+	return;
+}
+
+/* return != 0 to indicate the key was handles */
+static int process_special_keys(int *key, struct menu *menu)
+{
+	int i;
+
+	if (*key == KEY_RESIZE) {
+		setup_windows();
+		return 1;
+	}
+
+	for (i = 0; i < function_keys_num; i++) {
+		if (*key == KEY_F(function_keys[i].key) ||
+		    *key == '0' + function_keys[i].key){
+			function_keys[i].handler(key, menu);
+			return 1;
+		}
+	}
+
+	return 0;
+}
+
+static void clean_items(void)
+{
+	int i;
+	for (i = 0; curses_menu_items[i]; i++)
+		free_item(curses_menu_items[i]);
+	bzero(curses_menu_items, sizeof(curses_menu_items));
+	bzero(k_menu_items, sizeof(k_menu_items));
+	bzero(hotkeys, sizeof(hotkeys));
+	items_num = 0;
+}
+
+/* return the index of the next hot item, or -1 if no such item exists */
+static int get_next_hot(int c)
+{
+	static int hot_index;
+	static int hot_char;
+
+	if (c < 0 || c > 255 || hotkeys[c].count <= 0)
+		return -1;
+
+	if (hot_char == c) {
+		hot_index = (hot_index+1)%hotkeys[c].count;
+		return hotkeys[c].ptrs[hot_index];
+	} else {
+		hot_char = c;
+		hot_index = 0;
+		return hotkeys[c].ptrs[0];
+	}
+}
+
+/* can the char c be a hot key? no, if c is a common shortcut used elsewhere */
+static int canbhot(char c)
+{
+	c = tolower(c);
+	return isalnum(c) && c != 'y' && c != 'm' && c != 'h' &&
+		c != 'n' && c != '?';
+}
+
+/* check if str already contains a hot key. */
+static int is_hot(int index)
+{
+	return k_menu_items[index].is_hot;
+}
+
+/* find the first possible hot key, and mark it.
+ * index is the index of the item in the menu
+ * return 0 on success*/
+static int make_hot(char *dest, int len, const char *org, int index)
+{
+	int position = -1;
+	int i;
+	int tmp;
+	int c;
+	int org_len = strlen(org);
+
+	if (org == NULL || is_hot(index))
+		return 1;
+
+	/* make sure not to make hot keys out of markers.
+	 * find where to start looking for a hot key
+	 */
+	i = 0;
+	/* skip white space */
+	while (i < org_len && org[i] == ' ')
+		i++;
+	if (i == org_len)
+		return -1;
+	/* if encountering '(' or '<' or '[', find the match and look from there
+	 **/
+	if (org[i] == '[' || org[i] == '<' || org[i] == '(') {
+		i++;
+		for (; i < org_len; i++)
+			if (org[i] == ']' || org[i] == '>' || org[i] == ')')
+				break;
+	}
+	if (i == org_len)
+		return -1;
+	for (; i < org_len; i++) {
+		if (canbhot(org[i]) && org[i-1] != '<' && org[i-1] != '(') {
+			position = i;
+			break;
+		}
+	}
+	if (position == -1)
+		return 1;
+
+	/* ok, char at org[position] should be a hot key to this item */
+	c = tolower(org[position]);
+	tmp = hotkeys[c].count;
+	hotkeys[c].ptrs[tmp] = index;
+	hotkeys[c].count++;
+	/*
+	   snprintf(dest, len, "%.*s(%c)%s", position, org, org[position],
+	   &org[position+1]);
+	   */
+	/* make org[position] uppercase, and all leading letter small case */
+	strncpy(dest, org, len);
+	for (i = 0; i < position; i++)
+		dest[i] = tolower(dest[i]);
+	dest[position] = toupper(dest[position]);
+	k_menu_items[index].is_hot = 1;
+	return 0;
+}
+
+/* Make a new item. Add a hotkey mark in the first possible letter.
+ * As ncurses does not allow any attributes inside menue item, we mark the
+ * hot key as the first capitalized letter in the string */
+static void item_make(struct menu *menu, char tag, const char *fmt, ...)
+{
+	va_list ap;
+	char tmp_str[256];
+
+	if (items_num > MAX_MENU_ITEMS-1)
+		return;
+
+	bzero(&k_menu_items[items_num], sizeof(k_menu_items[0]));
+	k_menu_items[items_num].tag = tag;
+	k_menu_items[items_num].usrptr = menu;
+	if (menu != NULL)
+		k_menu_items[items_num].is_visible =
+			menu_is_visible(menu);
+	else
+		k_menu_items[items_num].is_visible = 1;
+
+	va_start(ap, fmt);
+	vsnprintf(tmp_str, sizeof(tmp_str), fmt, ap);
+	if (!k_menu_items[items_num].is_visible)
+		memcpy(tmp_str, "XXX", 3);
+	va_end(ap);
+	if (make_hot(
+		k_menu_items[items_num].str,
+		sizeof(k_menu_items[items_num].str), tmp_str, items_num) != 0)
+		strncpy(k_menu_items[items_num].str,
+			tmp_str,
+			sizeof(k_menu_items[items_num].str));
+
+	curses_menu_items[items_num] = new_item(
+			k_menu_items[items_num].str,
+			k_menu_items[items_num].str);
+	set_item_userptr(curses_menu_items[items_num],
+			&k_menu_items[items_num]);
+	/*
+	if (!k_menu_items[items_num].is_visible)
+		item_opts_off(curses_menu_items[items_num], O_SELECTABLE);
+	*/
+
+	items_num++;
+	curses_menu_items[items_num] = NULL;
+}
+
+/* very hackish. adds a string to the last item added */
+static void item_add_str(const char *fmt, ...)
+{
+	va_list ap;
+	int index = items_num-1;
+	char new_str[256];
+	char tmp_str[256];
+
+	if (index < 0)
+		return;
+
+	va_start(ap, fmt);
+	vsnprintf(new_str, sizeof(new_str), fmt, ap);
+	va_end(ap);
+	snprintf(tmp_str, sizeof(tmp_str), "%s%s",
+			k_menu_items[index].str, new_str);
+	if (make_hot(k_menu_items[index].str,
+			sizeof(k_menu_items[index].str), tmp_str, index) != 0)
+		strncpy(k_menu_items[index].str,
+			tmp_str,
+			sizeof(k_menu_items[index].str));
+
+	free_item(curses_menu_items[index]);
+	curses_menu_items[index] = new_item(
+			k_menu_items[index].str,
+			k_menu_items[index].str);
+	set_item_userptr(curses_menu_items[index],
+			&k_menu_items[index]);
+}
+
+/* get the tag of the currently selected item */
+static char item_tag(void)
+{
+	ITEM *cur;
+	struct mitem *mcur;
+
+	cur = current_item(curses_menu);
+	if (cur == NULL)
+		return 0;
+	mcur = (struct mitem *) item_userptr(cur);
+	return mcur->tag;
+}
+
+static int curses_item_index(void)
+{
+	return  item_index(current_item(curses_menu));
+}
+
+static void *item_data(void)
+{
+	ITEM *cur;
+	struct mitem *mcur;
+
+	cur = current_item(curses_menu);
+	mcur = (struct mitem *) item_userptr(cur);
+	return mcur->usrptr;
+
+}
+
+static int item_is_tag(char tag)
+{
+	return item_tag() == tag;
+}
+
+static char filename[PATH_MAX+1];
+static char menu_backtitle[PATH_MAX+128];
+static const char *set_config_filename(const char *config_filename)
+{
+	int size;
+	struct symbol *sym;
+
+	sym = sym_lookup("KERNELVERSION", 0);
+	sym_calc_value(sym);
+	size = snprintf(menu_backtitle, sizeof(menu_backtitle),
+			_("%s - Barebox v%s Configuration"),
+			config_filename, sym_get_string_value(sym));
+	if (size >= sizeof(menu_backtitle))
+		menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
+
+	size = snprintf(filename, sizeof(filename), "%s", config_filename);
+	if (size >= sizeof(filename))
+		filename[sizeof(filename)-1] = '\0';
+	return menu_backtitle;
+}
+
+/* command = 0 is supress, 1 is restore */
+static void supress_stdout(int command)
+{
+	static FILE *org_stdout;
+	static FILE *org_stderr;
+
+	if (command == 0) {
+		org_stdout = stdout;
+		org_stderr = stderr;
+		stdout = fopen("/dev/null", "a");
+		stderr = fopen("/dev/null", "a");
+	} else {
+		fclose(stdout);
+		fclose(stderr);
+		stdout = org_stdout;
+		stderr = org_stderr;
+	}
+}
+
+/* return = 0 means we are successful.
+ * -1 means go on doing what you were doing
+ */
+static int do_exit(void)
+{
+	int res;
+	if (!conf_get_changed()) {
+		global_exit = 1;
+		return 0;
+	}
+	res = btn_dialog(main_window,
+			_("Do you wish to save your "
+				"new barebox configuration?\n"
+				"<ESC> to cancel and resume nconfig."),
+			2,
+			"   <save>   ",
+			"<don't save>");
+	if (res == KEY_EXIT) {
+		global_exit = 0;
+		return -1;
+	}
+
+	/* if we got here, the user really wants to exit */
+	switch (res) {
+	case 0:
+		supress_stdout(0);
+		res = conf_write(filename);
+		supress_stdout(1);
+		if (res)
+			btn_dialog(
+				main_window,
+				_("Error during writing of the barebox "
+				  "configuration.\n"
+				  "Your barebox configuration "
+				  "changes were NOT saved."),
+				  1,
+				  "<OK>");
+		else {
+			char buf[1024];
+			snprintf(buf, 1024,
+				_("Configuration written to %s\n"
+				  "End of Linux barebox configuration.\n"
+				  "Execute 'make' to build the barebox or try"
+				  " 'make help'."), filename);
+			btn_dialog(
+				main_window,
+				buf,
+				1,
+				"<OK>");
+		}
+		break;
+	default:
+		btn_dialog(
+			main_window,
+			_("Your barebox configuration changes were NOT saved."),
+			1,
+			"<OK>");
+		break;
+	}
+	global_exit = 1;
+	return 0;
+}
+
+
+static void search_conf(void)
+{
+	struct symbol **sym_arr;
+	struct gstr res;
+	char dialog_input_result[100];
+	char *dialog_input;
+	int dres;
+again:
+	dres = dialog_inputbox(main_window,
+			_("Search Configuration Parameter"),
+			_("Enter CONFIG_ (sub)string to search for "
+				"(with or without \"CONFIG\")"),
+			"", dialog_input_result, 99);
+	switch (dres) {
+	case 0:
+		break;
+	case 1:
+		show_scroll_win(main_window,
+				_("Search Configuration"), search_help);
+		goto again;
+	default:
+		return;
+	}
+
+	/* strip CONFIG_ if necessary */
+	dialog_input = dialog_input_result;
+	if (strncasecmp(dialog_input_result, "CONFIG_", 7) == 0)
+		dialog_input += 7;
+
+	sym_arr = sym_re_search(dialog_input);
+	res = get_relations_str(sym_arr);
+	free(sym_arr);
+	show_scroll_win(main_window,
+			_("Search Results"), str_get(&res));
+	str_free(&res);
+}
+
+
+static void build_conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct menu *child;
+	int type, tmp, doint = 2;
+	tristate val;
+	char ch;
+
+	if (!menu || (!show_all_items && !menu_is_visible(menu)))
+		return;
+
+	sym = menu->sym;
+	prop = menu->prompt;
+	if (!sym) {
+		if (prop && menu != current_menu) {
+			const char *prompt = menu_get_prompt(menu);
+			enum prop_type ptype;
+			ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
+			switch (ptype) {
+			case P_MENU:
+				child_count++;
+				prompt = _(prompt);
+				if (single_menu_mode) {
+					item_make(menu, 'm',
+						"%s%*c%s",
+						menu->data ? "-->" : "++>",
+						indent + 1, ' ', prompt);
+				} else
+					item_make(menu, 'm',
+						"   %*c%s  --->",
+						indent + 1,
+						' ', prompt);
+
+				if (single_menu_mode && menu->data)
+					goto conf_childs;
+				return;
+			case P_COMMENT:
+				if (prompt) {
+					child_count++;
+					item_make(menu, ':',
+						"   %*c*** %s ***",
+						indent + 1, ' ',
+						_(prompt));
+				}
+				break;
+			default:
+				if (prompt) {
+					child_count++;
+					item_make(menu, ':', "---%*c%s",
+						indent + 1, ' ',
+						_(prompt));
+				}
+			}
+		} else
+			doint = 0;
+		goto conf_childs;
+	}
+
+	type = sym_get_type(sym);
+	if (sym_is_choice(sym)) {
+		struct symbol *def_sym = sym_get_choice_value(sym);
+		struct menu *def_menu = NULL;
+
+		child_count++;
+		for (child = menu->list; child; child = child->next) {
+			if (menu_is_visible(child) && child->sym == def_sym)
+				def_menu = child;
+		}
+
+		val = sym_get_tristate_value(sym);
+		if (sym_is_changable(sym)) {
+			switch (type) {
+			case S_BOOLEAN:
+				item_make(menu, 't', "[%c]",
+						val == no ? ' ' : '*');
+				break;
+			case S_TRISTATE:
+				switch (val) {
+				case yes:
+					ch = '*';
+					break;
+				case mod:
+					ch = 'M';
+					break;
+				default:
+					ch = ' ';
+					break;
+				}
+				item_make(menu, 't', "<%c>", ch);
+				break;
+			}
+		} else {
+			item_make(menu, def_menu ? 't' : ':', "   ");
+		}
+
+		item_add_str("%*c%s", indent + 1,
+				' ', _(menu_get_prompt(menu)));
+		if (val == yes) {
+			if (def_menu) {
+				item_add_str(" (%s)",
+					_(menu_get_prompt(def_menu)));
+				item_add_str("  --->");
+				if (def_menu->list) {
+					indent += 2;
+					build_conf(def_menu);
+					indent -= 2;
+				}
+			}
+			return;
+		}
+	} else {
+		if (menu == current_menu) {
+			item_make(menu, ':',
+				"---%*c%s", indent + 1,
+				' ', _(menu_get_prompt(menu)));
+			goto conf_childs;
+		}
+		child_count++;
+		val = sym_get_tristate_value(sym);
+		if (sym_is_choice_value(sym) && val == yes) {
+			item_make(menu, ':', "   ");
+		} else {
+			switch (type) {
+			case S_BOOLEAN:
+				if (sym_is_changable(sym))
+					item_make(menu, 't', "[%c]",
+						val == no ? ' ' : '*');
+				else
+					item_make(menu, 't', "-%c-",
+						val == no ? ' ' : '*');
+				break;
+			case S_TRISTATE:
+				switch (val) {
+				case yes:
+					ch = '*';
+					break;
+				case mod:
+					ch = 'M';
+					break;
+				default:
+					ch = ' ';
+					break;
+				}
+				if (sym_is_changable(sym)) {
+					if (sym->rev_dep.tri == mod)
+						item_make(menu,
+							't', "{%c}", ch);
+					else
+						item_make(menu,
+							't', "<%c>", ch);
+				} else
+					item_make(menu, 't', "-%c-", ch);
+				break;
+			default:
+				tmp = 2 + strlen(sym_get_string_value(sym));
+				item_make(menu, 's', "    (%s)",
+						sym_get_string_value(sym));
+				tmp = indent - tmp + 4;
+				if (tmp < 0)
+					tmp = 0;
+				item_add_str("%*c%s%s", tmp, ' ',
+						_(menu_get_prompt(menu)),
+						(sym_has_value(sym) ||
+						 !sym_is_changable(sym)) ? "" :
+						_(" (NEW)"));
+				goto conf_childs;
+			}
+		}
+		item_add_str("%*c%s%s", indent + 1, ' ',
+				_(menu_get_prompt(menu)),
+				(sym_has_value(sym) || !sym_is_changable(sym)) ?
+				"" : _(" (NEW)"));
+		if (menu->prompt && menu->prompt->type == P_MENU) {
+			item_add_str("  --->");
+			return;
+		}
+	}
+
+conf_childs:
+	indent += doint;
+	for (child = menu->list; child; child = child->next)
+		build_conf(child);
+	indent -= doint;
+}
+
+static void reset_menu(void)
+{
+	unpost_menu(curses_menu);
+	clean_items();
+}
+
+/* adjust the menu to show this item.
+ * prefer not to scroll the menu if possible*/
+static void center_item(int selected_index, int *last_top_row)
+{
+	int toprow;
+	int maxy, maxx;
+
+	scale_menu(curses_menu, &maxy, &maxx);
+	set_top_row(curses_menu, *last_top_row);
+	toprow = top_row(curses_menu);
+	if (selected_index >= toprow && selected_index < toprow+maxy) {
+		/* we can only move the selected item. no need to scroll */
+		set_current_item(curses_menu,
+				curses_menu_items[selected_index]);
+	} else {
+		toprow = max(selected_index-maxy/2, 0);
+		if (toprow >= item_count(curses_menu)-maxy)
+			toprow = item_count(curses_menu)-mwin_max_lines;
+		set_top_row(curses_menu, toprow);
+		set_current_item(curses_menu,
+				curses_menu_items[selected_index]);
+	}
+	*last_top_row = toprow;
+	post_menu(curses_menu);
+	refresh_all_windows(main_window);
+}
+
+/* this function assumes reset_menu has been called before */
+static void show_menu(const char *prompt, const char *instructions,
+		int selected_index, int *last_top_row)
+{
+	int maxx, maxy;
+	WINDOW *menu_window;
+
+	current_instructions = instructions;
+
+	clear();
+	wattrset(main_window, attributes[NORMAL]);
+	print_in_middle(stdscr, 1, 0, COLS,
+			menu_backtitle,
+			attributes[MAIN_HEADING]);
+
+	wattrset(main_window, attributes[MAIN_MENU_BOX]);
+	box(main_window, 0, 0);
+	wattrset(main_window, attributes[MAIN_MENU_HEADING]);
+	mvwprintw(main_window, 0, 3, " %s ", prompt);
+	wattrset(main_window, attributes[NORMAL]);
+
+	set_menu_items(curses_menu, curses_menu_items);
+
+	/* position the menu at the middle of the screen */
+	scale_menu(curses_menu, &maxy, &maxx);
+	maxx = min(maxx, mwin_max_cols-2);
+	maxy = mwin_max_lines-2;
+	menu_window = derwin(main_window,
+			maxy,
+			maxx,
+			2,
+			(mwin_max_cols-maxx)/2);
+	keypad(menu_window, TRUE);
+	set_menu_win(curses_menu, menu_window);
+	set_menu_sub(curses_menu, menu_window);
+
+	/* must reassert this after changing items, otherwise returns to a
+	 * default of 16
+	 */
+	set_menu_format(curses_menu, maxy, 1);
+	center_item(selected_index, last_top_row);
+	set_menu_format(curses_menu, maxy, 1);
+
+	print_function_line();
+
+	/* Post the menu */
+	post_menu(curses_menu);
+	refresh_all_windows(main_window);
+}
+
+
+static void conf(struct menu *menu)
+{
+	char pattern[256];
+	struct menu *submenu = 0;
+	const char *prompt = menu_get_prompt(menu);
+	struct symbol *sym;
+	struct menu *active_menu = NULL;
+	int res;
+	int current_index = 0;
+	int last_top_row = 0;
+
+	bzero(pattern, sizeof(pattern));
+
+	while (!global_exit) {
+		reset_menu();
+		current_menu = menu;
+		build_conf(menu);
+		if (!child_count)
+			break;
+
+		show_menu(prompt ? _(prompt) : _("Main Menu"),
+				_(menu_instructions),
+				current_index, &last_top_row);
+		keypad((menu_win(curses_menu)), TRUE);
+		while (!global_exit && (res = wgetch(menu_win(curses_menu)))) {
+			if (process_special_keys(&res,
+						(struct menu *) item_data()))
+				break;
+			switch (res) {
+			case KEY_DOWN:
+				menu_driver(curses_menu, REQ_DOWN_ITEM);
+				break;
+			case KEY_UP:
+				menu_driver(curses_menu, REQ_UP_ITEM);
+				break;
+			case KEY_NPAGE:
+				menu_driver(curses_menu, REQ_SCR_DPAGE);
+				break;
+			case KEY_PPAGE:
+				menu_driver(curses_menu, REQ_SCR_UPAGE);
+				break;
+			case KEY_HOME:
+				menu_driver(curses_menu, REQ_FIRST_ITEM);
+				break;
+			case KEY_END:
+				menu_driver(curses_menu, REQ_LAST_ITEM);
+				break;
+			case 'h':
+			case '?':
+				show_help((struct menu *) item_data());
+				break;
+			}
+			if (res == 10 || res == 27 ||
+				res == 32 || res == 'n' || res == 'y' ||
+				res == KEY_LEFT || res == KEY_RIGHT ||
+				res == 'm' || res == '/')
+				break;
+			else if (canbhot(res)) {
+				/* check for hot keys: */
+				int tmp = get_next_hot(res);
+				if (tmp != -1)
+					center_item(tmp, &last_top_row);
+			}
+			refresh_all_windows(main_window);
+		}
+
+		refresh_all_windows(main_window);
+		/* if ESC  or left*/
+		if (res == 27 || (menu != &rootmenu && res == KEY_LEFT))
+			break;
+
+		/* remember location in the menu */
+		last_top_row = top_row(curses_menu);
+		current_index = curses_item_index();
+
+		if (!item_tag())
+			continue;
+
+		submenu = (struct menu *) item_data();
+		active_menu = (struct menu *)item_data();
+		if (!submenu || !menu_is_visible(submenu))
+			continue;
+		if (submenu)
+			sym = submenu->sym;
+		else
+			sym = NULL;
+
+		switch (res) {
+		case ' ':
+			if (item_is_tag('t'))
+				sym_toggle_tristate_value(sym);
+			else if (item_is_tag('m'))
+				conf(submenu);
+			break;
+		case KEY_RIGHT:
+		case 10: /* ENTER WAS PRESSED */
+			switch (item_tag()) {
+			case 'm':
+				if (single_menu_mode)
+					submenu->data =
+						(void *) (long) !submenu->data;
+				else
+					conf(submenu);
+				break;
+			case 't':
+				if (sym_is_choice(sym) &&
+				    sym_get_tristate_value(sym) == yes)
+					conf_choice(submenu);
+				else if (submenu->prompt &&
+					 submenu->prompt->type == P_MENU)
+					conf(submenu);
+				else if (res == 10)
+					sym_toggle_tristate_value(sym);
+				break;
+			case 's':
+				conf_string(submenu);
+				break;
+			}
+			break;
+		case 'y':
+			if (item_is_tag('t')) {
+				if (sym_set_tristate_value(sym, yes))
+					break;
+				if (sym_set_tristate_value(sym, mod))
+					btn_dialog(main_window, setmod_text, 0);
+			}
+			break;
+		case 'n':
+			if (item_is_tag('t'))
+				sym_set_tristate_value(sym, no);
+			break;
+		case 'm':
+			if (item_is_tag('t'))
+				sym_set_tristate_value(sym, mod);
+			break;
+		case '/':
+			search_conf();
+			break;
+		}
+	}
+}
+
+static void show_help(struct menu *menu)
+{
+	struct gstr help = str_new();
+
+	if (menu && menu->sym && menu_has_help(menu)) {
+		if (menu->sym->name) {
+			str_printf(&help, "CONFIG_%s:\n\n", menu->sym->name);
+			str_append(&help, _(menu_get_help(menu)));
+			str_append(&help, "\n");
+			get_symbol_str(&help, menu->sym);
+		}
+	} else {
+		str_append(&help, nohelp_text);
+	}
+	show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help));
+	str_free(&help);
+}
+
+static void conf_choice(struct menu *menu)
+{
+	const char *prompt = _(menu_get_prompt(menu));
+	struct menu *child = 0;
+	struct symbol *active;
+	int selected_index = 0;
+	int last_top_row = 0;
+	int res, i = 0;
+
+	active = sym_get_choice_value(menu->sym);
+	/* this is mostly duplicated from the conf() function. */
+	while (!global_exit) {
+		reset_menu();
+
+		for (i = 0, child = menu->list; child; child = child->next) {
+			if (!show_all_items && !menu_is_visible(child))
+				continue;
+
+			if (child->sym == sym_get_choice_value(menu->sym))
+				item_make(child, ':', "<X> %s",
+						_(menu_get_prompt(child)));
+			else
+				item_make(child, ':', "    %s",
+						_(menu_get_prompt(child)));
+			if (child->sym == active){
+				last_top_row = top_row(curses_menu);
+				selected_index = i;
+			}
+			i++;
+		}
+		show_menu(prompt ? _(prompt) : _("Choice Menu"),
+				_(radiolist_instructions),
+				selected_index,
+				&last_top_row);
+		while (!global_exit && (res = wgetch(menu_win(curses_menu)))) {
+			if (process_special_keys(
+						&res,
+						(struct menu *) item_data()))
+				break;
+			switch (res) {
+			case KEY_DOWN:
+				menu_driver(curses_menu, REQ_DOWN_ITEM);
+				break;
+			case KEY_UP:
+				menu_driver(curses_menu, REQ_UP_ITEM);
+				break;
+			case KEY_NPAGE:
+				menu_driver(curses_menu, REQ_SCR_DPAGE);
+				break;
+			case KEY_PPAGE:
+				menu_driver(curses_menu, REQ_SCR_UPAGE);
+				break;
+			case KEY_HOME:
+				menu_driver(curses_menu, REQ_FIRST_ITEM);
+				break;
+			case KEY_END:
+				menu_driver(curses_menu, REQ_LAST_ITEM);
+				break;
+			case 'h':
+			case '?':
+				show_help((struct menu *) item_data());
+				break;
+			}
+			if (res == 10 || res == 27 || res == ' ' ||
+				res == KEY_LEFT)
+				break;
+			else if (canbhot(res)) {
+				/* check for hot keys: */
+				int tmp = get_next_hot(res);
+				if (tmp != -1)
+					center_item(tmp, &last_top_row);
+			}
+			refresh_all_windows(main_window);
+		}
+		/* if ESC or left */
+		if (res == 27 || res == KEY_LEFT)
+			break;
+
+		child = item_data();
+		if (!child || !menu_is_visible(child))
+			continue;
+		switch (res) {
+		case ' ':
+		case  10:
+		case KEY_RIGHT:
+			sym_set_tristate_value(child->sym, yes);
+			return;
+		case 'h':
+		case '?':
+			show_help(child);
+			active = child->sym;
+			break;
+		case KEY_EXIT:
+			return;
+		}
+	}
+}
+
+static void conf_string(struct menu *menu)
+{
+	const char *prompt = menu_get_prompt(menu);
+	char dialog_input_result[256];
+
+	while (1) {
+		int res;
+		const char *heading;
+
+		switch (sym_get_type(menu->sym)) {
+		case S_INT:
+			heading = _(inputbox_instructions_int);
+			break;
+		case S_HEX:
+			heading = _(inputbox_instructions_hex);
+			break;
+		case S_STRING:
+			heading = _(inputbox_instructions_string);
+			break;
+		default:
+			heading = _("Internal nconf error!");
+		}
+		res = dialog_inputbox(main_window,
+				prompt ? _(prompt) : _("Main Menu"),
+				heading,
+				sym_get_string_value(menu->sym),
+				dialog_input_result,
+				sizeof(dialog_input_result));
+		switch (res) {
+		case 0:
+			if (sym_set_string_value(menu->sym,
+						dialog_input_result))
+				return;
+			btn_dialog(main_window,
+				_("You have made an invalid entry."), 0);
+			break;
+		case 1:
+			show_help(menu);
+			break;
+		case KEY_EXIT:
+			return;
+		}
+	}
+}
+
+static void conf_load(void)
+{
+	char dialog_input_result[256];
+	while (1) {
+		int res;
+		res = dialog_inputbox(main_window,
+				NULL, load_config_text,
+				filename,
+				dialog_input_result,
+				sizeof(dialog_input_result));
+		switch (res) {
+		case 0:
+			if (!dialog_input_result[0])
+				return;
+			if (!conf_read(dialog_input_result)) {
+				set_config_filename(dialog_input_result);
+				sym_set_change_count(1);
+				return;
+			}
+			btn_dialog(main_window, _("File does not exist!"), 0);
+			break;
+		case 1:
+			show_scroll_win(main_window,
+					_("Load Alternate Configuration"),
+					load_config_help);
+			break;
+		case KEY_EXIT:
+			return;
+		}
+	}
+}
+
+static void conf_save(void)
+{
+	char dialog_input_result[256];
+	while (1) {
+		int res;
+		res = dialog_inputbox(main_window,
+				NULL, save_config_text,
+				filename,
+				dialog_input_result,
+				sizeof(dialog_input_result));
+		switch (res) {
+		case 0:
+			if (!dialog_input_result[0])
+				return;
+			supress_stdout(0);
+			res = conf_write(dialog_input_result);
+			supress_stdout(1);
+			if (!res) {
+				char buf[1024];
+				sprintf(buf, "%s %s",
+					_("configuration file saved to: "),
+					dialog_input_result);
+				btn_dialog(main_window,
+					   buf, 1, "<OK>");
+				set_config_filename(dialog_input_result);
+				return;
+			}
+			btn_dialog(main_window, _("Can't create file! "
+				"Probably a nonexistent directory."),
+				1, "<OK>");
+			break;
+		case 1:
+			show_scroll_win(main_window,
+				_("Save Alternate Configuration"),
+				save_config_help);
+			break;
+		case KEY_EXIT:
+			return;
+		}
+	}
+}
+
+void setup_windows(void)
+{
+	if (main_window != NULL)
+		delwin(main_window);
+
+	/* set up the menu and menu window */
+	main_window = newwin(LINES-2, COLS-2, 2, 1);
+	keypad(main_window, TRUE);
+	mwin_max_lines = LINES-6;
+	mwin_max_cols = COLS-6;
+
+	/* panels order is from bottom to top */
+	new_panel(main_window);
+}
+
+int main(int ac, char **av)
+{
+	char *mode;
+
+	setlocale(LC_ALL, "");
+	bindtextdomain(PACKAGE, LOCALEDIR);
+	textdomain(PACKAGE);
+
+	conf_parse(av[1]);
+	conf_read(NULL);
+
+	mode = getenv("NCONFIG_MODE");
+	if (mode) {
+		if (!strcasecmp(mode, "single_menu"))
+			single_menu_mode = 1;
+	}
+
+	/* Initialize curses */
+	initscr();
+	/* set color theme */
+	set_colors();
+
+	cbreak();
+	noecho();
+	keypad(stdscr, TRUE);
+	curs_set(0);
+
+	if (COLS < 75 || LINES < 20) {
+		endwin();
+		printf("Your terminal should have at "
+			"least 20 lines and 75 columns\n");
+		return 1;
+	}
+
+	notimeout(stdscr, FALSE);
+	ESCDELAY = 1;
+
+	/* set btns menu */
+	curses_menu = new_menu(curses_menu_items);
+	menu_opts_off(curses_menu, O_SHOWDESC);
+	menu_opts_off(curses_menu, O_SHOWMATCH);
+	menu_opts_on(curses_menu, O_ONEVALUE);
+	menu_opts_on(curses_menu, O_NONCYCLIC);
+	set_menu_mark(curses_menu, " ");
+	set_menu_fore(curses_menu, attributes[MAIN_MENU_FORE]);
+	set_menu_back(curses_menu, attributes[MAIN_MENU_BACK]);
+	set_menu_grey(curses_menu, attributes[MAIN_MENU_GREY]);
+
+	set_config_filename(conf_get_configname());
+	setup_windows();
+
+	/* check for KEY_FUNC(1) */
+	if (has_key(KEY_F(1)) == FALSE) {
+		show_scroll_win(main_window,
+				_("Instructions"),
+				_(menu_no_f_instructions));
+	}
+
+
+
+	/* do the work */
+	while (!global_exit) {
+		conf(&rootmenu);
+		if (!global_exit && do_exit() == 0)
+			break;
+	}
+	/* ok, we are done */
+	unpost_menu(curses_menu);
+	free_menu(curses_menu);
+	delwin(main_window);
+	clear();
+	refresh();
+	endwin();
+	return 0;
+}
+
diff --git a/scripts/kconfig/nconf.gui.c b/scripts/kconfig/nconf.gui.c
new file mode 100644
index 0000000..a9d9344
--- /dev/null
+++ b/scripts/kconfig/nconf.gui.c
@@ -0,0 +1,617 @@
+/*
+ * Copyright (C) 2008 Nir Tzachar <nir.tzachar at gmail.com?
+ * Released under the terms of the GNU GPL v2.0.
+ *
+ * Derived from menuconfig.
+ *
+ */
+#include "nconf.h"
+
+/* a list of all the different widgets we use */
+attributes_t attributes[ATTR_MAX+1] = {0};
+
+/* available colors:
+   COLOR_BLACK   0
+   COLOR_RED     1
+   COLOR_GREEN   2
+   COLOR_YELLOW  3
+   COLOR_BLUE    4
+   COLOR_MAGENTA 5
+   COLOR_CYAN    6
+   COLOR_WHITE   7
+   */
+static void set_normal_colors(void)
+{
+	init_pair(NORMAL, -1, -1);
+	init_pair(MAIN_HEADING, COLOR_MAGENTA, -1);
+
+	/* FORE is for the selected item */
+	init_pair(MAIN_MENU_FORE, -1, -1);
+	/* BACK for all the rest */
+	init_pair(MAIN_MENU_BACK, -1, -1);
+	init_pair(MAIN_MENU_GREY, -1, -1);
+	init_pair(MAIN_MENU_HEADING, COLOR_GREEN, -1);
+	init_pair(MAIN_MENU_BOX, COLOR_YELLOW, -1);
+
+	init_pair(SCROLLWIN_TEXT, -1, -1);
+	init_pair(SCROLLWIN_HEADING, COLOR_GREEN, -1);
+	init_pair(SCROLLWIN_BOX, COLOR_YELLOW, -1);
+
+	init_pair(DIALOG_TEXT, -1, -1);
+	init_pair(DIALOG_BOX, COLOR_YELLOW, -1);
+	init_pair(DIALOG_MENU_BACK, COLOR_YELLOW, -1);
+	init_pair(DIALOG_MENU_FORE, COLOR_RED, -1);
+
+	init_pair(INPUT_BOX, COLOR_YELLOW, -1);
+	init_pair(INPUT_HEADING, COLOR_GREEN, -1);
+	init_pair(INPUT_TEXT, -1, -1);
+	init_pair(INPUT_FIELD, -1, -1);
+
+	init_pair(FUNCTION_HIGHLIGHT, -1, -1);
+	init_pair(FUNCTION_TEXT, COLOR_BLUE, -1);
+}
+
+/* available attributes:
+   A_NORMAL        Normal display (no highlight)
+   A_STANDOUT      Best highlighting mode of the terminal.
+   A_UNDERLINE     Underlining
+   A_REVERSE       Reverse video
+   A_BLINK         Blinking
+   A_DIM           Half bright
+   A_BOLD          Extra bright or bold
+   A_PROTECT       Protected mode
+   A_INVIS         Invisible or blank mode
+   A_ALTCHARSET    Alternate character set
+   A_CHARTEXT      Bit-mask to extract a character
+   COLOR_PAIR(n)   Color-pair number n
+   */
+static void normal_color_theme(void)
+{
+	/* automatically add color... */
+#define mkattr(name, attr) do { \
+attributes[name] = attr | COLOR_PAIR(name); } while (0)
+	mkattr(NORMAL, NORMAL);
+	mkattr(MAIN_HEADING, A_BOLD | A_UNDERLINE);
+
+	mkattr(MAIN_MENU_FORE, A_REVERSE);
+	mkattr(MAIN_MENU_BACK, A_NORMAL);
+	mkattr(MAIN_MENU_GREY, A_NORMAL);
+	mkattr(MAIN_MENU_HEADING, A_BOLD);
+	mkattr(MAIN_MENU_BOX, A_NORMAL);
+
+	mkattr(SCROLLWIN_TEXT, A_NORMAL);
+	mkattr(SCROLLWIN_HEADING, A_BOLD);
+	mkattr(SCROLLWIN_BOX, A_BOLD);
+
+	mkattr(DIALOG_TEXT, A_BOLD);
+	mkattr(DIALOG_BOX, A_BOLD);
+	mkattr(DIALOG_MENU_FORE, A_STANDOUT);
+	mkattr(DIALOG_MENU_BACK, A_NORMAL);
+
+	mkattr(INPUT_BOX, A_NORMAL);
+	mkattr(INPUT_HEADING, A_BOLD);
+	mkattr(INPUT_TEXT, A_NORMAL);
+	mkattr(INPUT_FIELD, A_UNDERLINE);
+
+	mkattr(FUNCTION_HIGHLIGHT, A_BOLD);
+	mkattr(FUNCTION_TEXT, A_REVERSE);
+}
+
+static void no_colors_theme(void)
+{
+	/* automatically add highlight, no color */
+#define mkattrn(name, attr) { attributes[name] = attr; }
+
+	mkattrn(NORMAL, NORMAL);
+	mkattrn(MAIN_HEADING, A_BOLD | A_UNDERLINE);
+
+	mkattrn(MAIN_MENU_FORE, A_STANDOUT);
+	mkattrn(MAIN_MENU_BACK, A_NORMAL);
+	mkattrn(MAIN_MENU_GREY, A_NORMAL);
+	mkattrn(MAIN_MENU_HEADING, A_BOLD);
+	mkattrn(MAIN_MENU_BOX, A_NORMAL);
+
+	mkattrn(SCROLLWIN_TEXT, A_NORMAL);
+	mkattrn(SCROLLWIN_HEADING, A_BOLD);
+	mkattrn(SCROLLWIN_BOX, A_BOLD);
+
+	mkattrn(DIALOG_TEXT, A_NORMAL);
+	mkattrn(DIALOG_BOX, A_BOLD);
+	mkattrn(DIALOG_MENU_FORE, A_STANDOUT);
+	mkattrn(DIALOG_MENU_BACK, A_NORMAL);
+
+	mkattrn(INPUT_BOX, A_BOLD);
+	mkattrn(INPUT_HEADING, A_BOLD);
+	mkattrn(INPUT_TEXT, A_NORMAL);
+	mkattrn(INPUT_FIELD, A_UNDERLINE);
+
+	mkattrn(FUNCTION_HIGHLIGHT, A_BOLD);
+	mkattrn(FUNCTION_TEXT, A_REVERSE);
+}
+
+void set_colors()
+{
+	start_color();
+	use_default_colors();
+	set_normal_colors();
+	if (has_colors()) {
+		normal_color_theme();
+	} else {
+		/* give deafults */
+		no_colors_theme();
+	}
+}
+
+
+/* this changes the windows attributes !!! */
+void print_in_middle(WINDOW *win,
+		int starty,
+		int startx,
+		int width,
+		const char *string,
+		chtype color)
+{      int length, x, y;
+	float temp;
+
+
+	if (win == NULL)
+		win = stdscr;
+	getyx(win, y, x);
+	if (startx != 0)
+		x = startx;
+	if (starty != 0)
+		y = starty;
+	if (width == 0)
+		width = 80;
+
+	length = strlen(string);
+	temp = (width - length) / 2;
+	x = startx + (int)temp;
+	wattrset(win, color);
+	mvwprintw(win, y, x, "%s", string);
+	refresh();
+}
+
+int get_line_no(const char *text)
+{
+	int i;
+	int total = 1;
+
+	if (!text)
+		return 0;
+
+	for (i = 0; text[i] != '\0'; i++)
+		if (text[i] == '\n')
+			total++;
+	return total;
+}
+
+const char *get_line(const char *text, int line_no)
+{
+	int i;
+	int lines = 0;
+
+	if (!text)
+		return 0;
+
+	for (i = 0; text[i] != '\0' && lines < line_no; i++)
+		if (text[i] == '\n')
+			lines++;
+	return text+i;
+}
+
+int get_line_length(const char *line)
+{
+	int res = 0;
+	while (*line != '\0' && *line != '\n') {
+		line++;
+		res++;
+	}
+	return res;
+}
+
+/* print all lines to the window. */
+void fill_window(WINDOW *win, const char *text)
+{
+	int x, y;
+	int total_lines = get_line_no(text);
+	int i;
+
+	getmaxyx(win, y, x);
+	/* do not go over end of line */
+	total_lines = min(total_lines, y);
+	for (i = 0; i < total_lines; i++) {
+		char tmp[x+10];
+		const char *line = get_line(text, i);
+		int len = get_line_length(line);
+		strncpy(tmp, line, min(len, x));
+		tmp[len] = '\0';
+		mvwprintw(win, i, 0, "%s", tmp);
+	}
+}
+
+/* get the message, and buttons.
+ * each button must be a char*
+ * return the selected button
+ *
+ * this dialog is used for 2 different things:
+ * 1) show a text box, no buttons.
+ * 2) show a dialog, with horizontal buttons
+ */
+int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)
+{
+	va_list ap;
+	char *btn;
+	int btns_width = 0;
+	int msg_lines = 0;
+	int msg_width = 0;
+	int total_width;
+	int win_rows = 0;
+	WINDOW *win;
+	WINDOW *msg_win;
+	WINDOW *menu_win;
+	MENU *menu;
+	ITEM *btns[btn_num+1];
+	int i, x, y;
+	int res = -1;
+
+
+	va_start(ap, btn_num);
+	for (i = 0; i < btn_num; i++) {
+		btn = va_arg(ap, char *);
+		btns[i] = new_item(btn, "");
+		btns_width += strlen(btn)+1;
+	}
+	va_end(ap);
+	btns[btn_num] = NULL;
+
+	/* find the widest line of msg: */
+	msg_lines = get_line_no(msg);
+	for (i = 0; i < msg_lines; i++) {
+		const char *line = get_line(msg, i);
+		int len = get_line_length(line);
+		if (msg_width < len)
+			msg_width = len;
+	}
+
+	total_width = max(msg_width, btns_width);
+	/* place dialog in middle of screen */
+	y = (LINES-(msg_lines+4))/2;
+	x = (COLS-(total_width+4))/2;
+
+
+	/* create the windows */
+	if (btn_num > 0)
+		win_rows = msg_lines+4;
+	else
+		win_rows = msg_lines+2;
+
+	win = newwin(win_rows, total_width+4, y, x);
+	keypad(win, TRUE);
+	menu_win = derwin(win, 1, btns_width, win_rows-2,
+			1+(total_width+2-btns_width)/2);
+	menu = new_menu(btns);
+	msg_win = derwin(win, win_rows-2, msg_width, 1,
+			1+(total_width+2-msg_width)/2);
+
+	set_menu_fore(menu, attributes[DIALOG_MENU_FORE]);
+	set_menu_back(menu, attributes[DIALOG_MENU_BACK]);
+
+	wattrset(win, attributes[DIALOG_BOX]);
+	box(win, 0, 0);
+
+	/* print message */
+	wattrset(msg_win, attributes[DIALOG_TEXT]);
+	fill_window(msg_win, msg);
+
+	set_menu_win(menu, win);
+	set_menu_sub(menu, menu_win);
+	set_menu_format(menu, 1, btn_num);
+	menu_opts_off(menu, O_SHOWDESC);
+	menu_opts_off(menu, O_SHOWMATCH);
+	menu_opts_on(menu, O_ONEVALUE);
+	menu_opts_on(menu, O_NONCYCLIC);
+	set_menu_mark(menu, "");
+	post_menu(menu);
+
+
+	touchwin(win);
+	refresh_all_windows(main_window);
+	while ((res = wgetch(win))) {
+		switch (res) {
+		case KEY_LEFT:
+			menu_driver(menu, REQ_LEFT_ITEM);
+			break;
+		case KEY_RIGHT:
+			menu_driver(menu, REQ_RIGHT_ITEM);
+			break;
+		case 10: /* ENTER */
+		case 27: /* ESCAPE */
+		case ' ':
+		case KEY_F(F_BACK):
+		case KEY_F(F_EXIT):
+			break;
+		}
+		touchwin(win);
+		refresh_all_windows(main_window);
+
+		if (res == 10 || res == ' ') {
+			res = item_index(current_item(menu));
+			break;
+		} else if (res == 27 || res == KEY_F(F_BACK) ||
+				res == KEY_F(F_EXIT)) {
+			res = KEY_EXIT;
+			break;
+		}
+	}
+
+	unpost_menu(menu);
+	free_menu(menu);
+	for (i = 0; i < btn_num; i++)
+		free_item(btns[i]);
+
+	delwin(win);
+	return res;
+}
+
+int dialog_inputbox(WINDOW *main_window,
+		const char *title, const char *prompt,
+		const char *init, char *result, int result_len)
+{
+	int prompt_lines = 0;
+	int prompt_width = 0;
+	WINDOW *win;
+	WINDOW *prompt_win;
+	WINDOW *form_win;
+	PANEL *panel;
+	int i, x, y;
+	int res = -1;
+	int cursor_position = strlen(init);
+
+
+	/* find the widest line of msg: */
+	prompt_lines = get_line_no(prompt);
+	for (i = 0; i < prompt_lines; i++) {
+		const char *line = get_line(prompt, i);
+		int len = get_line_length(line);
+		prompt_width = max(prompt_width, len);
+	}
+
+	if (title)
+		prompt_width = max(prompt_width, strlen(title));
+
+	/* place dialog in middle of screen */
+	y = (LINES-(prompt_lines+4))/2;
+	x = (COLS-(prompt_width+4))/2;
+
+	strncpy(result, init, result_len);
+
+	/* create the windows */
+	win = newwin(prompt_lines+6, prompt_width+7, y, x);
+	prompt_win = derwin(win, prompt_lines+1, prompt_width, 2, 2);
+	form_win = derwin(win, 1, prompt_width, prompt_lines+3, 2);
+	keypad(form_win, TRUE);
+
+	wattrset(form_win, attributes[INPUT_FIELD]);
+
+	wattrset(win, attributes[INPUT_BOX]);
+	box(win, 0, 0);
+	wattrset(win, attributes[INPUT_HEADING]);
+	if (title)
+		mvwprintw(win, 0, 3, "%s", title);
+
+	/* print message */
+	wattrset(prompt_win, attributes[INPUT_TEXT]);
+	fill_window(prompt_win, prompt);
+
+	mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
+	mvwprintw(form_win, 0, 0, "%s", result);
+
+	/* create panels */
+	panel = new_panel(win);
+
+	/* show the cursor */
+	curs_set(1);
+
+	touchwin(win);
+	refresh_all_windows(main_window);
+	while ((res = wgetch(form_win))) {
+		int len = strlen(result);
+		switch (res) {
+		case 10: /* ENTER */
+		case 27: /* ESCAPE */
+		case KEY_F(F_HELP):
+		case KEY_F(F_EXIT):
+		case KEY_F(F_BACK):
+			break;
+		case 127:
+		case KEY_BACKSPACE:
+			if (cursor_position > 0) {
+				memmove(&result[cursor_position-1],
+						&result[cursor_position],
+						len-cursor_position+1);
+				cursor_position--;
+			}
+			break;
+		case KEY_DC:
+			if (cursor_position >= 0 && cursor_position < len) {
+				memmove(&result[cursor_position],
+						&result[cursor_position+1],
+						len-cursor_position+1);
+			}
+			break;
+		case KEY_UP:
+		case KEY_RIGHT:
+			if (cursor_position < len &&
+			    cursor_position < min(result_len, prompt_width))
+				cursor_position++;
+			break;
+		case KEY_DOWN:
+		case KEY_LEFT:
+			if (cursor_position > 0)
+				cursor_position--;
+			break;
+		default:
+			if ((isgraph(res) || isspace(res)) &&
+					len-2 < result_len) {
+				/* insert the char at the proper position */
+				memmove(&result[cursor_position+1],
+						&result[cursor_position],
+						len+1);
+				result[cursor_position] = res;
+				cursor_position++;
+			} else {
+				mvprintw(0, 0, "unknow key: %d\n", res);
+			}
+			break;
+		}
+		wmove(form_win, 0, 0);
+		wclrtoeol(form_win);
+		mvwprintw(form_win, 0, 0, "%*s", prompt_width, " ");
+		mvwprintw(form_win, 0, 0, "%s", result);
+		wmove(form_win, 0, cursor_position);
+		touchwin(win);
+		refresh_all_windows(main_window);
+
+		if (res == 10) {
+			res = 0;
+			break;
+		} else if (res == 27 || res == KEY_F(F_BACK) ||
+				res == KEY_F(F_EXIT)) {
+			res = KEY_EXIT;
+			break;
+		} else if (res == KEY_F(F_HELP)) {
+			res = 1;
+			break;
+		}
+	}
+
+	/* hide the cursor */
+	curs_set(0);
+	del_panel(panel);
+	delwin(prompt_win);
+	delwin(form_win);
+	delwin(win);
+	return res;
+}
+
+/* refresh all windows in the correct order */
+void refresh_all_windows(WINDOW *main_window)
+{
+	update_panels();
+	touchwin(main_window);
+	refresh();
+}
+
+/* layman's scrollable window... */
+void show_scroll_win(WINDOW *main_window,
+		const char *title,
+		const char *text)
+{
+	int res;
+	int total_lines = get_line_no(text);
+	int x, y;
+	int start_x = 0, start_y = 0;
+	int text_lines = 0, text_cols = 0;
+	int total_cols = 0;
+	int win_cols = 0;
+	int win_lines = 0;
+	int i = 0;
+	WINDOW *win;
+	WINDOW *pad;
+	PANEL *panel;
+
+	/* find the widest line of msg: */
+	total_lines = get_line_no(text);
+	for (i = 0; i < total_lines; i++) {
+		const char *line = get_line(text, i);
+		int len = get_line_length(line);
+		total_cols = max(total_cols, len+2);
+	}
+
+	/* create the pad */
+	pad = newpad(total_lines+10, total_cols+10);
+	wattrset(pad, attributes[SCROLLWIN_TEXT]);
+	fill_window(pad, text);
+
+	win_lines = min(total_lines+4, LINES-2);
+	win_cols = min(total_cols+2, COLS-2);
+	text_lines = max(win_lines-4, 0);
+	text_cols = max(win_cols-2, 0);
+
+	/* place window in middle of screen */
+	y = (LINES-win_lines)/2;
+	x = (COLS-win_cols)/2;
+
+	win = newwin(win_lines, win_cols, y, x);
+	keypad(win, TRUE);
+	/* show the help in the help window, and show the help panel */
+	wattrset(win, attributes[SCROLLWIN_BOX]);
+	box(win, 0, 0);
+	wattrset(win, attributes[SCROLLWIN_HEADING]);
+	mvwprintw(win, 0, 3, " %s ", title);
+	panel = new_panel(win);
+
+	/* handle scrolling */
+	do {
+
+		copywin(pad, win, start_y, start_x, 2, 2, text_lines,
+				text_cols, 0);
+		print_in_middle(win,
+				text_lines+2,
+				0,
+				text_cols,
+				"<OK>",
+				attributes[DIALOG_MENU_FORE]);
+		wrefresh(win);
+
+		res = wgetch(win);
+		switch (res) {
+		case KEY_NPAGE:
+		case ' ':
+			start_y += text_lines-2;
+			break;
+		case KEY_PPAGE:
+			start_y -= text_lines+2;
+			break;
+		case KEY_HOME:
+			start_y = 0;
+			break;
+		case KEY_END:
+			start_y = total_lines-text_lines;
+			break;
+		case KEY_DOWN:
+		case 'j':
+			start_y++;
+			break;
+		case KEY_UP:
+		case 'k':
+			start_y--;
+			break;
+		case KEY_LEFT:
+		case 'h':
+			start_x--;
+			break;
+		case KEY_RIGHT:
+		case 'l':
+			start_x++;
+			break;
+		}
+		if (res == 10 || res == 27 || res == 'q'
+		    || res == KEY_F(F_BACK) || res == KEY_F(F_EXIT)) {
+			break;
+		}
+		if (start_y < 0)
+			start_y = 0;
+		if (start_y >= total_lines-text_lines)
+			start_y = total_lines-text_lines;
+		if (start_x < 0)
+			start_x = 0;
+		if (start_x >= total_cols-text_cols)
+			start_x = total_cols-text_cols;
+	} while (res);
+
+	del_panel(panel);
+	delwin(win);
+	refresh_all_windows(main_window);
+}
diff --git a/scripts/kconfig/nconf.h b/scripts/kconfig/nconf.h
new file mode 100644
index 0000000..fb42966
--- /dev/null
+++ b/scripts/kconfig/nconf.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2008 Nir Tzachar <nir.tzachar at gmail.com?
+ * Released under the terms of the GNU GPL v2.0.
+ *
+ * Derived from menuconfig.
+ *
+ */
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <locale.h>
+#include <curses.h>
+#include <menu.h>
+#include <panel.h>
+#include <form.h>
+
+#include <stdio.h>
+#include <time.h>
+#include <sys/time.h>
+
+#include "ncurses.h"
+
+#define max(a, b) ({\
+		typeof(a) _a = a;\
+		typeof(b) _b = b;\
+		_a > _b ? _a : _b; })
+
+#define min(a, b) ({\
+		typeof(a) _a = a;\
+		typeof(b) _b = b;\
+		_a < _b ? _a : _b; })
+
+typedef enum {
+	NORMAL = 1,
+	MAIN_HEADING,
+	MAIN_MENU_BOX,
+	MAIN_MENU_FORE,
+	MAIN_MENU_BACK,
+	MAIN_MENU_GREY,
+	MAIN_MENU_HEADING,
+	SCROLLWIN_TEXT,
+	SCROLLWIN_HEADING,
+	SCROLLWIN_BOX,
+	DIALOG_TEXT,
+	DIALOG_MENU_FORE,
+	DIALOG_MENU_BACK,
+	DIALOG_BOX,
+	INPUT_BOX,
+	INPUT_HEADING,
+	INPUT_TEXT,
+	INPUT_FIELD,
+	FUNCTION_TEXT,
+	FUNCTION_HIGHLIGHT,
+	ATTR_MAX
+} attributes_t;
+extern attributes_t attributes[];
+
+typedef enum {
+	F_HELP = 1,
+	F_SYMBOL = 2,
+	F_INSTS = 3,
+	F_CONF = 4,
+	F_BACK = 5,
+	F_SAVE = 6,
+	F_LOAD = 7,
+	F_EXIT = 8
+} function_key;
+
+void set_colors(void);
+
+/* this changes the windows attributes !!! */
+void print_in_middle(WINDOW *win,
+		int starty,
+		int startx,
+		int width,
+		const char *string,
+		chtype color);
+int get_line_length(const char *line);
+int get_line_no(const char *text);
+const char *get_line(const char *text, int line_no);
+void fill_window(WINDOW *win, const char *text);
+int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...);
+int dialog_inputbox(WINDOW *main_window,
+		const char *title, const char *prompt,
+		const char *init, char *result, int result_len);
+void refresh_all_windows(WINDOW *main_window);
+void show_scroll_win(WINDOW *main_window,
+		const char *title,
+		const char *text);
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc
index e4eeb59..546c6bf 100644
--- a/scripts/kconfig/qconf.cc
+++ b/scripts/kconfig/qconf.cc
@@ -5,6 +5,7 @@
 
 #include <qapplication.h>
 #include <qmainwindow.h>
+#include <qdesktopwidget.h>
 #include <qtoolbar.h>
 #include <qlayout.h>
 #include <qvbox.h>
@@ -57,11 +58,10 @@ QValueList<int> ConfigSettings::readSizes(const QString& key, bool *ok)
 {
 	QValueList<int> result;
 	QStringList entryList = readListEntry(key, ok);
-	if (ok) {
-		QStringList::Iterator it;
-		for (it = entryList.begin(); it != entryList.end(); ++it)
-			result.push_back((*it).toInt());
-	}
+	QStringList::Iterator it;
+
+	for (it = entryList.begin(); it != entryList.end(); ++it)
+		result.push_back((*it).toInt());
 
 	return result;
 }
@@ -114,7 +114,7 @@ void ConfigItem::updateMenu(void)
 
 	sym = menu->sym;
 	prop = menu->prompt;
-	prompt = QString::fromLocal8Bit(menu_get_prompt(menu));
+	prompt = _(menu_get_prompt(menu));
 
 	if (prop) switch (prop->type) {
 	case P_MENU:
@@ -148,7 +148,7 @@ void ConfigItem::updateMenu(void)
 	case S_TRISTATE:
 		char ch;
 
-		if (!sym_is_changable(sym) && !list->showAll) {
+		if (!sym_is_changable(sym) && list->optMode == normalOpt) {
 			setPixmap(promptColIdx, 0);
 			setText(noColIdx, QString::null);
 			setText(modColIdx, QString::null);
@@ -208,7 +208,7 @@ void ConfigItem::updateMenu(void)
 		break;
 	}
 	if (!sym_has_value(sym) && visible)
-		prompt += " (NEW)";
+		prompt += _(" (NEW)");
 set_prompt:
 	setText(promptColIdx, prompt);
 }
@@ -297,10 +297,10 @@ void ConfigLineEdit::show(ConfigItem* i)
 void ConfigLineEdit::keyPressEvent(QKeyEvent* e)
 {
 	switch (e->key()) {
-	case Key_Escape:
+	case Qt::Key_Escape:
 		break;
-	case Key_Return:
-	case Key_Enter:
+	case Qt::Key_Return:
+	case Qt::Key_Enter:
 		sym_set_string_value(item->menu->sym, text().latin1());
 		parent()->updateList(item);
 		break;
@@ -319,7 +319,7 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
 	  symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
 	  choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
 	  menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback), voidPix(xpm_void),
-	  showAll(false), showName(false), showRange(false), showData(false),
+	  showName(false), showRange(false), showData(false), optMode(normalOpt),
 	  rootEntry(0), headerPopup(0)
 {
 	int i;
@@ -336,21 +336,32 @@ ConfigList::ConfigList(ConfigView* p, const char *name)
 
 	if (name) {
 		configSettings->beginGroup(name);
-		showAll = configSettings->readBoolEntry("/showAll", false);
 		showName = configSettings->readBoolEntry("/showName", false);
 		showRange = configSettings->readBoolEntry("/showRange", false);
 		showData = configSettings->readBoolEntry("/showData", false);
+		optMode = (enum optionMode)configSettings->readNumEntry("/optionMode", false);
 		configSettings->endGroup();
 		connect(configApp, SIGNAL(aboutToQuit()), SLOT(saveSettings()));
 	}
 
 	for (i = 0; i < colNr; i++)
 		colMap[i] = colRevMap[i] = -1;
-	addColumn(promptColIdx, "Option");
+	addColumn(promptColIdx, _("Option"));
 
 	reinit();
 }
 
+bool ConfigList::menuSkip(struct menu *menu)
+{
+	if (optMode == normalOpt && menu_is_visible(menu))
+		return false;
+	if (optMode == promptOpt && menu_has_prompt(menu))
+		return false;
+	if (optMode == allOpt)
+		return false;
+	return true;
+}
+
 void ConfigList::reinit(void)
 {
 	removeColumn(dataColIdx);
@@ -360,14 +371,14 @@ void ConfigList::reinit(void)
 	removeColumn(nameColIdx);
 
 	if (showName)
-		addColumn(nameColIdx, "Name");
+		addColumn(nameColIdx, _("Name"));
 	if (showRange) {
 		addColumn(noColIdx, "N");
 		addColumn(modColIdx, "M");
 		addColumn(yesColIdx, "Y");
 	}
 	if (showData)
-		addColumn(dataColIdx, "Value");
+		addColumn(dataColIdx, _("Value"));
 
 	updateListAll();
 }
@@ -379,7 +390,7 @@ void ConfigList::saveSettings(void)
 		configSettings->writeEntry("/showName", showName);
 		configSettings->writeEntry("/showRange", showRange);
 		configSettings->writeEntry("/showData", showData);
-		configSettings->writeEntry("/showAll", showAll);
+		configSettings->writeEntry("/optionMode", (int)optMode);
 		configSettings->endGroup();
 	}
 }
@@ -605,7 +616,7 @@ void ConfigList::updateMenuList(P* parent, struct menu* menu)
 		}
 
 		visible = menu_is_visible(child);
-		if (showAll || visible) {
+		if (!menuSkip(child)) {
 			if (!child->sym && !child->list && !child->prompt)
 				continue;
 			if (!item || item->menu != child)
@@ -639,7 +650,7 @@ void ConfigList::keyPressEvent(QKeyEvent* ev)
 	struct menu *menu;
 	enum prop_type type;
 
-	if (ev->key() == Key_Escape && mode != fullMode && mode != listMode) {
+	if (ev->key() == Qt::Key_Escape && mode != fullMode && mode != listMode) {
 		emit parentSelected();
 		ev->accept();
 		return;
@@ -652,8 +663,8 @@ void ConfigList::keyPressEvent(QKeyEvent* ev)
 	item = (ConfigItem*)i;
 
 	switch (ev->key()) {
-	case Key_Return:
-	case Key_Enter:
+	case Qt::Key_Return:
+	case Qt::Key_Enter:
 		if (item->goParent) {
 			emit parentSelected();
 			break;
@@ -667,16 +678,16 @@ void ConfigList::keyPressEvent(QKeyEvent* ev)
 			emit menuSelected(menu);
 			break;
 		}
-	case Key_Space:
+	case Qt::Key_Space:
 		changeValue(item);
 		break;
-	case Key_N:
+	case Qt::Key_N:
 		setValue(item, no);
 		break;
-	case Key_M:
+	case Qt::Key_M:
 		setValue(item, mod);
 		break;
-	case Key_Y:
+	case Qt::Key_Y:
 		setValue(item, yes);
 		break;
 	default:
@@ -803,7 +814,7 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
 			QAction *action;
 
 			headerPopup = new QPopupMenu(this);
-			action = new QAction(NULL, "Show Name", 0, this);
+			action = new QAction(NULL, _("Show Name"), 0, this);
 			  action->setToggleAction(TRUE);
 			  connect(action, SIGNAL(toggled(bool)),
 				  parent(), SLOT(setShowName(bool)));
@@ -811,7 +822,7 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
 				  action, SLOT(setOn(bool)));
 			  action->setOn(showName);
 			  action->addTo(headerPopup);
-			action = new QAction(NULL, "Show Range", 0, this);
+			action = new QAction(NULL, _("Show Range"), 0, this);
 			  action->setToggleAction(TRUE);
 			  connect(action, SIGNAL(toggled(bool)),
 				  parent(), SLOT(setShowRange(bool)));
@@ -819,7 +830,7 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
 				  action, SLOT(setOn(bool)));
 			  action->setOn(showRange);
 			  action->addTo(headerPopup);
-			action = new QAction(NULL, "Show Data", 0, this);
+			action = new QAction(NULL, _("Show Data"), 0, this);
 			  action->setToggleAction(TRUE);
 			  connect(action, SIGNAL(toggled(bool)),
 				  parent(), SLOT(setShowData(bool)));
@@ -834,7 +845,10 @@ void ConfigList::contextMenuEvent(QContextMenuEvent *e)
 		e->ignore();
 }
 
-ConfigView* ConfigView::viewList;
+ConfigView*ConfigView::viewList;
+QAction *ConfigView::showNormalAction;
+QAction *ConfigView::showAllAction;
+QAction *ConfigView::showPromptAction;
 
 ConfigView::ConfigView(QWidget* parent, const char *name)
 	: Parent(parent, name)
@@ -859,13 +873,16 @@ ConfigView::~ConfigView(void)
 	}
 }
 
-void ConfigView::setShowAll(bool b)
+void ConfigView::setOptionMode(QAction *act)
 {
-	if (list->showAll != b) {
-		list->showAll = b;
-		list->updateListAll();
-		emit showAllChanged(b);
-	}
+	if (act == showNormalAction)
+		list->optMode = normalOpt;
+	else if (act == showAllAction)
+		list->optMode = allOpt;
+	else
+		list->optMode = promptOpt;
+
+	list->updateListAll();
 }
 
 void ConfigView::setShowName(bool b)
@@ -920,7 +937,7 @@ void ConfigView::updateListAll(void)
 }
 
 ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
-	: Parent(parent, name), menu(0), sym(0)
+	: Parent(parent, name), sym(0), menu(0)
 {
 	if (name) {
 		configSettings->beginGroup(name);
@@ -963,34 +980,6 @@ void ConfigInfoView::setInfo(struct menu *m)
 		menuInfo();
 }
 
-void ConfigInfoView::setSource(const QString& name)
-{
-	const char *p = name.latin1();
-
-	menu = NULL;
-	sym = NULL;
-
-	switch (p[0]) {
-	case 'm':
-		struct menu *m;
-
-		if (sscanf(p, "m%p", &m) == 1 && menu != m) {
-			menu = m;
-			menuInfo();
-			emit menuSelected(menu);
-		}
-		break;
-	case 's':
-		struct symbol *s;
-
-		if (sscanf(p, "s%p", &s) == 1 && sym != s) {
-			sym = s;
-			symbolInfo();
-		}
-		break;
-	}
-}
-
 void ConfigInfoView::symbolInfo(void)
 {
 	QString str;
@@ -1041,7 +1030,10 @@ void ConfigInfoView::menuInfo(void)
 		if (showDebug())
 			debug = debug_info(sym);
 
-		help = print_filter(_(menu_get_help(menu)));
+		struct gstr help_gstr = str_new();
+		menu_get_ext_help(menu, &help_gstr);
+		help = print_filter(str_get(&help_gstr));
+		str_free(&help_gstr);
 	} else if (menu->prompt) {
 		head += "<big><b>";
 		head += print_filter(_(menu->prompt->text));
@@ -1083,7 +1075,11 @@ QString ConfigInfoView::debug_info(struct symbol *sym)
 			debug += "</a><br>";
 			break;
 		case P_DEFAULT:
-			debug += "default: ";
+		case P_SELECT:
+		case P_RANGE:
+		case P_ENV:
+			debug += prop_get_type_name(prop->type);
+			debug += ": ";
 			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
 			debug += "<br>";
 			break;
@@ -1094,16 +1090,6 @@ QString ConfigInfoView::debug_info(struct symbol *sym)
 				debug += "<br>";
 			}
 			break;
-		case P_SELECT:
-			debug += "select: ";
-			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
-			debug += "<br>";
-			break;
-		case P_RANGE:
-			debug += "range: ";
-			expr_print(prop->expr, expr_print_help, &debug, E_NONE);
-			debug += "<br>";
-			break;
 		default:
 			debug += "unknown property: ";
 			debug += prop_get_type_name(prop->type);
@@ -1167,7 +1153,7 @@ void ConfigInfoView::expr_print_help(void *data, struct symbol *sym, const char
 QPopupMenu* ConfigInfoView::createPopupMenu(const QPoint& pos)
 {
 	QPopupMenu* popup = Parent::createPopupMenu(pos);
-	QAction* action = new QAction(NULL,"Show Debug Info", 0, popup);
+	QAction* action = new QAction(NULL, _("Show Debug Info"), 0, popup);
 	  action->setToggleAction(TRUE);
 	  connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
 	  connect(this, SIGNAL(showDebugChanged(bool)), action, SLOT(setOn(bool)));
@@ -1189,18 +1175,18 @@ ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *nam
 
 	QVBoxLayout* layout1 = new QVBoxLayout(this, 11, 6);
 	QHBoxLayout* layout2 = new QHBoxLayout(0, 0, 6);
-	layout2->addWidget(new QLabel("Find:", this));
+	layout2->addWidget(new QLabel(_("Find:"), this));
 	editField = new QLineEdit(this);
 	connect(editField, SIGNAL(returnPressed()), SLOT(search()));
 	layout2->addWidget(editField);
-	searchButton = new QPushButton("Search", this);
+	searchButton = new QPushButton(_("Search"), this);
 	searchButton->setAutoDefault(FALSE);
 	connect(searchButton, SIGNAL(clicked()), SLOT(search()));
 	layout2->addWidget(searchButton);
 	layout1->addLayout(layout2);
 
 	split = new QSplitter(this);
-	split->setOrientation(QSplitter::Vertical);
+	split->setOrientation(Qt::Vertical);
 	list = new ConfigView(split, name);
 	list->list->mode = listMode;
 	info = new ConfigInfoView(split, name);
@@ -1274,8 +1260,12 @@ ConfigMainWindow::ConfigMainWindow(void)
 	QMenuBar* menu;
 	bool ok;
 	int x, y, width, height;
+	char title[256];
 
-	QWidget *d = configApp->desktop();
+	QDesktopWidget *d = configApp->desktop();
+	snprintf(title, sizeof(title), _("Barebox v%s Configuration"),
+		getenv("KERNELVERSION"));
+	setCaption(title);
 
 	width = configSettings->readNumEntry("/window width", d->width() - 64);
 	height = configSettings->readNumEntry("/window height", d->height() - 64);
@@ -1287,14 +1277,14 @@ ConfigMainWindow::ConfigMainWindow(void)
 		move(x, y);
 
 	split1 = new QSplitter(this);
-	split1->setOrientation(QSplitter::Horizontal);
+	split1->setOrientation(Qt::Horizontal);
 	setCentralWidget(split1);
 
 	menuView = new ConfigView(split1, "menu");
 	menuList = menuView->list;
 
 	split2 = new QSplitter(split1);
-	split2->setOrientation(QSplitter::Vertical);
+	split2->setOrientation(Qt::Vertical);
 
 	// create config tree
 	configView = new ConfigView(split2, "config");
@@ -1309,58 +1299,71 @@ ConfigMainWindow::ConfigMainWindow(void)
 	menu = menuBar();
 	toolBar = new QToolBar("Tools", this);
 
-	backAction = new QAction("Back", QPixmap(xpm_back), "Back", 0, this);
+	backAction = new QAction("Back", QPixmap(xpm_back), _("Back"), 0, this);
 	  connect(backAction, SIGNAL(activated()), SLOT(goBack()));
 	  backAction->setEnabled(FALSE);
-	QAction *quitAction = new QAction("Quit", "&Quit", CTRL+Key_Q, this);
+	QAction *quitAction = new QAction("Quit", _("&Quit"), Qt::CTRL + Qt::Key_Q, this);
 	  connect(quitAction, SIGNAL(activated()), SLOT(close()));
-	QAction *loadAction = new QAction("Load", QPixmap(xpm_load), "&Load", CTRL+Key_L, this);
+	QAction *loadAction = new QAction("Load", QPixmap(xpm_load), _("&Load"), Qt::CTRL + Qt::Key_L, this);
 	  connect(loadAction, SIGNAL(activated()), SLOT(loadConfig()));
-	saveAction = new QAction("Save", QPixmap(xpm_save), "&Save", CTRL+Key_S, this);
+	saveAction = new QAction("Save", QPixmap(xpm_save), _("&Save"), Qt::CTRL + Qt::Key_S, this);
 	  connect(saveAction, SIGNAL(activated()), SLOT(saveConfig()));
 	conf_set_changed_callback(conf_changed);
 	// Set saveAction's initial state
 	conf_changed();
-	QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this);
+	QAction *saveAsAction = new QAction("Save As...", _("Save &As..."), 0, this);
 	  connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs()));
-	QAction *searchAction = new QAction("Find", "&Find", CTRL+Key_F, this);
+	QAction *searchAction = new QAction("Find", _("&Find"), Qt::CTRL + Qt::Key_F, this);
 	  connect(searchAction, SIGNAL(activated()), SLOT(searchConfig()));
-	QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), "Split View", 0, this);
+	QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), _("Single View"), 0, this);
 	  connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView()));
-	QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), "Split View", 0, this);
+	QAction *splitViewAction = new QAction("Split View", QPixmap(xpm_split_view), _("Split View"), 0, this);
 	  connect(splitViewAction, SIGNAL(activated()), SLOT(showSplitView()));
-	QAction *fullViewAction = new QAction("Full View", QPixmap(xpm_tree_view), "Full View", 0, this);
+	QAction *fullViewAction = new QAction("Full View", QPixmap(xpm_tree_view), _("Full View"), 0, this);
 	  connect(fullViewAction, SIGNAL(activated()), SLOT(showFullView()));
 
-	QAction *showNameAction = new QAction(NULL, "Show Name", 0, this);
+	QAction *showNameAction = new QAction(NULL, _("Show Name"), 0, this);
 	  showNameAction->setToggleAction(TRUE);
 	  connect(showNameAction, SIGNAL(toggled(bool)), configView, SLOT(setShowName(bool)));
 	  connect(configView, SIGNAL(showNameChanged(bool)), showNameAction, SLOT(setOn(bool)));
 	  showNameAction->setOn(configView->showName());
-	QAction *showRangeAction = new QAction(NULL, "Show Range", 0, this);
+	QAction *showRangeAction = new QAction(NULL, _("Show Range"), 0, this);
 	  showRangeAction->setToggleAction(TRUE);
 	  connect(showRangeAction, SIGNAL(toggled(bool)), configView, SLOT(setShowRange(bool)));
 	  connect(configView, SIGNAL(showRangeChanged(bool)), showRangeAction, SLOT(setOn(bool)));
 	  showRangeAction->setOn(configList->showRange);
-	QAction *showDataAction = new QAction(NULL, "Show Data", 0, this);
+	QAction *showDataAction = new QAction(NULL, _("Show Data"), 0, this);
 	  showDataAction->setToggleAction(TRUE);
 	  connect(showDataAction, SIGNAL(toggled(bool)), configView, SLOT(setShowData(bool)));
 	  connect(configView, SIGNAL(showDataChanged(bool)), showDataAction, SLOT(setOn(bool)));
 	  showDataAction->setOn(configList->showData);
-	QAction *showAllAction = new QAction(NULL, "Show All Options", 0, this);
-	  showAllAction->setToggleAction(TRUE);
-	  connect(showAllAction, SIGNAL(toggled(bool)), configView, SLOT(setShowAll(bool)));
-	  connect(showAllAction, SIGNAL(toggled(bool)), menuView, SLOT(setShowAll(bool)));
-	  showAllAction->setOn(configList->showAll);
-	QAction *showDebugAction = new QAction(NULL, "Show Debug Info", 0, this);
+
+	QActionGroup *optGroup = new QActionGroup(this);
+	optGroup->setExclusive(TRUE);
+	connect(optGroup, SIGNAL(selected(QAction *)), configView,
+		SLOT(setOptionMode(QAction *)));
+	connect(optGroup, SIGNAL(selected(QAction *)), menuView,
+		SLOT(setOptionMode(QAction *)));
+
+	configView->showNormalAction = new QAction(NULL, _("Show Normal Options"), 0, optGroup);
+	configView->showAllAction = new QAction(NULL, _("Show All Options"), 0, optGroup);
+	configView->showPromptAction = new QAction(NULL, _("Show Prompt Options"), 0, optGroup);
+	configView->showNormalAction->setToggleAction(TRUE);
+	configView->showNormalAction->setOn(configList->optMode == normalOpt);
+	configView->showAllAction->setToggleAction(TRUE);
+	configView->showAllAction->setOn(configList->optMode == allOpt);
+	configView->showPromptAction->setToggleAction(TRUE);
+	configView->showPromptAction->setOn(configList->optMode == promptOpt);
+
+	QAction *showDebugAction = new QAction(NULL, _("Show Debug Info"), 0, this);
 	  showDebugAction->setToggleAction(TRUE);
 	  connect(showDebugAction, SIGNAL(toggled(bool)), helpText, SLOT(setShowDebug(bool)));
 	  connect(helpText, SIGNAL(showDebugChanged(bool)), showDebugAction, SLOT(setOn(bool)));
 	  showDebugAction->setOn(helpText->showDebug());
 
-	QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this);
+	QAction *showIntroAction = new QAction(NULL, _("Introduction"), 0, this);
 	  connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro()));
-	QAction *showAboutAction = new QAction(NULL, "About", 0, this);
+	QAction *showAboutAction = new QAction(NULL, _("About"), 0, this);
 	  connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout()));
 
 	// init tool bar
@@ -1375,7 +1378,7 @@ ConfigMainWindow::ConfigMainWindow(void)
 
 	// create config menu
 	QPopupMenu* config = new QPopupMenu(this);
-	menu->insertItem("&File", config);
+	menu->insertItem(_("&File"), config);
 	loadAction->addTo(config);
 	saveAction->addTo(config);
 	saveAsAction->addTo(config);
@@ -1384,23 +1387,24 @@ ConfigMainWindow::ConfigMainWindow(void)
 
 	// create edit menu
 	QPopupMenu* editMenu = new QPopupMenu(this);
-	menu->insertItem("&Edit", editMenu);
+	menu->insertItem(_("&Edit"), editMenu);
 	searchAction->addTo(editMenu);
 
 	// create options menu
 	QPopupMenu* optionMenu = new QPopupMenu(this);
-	menu->insertItem("&Option", optionMenu);
+	menu->insertItem(_("&Option"), optionMenu);
 	showNameAction->addTo(optionMenu);
 	showRangeAction->addTo(optionMenu);
 	showDataAction->addTo(optionMenu);
 	optionMenu->insertSeparator();
-	showAllAction->addTo(optionMenu);
+	optGroup->addTo(optionMenu);
+	optionMenu->insertSeparator();
 	showDebugAction->addTo(optionMenu);
 
 	// create help menu
 	QPopupMenu* helpMenu = new QPopupMenu(this);
 	menu->insertSeparator();
-	menu->insertItem("&Help", helpMenu);
+	menu->insertItem(_("&Help"), helpMenu);
 	showIntroAction->addTo(helpMenu);
 	showAboutAction->addTo(helpMenu);
 
@@ -1444,27 +1448,27 @@ ConfigMainWindow::ConfigMainWindow(void)
 
 void ConfigMainWindow::loadConfig(void)
 {
-	QString s = QFileDialog::getOpenFileName(".config", NULL, this);
+	QString s = QFileDialog::getOpenFileName(conf_get_configname(), NULL, this);
 	if (s.isNull())
 		return;
 	if (conf_read(QFile::encodeName(s)))
-		QMessageBox::information(this, "qconf", "Unable to load configuration!");
+		QMessageBox::information(this, "qconf", _("Unable to load configuration!"));
 	ConfigView::updateListAll();
 }
 
 void ConfigMainWindow::saveConfig(void)
 {
 	if (conf_write(NULL))
-		QMessageBox::information(this, "qconf", "Unable to save configuration!");
+		QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
 }
 
 void ConfigMainWindow::saveConfigAs(void)
 {
-	QString s = QFileDialog::getSaveFileName(".config", NULL, this);
+	QString s = QFileDialog::getSaveFileName(conf_get_configname(), NULL, this);
 	if (s.isNull())
 		return;
 	if (conf_write(QFile::encodeName(s)))
-		QMessageBox::information(this, "qconf", "Unable to save configuration!");
+		QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
 }
 
 void ConfigMainWindow::searchConfig(void)
@@ -1489,7 +1493,7 @@ void ConfigMainWindow::setMenuLink(struct menu *menu)
 	ConfigList* list = NULL;
 	ConfigItem* item;
 
-	if (!menu_is_visible(menu) && !configView->showAll())
+	if (configList->menuSkip(menu))
 		return;
 
 	switch (configList->mode) {
@@ -1521,6 +1525,8 @@ void ConfigMainWindow::setMenuLink(struct menu *menu)
 	case fullMode:
 		list = configList;
 		break;
+	default:
+		break;
 	}
 
 	if (list) {
@@ -1608,11 +1614,11 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
 		e->accept();
 		return;
 	}
-	QMessageBox mb("qconf", "Save configuration?", QMessageBox::Warning,
+	QMessageBox mb("qconf", _("Save configuration?"), QMessageBox::Warning,
 			QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape);
-	mb.setButtonText(QMessageBox::Yes, "&Save Changes");
-	mb.setButtonText(QMessageBox::No, "&Discard Changes");
-	mb.setButtonText(QMessageBox::Cancel, "Cancel Exit");
+	mb.setButtonText(QMessageBox::Yes, _("&Save Changes"));
+	mb.setButtonText(QMessageBox::No, _("&Discard Changes"));
+	mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
 	switch (mb.exec()) {
 	case QMessageBox::Yes:
 		conf_write(NULL);
@@ -1627,7 +1633,7 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
 
 void ConfigMainWindow::showIntro(void)
 {
-	static char str[] = "Welcome to the qconf graphical kernel configuration tool for Linux.\n\n"
+	static const QString str = _("Welcome to the qconf graphical barebox configuration tool for Linux.\n\n"
 		"For each option, a blank box indicates the feature is disabled, a check\n"
 		"indicates it is enabled, and a dot indicates that it is to be compiled\n"
 		"as a module.  Clicking on the box will cycle through the three states.\n\n"
@@ -1637,15 +1643,15 @@ void ConfigMainWindow::showIntro(void)
 		"options must be enabled to support the option you are interested in, you can\n"
 		"still view the help of a grayed-out option.\n\n"
 		"Toggling Show Debug Info under the Options menu will show the dependencies,\n"
-		"which you can then match by examining other options.\n\n";
+		"which you can then match by examining other options.\n\n");
 
 	QMessageBox::information(this, "qconf", str);
 }
 
 void ConfigMainWindow::showAbout(void)
 {
-	static char str[] = "qconf is Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>.\n\n"
-		"Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n";
+	static const QString str = _("qconf is Copyright (C) 2002 Roman Zippel <zippel at linux-m68k.org>.\n\n"
+		"Bug reports and feature request can also be entered at http://bugzilla.barebox.org/\n");
 
 	QMessageBox::information(this, "qconf", str);
 }
@@ -1670,6 +1676,9 @@ void ConfigMainWindow::saveSettings(void)
 	case fullMode :
 		entry = "full";
 		break;
+
+	default:
+		break;
 	}
 	configSettings->writeEntry("/listMode", entry);
 
@@ -1703,7 +1712,7 @@ static const char *progname;
 
 static void usage(void)
 {
-	printf("%s <config>\n", progname);
+	printf(_("%s <config>\n"), progname);
 	exit(0);
 }
 
diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h
index b3b5657..636a74b 100644
--- a/scripts/kconfig/qconf.h
+++ b/scripts/kconfig/qconf.h
@@ -44,6 +44,9 @@ enum colIdx {
 enum listMode {
 	singleMode, menuMode, symbolMode, fullMode, listMode
 };
+enum optionMode {
+	normalOpt = 0, allOpt, promptOpt
+};
 
 class ConfigList : public QListView {
 	Q_OBJECT
@@ -115,6 +118,8 @@ public:
 	void setAllOpen(bool open);
 	void setParentMenu(void);
 
+	bool menuSkip(struct menu *);
+
 	template <class P>
 	void updateMenuList(P*, struct menu*);
 
@@ -124,8 +129,9 @@ public:
 	QPixmap choiceYesPix, choiceNoPix;
 	QPixmap menuPix, menuInvPix, menuBackPix, voidPix;
 
-	bool showAll, showName, showRange, showData;
+	bool showName, showRange, showData;
 	enum listMode mode;
+	enum optionMode optMode;
 	struct menu *rootEntry;
 	QColorGroup disabledColorGroup;
 	QColorGroup inactivedColorGroup;
@@ -222,17 +228,15 @@ public:
 	static void updateList(ConfigItem* item);
 	static void updateListAll(void);
 
-	bool showAll(void) const { return list->showAll; }
 	bool showName(void) const { return list->showName; }
 	bool showRange(void) const { return list->showRange; }
 	bool showData(void) const { return list->showData; }
 public slots:
-	void setShowAll(bool);
 	void setShowName(bool);
 	void setShowRange(bool);
 	void setShowData(bool);
+	void setOptionMode(QAction *);
 signals:
-	void showAllChanged(bool);
 	void showNameChanged(bool);
 	void showRangeChanged(bool);
 	void showDataChanged(bool);
@@ -242,6 +246,10 @@ public:
 
 	static ConfigView* viewList;
 	ConfigView* nextView;
+
+	static QAction *showNormalAction;
+	static QAction *showAllAction;
+	static QAction *showPromptAction;
 };
 
 class ConfigInfoView : public QTextBrowser {
@@ -254,7 +262,6 @@ public:
 public slots:
 	void setInfo(struct menu *menu);
 	void saveSettings(void);
-	void setSource(const QString& name);
 	void setShowDebug(bool);
 
 signals:
diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl
new file mode 100644
index 0000000..bf941fa
--- /dev/null
+++ b/scripts/kconfig/streamline_config.pl
@@ -0,0 +1,422 @@
+#!/usr/bin/perl -w
+#
+# Copywrite 2005-2009 - Steven Rostedt
+# Licensed under the terms of the GNU GPL License version 2
+#
+#  It's simple enough to figure out how this works.
+#  If not, then you can ask me at stripconfig at goodmis.org
+#
+# What it does?
+#
+#   If you have installed a Linux barebox from a distribution
+#   that turns on way too many modules than you need, and
+#   you only want the modules you use, then this program
+#   is perfect for you.
+#
+#   It gives you the ability to turn off all the modules that are
+#   not loaded on your system.
+#
+# Howto:
+#
+#  1. Boot up the barebox that you want to stream line the config on.
+#  2. Change directory to the directory holding the source of the
+#       barebox that you just booted.
+#  3. Copy the configuraton file to this directory as .config
+#  4. Have all your devices that you need modules for connected and
+#      operational (make sure that their corresponding modules are loaded)
+#  5. Run this script redirecting the output to some other file
+#       like config_strip.
+#  6. Back up your old config (if you want too).
+#  7. copy the config_strip file to .config
+#  8. Run "make oldconfig"
+#
+#  Now your barebox is ready to be built with only the modules that
+#  are loaded.
+#
+# Here's what I did with my Debian distribution.
+#
+#    cd /usr/src/linux-2.6.10
+#    cp /boot/config-2.6.10-1-686-smp .config
+#    ~/bin/streamline_config > config_strip
+#    mv .config config_sav
+#    mv config_strip .config
+#    make oldconfig
+#
+my $config = ".config";
+
+my $uname = `uname -r`;
+chomp $uname;
+
+my @searchconfigs = (
+	{
+	    "file" => ".config",
+	    "exec" => "cat",
+	},
+	{
+	    "file" => "/proc/config.gz",
+	    "exec" => "zcat",
+	},
+	{
+	    "file" => "/boot/config-$uname",
+	    "exec" => "cat",
+	},
+	{
+	    "file" => "/boot/vmlinuz-$uname",
+	    "exec" => "scripts/extract-ikconfig",
+	    "test" => "scripts/extract-ikconfig",
+	},
+	{
+	    "file" => "vmlinux",
+	    "exec" => "scripts/extract-ikconfig",
+	    "test" => "scripts/extract-ikconfig",
+	},
+	{
+	    "file" => "/lib/modules/$uname/barebox/barebox/configs.ko",
+	    "exec" => "scripts/extract-ikconfig",
+	    "test" => "scripts/extract-ikconfig",
+	},
+	{
+	    "file" => "barebox/configs.ko",
+	    "exec" => "scripts/extract-ikconfig",
+	    "test" => "scripts/extract-ikconfig",
+	},
+	{
+	    "file" => "barebox/configs.o",
+	    "exec" => "scripts/extract-ikconfig",
+	    "test" => "scripts/extract-ikconfig",
+	},
+);
+
+sub find_config {
+    foreach my $conf (@searchconfigs) {
+	my $file = $conf->{"file"};
+
+	next if ( ! -f "$file");
+
+	if (defined($conf->{"test"})) {
+	    `$conf->{"test"} $conf->{"file"} 2>/dev/null`;
+	    next if ($?);
+	}
+
+	my $exec = $conf->{"exec"};
+
+	print STDERR "using config: '$file'\n";
+
+	open(CIN, "$exec $file |") || die "Failed to run $exec $file";
+	return;
+    }
+    die "No config file found";
+}
+
+find_config;
+
+# Get the build source and top level Kconfig file (passed in)
+my $ksource = $ARGV[0];
+my $kconfig = $ARGV[1];
+my $lsmod_file = $ARGV[2];
+
+my @makefiles = `find $ksource -name Makefile 2>/dev/null`;
+chomp @makefiles;
+
+my %depends;
+my %selects;
+my %prompts;
+my %objects;
+my $var;
+my $cont = 0;
+my $iflevel = 0;
+my @ifdeps;
+
+# prevent recursion
+my %read_kconfigs;
+
+sub read_kconfig {
+    my ($kconfig) = @_;
+
+    my $state = "NONE";
+    my $config;
+    my @kconfigs;
+
+    open(KIN, "$ksource/$kconfig") || die "Can't open $kconfig";
+    while (<KIN>) {
+	chomp;
+
+	# collect any Kconfig sources
+	if (/^source\s*"(.*)"/) {
+	    $kconfigs[$#kconfigs+1] = $1;
+	}
+
+	# configs found
+	if (/^\s*config\s+(\S+)\s*$/) {
+	    $state = "NEW";
+	    $config = $1;
+
+	    for (my $i = 0; $i < $iflevel; $i++) {
+		if ($i) {
+		    $depends{$config} .= " " . $ifdeps[$i];
+		} else {
+		    $depends{$config} = $ifdeps[$i];
+		}
+		$state = "DEP";
+	    }
+
+	# collect the depends for the config
+	} elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) {
+	    $state = "DEP";
+	    $depends{$config} = $1;
+	} elsif ($state eq "DEP" && /^\s*depends\s+on\s+(.*)$/) {
+	    $depends{$config} .= " " . $1;
+
+	# Get the configs that select this config
+	} elsif ($state ne "NONE" && /^\s*select\s+(\S+)/) {
+	    if (defined($selects{$1})) {
+		$selects{$1} .= " " . $config;
+	    } else {
+		$selects{$1} = $config;
+	    }
+
+	# configs without prompts must be selected
+	} elsif ($state ne "NONE" && /^\s*tristate\s\S/) {
+	    # note if the config has a prompt
+	    $prompt{$config} = 1;
+
+	# Check for if statements
+	} elsif (/^if\s+(.*\S)\s*$/) {
+	    my $deps = $1;
+	    # remove beginning and ending non text
+	    $deps =~ s/^[^a-zA-Z0-9_]*//;
+	    $deps =~ s/[^a-zA-Z0-9_]*$//;
+
+	    my @deps = split /[^a-zA-Z0-9_]+/, $deps;
+
+	    $ifdeps[$iflevel++] = join ':', @deps;
+
+	} elsif (/^endif/) {
+
+	    $iflevel-- if ($iflevel);
+
+	# stop on "help"
+	} elsif (/^\s*help\s*$/) {
+	    $state = "NONE";
+	}
+    }
+    close(KIN);
+
+    # read in any configs that were found.
+    foreach $kconfig (@kconfigs) {
+	if (!defined($read_kconfigs{$kconfig})) {
+	    $read_kconfigs{$kconfig} = 1;
+	    read_kconfig($kconfig);
+	}
+    }
+}
+
+if ($kconfig) {
+    read_kconfig($kconfig);
+}
+
+# Read all Makefiles to map the configs to the objects
+foreach my $makefile (@makefiles) {
+
+    open(MIN,$makefile) || die "Can't open $makefile";
+    while (<MIN>) {
+	my $objs;
+
+	# is this a line after a line with a backslash?
+	if ($cont && /(\S.*)$/) {
+	    $objs = $1;
+	}
+	$cont = 0;
+
+	# collect objects after obj-$(CONFIG_FOO_BAR)
+	if (/obj-\$\((CONFIG_[^\)]*)\)\s*[+:]?=\s*(.*)/) {
+	    $var = $1;
+	    $objs = $2;
+	}
+	if (defined($objs)) {
+	    # test if the line ends with a backslash
+	    if ($objs =~ m,(.*)\\$,) {
+		$objs = $1;
+		$cont = 1;
+	    }
+
+	    foreach my $obj (split /\s+/,$objs) {
+		$obj =~ s/-/_/g;
+		if ($obj =~ /(.*)\.o$/) {
+		    # Objects may be enabled by more than one config.
+		    # Store configs in an array.
+		    my @arr;
+
+		    if (defined($objects{$1})) {
+			@arr = @{$objects{$1}};
+		    }
+
+		    $arr[$#arr+1] = $var;
+
+		    # The objects have a hash mapping to a reference
+		    # of an array of configs.
+		    $objects{$1} = \@arr;
+		}
+	    }
+	}
+    }
+    close(MIN);
+}
+
+my %modules;
+
+if (defined($lsmod_file)) {
+    if ( ! -f $lsmod_file) {
+	die "$lsmod_file not found";
+    }
+    if ( -x $lsmod_file) {
+	# the file is executable, run it
+	open(LIN, "$lsmod_file|");
+    } else {
+	# Just read the contents
+	open(LIN, "$lsmod_file");
+    }
+} else {
+
+    # see what modules are loaded on this system
+    my $lsmod;
+
+    foreach $dir ( ("/sbin", "/bin", "/usr/sbin", "/usr/bin") ) {
+	if ( -x "$dir/lsmod" ) {
+	    $lsmod = "$dir/lsmod";
+	    last;
+	}
+}
+    if (!defined($lsmod)) {
+	# try just the path
+	$lsmod = "lsmod";
+    }
+
+    open(LIN,"$lsmod|") || die "Can not call lsmod with $lsmod";
+}
+
+while (<LIN>) {
+	next if (/^Module/);  # Skip the first line.
+	if (/^(\S+)/) {
+		$modules{$1} = 1;
+	}
+}
+close (LIN);
+
+# add to the configs hash all configs that are needed to enable
+# a loaded module.
+my %configs;
+foreach my $module (keys(%modules)) {
+    if (defined($objects{$module})) {
+	my @arr = @{$objects{$module}};
+	foreach my $conf (@arr) {
+	    $configs{$conf} = $module;
+	}
+    } else {
+	# Most likely, someone has a custom (binary?) module loaded.
+	print STDERR "$module config not found!!\n";
+    }
+}
+
+my $valid = "A-Za-z_0-9";
+my $repeat = 1;
+
+#
+# Note, we do not care about operands (like: &&, ||, !) we want to add any
+# config that is in the depend list of another config. This script does
+# not enable configs that are not already enabled. If we come across a
+# config A that depends on !B, we can still add B to the list of depends
+# to keep on. If A was on in the original config, B would not have been
+# and B would not be turned on by this script.
+#
+sub parse_config_dep_select
+{
+    my ($p) = @_;
+
+    while ($p =~ /[$valid]/) {
+
+	if ($p =~ /^[^$valid]*([$valid]+)/) {
+	    my $conf = "CONFIG_" . $1;
+
+	    $p =~ s/^[^$valid]*[$valid]+//;
+
+	    if (!defined($configs{$conf})) {
+		# We must make sure that this config has its
+		# dependencies met.
+		$repeat = 1; # do again
+		$configs{$conf} = 1;
+	    }
+	} else {
+	    die "this should never happen";
+	}
+    }
+}
+
+while ($repeat) {
+    $repeat = 0;
+
+    foreach my $config (keys %configs) {
+	$config =~ s/^CONFIG_//;
+
+	if (defined($depends{$config})) {
+	    # This config has dependencies. Make sure they are also included
+	    parse_config_dep_select $depends{$config};
+	}
+
+	if (defined($prompt{$config}) || !defined($selects{$config})) {
+	    next;
+	}
+
+	# config has no prompt and must be selected.
+	parse_config_dep_select $selects{$config};
+    }
+}
+
+my %setconfigs;
+
+# Finally, read the .config file and turn off any module enabled that
+# we could not find a reason to keep enabled.
+while(<CIN>) {
+
+    if (/CONFIG_IKCONFIG/) {
+	if (/# CONFIG_IKCONFIG is not set/) {
+	    # enable IKCONFIG at least as a module
+	    print "CONFIG_IKCONFIG=m\n";
+	    # don't ask about PROC
+	    print "# CONFIG_IKCONFIG_PROC is not set\n";
+	} else {
+	    print;
+	}
+	next;
+    }
+
+    if (/^(CONFIG.*)=(m|y)/) {
+	if (defined($configs{$1})) {
+	    $setconfigs{$1} = $2;
+	} elsif ($2 eq "m") {
+	    print "# $1 is not set\n";
+	    next;
+	}
+    }
+    print;
+}
+close(CIN);
+
+# Integrity check, make sure all modules that we want enabled do
+# indeed have their configs set.
+loop:
+foreach my $module (keys(%modules)) {
+    if (defined($objects{$module})) {
+	my @arr = @{$objects{$module}};
+	foreach my $conf (@arr) {
+	    if (defined($setconfigs{$conf})) {
+		next loop;
+	    }
+	}
+	print STDERR "module $module did not have configs";
+	foreach my $conf (@arr) {
+	    print STDERR " " , $conf;
+	}
+	print STDERR "\n";
+    }
+}
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index c35dcc5..e95718f 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -34,18 +34,19 @@ struct symbol *sym_defconfig_list;
 struct symbol *modules_sym;
 tristate modules_val;
 
-void sym_add_default(struct symbol *sym, const char *def)
+struct expr *sym_env_list;
+
+static void sym_add_default(struct symbol *sym, const char *def)
 {
 	struct property *prop = prop_alloc(P_DEFAULT, sym);
 
-	prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
+	prop->expr = expr_alloc_symbol(sym_lookup(def, SYMBOL_CONST));
 }
 
 void sym_init(void)
 {
 	struct symbol *sym;
 	struct utsname uts;
-	char *p;
 	static bool inited = false;
 
 	if (inited)
@@ -54,20 +55,6 @@ void sym_init(void)
 
 	uname(&uts);
 
-	sym = sym_lookup("ARCH", 0);
-	sym->type = S_STRING;
-	sym->flags |= SYMBOL_AUTO;
-	p = getenv("ARCH");
-	if (p)
-		sym_add_default(sym, p);
-
-	sym = sym_lookup("KERNELVERSION", 0);
-	sym->type = S_STRING;
-	sym->flags |= SYMBOL_AUTO;
-	p = getenv("KERNELVERSION");
-	if (p)
-		sym_add_default(sym, p);
-
 	sym = sym_lookup("UNAME_RELEASE", 0);
 	sym->type = S_STRING;
 	sym->flags |= SYMBOL_AUTO;
@@ -117,6 +104,15 @@ struct property *sym_get_choice_prop(struct symbol *sym)
 	return NULL;
 }
 
+struct property *sym_get_env_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_properties(sym, prop, P_ENV)
+		return prop;
+	return NULL;
+}
+
 struct property *sym_get_default_prop(struct symbol *sym)
 {
 	struct property *prop;
@@ -129,7 +125,7 @@ struct property *sym_get_default_prop(struct symbol *sym)
 	return NULL;
 }
 
-struct property *sym_get_range_prop(struct symbol *sym)
+static struct property *sym_get_range_prop(struct symbol *sym)
 {
 	struct property *prop;
 
@@ -199,7 +195,7 @@ static void sym_calc_visibility(struct symbol *sym)
 	tri = no;
 	for_all_prompts(sym, prop) {
 		prop->visible.tri = expr_calc_value(prop->visible.expr);
-		tri = E_OR(tri, prop->visible.tri);
+		tri = EXPR_OR(tri, prop->visible.tri);
 	}
 	if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
 		tri = yes;
@@ -209,6 +205,16 @@ static void sym_calc_visibility(struct symbol *sym)
 	}
 	if (sym_is_choice_value(sym))
 		return;
+	/* defaulting to "yes" if no explicit "depends on" are given */
+	tri = yes;
+	if (sym->dir_dep.expr)
+		tri = expr_calc_value(sym->dir_dep.expr);
+	if (tri == mod)
+		tri = yes;
+	if (sym->dir_dep.tri != tri) {
+		sym->dir_dep.tri = tri;
+		sym_set_changed(sym);
+	}
 	tri = no;
 	if (sym->rev_dep.expr)
 		tri = expr_calc_value(sym->rev_dep.expr);
@@ -220,45 +226,63 @@ static void sym_calc_visibility(struct symbol *sym)
 	}
 }
 
-static struct symbol *sym_calc_choice(struct symbol *sym)
+/*
+ * Find the default symbol for a choice.
+ * First try the default values for the choice symbol
+ * Next locate the first visible choice value
+ * Return NULL if none was found
+ */
+struct symbol *sym_choice_default(struct symbol *sym)
 {
 	struct symbol *def_sym;
 	struct property *prop;
 	struct expr *e;
 
-	/* is the user choice visible? */
-	def_sym = sym->def[S_DEF_USER].val;
-	if (def_sym) {
-		sym_calc_visibility(def_sym);
-		if (def_sym->visible != no)
-			return def_sym;
-	}
-
 	/* any of the defaults visible? */
 	for_all_defaults(sym, prop) {
 		prop->visible.tri = expr_calc_value(prop->visible.expr);
 		if (prop->visible.tri == no)
 			continue;
 		def_sym = prop_get_symbol(prop);
-		sym_calc_visibility(def_sym);
 		if (def_sym->visible != no)
 			return def_sym;
 	}
 
 	/* just get the first visible value */
 	prop = sym_get_choice_prop(sym);
-	for (e = prop->expr; e; e = e->left.expr) {
-		def_sym = e->right.sym;
-		sym_calc_visibility(def_sym);
+	expr_list_for_each_sym(prop->expr, e, def_sym)
 		if (def_sym->visible != no)
 			return def_sym;
-	}
 
-	/* no choice? reset tristate value */
-	sym->curr.tri = no;
+	/* failed to locate any defaults */
 	return NULL;
 }
 
+static struct symbol *sym_calc_choice(struct symbol *sym)
+{
+	struct symbol *def_sym;
+	struct property *prop;
+	struct expr *e;
+
+	/* first calculate all choice values' visibilities */
+	prop = sym_get_choice_prop(sym);
+	expr_list_for_each_sym(prop->expr, e, def_sym)
+		sym_calc_visibility(def_sym);
+
+	/* is the user choice visible? */
+	def_sym = sym->def[S_DEF_USER].val;
+	if (def_sym && def_sym->visible != no)
+		return def_sym;
+
+	def_sym = sym_choice_default(sym);
+
+	if (def_sym == NULL)
+		/* no choice? reset tristate value */
+		sym->curr.tri = no;
+
+	return def_sym;
+}
+
 void sym_calc_value(struct symbol *sym)
 {
 	struct symbol_value newval, oldval;
@@ -303,22 +327,38 @@ void sym_calc_value(struct symbol *sym)
 		if (sym_is_choice_value(sym) && sym->visible == yes) {
 			prop = sym_get_choice_prop(sym);
 			newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
-		} else if (E_OR(sym->visible, sym->rev_dep.tri) != no) {
-			sym->flags |= SYMBOL_WRITE;
-			if (sym_has_value(sym))
-				newval.tri = sym->def[S_DEF_USER].tri;
-			else if (!sym_is_choice(sym)) {
-				prop = sym_get_default_prop(sym);
-				if (prop)
-					newval.tri = expr_calc_value(prop->expr);
+		} else {
+			if (sym->visible != no) {
+				/* if the symbol is visible use the user value
+				 * if available, otherwise try the default value
+				 */
+				sym->flags |= SYMBOL_WRITE;
+				if (sym_has_value(sym)) {
+					newval.tri = EXPR_AND(sym->def[S_DEF_USER].tri,
+							      sym->visible);
+					goto calc_newval;
+				}
 			}
-			newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri);
-		} else if (!sym_is_choice(sym)) {
-			prop = sym_get_default_prop(sym);
-			if (prop) {
+			if (sym->rev_dep.tri != no)
 				sym->flags |= SYMBOL_WRITE;
-				newval.tri = expr_calc_value(prop->expr);
+			if (!sym_is_choice(sym)) {
+				prop = sym_get_default_prop(sym);
+				if (prop) {
+					sym->flags |= SYMBOL_WRITE;
+					newval.tri = EXPR_AND(expr_calc_value(prop->expr),
+							      prop->visible.tri);
+				}
 			}
+		calc_newval:
+			if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) {
+				fprintf(stderr, "warning: (");
+				expr_fprint(sym->rev_dep.expr, stderr);
+				fprintf(stderr, ") selects %s which has unmet direct dependencies (",
+					sym->name);
+				expr_fprint(sym->dir_dep.expr, stderr);
+				fprintf(stderr, ")\n");
+			}
+			newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
 		}
 		if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
 			newval.tri = yes;
@@ -361,14 +401,20 @@ void sym_calc_value(struct symbol *sym)
 	}
 
 	if (sym_is_choice(sym)) {
-		int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
+		struct symbol *choice_sym;
+
 		prop = sym_get_choice_prop(sym);
-		for (e = prop->expr; e; e = e->left.expr) {
-			e->right.sym->flags |= flags;
-			if (flags & SYMBOL_CHANGED)
-				sym_set_changed(e->right.sym);
+		expr_list_for_each_sym(prop->expr, e, choice_sym) {
+			if ((sym->flags & SYMBOL_WRITE) &&
+			    choice_sym->visible != no)
+				choice_sym->flags |= SYMBOL_WRITE;
+			if (sym->flags & SYMBOL_CHANGED)
+				sym_set_changed(choice_sym);
 		}
 	}
+
+	if (sym->flags & SYMBOL_AUTO)
+		sym->flags &= ~SYMBOL_WRITE;
 }
 
 void sym_clear_all_valid(void)
@@ -615,6 +661,80 @@ bool sym_set_string_value(struct symbol *sym, const char *newval)
 	return true;
 }
 
+/*
+ * Find the default value associated to a symbol.
+ * For tristate symbol handle the modules=n case
+ * in which case "m" becomes "y".
+ * If the symbol does not have any default then fallback
+ * to the fixed default values.
+ */
+const char *sym_get_string_default(struct symbol *sym)
+{
+	struct property *prop;
+	struct symbol *ds;
+	const char *str;
+	tristate val;
+
+	sym_calc_visibility(sym);
+	sym_calc_value(modules_sym);
+	val = symbol_no.curr.tri;
+	str = symbol_empty.curr.val;
+
+	/* If symbol has a default value look it up */
+	prop = sym_get_default_prop(sym);
+	if (prop != NULL) {
+		switch (sym->type) {
+		case S_BOOLEAN:
+		case S_TRISTATE:
+			/* The visibility imay limit the value from yes => mod */
+			val = EXPR_AND(expr_calc_value(prop->expr), prop->visible.tri);
+			break;
+		default:
+			/*
+			 * The following fails to handle the situation
+			 * where a default value is further limited by
+			 * the valid range.
+			 */
+			ds = prop_get_symbol(prop);
+			if (ds != NULL) {
+				sym_calc_value(ds);
+				str = (const char *)ds->curr.val;
+			}
+		}
+	}
+
+	/* Handle select statements */
+	val = EXPR_OR(val, sym->rev_dep.tri);
+
+	/* transpose mod to yes if modules are not enabled */
+	if (val == mod)
+		if (!sym_is_choice_value(sym) && modules_sym->curr.tri == no)
+			val = yes;
+
+	/* transpose mod to yes if type is bool */
+	if (sym->type == S_BOOLEAN && val == mod)
+		val = yes;
+
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (val) {
+		case no: return "n";
+		case mod: return "m";
+		case yes: return "y";
+		}
+	case S_INT:
+	case S_HEX:
+		return str;
+	case S_STRING:
+		return str;
+	case S_OTHER:
+	case S_UNKNOWN:
+		break;
+	}
+	return "";
+}
+
 const char *sym_get_string_value(struct symbol *sym)
 {
 	tristate val;
@@ -643,12 +763,20 @@ bool sym_is_changable(struct symbol *sym)
 	return sym->visible > sym->rev_dep.tri;
 }
 
-struct symbol *sym_lookup(const char *name, int isconst)
+static unsigned strhash(const char *s)
+{
+	/* fnv32 hash */
+	unsigned hash = 2166136261U;
+	for (; *s; s++)
+		hash = (hash ^ *s) * 0x01000193;
+	return hash;
+}
+
+struct symbol *sym_lookup(const char *name, int flags)
 {
 	struct symbol *symbol;
-	const char *ptr;
 	char *new_name;
-	int hash = 0;
+	int hash;
 
 	if (name) {
 		if (name[0] && !name[1]) {
@@ -658,29 +786,26 @@ struct symbol *sym_lookup(const char *name, int isconst)
 			case 'n': return &symbol_no;
 			}
 		}
-		for (ptr = name; *ptr; ptr++)
-			hash += *ptr;
-		hash &= 0xff;
+		hash = strhash(name) % SYMBOL_HASHSIZE;
 
 		for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
-			if (!strcmp(symbol->name, name)) {
-				if ((isconst && symbol->flags & SYMBOL_CONST) ||
-				    (!isconst && !(symbol->flags & SYMBOL_CONST)))
-					return symbol;
-			}
+			if (symbol->name &&
+			    !strcmp(symbol->name, name) &&
+			    (flags ? symbol->flags & flags
+				   : !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
+				return symbol;
 		}
 		new_name = strdup(name);
 	} else {
 		new_name = NULL;
-		hash = 256;
+		hash = 0;
 	}
 
 	symbol = malloc(sizeof(*symbol));
 	memset(symbol, 0, sizeof(*symbol));
 	symbol->name = new_name;
 	symbol->type = S_UNKNOWN;
-	if (isconst)
-		symbol->flags |= SYMBOL_CONST;
+	symbol->flags |= flags;
 
 	symbol->next = symbol_hash[hash];
 	symbol_hash[hash] = symbol;
@@ -691,7 +816,6 @@ struct symbol *sym_lookup(const char *name, int isconst)
 struct symbol *sym_find(const char *name)
 {
 	struct symbol *symbol = NULL;
-	const char *ptr;
 	int hash = 0;
 
 	if (!name)
@@ -704,12 +828,11 @@ struct symbol *sym_find(const char *name)
 		case 'n': return &symbol_no;
 		}
 	}
-	for (ptr = name; *ptr; ptr++)
-		hash += *ptr;
-	hash &= 0xff;
+	hash = strhash(name) % SYMBOL_HASHSIZE;
 
 	for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
-		if (!strcmp(symbol->name, name) &&
+		if (symbol->name &&
+		    !strcmp(symbol->name, name) &&
 		    !(symbol->flags & SYMBOL_CONST))
 				break;
 	}
@@ -744,6 +867,7 @@ struct symbol **sym_re_search(const char *pattern)
 				return NULL;
 			}
 		}
+		sym_calc_value(sym);
 		sym_arr[cnt++] = sym;
 	}
 	if (sym_arr)
@@ -753,8 +877,110 @@ struct symbol **sym_re_search(const char *pattern)
 	return sym_arr;
 }
 
+/*
+ * When we check for recursive dependencies we use a stack to save
+ * current state so we can print out relevant info to user.
+ * The entries are located on the call stack so no need to free memory.
+ * Note inser() remove() must always match to properly clear the stack.
+ */
+static struct dep_stack {
+	struct dep_stack *prev, *next;
+	struct symbol *sym;
+	struct property *prop;
+	struct expr *expr;
+} *check_top;
+
+static void dep_stack_insert(struct dep_stack *stack, struct symbol *sym)
+{
+	memset(stack, 0, sizeof(*stack));
+	if (check_top)
+		check_top->next = stack;
+	stack->prev = check_top;
+	stack->sym = sym;
+	check_top = stack;
+}
+
+static void dep_stack_remove(void)
+{
+	check_top = check_top->prev;
+	if (check_top)
+		check_top->next = NULL;
+}
+
+/*
+ * Called when we have detected a recursive dependency.
+ * check_top point to the top of the stact so we use
+ * the ->prev pointer to locate the bottom of the stack.
+ */
+static void sym_check_print_recursive(struct symbol *last_sym)
+{
+	struct dep_stack *stack;
+	struct symbol *sym, *next_sym;
+	struct menu *menu = NULL;
+	struct property *prop;
+	struct dep_stack cv_stack;
+
+	if (sym_is_choice_value(last_sym)) {
+		dep_stack_insert(&cv_stack, last_sym);
+		last_sym = prop_get_symbol(sym_get_choice_prop(last_sym));
+	}
 
-struct symbol *sym_check_deps(struct symbol *sym);
+	for (stack = check_top; stack != NULL; stack = stack->prev)
+		if (stack->sym == last_sym)
+			break;
+	if (!stack) {
+		fprintf(stderr, "unexpected recursive dependency error\n");
+		return;
+	}
+
+	for (; stack; stack = stack->next) {
+		sym = stack->sym;
+		next_sym = stack->next ? stack->next->sym : last_sym;
+		prop = stack->prop;
+
+		/* for choice values find the menu entry (used below) */
+		if (sym_is_choice(sym) || sym_is_choice_value(sym)) {
+			for (prop = sym->prop; prop; prop = prop->next) {
+				menu = prop->menu;
+				if (prop->menu)
+					break;
+			}
+		}
+		if (stack->sym == last_sym)
+			fprintf(stderr, "%s:%d:error: recursive dependency detected!\n",
+				prop->file->name, prop->lineno);
+		if (stack->expr) {
+			fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n",
+				prop->file->name, prop->lineno,
+				sym->name ? sym->name : "<choice>",
+				prop_get_type_name(prop->type),
+				next_sym->name ? next_sym->name : "<choice>");
+		} else if (stack->prop) {
+			fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n",
+				prop->file->name, prop->lineno,
+				sym->name ? sym->name : "<choice>",
+				next_sym->name ? next_sym->name : "<choice>");
+		} else if (sym_is_choice(sym)) {
+			fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n",
+				menu->file->name, menu->lineno,
+				sym->name ? sym->name : "<choice>",
+				next_sym->name ? next_sym->name : "<choice>");
+		} else if (sym_is_choice_value(sym)) {
+			fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n",
+				menu->file->name, menu->lineno,
+				sym->name ? sym->name : "<choice>",
+				next_sym->name ? next_sym->name : "<choice>");
+		} else {
+			fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n",
+				prop->file->name, prop->lineno,
+				sym->name ? sym->name : "<choice>",
+				next_sym->name ? next_sym->name : "<choice>");
+		}
+	}
+
+	if (check_top == &cv_stack)
+		dep_stack_remove();
+}
 
 static struct symbol *sym_check_expr_deps(struct expr *e)
 {
@@ -787,20 +1013,14 @@ static struct symbol *sym_check_expr_deps(struct expr *e)
 }
 
 /* return NULL when dependencies are OK */
-struct symbol *sym_check_deps(struct symbol *sym)
+static struct symbol *sym_check_sym_deps(struct symbol *sym)
 {
 	struct symbol *sym2;
 	struct property *prop;
+	struct dep_stack stack;
 
-	if (sym->flags & SYMBOL_CHECK) {
-		fprintf(stderr, "%s:%d:error: found recursive dependency: %s",
-		        sym->prop->file->name, sym->prop->lineno, sym->name);
-		return sym;
-	}
-	if (sym->flags & SYMBOL_CHECKED)
-		return NULL;
+	dep_stack_insert(&stack, sym);
 
-	sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
 	sym2 = sym_check_expr_deps(sym->rev_dep.expr);
 	if (sym2)
 		goto out;
@@ -808,19 +1028,93 @@ struct symbol *sym_check_deps(struct symbol *sym)
 	for (prop = sym->prop; prop; prop = prop->next) {
 		if (prop->type == P_CHOICE || prop->type == P_SELECT)
 			continue;
+		stack.prop = prop;
 		sym2 = sym_check_expr_deps(prop->visible.expr);
 		if (sym2)
-			goto out;
+			break;
 		if (prop->type != P_DEFAULT || sym_is_choice(sym))
 			continue;
+		stack.expr = prop->expr;
 		sym2 = sym_check_expr_deps(prop->expr);
 		if (sym2)
-			goto out;
+			break;
+		stack.expr = NULL;
 	}
+
 out:
+	dep_stack_remove();
+
+	return sym2;
+}
+
+static struct symbol *sym_check_choice_deps(struct symbol *choice)
+{
+	struct symbol *sym, *sym2;
+	struct property *prop;
+	struct expr *e;
+	struct dep_stack stack;
+
+	dep_stack_insert(&stack, choice);
+
+	prop = sym_get_choice_prop(choice);
+	expr_list_for_each_sym(prop->expr, e, sym)
+		sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
+
+	choice->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
+	sym2 = sym_check_sym_deps(choice);
+	choice->flags &= ~SYMBOL_CHECK;
 	if (sym2)
-		fprintf(stderr, " -> %s%s", sym->name, sym2 == sym? "\n": "");
-	sym->flags &= ~SYMBOL_CHECK;
+		goto out;
+
+	expr_list_for_each_sym(prop->expr, e, sym) {
+		sym2 = sym_check_sym_deps(sym);
+		if (sym2)
+			break;
+	}
+out:
+	expr_list_for_each_sym(prop->expr, e, sym)
+		sym->flags &= ~SYMBOL_CHECK;
+
+	if (sym2 && sym_is_choice_value(sym2) &&
+	    prop_get_symbol(sym_get_choice_prop(sym2)) == choice)
+		sym2 = choice;
+
+	dep_stack_remove();
+
+	return sym2;
+}
+
+struct symbol *sym_check_deps(struct symbol *sym)
+{
+	struct symbol *sym2;
+	struct property *prop;
+
+	if (sym->flags & SYMBOL_CHECK) {
+		sym_check_print_recursive(sym);
+		return sym;
+	}
+	if (sym->flags & SYMBOL_CHECKED)
+		return NULL;
+
+	if (sym_is_choice_value(sym)) {
+		struct dep_stack stack;
+
+		/* for choice groups start the check with main choice symbol */
+		dep_stack_insert(&stack, sym);
+		prop = sym_get_choice_prop(sym);
+		sym2 = sym_check_deps(prop_get_symbol(prop));
+		dep_stack_remove();
+	} else if (sym_is_choice(sym)) {
+		sym2 = sym_check_choice_deps(sym);
+	} else {
+		sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
+		sym2 = sym_check_sym_deps(sym);
+		sym->flags &= ~SYMBOL_CHECK;
+	}
+
+	if (sym2 && sym2 == sym)
+		sym2 = NULL;
+
 	return sym2;
 }
 
@@ -849,7 +1143,7 @@ struct property *prop_alloc(enum prop_type type, struct symbol *sym)
 struct symbol *prop_get_symbol(struct property *prop)
 {
 	if (prop->expr && (prop->expr->type == E_SYMBOL ||
-			   prop->expr->type == E_CHOICE))
+			   prop->expr->type == E_LIST))
 		return prop->expr->left.sym;
 	return NULL;
 }
@@ -859,6 +1153,8 @@ const char *prop_get_type_name(enum prop_type type)
 	switch (type) {
 	case P_PROMPT:
 		return "prompt";
+	case P_ENV:
+		return "env";
 	case P_COMMENT:
 		return "comment";
 	case P_MENU:
@@ -871,8 +1167,39 @@ const char *prop_get_type_name(enum prop_type type)
 		return "select";
 	case P_RANGE:
 		return "range";
+	case P_SYMBOL:
+		return "symbol";
 	case P_UNKNOWN:
 		break;
 	}
 	return "unknown";
 }
+
+static void prop_add_env(const char *env)
+{
+	struct symbol *sym, *sym2;
+	struct property *prop;
+	char *p;
+
+	sym = current_entry->sym;
+	sym->flags |= SYMBOL_AUTO;
+	for_all_properties(sym, prop, P_ENV) {
+		sym2 = prop_get_symbol(prop);
+		if (strcmp(sym2->name, env))
+			menu_warn(current_entry, "redefining environment symbol from %s",
+				  sym2->name);
+		return;
+	}
+
+	prop = prop_alloc(P_ENV, sym);
+	prop->expr = expr_alloc_symbol(sym_lookup(env, SYMBOL_CONST));
+
+	sym_env_list = expr_alloc_one(E_LIST, sym_env_list);
+	sym_env_list->right.sym = sym;
+
+	p = getenv(env);
+	if (p)
+		sym_add_default(sym, p);
+	else
+		menu_warn(current_entry, "environment variable %s undefined", env);
+}
diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c
index e3f28b9..78b5c04 100644
--- a/scripts/kconfig/util.c
+++ b/scripts/kconfig/util.c
@@ -29,6 +29,8 @@ struct file *file_lookup(const char *name)
 /* write a dependency file as used by kbuild to track dependencies */
 int file_write_dep(const char *name)
 {
+	struct symbol *sym, *env_sym;
+	struct expr *e;
 	struct file *file;
 	FILE *out;
 
@@ -44,21 +46,39 @@ int file_write_dep(const char *name)
 		else
 			fprintf(out, "\t%s\n", file->name);
 	}
-	fprintf(out, "\ninclude/config/auto.conf: \\\n"
-		     "\t$(deps_config)\n\n"
-		     "$(deps_config): ;\n");
+	fprintf(out, "\n%s: \\\n"
+		     "\t$(deps_config)\n\n", conf_get_autoconfig_name());
+
+	expr_list_for_each_sym(sym_env_list, e, sym) {
+		struct property *prop;
+		const char *value;
+
+		prop = sym_get_env_prop(sym);
+		env_sym = prop_get_symbol(prop);
+		if (!env_sym)
+			continue;
+		value = getenv(env_sym->name);
+		if (!value)
+			value = "";
+		fprintf(out, "ifneq \"$(%s)\" \"%s\"\n", env_sym->name, value);
+		fprintf(out, "%s: FORCE\n", conf_get_autoconfig_name());
+		fprintf(out, "endif\n");
+	}
+
+	fprintf(out, "\n$(deps_config): ;\n");
 	fclose(out);
 	rename("..config.tmp", name);
 	return 0;
 }
 
 
-/* Allocate initial growable sting */
+/* Allocate initial growable string */
 struct gstr str_new(void)
 {
 	struct gstr gs;
 	gs.s = malloc(sizeof(char) * 64);
-	gs.len = 16;
+	gs.len = 64;
+	gs.max_width = 0;
 	strcpy(gs.s, "\0");
 	return gs;
 }
@@ -69,6 +89,7 @@ struct gstr str_assign(const char *s)
 	struct gstr gs;
 	gs.s = strdup(s);
 	gs.len = strlen(s) + 1;
+	gs.max_width = 0;
 	return gs;
 }
 
@@ -84,12 +105,15 @@ void str_free(struct gstr *gs)
 /* Append to growable string */
 void str_append(struct gstr *gs, const char *s)
 {
-	size_t l = strlen(gs->s) + strlen(s) + 1;
-	if (l > gs->len) {
-		gs->s   = realloc(gs->s, l);
-		gs->len = l;
+	size_t l;
+	if (s) {
+		l = strlen(gs->s) + strlen(s) + 1;
+		if (l > gs->len) {
+			gs->s   = realloc(gs->s, l);
+			gs->len = l;
+		}
+		strcat(gs->s, s);
 	}
-	strcat(gs->s, s);
 }
 
 /* Append printf formatted string to growable string */
diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf
index 9b44c80..d8bc742 100644
--- a/scripts/kconfig/zconf.gperf
+++ b/scripts/kconfig/zconf.gperf
@@ -9,6 +9,8 @@
 
 struct kconf_id;
 
+static struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
+
 %%
 mainmenu,	T_MAINMENU,	TF_COMMAND
 menu,		T_MENU,		TF_COMMAND
@@ -23,7 +25,6 @@ help,		T_HELP,		TF_COMMAND
 if,		T_IF,		TF_COMMAND|TF_PARAM
 endif,		T_ENDIF,	TF_COMMAND
 depends,	T_DEPENDS,	TF_COMMAND
-requires,	T_REQUIRES,	TF_COMMAND
 optional,	T_OPTIONAL,	TF_COMMAND
 default,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN
 prompt,		T_PROMPT,	TF_COMMAND
@@ -32,15 +33,14 @@ def_tristate,	T_DEFAULT,	TF_COMMAND, S_TRISTATE
 bool,		T_TYPE,		TF_COMMAND, S_BOOLEAN
 boolean,	T_TYPE,		TF_COMMAND, S_BOOLEAN
 def_bool,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN
-def_boolean,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN
 int,		T_TYPE,		TF_COMMAND, S_INT
 hex,		T_TYPE,		TF_COMMAND, S_HEX
 string,		T_TYPE,		TF_COMMAND, S_STRING
 select,		T_SELECT,	TF_COMMAND
-enable,		T_SELECT,	TF_COMMAND
 range,		T_RANGE,	TF_COMMAND
 option,		T_OPTION,	TF_COMMAND
 on,		T_ON,		TF_PARAM
 modules,	T_OPT_MODULES,	TF_OPTION
 defconfig_list,	T_OPT_DEFCONFIG_LIST,TF_OPTION
+env,		T_OPT_ENV,	TF_OPTION
 %%
diff --git a/scripts/kconfig/zconf.hash.c_shipped b/scripts/kconfig/zconf.hash.c_shipped
index 47c8b5b..c1748fa 100644
--- a/scripts/kconfig/zconf.hash.c_shipped
+++ b/scripts/kconfig/zconf.hash.c_shipped
@@ -1,4 +1,4 @@
-/* ANSI-C code produced by gperf version 3.0.1 */
+/* ANSI-C code produced by gperf version 3.0.3 */
 /* Command-line: gperf  */
 /* Computed positions: -k'1,3' */
 
@@ -30,7 +30,9 @@
 #endif
 
 struct kconf_id;
-/* maximum key range = 45, duplicates = 0 */
+
+static struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
+/* maximum key range = 47, duplicates = 0 */
 
 #ifdef __GNUC__
 __inline
@@ -44,32 +46,32 @@ kconf_id_hash (register const char *str, register unsigned int len)
 {
   static unsigned char asso_values[] =
     {
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 25, 30, 15,
-       0, 15,  0, 47,  5, 15, 47, 47, 30, 20,
-       5,  0, 25, 15,  0,  0, 10, 35, 47, 47,
-       5, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
-      47, 47, 47, 47, 47, 47
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 11,  5,
+       0,  0,  5, 49,  5, 20, 49, 49,  5, 20,
+       5,  0, 30, 49,  0, 15,  0, 10,  0, 49,
+      25, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+      49, 49, 49, 49, 49, 49
     };
   register int hval = len;
 
@@ -89,136 +91,131 @@ kconf_id_hash (register const char *str, register unsigned int len)
 struct kconf_id_strings_t
   {
     char kconf_id_strings_str2[sizeof("on")];
-    char kconf_id_strings_str6[sizeof("string")];
-    char kconf_id_strings_str7[sizeof("default")];
-    char kconf_id_strings_str8[sizeof("def_bool")];
+    char kconf_id_strings_str3[sizeof("env")];
+    char kconf_id_strings_str5[sizeof("endif")];
+    char kconf_id_strings_str6[sizeof("option")];
+    char kconf_id_strings_str7[sizeof("endmenu")];
+    char kconf_id_strings_str8[sizeof("optional")];
+    char kconf_id_strings_str9[sizeof("endchoice")];
     char kconf_id_strings_str10[sizeof("range")];
-    char kconf_id_strings_str11[sizeof("def_boolean")];
-    char kconf_id_strings_str12[sizeof("def_tristate")];
-    char kconf_id_strings_str13[sizeof("hex")];
-    char kconf_id_strings_str14[sizeof("defconfig_list")];
-    char kconf_id_strings_str16[sizeof("option")];
-    char kconf_id_strings_str17[sizeof("if")];
-    char kconf_id_strings_str18[sizeof("optional")];
-    char kconf_id_strings_str20[sizeof("endif")];
-    char kconf_id_strings_str21[sizeof("choice")];
-    char kconf_id_strings_str22[sizeof("endmenu")];
-    char kconf_id_strings_str23[sizeof("requires")];
-    char kconf_id_strings_str24[sizeof("endchoice")];
-    char kconf_id_strings_str26[sizeof("config")];
+    char kconf_id_strings_str11[sizeof("choice")];
+    char kconf_id_strings_str12[sizeof("default")];
+    char kconf_id_strings_str13[sizeof("def_bool")];
+    char kconf_id_strings_str14[sizeof("help")];
+    char kconf_id_strings_str15[sizeof("bool")];
+    char kconf_id_strings_str16[sizeof("config")];
+    char kconf_id_strings_str17[sizeof("def_tristate")];
+    char kconf_id_strings_str18[sizeof("boolean")];
+    char kconf_id_strings_str19[sizeof("defconfig_list")];
+    char kconf_id_strings_str21[sizeof("string")];
+    char kconf_id_strings_str22[sizeof("if")];
+    char kconf_id_strings_str23[sizeof("int")];
+    char kconf_id_strings_str26[sizeof("select")];
     char kconf_id_strings_str27[sizeof("modules")];
-    char kconf_id_strings_str28[sizeof("int")];
+    char kconf_id_strings_str28[sizeof("tristate")];
     char kconf_id_strings_str29[sizeof("menu")];
-    char kconf_id_strings_str31[sizeof("prompt")];
-    char kconf_id_strings_str32[sizeof("depends")];
-    char kconf_id_strings_str33[sizeof("tristate")];
-    char kconf_id_strings_str34[sizeof("bool")];
+    char kconf_id_strings_str31[sizeof("source")];
+    char kconf_id_strings_str32[sizeof("comment")];
+    char kconf_id_strings_str33[sizeof("hex")];
     char kconf_id_strings_str35[sizeof("menuconfig")];
-    char kconf_id_strings_str36[sizeof("select")];
-    char kconf_id_strings_str37[sizeof("boolean")];
-    char kconf_id_strings_str39[sizeof("help")];
-    char kconf_id_strings_str41[sizeof("source")];
-    char kconf_id_strings_str42[sizeof("comment")];
-    char kconf_id_strings_str43[sizeof("mainmenu")];
-    char kconf_id_strings_str46[sizeof("enable")];
+    char kconf_id_strings_str36[sizeof("prompt")];
+    char kconf_id_strings_str37[sizeof("depends")];
+    char kconf_id_strings_str48[sizeof("mainmenu")];
   };
 static struct kconf_id_strings_t kconf_id_strings_contents =
   {
     "on",
-    "string",
+    "env",
+    "endif",
+    "option",
+    "endmenu",
+    "optional",
+    "endchoice",
+    "range",
+    "choice",
     "default",
     "def_bool",
-    "range",
-    "def_boolean",
+    "help",
+    "bool",
+    "config",
     "def_tristate",
-    "hex",
+    "boolean",
     "defconfig_list",
-    "option",
+    "string",
     "if",
-    "optional",
-    "endif",
-    "choice",
-    "endmenu",
-    "requires",
-    "endchoice",
-    "config",
-    "modules",
     "int",
-    "menu",
-    "prompt",
-    "depends",
-    "tristate",
-    "bool",
-    "menuconfig",
     "select",
-    "boolean",
-    "help",
+    "modules",
+    "tristate",
+    "menu",
     "source",
     "comment",
-    "mainmenu",
-    "enable"
+    "hex",
+    "menuconfig",
+    "prompt",
+    "depends",
+    "mainmenu"
   };
 #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
 #ifdef __GNUC__
 __inline
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
 #endif
 struct kconf_id *
 kconf_id_lookup (register const char *str, register unsigned int len)
 {
   enum
     {
-      TOTAL_KEYWORDS = 33,
+      TOTAL_KEYWORDS = 31,
       MIN_WORD_LENGTH = 2,
       MAX_WORD_LENGTH = 14,
       MIN_HASH_VALUE = 2,
-      MAX_HASH_VALUE = 46
+      MAX_HASH_VALUE = 48
     };
 
   static struct kconf_id wordlist[] =
     {
       {-1}, {-1},
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_ON,		TF_PARAM},
-      {-1}, {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,		T_TYPE,		TF_COMMAND, S_STRING},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_OPT_ENV,	TF_OPTION},
       {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,		T_ENDIF,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,		T_OPTION,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_ENDMENU,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_OPTIONAL,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,	T_ENDCHOICE,	TF_COMMAND},
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10,		T_RANGE,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,		T_TYPE,		TF_COMMAND, S_HEX},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,	T_OPT_DEFCONFIG_LIST,TF_OPTION},
-      {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,		T_OPTION,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,		T_IF,		TF_COMMAND|TF_PARAM},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_OPTIONAL,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,		T_CHOICE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,		T_HELP,		TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str15,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,		T_CONFIG,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str19,	T_OPT_DEFCONFIG_LIST,TF_OPTION},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20,		T_ENDIF,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_CHOICE,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,	T_ENDMENU,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,	T_REQUIRES,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str24,	T_ENDCHOICE,	TF_COMMAND},
-      {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,		T_CONFIG,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_TYPE,		TF_COMMAND, S_STRING},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,		T_IF,		TF_COMMAND|TF_PARAM},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,		T_TYPE,		TF_COMMAND, S_INT},
+      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,		T_SELECT,	TF_COMMAND},
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_OPT_MODULES,	TF_OPTION},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,		T_TYPE,		TF_COMMAND, S_INT},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_TYPE,		TF_COMMAND, S_TRISTATE},
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29,		T_MENU,		TF_COMMAND},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_PROMPT,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_DEPENDS,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,	T_TYPE,		TF_COMMAND, S_TRISTATE},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str34,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,	T_MENUCONFIG,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,		T_SELECT,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_SOURCE,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_COMMENT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,		T_TYPE,		TF_COMMAND, S_HEX},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39,		T_HELP,		TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,	T_MENUCONFIG,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,		T_PROMPT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_DEPENDS,	TF_COMMAND},
+      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_SOURCE,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_COMMENT,	TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43,	T_MAINMENU,	TF_COMMAND},
-      {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_SELECT,	TF_COMMAND}
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str48,	T_MAINMENU,	TF_COMMAND}
     };
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l
index 187d38c..7ad18f7 100644
--- a/scripts/kconfig/zconf.l
+++ b/scripts/kconfig/zconf.l
@@ -1,5 +1,6 @@
 %option backup nostdinit noyywrap never-interactive full ecs
 %option 8bit backup nodefault perf-report perf-report
+%option noinput
 %x COMMAND HELP STRING PARAM
 %{
 /*
@@ -38,7 +39,7 @@ static int last_ts, first_ts;
 static void zconf_endhelp(void);
 static void zconf_endfile(void);
 
-void new_string(void)
+static void new_string(void)
 {
 	text = malloc(START_STRSIZE);
 	text_asize = START_STRSIZE;
@@ -46,7 +47,7 @@ void new_string(void)
 	*text = 0;
 }
 
-void append_string(const char *str, int size)
+static void append_string(const char *str, int size)
 {
 	int new_size = text_size + size + 1;
 	if (new_size > text_asize) {
@@ -60,7 +61,7 @@ void append_string(const char *str, int size)
 	text[text_size] = 0;
 }
 
-void alloc_string(const char *str, int size)
+static void alloc_string(const char *str, int size)
 {
 	text = malloc(size + 1);
 	memcpy(text, str, size);
@@ -217,6 +218,11 @@ n	[A-Za-z0-9_]
 		append_string("\n", 1);
 	}
 	[^ \t\n].* {
+		while (yyleng) {
+			if ((yytext[yyleng-1] != ' ') && (yytext[yyleng-1] != '\t'))
+				break;
+			yyleng--;
+		}
 		append_string(yytext, yyleng);
 		if (!first_ts)
 			first_ts = last_ts;
@@ -256,7 +262,7 @@ static void zconf_endhelp(void)
  * ./name
  * $(srctree)/name
  * The latter is used when srctree is separate from objtree
- * when compiling the kernel.
+ * when compiling the barebox.
  * Return NULL if file is not found.
  */
 FILE *zconf_fopen(const char *name)
@@ -308,11 +314,14 @@ void zconf_nextfile(const char *name)
 	current_buf = buf;
 
 	if (file->flags & FILE_BUSY) {
-		printf("recursive scan (%s)?\n", name);
+		printf("%s:%d: do not source '%s' from itself\n",
+		       zconf_curname(), zconf_lineno(), name);
 		exit(1);
 	}
 	if (file->flags & FILE_SCANNED) {
-		printf("file %s already scanned?\n", name);
+		printf("%s:%d: file '%s' is already sourced from '%s'\n",
+		       zconf_curname(), zconf_lineno(), name,
+		       file->parent->name);
 		exit(1);
 	}
 	file->flags |= FILE_BUSY;
diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped
index ec21db7..32a9eef 100644
--- a/scripts/kconfig/zconf.tab.c_shipped
+++ b/scripts/kconfig/zconf.tab.c_shipped
@@ -1,30 +1,39 @@
-/* A Bison parser, made by GNU Bison 2.1.  */
 
-/* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* A Bison parser, made by GNU Bison 2.4.1.  */
 
-   This program is free software; you can redistribute it and/or modify
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+   
+      Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, 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, or (at your option)
-   any later version.
-
+   the Free Software Foundation, either version 3 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., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-/* As a special exception, when this file is copied by Bison into a
-   Bison output file, you may use that output file without restriction.
-   This special exception was added by the Free Software Foundation
-   in version 1.24 of Bison.  */
-
-/* Written by Richard Stallman by simplifying the original so called
-   ``semantic'' parser.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+   
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
 
 /* All symbols defined below should begin with yy or YY, to avoid
    infringing on user name space.  This should be done even for local
@@ -37,7 +46,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.1"
+#define YYBISON_VERSION "2.4.1"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -45,96 +54,23 @@
 /* Pure parsers.  */
 #define YYPURE 0
 
+/* Push parsers.  */
+#define YYPUSH 0
+
+/* Pull parsers.  */
+#define YYPULL 1
+
 /* Using locations.  */
 #define YYLSP_NEEDED 0
 
 /* Substitute the variable and function names.  */
-#define yyparse zconfparse
-#define yylex   zconflex
-#define yyerror zconferror
-#define yylval  zconflval
-#define yychar  zconfchar
-#define yydebug zconfdebug
-#define yynerrs zconfnerrs
-
-
-/* Tokens.  */
-#ifndef YYTOKENTYPE
-# define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     T_MAINMENU = 258,
-     T_MENU = 259,
-     T_ENDMENU = 260,
-     T_SOURCE = 261,
-     T_CHOICE = 262,
-     T_ENDCHOICE = 263,
-     T_COMMENT = 264,
-     T_CONFIG = 265,
-     T_MENUCONFIG = 266,
-     T_HELP = 267,
-     T_HELPTEXT = 268,
-     T_IF = 269,
-     T_ENDIF = 270,
-     T_DEPENDS = 271,
-     T_REQUIRES = 272,
-     T_OPTIONAL = 273,
-     T_PROMPT = 274,
-     T_TYPE = 275,
-     T_DEFAULT = 276,
-     T_SELECT = 277,
-     T_RANGE = 278,
-     T_OPTION = 279,
-     T_ON = 280,
-     T_WORD = 281,
-     T_WORD_QUOTE = 282,
-     T_UNEQUAL = 283,
-     T_CLOSE_PAREN = 284,
-     T_OPEN_PAREN = 285,
-     T_EOL = 286,
-     T_OR = 287,
-     T_AND = 288,
-     T_EQUAL = 289,
-     T_NOT = 290
-   };
-#endif
-/* Tokens.  */
-#define T_MAINMENU 258
-#define T_MENU 259
-#define T_ENDMENU 260
-#define T_SOURCE 261
-#define T_CHOICE 262
-#define T_ENDCHOICE 263
-#define T_COMMENT 264
-#define T_CONFIG 265
-#define T_MENUCONFIG 266
-#define T_HELP 267
-#define T_HELPTEXT 268
-#define T_IF 269
-#define T_ENDIF 270
-#define T_DEPENDS 271
-#define T_REQUIRES 272
-#define T_OPTIONAL 273
-#define T_PROMPT 274
-#define T_TYPE 275
-#define T_DEFAULT 276
-#define T_SELECT 277
-#define T_RANGE 278
-#define T_OPTION 279
-#define T_ON 280
-#define T_WORD 281
-#define T_WORD_QUOTE 282
-#define T_UNEQUAL 283
-#define T_CLOSE_PAREN 284
-#define T_OPEN_PAREN 285
-#define T_EOL 286
-#define T_OR 287
-#define T_AND 288
-#define T_EQUAL 289
-#define T_NOT 290
-
-
+#define yyparse         zconfparse
+#define yylex           zconflex
+#define yyerror         zconferror
+#define yylval          zconflval
+#define yychar          zconfchar
+#define yydebug         zconfdebug
+#define yynerrs         zconfnerrs
 
 
 /* Copy the first part of user declarations.  */
@@ -155,8 +91,6 @@
 #define LKC_DIRECT_LINK
 #include "lkc.h"
 
-#include "zconf.hash.c"
-
 #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
 
 #define PRINTD		0x0001
@@ -170,7 +104,7 @@ static void zconf_error(const char *err, ...);
 static void zconferror(const char *err);
 static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
 
-struct symbol *symbol_hash[257];
+struct symbol *symbol_hash[SYMBOL_HASHSIZE];
 
 static struct menu *current_menu, *current_entry;
 
@@ -180,6 +114,7 @@ static struct menu *current_menu, *current_entry;
 #endif
 
 
+
 /* Enabling traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
@@ -198,45 +133,126 @@ static struct menu *current_menu, *current_entry;
 # define YYTOKEN_TABLE 0
 #endif
 
-#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
 
-typedef union YYSTYPE {
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     T_MAINMENU = 258,
+     T_MENU = 259,
+     T_ENDMENU = 260,
+     T_SOURCE = 261,
+     T_CHOICE = 262,
+     T_ENDCHOICE = 263,
+     T_COMMENT = 264,
+     T_CONFIG = 265,
+     T_MENUCONFIG = 266,
+     T_HELP = 267,
+     T_HELPTEXT = 268,
+     T_IF = 269,
+     T_ENDIF = 270,
+     T_DEPENDS = 271,
+     T_OPTIONAL = 272,
+     T_PROMPT = 273,
+     T_TYPE = 274,
+     T_DEFAULT = 275,
+     T_SELECT = 276,
+     T_RANGE = 277,
+     T_OPTION = 278,
+     T_ON = 279,
+     T_WORD = 280,
+     T_WORD_QUOTE = 281,
+     T_UNEQUAL = 282,
+     T_CLOSE_PAREN = 283,
+     T_OPEN_PAREN = 284,
+     T_EOL = 285,
+     T_OR = 286,
+     T_AND = 287,
+     T_EQUAL = 288,
+     T_NOT = 289
+   };
+#endif
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+{
+
+
 	char *string;
 	struct file *file;
 	struct symbol *symbol;
 	struct expr *expr;
 	struct menu *menu;
 	struct kconf_id *id;
-} YYSTYPE;
-/* Line 196 of yacc.c.  */
 
+
+
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
 
-
 /* Copy the second part of user declarations.  */
 
 
-/* Line 219 of yacc.c.  */
+/* Include zconf.hash.c here so it can see the token constants. */
+#include "zconf.hash.c"
+
+
+
+#ifdef short
+# undef short
+#endif
 
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
 
-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-# define YYSIZE_T __SIZE_TYPE__
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
 #endif
-#if ! defined (YYSIZE_T) && defined (size_t)
-# define YYSIZE_T size_t
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
 #endif
-#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
 #endif
-#if ! defined (YYSIZE_T)
-# define YYSIZE_T unsigned int
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
 #endif
 
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
 #ifndef YY_
 # if YYENABLE_NLS
 #  if ENABLE_NLS
@@ -249,7 +265,32 @@ typedef union YYSTYPE {
 # endif
 #endif
 
-#if ! defined (yyoverflow) || YYERROR_VERBOSE
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int yyi)
+#else
+static int
+YYID (yyi)
+    int yyi;
+#endif
+{
+  return yyi;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
 
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
@@ -257,66 +298,78 @@ typedef union YYSTYPE {
 #  if YYSTACK_USE_ALLOCA
 #   ifdef __GNUC__
 #    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if defined (__STDC__) || defined (__cplusplus)
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-#     define YYINCLUDED_STDLIB_H
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
 #    endif
 #   endif
 #  endif
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning. */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
        to allow for a few compiler-allocated temporary stack slots.  */
-#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
 #  endif
 # else
 #  define YYSTACK_ALLOC YYMALLOC
 #  define YYSTACK_FREE YYFREE
 #  ifndef YYSTACK_ALLOC_MAXIMUM
-#   define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
 #  endif
-#  ifdef __cplusplus
-extern "C" {
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+	     && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
-	&& (defined (__STDC__) || defined (__cplusplus)))
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
-#  ifdef __cplusplus
-}
-#  endif
 # endif
-#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
 
 
-#if (! defined (yyoverflow) \
-     && (! defined (__cplusplus) \
-	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  short int yyss;
-  YYSTYPE yyvs;
-  };
+  yytype_int16 yyss_alloc;
+  YYSTYPE yyvs_alloc;
+};
 
 /* The size of the maximum gap between one aligned stack and the next.  */
 # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
@@ -324,13 +377,13 @@ union yyalloc
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
       + YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
-#  if defined (__GNUC__) && 1 < __GNUC__
+#  if defined __GNUC__ && 1 < __GNUC__
 #   define YYCOPY(To, From, Count) \
       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
@@ -341,7 +394,7 @@ union yyalloc
 	  for (yyi = 0; yyi < (Count); yyi++)	\
 	    (To)[yyi] = (From)[yyi];		\
 	}					\
-      while (0)
+      while (YYID (0))
 #  endif
 # endif
 
@@ -350,48 +403,42 @@ union yyalloc
    elements in the stack, and YYPTR gives the new location of the
    stack.  Advance YYPTR to a properly aligned location for the next
    stack.  */
-# define YYSTACK_RELOCATE(Stack)					\
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
     do									\
       {									\
 	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack, Stack, yysize);				\
-	Stack = &yyptr->Stack;						\
+	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
+	Stack = &yyptr->Stack_alloc;					\
 	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 	yyptr += yynewbytes / sizeof (*yyptr);				\
       }									\
-    while (0)
+    while (YYID (0))
 
 #endif
 
-#if defined (__STDC__) || defined (__cplusplus)
-   typedef signed char yysigned_char;
-#else
-   typedef short int yysigned_char;
-#endif
-
-/* YYFINAL -- State number of the termination state. */
+/* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  3
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   275
+#define YYLAST   259
 
-/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS  36
-/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  45
-/* YYNRULES -- Number of rules. */
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  35
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  46
+/* YYNRULES -- Number of rules.  */
 #define YYNRULES  110
-/* YYNRULES -- Number of states. */
-#define YYNSTATES  183
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  180
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   290
+#define YYMAXUTOK   289
 
 #define YYTRANSLATE(YYX)						\
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-static const unsigned char yytranslate[] =
+static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -421,98 +468,97 @@ static const unsigned char yytranslate[] =
        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
-      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34
 };
 
 #if YYDEBUG
 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
    YYRHS.  */
-static const unsigned short int yyprhs[] =
+static const yytype_uint16 yyprhs[] =
 {
        0,     0,     3,     5,     6,     9,    12,    15,    20,    23,
       28,    33,    37,    39,    41,    43,    45,    47,    49,    51,
       53,    55,    57,    59,    61,    63,    67,    70,    74,    77,
       81,    84,    85,    88,    91,    94,    97,   100,   103,   107,
-     112,   117,   122,   128,   132,   133,   137,   138,   141,   144,
-     147,   149,   153,   154,   157,   160,   163,   166,   169,   174,
-     178,   181,   186,   187,   190,   194,   196,   200,   201,   204,
-     207,   210,   214,   217,   219,   223,   224,   227,   230,   233,
-     237,   241,   244,   247,   250,   251,   254,   257,   260,   265,
-     269,   273,   274,   277,   279,   281,   284,   287,   290,   292,
-     295,   296,   299,   301,   305,   309,   313,   316,   320,   324,
-     326
+     112,   117,   122,   128,   132,   133,   137,   138,   141,   145,
+     148,   150,   154,   155,   158,   161,   164,   167,   170,   175,
+     179,   182,   187,   188,   191,   195,   197,   201,   202,   205,
+     208,   211,   215,   218,   220,   224,   225,   228,   231,   234,
+     238,   242,   245,   248,   251,   252,   255,   258,   261,   266,
+     267,   270,   272,   274,   277,   280,   283,   285,   288,   289,
+     292,   294,   298,   302,   306,   309,   313,   317,   319,   321,
+     322
 };
 
-/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-static const yysigned_char yyrhs[] =
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int8 yyrhs[] =
 {
-      37,     0,    -1,    38,    -1,    -1,    38,    40,    -1,    38,
-      54,    -1,    38,    65,    -1,    38,     3,    75,    77,    -1,
-      38,    76,    -1,    38,    26,     1,    31,    -1,    38,    39,
-       1,    31,    -1,    38,     1,    31,    -1,    16,    -1,    19,
-      -1,    20,    -1,    22,    -1,    18,    -1,    23,    -1,    21,
-      -1,    31,    -1,    60,    -1,    69,    -1,    43,    -1,    45,
-      -1,    67,    -1,    26,     1,    31,    -1,     1,    31,    -1,
-      10,    26,    31,    -1,    42,    46,    -1,    11,    26,    31,
-      -1,    44,    46,    -1,    -1,    46,    47,    -1,    46,    48,
-      -1,    46,    73,    -1,    46,    71,    -1,    46,    41,    -1,
-      46,    31,    -1,    20,    74,    31,    -1,    19,    75,    78,
-      31,    -1,    21,    79,    78,    31,    -1,    22,    26,    78,
-      31,    -1,    23,    80,    80,    78,    31,    -1,    24,    49,
-      31,    -1,    -1,    49,    26,    50,    -1,    -1,    34,    75,
-      -1,     7,    31,    -1,    51,    55,    -1,    76,    -1,    52,
-      57,    53,    -1,    -1,    55,    56,    -1,    55,    73,    -1,
-      55,    71,    -1,    55,    31,    -1,    55,    41,    -1,    19,
-      75,    78,    31,    -1,    20,    74,    31,    -1,    18,    31,
-      -1,    21,    26,    78,    31,    -1,    -1,    57,    40,    -1,
-      14,    79,    77,    -1,    76,    -1,    58,    61,    59,    -1,
-      -1,    61,    40,    -1,    61,    65,    -1,    61,    54,    -1,
-       4,    75,    31,    -1,    62,    72,    -1,    76,    -1,    63,
-      66,    64,    -1,    -1,    66,    40,    -1,    66,    65,    -1,
-      66,    54,    -1,     6,    75,    31,    -1,     9,    75,    31,
-      -1,    68,    72,    -1,    12,    31,    -1,    70,    13,    -1,
-      -1,    72,    73,    -1,    72,    31,    -1,    72,    41,    -1,
-      16,    25,    79,    31,    -1,    16,    79,    31,    -1,    17,
-      79,    31,    -1,    -1,    75,    78,    -1,    26,    -1,    27,
-      -1,     5,    31,    -1,     8,    31,    -1,    15,    31,    -1,
-      31,    -1,    77,    31,    -1,    -1,    14,    79,    -1,    80,
-      -1,    80,    34,    80,    -1,    80,    28,    80,    -1,    30,
-      79,    29,    -1,    35,    79,    -1,    79,    32,    79,    -1,
-      79,    33,    79,    -1,    26,    -1,    27,    -1
+      36,     0,    -1,    37,    -1,    -1,    37,    39,    -1,    37,
+      53,    -1,    37,    64,    -1,    37,     3,    74,    76,    -1,
+      37,    75,    -1,    37,    25,     1,    30,    -1,    37,    38,
+       1,    30,    -1,    37,     1,    30,    -1,    16,    -1,    18,
+      -1,    19,    -1,    21,    -1,    17,    -1,    22,    -1,    20,
+      -1,    30,    -1,    59,    -1,    68,    -1,    42,    -1,    44,
+      -1,    66,    -1,    25,     1,    30,    -1,     1,    30,    -1,
+      10,    25,    30,    -1,    41,    45,    -1,    11,    25,    30,
+      -1,    43,    45,    -1,    -1,    45,    46,    -1,    45,    47,
+      -1,    45,    72,    -1,    45,    70,    -1,    45,    40,    -1,
+      45,    30,    -1,    19,    73,    30,    -1,    18,    74,    77,
+      30,    -1,    20,    78,    77,    30,    -1,    21,    25,    77,
+      30,    -1,    22,    79,    79,    77,    30,    -1,    23,    48,
+      30,    -1,    -1,    48,    25,    49,    -1,    -1,    33,    74,
+      -1,     7,    80,    30,    -1,    50,    54,    -1,    75,    -1,
+      51,    56,    52,    -1,    -1,    54,    55,    -1,    54,    72,
+      -1,    54,    70,    -1,    54,    30,    -1,    54,    40,    -1,
+      18,    74,    77,    30,    -1,    19,    73,    30,    -1,    17,
+      30,    -1,    20,    25,    77,    30,    -1,    -1,    56,    39,
+      -1,    14,    78,    76,    -1,    75,    -1,    57,    60,    58,
+      -1,    -1,    60,    39,    -1,    60,    64,    -1,    60,    53,
+      -1,     4,    74,    30,    -1,    61,    71,    -1,    75,    -1,
+      62,    65,    63,    -1,    -1,    65,    39,    -1,    65,    64,
+      -1,    65,    53,    -1,     6,    74,    30,    -1,     9,    74,
+      30,    -1,    67,    71,    -1,    12,    30,    -1,    69,    13,
+      -1,    -1,    71,    72,    -1,    71,    30,    -1,    71,    40,
+      -1,    16,    24,    78,    30,    -1,    -1,    74,    77,    -1,
+      25,    -1,    26,    -1,     5,    30,    -1,     8,    30,    -1,
+      15,    30,    -1,    30,    -1,    76,    30,    -1,    -1,    14,
+      78,    -1,    79,    -1,    79,    33,    79,    -1,    79,    27,
+      79,    -1,    29,    78,    28,    -1,    34,    78,    -1,    78,
+      31,    78,    -1,    78,    32,    78,    -1,    25,    -1,    26,
+      -1,    -1,    25,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const unsigned short int yyrline[] =
+static const yytype_uint16 yyrline[] =
 {
-       0,   105,   105,   107,   109,   110,   111,   112,   113,   114,
-     115,   119,   123,   123,   123,   123,   123,   123,   123,   127,
-     128,   129,   130,   131,   132,   136,   137,   143,   151,   157,
-     165,   175,   177,   178,   179,   180,   181,   182,   185,   193,
-     199,   209,   215,   221,   224,   226,   237,   238,   243,   252,
-     257,   265,   268,   270,   271,   272,   273,   274,   277,   283,
-     294,   300,   310,   312,   317,   325,   333,   336,   338,   339,
-     340,   345,   352,   357,   365,   368,   370,   371,   372,   375,
-     383,   390,   397,   403,   410,   412,   413,   414,   417,   422,
-     427,   435,   437,   442,   443,   446,   447,   448,   452,   453,
-     456,   457,   460,   461,   462,   463,   464,   465,   466,   469,
-     470
+       0,   107,   107,   109,   111,   112,   113,   114,   115,   116,
+     117,   121,   125,   125,   125,   125,   125,   125,   125,   129,
+     130,   131,   132,   133,   134,   138,   139,   145,   153,   159,
+     167,   177,   179,   180,   181,   182,   183,   184,   187,   195,
+     201,   211,   217,   223,   226,   228,   239,   240,   245,   254,
+     259,   267,   270,   272,   273,   274,   275,   276,   279,   285,
+     296,   302,   312,   314,   319,   327,   335,   338,   340,   341,
+     342,   347,   354,   359,   367,   370,   372,   373,   374,   377,
+     385,   392,   399,   405,   412,   414,   415,   416,   419,   427,
+     429,   434,   435,   438,   439,   440,   444,   445,   448,   449,
+     452,   453,   454,   455,   456,   457,   458,   461,   462,   465,
+     466
 };
 #endif
 
 #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
   "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
   "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
-  "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT",
-  "T_SELECT", "T_RANGE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE",
-  "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND",
-  "T_EQUAL", "T_NOT", "$accept", "input", "stmt_list", "option_name",
-  "common_stmt", "option_error", "config_entry_start", "config_stmt",
+  "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", "T_SELECT", "T_RANGE",
+  "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL",
+  "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", "T_EQUAL",
+  "T_NOT", "$accept", "input", "stmt_list", "option_name", "common_stmt",
+  "option_error", "config_entry_start", "config_stmt",
   "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
   "config_option", "symbol_option", "symbol_option_list",
   "symbol_option_arg", "choice", "choice_entry", "choice_end",
@@ -520,126 +566,125 @@ static const char *const yytname[] =
   "if_entry", "if_end", "if_stmt", "if_block", "menu", "menu_entry",
   "menu_end", "menu_stmt", "menu_block", "source_stmt", "comment",
   "comment_stmt", "help_start", "help", "depends_list", "depends",
-  "prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr", "symbol", 0
+  "prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr", "symbol",
+  "word_opt", 0
 };
 #endif
 
 # ifdef YYPRINT
 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
    token YYLEX-NUM.  */
-static const unsigned short int yytoknum[] =
+static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290
+     285,   286,   287,   288,   289
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const unsigned char yyr1[] =
+static const yytype_uint8 yyr1[] =
 {
-       0,    36,    37,    38,    38,    38,    38,    38,    38,    38,
-      38,    38,    39,    39,    39,    39,    39,    39,    39,    40,
-      40,    40,    40,    40,    40,    41,    41,    42,    43,    44,
-      45,    46,    46,    46,    46,    46,    46,    46,    47,    47,
-      47,    47,    47,    48,    49,    49,    50,    50,    51,    52,
-      53,    54,    55,    55,    55,    55,    55,    55,    56,    56,
-      56,    56,    57,    57,    58,    59,    60,    61,    61,    61,
-      61,    62,    63,    64,    65,    66,    66,    66,    66,    67,
-      68,    69,    70,    71,    72,    72,    72,    72,    73,    73,
-      73,    74,    74,    75,    75,    76,    76,    76,    77,    77,
-      78,    78,    79,    79,    79,    79,    79,    79,    79,    80,
+       0,    35,    36,    37,    37,    37,    37,    37,    37,    37,
+      37,    37,    38,    38,    38,    38,    38,    38,    38,    39,
+      39,    39,    39,    39,    39,    40,    40,    41,    42,    43,
+      44,    45,    45,    45,    45,    45,    45,    45,    46,    46,
+      46,    46,    46,    47,    48,    48,    49,    49,    50,    51,
+      52,    53,    54,    54,    54,    54,    54,    54,    55,    55,
+      55,    55,    56,    56,    57,    58,    59,    60,    60,    60,
+      60,    61,    62,    63,    64,    65,    65,    65,    65,    66,
+      67,    68,    69,    70,    71,    71,    71,    71,    72,    73,
+      73,    74,    74,    75,    75,    75,    76,    76,    77,    77,
+      78,    78,    78,    78,    78,    78,    78,    79,    79,    80,
       80
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const unsigned char yyr2[] =
+static const yytype_uint8 yyr2[] =
 {
        0,     2,     1,     0,     2,     2,     2,     4,     2,     4,
        4,     3,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     3,     2,     3,     2,     3,
        2,     0,     2,     2,     2,     2,     2,     2,     3,     4,
-       4,     4,     5,     3,     0,     3,     0,     2,     2,     2,
+       4,     4,     5,     3,     0,     3,     0,     2,     3,     2,
        1,     3,     0,     2,     2,     2,     2,     2,     4,     3,
        2,     4,     0,     2,     3,     1,     3,     0,     2,     2,
        2,     3,     2,     1,     3,     0,     2,     2,     2,     3,
-       3,     2,     2,     2,     0,     2,     2,     2,     4,     3,
-       3,     0,     2,     1,     1,     2,     2,     2,     1,     2,
-       0,     2,     1,     3,     3,     3,     2,     3,     3,     1,
+       3,     2,     2,     2,     0,     2,     2,     2,     4,     0,
+       2,     1,     1,     2,     2,     2,     1,     2,     0,     2,
+       1,     3,     3,     3,     2,     3,     3,     1,     1,     0,
        1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
    means the default is an error.  */
-static const unsigned char yydefact[] =
+static const yytype_uint8 yydefact[] =
 {
-       3,     0,     0,     1,     0,     0,     0,     0,     0,     0,
+       3,     0,     0,     1,     0,     0,     0,     0,     0,   109,
        0,     0,     0,     0,     0,     0,    12,    16,    13,    14,
       18,    15,    17,     0,    19,     0,     4,    31,    22,    31,
       23,    52,    62,     5,    67,    20,    84,    75,     6,    24,
-      84,    21,     8,    11,    93,    94,     0,     0,    95,     0,
-      48,    96,     0,     0,     0,   109,   110,     0,     0,     0,
-     102,    97,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    98,     7,    71,    79,    80,    27,    29,     0,
-     106,     0,     0,    64,     0,     0,     9,    10,     0,     0,
-       0,     0,     0,    91,     0,     0,     0,    44,     0,    37,
-      36,    32,    33,     0,    35,    34,     0,     0,    91,     0,
-      56,    57,    53,    55,    54,    63,    51,    50,    68,    70,
-      66,    69,    65,    86,    87,    85,    76,    78,    74,    77,
-      73,    99,   105,   107,   108,   104,   103,    26,    82,     0,
-       0,     0,   100,     0,   100,   100,   100,     0,     0,     0,
-      83,    60,   100,     0,   100,     0,    89,    90,     0,     0,
-      38,    92,     0,     0,   100,    46,    43,    25,     0,    59,
-       0,    88,   101,    39,    40,    41,     0,     0,    45,    58,
-      61,    42,    47
+      84,    21,     8,    11,    91,    92,     0,     0,    93,     0,
+     110,     0,    94,     0,     0,     0,   107,   108,     0,     0,
+       0,   100,    95,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    96,     7,    71,    79,    48,    80,    27,
+      29,     0,   104,     0,     0,    64,     0,     0,     9,    10,
+       0,     0,     0,     0,    89,     0,     0,     0,    44,     0,
+      37,    36,    32,    33,     0,    35,    34,     0,     0,    89,
+       0,    56,    57,    53,    55,    54,    63,    51,    50,    68,
+      70,    66,    69,    65,    86,    87,    85,    76,    78,    74,
+      77,    73,    97,   103,   105,   106,   102,   101,    26,    82,
+       0,    98,     0,    98,    98,    98,     0,     0,     0,    83,
+      60,    98,     0,    98,     0,     0,     0,    38,    90,     0,
+       0,    98,    46,    43,    25,     0,    59,     0,    88,    99,
+      39,    40,    41,     0,     0,    45,    58,    61,    42,    47
 };
 
-/* YYDEFGOTO[NTERM-NUM]. */
-static const short int yydefgoto[] =
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,     2,    25,    26,   100,    27,    28,    29,    30,
-      64,   101,   102,   148,   178,    31,    32,   116,    33,    66,
-     112,    67,    34,   120,    35,    68,    36,    37,   128,    38,
-      70,    39,    40,    41,   103,   104,    69,   105,   143,   144,
-      42,    73,   159,    59,    60
+      -1,     1,     2,    25,    26,   101,    27,    28,    29,    30,
+      65,   102,   103,   147,   175,    31,    32,   117,    33,    67,
+     113,    68,    34,   121,    35,    69,    36,    37,   129,    38,
+      71,    39,    40,    41,   104,   105,    70,   106,   142,   143,
+      42,    74,   156,    60,    61,    51
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -135
-static const short int yypact[] =
+#define YYPACT_NINF -80
+static const yytype_int16 yypact[] =
 {
-    -135,     2,   170,  -135,   -14,    56,    56,    -8,    56,    24,
-      67,    56,     7,    14,    62,    97,  -135,  -135,  -135,  -135,
-    -135,  -135,  -135,   156,  -135,   166,  -135,  -135,  -135,  -135,
-    -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,
-    -135,  -135,  -135,  -135,  -135,  -135,   138,   151,  -135,   152,
-    -135,  -135,   163,   167,   176,  -135,  -135,    62,    62,   185,
-     -19,  -135,   188,   190,    42,   103,   194,    85,    70,   222,
-      70,   132,  -135,   191,  -135,  -135,  -135,  -135,  -135,   127,
-    -135,    62,    62,   191,   104,   104,  -135,  -135,   193,   203,
-       9,    62,    56,    56,    62,   161,   104,  -135,   196,  -135,
-    -135,  -135,  -135,   233,  -135,  -135,   204,    56,    56,   221,
-    -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,
-    -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,
-    -135,  -135,  -135,   219,  -135,  -135,  -135,  -135,  -135,    62,
-     209,   212,   240,   224,   240,    -1,   240,   104,    41,   225,
-    -135,  -135,   240,   226,   240,   218,  -135,  -135,    62,   227,
-    -135,  -135,   228,   229,   240,   230,  -135,  -135,   231,  -135,
-     232,  -135,   112,  -135,  -135,  -135,   234,    56,  -135,  -135,
-    -135,  -135,  -135
+     -80,     2,   132,   -80,   -13,    -1,    -1,    -2,    -1,     9,
+      33,    -1,    27,    40,    -3,    38,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,    71,   -80,    77,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,   -80,    57,    61,   -80,    63,
+     -80,    76,   -80,    87,   101,   133,   -80,   -80,    -3,    -3,
+     195,    -6,   -80,   136,   149,    39,   104,    65,   150,     5,
+     194,     5,   167,   -80,   176,   -80,   -80,   -80,   -80,   -80,
+     -80,    68,   -80,    -3,    -3,   176,    72,    72,   -80,   -80,
+     177,   187,    78,    -1,    -1,    -3,   196,    72,   -80,   222,
+     -80,   -80,   -80,   -80,   221,   -80,   -80,   205,    -1,    -1,
+     211,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   206,   -80,   -80,   -80,   -80,   -80,
+      -3,   223,   209,   223,   197,   223,    72,     7,   210,   -80,
+     -80,   223,   212,   223,   201,    -3,   213,   -80,   -80,   214,
+     215,   223,   208,   -80,   -80,   216,   -80,   217,   -80,   113,
+     -80,   -80,   -80,   218,    -1,   -80,   -80,   -80,   -80,   -80
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const short int yypgoto[] =
+static const yytype_int16 yypgoto[] =
 {
-    -135,  -135,  -135,  -135,    94,   -45,  -135,  -135,  -135,  -135,
-     237,  -135,  -135,  -135,  -135,  -135,  -135,  -135,   -54,  -135,
-    -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,  -135,     1,
-    -135,  -135,  -135,  -135,  -135,   195,   235,   -44,   159,    -5,
-      98,   210,  -134,   -53,   -77
+     -80,   -80,   -80,   -80,   122,   -34,   -80,   -80,   -80,   -80,
+     220,   -80,   -80,   -80,   -80,   -80,   -80,   -80,    59,   -80,
+     -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   -80,   125,
+     -80,   -80,   -80,   -80,   -80,   183,   219,    22,   142,    -5,
+     147,   192,    69,   -54,   -79,   -80
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -647,93 +692,88 @@ static const short int yypgoto[] =
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
 #define YYTABLE_NINF -82
-static const short int yytable[] =
+static const yytype_int16 yytable[] =
 {
-      46,    47,     3,    49,    79,    80,    52,   135,   136,    84,
-     161,   162,   163,   158,   119,    85,   127,    43,   168,   147,
-     170,   111,   114,    48,   124,   125,   124,   125,   133,   134,
-     176,    81,    82,    53,   139,    55,    56,   140,   141,    57,
-      54,   145,   -28,    88,    58,   -28,   -28,   -28,   -28,   -28,
-     -28,   -28,   -28,   -28,    89,    50,   -28,   -28,    90,    91,
-     -28,    92,    93,    94,    95,    96,    97,   165,    98,   121,
-     164,   129,   166,    99,     6,     7,     8,     9,    10,    11,
-      12,    13,    44,    45,    14,    15,   155,   142,    55,    56,
-       7,     8,    57,    10,    11,    12,    13,    58,    51,    14,
-      15,    24,   152,   -30,    88,   172,   -30,   -30,   -30,   -30,
-     -30,   -30,   -30,   -30,   -30,    89,    24,   -30,   -30,    90,
-      91,   -30,    92,    93,    94,    95,    96,    97,    61,    98,
-      55,    56,   -81,    88,    99,   -81,   -81,   -81,   -81,   -81,
-     -81,   -81,   -81,   -81,    81,    82,   -81,   -81,    90,    91,
-     -81,   -81,   -81,   -81,   -81,   -81,   132,    62,    98,    81,
-      82,   115,   118,   123,   126,   117,   122,    63,   130,    72,
-      -2,     4,   182,     5,     6,     7,     8,     9,    10,    11,
-      12,    13,    74,    75,    14,    15,    16,   146,    17,    18,
-      19,    20,    21,    22,    76,    88,    23,   149,    77,   -49,
-     -49,    24,   -49,   -49,   -49,   -49,    89,    78,   -49,   -49,
-      90,    91,   106,   107,   108,   109,    72,    81,    82,    86,
-      98,    87,   131,    88,   137,   110,   -72,   -72,   -72,   -72,
-     -72,   -72,   -72,   -72,   138,   151,   -72,   -72,    90,    91,
-     156,    81,    82,   157,    81,    82,   150,   154,    98,   171,
-      81,    82,    82,   123,   158,   160,   167,   169,   173,   174,
-     175,   113,   179,   180,   177,   181,    65,   153,     0,    83,
-       0,     0,     0,     0,     0,    71
+      46,    47,     3,    49,    81,    82,    53,   136,   137,     6,
+       7,     8,     9,    10,    11,    12,    13,    43,   146,    14,
+      15,    86,    56,    57,    44,    45,    58,    87,    48,   134,
+     135,    59,   162,   112,    50,    24,   125,   163,   125,   -28,
+      90,   144,   -28,   -28,   -28,   -28,   -28,   -28,   -28,   -28,
+     -28,    91,    54,   -28,   -28,    92,   -28,    93,    94,    95,
+      96,    97,    98,    52,    99,    55,    90,   161,    62,   100,
+     -49,   -49,    63,   -49,   -49,   -49,   -49,    91,    64,   -49,
+     -49,    92,   107,   108,   109,   110,   154,    73,   141,   115,
+      99,    75,   126,    76,   126,   111,   133,    56,    57,    83,
+      84,   169,   140,   151,   -30,    90,    77,   -30,   -30,   -30,
+     -30,   -30,   -30,   -30,   -30,   -30,    91,    78,   -30,   -30,
+      92,   -30,    93,    94,    95,    96,    97,    98,   120,    99,
+     128,    79,    -2,     4,   100,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    83,    84,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,     7,     8,    23,    10,    11,
+      12,    13,    24,    80,    14,    15,    88,   -81,    90,   179,
+     -81,   -81,   -81,   -81,   -81,   -81,   -81,   -81,   -81,    89,
+      24,   -81,   -81,    92,   -81,   -81,   -81,   -81,   -81,   -81,
+     116,   119,    99,   127,   122,    90,   130,   124,   -72,   -72,
+     -72,   -72,   -72,   -72,   -72,   -72,   132,   138,   -72,   -72,
+      92,   155,   158,   159,   160,   118,   123,   139,   131,    99,
+     165,   145,   167,   148,   124,    73,    83,    84,    83,    84,
+     173,   168,    83,    84,   149,   150,   153,   155,    84,   157,
+     164,   174,   166,   170,   171,   172,   176,   177,   178,    66,
+     114,   152,    85,     0,     0,     0,     0,     0,     0,    72
 };
 
-static const short int yycheck[] =
+static const yytype_int16 yycheck[] =
 {
-       5,     6,     0,     8,    57,    58,    11,    84,    85,    28,
-     144,   145,   146,    14,    68,    34,    70,    31,   152,    96,
-     154,    66,    66,    31,    69,    69,    71,    71,    81,    82,
-     164,    32,    33,    26,    25,    26,    27,    90,    91,    30,
-      26,    94,     0,     1,    35,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    12,    31,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    24,    26,    26,    68,
-     147,    70,    31,    31,     4,     5,     6,     7,     8,     9,
-      10,    11,    26,    27,    14,    15,   139,    92,    26,    27,
-       5,     6,    30,     8,     9,    10,    11,    35,    31,    14,
-      15,    31,   107,     0,     1,   158,     3,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    31,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    31,    26,
-      26,    27,     0,     1,    31,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    32,    33,    14,    15,    16,    17,
-      18,    19,    20,    21,    22,    23,    29,     1,    26,    32,
-      33,    67,    68,    31,    70,    67,    68,     1,    70,    31,
-       0,     1,   177,     3,     4,     5,     6,     7,     8,     9,
-      10,    11,    31,    31,    14,    15,    16,    26,    18,    19,
-      20,    21,    22,    23,    31,     1,    26,     1,    31,     5,
-       6,    31,     8,     9,    10,    11,    12,    31,    14,    15,
-      16,    17,    18,    19,    20,    21,    31,    32,    33,    31,
-      26,    31,    31,     1,    31,    31,     4,     5,     6,     7,
-       8,     9,    10,    11,    31,    31,    14,    15,    16,    17,
-      31,    32,    33,    31,    32,    33,    13,    26,    26,    31,
-      32,    33,    33,    31,    14,    31,    31,    31,    31,    31,
-      31,    66,    31,    31,    34,    31,    29,   108,    -1,    59,
-      -1,    -1,    -1,    -1,    -1,    40
+       5,     6,     0,     8,    58,    59,    11,    86,    87,     4,
+       5,     6,     7,     8,     9,    10,    11,    30,    97,    14,
+      15,    27,    25,    26,    25,    26,    29,    33,    30,    83,
+      84,    34,    25,    67,    25,    30,    70,    30,    72,     0,
+       1,    95,     3,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,    25,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    30,    25,    25,     1,   146,    30,    30,
+       5,     6,     1,     8,     9,    10,    11,    12,     1,    14,
+      15,    16,    17,    18,    19,    20,   140,    30,    93,    67,
+      25,    30,    70,    30,    72,    30,    28,    25,    26,    31,
+      32,   155,    24,   108,     0,     1,    30,     3,     4,     5,
+       6,     7,     8,     9,    10,    11,    12,    30,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    69,    25,
+      71,    30,     0,     1,    30,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    31,    32,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,     5,     6,    25,     8,     9,
+      10,    11,    30,    30,    14,    15,    30,     0,     1,   174,
+       3,     4,     5,     6,     7,     8,     9,    10,    11,    30,
+      30,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      68,    69,    25,    71,    69,     1,    71,    30,     4,     5,
+       6,     7,     8,     9,    10,    11,    30,    30,    14,    15,
+      16,    14,   143,   144,   145,    68,    69,    30,    71,    25,
+     151,    25,   153,     1,    30,    30,    31,    32,    31,    32,
+     161,    30,    31,    32,    13,    30,    25,    14,    32,    30,
+      30,    33,    30,    30,    30,    30,    30,    30,    30,    29,
+      67,   109,    60,    -1,    -1,    -1,    -1,    -1,    -1,    40
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
-static const unsigned char yystos[] =
+static const yytype_uint8 yystos[] =
 {
-       0,    37,    38,     0,     1,     3,     4,     5,     6,     7,
-       8,     9,    10,    11,    14,    15,    16,    18,    19,    20,
-      21,    22,    23,    26,    31,    39,    40,    42,    43,    44,
-      45,    51,    52,    54,    58,    60,    62,    63,    65,    67,
-      68,    69,    76,    31,    26,    27,    75,    75,    31,    75,
-      31,    31,    75,    26,    26,    26,    27,    30,    35,    79,
-      80,    31,     1,     1,    46,    46,    55,    57,    61,    72,
-      66,    72,    31,    77,    31,    31,    31,    31,    31,    79,
-      79,    32,    33,    77,    28,    34,    31,    31,     1,    12,
-      16,    17,    19,    20,    21,    22,    23,    24,    26,    31,
-      41,    47,    48,    70,    71,    73,    18,    19,    20,    21,
-      31,    41,    56,    71,    73,    40,    53,    76,    40,    54,
-      59,    65,    76,    31,    41,    73,    40,    54,    64,    65,
-      76,    31,    29,    79,    79,    80,    80,    31,    31,    25,
-      79,    79,    75,    74,    75,    79,    26,    80,    49,     1,
-      13,    31,    75,    74,    26,    79,    31,    31,    14,    78,
-      31,    78,    78,    78,    80,    26,    31,    31,    78,    31,
-      78,    31,    79,    31,    31,    31,    78,    34,    50,    31,
-      31,    31,    75
+       0,    36,    37,     0,     1,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    25,    30,    38,    39,    41,    42,    43,
+      44,    50,    51,    53,    57,    59,    61,    62,    64,    66,
+      67,    68,    75,    30,    25,    26,    74,    74,    30,    74,
+      25,    80,    30,    74,    25,    25,    25,    26,    29,    34,
+      78,    79,    30,     1,     1,    45,    45,    54,    56,    60,
+      71,    65,    71,    30,    76,    30,    30,    30,    30,    30,
+      30,    78,    78,    31,    32,    76,    27,    33,    30,    30,
+       1,    12,    16,    18,    19,    20,    21,    22,    23,    25,
+      30,    40,    46,    47,    69,    70,    72,    17,    18,    19,
+      20,    30,    40,    55,    70,    72,    39,    52,    75,    39,
+      53,    58,    64,    75,    30,    40,    72,    39,    53,    63,
+      64,    75,    30,    28,    78,    78,    79,    79,    30,    30,
+      24,    74,    73,    74,    78,    25,    79,    48,     1,    13,
+      30,    74,    73,    25,    78,    14,    77,    30,    77,    77,
+      77,    79,    25,    30,    30,    77,    30,    77,    30,    78,
+      30,    30,    30,    77,    33,    49,    30,    30,    30,    74
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -761,7 +801,7 @@ do								\
       yychar = (Token);						\
       yylval = (Value);						\
       yytoken = YYTRANSLATE (yychar);				\
-      YYPOPSTACK;						\
+      YYPOPSTACK (1);						\
       goto yybackup;						\
     }								\
   else								\
@@ -769,7 +809,7 @@ do								\
       yyerror (YY_("syntax error: cannot back up")); \
       YYERROR;							\
     }								\
-while (0)
+while (YYID (0))
 
 
 #define YYTERROR	1
@@ -784,7 +824,7 @@ while (0)
 #ifndef YYLLOC_DEFAULT
 # define YYLLOC_DEFAULT(Current, Rhs, N)				\
     do									\
-      if (N)								\
+      if (YYID (N))                                                    \
 	{								\
 	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
 	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
@@ -798,7 +838,7 @@ while (0)
 	  (Current).first_column = (Current).last_column =		\
 	    YYRHSLOC (Rhs, 0).last_column;				\
 	}								\
-    while (0)
+    while (YYID (0))
 #endif
 
 
@@ -810,8 +850,8 @@ while (0)
 # if YYLTYPE_IS_TRIVIAL
 #  define YY_LOCATION_PRINT(File, Loc)			\
      fprintf (File, "%d.%d-%d.%d",			\
-              (Loc).first_line, (Loc).first_column,	\
-              (Loc).last_line,  (Loc).last_column)
+	      (Loc).first_line, (Loc).first_column,	\
+	      (Loc).last_line,  (Loc).last_column)
 # else
 #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
 # endif
@@ -838,37 +878,100 @@ while (0)
 do {						\
   if (yydebug)					\
     YYFPRINTF Args;				\
-} while (0)
+} while (YYID (0))
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)		\
-do {								\
-  if (yydebug)							\
-    {								\
-      YYFPRINTF (stderr, "%s ", Title);				\
-      yysymprint (stderr,					\
-                  Type, Value);	\
-      YYFPRINTF (stderr, "\n");					\
-    }								\
-} while (0)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
+do {									  \
+  if (yydebug)								  \
+    {									  \
+      YYFPRINTF (stderr, "%s ", Title);					  \
+      yy_symbol_print (stderr,						  \
+		  Type, Value); \
+      YYFPRINTF (stderr, "\n");						  \
+    }									  \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+	break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
 
 /*------------------------------------------------------------------.
 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
-yy_stack_print (short int *bottom, short int *top)
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
 #else
 static void
-yy_stack_print (bottom, top)
-    short int *bottom;
-    short int *top;
+yy_stack_print (yybottom, yytop)
+    yytype_int16 *yybottom;
+    yytype_int16 *yytop;
 #endif
 {
   YYFPRINTF (stderr, "Stack now");
-  for (/* Nothing. */; bottom <= top; ++bottom)
-    YYFPRINTF (stderr, " %d", *bottom);
+  for (; yybottom <= yytop; yybottom++)
+    {
+      int yybot = *yybottom;
+      YYFPRINTF (stderr, " %d", yybot);
+    }
   YYFPRINTF (stderr, "\n");
 }
 
@@ -876,37 +979,45 @@ yy_stack_print (bottom, top)
 do {								\
   if (yydebug)							\
     yy_stack_print ((Bottom), (Top));				\
-} while (0)
+} while (YYID (0))
 
 
 /*------------------------------------------------.
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
-yy_reduce_print (int yyrule)
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
 #else
 static void
-yy_reduce_print (yyrule)
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
     int yyrule;
 #endif
 {
+  int yynrhs = yyr2[yyrule];
   int yyi;
   unsigned long int yylno = yyrline[yyrule];
-  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
-             yyrule - 1, yylno);
-  /* Print the symbols being reduced, and their result.  */
-  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
-    YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-  YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+	     yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+		       &(yyvsp[(yyi + 1) - (yynrhs)])
+		       		       );
+      YYFPRINTF (stderr, "\n");
+    }
 }
 
 # define YY_REDUCE_PRINT(Rule)		\
 do {					\
   if (yydebug)				\
-    yy_reduce_print (Rule);		\
-} while (0)
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
@@ -940,42 +1051,44 @@ int yydebug;
 #if YYERROR_VERBOSE
 
 # ifndef yystrlen
-#  if defined (__GLIBC__) && defined (_STRING_H)
+#  if defined __GLIBC__ && defined _STRING_H
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static YYSIZE_T
-#   if defined (__STDC__) || defined (__cplusplus)
 yystrlen (const char *yystr)
-#   else
+#else
+static YYSIZE_T
 yystrlen (yystr)
-     const char *yystr;
-#   endif
+    const char *yystr;
+#endif
 {
-  const char *yys = yystr;
-
-  while (*yys++ != '\0')
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
     continue;
-
-  return yys - yystr - 1;
+  return yylen;
 }
 #  endif
 # endif
 
 # ifndef yystpcpy
-#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
 #   define yystpcpy stpcpy
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static char *
-#   if defined (__STDC__) || defined (__cplusplus)
 yystpcpy (char *yydest, const char *yysrc)
-#   else
+#else
+static char *
 yystpcpy (yydest, yysrc)
-     char *yydest;
-     const char *yysrc;
-#   endif
+    char *yydest;
+    const char *yysrc;
+#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -1001,7 +1114,7 @@ yytnamerr (char *yyres, const char *yystr)
 {
   if (*yystr == '"')
     {
-      size_t yyn = 0;
+      YYSIZE_T yyn = 0;
       char const *yyp = yystr;
 
       for (;;)
@@ -1036,53 +1149,123 @@ yytnamerr (char *yyres, const char *yystr)
 }
 # endif
 
-#endif /* YYERROR_VERBOSE */
-
-
-
-#if YYDEBUG
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
-
-#if defined (__STDC__) || defined (__cplusplus)
-static void
-yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yysymprint (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE *yyvaluep;
-#endif
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
 {
-  /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
+  int yyn = yypact[yystate];
 
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
   else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+	 constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+		    + sizeof yyexpecting - 1
+		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+		       * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+	 YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	  {
+	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+	      {
+		yycount = 1;
+		yysize = yysize0;
+		yyformat[sizeof yyunexpected - 1] = '\0';
+		break;
+	      }
+	    yyarg[yycount++] = yytname[yyx];
+	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+	    yysize_overflow |= (yysize1 < yysize);
+	    yysize = yysize1;
+	    yyfmt = yystpcpy (yyfmt, yyprefix);
+	    yyprefix = yyor;
+	  }
 
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
 
-# ifdef YYPRINT
-  if (yytype < YYNTOKENS)
-    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# endif
-  switch (yytype)
-    {
-      default:
-        break;
+      if (yysize_overflow)
+	return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+	{
+	  /* Avoid sprintf, as that infringes on the user's name space.
+	     Don't have undefined behavior even if the translation
+	     produced a string with the wrong number of "%s"s.  */
+	  char *yyp = yyresult;
+	  int yyi = 0;
+	  while ((*yyp = *yyf) != '\0')
+	    {
+	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+		{
+		  yyp += yytnamerr (yyp, yyarg[yyi++]);
+		  yyf += 2;
+		}
+	      else
+		{
+		  yyp++;
+		  yyf++;
+		}
+	    }
+	}
+      return yysize;
     }
-  YYFPRINTF (yyoutput, ")");
 }
+#endif /* YYERROR_VERBOSE */
+
 
-#endif /* ! YYDEBUG */
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-#if defined (__STDC__) || defined (__cplusplus)
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
 #else
@@ -1093,8 +1276,7 @@ yydestruct (yymsg, yytype, yyvaluep)
     YYSTYPE *yyvaluep;
 #endif
 {
-  /* Pacify ``unused variable'' warnings.  */
-  (void) yyvaluep;
+  YYUSE (yyvaluep);
 
   if (!yymsg)
     yymsg = "Deleting";
@@ -1102,53 +1284,51 @@ yydestruct (yymsg, yytype, yyvaluep)
 
   switch (yytype)
     {
-      case 52: /* "choice_entry" */
+      case 51: /* "choice_entry" */
 
-        {
+	{
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
 		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
 	if (current_menu == (yyvaluep->menu))
 		menu_end_menu();
 };
 
-        break;
-      case 58: /* "if_entry" */
+	break;
+      case 57: /* "if_entry" */
 
-        {
+	{
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
 		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
 	if (current_menu == (yyvaluep->menu))
 		menu_end_menu();
 };
 
-        break;
-      case 63: /* "menu_entry" */
+	break;
+      case 62: /* "menu_entry" */
 
-        {
+	{
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
 		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
 	if (current_menu == (yyvaluep->menu))
 		menu_end_menu();
 };
 
-        break;
+	break;
 
       default:
-        break;
+	break;
     }
 }
-
 
 /* Prevent warnings from -Wmissing-prototypes.  */
-
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void *YYPARSE_PARAM);
-# else
+#else
 int yyparse ();
-# endif
+#endif
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#if defined __STDC__ || defined __cplusplus
 int yyparse (void);
 #else
 int yyparse ();
@@ -1156,11 +1336,10 @@ int yyparse ();
 #endif /* ! YYPARSE_PARAM */
 
 
-
-/* The look-ahead symbol.  */
+/* The lookahead symbol.  */
 int yychar;
 
-/* The semantic value of the look-ahead symbol.  */
+/* The semantic value of the lookahead symbol.  */
 YYSTYPE yylval;
 
 /* Number of syntax errors so far.  */
@@ -1168,82 +1347,94 @@ int yynerrs;
 
 
 
-/*----------.
-| yyparse.  |
-`----------*/
+/*-------------------------.
+| yyparse or yypush_parse.  |
+`-------------------------*/
 
 #ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
-int yyparse (void *YYPARSE_PARAM)
-# else
-int yyparse (YYPARSE_PARAM)
-  void *YYPARSE_PARAM;
-# endif
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
 #else /* ! YYPARSE_PARAM */
-#if defined (__STDC__) || defined (__cplusplus)
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
 int
 yyparse (void)
 #else
 int
 yyparse ()
-    ;
+
 #endif
 #endif
 {
-  
-  int yystate;
-  int yyn;
-  int yyresult;
-  /* Number of tokens to shift before error messages enabled.  */
-  int yyerrstatus;
-  /* Look-ahead token as an internal (translated) token number.  */
-  int yytoken = 0;
-
-  /* Three stacks and their tools:
-     `yyss': related to states,
-     `yyvs': related to semantic values,
-     `yyls': related to locations.
 
-     Refer to the stacks thru separate pointers, to allow yyoverflow
-     to reallocate them elsewhere.  */
 
-  /* The state stack.  */
-  short int yyssa[YYINITDEPTH];
-  short int *yyss = yyssa;
-  short int *yyssp;
+    int yystate;
+    /* Number of tokens to shift before error messages enabled.  */
+    int yyerrstatus;
 
-  /* The semantic value stack.  */
-  YYSTYPE yyvsa[YYINITDEPTH];
-  YYSTYPE *yyvs = yyvsa;
-  YYSTYPE *yyvsp;
+    /* The stacks and their tools:
+       `yyss': related to states.
+       `yyvs': related to semantic values.
 
+       Refer to the stacks thru separate pointers, to allow yyoverflow
+       to reallocate them elsewhere.  */
 
+    /* The state stack.  */
+    yytype_int16 yyssa[YYINITDEPTH];
+    yytype_int16 *yyss;
+    yytype_int16 *yyssp;
 
-#define YYPOPSTACK   (yyvsp--, yyssp--)
+    /* The semantic value stack.  */
+    YYSTYPE yyvsa[YYINITDEPTH];
+    YYSTYPE *yyvs;
+    YYSTYPE *yyvsp;
 
-  YYSIZE_T yystacksize = YYINITDEPTH;
+    YYSIZE_T yystacksize;
 
+  int yyn;
+  int yyresult;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
 
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
 
-  /* When reducing, the number of symbols on the RHS of the reduced
-     rule.  */
-  int yylen;
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  yytoken = 0;
+  yyss = yyssa;
+  yyvs = yyvsa;
+  yystacksize = YYINITDEPTH;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
 
   yystate = 0;
   yyerrstatus = 0;
   yynerrs = 0;
-  yychar = YYEMPTY;		/* Cause a token to be read.  */
+  yychar = YYEMPTY; /* Cause a token to be read.  */
 
   /* Initialize stack pointers.
      Waste one element of value and location stack
      so that they stay on the same level as the state stack.
      The wasted elements are never initialized.  */
-
   yyssp = yyss;
   yyvsp = yyvs;
 
@@ -1254,8 +1445,7 @@ yyparse ()
 `------------------------------------------------------------*/
  yynewstate:
   /* In all cases, when you get here, the value and location stacks
-     have just been pushed. so pushing a state here evens the stacks.
-     */
+     have just been pushed.  So pushing a state here evens the stacks.  */
   yyssp++;
 
  yysetstate:
@@ -1268,12 +1458,11 @@ yyparse ()
 
 #ifdef yyoverflow
       {
-	/* Give user a chance to reallocate the stack. Use copies of
+	/* Give user a chance to reallocate the stack.  Use copies of
 	   these so that the &'s don't force the real ones into
 	   memory.  */
 	YYSTYPE *yyvs1 = yyvs;
-	short int *yyss1 = yyss;
-
+	yytype_int16 *yyss1 = yyss;
 
 	/* Each stack pointer address is followed by the size of the
 	   data in use in that stack, in bytes.  This used to be a
@@ -1282,7 +1471,6 @@ yyparse ()
 	yyoverflow (YY_("memory exhausted"),
 		    &yyss1, yysize * sizeof (*yyssp),
 		    &yyvs1, yysize * sizeof (*yyvsp),
-
 		    &yystacksize);
 
 	yyss = yyss1;
@@ -1300,14 +1488,13 @@ yyparse ()
 	yystacksize = YYMAXDEPTH;
 
       {
-	short int *yyss1 = yyss;
+	yytype_int16 *yyss1 = yyss;
 	union yyalloc *yyptr =
 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 	if (! yyptr)
 	  goto yyexhaustedlab;
-	YYSTACK_RELOCATE (yyss);
-	YYSTACK_RELOCATE (yyvs);
-
+	YYSTACK_RELOCATE (yyss_alloc, yyss);
+	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
 #  undef YYSTACK_RELOCATE
 	if (yyss1 != yyssa)
 	  YYSTACK_FREE (yyss1);
@@ -1318,7 +1505,6 @@ yyparse ()
       yyssp = yyss + yysize - 1;
       yyvsp = yyvs + yysize - 1;
 
-
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 		  (unsigned long int) yystacksize));
 
@@ -1328,6 +1514,9 @@ yyparse ()
 
   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
 
+  if (yystate == YYFINAL)
+    YYACCEPT;
+
   goto yybackup;
 
 /*-----------.
@@ -1335,19 +1524,17 @@ yyparse ()
 `-----------*/
 yybackup:
 
-/* Do appropriate processing given the current state.  */
-/* Read a look-ahead token if we need one and don't already have one.  */
-/* yyresume: */
-
-  /* First try to decide what to do without reference to look-ahead token.  */
+  /* Do appropriate processing given the current state.  Read a
+     lookahead token if we need one and don't already have one.  */
 
+  /* First try to decide what to do without reference to lookahead token.  */
   yyn = yypact[yystate];
   if (yyn == YYPACT_NINF)
     goto yydefault;
 
-  /* Not known => get a look-ahead token if don't already have one.  */
+  /* Not known => get a lookahead token if don't already have one.  */
 
-  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
@@ -1379,25 +1566,20 @@ yybackup:
       goto yyreduce;
     }
 
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
-  /* Shift the look-ahead token.  */
-  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-
-  /* Discard the token being shifted unless it is eof.  */
-  if (yychar != YYEOF)
-    yychar = YYEMPTY;
-
-  *++yyvsp = yylval;
-
-
   /* Count tokens shifted since error; after three, turn off error
      status.  */
   if (yyerrstatus)
     yyerrstatus--;
 
+  /* Shift the lookahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token.  */
+  yychar = YYEMPTY;
+
   yystate = yyn;
+  *++yyvsp = yylval;
+
   goto yynewstate;
 
 
@@ -1439,13 +1621,13 @@ yyreduce:
 
   case 9:
 
-    { zconf_error("unknown statement \"%s\"", (yyvsp[-2].string)); ;}
+    { zconf_error("unknown statement \"%s\"", (yyvsp[(2) - (4)].string)); ;}
     break;
 
   case 10:
 
     {
-	zconf_error("unexpected option \"%s\"", kconf_id_strings + (yyvsp[-2].id)->name);
+	zconf_error("unexpected option \"%s\"", kconf_id_strings + (yyvsp[(2) - (4)].id)->name);
 ;}
     break;
 
@@ -1456,7 +1638,7 @@ yyreduce:
 
   case 25:
 
-    { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); ;}
+    { zconf_error("unknown option \"%s\"", (yyvsp[(1) - (3)].string)); ;}
     break;
 
   case 26:
@@ -1467,10 +1649,10 @@ yyreduce:
   case 27:
 
     {
-	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
+	struct symbol *sym = sym_lookup((yyvsp[(2) - (3)].string), 0);
 	sym->flags |= SYMBOL_OPTIONAL;
 	menu_add_entry(sym);
-	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
+	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[(2) - (3)].string));
 ;}
     break;
 
@@ -1485,10 +1667,10 @@ yyreduce:
   case 29:
 
     {
-	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
+	struct symbol *sym = sym_lookup((yyvsp[(2) - (3)].string), 0);
 	sym->flags |= SYMBOL_OPTIONAL;
 	menu_add_entry(sym);
-	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
+	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[(2) - (3)].string));
 ;}
     break;
 
@@ -1507,17 +1689,17 @@ yyreduce:
   case 38:
 
     {
-	menu_set_type((yyvsp[-2].id)->stype);
+	menu_set_type((yyvsp[(1) - (3)].id)->stype);
 	printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
 		zconf_curname(), zconf_lineno(),
-		(yyvsp[-2].id)->stype);
+		(yyvsp[(1) - (3)].id)->stype);
 ;}
     break;
 
   case 39:
 
     {
-	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
+	menu_add_prompt(P_PROMPT, (yyvsp[(2) - (4)].string), (yyvsp[(3) - (4)].expr));
 	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
 ;}
     break;
@@ -1525,19 +1707,19 @@ yyreduce:
   case 40:
 
     {
-	menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
-	if ((yyvsp[-3].id)->stype != S_UNKNOWN)
-		menu_set_type((yyvsp[-3].id)->stype);
+	menu_add_expr(P_DEFAULT, (yyvsp[(2) - (4)].expr), (yyvsp[(3) - (4)].expr));
+	if ((yyvsp[(1) - (4)].id)->stype != S_UNKNOWN)
+		menu_set_type((yyvsp[(1) - (4)].id)->stype);
 	printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
 		zconf_curname(), zconf_lineno(),
-		(yyvsp[-3].id)->stype);
+		(yyvsp[(1) - (4)].id)->stype);
 ;}
     break;
 
   case 41:
 
     {
-	menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
+	menu_add_symbol(P_SELECT, sym_lookup((yyvsp[(2) - (4)].string), 0), (yyvsp[(3) - (4)].expr));
 	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
 ;}
     break;
@@ -1545,7 +1727,7 @@ yyreduce:
   case 42:
 
     {
-	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr));
+	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[(2) - (5)].symbol), (yyvsp[(3) - (5)].symbol)), (yyvsp[(4) - (5)].expr));
 	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
 ;}
     break;
@@ -1553,12 +1735,12 @@ yyreduce:
   case 45:
 
     {
-	struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string)));
+	struct kconf_id *id = kconf_id_lookup((yyvsp[(2) - (3)].string), strlen((yyvsp[(2) - (3)].string)));
 	if (id && id->flags & TF_OPTION)
-		menu_add_option(id->token, (yyvsp[0].string));
+		menu_add_option(id->token, (yyvsp[(3) - (3)].string));
 	else
-		zconfprint("warning: ignoring unknown option %s", (yyvsp[-1].string));
-	free((yyvsp[-1].string));
+		zconfprint("warning: ignoring unknown option %s", (yyvsp[(2) - (3)].string));
+	free((yyvsp[(2) - (3)].string));
 ;}
     break;
 
@@ -1569,14 +1751,14 @@ yyreduce:
 
   case 47:
 
-    { (yyval.string) = (yyvsp[0].string); ;}
+    { (yyval.string) = (yyvsp[(2) - (2)].string); ;}
     break;
 
   case 48:
 
     {
-	struct symbol *sym = sym_lookup(NULL, 0);
-	sym->flags |= SYMBOL_CHOICE;
+	struct symbol *sym = sym_lookup((yyvsp[(2) - (3)].string), SYMBOL_CHOICE);
+	sym->flags |= SYMBOL_AUTO;
 	menu_add_entry(sym);
 	menu_add_expr(P_CHOICE, NULL, NULL);
 	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
@@ -1593,7 +1775,7 @@ yyreduce:
   case 50:
 
     {
-	if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) {
+	if (zconf_endtoken((yyvsp[(1) - (1)].id), T_CHOICE, T_ENDCHOICE)) {
 		menu_end_menu();
 		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
 	}
@@ -1603,7 +1785,7 @@ yyreduce:
   case 58:
 
     {
-	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
+	menu_add_prompt(P_PROMPT, (yyvsp[(2) - (4)].string), (yyvsp[(3) - (4)].expr));
 	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
 ;}
     break;
@@ -1611,11 +1793,11 @@ yyreduce:
   case 59:
 
     {
-	if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) {
-		menu_set_type((yyvsp[-2].id)->stype);
+	if ((yyvsp[(1) - (3)].id)->stype == S_BOOLEAN || (yyvsp[(1) - (3)].id)->stype == S_TRISTATE) {
+		menu_set_type((yyvsp[(1) - (3)].id)->stype);
 		printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
 			zconf_curname(), zconf_lineno(),
-			(yyvsp[-2].id)->stype);
+			(yyvsp[(1) - (3)].id)->stype);
 	} else
 		YYERROR;
 ;}
@@ -1632,8 +1814,8 @@ yyreduce:
   case 61:
 
     {
-	if ((yyvsp[-3].id)->stype == S_UNKNOWN) {
-		menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
+	if ((yyvsp[(1) - (4)].id)->stype == S_UNKNOWN) {
+		menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[(2) - (4)].string), 0), (yyvsp[(3) - (4)].expr));
 		printd(DEBUG_PARSE, "%s:%d:default\n",
 			zconf_curname(), zconf_lineno());
 	} else
@@ -1646,7 +1828,7 @@ yyreduce:
     {
 	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
 	menu_add_entry(NULL);
-	menu_add_dep((yyvsp[-1].expr));
+	menu_add_dep((yyvsp[(2) - (3)].expr));
 	(yyval.menu) = menu_add_menu();
 ;}
     break;
@@ -1654,7 +1836,7 @@ yyreduce:
   case 65:
 
     {
-	if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) {
+	if (zconf_endtoken((yyvsp[(1) - (1)].id), T_IF, T_ENDIF)) {
 		menu_end_menu();
 		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
 	}
@@ -1665,7 +1847,7 @@ yyreduce:
 
     {
 	menu_add_entry(NULL);
-	menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
+	menu_add_prompt(P_MENU, (yyvsp[(2) - (3)].string), NULL);
 	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
 ;}
     break;
@@ -1680,7 +1862,7 @@ yyreduce:
   case 73:
 
     {
-	if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) {
+	if (zconf_endtoken((yyvsp[(1) - (1)].id), T_MENU, T_ENDMENU)) {
 		menu_end_menu();
 		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
 	}
@@ -1690,8 +1872,8 @@ yyreduce:
   case 79:
 
     {
-	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
-	zconf_nextfile((yyvsp[-1].string));
+	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[(2) - (3)].string));
+	zconf_nextfile((yyvsp[(2) - (3)].string));
 ;}
     break;
 
@@ -1699,7 +1881,7 @@ yyreduce:
 
     {
 	menu_add_entry(NULL);
-	menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL);
+	menu_add_prompt(P_COMMENT, (yyvsp[(2) - (3)].string), NULL);
 	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
 ;}
     break;
@@ -1722,127 +1904,112 @@ yyreduce:
   case 83:
 
     {
-	current_entry->help = (yyvsp[0].string);
+	current_entry->help = (yyvsp[(2) - (2)].string);
 ;}
     break;
 
   case 88:
 
     {
-	menu_add_dep((yyvsp[-1].expr));
+	menu_add_dep((yyvsp[(3) - (4)].expr));
 	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
 ;}
     break;
 
-  case 89:
+  case 90:
 
     {
-	menu_add_dep((yyvsp[-1].expr));
-	printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
+	menu_add_prompt(P_PROMPT, (yyvsp[(1) - (2)].string), (yyvsp[(2) - (2)].expr));
 ;}
     break;
 
-  case 90:
+  case 93:
 
-    {
-	menu_add_dep((yyvsp[-1].expr));
-	printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
-;}
+    { (yyval.id) = (yyvsp[(1) - (2)].id); ;}
     break;
 
-  case 92:
+  case 94:
 
-    {
-	menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr));
-;}
+    { (yyval.id) = (yyvsp[(1) - (2)].id); ;}
     break;
 
   case 95:
 
-    { (yyval.id) = (yyvsp[-1].id); ;}
+    { (yyval.id) = (yyvsp[(1) - (2)].id); ;}
     break;
 
-  case 96:
+  case 98:
 
-    { (yyval.id) = (yyvsp[-1].id); ;}
+    { (yyval.expr) = NULL; ;}
     break;
 
-  case 97:
+  case 99:
 
-    { (yyval.id) = (yyvsp[-1].id); ;}
+    { (yyval.expr) = (yyvsp[(2) - (2)].expr); ;}
     break;
 
   case 100:
 
-    { (yyval.expr) = NULL; ;}
+    { (yyval.expr) = expr_alloc_symbol((yyvsp[(1) - (1)].symbol)); ;}
     break;
 
   case 101:
 
-    { (yyval.expr) = (yyvsp[0].expr); ;}
+    { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol)); ;}
     break;
 
   case 102:
 
-    { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); ;}
+    { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol)); ;}
     break;
 
   case 103:
 
-    { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;}
+    { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;}
     break;
 
   case 104:
 
-    { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;}
+    { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[(2) - (2)].expr)); ;}
     break;
 
   case 105:
 
-    { (yyval.expr) = (yyvsp[-1].expr); ;}
+    { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 106:
 
-    { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); ;}
+    { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 107:
 
-    { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+    { (yyval.symbol) = sym_lookup((yyvsp[(1) - (1)].string), 0); free((yyvsp[(1) - (1)].string)); ;}
     break;
 
   case 108:
 
-    { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;}
+    { (yyval.symbol) = sym_lookup((yyvsp[(1) - (1)].string), SYMBOL_CONST); free((yyvsp[(1) - (1)].string)); ;}
     break;
 
   case 109:
 
-    { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); ;}
+    { (yyval.string) = NULL; ;}
     break;
 
-  case 110:
-
-    { (yyval.symbol) = sym_lookup((yyvsp[0].string), 1); free((yyvsp[0].string)); ;}
-    break;
 
 
       default: break;
     }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
 
-/* Line 1126 of yacc.c.  */
-
-
-  yyvsp -= yylen;
-  yyssp -= yylen;
-
-
+  YYPOPSTACK (yylen);
+  yylen = 0;
   YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
 
-
   /* Now `shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
@@ -1866,133 +2033,65 @@ yyerrlab:
   if (!yyerrstatus)
     {
       ++yynerrs;
-#if YYERROR_VERBOSE
-      yyn = yypact[yystate];
-
-      if (YYPACT_NINF < yyn && yyn < YYLAST)
-	{
-	  int yytype = YYTRANSLATE (yychar);
-	  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-	  YYSIZE_T yysize = yysize0;
-	  YYSIZE_T yysize1;
-	  int yysize_overflow = 0;
-	  char *yymsg = 0;
-#	  define YYERROR_VERBOSE_ARGS_MAXIMUM 5
-	  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-	  int yyx;
-
-#if 0
-	  /* This is so xgettext sees the translatable formats that are
-	     constructed on the fly.  */
-	  YY_("syntax error, unexpected %s");
-	  YY_("syntax error, unexpected %s, expecting %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-	  YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-#endif
-	  char *yyfmt;
-	  char const *yyf;
-	  static char const yyunexpected[] = "syntax error, unexpected %s";
-	  static char const yyexpecting[] = ", expecting %s";
-	  static char const yyor[] = " or %s";
-	  char yyformat[sizeof yyunexpected
-			+ sizeof yyexpecting - 1
-			+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-			   * (sizeof yyor - 1))];
-	  char const *yyprefix = yyexpecting;
-
-	  /* Start YYX at -YYN if negative to avoid negative indexes in
-	     YYCHECK.  */
-	  int yyxbegin = yyn < 0 ? -yyn : 0;
-
-	  /* Stay within bounds of both yycheck and yytname.  */
-	  int yychecklim = YYLAST - yyn;
-	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-	  int yycount = 1;
-
-	  yyarg[0] = yytname[yytype];
-	  yyfmt = yystpcpy (yyformat, yyunexpected);
-
-	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+      {
+	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+	  {
+	    YYSIZE_T yyalloc = 2 * yysize;
+	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
+	    if (yymsg != yymsgbuf)
+	      YYSTACK_FREE (yymsg);
+	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+	    if (yymsg)
+	      yymsg_alloc = yyalloc;
+	    else
 	      {
-		if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-		  {
-		    yycount = 1;
-		    yysize = yysize0;
-		    yyformat[sizeof yyunexpected - 1] = '\0';
-		    break;
-		  }
-		yyarg[yycount++] = yytname[yyx];
-		yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-		yysize_overflow |= yysize1 < yysize;
-		yysize = yysize1;
-		yyfmt = yystpcpy (yyfmt, yyprefix);
-		yyprefix = yyor;
+		yymsg = yymsgbuf;
+		yymsg_alloc = sizeof yymsgbuf;
 	      }
+	  }
 
-	  yyf = YY_(yyformat);
-	  yysize1 = yysize + yystrlen (yyf);
-	  yysize_overflow |= yysize1 < yysize;
-	  yysize = yysize1;
-
-	  if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
-	    yymsg = (char *) YYSTACK_ALLOC (yysize);
-	  if (yymsg)
-	    {
-	      /* Avoid sprintf, as that infringes on the user's name space.
-		 Don't have undefined behavior even if the translation
-		 produced a string with the wrong number of "%s"s.  */
-	      char *yyp = yymsg;
-	      int yyi = 0;
-	      while ((*yyp = *yyf))
-		{
-		  if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-		    {
-		      yyp += yytnamerr (yyp, yyarg[yyi++]);
-		      yyf += 2;
-		    }
-		  else
-		    {
-		      yyp++;
-		      yyf++;
-		    }
-		}
-	      yyerror (yymsg);
-	      YYSTACK_FREE (yymsg);
-	    }
-	  else
-	    {
-	      yyerror (YY_("syntax error"));
+	if (0 < yysize && yysize <= yymsg_alloc)
+	  {
+	    (void) yysyntax_error (yymsg, yystate, yychar);
+	    yyerror (yymsg);
+	  }
+	else
+	  {
+	    yyerror (YY_("syntax error"));
+	    if (yysize != 0)
 	      goto yyexhaustedlab;
-	    }
-	}
-      else
-#endif /* YYERROR_VERBOSE */
-	yyerror (YY_("syntax error"));
+	  }
+      }
+#endif
     }
 
 
 
   if (yyerrstatus == 3)
     {
-      /* If just tried and failed to reuse look-ahead token after an
+      /* If just tried and failed to reuse lookahead token after an
 	 error, discard it.  */
 
       if (yychar <= YYEOF)
-        {
+	{
 	  /* Return failure if at end of input.  */
 	  if (yychar == YYEOF)
 	    YYABORT;
-        }
+	}
       else
 	{
-	  yydestruct ("Error: discarding", yytoken, &yylval);
+	  yydestruct ("Error: discarding",
+		      yytoken, &yylval);
 	  yychar = YYEMPTY;
 	}
     }
 
-  /* Else will try to reuse look-ahead token after shifting the error
+  /* Else will try to reuse lookahead token after shifting the error
      token.  */
   goto yyerrlab1;
 
@@ -2005,11 +2104,14 @@ yyerrorlab:
   /* Pacify compilers like GCC when the user code never invokes
      YYERROR and the label yyerrorlab therefore never appears in user
      code.  */
-  if (0)
+  if (/*CONSTCOND*/ 0)
      goto yyerrorlab;
 
-yyvsp -= yylen;
-  yyssp -= yylen;
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
   yystate = *yyssp;
   goto yyerrlab1;
 
@@ -2039,19 +2141,17 @@ yyerrlab1:
 	YYABORT;
 
 
-      yydestruct ("Error: popping", yystos[yystate], yyvsp);
-      YYPOPSTACK;
+      yydestruct ("Error: popping",
+		  yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
 
-  if (yyn == YYFINAL)
-    YYACCEPT;
-
   *++yyvsp = yylval;
 
 
-  /* Shift the error token. */
+  /* Shift the error token.  */
   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
 
   yystate = yyn;
@@ -2072,7 +2172,7 @@ yyabortlab:
   yyresult = 1;
   goto yyreturn;
 
-#ifndef yyoverflow
+#if !defined(yyoverflow) || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
@@ -2083,20 +2183,29 @@ yyexhaustedlab:
 #endif
 
 yyreturn:
-  if (yychar != YYEOF && yychar != YYEMPTY)
+  if (yychar != YYEMPTY)
      yydestruct ("Cleanup: discarding lookahead",
 		 yytoken, &yylval);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
 		  yystos[*yyssp], yyvsp);
-      YYPOPSTACK;
+      YYPOPSTACK (1);
     }
 #ifndef yyoverflow
   if (yyss != yyssa)
     YYSTACK_FREE (yyss);
 #endif
-  return yyresult;
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
 }
 
 
@@ -2111,7 +2220,7 @@ void conf_parse(const char *name)
 	zconf_initscan(name);
 
 	sym_init();
-	menu_init();
+	_menu_init();
 	modules_sym = sym_lookup(NULL, 0);
 	modules_sym->type = S_BOOLEAN;
 	modules_sym->flags |= SYMBOL_AUTO;
@@ -2140,7 +2249,7 @@ void conf_parse(const char *name)
 	sym_set_change_count(1);
 }
 
-const char *zconf_tokenname(int token)
+static const char *zconf_tokenname(int token)
 {
 	switch (token) {
 	case T_MENU:		return "menu";
@@ -2204,7 +2313,7 @@ static void zconferror(const char *err)
 #endif
 }
 
-void print_quoted_string(FILE *out, const char *str)
+static void print_quoted_string(FILE *out, const char *str)
 {
 	const char *p;
 	int len;
@@ -2221,15 +2330,15 @@ void print_quoted_string(FILE *out, const char *str)
 	putc('"', out);
 }
 
-void print_symbol(FILE *out, struct menu *menu)
+static void print_symbol(FILE *out, struct menu *menu)
 {
 	struct symbol *sym = menu->sym;
 	struct property *prop;
 
 	if (sym_is_choice(sym))
-		fprintf(out, "choice\n");
+		fprintf(out, "\nchoice\n");
 	else
-		fprintf(out, "config %s\n", sym->name);
+		fprintf(out, "\nconfig %s\n", sym->name);
 	switch (sym->type) {
 	case S_BOOLEAN:
 		fputs("  boolean\n", out);
@@ -2275,6 +2384,21 @@ void print_symbol(FILE *out, struct menu *menu)
 		case P_CHOICE:
 			fputs("  #choice value\n", out);
 			break;
+		case P_SELECT:
+			fputs( "  select ", out);
+			expr_fprint(prop->expr, out);
+			fputc('\n', out);
+			break;
+		case P_RANGE:
+			fputs( "  range ", out);
+			expr_fprint(prop->expr, out);
+			fputc('\n', out);
+			break;
+		case P_MENU:
+			fputs( "  menu ", out);
+			print_quoted_string(out, prop->text);
+			fputc('\n', out);
+			break;
 		default:
 			fprintf(out, "  unknown prop %d!\n", prop->type);
 			break;
@@ -2286,7 +2410,6 @@ void print_symbol(FILE *out, struct menu *menu)
 			menu->help[len] = 0;
 		fprintf(out, "  help\n%s\n", menu->help);
 	}
-	fputc('\n', out);
 }
 
 void zconfdump(FILE *out)
@@ -2319,7 +2442,6 @@ void zconfdump(FILE *out)
 				expr_fprint(prop->visible.expr, out);
 				fputc('\n', out);
 			}
-			fputs("\n", out);
 		}
 
 		if (menu->list)
@@ -2344,4 +2466,3 @@ void zconfdump(FILE *out)
 #include "symbol.c"
 #include "menu.c"
 
-
diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
index 79db4cf..23dfd3b 100644
--- a/scripts/kconfig/zconf.y
+++ b/scripts/kconfig/zconf.y
@@ -14,8 +14,6 @@
 #define LKC_DIRECT_LINK
 #include "lkc.h"
 
-#include "zconf.hash.c"
-
 #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
 
 #define PRINTD		0x0001
@@ -29,7 +27,7 @@ static void zconf_error(const char *err, ...);
 static void zconferror(const char *err);
 static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
 
-struct symbol *symbol_hash[257];
+struct symbol *symbol_hash[SYMBOL_HASHSIZE];
 
 static struct menu *current_menu, *current_entry;
 
@@ -64,7 +62,6 @@ static struct menu *current_menu, *current_entry;
 %token <id>T_IF
 %token <id>T_ENDIF
 %token <id>T_DEPENDS
-%token <id>T_REQUIRES
 %token <id>T_OPTIONAL
 %token <id>T_PROMPT
 %token <id>T_TYPE
@@ -92,7 +89,7 @@ static struct menu *current_menu, *current_entry;
 %type <id> end
 %type <id> option_name
 %type <menu> if_entry menu_entry choice_entry
-%type <string> symbol_option_arg
+%type <string> symbol_option_arg word_opt
 
 %destructor {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -101,6 +98,11 @@ static struct menu *current_menu, *current_entry;
 		menu_end_menu();
 } if_entry menu_entry choice_entry
 
+%{
+/* Include zconf.hash.c here so it can see the token constants. */
+#include "zconf.hash.c"
+%}
+
 %%
 input: stmt_list;
 
@@ -240,10 +242,10 @@ symbol_option_arg:
 
 /* choice entry */
 
-choice: T_CHOICE T_EOL
+choice: T_CHOICE word_opt T_EOL
 {
-	struct symbol *sym = sym_lookup(NULL, 0);
-	sym->flags |= SYMBOL_CHOICE;
+	struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
+	sym->flags |= SYMBOL_AUTO;
 	menu_add_entry(sym);
 	menu_add_expr(P_CHOICE, NULL, NULL);
 	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
@@ -418,16 +420,6 @@ depends: T_DEPENDS T_ON expr T_EOL
 {
 	menu_add_dep($3);
 	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
-}
-	| T_DEPENDS expr T_EOL
-{
-	menu_add_dep($2);
-	printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
-}
-	| T_REQUIRES expr T_EOL
-{
-	menu_add_dep($2);
-	printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
 };
 
 /* prompt statement */
@@ -467,9 +459,12 @@ expr:	  symbol				{ $$ = expr_alloc_symbol($1); }
 ;
 
 symbol:	  T_WORD	{ $$ = sym_lookup($1, 0); free($1); }
-	| T_WORD_QUOTE	{ $$ = sym_lookup($1, 1); free($1); }
+	| T_WORD_QUOTE	{ $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
 ;
 
+word_opt: /* empty */			{ $$ = NULL; }
+	| T_WORD
+
 %%
 
 void conf_parse(const char *name)
@@ -480,7 +475,7 @@ void conf_parse(const char *name)
 	zconf_initscan(name);
 
 	sym_init();
-	menu_init();
+	_menu_init();
 	modules_sym = sym_lookup(NULL, 0);
 	modules_sym->type = S_BOOLEAN;
 	modules_sym->flags |= SYMBOL_AUTO;
@@ -509,7 +504,7 @@ void conf_parse(const char *name)
 	sym_set_change_count(1);
 }
 
-const char *zconf_tokenname(int token)
+static const char *zconf_tokenname(int token)
 {
 	switch (token) {
 	case T_MENU:		return "menu";
@@ -573,7 +568,7 @@ static void zconferror(const char *err)
 #endif
 }
 
-void print_quoted_string(FILE *out, const char *str)
+static void print_quoted_string(FILE *out, const char *str)
 {
 	const char *p;
 	int len;
@@ -590,15 +585,15 @@ void print_quoted_string(FILE *out, const char *str)
 	putc('"', out);
 }
 
-void print_symbol(FILE *out, struct menu *menu)
+static void print_symbol(FILE *out, struct menu *menu)
 {
 	struct symbol *sym = menu->sym;
 	struct property *prop;
 
 	if (sym_is_choice(sym))
-		fprintf(out, "choice\n");
+		fprintf(out, "\nchoice\n");
 	else
-		fprintf(out, "config %s\n", sym->name);
+		fprintf(out, "\nconfig %s\n", sym->name);
 	switch (sym->type) {
 	case S_BOOLEAN:
 		fputs("  boolean\n", out);
@@ -644,6 +639,21 @@ void print_symbol(FILE *out, struct menu *menu)
 		case P_CHOICE:
 			fputs("  #choice value\n", out);
 			break;
+		case P_SELECT:
+			fputs( "  select ", out);
+			expr_fprint(prop->expr, out);
+			fputc('\n', out);
+			break;
+		case P_RANGE:
+			fputs( "  range ", out);
+			expr_fprint(prop->expr, out);
+			fputc('\n', out);
+			break;
+		case P_MENU:
+			fputs( "  menu ", out);
+			print_quoted_string(out, prop->text);
+			fputc('\n', out);
+			break;
 		default:
 			fprintf(out, "  unknown prop %d!\n", prop->type);
 			break;
@@ -655,7 +665,6 @@ void print_symbol(FILE *out, struct menu *menu)
 			menu->help[len] = 0;
 		fprintf(out, "  help\n%s\n", menu->help);
 	}
-	fputc('\n', out);
 }
 
 void zconfdump(FILE *out)
@@ -688,7 +697,6 @@ void zconfdump(FILE *out)
 				expr_fprint(prop->visible.expr, out);
 				fputc('\n', out);
 			}
-			fputs("\n", out);
 		}
 
 		if (menu->list)
-- 
1.7.1



From sam at ravnborg.org  Sun Aug  8 02:48:46 2010
From: sam at ravnborg.org (Sam Ravnborg)
Date: Sun, 8 Aug 2010 08:48:46 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100808064846.GA31364@merkur.ravnborg.org>

On Sun, Aug 08, 2010 at 06:17:53AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> this will add also the support of the new ncurse interface nconfig
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>

Hi Jean-Christophe.

[jc - sorry for the duplicate.
 I forgot to delete the patch and have cancelled
 the mail to the mailing list. (too big)
]

In the kconfig land we are workng on an enhancement to
nconf so we replace the "use first or second char in  menu as hotkey".
The initial reason why we started this was that people
did not like that some menus had the second char
capitalized like this:

   "mOdule support"

The reason why "O" is capital and not "m" is that "m" hotkey
is already in use. And we use the capital letter to signal
the relevant hotkey.
menuconfig does so using a different color, but the
high level ncurses interface nconfig uses does not allow this.

We are also working on a fix to savedefconfig.
savedefconfig is a new target used to save a minimal config.

So all-in-all I would like to see this sync happen
either a bit later this kernel cycle, or that you
resync again later in this cycle.

Which bring up another question.
We have plenty of projects out there that rely
on kconfig.
What can we do to kconfig to make the integration easier?

We have discussed that kconfig should be a seperate
installable tool (as rpm, deb whatever).
But there is a few quirks needed before we can do so.

But are there any other thing we could do to
make life easier for external users?

        Sam



From plagnioj at jcrosoft.com  Sun Aug  8 05:06:12 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 8 Aug 2010 11:06:12 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100808064846.GA31364@merkur.ravnborg.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100808064846.GA31364@merkur.ravnborg.org>
Message-ID: <20100808090612.GM24069@game.jcrosoft.org>

Hi sam,
> 
> In the kconfig land we are workng on an enhancement to
> nconf so we replace the "use first or second char in  menu as hotkey".
> The initial reason why we started this was that people
> did not like that some menus had the second char
> capitalized like this:
> 
>    "mOdule support"
> 
> The reason why "O" is capital and not "m" is that "m" hotkey
> is already in use. And we use the capital letter to signal
> the relevant hotkey.
> menuconfig does so using a different color, but the
> high level ncurses interface nconfig uses does not allow this.
I notice this and does not like it also
why not underline it?
> We are also working on a fix to savedefconfig.
> savedefconfig is a new target used to save a minimal config.
> 
> So all-in-all I would like to see this sync happen
> either a bit later this kernel cycle, or that you
> resync again later in this cycle.
> 
> Which bring up another question.
> We have plenty of projects out there that rely
> on kconfig.
> What can we do to kconfig to make the integration easier?
> 
> We have discussed that kconfig should be a seperate
> installable tool (as rpm, deb whatever).
> But there is a few quirks needed before we can do so.
I prefer to umbedeed it is the source so we can control which version we use
and no need to rely on too much external stuff
> 
> But are there any other thing we could do to
> make life easier for external users?
infact yes if the project name could be configurable it will avoid to modify
it and we could use it as is

I've notice 3 names

kernel,
Kernel,
Linux Kernel

if instead of hard coding it we could use a symbol to configure it it will
make it integrable as is

one other think it will be good to avoid KERNEL something in the env or the
default symbol and use a more generic one as for KERNELVERSION use
RELEASEVERSION as example

also a small doc for the mandatory env and symbol will be nice for people to
integrate it as not everyone is also a kernel dev or maintainer

and a last thing It will be nice to be able to set a value to a symbol from an
other one and not only select it

Best Regards,
J.


From sam at ravnborg.org  Sun Aug  8 08:07:41 2010
From: sam at ravnborg.org (Sam Ravnborg)
Date: Sun, 8 Aug 2010 14:07:41 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100808090612.GM24069@game.jcrosoft.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100808064846.GA31364@merkur.ravnborg.org>
	<20100808090612.GM24069@game.jcrosoft.org>
Message-ID: <20100808120741.GA32022@merkur.ravnborg.org>

On Sun, Aug 08, 2010 at 11:06:12AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Hi sam,
> > 
> > In the kconfig land we are workng on an enhancement to
> > nconf so we replace the "use first or second char in  menu as hotkey".
> > The initial reason why we started this was that people
> > did not like that some menus had the second char
> > capitalized like this:
> > 
> >    "mOdule support"
> > 
> > The reason why "O" is capital and not "m" is that "m" hotkey
> > is already in use. And we use the capital letter to signal
> > the relevant hotkey.
> > menuconfig does so using a different color, but the
> > high level ncurses interface nconfig uses does not allow this.
> I notice this and does not like it also
> why not underline it?

That was not possible with the high-level interface nconfig uses.
Nir used a new approach where he uses an interactive search
and the interactive search will match any menu containing
the string entered.

More powerfull than the hot-key support, and more flexible.

> > We are also working on a fix to savedefconfig.
> > savedefconfig is a new target used to save a minimal config.
> > 
> > So all-in-all I would like to see this sync happen
> > either a bit later this kernel cycle, or that you
> > resync again later in this cycle.
> > 
> > Which bring up another question.
> > We have plenty of projects out there that rely
> > on kconfig.
> > What can we do to kconfig to make the integration easier?
> > 
> > We have discussed that kconfig should be a seperate
> > installable tool (as rpm, deb whatever).
> > But there is a few quirks needed before we can do so.
> I prefer to umbedeed it is the source so we can control which version we use
> and no need to rely on too much external stuff
OK, I will drop any thinking of packaging it as an external tool.
[I was not sure how to do this so glad to drop it].

> > 
> > But are there any other thing we could do to
> > make life easier for external users?
> infact yes if the project name could be configurable it will avoid to modify
> it and we could use it as is
> 
> I've notice 3 names
> 
> kernel,
> Kernel,
> Linux Kernel
> 
> if instead of hard coding it we could use a symbol to configure it it will
> make it integrable as is
> 
> one other think it will be good to avoid KERNEL something in the env or the
> default symbol and use a more generic one as for KERNELVERSION use
> RELEASEVERSION as example

They should obviously go. I have had patches to do so before but I did
not like them so they never got applied.
I will try to cook up something and let see what Michal thinks.
[Michal takes care of kconfig these days, I just do some random
patches when I feel in the mode to do so].

> 
> also a small doc for the mandatory env and symbol will be nice for people to
> integrate it as not everyone is also a kernel dev or maintainer

I actually take this that integrating kconfig should be simpler.
So it:
a) should be documented using a HOW-TO
b) we sould rely on very little outside scripts/kconfig

The primary 'customer' is the kernel but it would be good
to generalize stuff a bit more.
This is by far the biggest task listed.
I will add it to my mental TODO list - but no promises :-) 

> 
> and a last thing It will be nice to be able to set a value to a symbol from an
> other one and not only select it

I am not sure I see how this is usefull.
Can you give me an example.

Note: We recently had a patch where "select" was extended to
specify an optional value.
But my issue with that was that I failed to see the use of it so
I was not happy with the extension.

But I may have missed something!

Thanks for the quick feedback!

	Sam


From plagnioj at jcrosoft.com  Sun Aug  8 08:20:59 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 8 Aug 2010 14:20:59 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100808120741.GA32022@merkur.ravnborg.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100808064846.GA31364@merkur.ravnborg.org>
	<20100808090612.GM24069@game.jcrosoft.org>
	<20100808120741.GA32022@merkur.ravnborg.org>
Message-ID: <20100808122059.GN24069@game.jcrosoft.org>

> > 
> > also a small doc for the mandatory env and symbol will be nice for people to
> > integrate it as not everyone is also a kernel dev or maintainer
> 
> I actually take this that integrating kconfig should be simpler.
> So it:
> a) should be documented using a HOW-TO
> b) we sould rely on very little outside scripts/kconfig
> 
> The primary 'customer' is the kernel but it would be good
> to generalize stuff a bit more.
> This is by far the biggest task listed.
> I will add it to my mental TODO list - but no promises :-) 
for barebox point of view just be able to change the projects name will be enough as most
of us if not all are kernel dev or maintainer

> > 
> > and a last thing It will be nice to be able to set a value to a symbol from an
> > other one and not only select it
> 
> I am not sure I see how this is usefull.
> Can you give me an example.
> 
> Note: We recently had a patch where "select" was extended to
> specify an optional value.
> But my issue with that was that I failed to see the use of it so
> I was not happy with the extension.
> 
> But I may have missed something!
ok take a look on arch/arm/mach-at91/Kconfig

as example for the

config BOARDINFO
        default "Atmel at91rm9200-ek" if MACH_AT91RM9200EK
        default "Atmel 91SAM9260-EK" if MACH_AT91SAM9260EK
        default "Atmel at91sam9261-ek" if MACH_AT91SAM9261EK
        default "Atmel at91sam9263-ek" if MACH_AT91SAM9263EK
        default "Bucyrus MMC-CPU" if MACH_MMCCPU
        default "Ronetix PM9261" if MACH_PM9261
        default "Ronetix PM9263" if MACH_PM9263

if you change the board via the interface it will not be change and it will the same for
config ARCH_TEXT_BASE in some case

and I'll prefer to do set BOARDINFO="Atmel at91rm9200-ek" from the config MACH_AT91RM9200EK

hope it will be a good example

Best Regards,
J.


From r.schwebel at pengutronix.de  Mon Aug  9 02:49:23 2010
From: r.schwebel at pengutronix.de (Robert Schwebel)
Date: Mon, 9 Aug 2010 08:49:23 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100808064846.GA31364@merkur.ravnborg.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100808064846.GA31364@merkur.ravnborg.org>
Message-ID: <20100809064923.GL30096@pengutronix.de>

Hi Sam,

On Sun, Aug 08, 2010 at 08:48:46AM +0200, Sam Ravnborg wrote:
> Which bring up another question. We have plenty of projects out there
> that rely on kconfig.

ptxdist as well.

> What can we do to kconfig to make the integration easier?
>
> We have discussed that kconfig should be a seperate installable tool
> (as rpm, deb whatever). But there is a few quirks needed before we can
> do so.

I don't think that it is necessary. Last time I checked the most
complicated thing was to exchange the project name ("Linux kernel") to
something else, because there were quite a lot of hand coded numbers
representing the string length or length-1. But we are not up to the
latest versions - I'll have to re-check.

rsc
-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Tue Aug 10 02:25:04 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Tue, 10 Aug 2010 09:25:04 +0300
Subject: [PATCH 1/2] cmd: add fuse_blow/fuse_sense for the i.MX IIM fusebox
Message-ID: <82c0fbf5703ae752521a1bea229a616d4d924583.1281421396.git.baruch@tkos.co.il>

This has only been tested on i.MX25, but should work on other i.MX chips with
IIM.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 commands/Kconfig  |    5 ++
 commands/Makefile |    1 +
 commands/fuse.c   |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 167 insertions(+), 0 deletions(-)
 create mode 100644 commands/fuse.c

diff --git a/commands/Kconfig b/commands/Kconfig
index 9d11a8b..eb3e48e 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -173,6 +173,11 @@ config CMD_MTEST_ALTERNATIVE
 	depends on CMD_MTEST
 	prompt "alternative mtest implementation"
 
+config CMD_FUSE_BLOW
+	tristate
+	depends on ARCH_IMX25 || ARCH_IMX35
+	prompt "fuse_blow"
+
 endmenu
 
 menu "flash                         "
diff --git a/commands/Makefile b/commands/Makefile
index 276af85..aa1c12e 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_CMD_ECHO)		+= echo.o
 obj-$(CONFIG_CMD_MEMORY)	+= mem.o
 obj-$(CONFIG_CMD_LOADS)		+= s_record.o
 obj-$(CONFIG_CMD_MTEST)		+= memtest.o
+obj-$(CONFIG_CMD_FUSE_BLOW)	+= fuse.o
 obj-$(CONFIG_CMD_EDIT)		+= edit.o
 obj-$(CONFIG_CMD_EXEC)		+= exec.o
 obj-$(CONFIG_CMD_SLEEP)		+= sleep.o
diff --git a/commands/fuse.c b/commands/fuse.c
new file mode 100644
index 0000000..1c0ccd6
--- /dev/null
+++ b/commands/fuse.c
@@ -0,0 +1,161 @@
+/*
+ * fuse.c - i.MX IIM fusebox programing and sensing
+ *
+ * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
+ * 	Orex Computed Radiography
+ *
+ * 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.
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <common.h>
+#include <command.h>
+#include <asm/io.h>
+#include <mach/imx-regs.h>
+#include <mach/iim.h>
+
+static int do_fuse_blow(struct command *cmdtp, int argc, char *argv[])
+{
+	unsigned int bank, row, value;
+	int bit, ret = 0;
+	u8 err, stat;
+
+	if (argc != 4)
+		return COMMAND_ERROR_USAGE;
+
+	bank	= simple_strtoul(argv[1], NULL, 0);
+	row	= simple_strtoul(argv[2], NULL, 0);
+	value	= simple_strtoul(argv[3], NULL, 0);
+
+	if (bank > 7) {
+		printf("fuse_blow: invalid bank number\n");
+		return 1;
+	}
+
+	if (row > 0x3ff) {
+		printf("fuse_blow: invalid row offset\n");
+		return 1;
+	}
+
+	if (value > 0xff) {
+		printf("fuse_blow: invalid value\n");
+		return 1;
+	}
+
+	/* clear status and error registers */
+	writeb(3, IMX_IIM_BASE + IIM_STATM);
+	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
+
+	/* unprotect fuse programing */
+	writeb(0xaa, IMX_IIM_BASE + IIM_PREG_P);
+
+	/* upper half address register */
+	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
+
+	for (bit = 0; bit < 8; bit++) {
+		if (((value >> bit) & 1) == 0)
+			continue;
+
+		/* lower half address register */
+		writeb(((row << 1) | bit), IMX_IIM_BASE + IIM_LA);
+
+		/* start fuse programing */
+		writeb(0x71, IMX_IIM_BASE + IIM_FCTL);
+
+		/* wait for program done */
+		while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
+			;
+
+		/* clear program done status */
+		stat = readb(IMX_IIM_BASE + IIM_STAT);
+		writeb(stat, IMX_IIM_BASE + IIM_STAT);
+
+		err = readb(IMX_IIM_BASE + IIM_ERR);
+		if (err) {
+			printf("fuse_blow: bit %d program error (0x%02x)\n",
+					bit, err);
+			ret = 1;
+			goto out;
+		}
+	}
+
+out:
+	/* protect fuse programing */
+	writeb(0, IMX_IIM_BASE + IIM_PREG_P);
+	return ret;
+}
+
+static const __maybe_unused char cmd_fuse_blow_help[] =
+"Usage: fuse_blow <bank> <row> <value>\n"
+"Blow fuses in <bank> <row> to match <value>\n";
+
+BAREBOX_CMD_START(fuse_blow)
+	.cmd	= do_fuse_blow,
+	.usage	= "program fuse row",
+	BAREBOX_CMD_HELP(cmd_fuse_blow_help)
+BAREBOX_CMD_END
+
+static int do_fuse_sense(struct command *cmdtp, int argc, char *argv[])
+{
+	unsigned int bank, row;
+	u8 err, stat;
+
+	if (argc != 3)
+		return COMMAND_ERROR_USAGE;
+
+	bank	= simple_strtoul(argv[1], NULL, 0);
+	row	= simple_strtoul(argv[2], NULL, 0);
+
+	if (bank > 7) {
+		printf("fuse_sense: invalid bank number\n");
+		return 1;
+	}
+
+	if (row > 0x3ff) {
+		printf("fuse_sense: invalid row offset\n");
+		return 1;
+	}
+
+	/* clear status and error registers */
+	writeb(3, IMX_IIM_BASE + IIM_STATM);
+	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
+
+	/* upper and lower address halves */
+	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
+	writeb((row << 1) & 0xf8, IMX_IIM_BASE + IIM_LA);
+
+	/* start fuse sensing */
+	writeb(0x08, IMX_IIM_BASE + IIM_FCTL);
+
+	/* wait for sense done */
+	while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
+		;
+
+	stat =  readb(IMX_IIM_BASE + IIM_STAT);
+	writeb(stat, IMX_IIM_BASE + IIM_STAT);
+
+	err = readb(IMX_IIM_BASE + IIM_ERR);
+	if (err) {
+		printf("fuse_sense: sense error (0x%02x)\n", err);
+		return 1;
+	}
+
+	printf("bank %u row 0x%02x: 0x%02x\n", bank, row,
+			readb(IMX_IIM_BASE + IIM_SDAT));
+
+	return 0;
+}
+
+static const __maybe_unused char cmd_fuse_sense_help[] =
+"Usage: fuse_sense <bank> <row>\n"
+"Sense the fuses row at <bank> <row>\n";
+
+BAREBOX_CMD_START(fuse_sense)
+	.cmd	= do_fuse_sense,
+	.usage	= "sense fuse row",
+	BAREBOX_CMD_HELP(cmd_fuse_sense_help)
+BAREBOX_CMD_END
-- 
1.7.1



From baruch at tkos.co.il  Tue Aug 10 02:25:05 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Tue, 10 Aug 2010 09:25:05 +0300
Subject: [PATCH 2/2] fec: add support for IIM stored mac address
In-Reply-To: <82c0fbf5703ae752521a1bea229a616d4d924583.1281421396.git.baruch@tkos.co.il>
References: <82c0fbf5703ae752521a1bea229a616d4d924583.1281421396.git.baruch@tkos.co.il>
Message-ID: <2241db062357664544bbe6d88770b6696ed4c4b4.1281421396.git.baruch@tkos.co.il>

This patch adds support for i.MX25 only, because that's what I have. Extending
this to other i.MX chip should be trivial, given the right IIM_MAC_ADDR define.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/include/mach/imx25-regs.h |    1 +
 drivers/net/fec_imx.c                       |   10 ++++++++++
 2 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-imx/include/mach/imx25-regs.h b/arch/arm/mach-imx/include/mach/imx25-regs.h
index 7c2b5f9..f3da7b5 100644
--- a/arch/arm/mach-imx/include/mach/imx25-regs.h
+++ b/arch/arm/mach-imx/include/mach/imx25-regs.h
@@ -142,6 +142,7 @@
 
 /* IIM fuse definitions */
 #define IIM_UID		0x820
+#define IIM_MAC_ADDR	0x868
 
 #endif /* __ASM_ARCH_MX25_REGS_H */
 
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 40a7543..af93eec 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -235,6 +235,16 @@ static void fec_rbd_clean(int last, struct buffer_descriptor *pRbd)
 
 static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac)
 {
+	int i;
+
+	if (cpu_is_mx25()) {
+		/* get MAC address from the IMM fusebox */
+		for (i = 0; i < 6; i++)
+			mac[i] = readb(IMX_IIM_BASE + IIM_MAC_ADDR + i*4);
+
+		return 0;
+	}
+
 	/* no eeprom */
 	return -1;
 }
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug 10 03:09:09 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue, 10 Aug 2010 09:09:09 +0200
Subject: [PATCH 1/2] cmd: add fuse_blow/fuse_sense for the i.MX IIM fusebox
In-Reply-To: <82c0fbf5703ae752521a1bea229a616d4d924583.1281421396.git.baruch@tkos.co.il>
References: <82c0fbf5703ae752521a1bea229a616d4d924583.1281421396.git.baruch@tkos.co.il>
Message-ID: <20100810070909.GB10920@game.jcrosoft.org>

Hi,

	sorry I do not really see what the comman do so maybe a small doc or
	more comment will be nice

Best Regards,
J.
On 09:25 Tue 10 Aug     , Baruch Siach wrote:
> This has only been tested on i.MX25, but should work on other i.MX chips with
> IIM.
> 
> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> ---
>  commands/Kconfig  |    5 ++
>  commands/Makefile |    1 +
>  commands/fuse.c   |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 167 insertions(+), 0 deletions(-)
>  create mode 100644 commands/fuse.c
> 
> diff --git a/commands/Kconfig b/commands/Kconfig
> index 9d11a8b..eb3e48e 100644
> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -173,6 +173,11 @@ config CMD_MTEST_ALTERNATIVE
>  	depends on CMD_MTEST
>  	prompt "alternative mtest implementation"
>  
> +config CMD_FUSE_BLOW
> +	tristate
> +	depends on ARCH_IMX25 || ARCH_IMX35
> +	prompt "fuse_blow"
> +
>  endmenu
>  
>  menu "flash                         "
> diff --git a/commands/Makefile b/commands/Makefile
> index 276af85..aa1c12e 100644
> --- a/commands/Makefile
> +++ b/commands/Makefile
> @@ -8,6 +8,7 @@ obj-$(CONFIG_CMD_ECHO)		+= echo.o
>  obj-$(CONFIG_CMD_MEMORY)	+= mem.o
>  obj-$(CONFIG_CMD_LOADS)		+= s_record.o
>  obj-$(CONFIG_CMD_MTEST)		+= memtest.o
> +obj-$(CONFIG_CMD_FUSE_BLOW)	+= fuse.o
>  obj-$(CONFIG_CMD_EDIT)		+= edit.o
>  obj-$(CONFIG_CMD_EXEC)		+= exec.o
>  obj-$(CONFIG_CMD_SLEEP)		+= sleep.o
> diff --git a/commands/fuse.c b/commands/fuse.c
> new file mode 100644
> index 0000000..1c0ccd6
> --- /dev/null
> +++ b/commands/fuse.c
> @@ -0,0 +1,161 @@
> +/*
> + * fuse.c - i.MX IIM fusebox programing and sensing
> + *
> + * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
> + * 	Orex Computed Radiography
> + *
> + * 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.
> + *
> + * http://www.opensource.org/licenses/gpl-license.html
> + * http://www.gnu.org/copyleft/gpl.html
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <asm/io.h>
> +#include <mach/imx-regs.h>
> +#include <mach/iim.h>
> +
> +static int do_fuse_blow(struct command *cmdtp, int argc, char *argv[])
> +{
> +	unsigned int bank, row, value;
> +	int bit, ret = 0;
> +	u8 err, stat;
> +
> +	if (argc != 4)
> +		return COMMAND_ERROR_USAGE;
> +
> +	bank	= simple_strtoul(argv[1], NULL, 0);
> +	row	= simple_strtoul(argv[2], NULL, 0);
> +	value	= simple_strtoul(argv[3], NULL, 0);
> +
> +	if (bank > 7) {
> +		printf("fuse_blow: invalid bank number\n");
> +		return 1;
> +	}
> +
> +	if (row > 0x3ff) {
> +		printf("fuse_blow: invalid row offset\n");
> +		return 1;
> +	}
> +
> +	if (value > 0xff) {
> +		printf("fuse_blow: invalid value\n");
> +		return 1;
> +	}
> +
> +	/* clear status and error registers */
> +	writeb(3, IMX_IIM_BASE + IIM_STATM);
> +	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
> +
> +	/* unprotect fuse programing */
> +	writeb(0xaa, IMX_IIM_BASE + IIM_PREG_P);
> +
> +	/* upper half address register */
> +	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
> +
> +	for (bit = 0; bit < 8; bit++) {
> +		if (((value >> bit) & 1) == 0)
> +			continue;
> +
> +		/* lower half address register */
> +		writeb(((row << 1) | bit), IMX_IIM_BASE + IIM_LA);
> +
> +		/* start fuse programing */
> +		writeb(0x71, IMX_IIM_BASE + IIM_FCTL);
> +
> +		/* wait for program done */
> +		while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
> +			;
> +
> +		/* clear program done status */
> +		stat = readb(IMX_IIM_BASE + IIM_STAT);
> +		writeb(stat, IMX_IIM_BASE + IIM_STAT);
> +
> +		err = readb(IMX_IIM_BASE + IIM_ERR);
> +		if (err) {
> +			printf("fuse_blow: bit %d program error (0x%02x)\n",
> +					bit, err);
> +			ret = 1;
> +			goto out;
> +		}
> +	}
> +
> +out:
> +	/* protect fuse programing */
> +	writeb(0, IMX_IIM_BASE + IIM_PREG_P);
> +	return ret;
> +}
> +
> +static const __maybe_unused char cmd_fuse_blow_help[] =
> +"Usage: fuse_blow <bank> <row> <value>\n"
> +"Blow fuses in <bank> <row> to match <value>\n";
> +
> +BAREBOX_CMD_START(fuse_blow)
> +	.cmd	= do_fuse_blow,
> +	.usage	= "program fuse row",
> +	BAREBOX_CMD_HELP(cmd_fuse_blow_help)
> +BAREBOX_CMD_END
> +
> +static int do_fuse_sense(struct command *cmdtp, int argc, char *argv[])
> +{
> +	unsigned int bank, row;
> +	u8 err, stat;
> +
> +	if (argc != 3)
> +		return COMMAND_ERROR_USAGE;
> +
> +	bank	= simple_strtoul(argv[1], NULL, 0);
> +	row	= simple_strtoul(argv[2], NULL, 0);
> +
> +	if (bank > 7) {
> +		printf("fuse_sense: invalid bank number\n");
> +		return 1;
> +	}
> +
> +	if (row > 0x3ff) {
> +		printf("fuse_sense: invalid row offset\n");
> +		return 1;
> +	}
> +
> +	/* clear status and error registers */
> +	writeb(3, IMX_IIM_BASE + IIM_STATM);
> +	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
> +
> +	/* upper and lower address halves */
> +	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
> +	writeb((row << 1) & 0xf8, IMX_IIM_BASE + IIM_LA);
> +
> +	/* start fuse sensing */
> +	writeb(0x08, IMX_IIM_BASE + IIM_FCTL);
> +
> +	/* wait for sense done */
> +	while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
> +		;
> +
> +	stat =  readb(IMX_IIM_BASE + IIM_STAT);
> +	writeb(stat, IMX_IIM_BASE + IIM_STAT);
> +
> +	err = readb(IMX_IIM_BASE + IIM_ERR);
> +	if (err) {
> +		printf("fuse_sense: sense error (0x%02x)\n", err);
> +		return 1;
> +	}
> +
> +	printf("bank %u row 0x%02x: 0x%02x\n", bank, row,
> +			readb(IMX_IIM_BASE + IIM_SDAT));
> +
> +	return 0;
> +}
> +
> +static const __maybe_unused char cmd_fuse_sense_help[] =
> +"Usage: fuse_sense <bank> <row>\n"
> +"Sense the fuses row at <bank> <row>\n";
> +
> +BAREBOX_CMD_START(fuse_sense)
> +	.cmd	= do_fuse_sense,
> +	.usage	= "sense fuse row",
> +	BAREBOX_CMD_HELP(cmd_fuse_sense_help)
> +BAREBOX_CMD_END
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox


From baruch at tkos.co.il  Tue Aug 10 08:06:51 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Tue, 10 Aug 2010 15:06:51 +0300
Subject: [PATCH] cp: fix help text
Message-ID: <ae2bb35f25192515bafff6a78a1b7f915b9f0b53.1281441977.git.baruch@tkos.co.il>

Copy to target directory is supported since commit b36fca0c, circa 2007.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 commands/cp.c |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/commands/cp.c b/commands/cp.c
index a0c7c84..2c35ba1 100644
--- a/commands/cp.c
+++ b/commands/cp.c
@@ -80,8 +80,6 @@ out:
 static const __maybe_unused char cmd_cp_help[] =
 "Usage: cp <source> <destination>\n"
 "cp copies file <source> to <destination>.\n"
-"Currently only this form is supported and you have to specify the exact target\n"
-"filename (not a target directory).\n"
 "This command is file based only. See memcpy for memory copy\n";
 
 BAREBOX_CMD_START(cp)
-- 
1.7.1



From m.grzeschik at pengutronix.de  Wed Aug 11 05:53:29 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Wed, 11 Aug 2010 11:53:29 +0200
Subject: [PATCH|RFC] loadb: get console baudrate from class_dev not dev
Message-ID: <1281520409-27408-1-git-send-email-m.grzeschik@pengutronix.de>

With this fix its possible to run loadb -f /dev/ram0
again with the latest next patchstack. Without you will
run into data_abort. Tested with omap3530 beagleboard.

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 commands/loadb.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/commands/loadb.c b/commands/loadb.c
index 437b60f..acfb94f 100644
--- a/commands/loadb.c
+++ b/commands/loadb.c
@@ -724,7 +724,7 @@ static int do_load_serial_bin(struct command *cmdtp, int argc, char *argv[])
 		printf("%s:No console device with STDIN and STDOUT\n", argv[0]);
 		return -ENODEV;
 	}
-	current_baudrate = (int)simple_strtoul(dev_get_param(cdev->dev, "baudrate"), NULL, 10);
+	current_baudrate = (int)simple_strtoul(dev_get_param(&cdev->class_dev, "baudrate"), NULL, 10);
 
 	/* Load Defaults */
 	if (load_baudrate == 0)
-- 
1.7.1



From s.hauer at pengutronix.de  Wed Aug 11 09:00:49 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Wed, 11 Aug 2010 15:00:49 +0200
Subject: [PATCH] cp: fix help text
In-Reply-To: <ae2bb35f25192515bafff6a78a1b7f915b9f0b53.1281441977.git.baruch@tkos.co.il>
References: <ae2bb35f25192515bafff6a78a1b7f915b9f0b53.1281441977.git.baruch@tkos.co.il>
Message-ID: <20100811130049.GT27749@pengutronix.de>

Hi Baruch,

On Tue, Aug 10, 2010 at 03:06:51PM +0300, Baruch Siach wrote:
> Copy to target directory is supported since commit b36fca0c, circa 2007.

Applied to master. Thank you for working on the help texts, it seems
they can use some maintenance.

Sascha

> 
> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> ---
>  commands/cp.c |    2 --
>  1 files changed, 0 insertions(+), 2 deletions(-)
> 
> diff --git a/commands/cp.c b/commands/cp.c
> index a0c7c84..2c35ba1 100644
> --- a/commands/cp.c
> +++ b/commands/cp.c
> @@ -80,8 +80,6 @@ out:
>  static const __maybe_unused char cmd_cp_help[] =
>  "Usage: cp <source> <destination>\n"
>  "cp copies file <source> to <destination>.\n"
> -"Currently only this form is supported and you have to specify the exact target\n"
> -"filename (not a target directory).\n"
>  "This command is file based only. See memcpy for memory copy\n";
>  
>  BAREBOX_CMD_START(cp)
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Thu Aug 12 04:34:10 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Thu, 12 Aug 2010 11:34:10 +0300
Subject: [PATCH 1/2] cmd: add fuse_blow/fuse_sense for the i.MX IIM fusebox
In-Reply-To: <20100810070909.GB10920@game.jcrosoft.org>
References: <82c0fbf5703ae752521a1bea229a616d4d924583.1281421396.git.baruch@tkos.co.il>
	<20100810070909.GB10920@game.jcrosoft.org>
Message-ID: <20100812083409.GD13166@jasper.tkos.co.il>

Hi Jean-Christophe

On Tue, Aug 10, 2010 at 09:09:09AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> 	sorry I do not really see what the comman do so maybe a small doc or
> 	more comment will be nice

OK. I'll add a documentation comment and resubmit.

baruch

> On 09:25 Tue 10 Aug     , Baruch Siach wrote:
> > This has only been tested on i.MX25, but should work on other i.MX chips with
> > IIM.
> > 
> > Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> > ---
> >  commands/Kconfig  |    5 ++
> >  commands/Makefile |    1 +
> >  commands/fuse.c   |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 167 insertions(+), 0 deletions(-)
> >  create mode 100644 commands/fuse.c
> > 
> > diff --git a/commands/Kconfig b/commands/Kconfig
> > index 9d11a8b..eb3e48e 100644
> > --- a/commands/Kconfig
> > +++ b/commands/Kconfig
> > @@ -173,6 +173,11 @@ config CMD_MTEST_ALTERNATIVE
> >  	depends on CMD_MTEST
> >  	prompt "alternative mtest implementation"
> >  
> > +config CMD_FUSE_BLOW
> > +	tristate
> > +	depends on ARCH_IMX25 || ARCH_IMX35
> > +	prompt "fuse_blow"
> > +
> >  endmenu
> >  
> >  menu "flash                         "
> > diff --git a/commands/Makefile b/commands/Makefile
> > index 276af85..aa1c12e 100644
> > --- a/commands/Makefile
> > +++ b/commands/Makefile
> > @@ -8,6 +8,7 @@ obj-$(CONFIG_CMD_ECHO)		+= echo.o
> >  obj-$(CONFIG_CMD_MEMORY)	+= mem.o
> >  obj-$(CONFIG_CMD_LOADS)		+= s_record.o
> >  obj-$(CONFIG_CMD_MTEST)		+= memtest.o
> > +obj-$(CONFIG_CMD_FUSE_BLOW)	+= fuse.o
> >  obj-$(CONFIG_CMD_EDIT)		+= edit.o
> >  obj-$(CONFIG_CMD_EXEC)		+= exec.o
> >  obj-$(CONFIG_CMD_SLEEP)		+= sleep.o
> > diff --git a/commands/fuse.c b/commands/fuse.c
> > new file mode 100644
> > index 0000000..1c0ccd6
> > --- /dev/null
> > +++ b/commands/fuse.c
> > @@ -0,0 +1,161 @@
> > +/*
> > + * fuse.c - i.MX IIM fusebox programing and sensing
> > + *
> > + * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
> > + * 	Orex Computed Radiography
> > + *
> > + * 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.
> > + *
> > + * http://www.opensource.org/licenses/gpl-license.html
> > + * http://www.gnu.org/copyleft/gpl.html
> > + */
> > +
> > +#include <common.h>
> > +#include <command.h>
> > +#include <asm/io.h>
> > +#include <mach/imx-regs.h>
> > +#include <mach/iim.h>
> > +
> > +static int do_fuse_blow(struct command *cmdtp, int argc, char *argv[])
> > +{
> > +	unsigned int bank, row, value;
> > +	int bit, ret = 0;
> > +	u8 err, stat;
> > +
> > +	if (argc != 4)
> > +		return COMMAND_ERROR_USAGE;
> > +
> > +	bank	= simple_strtoul(argv[1], NULL, 0);
> > +	row	= simple_strtoul(argv[2], NULL, 0);
> > +	value	= simple_strtoul(argv[3], NULL, 0);
> > +
> > +	if (bank > 7) {
> > +		printf("fuse_blow: invalid bank number\n");
> > +		return 1;
> > +	}
> > +
> > +	if (row > 0x3ff) {
> > +		printf("fuse_blow: invalid row offset\n");
> > +		return 1;
> > +	}
> > +
> > +	if (value > 0xff) {
> > +		printf("fuse_blow: invalid value\n");
> > +		return 1;
> > +	}
> > +
> > +	/* clear status and error registers */
> > +	writeb(3, IMX_IIM_BASE + IIM_STATM);
> > +	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
> > +
> > +	/* unprotect fuse programing */
> > +	writeb(0xaa, IMX_IIM_BASE + IIM_PREG_P);
> > +
> > +	/* upper half address register */
> > +	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
> > +
> > +	for (bit = 0; bit < 8; bit++) {
> > +		if (((value >> bit) & 1) == 0)
> > +			continue;
> > +
> > +		/* lower half address register */
> > +		writeb(((row << 1) | bit), IMX_IIM_BASE + IIM_LA);
> > +
> > +		/* start fuse programing */
> > +		writeb(0x71, IMX_IIM_BASE + IIM_FCTL);
> > +
> > +		/* wait for program done */
> > +		while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
> > +			;
> > +
> > +		/* clear program done status */
> > +		stat = readb(IMX_IIM_BASE + IIM_STAT);
> > +		writeb(stat, IMX_IIM_BASE + IIM_STAT);
> > +
> > +		err = readb(IMX_IIM_BASE + IIM_ERR);
> > +		if (err) {
> > +			printf("fuse_blow: bit %d program error (0x%02x)\n",
> > +					bit, err);
> > +			ret = 1;
> > +			goto out;
> > +		}
> > +	}
> > +
> > +out:
> > +	/* protect fuse programing */
> > +	writeb(0, IMX_IIM_BASE + IIM_PREG_P);
> > +	return ret;
> > +}
> > +
> > +static const __maybe_unused char cmd_fuse_blow_help[] =
> > +"Usage: fuse_blow <bank> <row> <value>\n"
> > +"Blow fuses in <bank> <row> to match <value>\n";
> > +
> > +BAREBOX_CMD_START(fuse_blow)
> > +	.cmd	= do_fuse_blow,
> > +	.usage	= "program fuse row",
> > +	BAREBOX_CMD_HELP(cmd_fuse_blow_help)
> > +BAREBOX_CMD_END
> > +
> > +static int do_fuse_sense(struct command *cmdtp, int argc, char *argv[])
> > +{
> > +	unsigned int bank, row;
> > +	u8 err, stat;
> > +
> > +	if (argc != 3)
> > +		return COMMAND_ERROR_USAGE;
> > +
> > +	bank	= simple_strtoul(argv[1], NULL, 0);
> > +	row	= simple_strtoul(argv[2], NULL, 0);
> > +
> > +	if (bank > 7) {
> > +		printf("fuse_sense: invalid bank number\n");
> > +		return 1;
> > +	}
> > +
> > +	if (row > 0x3ff) {
> > +		printf("fuse_sense: invalid row offset\n");
> > +		return 1;
> > +	}
> > +
> > +	/* clear status and error registers */
> > +	writeb(3, IMX_IIM_BASE + IIM_STATM);
> > +	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
> > +
> > +	/* upper and lower address halves */
> > +	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
> > +	writeb((row << 1) & 0xf8, IMX_IIM_BASE + IIM_LA);
> > +
> > +	/* start fuse sensing */
> > +	writeb(0x08, IMX_IIM_BASE + IIM_FCTL);
> > +
> > +	/* wait for sense done */
> > +	while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
> > +		;
> > +
> > +	stat =  readb(IMX_IIM_BASE + IIM_STAT);
> > +	writeb(stat, IMX_IIM_BASE + IIM_STAT);
> > +
> > +	err = readb(IMX_IIM_BASE + IIM_ERR);
> > +	if (err) {
> > +		printf("fuse_sense: sense error (0x%02x)\n", err);
> > +		return 1;
> > +	}
> > +
> > +	printf("bank %u row 0x%02x: 0x%02x\n", bank, row,
> > +			readb(IMX_IIM_BASE + IIM_SDAT));
> > +
> > +	return 0;
> > +}
> > +
> > +static const __maybe_unused char cmd_fuse_sense_help[] =
> > +"Usage: fuse_sense <bank> <row>\n"
> > +"Sense the fuses row at <bank> <row>\n";
> > +
> > +BAREBOX_CMD_START(fuse_sense)
> > +	.cmd	= do_fuse_sense,
> > +	.usage	= "sense fuse row",
> > +	BAREBOX_CMD_HELP(cmd_fuse_sense_help)
> > +BAREBOX_CMD_END
> > -- 
> > 1.7.1

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From baruch at tkos.co.il  Thu Aug 12 04:35:04 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Thu, 12 Aug 2010 11:35:04 +0300
Subject: [PATCH v2 1/2] cmd: add fuse_blow/fuse_sense for the i.MX IIM fusebox
In-Reply-To: <20100810070909.GB10920@game.jcrosoft.org>
References: <20100810070909.GB10920@game.jcrosoft.org>
Message-ID: <5a5cd75e51961a57b99c0727faa8b3eaa619b943.1281601710.git.baruch@tkos.co.il>

This has only been tested on i.MX25, but should work on other i.MX chips with
IIM.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
Changes from v1:
	Improve commands documentation and add a comment describing the fuse 
	commands.
	Make fuse_blow and fuse_sense build independent from each other.

 commands/Kconfig  |   10 +++
 commands/Makefile |    2 +
 commands/fuse.c   |  175 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 187 insertions(+), 0 deletions(-)
 create mode 100644 commands/fuse.c

diff --git a/commands/Kconfig b/commands/Kconfig
index 9d11a8b..1eae0d7 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -173,6 +173,16 @@ config CMD_MTEST_ALTERNATIVE
 	depends on CMD_MTEST
 	prompt "alternative mtest implementation"
 
+config CMD_FUSE_BLOW
+	tristate
+	depends on ARCH_IMX25 || ARCH_IMX35
+	prompt "fuse_blow"
+
+config CMD_FUSE_SENSE
+	tristate
+	depends on ARCH_IMX25 || ARCH_IMX35
+	prompt "fuse_sense"
+
 endmenu
 
 menu "flash                         "
diff --git a/commands/Makefile b/commands/Makefile
index 276af85..3c4e1d1 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -8,6 +8,8 @@ obj-$(CONFIG_CMD_ECHO)		+= echo.o
 obj-$(CONFIG_CMD_MEMORY)	+= mem.o
 obj-$(CONFIG_CMD_LOADS)		+= s_record.o
 obj-$(CONFIG_CMD_MTEST)		+= memtest.o
+obj-$(CONFIG_CMD_FUSE_BLOW)	+= fuse.o
+obj-$(CONFIG_CMD_FUSE_SENSE)	+= fuse.o
 obj-$(CONFIG_CMD_EDIT)		+= edit.o
 obj-$(CONFIG_CMD_EXEC)		+= exec.o
 obj-$(CONFIG_CMD_SLEEP)		+= sleep.o
diff --git a/commands/fuse.c b/commands/fuse.c
new file mode 100644
index 0000000..c9059b3
--- /dev/null
+++ b/commands/fuse.c
@@ -0,0 +1,175 @@
+/*
+ * fuse.c - i.MX IIM fusebox programing and sensing
+ * 
+ * Provide an interface for programming and sensing the information that are
+ * stored in on-chip fuse elements. This functionality is part of the IC
+ * Identification Module (IIM), which is present on some i.MX CPUs.
+ *
+ * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
+ * 	Orex Computed Radiography
+ *
+ * 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.
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <common.h>
+#include <command.h>
+#include <asm/io.h>
+#include <mach/imx-regs.h>
+#include <mach/iim.h>
+
+#ifdef CONFIG_CMD_FUSE_BLOW
+
+static int do_fuse_blow(struct command *cmdtp, int argc, char *argv[])
+{
+	unsigned int bank, row, value;
+	int bit, ret = 0;
+	u8 err, stat;
+
+	if (argc != 4)
+		return COMMAND_ERROR_USAGE;
+
+	bank	= simple_strtoul(argv[1], NULL, 0);
+	row	= simple_strtoul(argv[2], NULL, 0);
+	value	= simple_strtoul(argv[3], NULL, 0);
+
+	if (bank > 7) {
+		printf("fuse_blow: invalid bank number\n");
+		return 1;
+	}
+
+	if (row > 0x3ff) {
+		printf("fuse_blow: invalid row offset\n");
+		return 1;
+	}
+
+	if (value > 0xff) {
+		printf("fuse_blow: invalid value\n");
+		return 1;
+	}
+
+	/* clear status and error registers */
+	writeb(3, IMX_IIM_BASE + IIM_STATM);
+	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
+
+	/* unprotect fuse programing */
+	writeb(0xaa, IMX_IIM_BASE + IIM_PREG_P);
+
+	/* upper half address register */
+	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
+
+	for (bit = 0; bit < 8; bit++) {
+		if (((value >> bit) & 1) == 0)
+			continue;
+
+		/* lower half address register */
+		writeb(((row << 1) | bit), IMX_IIM_BASE + IIM_LA);
+
+		/* start fuse programing */
+		writeb(0x71, IMX_IIM_BASE + IIM_FCTL);
+
+		/* wait for program done */
+		while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
+			;
+
+		/* clear program done status */
+		stat = readb(IMX_IIM_BASE + IIM_STAT);
+		writeb(stat, IMX_IIM_BASE + IIM_STAT);
+
+		err = readb(IMX_IIM_BASE + IIM_ERR);
+		if (err) {
+			printf("fuse_blow: bit %d program error (0x%02x)\n",
+					bit, err);
+			ret = 1;
+			goto out;
+		}
+	}
+
+out:
+	/* protect fuse programing */
+	writeb(0, IMX_IIM_BASE + IIM_PREG_P);
+	return ret;
+}
+
+static const __maybe_unused char cmd_fuse_blow_help[] =
+"Usage: fuse_blow <bank> <row> <value>\n"
+"Blow unblown fuses in <bank> <row> to match <value>\n"
+"Blown fuses are read as 1. Unblown fuses are read as 0.\n"
+"WARNING: blown fuses can not be unblown. Use this command carefully.\n";
+
+BAREBOX_CMD_START(fuse_blow)
+	.cmd	= do_fuse_blow,
+	.usage	= "program a row of fuses (8 bit)",
+	BAREBOX_CMD_HELP(cmd_fuse_blow_help)
+BAREBOX_CMD_END
+
+#endif /* CONFIG_CMD_FUSE_BLOW */
+
+#ifdef CONFIG_CMD_FUSE_SENSE
+
+static int do_fuse_sense(struct command *cmdtp, int argc, char *argv[])
+{
+	unsigned int bank, row;
+	u8 err, stat;
+
+	if (argc != 3)
+		return COMMAND_ERROR_USAGE;
+
+	bank	= simple_strtoul(argv[1], NULL, 0);
+	row	= simple_strtoul(argv[2], NULL, 0);
+
+	if (bank > 7) {
+		printf("fuse_sense: invalid bank number\n");
+		return 1;
+	}
+
+	if (row > 0x3ff) {
+		printf("fuse_sense: invalid row offset\n");
+		return 1;
+	}
+
+	/* clear status and error registers */
+	writeb(3, IMX_IIM_BASE + IIM_STATM);
+	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
+
+	/* upper and lower address halves */
+	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
+	writeb((row << 1) & 0xf8, IMX_IIM_BASE + IIM_LA);
+
+	/* start fuse sensing */
+	writeb(0x08, IMX_IIM_BASE + IIM_FCTL);
+
+	/* wait for sense done */
+	while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
+		;
+
+	stat =  readb(IMX_IIM_BASE + IIM_STAT);
+	writeb(stat, IMX_IIM_BASE + IIM_STAT);
+
+	err = readb(IMX_IIM_BASE + IIM_ERR);
+	if (err) {
+		printf("fuse_sense: sense error (0x%02x)\n", err);
+		return 1;
+	}
+
+	printf("bank %u row 0x%02x: 0x%02x\n", bank, row,
+			readb(IMX_IIM_BASE + IIM_SDAT));
+
+	return 0;
+}
+
+static const __maybe_unused char cmd_fuse_sense_help[] =
+"Usage: fuse_sense <bank> <row>\n"
+"Sense the fuses row at <bank> <row>\n";
+
+BAREBOX_CMD_START(fuse_sense)
+	.cmd	= do_fuse_sense,
+	.usage	= "sense a row of fuses (8 bit)",
+	BAREBOX_CMD_HELP(cmd_fuse_sense_help)
+BAREBOX_CMD_END
+
+#endif /* CONFIG_CMD_FUSE_SENSE */
-- 
1.7.1



From baruch at tkos.co.il  Thu Aug 12 04:35:05 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Thu, 12 Aug 2010 11:35:05 +0300
Subject: [PATCH v2 2/2] fec: add support for IIM stored mac address
In-Reply-To: <20100810070909.GB10920@game.jcrosoft.org>
References: <20100810070909.GB10920@game.jcrosoft.org>
Message-ID: <ba83c1b01580c57b7ec4ac20722d09331c93515b.1281601710.git.baruch@tkos.co.il>

This patch adds support for i.MX25 only, because that's what I have. Extending
this to other i.MX chip should be trivial, given the right IIM_MAC_ADDR define.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
Changes from v1:
	Add mach/generic.h include for the cpu_is_mx25 macro.

 arch/arm/mach-imx/include/mach/imx25-regs.h |    1 +
 drivers/net/fec_imx.c                       |   11 +++++++++++
 2 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-imx/include/mach/imx25-regs.h b/arch/arm/mach-imx/include/mach/imx25-regs.h
index 7c2b5f9..f3da7b5 100644
--- a/arch/arm/mach-imx/include/mach/imx25-regs.h
+++ b/arch/arm/mach-imx/include/mach/imx25-regs.h
@@ -142,6 +142,7 @@
 
 /* IIM fuse definitions */
 #define IIM_UID		0x820
+#define IIM_MAC_ADDR	0x868
 
 #endif /* __ASM_ARCH_MX25_REGS_H */
 
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 40a7543..c29119c 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -32,6 +32,7 @@
 #include <mach/imx-regs.h>
 #include <clock.h>
 #include <mach/clock.h>
+#include <mach/generic.h>
 #include <xfuncs.h>
 
 #include "fec_imx.h"
@@ -235,6 +236,16 @@ static void fec_rbd_clean(int last, struct buffer_descriptor *pRbd)
 
 static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac)
 {
+	int i;
+
+	if (cpu_is_mx25()) {
+		/* get MAC address from the IMM fusebox */
+		for (i = 0; i < 6; i++)
+			mac[i] = readb(IMX_IIM_BASE + IIM_MAC_ADDR + i*4);
+
+		return 0;
+	}
+
 	/* no eeprom */
 	return -1;
 }
-- 
1.7.1



From s.hauer at pengutronix.de  Thu Aug 12 05:06:00 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Thu, 12 Aug 2010 11:06:00 +0200
Subject: [PATCH v2 1/2] cmd: add fuse_blow/fuse_sense for the i.MX IIM
	fusebox
In-Reply-To: <5a5cd75e51961a57b99c0727faa8b3eaa619b943.1281601710.git.baruch@tkos.co.il>
References: <20100810070909.GB10920@game.jcrosoft.org>
	<5a5cd75e51961a57b99c0727faa8b3eaa619b943.1281601710.git.baruch@tkos.co.il>
Message-ID: <20100812090600.GY27749@pengutronix.de>

On Thu, Aug 12, 2010 at 11:35:04AM +0300, Baruch Siach wrote:
> This has only been tested on i.MX25, but should work on other i.MX chips with
> IIM.

I would prefer this command to be implemented as a device driver which
registers a file under /dev. This way we could use the standard md/mw
commands for this and look at a nice hexdump of all fuses and not only
one at a time.
As blowing fuses is quite dangerous, an additional iim.writeenable
variable would be good.

Sorry, but a command with three positional arguments is just so U-Boot.

Sascha

> 
> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> ---
> Changes from v1:
> 	Improve commands documentation and add a comment describing the fuse 
> 	commands.
> 	Make fuse_blow and fuse_sense build independent from each other.
> 
>  commands/Kconfig  |   10 +++
>  commands/Makefile |    2 +
>  commands/fuse.c   |  175 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 187 insertions(+), 0 deletions(-)
>  create mode 100644 commands/fuse.c
> 
> diff --git a/commands/Kconfig b/commands/Kconfig
> index 9d11a8b..1eae0d7 100644
> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -173,6 +173,16 @@ config CMD_MTEST_ALTERNATIVE
>  	depends on CMD_MTEST
>  	prompt "alternative mtest implementation"
>  
> +config CMD_FUSE_BLOW
> +	tristate
> +	depends on ARCH_IMX25 || ARCH_IMX35
> +	prompt "fuse_blow"
> +
> +config CMD_FUSE_SENSE
> +	tristate
> +	depends on ARCH_IMX25 || ARCH_IMX35
> +	prompt "fuse_sense"
> +
>  endmenu
>  
>  menu "flash                         "
> diff --git a/commands/Makefile b/commands/Makefile
> index 276af85..3c4e1d1 100644
> --- a/commands/Makefile
> +++ b/commands/Makefile
> @@ -8,6 +8,8 @@ obj-$(CONFIG_CMD_ECHO)		+= echo.o
>  obj-$(CONFIG_CMD_MEMORY)	+= mem.o
>  obj-$(CONFIG_CMD_LOADS)		+= s_record.o
>  obj-$(CONFIG_CMD_MTEST)		+= memtest.o
> +obj-$(CONFIG_CMD_FUSE_BLOW)	+= fuse.o
> +obj-$(CONFIG_CMD_FUSE_SENSE)	+= fuse.o
>  obj-$(CONFIG_CMD_EDIT)		+= edit.o
>  obj-$(CONFIG_CMD_EXEC)		+= exec.o
>  obj-$(CONFIG_CMD_SLEEP)		+= sleep.o
> diff --git a/commands/fuse.c b/commands/fuse.c
> new file mode 100644
> index 0000000..c9059b3
> --- /dev/null
> +++ b/commands/fuse.c
> @@ -0,0 +1,175 @@
> +/*
> + * fuse.c - i.MX IIM fusebox programing and sensing
> + * 
> + * Provide an interface for programming and sensing the information that are
> + * stored in on-chip fuse elements. This functionality is part of the IC
> + * Identification Module (IIM), which is present on some i.MX CPUs.
> + *
> + * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
> + * 	Orex Computed Radiography
> + *
> + * 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.
> + *
> + * http://www.opensource.org/licenses/gpl-license.html
> + * http://www.gnu.org/copyleft/gpl.html
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <asm/io.h>
> +#include <mach/imx-regs.h>
> +#include <mach/iim.h>
> +
> +#ifdef CONFIG_CMD_FUSE_BLOW
> +
> +static int do_fuse_blow(struct command *cmdtp, int argc, char *argv[])
> +{
> +	unsigned int bank, row, value;
> +	int bit, ret = 0;
> +	u8 err, stat;
> +
> +	if (argc != 4)
> +		return COMMAND_ERROR_USAGE;
> +
> +	bank	= simple_strtoul(argv[1], NULL, 0);
> +	row	= simple_strtoul(argv[2], NULL, 0);
> +	value	= simple_strtoul(argv[3], NULL, 0);
> +
> +	if (bank > 7) {
> +		printf("fuse_blow: invalid bank number\n");
> +		return 1;
> +	}
> +
> +	if (row > 0x3ff) {
> +		printf("fuse_blow: invalid row offset\n");
> +		return 1;
> +	}
> +
> +	if (value > 0xff) {
> +		printf("fuse_blow: invalid value\n");
> +		return 1;
> +	}
> +
> +	/* clear status and error registers */
> +	writeb(3, IMX_IIM_BASE + IIM_STATM);
> +	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
> +
> +	/* unprotect fuse programing */
> +	writeb(0xaa, IMX_IIM_BASE + IIM_PREG_P);
> +
> +	/* upper half address register */
> +	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
> +
> +	for (bit = 0; bit < 8; bit++) {
> +		if (((value >> bit) & 1) == 0)
> +			continue;
> +
> +		/* lower half address register */
> +		writeb(((row << 1) | bit), IMX_IIM_BASE + IIM_LA);
> +
> +		/* start fuse programing */
> +		writeb(0x71, IMX_IIM_BASE + IIM_FCTL);
> +
> +		/* wait for program done */
> +		while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
> +			;
> +
> +		/* clear program done status */
> +		stat = readb(IMX_IIM_BASE + IIM_STAT);
> +		writeb(stat, IMX_IIM_BASE + IIM_STAT);
> +
> +		err = readb(IMX_IIM_BASE + IIM_ERR);
> +		if (err) {
> +			printf("fuse_blow: bit %d program error (0x%02x)\n",
> +					bit, err);
> +			ret = 1;
> +			goto out;
> +		}
> +	}
> +
> +out:
> +	/* protect fuse programing */
> +	writeb(0, IMX_IIM_BASE + IIM_PREG_P);
> +	return ret;
> +}
> +
> +static const __maybe_unused char cmd_fuse_blow_help[] =
> +"Usage: fuse_blow <bank> <row> <value>\n"
> +"Blow unblown fuses in <bank> <row> to match <value>\n"
> +"Blown fuses are read as 1. Unblown fuses are read as 0.\n"
> +"WARNING: blown fuses can not be unblown. Use this command carefully.\n";
> +
> +BAREBOX_CMD_START(fuse_blow)
> +	.cmd	= do_fuse_blow,
> +	.usage	= "program a row of fuses (8 bit)",
> +	BAREBOX_CMD_HELP(cmd_fuse_blow_help)
> +BAREBOX_CMD_END
> +
> +#endif /* CONFIG_CMD_FUSE_BLOW */
> +
> +#ifdef CONFIG_CMD_FUSE_SENSE
> +
> +static int do_fuse_sense(struct command *cmdtp, int argc, char *argv[])
> +{
> +	unsigned int bank, row;
> +	u8 err, stat;
> +
> +	if (argc != 3)
> +		return COMMAND_ERROR_USAGE;
> +
> +	bank	= simple_strtoul(argv[1], NULL, 0);
> +	row	= simple_strtoul(argv[2], NULL, 0);
> +
> +	if (bank > 7) {
> +		printf("fuse_sense: invalid bank number\n");
> +		return 1;
> +	}
> +
> +	if (row > 0x3ff) {
> +		printf("fuse_sense: invalid row offset\n");
> +		return 1;
> +	}
> +
> +	/* clear status and error registers */
> +	writeb(3, IMX_IIM_BASE + IIM_STATM);
> +	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
> +
> +	/* upper and lower address halves */
> +	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
> +	writeb((row << 1) & 0xf8, IMX_IIM_BASE + IIM_LA);
> +
> +	/* start fuse sensing */
> +	writeb(0x08, IMX_IIM_BASE + IIM_FCTL);
> +
> +	/* wait for sense done */
> +	while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
> +		;
> +
> +	stat =  readb(IMX_IIM_BASE + IIM_STAT);
> +	writeb(stat, IMX_IIM_BASE + IIM_STAT);
> +
> +	err = readb(IMX_IIM_BASE + IIM_ERR);
> +	if (err) {
> +		printf("fuse_sense: sense error (0x%02x)\n", err);
> +		return 1;
> +	}
> +
> +	printf("bank %u row 0x%02x: 0x%02x\n", bank, row,
> +			readb(IMX_IIM_BASE + IIM_SDAT));
> +
> +	return 0;
> +}
> +
> +static const __maybe_unused char cmd_fuse_sense_help[] =
> +"Usage: fuse_sense <bank> <row>\n"
> +"Sense the fuses row at <bank> <row>\n";
> +
> +BAREBOX_CMD_START(fuse_sense)
> +	.cmd	= do_fuse_sense,
> +	.usage	= "sense a row of fuses (8 bit)",
> +	BAREBOX_CMD_HELP(cmd_fuse_sense_help)
> +BAREBOX_CMD_END
> +
> +#endif /* CONFIG_CMD_FUSE_SENSE */
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Thu Aug 12 05:27:01 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Thu, 12 Aug 2010 12:27:01 +0300
Subject: [PATCH v2 1/2] cmd: add fuse_blow/fuse_sense for the i.MX IIM
	fusebox
In-Reply-To: <20100812090600.GY27749@pengutronix.de>
References: <20100810070909.GB10920@game.jcrosoft.org>
	<5a5cd75e51961a57b99c0727faa8b3eaa619b943.1281601710.git.baruch@tkos.co.il>
	<20100812090600.GY27749@pengutronix.de>
Message-ID: <20100812092701.GE13166@jasper.tkos.co.il>

Hi Sascha,

On Thu, Aug 12, 2010 at 11:06:00AM +0200, Sascha Hauer wrote:
> On Thu, Aug 12, 2010 at 11:35:04AM +0300, Baruch Siach wrote:
> > This has only been tested on i.MX25, but should work on other i.MX chips with
> > IIM.
> 
> I would prefer this command to be implemented as a device driver which
> registers a file under /dev. This way we could use the standard md/mw
> commands for this and look at a nice hexdump of all fuses and not only
> one at a time.

There are two methods for getting fuses values, direct memory access, and 
explicit sensing. Each method can independently be disabled with two dedicated 
protect fuses. How can md choose the right sensing method?

The IIM block also has an override functionality. Direct memory write to the 
fuse row overrides the value in this row. This feature can also be disabled 
with an override protect fuse. How does mw know whether you want to blow the 
fuses, or just override them?

Currently, you can sense fuses using the direct memory access method, and also 
override fuses with the regular md/mw command over /dev/mem.

baruch

> As blowing fuses is quite dangerous, an additional iim.writeenable
> variable would be good.
> 
> Sorry, but a command with three positional arguments is just so U-Boot.
> 
> Sascha
> 
> > 
> > Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> > ---
> > Changes from v1:
> > 	Improve commands documentation and add a comment describing the fuse 
> > 	commands.
> > 	Make fuse_blow and fuse_sense build independent from each other.
> > 
> >  commands/Kconfig  |   10 +++
> >  commands/Makefile |    2 +
> >  commands/fuse.c   |  175 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 187 insertions(+), 0 deletions(-)
> >  create mode 100644 commands/fuse.c
> > 
> > diff --git a/commands/Kconfig b/commands/Kconfig
> > index 9d11a8b..1eae0d7 100644
> > --- a/commands/Kconfig
> > +++ b/commands/Kconfig
> > @@ -173,6 +173,16 @@ config CMD_MTEST_ALTERNATIVE
> >  	depends on CMD_MTEST
> >  	prompt "alternative mtest implementation"
> >  
> > +config CMD_FUSE_BLOW
> > +	tristate
> > +	depends on ARCH_IMX25 || ARCH_IMX35
> > +	prompt "fuse_blow"
> > +
> > +config CMD_FUSE_SENSE
> > +	tristate
> > +	depends on ARCH_IMX25 || ARCH_IMX35
> > +	prompt "fuse_sense"
> > +
> >  endmenu
> >  
> >  menu "flash                         "
> > diff --git a/commands/Makefile b/commands/Makefile
> > index 276af85..3c4e1d1 100644
> > --- a/commands/Makefile
> > +++ b/commands/Makefile
> > @@ -8,6 +8,8 @@ obj-$(CONFIG_CMD_ECHO)		+= echo.o
> >  obj-$(CONFIG_CMD_MEMORY)	+= mem.o
> >  obj-$(CONFIG_CMD_LOADS)		+= s_record.o
> >  obj-$(CONFIG_CMD_MTEST)		+= memtest.o
> > +obj-$(CONFIG_CMD_FUSE_BLOW)	+= fuse.o
> > +obj-$(CONFIG_CMD_FUSE_SENSE)	+= fuse.o
> >  obj-$(CONFIG_CMD_EDIT)		+= edit.o
> >  obj-$(CONFIG_CMD_EXEC)		+= exec.o
> >  obj-$(CONFIG_CMD_SLEEP)		+= sleep.o
> > diff --git a/commands/fuse.c b/commands/fuse.c
> > new file mode 100644
> > index 0000000..c9059b3
> > --- /dev/null
> > +++ b/commands/fuse.c
> > @@ -0,0 +1,175 @@
> > +/*
> > + * fuse.c - i.MX IIM fusebox programing and sensing
> > + * 
> > + * Provide an interface for programming and sensing the information that are
> > + * stored in on-chip fuse elements. This functionality is part of the IC
> > + * Identification Module (IIM), which is present on some i.MX CPUs.
> > + *
> > + * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
> > + * 	Orex Computed Radiography
> > + *
> > + * 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.
> > + *
> > + * http://www.opensource.org/licenses/gpl-license.html
> > + * http://www.gnu.org/copyleft/gpl.html
> > + */
> > +
> > +#include <common.h>
> > +#include <command.h>
> > +#include <asm/io.h>
> > +#include <mach/imx-regs.h>
> > +#include <mach/iim.h>
> > +
> > +#ifdef CONFIG_CMD_FUSE_BLOW
> > +
> > +static int do_fuse_blow(struct command *cmdtp, int argc, char *argv[])
> > +{
> > +	unsigned int bank, row, value;
> > +	int bit, ret = 0;
> > +	u8 err, stat;
> > +
> > +	if (argc != 4)
> > +		return COMMAND_ERROR_USAGE;
> > +
> > +	bank	= simple_strtoul(argv[1], NULL, 0);
> > +	row	= simple_strtoul(argv[2], NULL, 0);
> > +	value	= simple_strtoul(argv[3], NULL, 0);
> > +
> > +	if (bank > 7) {
> > +		printf("fuse_blow: invalid bank number\n");
> > +		return 1;
> > +	}
> > +
> > +	if (row > 0x3ff) {
> > +		printf("fuse_blow: invalid row offset\n");
> > +		return 1;
> > +	}
> > +
> > +	if (value > 0xff) {
> > +		printf("fuse_blow: invalid value\n");
> > +		return 1;
> > +	}
> > +
> > +	/* clear status and error registers */
> > +	writeb(3, IMX_IIM_BASE + IIM_STATM);
> > +	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
> > +
> > +	/* unprotect fuse programing */
> > +	writeb(0xaa, IMX_IIM_BASE + IIM_PREG_P);
> > +
> > +	/* upper half address register */
> > +	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
> > +
> > +	for (bit = 0; bit < 8; bit++) {
> > +		if (((value >> bit) & 1) == 0)
> > +			continue;
> > +
> > +		/* lower half address register */
> > +		writeb(((row << 1) | bit), IMX_IIM_BASE + IIM_LA);
> > +
> > +		/* start fuse programing */
> > +		writeb(0x71, IMX_IIM_BASE + IIM_FCTL);
> > +
> > +		/* wait for program done */
> > +		while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
> > +			;
> > +
> > +		/* clear program done status */
> > +		stat = readb(IMX_IIM_BASE + IIM_STAT);
> > +		writeb(stat, IMX_IIM_BASE + IIM_STAT);
> > +
> > +		err = readb(IMX_IIM_BASE + IIM_ERR);
> > +		if (err) {
> > +			printf("fuse_blow: bit %d program error (0x%02x)\n",
> > +					bit, err);
> > +			ret = 1;
> > +			goto out;
> > +		}
> > +	}
> > +
> > +out:
> > +	/* protect fuse programing */
> > +	writeb(0, IMX_IIM_BASE + IIM_PREG_P);
> > +	return ret;
> > +}
> > +
> > +static const __maybe_unused char cmd_fuse_blow_help[] =
> > +"Usage: fuse_blow <bank> <row> <value>\n"
> > +"Blow unblown fuses in <bank> <row> to match <value>\n"
> > +"Blown fuses are read as 1. Unblown fuses are read as 0.\n"
> > +"WARNING: blown fuses can not be unblown. Use this command carefully.\n";
> > +
> > +BAREBOX_CMD_START(fuse_blow)
> > +	.cmd	= do_fuse_blow,
> > +	.usage	= "program a row of fuses (8 bit)",
> > +	BAREBOX_CMD_HELP(cmd_fuse_blow_help)
> > +BAREBOX_CMD_END
> > +
> > +#endif /* CONFIG_CMD_FUSE_BLOW */
> > +
> > +#ifdef CONFIG_CMD_FUSE_SENSE
> > +
> > +static int do_fuse_sense(struct command *cmdtp, int argc, char *argv[])
> > +{
> > +	unsigned int bank, row;
> > +	u8 err, stat;
> > +
> > +	if (argc != 3)
> > +		return COMMAND_ERROR_USAGE;
> > +
> > +	bank	= simple_strtoul(argv[1], NULL, 0);
> > +	row	= simple_strtoul(argv[2], NULL, 0);
> > +
> > +	if (bank > 7) {
> > +		printf("fuse_sense: invalid bank number\n");
> > +		return 1;
> > +	}
> > +
> > +	if (row > 0x3ff) {
> > +		printf("fuse_sense: invalid row offset\n");
> > +		return 1;
> > +	}
> > +
> > +	/* clear status and error registers */
> > +	writeb(3, IMX_IIM_BASE + IIM_STATM);
> > +	writeb(0xfe, IMX_IIM_BASE + IIM_ERR);
> > +
> > +	/* upper and lower address halves */
> > +	writeb((bank << 3) | (row >> 7), IMX_IIM_BASE + IIM_UA);
> > +	writeb((row << 1) & 0xf8, IMX_IIM_BASE + IIM_LA);
> > +
> > +	/* start fuse sensing */
> > +	writeb(0x08, IMX_IIM_BASE + IIM_FCTL);
> > +
> > +	/* wait for sense done */
> > +	while ((readb(IMX_IIM_BASE + IIM_STAT) & 0x80) != 0)
> > +		;
> > +
> > +	stat =  readb(IMX_IIM_BASE + IIM_STAT);
> > +	writeb(stat, IMX_IIM_BASE + IIM_STAT);
> > +
> > +	err = readb(IMX_IIM_BASE + IIM_ERR);
> > +	if (err) {
> > +		printf("fuse_sense: sense error (0x%02x)\n", err);
> > +		return 1;
> > +	}
> > +
> > +	printf("bank %u row 0x%02x: 0x%02x\n", bank, row,
> > +			readb(IMX_IIM_BASE + IIM_SDAT));
> > +
> > +	return 0;
> > +}
> > +
> > +static const __maybe_unused char cmd_fuse_sense_help[] =
> > +"Usage: fuse_sense <bank> <row>\n"
> > +"Sense the fuses row at <bank> <row>\n";
> > +
> > +BAREBOX_CMD_START(fuse_sense)
> > +	.cmd	= do_fuse_sense,
> > +	.usage	= "sense a row of fuses (8 bit)",
> > +	BAREBOX_CMD_HELP(cmd_fuse_sense_help)
> > +BAREBOX_CMD_END
> > +
> > +#endif /* CONFIG_CMD_FUSE_SENSE */
> > -- 
> > 1.7.1
> > 
> > 
> > _______________________________________________
> > barebox mailing list
> > barebox at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/barebox
> > 
> 
> -- 
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From s.hauer at pengutronix.de  Thu Aug 12 08:04:40 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Thu, 12 Aug 2010 14:04:40 +0200
Subject: [PATCH v2 1/2] cmd: add fuse_blow/fuse_sense for the i.MX IIM
	fusebox
In-Reply-To: <20100812092701.GE13166@jasper.tkos.co.il>
References: <20100810070909.GB10920@game.jcrosoft.org>
	<5a5cd75e51961a57b99c0727faa8b3eaa619b943.1281601710.git.baruch@tkos.co.il>
	<20100812090600.GY27749@pengutronix.de>
	<20100812092701.GE13166@jasper.tkos.co.il>
Message-ID: <20100812120440.GZ27749@pengutronix.de>

On Thu, Aug 12, 2010 at 12:27:01PM +0300, Baruch Siach wrote:
> Hi Sascha,
> 
> On Thu, Aug 12, 2010 at 11:06:00AM +0200, Sascha Hauer wrote:
> > On Thu, Aug 12, 2010 at 11:35:04AM +0300, Baruch Siach wrote:
> > > This has only been tested on i.MX25, but should work on other i.MX chips with
> > > IIM.
> > 
> > I would prefer this command to be implemented as a device driver which
> > registers a file under /dev. This way we could use the standard md/mw
> > commands for this and look at a nice hexdump of all fuses and not only
> > one at a time.
> 
> There are two methods for getting fuses values, direct memory access, and 
> explicit sensing. Each method can independently be disabled with two dedicated 
> protect fuses. How can md choose the right sensing method?

By trying one method first and fall back to the other method.

> 
> The IIM block also has an override functionality. Direct memory write to the 
> fuse row overrides the value in this row. This feature can also be disabled 
> with an override protect fuse. How does mw know whether you want to blow the 
> fuses, or just override them?

You could override them when iim.writeenable=0 and blow them when
iim.writeenable=1. Return failure when the override protect fuse is
blown.

The fuse_blow/fuse_sense commands do not make this decision either, they
use the explicit sensing method hardcoded.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From sam at ravnborg.org  Fri Aug 13 15:26:12 2010
From: sam at ravnborg.org (Sam Ravnborg)
Date: Fri, 13 Aug 2010 21:26:12 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100808090612.GM24069@game.jcrosoft.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100808064846.GA31364@merkur.ravnborg.org>
	<20100808090612.GM24069@game.jcrosoft.org>
Message-ID: <20100813192612.GA8351@merkur.ravnborg.org>

> infact yes if the project name could be configurable it will avoid to modify
> it and we could use it as is
> 
> I've notice 3 names
> 
> kernel,
> Kernel,
> Linux Kernel
> 
> if instead of hard coding it we could use a symbol to configure it it will
> make it integrable as is
> 
> one other think it will be good to avoid KERNEL something in the env or the
> default symbol and use a more generic one as for KERNELVERSION use
> RELEASEVERSION as example

The solution I have in mind is to try to add the relevant
information to the Kconfig files.

Today the title is hardcoded in the frontends (menuconfig, nconfig etc).
We could instead pick this up from the mainmenu entry.

So we in a Kconfig file could have:

mainmenu "My application configuration - version $VERSION"

config VERSION
	string
	option env=VERSION


The text in mainmenu will have all references to $SOMETHING
expanded to the string representation of that symbol.

And we can use existing functionality to pick up environment variables.

The frontends needs to be adapted as well as the kconfig backend.

But doing the above I guess we have 'fixed' almost all kernel references.

	Sam


From ghankp at gmail.com  Fri Aug 13 11:13:56 2010
From: ghankp at gmail.com (kuldeep ghan)
Date: Fri, 13 Aug 2010 20:43:56 +0530
Subject: Barebox changes for reducing DDR size
Message-ID: <AANLkTi=amyyUu9Nom7sUTx=XqQuyP_-iCb4wczanoBO9@mail.gmail.com>

Hi,
        I am using PCM038 based custom board with changes in Memory
configuration. I want to know what all changes i have to do in barebox
source if I am reducing the size of DDR to 64 MB.
I have two 32MB DDR chips interfaced on CSD0 and CSD1. I am able to boot the
board with changes in pcm038 and lowlevel_init.S. I see that both the DDRs
are initialized properly and able to write and read to DDR address space.
         Ping to command is failing with these changes.  And I am not sure
about the changes required for stack size and malloc size.

Thanks,
Ghan Kuldeep
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100813/d9e7cbdb/attachment.html>

From ghankp at gmail.com  Fri Aug 13 11:17:38 2010
From: ghankp at gmail.com (kuldeep ghan)
Date: Fri, 13 Aug 2010 20:47:38 +0530
Subject: changes for reducing DDR size
Message-ID: <AANLkTin5C2PLPS26q5BjyBZC3Dt_aYCVWYifSNri8p+G@mail.gmail.com>

Hi,
        I am using PCM038 based custom board with changes in Memory
configuration. I want to know what all changes i have to do in barebox
source if I am reducing the size of DDR to 64 MB.
I have two 32MB DDR chips interfaced on CSD0 and CSD1. I am able to boot the
board with changes in pcm038 and lowlevel_init.S. I see that both the DDRs
are initialized properly and able to write and read to DDR address space.
         Ping to command is failing with these changes.  And I am not sure
about the changes required for stack size and malloc size.

Thanks,
Ghan Kuldeep
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100813/c95d801b/attachment.html>

From plagnioj at jcrosoft.com  Sat Aug 14 00:35:16 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sat, 14 Aug 2010 06:35:16 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100813192612.GA8351@merkur.ravnborg.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100808064846.GA31364@merkur.ravnborg.org>
	<20100808090612.GM24069@game.jcrosoft.org>
	<20100813192612.GA8351@merkur.ravnborg.org>
Message-ID: <20100814043516.GB24191@game.jcrosoft.org>

> We could instead pick this up from the mainmenu entry.
> 
> So we in a Kconfig file could have:
> 
> mainmenu "My application configuration - version $VERSION"
> 
> config VERSION
> 	string
> 	option env=VERSION
> 
> 
> The text in mainmenu will have all references to $SOMETHING
> expanded to the string representation of that symbol.
> 
> And we can use existing functionality to pick up environment variables.
> 
> The frontends needs to be adapted as well as the kconfig backend.
> 
> But doing the above I guess we have 'fixed' almost all kernel references.
I like it

and how about the new set/select option I mention also?

because I also take a look in the kernel for ARM as example and it will be
usefull to simplify it

Best Regards,
J.


From sam at ravnborg.org  Sat Aug 14 02:51:02 2010
From: sam at ravnborg.org (Sam Ravnborg)
Date: Sat, 14 Aug 2010 08:51:02 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100814043516.GB24191@game.jcrosoft.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100808064846.GA31364@merkur.ravnborg.org>
	<20100808090612.GM24069@game.jcrosoft.org>
	<20100813192612.GA8351@merkur.ravnborg.org>
	<20100814043516.GB24191@game.jcrosoft.org>
Message-ID: <20100814065102.GA8583@merkur.ravnborg.org>

On Sat, Aug 14, 2010 at 06:35:16AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > We could instead pick this up from the mainmenu entry.
> > 
> > So we in a Kconfig file could have:
> > 
> > mainmenu "My application configuration - version $VERSION"
> > 
> > config VERSION
> > 	string
> > 	option env=VERSION
> > 
> > 
> > The text in mainmenu will have all references to $SOMETHING
> > expanded to the string representation of that symbol.
> > 
> > And we can use existing functionality to pick up environment variables.
> > 
> > The frontends needs to be adapted as well as the kconfig backend.
> > 
> > But doing the above I guess we have 'fixed' almost all kernel references.
> I like it
> 
> and how about the new set/select option I mention also?
> 
> because I also take a look in the kernel for ARM as example and it will be
> usefull to simplify it
Have not considered it yet.
As it is a new feature I decided to look into some of the bugs first.
And I consider the harcoding of "kernel" as a bug.

	Sam


From baruch at tkos.co.il  Sun Aug 15 09:39:24 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Sun, 15 Aug 2010 16:39:24 +0300
Subject: [PATCH 1/5] imx: move IIM registers to their own header
In-Reply-To: <cover.1281877781.git.baruch@tkos.co.il>
References: <cover.1281877781.git.baruch@tkos.co.il>
Message-ID: <2877284976393f4aa54f0c65c81ba668c944fbad.1281877781.git.baruch@tkos.co.il>

This allows the use of IIM registers from code which is not mx35 specific.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/imx35.c                   |    1 +
 arch/arm/mach-imx/include/mach/iim.h        |   42 +++++++++++++++++++++++++++
 arch/arm/mach-imx/include/mach/imx35-regs.h |   18 -----------
 3 files changed, 43 insertions(+), 18 deletions(-)
 create mode 100644 arch/arm/mach-imx/include/mach/iim.h

diff --git a/arch/arm/mach-imx/imx35.c b/arch/arm/mach-imx/imx35.c
index d78a4c5..74d63eb 100644
--- a/arch/arm/mach-imx/imx35.c
+++ b/arch/arm/mach-imx/imx35.c
@@ -18,6 +18,7 @@
 #include <common.h>
 #include <asm/io.h>
 #include <mach/imx-regs.h>
+#include <mach/iim.h>
 #include <mach/generic.h>
 
 #include "gpio.h"
diff --git a/arch/arm/mach-imx/include/mach/iim.h b/arch/arm/mach-imx/include/mach/iim.h
new file mode 100644
index 0000000..6e13547
--- /dev/null
+++ b/arch/arm/mach-imx/include/mach/iim.h
@@ -0,0 +1,42 @@
+/*
+ * (c) 2009 Pengutronix, Sascha Hauer <s.hauer at pengutronix.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 __MACH_IMX_IIM_H
+#define __MACH_IMX_IIM_H
+
+#define IIM_STAT	0x0000
+#define IIM_STATM	0x0004
+#define IIM_ERR		0x0008
+#define IIM_EMASK	0x000C
+#define IIM_FCTL	0x0010
+#define IIM_UA		0x0014
+#define IIM_LA		0x0018
+#define IIM_SDAT	0x001C
+#define IIM_PREV	0x0020
+#define IIM_SREV	0x0024
+#define IIM_PREG_P	0x0028
+#define IIM_SCS0	0x002C
+#define IIM_SCS1	0x0030
+#define IIM_SCS2	0x0034
+#define IIM_SCS3	0x0038
+
+#endif /* __MACH_IMX_IIM_H */
diff --git a/arch/arm/mach-imx/include/mach/imx35-regs.h b/arch/arm/mach-imx/include/mach/imx35-regs.h
index 899e57b..c394a2a 100644
--- a/arch/arm/mach-imx/include/mach/imx35-regs.h
+++ b/arch/arm/mach-imx/include/mach/imx35-regs.h
@@ -76,24 +76,6 @@
 #define PDR0_AUTO_CON		(1 << 0)
 #define PDR0_PER_SEL		(1 << 26)
 
-
-#define IIM_STAT	0x0000
-#define IIM_STATM	0x0004
-#define IIM_ERR		0x0008
-#define IIM_EMASK	0x000C
-#define IIM_FCTL	0x0010
-#define IIM_UA		0x0014
-#define IIM_LA		0x0018
-#define IIM_SDAT	0x001C
-#define IIM_PREV	0x0020
-#define IIM_SREV	0x0024
-#define IIM_PREG_P	0x0028
-#define IIM_SCS0	0x002C
-#define IIM_SCS1	0x0030
-#define IIM_SCS2	0x0034
-#define IIM_SCS3	0x0038
-
-
 /*
  * Adresses and ranges of the external chip select lines
  */
-- 
1.7.1



From baruch at tkos.co.il  Sun Aug 15 09:39:25 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Sun, 15 Aug 2010 16:39:25 +0300
Subject: [PATCH 2/5] imx: driver for the IIM fusebox
In-Reply-To: <cover.1281877781.git.baruch@tkos.co.il>
References: <cover.1281877781.git.baruch@tkos.co.il>
Message-ID: <1f8fe0ae906c0c029decae3edfae22ae97c1cbb6.1281877781.git.baruch@tkos.co.il>

This driver provides an interface for programming and sensing the IIM fusebox
which is present on some i.MX chips.

Since the IIM io addresses of the controlling registers and each fuse bank are
are not contiguous the driver implementation uses two drivers, imx_iim, and
imx_iim_bank.  The imx_iim is the "parent" driver for a device holding the
map_base address of the control registers.  The imx_iim_bank driver is for
child devices holding the map_base of each fuse bank.  The platform code then,
instantiate one imx_iim_bank device per fuse bank.

Fuses blow is a dangerous operation. Thus, the fuses blow functionality can be
disabled independently at configuration time. On run time this functionality
must be enabled explicitly by setting the permanent_write_enable parameter.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/Kconfig  |   18 +++
 arch/arm/mach-imx/Makefile |    1 +
 arch/arm/mach-imx/iim.c    |  291 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 310 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-imx/iim.c

diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 10f01bf..1311ceb 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -364,6 +364,24 @@ config IMX_CLKO
 	  The i.MX SoCs have a Pin which can output different reference frequencies.
 	  Say y here if you want to have the clko command which lets you select the
 	  frequency to output on this pin.
+
+config IMX_IIM
+	tristate "IIM fusebox device"
+	depends on ARCH_IMX25 || ARCH_IMX35
+	help
+	  Device driver for the IC Identification Module (IIM) fusebox. Use the 
+	  regular md/mw commands to program and read the fusebox.
+
+config IMX_IIM_FUSE_BLOW
+	bool "IIM fuses blow support"
+	depends on IMX_IIM
+	help
+	  Enable this option to add permanent programming of the fusebox, using
+	  fuses blowing.
+
+	  Warning: blown fuses can not be unblown. Using this option may damage
+	  your CPU, or make it unbootalbe. Use with care.
+
 endmenu
 
 endif
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index 445a879..de62f7e 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -6,6 +6,7 @@ obj-$(CONFIG_ARCH_IMX27) += speed-imx27.o imx27.o iomux-v1.o
 obj-$(CONFIG_ARCH_IMX31) += speed-imx31.o imx31.o iomux-v2.o
 obj-$(CONFIG_ARCH_IMX35) += speed-imx35.o imx35.o iomux-v3.o
 obj-$(CONFIG_IMX_CLKO)	+= clko.o
+obj-$(CONFIG_IMX_IIM)	+= iim.o
 obj-$(CONFIG_NAND_IMX) += nand.o
 obj-y += speed.o
 
diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c
new file mode 100644
index 0000000..73369b7
--- /dev/null
+++ b/arch/arm/mach-imx/iim.c
@@ -0,0 +1,291 @@
+/*
+ * iim.c - i.MX IIM fusebox driver
+ * 
+ * Provide an interface for programming and sensing the information that are
+ * stored in on-chip fuse elements. This functionality is part of the IC
+ * Identification Module (IIM), which is present on some i.MX CPUs.
+ *
+ * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
+ * 	Orex Computed Radiography
+ *
+ * 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.
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <common.h>
+#include <init.h>
+#include <driver.h>
+#include <xfuncs.h>
+#include <errno.h>
+#include <param.h>
+
+#include <asm/io.h>
+
+#include <mach/iim.h>
+
+#define DRIVERNAME	"imx_iim"
+
+static int do_fuse_sense(unsigned long reg_base, unsigned int bank,
+		unsigned int row)
+{
+	u8 err, stat;
+
+	if (bank > 7) {
+		printf("%s: invalid bank number\n", __func__);
+		return -EINVAL;
+	}
+
+	if (row > 0x3ff) {
+		printf("%s: invalid row offset\n", __func__);
+		return -EINVAL;
+	}
+
+	/* clear status and error registers */
+	writeb(3, reg_base + IIM_STATM);
+	writeb(0xfe, reg_base + IIM_ERR);
+
+	/* upper and lower address halves */
+	writeb((bank << 3) | (row >> 7), reg_base + IIM_UA);
+	writeb((row << 1) & 0xf8, reg_base + IIM_LA);
+
+	/* start fuse sensing */
+	writeb(0x08, reg_base + IIM_FCTL);
+
+	/* wait for sense done */
+	while ((readb(reg_base + IIM_STAT) & 0x80) != 0)
+		;
+
+	stat = readb(reg_base + IIM_STAT);
+	writeb(stat, reg_base + IIM_STAT);
+
+	err = readb(reg_base + IIM_ERR);
+	if (err) {
+		printf("%s: sense error (0x%02x)\n", __func__, err);
+		return -EIO;
+	}
+
+	return readb(reg_base + IIM_SDAT);
+}
+
+static ssize_t imx_iim_read(struct cdev *cdev, void *buf, size_t count,
+		ulong offset, ulong flags)
+{
+	ulong size, i;
+	struct device_d *dev = cdev->dev;
+	const char *sense_param;
+	unsigned long explicit_sense = 0;
+
+	if (dev == NULL)
+		return -EINVAL;
+
+	if ((sense_param = dev_get_param(dev, "explicit_sense_enable")))
+		explicit_sense = simple_strtoul(sense_param, NULL, 0);
+
+	size = min((ulong)count, dev->size - offset);
+	if (explicit_sense) {
+		for (i = 0; i < size; i++) {
+			int row_val;
+
+			row_val = do_fuse_sense(dev->parent->map_base,
+				dev->id, (offset+i)*4);
+			if (row_val < 0)
+				return row_val;
+			((u8 *)buf)[i] = (u8)row_val;
+		}
+	} else {
+		for (i = 0; i < size; i++)
+			((u8 *)buf)[i] = ((u8 *)dev->map_base)[(offset+i)*4];
+	}
+
+	return size;
+}
+
+#ifdef CONFIG_IMX_IIM_FUSE_BLOW
+static int do_fuse_blow(unsigned long reg_base, unsigned int bank,
+		unsigned int row, u8 value)
+{
+	int bit, ret = 0;
+	u8 err, stat;
+
+	if (bank > 7) {
+		printf("%s: invalid bank number\n", __func__);
+		return -EINVAL;
+	}
+
+	if (row > 0x3ff) {
+		printf("%s: invalid row offset\n", __func__);
+		return -EINVAL;
+	}
+
+	/* clear status and error registers */
+	writeb(3, reg_base + IIM_STATM);
+	writeb(0xfe, reg_base + IIM_ERR);
+
+	/* unprotect fuse programing */
+	writeb(0xaa, reg_base + IIM_PREG_P);
+
+	/* upper half address register */
+	writeb((bank << 3) | (row >> 7), reg_base + IIM_UA);
+
+	for (bit = 0; bit < 8; bit++) {
+		if (((value >> bit) & 1) == 0)
+			continue;
+
+		/* lower half address register */
+		writeb(((row << 1) | bit), reg_base + IIM_LA);
+
+		/* start fuse programing */
+		writeb(0x71, reg_base + IIM_FCTL);
+
+		/* wait for program done */
+		while ((readb(reg_base + IIM_STAT) & 0x80) != 0)
+			;
+
+		/* clear program done status */
+		stat = readb(reg_base + IIM_STAT);
+		writeb(stat, reg_base + IIM_STAT);
+
+		err = readb(reg_base + IIM_ERR);
+		if (err) {
+			printf("%s: bank %u, row %u, bit %d program error "
+					"(0x%02x)\n", __func__, bank, row, bit, 
+					err);
+			ret = -EIO;
+			goto out;
+		}
+	}
+
+out:
+	/* protect fuse programing */
+	writeb(0, reg_base + IIM_PREG_P);
+	return ret;
+}
+#endif /* CONFIG_IMX_IIM_FUSE_BLOW */
+
+static ssize_t imx_iim_write(struct cdev *cdev, const void *buf, size_t count,
+		ulong offset, ulong flags)
+{
+	ulong size, i;
+	struct device_d *dev = cdev->dev;
+	const char *write_param;
+	unsigned int blow_enable = 0;
+
+	if (dev == NULL)
+		return -EINVAL;
+
+	if ((write_param = dev_get_param(dev, "permanent_write_enable")))
+		blow_enable = simple_strtoul(write_param, NULL, 0);
+
+	size = min((ulong)count, dev->size - offset);
+#ifdef CONFIG_IMX_IIM_FUSE_BLOW
+	if (blow_enable) {
+		for (i = 0; i < size; i++) {
+			int ret;
+
+			ret = do_fuse_blow(dev->parent->map_base, dev->id,
+					(offset+i)*4, ((u8 *)buf)[i]);
+			if (ret < 0)
+				return ret;
+		}
+	} else
+#endif /* CONFIG_IMX_IIM_FUSE_BLOW */
+	{
+		for (i = 0; i < size; i++)
+			((u8 *)dev->map_base)[(offset+i)*4] = ((u8 *)buf)[i];
+	}
+
+	return size;
+}
+
+static struct file_operations imx_iim_ops = {
+	.read	= imx_iim_read,
+	.write	= imx_iim_write,
+	.lseek	= dev_lseek_default,
+};
+
+static int imx_iim_blow_enable_set(struct device_d *dev, struct param_d *param,
+		const char *val)
+{
+	unsigned long blow_enable;
+
+	if (val == NULL)
+		return -EINVAL;
+
+	blow_enable = simple_strtoul(val, NULL, 0);
+	if (blow_enable > 1)
+		return -EINVAL;
+
+	return dev_param_set_generic(dev, param, blow_enable ? "1" : "0");
+}
+
+static int imx_iim_probe(struct device_d *dev)
+{
+	return 0;
+}
+
+static int imx_iim_bank_probe(struct device_d *dev)
+{
+	struct cdev *cdev;
+	struct device_d *parent;
+	int err;
+
+	cdev = xzalloc(sizeof (struct cdev));
+	dev->priv = cdev;
+
+	cdev->dev	= dev;
+	cdev->ops	= &imx_iim_ops;
+	cdev->size	= dev->size;
+	cdev->name	= asprintf(DRIVERNAME "_bank%d", dev->id);
+	if (cdev->name == NULL)
+		return -ENOMEM;
+
+	parent = get_device_by_name(DRIVERNAME "0");
+	if (parent == NULL)
+		return -ENODEV;
+	err = dev_add_child(parent, dev);
+	if (err < 0)
+		return err;
+
+#ifdef CONFIG_IMX_IIM_FUSE_BLOW
+	err = dev_add_param(dev, "permanent_write_enable",
+			imx_iim_blow_enable_set, NULL, 0);
+	if (err < 0)
+		return err;
+	err = dev_set_param(dev, "permanent_write_enable", "0");
+	if (err < 0)
+		return err;
+#endif /* CONFIG_IMX_IIM_FUSE_BLOW */
+
+	err = dev_add_param(dev, "explicit_sense_enable",
+			imx_iim_blow_enable_set, NULL, 0);
+	if (err < 0)
+		return err;
+	err = dev_set_param(dev, "explicit_sense_enable", "0");
+	if (err < 0)
+		return err;
+
+	return devfs_create(cdev);
+}
+
+static struct driver_d imx_iim_driver = {
+	.name	= DRIVERNAME,
+	.probe	= imx_iim_probe,
+};
+
+static struct driver_d imx_iim_bank_driver = {
+	.name	= DRIVERNAME "_bank",
+	.probe	= imx_iim_bank_probe,
+};
+
+static int imx_iim_init(void)
+{
+	register_driver(&imx_iim_driver);
+	register_driver(&imx_iim_bank_driver);
+
+	return 0;
+}
+device_initcall(imx_iim_init);
-- 
1.7.1



From baruch at tkos.co.il  Sun Aug 15 09:39:26 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Sun, 15 Aug 2010 16:39:26 +0300
Subject: [PATCH 3/5] imx25: add chip specific IIM fusebox defines
In-Reply-To: <cover.1281877781.git.baruch@tkos.co.il>
References: <cover.1281877781.git.baruch@tkos.co.il>
Message-ID: <1387839ffef9c528aa0cc461e280ab0a1944d190.1281877781.git.baruch@tkos.co.il>

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/include/mach/imx25-regs.h |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-imx/include/mach/imx25-regs.h b/arch/arm/mach-imx/include/mach/imx25-regs.h
index 7c2b5f9..f8908f2 100644
--- a/arch/arm/mach-imx/include/mach/imx25-regs.h
+++ b/arch/arm/mach-imx/include/mach/imx25-regs.h
@@ -143,5 +143,10 @@
 /* IIM fuse definitions */
 #define IIM_UID		0x820
 
+#define IIM_BANK_SIZE	32	/* excluding alignment padding for each row */
+#define IIM_BANK0_BASE	(IMX_IIM_BASE + 0x800)
+#define IIM_BANK1_BASE	(IMX_IIM_BASE + 0xc00)
+#define IIM_BANK2_BASE	(IMX_IIM_BASE + 0x1000)
+
 #endif /* __ASM_ARCH_MX25_REGS_H */
 
-- 
1.7.1



From baruch at tkos.co.il  Sun Aug 15 09:39:27 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Sun, 15 Aug 2010 16:39:27 +0300
Subject: [PATCH 4/5] imx25 3ds: add support for the iim fusebox driver
In-Reply-To: <cover.1281877781.git.baruch@tkos.co.il>
References: <cover.1281877781.git.baruch@tkos.co.il>
Message-ID: <db0a37dfa4bb09aa2bbd18aa2817c10248d00ed8.1281877781.git.baruch@tkos.co.il>

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/boards/freescale-mx25-3-stack/3stack.c |   31 +++++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/arch/arm/boards/freescale-mx25-3-stack/3stack.c b/arch/arm/boards/freescale-mx25-3-stack/3stack.c
index cd228cc..7b96dc8 100644
--- a/arch/arm/boards/freescale-mx25-3-stack/3stack.c
+++ b/arch/arm/boards/freescale-mx25-3-stack/3stack.c
@@ -37,6 +37,7 @@
 #include <mach/imx-flash-header.h>
 #include <mach/iomux-mx25.h>
 #include <mach/generic.h>
+#include <mach/iim.h>
 #include <linux/err.h>
 #include <i2c/i2c.h>
 #include <i2c/mc34704.h>
@@ -244,6 +245,32 @@ static int imx25_3ds_fec_init(void)
 }
 late_initcall(imx25_3ds_fec_init);
 
+static struct device_d imx_iim_dev = {
+	.name		= "imx_iim",
+	.map_base	= IMX_IIM_BASE,
+};
+
+static struct device_d imx_iim_bank0_dev = {
+	.name		= "imx_iim_bank",
+	.id		= 0,
+	.map_base	= IIM_BANK0_BASE,
+	.size		= IIM_BANK_SIZE,
+};
+
+static struct device_d imx_iim_bank1_dev = {
+	.name		= "imx_iim_bank",
+	.id		= 1,
+	.map_base	= IIM_BANK1_BASE,
+	.size		= IIM_BANK_SIZE,
+};
+
+static struct device_d imx_iim_bank2_dev = {
+	.name		= "imx_iim_bank",
+	.id		= 2,
+	.map_base	= IIM_BANK2_BASE,
+	.size		= IIM_BANK_SIZE,
+};
+
 static int imx25_devices_init(void)
 {
 #ifdef CONFIG_USB
@@ -259,6 +286,10 @@ static int imx25_devices_init(void)
 	if (readl(IMX_CCM_BASE + CCM_RCSR) & (1 << 14))
 		nand_info.width = 2;
 
+	register_device(&imx_iim_dev);
+	register_device(&imx_iim_bank0_dev);
+	register_device(&imx_iim_bank1_dev);
+	register_device(&imx_iim_bank2_dev);
 	register_device(&nand_dev);
 
 	devfs_add_partition("nand0", 0x00000, 0x40000, PARTITION_FIXED, "self_raw");
-- 
1.7.1



From baruch at tkos.co.il  Sun Aug 15 09:39:28 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Sun, 15 Aug 2010 16:39:28 +0300
Subject: [PATCH 5/5] fec: add support for IIM stored mac address
In-Reply-To: <cover.1281877781.git.baruch@tkos.co.il>
References: <cover.1281877781.git.baruch@tkos.co.il>
Message-ID: <1da6b4f3c4cf5edd1634d6ea7e0516b981fb7613.1281877781.git.baruch@tkos.co.il>

This patch adds support for i.MX25 only, because that's what I have. Extending
this to other i.MX chip should be trivial, given the right IIM_MAC_ADDR define.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/include/mach/imx25-regs.h |    1 +
 drivers/net/fec_imx.c                       |   11 +++++++++++
 2 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-imx/include/mach/imx25-regs.h b/arch/arm/mach-imx/include/mach/imx25-regs.h
index f8908f2..ddd3e04 100644
--- a/arch/arm/mach-imx/include/mach/imx25-regs.h
+++ b/arch/arm/mach-imx/include/mach/imx25-regs.h
@@ -142,6 +142,7 @@
 
 /* IIM fuse definitions */
 #define IIM_UID		0x820
+#define IIM_MAC_ADDR	0x868
 
 #define IIM_BANK_SIZE	32	/* excluding alignment padding for each row */
 #define IIM_BANK0_BASE	(IMX_IIM_BASE + 0x800)
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 40a7543..c29119c 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -32,6 +32,7 @@
 #include <mach/imx-regs.h>
 #include <clock.h>
 #include <mach/clock.h>
+#include <mach/generic.h>
 #include <xfuncs.h>
 
 #include "fec_imx.h"
@@ -235,6 +236,16 @@ static void fec_rbd_clean(int last, struct buffer_descriptor *pRbd)
 
 static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac)
 {
+	int i;
+
+	if (cpu_is_mx25()) {
+		/* get MAC address from the IMM fusebox */
+		for (i = 0; i < 6; i++)
+			mac[i] = readb(IMX_IIM_BASE + IIM_MAC_ADDR + i*4);
+
+		return 0;
+	}
+
 	/* no eeprom */
 	return -1;
 }
-- 
1.7.1



From baruch at tkos.co.il  Sun Aug 15 09:39:23 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Sun, 15 Aug 2010 16:39:23 +0300
Subject: [PATCH 0/5] imx: support for the IIM fusebox
Message-ID: <cover.1281877781.git.baruch@tkos.co.il>

This patch series adds a driver for the IIM fusebox. As suggested by Sascha 
Hauer, this driver is implemented as a character device, which allows use of 
the standard md/mw commands to access the fuses.

The last patch in this series adds to the fec NIC driver the ability to fetch 
the MAC address from the IIM fusebox.

Baruch Siach (5):
  imx: move IIM registers to their own header
  imx: driver for the IIM fusebox
  imx25: add chip specific IIM fusebox defines
  imx25 3ds: add support for the iim fusebox driver
  fec: add support for IIM stored mac address

 arch/arm/boards/freescale-mx25-3-stack/3stack.c |   31 +++
 arch/arm/mach-imx/Kconfig                       |   18 ++
 arch/arm/mach-imx/Makefile                      |    1 +
 arch/arm/mach-imx/iim.c                         |  291 +++++++++++++++++++++++
 arch/arm/mach-imx/imx35.c                       |    1 +
 arch/arm/mach-imx/include/mach/iim.h            |   42 ++++
 arch/arm/mach-imx/include/mach/imx25-regs.h     |    6 +
 arch/arm/mach-imx/include/mach/imx35-regs.h     |   18 --
 drivers/net/fec_imx.c                           |   11 +
 9 files changed, 401 insertions(+), 18 deletions(-)
 create mode 100644 arch/arm/mach-imx/iim.c
 create mode 100644 arch/arm/mach-imx/include/mach/iim.h



From baruch at tkos.co.il  Mon Aug 16 02:37:04 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 09:37:04 +0300
Subject: fsl-udc (USB gadget) anyone?
Message-ID: <20100816063704.GB28343@jasper.tkos.co.il>

Hi Barebox list,

I see that there are no in-tree fsl-udc driver users. Does anyone here have 
experience with this driver on an i.MX based system? What pre-probe() 
initialization does this driver require at the platform code?

TIA,

baruch

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From s.hauer at pengutronix.de  Mon Aug 16 03:09:04 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 16 Aug 2010 09:09:04 +0200
Subject: fsl-udc (USB gadget) anyone?
In-Reply-To: <20100816063704.GB28343@jasper.tkos.co.il>
References: <20100816063704.GB28343@jasper.tkos.co.il>
Message-ID: <20100816070904.GG27749@pengutronix.de>

Hi Baruch,

On Mon, Aug 16, 2010 at 09:37:04AM +0300, Baruch Siach wrote:
> Hi Barebox list,
> 
> I see that there are no in-tree fsl-udc driver users. Does anyone here have 
> experience with this driver on an i.MX based system? What pre-probe() 
> initialization does this driver require at the platform code?


We are using it on a custom i.MX25 board (which is not in mainline
because hardly anyone could make use of the code). Here is the platform
initialization code (mixed with ehci host support). It works fine in DFU
mode, serial support is probably not working. I have tried serial
support, but had problems integrating it properly in barebox.

+static void cm3389_usb_init(void)
+{
+	unsigned int tmp;
+
+	/* Host 2 */
+	tmp = readl(IMX_OTG_BASE + 0x600);
+	tmp &= ~(3 << 21);
+	tmp |= (2 << 21) | (1 << 4) | (1 << 5);
+	writel(tmp, IMX_OTG_BASE + 0x600);
+
+	tmp = readl(IMX_OTG_BASE + 0x584);
+	tmp |= 3 << 30;
+	writel(tmp, IMX_OTG_BASE + 0x584);
+
+	/* Set to Host mode */
+	tmp = readl(IMX_OTG_BASE + 0x1a8);
+	writel(tmp | 0x3, IMX_OTG_BASE + 0x1a8);
+}
+
+static struct device_d usbh2_dev = {
+	.name     = "ehci",
+	.map_base = IMX_OTG_BASE + 0x400,
+	.size     = 0x200,
+};
+
+static struct fsl_usb2_platform_data usb_pdata = {
+	.operating_mode	= FSL_USB2_DR_DEVICE,
+	.phy_mode	= FSL_USB2_PHY_UTMI,
+};
+
+static struct device_d usbotg_dev = {
+	.name     = "fsl-udc",
+	.map_base = IMX_OTG_BASE,
+	.size     = 0x200,
+	.platform_data = &usb_pdata,
+};

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From eric at eukrea.com  Mon Aug 16 03:58:09 2010
From: eric at eukrea.com (=?ISO-8859-1?Q?Eric_B=E9nard?=)
Date: Mon, 16 Aug 2010 09:58:09 +0200
Subject: fsl-udc (USB gadget) anyone?
In-Reply-To: <20100816070904.GG27749@pengutronix.de>
References: <20100816063704.GB28343@jasper.tkos.co.il>
	<20100816070904.GG27749@pengutronix.de>
Message-ID: <4C68EF91.9020206@eukrea.com>

Hi Sacha, Hi Baruch,

Le 16/08/2010 09:09, Sascha Hauer a ?crit :
> On Mon, Aug 16, 2010 at 09:37:04AM +0300, Baruch Siach wrote:
>> Hi Barebox list,
>>
>> I see that there are no in-tree fsl-udc driver users. Does anyone here have
>> experience with this driver on an i.MX based system? What pre-probe()
>> initialization does this driver require at the platform code?
>
>
> We are using it on a custom i.MX25 board (which is not in mainline
> because hardly anyone could make use of the code). Here is the platform
> initialization code (mixed with ehci host support). It works fine in DFU
> mode, serial support is probably not working. I have tried serial
> support, but had problems integrating it properly in barebox.

interesting, I've tested it on an i.MX27 and I had to do the following 
change to get DFU working fine, else the 1st packet's last bytes were 
always wrong when flashing data to the NOR (or simply copying data into 
RAM) :
http://www.spinics.net/lists/u-boot-v2/msg01166.html

Do you think this fix is wrong ?

The init is the following :

static struct fsl_usb2_platform_data udc_info = {
	.operating_mode = FSL_USB2_DR_DEVICE,
	.phy_mode = FSL_USB2_PHY_ULPI,
};

static struct device_d udc_dev = {
	.name     = "fsl-udc",
	.map_base = IMX_OTG_BASE,
	.platform_data	= &udc_info,
};

Eric


From s.hauer at pengutronix.de  Mon Aug 16 04:33:30 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 16 Aug 2010 10:33:30 +0200
Subject: [PATCH 0/5] imx: support for the IIM fusebox
In-Reply-To: <cover.1281877781.git.baruch@tkos.co.il>
References: <cover.1281877781.git.baruch@tkos.co.il>
Message-ID: <20100816083330.GI27749@pengutronix.de>

Hi Baruch,

On Sun, Aug 15, 2010 at 04:39:23PM +0300, Baruch Siach wrote:
> This patch series adds a driver for the IIM fusebox. As suggested by Sascha 
> Hauer, this driver is implemented as a character device, which allows use of 
> the standard md/mw commands to access the fuses.

Much better, thanks. I just tested this on an i.MX35 and it works fine.
I used the following patch to add support for the i.MX35. I think it's
better to put the IIM device info into a i.MX35 specific file. The
device does not need any platform data, and it is much code duplicated
into each board otherwise. Maybe you can do this change for the i.MX25
aswell.

Sascha


commit 1d47b8fe08b519e43babb7de802813359bed8e54
Author: Sascha Hauer <s.hauer at pengutronix.de>
Date:   Mon Aug 16 10:26:52 2010 +0200

    i.MX35: add iim support
    
    Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>

diff --git a/arch/arm/mach-imx/imx35.c b/arch/arm/mach-imx/imx35.c
index 74d63eb..72851f7 100644
--- a/arch/arm/mach-imx/imx35.c
+++ b/arch/arm/mach-imx/imx35.c
@@ -16,6 +16,7 @@
  */
 
 #include <common.h>
+#include <init.h>
 #include <asm/io.h>
 #include <mach/imx-regs.h>
 #include <mach/iim.h>
@@ -39,3 +40,52 @@ int imx_silicon_revision()
 
 	return (reg & 0xFF);
 }
+
+#ifdef CONFIG_IMX_IIM
+#define IIM_BANK_SIZE	32	/* excluding alignment padding for each row */
+
+static struct device_d imx_iim_dev = {
+	.name		= "imx_iim",
+	.map_base	= IMX_IIM_BASE,
+};
+
+static struct device_d imx_iim_bank0_dev = {
+	.name		= "imx_iim_bank",
+	.id		= 0,
+	.map_base	= IMX_IIM_BASE + 0x800,
+	.size		= IIM_BANK_SIZE,
+};
+
+static struct device_d imx_iim_bank1_dev = {
+	.name		= "imx_iim_bank",
+	.id		= 1,
+	.map_base	= IMX_IIM_BASE + 0xc00,
+	.size		= IIM_BANK_SIZE,
+};
+
+static struct device_d imx_iim_bank2_dev = {
+	.name		= "imx_iim_bank",
+	.id		= 2,
+	.map_base	= IMX_IIM_BASE + 0x1000,
+	.size		= IIM_BANK_SIZE,
+};
+
+static int imx35_iim_init(void)
+{
+	uint32_t reg;
+
+	/* Start the clock */
+	reg = readl(IMX_CCM_BASE + CCM_CGR3);
+	reg |= (3 << 2);
+	writel(reg, IMX_CCM_BASE + CCM_CGR3);
+
+	register_device(&imx_iim_dev);
+	register_device(&imx_iim_bank0_dev);
+	register_device(&imx_iim_bank1_dev);
+	register_device(&imx_iim_bank2_dev);
+
+	return 0;
+}
+
+device_initcall(imx35_iim_init);
+#endif /* CONFIG_IMX_IIM */

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From s.hauer at pengutronix.de  Mon Aug 16 04:45:06 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 16 Aug 2010 10:45:06 +0200
Subject: [PATCH 5/5] fec: add support for IIM stored mac address
In-Reply-To: <1da6b4f3c4cf5edd1634d6ea7e0516b981fb7613.1281877781.git.baruch@tkos.co.il>
References: <cover.1281877781.git.baruch@tkos.co.il>
	<1da6b4f3c4cf5edd1634d6ea7e0516b981fb7613.1281877781.git.baruch@tkos.co.il>
Message-ID: <20100816084506.GJ27749@pengutronix.de>

On Sun, Aug 15, 2010 at 04:39:28PM +0300, Baruch Siach wrote:
> This patch adds support for i.MX25 only, because that's what I have. Extending
> this to other i.MX chip should be trivial, given the right IIM_MAC_ADDR define.

This needs to be ifdeffed because this define is not present for
!i.MX25.

Sascha

> 
> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> ---
>  arch/arm/mach-imx/include/mach/imx25-regs.h |    1 +
>  drivers/net/fec_imx.c                       |   11 +++++++++++
>  2 files changed, 12 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-imx/include/mach/imx25-regs.h b/arch/arm/mach-imx/include/mach/imx25-regs.h
> index f8908f2..ddd3e04 100644
> --- a/arch/arm/mach-imx/include/mach/imx25-regs.h
> +++ b/arch/arm/mach-imx/include/mach/imx25-regs.h
> @@ -142,6 +142,7 @@
>  
>  /* IIM fuse definitions */
>  #define IIM_UID		0x820
> +#define IIM_MAC_ADDR	0x868
>  
>  #define IIM_BANK_SIZE	32	/* excluding alignment padding for each row */
>  #define IIM_BANK0_BASE	(IMX_IIM_BASE + 0x800)
> diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
> index 40a7543..c29119c 100644
> --- a/drivers/net/fec_imx.c
> +++ b/drivers/net/fec_imx.c
> @@ -32,6 +32,7 @@
>  #include <mach/imx-regs.h>
>  #include <clock.h>
>  #include <mach/clock.h>
> +#include <mach/generic.h>
>  #include <xfuncs.h>
>  
>  #include "fec_imx.h"
> @@ -235,6 +236,16 @@ static void fec_rbd_clean(int last, struct buffer_descriptor *pRbd)
>  
>  static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac)
>  {
> +	int i;
> +
> +	if (cpu_is_mx25()) {
> +		/* get MAC address from the IMM fusebox */
> +		for (i = 0; i < 6; i++)
> +			mac[i] = readb(IMX_IIM_BASE + IIM_MAC_ADDR + i*4);
> +
> +		return 0;
> +	}
> +
>  	/* no eeprom */
>  	return -1;
>  }
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Mon Aug 16 04:47:18 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 11:47:18 +0300
Subject: [PATCH 0/5] imx: support for the IIM fusebox
In-Reply-To: <20100816083330.GI27749@pengutronix.de>
References: <cover.1281877781.git.baruch@tkos.co.il>
	<20100816083330.GI27749@pengutronix.de>
Message-ID: <20100816084716.GA1664@jasper.tkos.co.il>

Hi Sascha,

On Mon, Aug 16, 2010 at 10:33:30AM +0200, Sascha Hauer wrote:
> On Sun, Aug 15, 2010 at 04:39:23PM +0300, Baruch Siach wrote:
> > This patch series adds a driver for the IIM fusebox. As suggested by Sascha 
> > Hauer, this driver is implemented as a character device, which allows use of 
> > the standard md/mw commands to access the fuses.
> 
> Much better, thanks. I just tested this on an i.MX35 and it works fine.
> I used the following patch to add support for the i.MX35. I think it's
> better to put the IIM device info into a i.MX35 specific file. The
> device does not need any platform data, and it is much code duplicated
> into each board otherwise. Maybe you can do this change for the i.MX25
> aswell.

OK. I'll fold the platform code into patch 3, and send as a reply to that 
patch. You can then drop no. 4.

baruch

> commit 1d47b8fe08b519e43babb7de802813359bed8e54
> Author: Sascha Hauer <s.hauer at pengutronix.de>
> Date:   Mon Aug 16 10:26:52 2010 +0200
> 
>     i.MX35: add iim support
>     
>     Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> 
> diff --git a/arch/arm/mach-imx/imx35.c b/arch/arm/mach-imx/imx35.c
> index 74d63eb..72851f7 100644
> --- a/arch/arm/mach-imx/imx35.c
> +++ b/arch/arm/mach-imx/imx35.c
> @@ -16,6 +16,7 @@
>   */
>  
>  #include <common.h>
> +#include <init.h>
>  #include <asm/io.h>
>  #include <mach/imx-regs.h>
>  #include <mach/iim.h>
> @@ -39,3 +40,52 @@ int imx_silicon_revision()
>  
>  	return (reg & 0xFF);
>  }
> +
> +#ifdef CONFIG_IMX_IIM
> +#define IIM_BANK_SIZE	32	/* excluding alignment padding for each row */
> +
> +static struct device_d imx_iim_dev = {
> +	.name		= "imx_iim",
> +	.map_base	= IMX_IIM_BASE,
> +};
> +
> +static struct device_d imx_iim_bank0_dev = {
> +	.name		= "imx_iim_bank",
> +	.id		= 0,
> +	.map_base	= IMX_IIM_BASE + 0x800,
> +	.size		= IIM_BANK_SIZE,
> +};
> +
> +static struct device_d imx_iim_bank1_dev = {
> +	.name		= "imx_iim_bank",
> +	.id		= 1,
> +	.map_base	= IMX_IIM_BASE + 0xc00,
> +	.size		= IIM_BANK_SIZE,
> +};
> +
> +static struct device_d imx_iim_bank2_dev = {
> +	.name		= "imx_iim_bank",
> +	.id		= 2,
> +	.map_base	= IMX_IIM_BASE + 0x1000,
> +	.size		= IIM_BANK_SIZE,
> +};
> +
> +static int imx35_iim_init(void)
> +{
> +	uint32_t reg;
> +
> +	/* Start the clock */
> +	reg = readl(IMX_CCM_BASE + CCM_CGR3);
> +	reg |= (3 << 2);
> +	writel(reg, IMX_CCM_BASE + CCM_CGR3);
> +
> +	register_device(&imx_iim_dev);
> +	register_device(&imx_iim_bank0_dev);
> +	register_device(&imx_iim_bank1_dev);
> +	register_device(&imx_iim_bank2_dev);
> +
> +	return 0;
> +}
> +
> +device_initcall(imx35_iim_init);
> +#endif /* CONFIG_IMX_IIM */
> 
> -- 
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From baruch at tkos.co.il  Mon Aug 16 04:52:54 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 11:52:54 +0300
Subject: [PATCH 5/5] fec: add support for IIM stored mac address
In-Reply-To: <20100816084506.GJ27749@pengutronix.de>
References: <cover.1281877781.git.baruch@tkos.co.il>
	<1da6b4f3c4cf5edd1634d6ea7e0516b981fb7613.1281877781.git.baruch@tkos.co.il>
	<20100816084506.GJ27749@pengutronix.de>
Message-ID: <20100816085253.GB1664@jasper.tkos.co.il>

Hi Sascha,

On Mon, Aug 16, 2010 at 10:45:06AM +0200, Sascha Hauer wrote:
> On Sun, Aug 15, 2010 at 04:39:28PM +0300, Baruch Siach wrote:
> > This patch adds support for i.MX25 only, because that's what I have. Extending
> > this to other i.MX chip should be trivial, given the right IIM_MAC_ADDR define.
> 
> This needs to be ifdeffed because this define is not present for
> !i.MX25.

OK. I hoped we can avoid the ugly ifdef, but, obviously, this is not possible 
here.

baruch

> > Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> > ---
> >  arch/arm/mach-imx/include/mach/imx25-regs.h |    1 +
> >  drivers/net/fec_imx.c                       |   11 +++++++++++
> >  2 files changed, 12 insertions(+), 0 deletions(-)
> > 
> > diff --git a/arch/arm/mach-imx/include/mach/imx25-regs.h b/arch/arm/mach-imx/include/mach/imx25-regs.h
> > index f8908f2..ddd3e04 100644
> > --- a/arch/arm/mach-imx/include/mach/imx25-regs.h
> > +++ b/arch/arm/mach-imx/include/mach/imx25-regs.h
> > @@ -142,6 +142,7 @@
> >  
> >  /* IIM fuse definitions */
> >  #define IIM_UID		0x820
> > +#define IIM_MAC_ADDR	0x868
> >  
> >  #define IIM_BANK_SIZE	32	/* excluding alignment padding for each row */
> >  #define IIM_BANK0_BASE	(IMX_IIM_BASE + 0x800)
> > diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
> > index 40a7543..c29119c 100644
> > --- a/drivers/net/fec_imx.c
> > +++ b/drivers/net/fec_imx.c
> > @@ -32,6 +32,7 @@
> >  #include <mach/imx-regs.h>
> >  #include <clock.h>
> >  #include <mach/clock.h>
> > +#include <mach/generic.h>
> >  #include <xfuncs.h>
> >  
> >  #include "fec_imx.h"
> > @@ -235,6 +236,16 @@ static void fec_rbd_clean(int last, struct buffer_descriptor *pRbd)
> >  
> >  static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac)
> >  {
> > +	int i;
> > +
> > +	if (cpu_is_mx25()) {
> > +		/* get MAC address from the IMM fusebox */
> > +		for (i = 0; i < 6; i++)
> > +			mac[i] = readb(IMX_IIM_BASE + IIM_MAC_ADDR + i*4);
> > +
> > +		return 0;
> > +	}
> > +
> >  	/* no eeprom */
> >  	return -1;
> >  }

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From s.hauer at pengutronix.de  Mon Aug 16 05:02:35 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 16 Aug 2010 11:02:35 +0200
Subject: [PATCH 5/5] fec: add support for IIM stored mac address
In-Reply-To: <20100816085253.GB1664@jasper.tkos.co.il>
References: <cover.1281877781.git.baruch@tkos.co.il>
	<1da6b4f3c4cf5edd1634d6ea7e0516b981fb7613.1281877781.git.baruch@tkos.co.il>
	<20100816084506.GJ27749@pengutronix.de>
	<20100816085253.GB1664@jasper.tkos.co.il>
Message-ID: <20100816090235.GL27749@pengutronix.de>

On Mon, Aug 16, 2010 at 11:52:54AM +0300, Baruch Siach wrote:
> Hi Sascha,
> 
> On Mon, Aug 16, 2010 at 10:45:06AM +0200, Sascha Hauer wrote:
> > On Sun, Aug 15, 2010 at 04:39:28PM +0300, Baruch Siach wrote:
> > > This patch adds support for i.MX25 only, because that's what I have. Extending
> > > this to other i.MX chip should be trivial, given the right IIM_MAC_ADDR define.
> > 
> > This needs to be ifdeffed because this define is not present for
> > !i.MX25.
> 
> OK. I hoped we can avoid the ugly ifdef, but, obviously, this is not possible 
> here.

Well, we could. You could provide platform data to the iim device,
telling the iim driver where to find the mac address and a
imx_iim_get_mac() function. This function returns -EINVAL when the
platform data is missing.

Sascha

> 
> baruch
> 
> > > Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> > > ---
> > >  arch/arm/mach-imx/include/mach/imx25-regs.h |    1 +
> > >  drivers/net/fec_imx.c                       |   11 +++++++++++
> > >  2 files changed, 12 insertions(+), 0 deletions(-)
> > > 
> > > diff --git a/arch/arm/mach-imx/include/mach/imx25-regs.h b/arch/arm/mach-imx/include/mach/imx25-regs.h
> > > index f8908f2..ddd3e04 100644
> > > --- a/arch/arm/mach-imx/include/mach/imx25-regs.h
> > > +++ b/arch/arm/mach-imx/include/mach/imx25-regs.h
> > > @@ -142,6 +142,7 @@
> > >  
> > >  /* IIM fuse definitions */
> > >  #define IIM_UID		0x820
> > > +#define IIM_MAC_ADDR	0x868
> > >  
> > >  #define IIM_BANK_SIZE	32	/* excluding alignment padding for each row */
> > >  #define IIM_BANK0_BASE	(IMX_IIM_BASE + 0x800)
> > > diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
> > > index 40a7543..c29119c 100644
> > > --- a/drivers/net/fec_imx.c
> > > +++ b/drivers/net/fec_imx.c
> > > @@ -32,6 +32,7 @@
> > >  #include <mach/imx-regs.h>
> > >  #include <clock.h>
> > >  #include <mach/clock.h>
> > > +#include <mach/generic.h>
> > >  #include <xfuncs.h>
> > >  
> > >  #include "fec_imx.h"
> > > @@ -235,6 +236,16 @@ static void fec_rbd_clean(int last, struct buffer_descriptor *pRbd)
> > >  
> > >  static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac)
> > >  {
> > > +	int i;
> > > +
> > > +	if (cpu_is_mx25()) {
> > > +		/* get MAC address from the IMM fusebox */
> > > +		for (i = 0; i < 6; i++)
> > > +			mac[i] = readb(IMX_IIM_BASE + IIM_MAC_ADDR + i*4);
> > > +
> > > +		return 0;
> > > +	}
> > > +
> > >  	/* no eeprom */
> > >  	return -1;
> > >  }
> 
> -- 
>                                                      ~. .~   Tk Open Systems
> =}------------------------------------------------ooO--U--Ooo------------{=
>    - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From s.hauer at pengutronix.de  Mon Aug 16 05:13:30 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 16 Aug 2010 11:13:30 +0200
Subject: changes for reducing DDR size
In-Reply-To: <AANLkTin5C2PLPS26q5BjyBZC3Dt_aYCVWYifSNri8p+G@mail.gmail.com>
References: <AANLkTin5C2PLPS26q5BjyBZC3Dt_aYCVWYifSNri8p+G@mail.gmail.com>
Message-ID: <20100816091330.GN27749@pengutronix.de>


Hi,

On Fri, Aug 13, 2010 at 08:47:38PM +0530, kuldeep ghan wrote:
> Hi,
>         I am using PCM038 based custom board with changes in Memory
> configuration. I want to know what all changes i have to do in barebox
> source if I am reducing the size of DDR to 64 MB.
> I have two 32MB DDR chips interfaced on CSD0 and CSD1. I am able to boot the
> board with changes in pcm038 and lowlevel_init.S. I see that both the DDRs
> are initialized properly and able to write and read to DDR address space.
>          Ping to command is failing with these changes.  And I am not sure
> about the changes required for stack size and malloc size.

You have to adjust the TEXT_BASE in arch/arm/mach-imx/Kconfig so that the
resulting link address is is your address space. This should be
sufficient for barebox. For Linux you have to adjust the device size of
the device which is passed to armlinux_add_dram() to 64MB.

I hope this helps

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Mon Aug 16 10:10:33 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 17:10:33 +0300
Subject: [PATCH v2 1/6] imx: move IIM registers to their own header
In-Reply-To: <cover.1281966840.git.baruch@tkos.co.il>
References: <cover.1281966840.git.baruch@tkos.co.il>
Message-ID: <2877284976393f4aa54f0c65c81ba668c944fbad.1281966840.git.baruch@tkos.co.il>

This allows the use of IIM registers from code which is not mx35 specific.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/imx35.c                   |    1 +
 arch/arm/mach-imx/include/mach/iim.h        |   42 +++++++++++++++++++++++++++
 arch/arm/mach-imx/include/mach/imx35-regs.h |   18 -----------
 3 files changed, 43 insertions(+), 18 deletions(-)
 create mode 100644 arch/arm/mach-imx/include/mach/iim.h

diff --git a/arch/arm/mach-imx/imx35.c b/arch/arm/mach-imx/imx35.c
index d78a4c5..74d63eb 100644
--- a/arch/arm/mach-imx/imx35.c
+++ b/arch/arm/mach-imx/imx35.c
@@ -18,6 +18,7 @@
 #include <common.h>
 #include <asm/io.h>
 #include <mach/imx-regs.h>
+#include <mach/iim.h>
 #include <mach/generic.h>
 
 #include "gpio.h"
diff --git a/arch/arm/mach-imx/include/mach/iim.h b/arch/arm/mach-imx/include/mach/iim.h
new file mode 100644
index 0000000..6e13547
--- /dev/null
+++ b/arch/arm/mach-imx/include/mach/iim.h
@@ -0,0 +1,42 @@
+/*
+ * (c) 2009 Pengutronix, Sascha Hauer <s.hauer at pengutronix.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 __MACH_IMX_IIM_H
+#define __MACH_IMX_IIM_H
+
+#define IIM_STAT	0x0000
+#define IIM_STATM	0x0004
+#define IIM_ERR		0x0008
+#define IIM_EMASK	0x000C
+#define IIM_FCTL	0x0010
+#define IIM_UA		0x0014
+#define IIM_LA		0x0018
+#define IIM_SDAT	0x001C
+#define IIM_PREV	0x0020
+#define IIM_SREV	0x0024
+#define IIM_PREG_P	0x0028
+#define IIM_SCS0	0x002C
+#define IIM_SCS1	0x0030
+#define IIM_SCS2	0x0034
+#define IIM_SCS3	0x0038
+
+#endif /* __MACH_IMX_IIM_H */
diff --git a/arch/arm/mach-imx/include/mach/imx35-regs.h b/arch/arm/mach-imx/include/mach/imx35-regs.h
index 899e57b..c394a2a 100644
--- a/arch/arm/mach-imx/include/mach/imx35-regs.h
+++ b/arch/arm/mach-imx/include/mach/imx35-regs.h
@@ -76,24 +76,6 @@
 #define PDR0_AUTO_CON		(1 << 0)
 #define PDR0_PER_SEL		(1 << 26)
 
-
-#define IIM_STAT	0x0000
-#define IIM_STATM	0x0004
-#define IIM_ERR		0x0008
-#define IIM_EMASK	0x000C
-#define IIM_FCTL	0x0010
-#define IIM_UA		0x0014
-#define IIM_LA		0x0018
-#define IIM_SDAT	0x001C
-#define IIM_PREV	0x0020
-#define IIM_SREV	0x0024
-#define IIM_PREG_P	0x0028
-#define IIM_SCS0	0x002C
-#define IIM_SCS1	0x0030
-#define IIM_SCS2	0x0034
-#define IIM_SCS3	0x0038
-
-
 /*
  * Adresses and ranges of the external chip select lines
  */
-- 
1.7.1



From baruch at tkos.co.il  Mon Aug 16 10:10:34 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 17:10:34 +0300
Subject: [PATCH v2 2/6] imx: driver for the IIM fusebox
In-Reply-To: <cover.1281966840.git.baruch@tkos.co.il>
References: <cover.1281966840.git.baruch@tkos.co.il>
Message-ID: <1f8fe0ae906c0c029decae3edfae22ae97c1cbb6.1281966840.git.baruch@tkos.co.il>

This driver provides an interface for programming and sensing the IIM fusebox
which is present on some i.MX chips.

Since the IIM io addresses of the controlling registers and each fuse bank are
are not contiguous the driver implementation uses two drivers, imx_iim, and
imx_iim_bank.  The imx_iim is the "parent" driver for a device holding the
map_base address of the control registers.  The imx_iim_bank driver is for
child devices holding the map_base of each fuse bank.  The platform code then,
instantiate one imx_iim_bank device per fuse bank.

Fuses blow is a dangerous operation. Thus, the fuses blow functionality can be
disabled independently at configuration time. On run time this functionality
must be enabled explicitly by setting the permanent_write_enable parameter.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/Kconfig  |   18 +++
 arch/arm/mach-imx/Makefile |    1 +
 arch/arm/mach-imx/iim.c    |  291 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 310 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-imx/iim.c

diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 10f01bf..1311ceb 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -364,6 +364,24 @@ config IMX_CLKO
 	  The i.MX SoCs have a Pin which can output different reference frequencies.
 	  Say y here if you want to have the clko command which lets you select the
 	  frequency to output on this pin.
+
+config IMX_IIM
+	tristate "IIM fusebox device"
+	depends on ARCH_IMX25 || ARCH_IMX35
+	help
+	  Device driver for the IC Identification Module (IIM) fusebox. Use the 
+	  regular md/mw commands to program and read the fusebox.
+
+config IMX_IIM_FUSE_BLOW
+	bool "IIM fuses blow support"
+	depends on IMX_IIM
+	help
+	  Enable this option to add permanent programming of the fusebox, using
+	  fuses blowing.
+
+	  Warning: blown fuses can not be unblown. Using this option may damage
+	  your CPU, or make it unbootalbe. Use with care.
+
 endmenu
 
 endif
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index 445a879..de62f7e 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -6,6 +6,7 @@ obj-$(CONFIG_ARCH_IMX27) += speed-imx27.o imx27.o iomux-v1.o
 obj-$(CONFIG_ARCH_IMX31) += speed-imx31.o imx31.o iomux-v2.o
 obj-$(CONFIG_ARCH_IMX35) += speed-imx35.o imx35.o iomux-v3.o
 obj-$(CONFIG_IMX_CLKO)	+= clko.o
+obj-$(CONFIG_IMX_IIM)	+= iim.o
 obj-$(CONFIG_NAND_IMX) += nand.o
 obj-y += speed.o
 
diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c
new file mode 100644
index 0000000..73369b7
--- /dev/null
+++ b/arch/arm/mach-imx/iim.c
@@ -0,0 +1,291 @@
+/*
+ * iim.c - i.MX IIM fusebox driver
+ * 
+ * Provide an interface for programming and sensing the information that are
+ * stored in on-chip fuse elements. This functionality is part of the IC
+ * Identification Module (IIM), which is present on some i.MX CPUs.
+ *
+ * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
+ * 	Orex Computed Radiography
+ *
+ * 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.
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <common.h>
+#include <init.h>
+#include <driver.h>
+#include <xfuncs.h>
+#include <errno.h>
+#include <param.h>
+
+#include <asm/io.h>
+
+#include <mach/iim.h>
+
+#define DRIVERNAME	"imx_iim"
+
+static int do_fuse_sense(unsigned long reg_base, unsigned int bank,
+		unsigned int row)
+{
+	u8 err, stat;
+
+	if (bank > 7) {
+		printf("%s: invalid bank number\n", __func__);
+		return -EINVAL;
+	}
+
+	if (row > 0x3ff) {
+		printf("%s: invalid row offset\n", __func__);
+		return -EINVAL;
+	}
+
+	/* clear status and error registers */
+	writeb(3, reg_base + IIM_STATM);
+	writeb(0xfe, reg_base + IIM_ERR);
+
+	/* upper and lower address halves */
+	writeb((bank << 3) | (row >> 7), reg_base + IIM_UA);
+	writeb((row << 1) & 0xf8, reg_base + IIM_LA);
+
+	/* start fuse sensing */
+	writeb(0x08, reg_base + IIM_FCTL);
+
+	/* wait for sense done */
+	while ((readb(reg_base + IIM_STAT) & 0x80) != 0)
+		;
+
+	stat = readb(reg_base + IIM_STAT);
+	writeb(stat, reg_base + IIM_STAT);
+
+	err = readb(reg_base + IIM_ERR);
+	if (err) {
+		printf("%s: sense error (0x%02x)\n", __func__, err);
+		return -EIO;
+	}
+
+	return readb(reg_base + IIM_SDAT);
+}
+
+static ssize_t imx_iim_read(struct cdev *cdev, void *buf, size_t count,
+		ulong offset, ulong flags)
+{
+	ulong size, i;
+	struct device_d *dev = cdev->dev;
+	const char *sense_param;
+	unsigned long explicit_sense = 0;
+
+	if (dev == NULL)
+		return -EINVAL;
+
+	if ((sense_param = dev_get_param(dev, "explicit_sense_enable")))
+		explicit_sense = simple_strtoul(sense_param, NULL, 0);
+
+	size = min((ulong)count, dev->size - offset);
+	if (explicit_sense) {
+		for (i = 0; i < size; i++) {
+			int row_val;
+
+			row_val = do_fuse_sense(dev->parent->map_base,
+				dev->id, (offset+i)*4);
+			if (row_val < 0)
+				return row_val;
+			((u8 *)buf)[i] = (u8)row_val;
+		}
+	} else {
+		for (i = 0; i < size; i++)
+			((u8 *)buf)[i] = ((u8 *)dev->map_base)[(offset+i)*4];
+	}
+
+	return size;
+}
+
+#ifdef CONFIG_IMX_IIM_FUSE_BLOW
+static int do_fuse_blow(unsigned long reg_base, unsigned int bank,
+		unsigned int row, u8 value)
+{
+	int bit, ret = 0;
+	u8 err, stat;
+
+	if (bank > 7) {
+		printf("%s: invalid bank number\n", __func__);
+		return -EINVAL;
+	}
+
+	if (row > 0x3ff) {
+		printf("%s: invalid row offset\n", __func__);
+		return -EINVAL;
+	}
+
+	/* clear status and error registers */
+	writeb(3, reg_base + IIM_STATM);
+	writeb(0xfe, reg_base + IIM_ERR);
+
+	/* unprotect fuse programing */
+	writeb(0xaa, reg_base + IIM_PREG_P);
+
+	/* upper half address register */
+	writeb((bank << 3) | (row >> 7), reg_base + IIM_UA);
+
+	for (bit = 0; bit < 8; bit++) {
+		if (((value >> bit) & 1) == 0)
+			continue;
+
+		/* lower half address register */
+		writeb(((row << 1) | bit), reg_base + IIM_LA);
+
+		/* start fuse programing */
+		writeb(0x71, reg_base + IIM_FCTL);
+
+		/* wait for program done */
+		while ((readb(reg_base + IIM_STAT) & 0x80) != 0)
+			;
+
+		/* clear program done status */
+		stat = readb(reg_base + IIM_STAT);
+		writeb(stat, reg_base + IIM_STAT);
+
+		err = readb(reg_base + IIM_ERR);
+		if (err) {
+			printf("%s: bank %u, row %u, bit %d program error "
+					"(0x%02x)\n", __func__, bank, row, bit, 
+					err);
+			ret = -EIO;
+			goto out;
+		}
+	}
+
+out:
+	/* protect fuse programing */
+	writeb(0, reg_base + IIM_PREG_P);
+	return ret;
+}
+#endif /* CONFIG_IMX_IIM_FUSE_BLOW */
+
+static ssize_t imx_iim_write(struct cdev *cdev, const void *buf, size_t count,
+		ulong offset, ulong flags)
+{
+	ulong size, i;
+	struct device_d *dev = cdev->dev;
+	const char *write_param;
+	unsigned int blow_enable = 0;
+
+	if (dev == NULL)
+		return -EINVAL;
+
+	if ((write_param = dev_get_param(dev, "permanent_write_enable")))
+		blow_enable = simple_strtoul(write_param, NULL, 0);
+
+	size = min((ulong)count, dev->size - offset);
+#ifdef CONFIG_IMX_IIM_FUSE_BLOW
+	if (blow_enable) {
+		for (i = 0; i < size; i++) {
+			int ret;
+
+			ret = do_fuse_blow(dev->parent->map_base, dev->id,
+					(offset+i)*4, ((u8 *)buf)[i]);
+			if (ret < 0)
+				return ret;
+		}
+	} else
+#endif /* CONFIG_IMX_IIM_FUSE_BLOW */
+	{
+		for (i = 0; i < size; i++)
+			((u8 *)dev->map_base)[(offset+i)*4] = ((u8 *)buf)[i];
+	}
+
+	return size;
+}
+
+static struct file_operations imx_iim_ops = {
+	.read	= imx_iim_read,
+	.write	= imx_iim_write,
+	.lseek	= dev_lseek_default,
+};
+
+static int imx_iim_blow_enable_set(struct device_d *dev, struct param_d *param,
+		const char *val)
+{
+	unsigned long blow_enable;
+
+	if (val == NULL)
+		return -EINVAL;
+
+	blow_enable = simple_strtoul(val, NULL, 0);
+	if (blow_enable > 1)
+		return -EINVAL;
+
+	return dev_param_set_generic(dev, param, blow_enable ? "1" : "0");
+}
+
+static int imx_iim_probe(struct device_d *dev)
+{
+	return 0;
+}
+
+static int imx_iim_bank_probe(struct device_d *dev)
+{
+	struct cdev *cdev;
+	struct device_d *parent;
+	int err;
+
+	cdev = xzalloc(sizeof (struct cdev));
+	dev->priv = cdev;
+
+	cdev->dev	= dev;
+	cdev->ops	= &imx_iim_ops;
+	cdev->size	= dev->size;
+	cdev->name	= asprintf(DRIVERNAME "_bank%d", dev->id);
+	if (cdev->name == NULL)
+		return -ENOMEM;
+
+	parent = get_device_by_name(DRIVERNAME "0");
+	if (parent == NULL)
+		return -ENODEV;
+	err = dev_add_child(parent, dev);
+	if (err < 0)
+		return err;
+
+#ifdef CONFIG_IMX_IIM_FUSE_BLOW
+	err = dev_add_param(dev, "permanent_write_enable",
+			imx_iim_blow_enable_set, NULL, 0);
+	if (err < 0)
+		return err;
+	err = dev_set_param(dev, "permanent_write_enable", "0");
+	if (err < 0)
+		return err;
+#endif /* CONFIG_IMX_IIM_FUSE_BLOW */
+
+	err = dev_add_param(dev, "explicit_sense_enable",
+			imx_iim_blow_enable_set, NULL, 0);
+	if (err < 0)
+		return err;
+	err = dev_set_param(dev, "explicit_sense_enable", "0");
+	if (err < 0)
+		return err;
+
+	return devfs_create(cdev);
+}
+
+static struct driver_d imx_iim_driver = {
+	.name	= DRIVERNAME,
+	.probe	= imx_iim_probe,
+};
+
+static struct driver_d imx_iim_bank_driver = {
+	.name	= DRIVERNAME "_bank",
+	.probe	= imx_iim_bank_probe,
+};
+
+static int imx_iim_init(void)
+{
+	register_driver(&imx_iim_driver);
+	register_driver(&imx_iim_bank_driver);
+
+	return 0;
+}
+device_initcall(imx_iim_init);
-- 
1.7.1



From baruch at tkos.co.il  Mon Aug 16 10:10:36 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 17:10:36 +0300
Subject: [PATCH v2 4/6] imx25: add chip specific IIM fusebox defines
In-Reply-To: <cover.1281966840.git.baruch@tkos.co.il>
References: <cover.1281966840.git.baruch@tkos.co.il>
Message-ID: <0c648f6900c08f4c3db74b5a2eb9878e393bca69.1281966840.git.baruch@tkos.co.il>

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 arch/arm/mach-imx/include/mach/imx25-regs.h |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-imx/include/mach/imx25-regs.h b/arch/arm/mach-imx/include/mach/imx25-regs.h
index 7c2b5f9..ac590d9 100644
--- a/arch/arm/mach-imx/include/mach/imx25-regs.h
+++ b/arch/arm/mach-imx/include/mach/imx25-regs.h
@@ -141,7 +141,13 @@
 #define WCR_WDE 0x04
 
 /* IIM fuse definitions */
-#define IIM_UID		0x820
+#define IIM_BANK_SIZE	32	/* excluding alignment padding for each row */
+#define IIM_BANK0_BASE	(IMX_IIM_BASE + 0x800)
+#define IIM_BANK1_BASE	(IMX_IIM_BASE + 0xc00)
+#define IIM_BANK2_BASE	(IMX_IIM_BASE + 0x1000)
+
+#define IIM_UID		(IIM_BANK0_BASE + 0x20)
+#define IIM_MAC_ADDR	(IIM_BANK0_BASE + 0x68)
 
 #endif /* __ASM_ARCH_MX25_REGS_H */
 
-- 
1.7.1



From baruch at tkos.co.il  Mon Aug 16 10:10:32 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 17:10:32 +0300
Subject: [PATCH v2 0/6] imx: support for the IIM fusebox
Message-ID: <cover.1281966840.git.baruch@tkos.co.il>

This patch series adds a driver for the IIM fusebox. As suggested by Sascha 
Hauer, this driver is implemented as a character device, which allows use of 
the standard md/mw commands to access the fuses.

Patches 3 and 6 also add to the fec_imx NIC driver the ability to fetch the MAC 
address from the IIM fusebox.

Changes from v1:

	* Put the imx_iim platform code in the imx25 code instead of the board 
	  code. This avoids code duplication in each board.

	* Move the MAC address fetch code into the imx_iim driver, and use 
	  platform data to pass the MAC address fusebox offset. This avoids 
	  ugly ifdefs in the fec_imx driver.

Baruch Siach (6):
  imx: move IIM registers to their own header
  imx: driver for the IIM fusebox
  imx iim: add mac address support
  imx25: add chip specific IIM fusebox defines
  imx25: add iim platform code
  fec_imx: add support for IIM stored mac address

 arch/arm/mach-imx/Kconfig                   |   18 ++
 arch/arm/mach-imx/Makefile                  |    1 +
 arch/arm/mach-imx/iim.c                     |  311 +++++++++++++++++++++++++++
 arch/arm/mach-imx/imx25.c                   |   44 ++++
 arch/arm/mach-imx/imx35.c                   |    1 +
 arch/arm/mach-imx/include/mach/iim.h        |   55 +++++
 arch/arm/mach-imx/include/mach/imx25-regs.h |    8 +-
 arch/arm/mach-imx/include/mach/imx35-regs.h |   18 --
 drivers/net/fec_imx.c                       |    4 +-
 9 files changed, 439 insertions(+), 21 deletions(-)
 create mode 100644 arch/arm/mach-imx/iim.c
 create mode 100644 arch/arm/mach-imx/include/mach/iim.h



From baruch at tkos.co.il  Mon Aug 16 10:10:37 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 17:10:37 +0300
Subject: [PATCH v2 5/6] imx25: add iim platform code
In-Reply-To: <cover.1281966840.git.baruch@tkos.co.il>
References: <cover.1281966840.git.baruch@tkos.co.il>
Message-ID: <cc0071de23d39f9981c5008239038e6552a05568.1281966840.git.baruch@tkos.co.il>

---
 arch/arm/mach-imx/imx25.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-imx/imx25.c b/arch/arm/mach-imx/imx25.c
index 70494aa..760f740 100644
--- a/arch/arm/mach-imx/imx25.c
+++ b/arch/arm/mach-imx/imx25.c
@@ -16,7 +16,9 @@
  */
 
 #include <common.h>
+#include <init.h>
 #include <mach/imx-regs.h>
+#include <mach/iim.h>
 #include <asm/io.h>
 
 #include "gpio.h"
@@ -46,3 +48,45 @@ u64 imx_uid(void)
 
 	return uid;
 }
+
+static struct imx_iim_platform_data imx25_iim_pdata = {
+	.mac_addr_base	= IMX_IIM_BASE + IIM_MAC_ADDR,
+};
+
+static struct device_d imx25_iim_dev = {
+	.name		= "imx_iim",
+	.map_base	= IMX_IIM_BASE,
+	.platform_data	= &imx25_iim_pdata,
+};
+
+static struct device_d imx25_iim_bank0_dev = {
+	.name		= "imx_iim_bank",
+	.id		= 0,
+	.map_base	= IIM_BANK0_BASE,
+	.size		= IIM_BANK_SIZE,
+};
+
+static struct device_d imx25_iim_bank1_dev = {
+	.name		= "imx_iim_bank",
+	.id		= 1,
+	.map_base	= IIM_BANK1_BASE,
+	.size		= IIM_BANK_SIZE,
+};
+
+static struct device_d imx25_iim_bank2_dev = {
+	.name		= "imx_iim_bank",
+	.id		= 2,
+	.map_base	= IIM_BANK2_BASE,
+	.size		= IIM_BANK_SIZE,
+};
+
+static int imx25_iim_init(void)
+{
+	register_device(&imx25_iim_dev);
+	register_device(&imx25_iim_bank0_dev);
+	register_device(&imx25_iim_bank1_dev);
+	register_device(&imx25_iim_bank2_dev);
+
+	return 0;
+}
+coredevice_initcall(imx25_iim_init);
-- 
1.7.1



From baruch at tkos.co.il  Mon Aug 16 10:10:35 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 17:10:35 +0300
Subject: [PATCH v2 3/6] imx iim: add mac address support
In-Reply-To: <cover.1281966840.git.baruch@tkos.co.il>
References: <cover.1281966840.git.baruch@tkos.co.il>
Message-ID: <ba700c1797f3cc6fbf0427c53ac3183325129848.1281966840.git.baruch@tkos.co.il>

---
 arch/arm/mach-imx/iim.c              |   22 +++++++++++++++++++++-
 arch/arm/mach-imx/include/mach/iim.h |   13 +++++++++++++
 2 files changed, 34 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c
index 73369b7..9d14d35 100644
--- a/arch/arm/mach-imx/iim.c
+++ b/arch/arm/mach-imx/iim.c
@@ -29,6 +29,8 @@
 
 #define DRIVERNAME	"imx_iim"
 
+static unsigned long mac_addr_base;
+
 static int do_fuse_sense(unsigned long reg_base, unsigned int bank,
 		unsigned int row)
 {
@@ -224,6 +226,11 @@ static int imx_iim_blow_enable_set(struct device_d *dev, struct param_d *param,
 
 static int imx_iim_probe(struct device_d *dev)
 {
+	struct imx_iim_platform_data *pdata = dev->platform_data;
+
+	if (pdata)
+		mac_addr_base = pdata->mac_addr_base;
+
 	return 0;
 }
 
@@ -288,4 +295,17 @@ static int imx_iim_init(void)
 
 	return 0;
 }
-device_initcall(imx_iim_init);
+coredevice_initcall(imx_iim_init);
+
+int imx_iim_get_mac(unsigned char *mac)
+{
+	int i;
+
+	if (mac_addr_base == 0)
+		return -EINVAL;
+
+	for (i = 0; i < 6; i++)
+		 mac[i] = readb(mac_addr_base + i*4);
+
+	return 0;
+}
diff --git a/arch/arm/mach-imx/include/mach/iim.h b/arch/arm/mach-imx/include/mach/iim.h
index 6e13547..4d54cc0 100644
--- a/arch/arm/mach-imx/include/mach/iim.h
+++ b/arch/arm/mach-imx/include/mach/iim.h
@@ -39,4 +39,17 @@
 #define IIM_SCS2	0x0034
 #define IIM_SCS3	0x0038
 
+struct imx_iim_platform_data {
+	unsigned long	mac_addr_base;
+};
+
+#ifdef CONFIG_IMX_IIM
+int imx_iim_get_mac(unsigned char *mac);
+#else
+int imx_iim_get_mac(unsigned char *mac)
+{
+	return -EINVAL;
+}
+#endif /* CONFIG_IMX_IIM */
+
 #endif /* __MACH_IMX_IIM_H */
-- 
1.7.1



From baruch at tkos.co.il  Mon Aug 16 10:10:38 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Mon, 16 Aug 2010 17:10:38 +0300
Subject: [PATCH v2 6/6] fec_imx: add support for IIM stored mac address
In-Reply-To: <cover.1281966840.git.baruch@tkos.co.il>
References: <cover.1281966840.git.baruch@tkos.co.il>
Message-ID: <6787b77daf3f9a36e0de6b904b90824e71afb3cd.1281966840.git.baruch@tkos.co.il>

The mac address information is taken from the imx_iim driver if it's present.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
 drivers/net/fec_imx.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 40a7543..9e752f6 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -32,6 +32,7 @@
 #include <mach/imx-regs.h>
 #include <clock.h>
 #include <mach/clock.h>
+#include <mach/iim.h>
 #include <xfuncs.h>
 
 #include "fec_imx.h"
@@ -235,8 +236,7 @@ static void fec_rbd_clean(int last, struct buffer_descriptor *pRbd)
 
 static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac)
 {
-	/* no eeprom */
-	return -1;
+	return imx_iim_get_mac(mac);
 }
 
 static int fec_set_hwaddr(struct eth_device *dev, unsigned char *mac)
-- 
1.7.1



From menon.nishanth at gmail.com  Mon Aug 16 23:51:38 2010
From: menon.nishanth at gmail.com (Nishanth Menon)
Date: Mon, 16 Aug 2010 22:51:38 -0500
Subject: omap3: omap3530_beagle_per_uart_defconfig broken
Message-ID: <4C6A074A.4050606@gmail.com>

Hi,
while just giving the omap3530 boot from internal sram a whirl, found that

commit 78104ae181f78d83664fdc7522eb632d9c3b2ec9
Author: Sascha Hauer <s.hauer at pengutronix.de>
Date:   Fri Apr 16 15:50:30 2010 +0200

     arm: reimplement startup code in C

     Lets translate the startup code to a language we all understand better.
     Tested on pcm038 (arm v5) and pcm043 (arm v6).

     Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>

broke the support for OMAP3530 internal boot capability -> it looks like 
many of the V7Dcache skip logic got dropped off in the patch. will try 
to fix it ahead.. reverting this commit helps the barebox master..

Regards,
Nishanth Menon


From s.hauer at pengutronix.de  Tue Aug 17 02:35:54 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Tue, 17 Aug 2010 08:35:54 +0200
Subject: omap3: omap3530_beagle_per_uart_defconfig broken
In-Reply-To: <4C6A074A.4050606@gmail.com>
References: <4C6A074A.4050606@gmail.com>
Message-ID: <20100817063554.GR27749@pengutronix.de>

On Mon, Aug 16, 2010 at 10:51:38PM -0500, Nishanth Menon wrote:
> Hi,
> while just giving the omap3530 boot from internal sram a whirl, found that
>
> commit 78104ae181f78d83664fdc7522eb632d9c3b2ec9
> Author: Sascha Hauer <s.hauer at pengutronix.de>
> Date:   Fri Apr 16 15:50:30 2010 +0200
>
>     arm: reimplement startup code in C
>
>     Lets translate the startup code to a language we all understand better.
>     Tested on pcm038 (arm v5) and pcm043 (arm v6).
>
>     Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
>
> broke the support for OMAP3530 internal boot capability -> it looks like  
> many of the V7Dcache skip logic got dropped off in the patch. will try  
> to fix it ahead.. reverting this commit helps the barebox master..

We worked on Omap lately. I remember that there was a problem with the
call to arch_init_lowlevel. Michael, do you have input on this?

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From s.hauer at pengutronix.de  Tue Aug 17 02:50:24 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Tue, 17 Aug 2010 08:50:24 +0200
Subject: omap3: omap3530_beagle_per_uart_defconfig broken
In-Reply-To: <20100817063554.GR27749@pengutronix.de>
References: <4C6A074A.4050606@gmail.com>
	<20100817063554.GR27749@pengutronix.de>
Message-ID: <20100817065024.GT27749@pengutronix.de>

On Tue, Aug 17, 2010 at 08:35:54AM +0200, Sascha Hauer wrote:
> On Mon, Aug 16, 2010 at 10:51:38PM -0500, Nishanth Menon wrote:
> > Hi,
> > while just giving the omap3530 boot from internal sram a whirl, found that
> >
> > commit 78104ae181f78d83664fdc7522eb632d9c3b2ec9
> > Author: Sascha Hauer <s.hauer at pengutronix.de>
> > Date:   Fri Apr 16 15:50:30 2010 +0200
> >
> >     arm: reimplement startup code in C
> >
> >     Lets translate the startup code to a language we all understand better.
> >     Tested on pcm038 (arm v5) and pcm043 (arm v6).
> >
> >     Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> >
> > broke the support for OMAP3530 internal boot capability -> it looks like  
> > many of the V7Dcache skip logic got dropped off in the patch. will try  
> > to fix it ahead.. reverting this commit helps the barebox master..
> 
> We worked on Omap lately. I remember that there was a problem with the
> call to arch_init_lowlevel. Michael, do you have input on this?

This commit indeed broke omap because the call to arch_init_lowlevel was
missing afterwards. This got fixed with 3aa5c83. Maybe you have a
different problem and stumbled upon this commit while bisecting. You
could try checking out 78104ae181f78d83664fdc7522eb632d9c3b2ec9 and
cherry-pick 3aa5c83. Does this work?

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From s.hauer at pengutronix.de  Tue Aug 17 02:52:58 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Tue, 17 Aug 2010 08:52:58 +0200
Subject: [PATCH v2 3/6] imx iim: add mac address support
In-Reply-To: <ba700c1797f3cc6fbf0427c53ac3183325129848.1281966840.git.baruch@tkos.co.il>
References: <cover.1281966840.git.baruch@tkos.co.il>
	<ba700c1797f3cc6fbf0427c53ac3183325129848.1281966840.git.baruch@tkos.co.il>
Message-ID: <20100817065258.GU27749@pengutronix.de>

On Mon, Aug 16, 2010 at 05:10:35PM +0300, Baruch Siach wrote:
> ---
>  arch/arm/mach-imx/iim.c              |   22 +++++++++++++++++++++-
>  arch/arm/mach-imx/include/mach/iim.h |   13 +++++++++++++
>  2 files changed, 34 insertions(+), 1 deletions(-)
> 
> diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c
> index 73369b7..9d14d35 100644
> --- a/arch/arm/mach-imx/iim.c
> +++ b/arch/arm/mach-imx/iim.c
> @@ -29,6 +29,8 @@
>  
>  #define DRIVERNAME	"imx_iim"
>  
> +static unsigned long mac_addr_base;
> +
>  static int do_fuse_sense(unsigned long reg_base, unsigned int bank,
>  		unsigned int row)
>  {
> @@ -224,6 +226,11 @@ static int imx_iim_blow_enable_set(struct device_d *dev, struct param_d *param,
>  
>  static int imx_iim_probe(struct device_d *dev)
>  {
> +	struct imx_iim_platform_data *pdata = dev->platform_data;
> +
> +	if (pdata)
> +		mac_addr_base = pdata->mac_addr_base;
> +
>  	return 0;
>  }
>  
> @@ -288,4 +295,17 @@ static int imx_iim_init(void)
>  
>  	return 0;
>  }
> -device_initcall(imx_iim_init);
> +coredevice_initcall(imx_iim_init);
> +
> +int imx_iim_get_mac(unsigned char *mac)
> +{
> +	int i;
> +
> +	if (mac_addr_base == 0)
> +		return -EINVAL;
> +
> +	for (i = 0; i < 6; i++)
> +		 mac[i] = readb(mac_addr_base + i*4);
> +
> +	return 0;
> +}
> diff --git a/arch/arm/mach-imx/include/mach/iim.h b/arch/arm/mach-imx/include/mach/iim.h
> index 6e13547..4d54cc0 100644
> --- a/arch/arm/mach-imx/include/mach/iim.h
> +++ b/arch/arm/mach-imx/include/mach/iim.h
> @@ -39,4 +39,17 @@
>  #define IIM_SCS2	0x0034
>  #define IIM_SCS3	0x0038
>  
> +struct imx_iim_platform_data {
> +	unsigned long	mac_addr_base;
> +};
> +
> +#ifdef CONFIG_IMX_IIM
> +int imx_iim_get_mac(unsigned char *mac);
> +#else
> +int imx_iim_get_mac(unsigned char *mac)

static inline please. Otherwise linking fails if this function gets a
second user.

Otherwise the series looks fine. Thanks for your work.

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Tue Aug 17 04:00:44 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Tue, 17 Aug 2010 11:00:44 +0300
Subject: [PATCH v3] imx iim: add mac address support
In-Reply-To: <20100817065258.GU27749@pengutronix.de>
References: <20100817065258.GU27749@pengutronix.de>
Message-ID: <a35012ee558f1c4bc08e12f857e172d908af73dd.1282031624.git.baruch@tkos.co.il>

---
 arch/arm/mach-imx/iim.c              |   22 +++++++++++++++++++++-
 arch/arm/mach-imx/include/mach/iim.h |   13 +++++++++++++
 2 files changed, 34 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c
index 73369b7..9d14d35 100644
--- a/arch/arm/mach-imx/iim.c
+++ b/arch/arm/mach-imx/iim.c
@@ -29,6 +29,8 @@
 
 #define DRIVERNAME	"imx_iim"
 
+static unsigned long mac_addr_base;
+
 static int do_fuse_sense(unsigned long reg_base, unsigned int bank,
 		unsigned int row)
 {
@@ -224,6 +226,11 @@ static int imx_iim_blow_enable_set(struct device_d *dev, struct param_d *param,
 
 static int imx_iim_probe(struct device_d *dev)
 {
+	struct imx_iim_platform_data *pdata = dev->platform_data;
+
+	if (pdata)
+		mac_addr_base = pdata->mac_addr_base;
+
 	return 0;
 }
 
@@ -288,4 +295,17 @@ static int imx_iim_init(void)
 
 	return 0;
 }
-device_initcall(imx_iim_init);
+coredevice_initcall(imx_iim_init);
+
+int imx_iim_get_mac(unsigned char *mac)
+{
+	int i;
+
+	if (mac_addr_base == 0)
+		return -EINVAL;
+
+	for (i = 0; i < 6; i++)
+		 mac[i] = readb(mac_addr_base + i*4);
+
+	return 0;
+}
diff --git a/arch/arm/mach-imx/include/mach/iim.h b/arch/arm/mach-imx/include/mach/iim.h
index 6e13547..1b290f2 100644
--- a/arch/arm/mach-imx/include/mach/iim.h
+++ b/arch/arm/mach-imx/include/mach/iim.h
@@ -39,4 +39,17 @@
 #define IIM_SCS2	0x0034
 #define IIM_SCS3	0x0038
 
+struct imx_iim_platform_data {
+	unsigned long	mac_addr_base;
+};
+
+#ifdef CONFIG_IMX_IIM
+int imx_iim_get_mac(unsigned char *mac);
+#else
+static inline int imx_iim_get_mac(unsigned char *mac)
+{
+	return -EINVAL;
+}
+#endif /* CONFIG_IMX_IIM */
+
 #endif /* __MACH_IMX_IIM_H */
-- 
1.7.1



From baruch at tkos.co.il  Tue Aug 17 04:01:21 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Tue, 17 Aug 2010 11:01:21 +0300
Subject: [PATCH] iim/imx25: fix MAC and UID offsets
In-Reply-To: <cover.1281966840.git.baruch@tkos.co.il>
References: <cover.1281966840.git.baruch@tkos.co.il>
Message-ID: <89d60716dad2ebc0ceb68446af11aff979fdc157.1282031791.git.baruch@tkos.co.il>

IIM_UID and IIM_MAC_ADDR are now fixed addresses.

Signed-off-by: Baruch Siach <baruch at tkos.co.il>
---
This should be applied on top of the "imx: support for the IIM fusebox" series.

 arch/arm/mach-imx/imx25.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-imx/imx25.c b/arch/arm/mach-imx/imx25.c
index 760f740..e73f8ee 100644
--- a/arch/arm/mach-imx/imx25.c
+++ b/arch/arm/mach-imx/imx25.c
@@ -44,13 +44,13 @@ u64 imx_uid(void)
 	 * values in IIM are big-endian as per AN3682.
 	 */
 	for (i = 0; i < 8; i++)
-		uid |= (u64)readb(IMX_IIM_BASE + IIM_UID + i*4) << (i*8);
+		uid |= (u64)readb(IIM_UID + i*4) << (i*8);
 
 	return uid;
 }
 
 static struct imx_iim_platform_data imx25_iim_pdata = {
-	.mac_addr_base	= IMX_IIM_BASE + IIM_MAC_ADDR,
+	.mac_addr_base	= IIM_MAC_ADDR,
 };
 
 static struct device_d imx25_iim_dev = {
-- 
1.7.1



From m.grzeschik at pengutronix.de  Tue Aug 17 04:40:51 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Tue, 17 Aug 2010 10:40:51 +0200
Subject: [PATCH] beagle: fix usb dependencies
In-Reply-To: <1280915957-2910-13-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-13-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1282034451-18154-1-git-send-email-m.grzeschik@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 arch/arm/boards/omap/Kconfig        |    2 --
 arch/arm/boards/omap/board-beagle.c |    4 ++++
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/arm/boards/omap/Kconfig b/arch/arm/boards/omap/Kconfig
index 6012227..d612064 100644
--- a/arch/arm/boards/omap/Kconfig
+++ b/arch/arm/boards/omap/Kconfig
@@ -48,8 +48,6 @@ config MACH_BEAGLE
 	select MACH_HAS_LOWLEVEL_INIT
 	select OMAP_CLOCK_ALL
 	select HAS_OMAP_NAND
-	select USB_EHCI_OMAP
-	select USB_TWL4030
 	  help
 	  Say Y here if you are using Beagle Board
 
diff --git a/arch/arm/boards/omap/board-beagle.c b/arch/arm/boards/omap/board-beagle.c
index c0b6b43..e9d3072 100644
--- a/arch/arm/boards/omap/board-beagle.c
+++ b/arch/arm/boards/omap/board-beagle.c
@@ -273,6 +273,7 @@ static struct device_d sdram_dev = {
 	.platform_data = &sram_pdata,
 };
 
+#ifdef CONFIG_USB_EHCI_OMAP
 static struct omap_hcd omap_ehci_pdata = {
 	.port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
 	.port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
@@ -295,6 +296,7 @@ static struct device_d usbh_dev = {
 	.size     = 4 * 1024,
 	.platform_data = &ehci_pdata,
 };
+#endif /* CONFIG_USB_EHCI_OMAP */
 
 static struct device_d i2c_dev = {
 	.name		= "i2c-omap",
@@ -318,8 +320,10 @@ static int beagle_devices_init(void)
 	i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));
 	register_device(&i2c_dev);
 
+#ifdef CONFIG_USB_EHCI_OMAP
 	if (ehci_omap_init(&omap_ehci_pdata) >= 0)
 		register_device(&usbh_dev);
+#endif /* CONFIG_USB_EHCI_OMAP */
 #ifdef CONFIG_GPMC
 	/* WP is made high and WAIT1 active Low */
 	gpmc_generic_init(0x10);
-- 
1.7.1



From m.grzeschik at pengutronix.de  Tue Aug 17 04:42:43 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Tue, 17 Aug 2010 10:42:43 +0200
Subject: [PATCH] beagle: defconfig cleanup for v2010.08.0
In-Reply-To: <1280915957-2910-14-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-14-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1282034563-9842-1-git-send-email-m.grzeschik@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 arch/arm/configs/omap3530_beagle_defconfig |   26 +++++++++++++-------------
 1 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/arch/arm/configs/omap3530_beagle_defconfig b/arch/arm/configs/omap3530_beagle_defconfig
index 9f9a875..2383c63 100644
--- a/arch/arm/configs/omap3530_beagle_defconfig
+++ b/arch/arm/configs/omap3530_beagle_defconfig
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# barebox version: 2010.06.0
-# Wed Jun 23 14:18:59 2010
+# barebox version: 2010.08.0
+# Tue Aug 10 18:52:24 2010
 #
 # CONFIG_BOARD_LINKER_SCRIPT is not set
 CONFIG_GENERIC_LINKER_SCRIPT=y
@@ -15,6 +15,7 @@ CONFIG_ARM=y
 # CONFIG_ARCH_EP93XX is not set
 # CONFIG_ARCH_IMX is not set
 # CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_NOMADIK is not set
 CONFIG_ARCH_OMAP=y
 # CONFIG_ARCH_S3C24xx is not set
 
@@ -35,8 +36,6 @@ CONFIG_BOARDINFO="Texas Instrument's Beagle"
 # OMAP Features
 #
 CONFIG_ARCH_OMAP3=y
-CONFIG_OMAP_CONFIG_STACKSIZE=0x00008000
-CONFIG_OMAP_MALLOC_LEN=0x00008000
 CONFIG_OMAP_CLOCK_ALL=y
 CONFIG_OMAP_CLOCK_SOURCE_S32K=y
 CONFIG_OMAP3_CLOCK_CONFIG=y
@@ -51,13 +50,6 @@ CONFIG_GPIO=y
 CONFIG_MACH_BEAGLE=y
 # CONFIG_MACH_OMAP3EVM is not set
 CONFIG_HAS_OMAP_NAND=y
-CONFIG_MACH_OMAP_GPMC_NAND=y
-CONFIG_MACH_OMAP_GPMC_GENERICNAND=y
-# CONFIG_MACH_OMAP_GPMC_GENERICNAND_LP_X8 is not set
-CONFIG_MACH_OMAP_GPMC_GENERICNAND_LP_X16=y
-# CONFIG_MACH_OMAP_GPMC_GENERICNAND_SP_X8 is not set
-# CONFIG_MACH_OMAP_GPMC_GENERICNAND_SP_X16 is not set
-CONFIG_MACH_OMAP_CS=0x0
 CONFIG_AEABI=y
 
 #
@@ -70,6 +62,7 @@ CONFIG_HAS_KALLSYMS=y
 CONFIG_HAS_MODULES=y
 CONFIG_CMD_MEMORY=y
 CONFIG_ENV_HANDLING=y
+CONFIG_GENERIC_GPIO=y
 
 #
 # General Settings
@@ -170,6 +163,7 @@ CONFIG_CMD_LOADB=y
 # flash
 #
 CONFIG_CMD_FLASH=y
+# CONFIG_CMD_UBI is not set
 
 #
 # booting
@@ -186,14 +180,17 @@ CONFIG_CMD_TEST=y
 CONFIG_CMD_VERSION=y
 CONFIG_CMD_HELP=y
 CONFIG_CMD_DEVINFO=y
+# CONFIG_CMD_GPIO is not set
 CONFIG_CMD_UNLZO=y
 CONFIG_CMD_I2C=y
 CONFIG_NET=y
 CONFIG_NET_DHCP=y
-CONFIG_NET_RARP=y
 CONFIG_NET_NFS=y
 CONFIG_NET_PING=y
 CONFIG_NET_TFTP=y
+# CONFIG_NET_TFTP_PUSH is not set
+# CONFIG_NET_NETCONSOLE is not set
+# CONFIG_NET_RESOLV is not set
 
 #
 # Drivers
@@ -222,6 +219,7 @@ CONFIG_NET_USB_ASIX=y
 CONFIG_I2C=y
 CONFIG_DRIVER_I2C_OMAP=y
 # CONFIG_DRIVER_I2C_MC13892 is not set
+# CONFIG_DRIVER_I2C_MC34704 is not set
 # CONFIG_DRIVER_I2C_MC9SDZ60 is not set
 # CONFIG_DRIVER_I2C_LP3972 is not set
 CONFIG_DRIVER_I2C_TWL4030=y
@@ -230,15 +228,17 @@ CONFIG_DRIVER_I2C_TWL4030=y
 # flash drivers
 #
 # CONFIG_DRIVER_CFI is not set
+CONFIG_MTD=y
 CONFIG_NAND=y
 CONFIG_NAND_OMAP_GPMC=y
-# CONFIG_NAND_OMAP_GPMC_HWECC is not set
 # CONFIG_MTD_NAND_VERIFY_WRITE is not set
 # CONFIG_MTD_NAND_ECC_SMC is not set
 CONFIG_MTD_NAND_IDS=y
+# CONFIG_UBI is not set
 # CONFIG_ATA is not set
 CONFIG_USB=y
 CONFIG_USB_EHCI=y
+CONFIG_USB_EHCI_OMAP=y
 # CONFIG_USB_ISP1504 is not set
 CONFIG_USB_TWL4030=y
 # CONFIG_USB_GADGET is not set
-- 
1.7.1



From m.grzeschik at pengutronix.de  Tue Aug 17 04:51:27 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Tue, 17 Aug 2010 10:51:27 +0200
Subject: [PATCH 0/2] small build fixes
Message-ID: <1282035089-24448-1-git-send-email-m.grzeschik@pengutronix.de>

Michael Grzeschik (2):
  armlinux: bugfix add parameter name into inline function
  at91rm9200: delete choice without type

 arch/arm/include/asm/armlinux.h  |    2 +-
 arch/arm/mach-at91rm9200/Kconfig |    6 ------
 2 files changed, 1 insertions(+), 7 deletions(-)



From m.grzeschik at pengutronix.de  Tue Aug 17 04:51:29 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Tue, 17 Aug 2010 10:51:29 +0200
Subject: [PATCH 2/2] at91rm9200: delete choice without type
In-Reply-To: <1282035089-24448-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1282035089-24448-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1282035089-24448-3-git-send-email-m.grzeschik@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 arch/arm/mach-at91rm9200/Kconfig |    6 ------
 1 files changed, 0 insertions(+), 6 deletions(-)

diff --git a/arch/arm/mach-at91rm9200/Kconfig b/arch/arm/mach-at91rm9200/Kconfig
index c062097..51ea3a4 100644
--- a/arch/arm/mach-at91rm9200/Kconfig
+++ b/arch/arm/mach-at91rm9200/Kconfig
@@ -7,10 +7,4 @@ config BOARDINFO
 
 comment "Atmel AT91RM9200 System-on-Chip"
 
-choice
-
-	prompt "AT91RM9200 Board Type"
-
-endchoice
-
 endif
-- 
1.7.1



From m.grzeschik at pengutronix.de  Tue Aug 17 04:51:28 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Tue, 17 Aug 2010 10:51:28 +0200
Subject: [PATCH 1/2] armlinux: bugfix add parameter name into inline function
In-Reply-To: <1282035089-24448-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1282035089-24448-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <1282035089-24448-2-git-send-email-m.grzeschik@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 arch/arm/include/asm/armlinux.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/arm/include/asm/armlinux.h b/arch/arm/include/asm/armlinux.h
index a92d4c1..ce74cfc 100644
--- a/arch/arm/include/asm/armlinux.h
+++ b/arch/arm/include/asm/armlinux.h
@@ -21,7 +21,7 @@ static inline void armlinux_add_dram(struct device_d *dev)
 {
 }
 
-static inline void armlinux_set_revision(unsigned int)
+static inline void armlinux_set_revision(unsigned int rev)
 {
 }
 
-- 
1.7.1



From m.grzeschik at pengutronix.de  Tue Aug 17 04:52:26 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Tue, 17 Aug 2010 10:52:26 +0200
Subject: [PATCH] omap: nand remove unnecessary condition
Message-ID: <1282035146-24975-1-git-send-email-m.grzeschik@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
 drivers/mtd/nand/nand_omap_gpmc.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/drivers/mtd/nand/nand_omap_gpmc.c b/drivers/mtd/nand/nand_omap_gpmc.c
index aef6820..7c9bc32 100644
--- a/drivers/mtd/nand/nand_omap_gpmc.c
+++ b/drivers/mtd/nand/nand_omap_gpmc.c
@@ -548,10 +548,9 @@ static int gpmc_nand_probe(struct device_d *pdev)
 		goto out_release_mem;
 	}
 
-	if (pdata->plat_options & NAND_HWECC_ENABLE)
+	if (pdata->plat_options & NAND_HWECC_ENABLE) {
 		nand->ecc.layout = layout;
 
-	if (pdata->plat_options & NAND_HWECC_ENABLE) {
 		/* Program how many columns we expect+
 		 * enable the cs we want and enable the engine
 		 */
-- 
1.7.1



From m.grzeschik at pengutronix.de  Tue Aug 17 04:55:37 2010
From: m.grzeschik at pengutronix.de (Michael Grzeschik)
Date: Tue, 17 Aug 2010 10:55:37 +0200
Subject: [PATCH|RFC] beagle: make nand ecc command based
Message-ID: <1282035337-25094-1-git-send-email-m.grzeschik@pengutronix.de>

Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
---
This will only work once and bring the nand chip into a undefined state
after a second call. Any ideas for doing this save?

 arch/arm/boards/omap/board-beagle.c |   28 +++++++++++++++++++++++++++-
 1 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/arch/arm/boards/omap/board-beagle.c b/arch/arm/boards/omap/board-beagle.c
index c0b6b43..99766af 100644
--- a/arch/arm/boards/omap/board-beagle.c
+++ b/arch/arm/boards/omap/board-beagle.c
@@ -53,6 +53,7 @@
  */
 
 #include <common.h>
+#include <command.h>
 #include <console.h>
 #include <init.h>
 #include <driver.h>
@@ -324,7 +325,6 @@ static int beagle_devices_init(void)
 	/* WP is made high and WAIT1 active Low */
 	gpmc_generic_init(0x10);
 #endif
-	gpmc_generic_nand_devices_init(0, 16, 1);
 
 	armlinux_add_dram(&sdram_dev);
 	armlinux_set_bootparams((void *)0x80000100);
@@ -333,3 +333,29 @@ failed:
 	return ret;
 }
 device_initcall(beagle_devices_init);
+
+static int do_ecc(struct command *cmdtp, int argc, char *argv[])
+{
+	if (*argv[0] == 's') {
+		gpmc_generic_nand_devices_init(0, 16, 0);
+	} else {
+		gpmc_generic_nand_devices_init(0, 16, 1);
+	}
+	return 0;
+}
+
+static const __maybe_unused char cmd_ecc_help[] =
+"Usage: (s|h)whwcc <device>\n"
+"set software or hardware ecc for nand controller \n";
+
+BAREBOX_CMD_START(hwecc)
+        .cmd            = do_ecc,
+        .usage          = "enable HWECC support in NAND",
+        BAREBOX_CMD_HELP(cmd_ecc_help)
+BAREBOX_CMD_END
+
+BAREBOX_CMD_START(swecc)
+        .cmd            = do_ecc,
+        .usage          = "enable SWECC support in NAND",
+        BAREBOX_CMD_HELP(cmd_ecc_help)
+BAREBOX_CMD_END
-- 
1.7.1



From menon.nishanth at gmail.com  Tue Aug 17 06:09:45 2010
From: menon.nishanth at gmail.com (Nishanth Menon)
Date: Tue, 17 Aug 2010 05:09:45 -0500
Subject: omap3: omap3530_beagle_per_uart_defconfig broken
In-Reply-To: <20100817065024.GT27749@pengutronix.de>
References: <4C6A074A.4050606@gmail.com>
	<20100817063554.GR27749@pengutronix.de>
	<20100817065024.GT27749@pengutronix.de>
Message-ID: <4C6A5FE9.5050303@gmail.com>

On 08/17/2010 01:50 AM, Sascha Hauer wrote:
> On Tue, Aug 17, 2010 at 08:35:54AM +0200, Sascha Hauer wrote:
>> On Mon, Aug 16, 2010 at 10:51:38PM -0500, Nishanth Menon wrote:
>>> Hi,
>>> while just giving the omap3530 boot from internal sram a whirl, found that
>>>
>>> commit 78104ae181f78d83664fdc7522eb632d9c3b2ec9
>>> Author: Sascha Hauer<s.hauer at pengutronix.de>
>>> Date:   Fri Apr 16 15:50:30 2010 +0200
>>>
>>>      arm: reimplement startup code in C
>>>
>>>      Lets translate the startup code to a language we all understand better.
>>>      Tested on pcm038 (arm v5) and pcm043 (arm v6).
>>>
>>>      Signed-off-by: Sascha Hauer<s.hauer at pengutronix.de>
>>>
>>> broke the support for OMAP3530 internal boot capability ->  it looks like
>>> many of the V7Dcache skip logic got dropped off in the patch. will try
>>> to fix it ahead.. reverting this commit helps the barebox master..
>>
>> We worked on Omap lately. I remember that there was a problem with the
>> call to arch_init_lowlevel. Michael, do you have input on this?
>
> This commit indeed broke omap because the call to arch_init_lowlevel was
> missing afterwards. This got fixed with 3aa5c83. Maybe you have a
> different problem and stumbled upon this commit while bisecting. You
> could try checking out 78104ae181f78d83664fdc7522eb632d9c3b2ec9 and
> cherry-pick 3aa5c83. Does this work?

will try later tonight (but I doubt it - I had tried master and next - 
it did not build yesterday due to ehci/otg changes, but those have 
patches from Michael today), but to give an idea, attached is my revert 
patch I applied(against master), but if you see there are two parts 
between arch_init_lowlevel and board_init_lowlevel:
cache invalidate
and configuration of cache

Just glancing, cache invalidate logic that got introduced is the 
v4/v5(?) logic I guess, not the v7 logic. let me see later tonight if 
there is a cleaner way to do it..

Regards,
Nishanth Menon

From nm at ti.com  Mon Aug 16 23:46:04 2010
From: nm at ti.com (Nishanth Menon)
Date: Mon, 16 Aug 2010 22:46:04 -0500
Subject: [PATCH] Revert "arm: reimplement startup code in C"
Message-ID: <mailman.181.1282041627.27306.barebox@lists.infradead.org>

This reverts commit 78104ae181f78d83664fdc7522eb632d9c3b2ec9.

Conflicts:

	arch/arm/cpu/start.c
	arch/arm/include/asm/barebox-arm.h

Signed-off-by: Nishanth Menon <nm at ti.com>
---
 arch/arm/cpu/Makefile      |    6 +-
 arch/arm/cpu/start-arm.S   |  250 ++++++++++++++++++++++++++++++++++++++++++++
 arch/arm/cpu/start.c       |  114 --------------------
 arch/arm/lib/barebox.lds.S |    2 +-
 4 files changed, 256 insertions(+), 116 deletions(-)
 create mode 100644 arch/arm/cpu/start-arm.S
 delete mode 100644 arch/arm/cpu/start.c

diff --git a/arch/arm/cpu/Makefile b/arch/arm/cpu/Makefile
index 036768e..ae1f762 100644
--- a/arch/arm/cpu/Makefile
+++ b/arch/arm/cpu/Makefile
@@ -1,11 +1,15 @@
 obj-y += cpu.o
 obj-y += exceptions.o
 obj-y += interrupts.o
-obj-y += start.o
 
 #
 # Any variants can be called as start-armxyz.S
 #
+obj-$(CONFIG_CPU_ARM920T) += start-arm.o
+obj-$(CONFIG_CPU_ARM926T) += start-arm.o
+obj-$(CONFIG_CPU_V7) += start-arm.o
+obj-$(CONFIG_ARCH_IMX31) += start-arm.o
+obj-$(CONFIG_ARCH_IMX35) += start-arm.o
 obj-$(CONFIG_CMD_ARM_CPUINFO) += cpuinfo.o
 obj-$(CONFIG_MMU) += mmu.o
 obj-$(CONFIG_CPU_32v4T) += cache-armv4.o
diff --git a/arch/arm/cpu/start-arm.S b/arch/arm/cpu/start-arm.S
new file mode 100644
index 0000000..393e648
--- /dev/null
+++ b/arch/arm/cpu/start-arm.S
@@ -0,0 +1,250 @@
+/*
+ *  armboot - Startup Code for ARM CPU-cores
+ *
+ *  Copyright (c) 2001	Marius Gr???ger <mag at sysgo.de>
+ *  Copyright (c) 2002	Alex Z???pke <azu at sysgo.de>
+ *  Copyright (c) 2002	Gary Jennejohn <gj at 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
+ */
+
+/**
+ * @file
+ * @brief The very basic beginning of each CPU after reset
+ *
+ * @note
+ * This reset code can be used at least for:
+ *  - ARM920T
+ *  - i.MX1
+ *  - i.MX27
+ *  - i.MX31
+ *
+ */
+	.section ".text_entry","ax"
+
+#include <config.h>
+#include <asm-generic/memory_layout.h>
+
+/*************************************************************************
+ * Jump vector table as in table 3.1 in [1]
+ *************************************************************************/
+
+.globl _start
+_start:
+	b       reset
+	ldr	pc, _undefined_instruction
+	ldr	pc, _software_interrupt
+	ldr	pc, _prefetch_abort
+	ldr	pc, _data_abort
+	ldr	pc, _not_used
+	ldr	pc, _irq
+	ldr	pc, _fiq
+
+.globl exception_vectors
+exception_vectors:
+_undefined_instruction:	.word undefined_instruction
+_software_interrupt:	.word software_interrupt
+_prefetch_abort:	.word prefetch_abort
+_data_abort:		.word data_abort
+_not_used:		.word not_used
+_irq:			.word irq
+_fiq:			.word fiq
+
+	.balignl 16,0xdeadbeef
+
+/*
+ *************************************************************************
+ *
+ * Startup Code (reset vector)
+ *
+ * do important init only if we don't start from memory!
+ * setup Memory and board specific bits prior to relocation.
+ * relocate armboot to ram
+ * setup stack
+ *
+ *************************************************************************
+ */
+
+/*
+ * These are defined in the board-specific linker script.
+ */
+.globl _barebox_start
+_barebox_start:
+	.word _start
+
+.globl _bss_start
+_bss_start:
+	.word __bss_start
+
+.globl _bss_end
+_bss_end:
+	.word _end
+
+
+_TEXT_BASE:
+	.word _stext
+
+_MALLOC_BASE:
+	.word MALLOC_BASE
+
+_STACK_START:
+	.word STACK_BASE + STACK_SIZE - 4
+
+#ifdef CONFIG_USE_IRQ
+/* IRQ stack memory */
+IRQ_STACK_START:
+	.word	STACK_BASE + CONFIG_STACKSIZE_IRQ - 4
+
+/* IRQ stack memory */
+FIQ_STACK_START:
+	.word STACK_BASE + CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ - 4
+#endif
+
+/*************************************************************************
+ * the actual reset code
+ *************************************************************************/
+reset:
+	/*
+	 * set the cpu to SVC32 mode
+	 */
+	mrs	r0,cpsr
+	bic	r0,r0,#0x1f
+	orr	r0,r0,#0xd3
+	msr	cpsr,r0
+
+#ifdef CONFIG_ARCH_HAS_LOWLEVEL_INIT
+	bl	arch_init_lowlevel
+#endif
+
+#ifdef CONFIG_CPU_V7
+	/*
+	 * Invalidate v7 I/D caches
+	 */
+	mov	r0, #0			/* set up for MCR */
+	mcr	p15, 0, r0, c8, c7, 0	/* invalidate TLBs */
+	mcr	p15, 0, r0, c7, c5, 0	/* invalidate icache */
+	/* Invalidate all Dcaches */
+#ifndef CONFIG_CPU_V7_DCACHE_SKIP
+	/* If Arch specific ROM code SMI handling does not exist */
+	mrc	p15, 1, r0, c0, c0, 1	/* read clidr */
+	ands	r3, r0, #0x7000000	/* extract loc from clidr */
+	mov	r3, r3, lsr #23		/* left align loc bit field */
+	beq	finished_inval		/* if loc is 0, then no need to clean */
+	mov	r10, #0			/* start clean at cache level 0 */
+inval_loop1:
+	add	r2, r10, r10, lsr #1	/* work out 3x current cache level */
+	mov	r1, r0, lsr r2		/* extract cache type bits from clidr */
+	and	r1, r1, #	7	/* mask of the bits for current cache only */
+	cmp	r1, #2			/* see what cache we have at this level */
+	blt	skip_inval		/* skip if no cache, or just i-cache */
+	mcr	p15, 2, r10, c0, c0, 0	/* select current cache level in cssr */
+	isb				/* isb to sych the new cssr&csidr */
+	mrc	p15, 1, r1, c0, c0, 0	/* read the new csidr */
+	and	r2, r1, #7		/* extract the length of the cache lines */
+	add	r2, r2, #4		/* add 4 (line length offset) */
+	ldr	r4, =0x3ff
+	ands	r4, r4, r1, lsr #3	/* find maximum number on the way size*/
+	clz	r5, r4			/* find bit position of way size increment */
+	ldr	r7, =0x7fff
+	ands	r7, r7, r1, lsr #13	/* extract max number of the index size */
+inval_loop2:
+	mov	r9, r4			/* create working copy of max way size */
+inval_loop3:
+	orr	r11, r10, r9, lsl r5	/* factor way and cache number into r11*/
+	orr	r11, r11, r7, lsl r2	/* factor index number into r11 */
+	mcr	p15, 0, r11, c7, c6, 2	/* invalidate by set/way */
+	subs	r9, r9, #1		/* decrement the way */
+	bge	inval_loop3
+	subs	r7, r7, #1		/* decrement the index */
+	bge	inval_loop2
+skip_inval:
+	add	r10, r10, #2		/* increment cache number */
+	cmp	r3, r10
+	bgt	inval_loop1
+finished_inval:
+	mov	r10, #0			/* swith back to cache level 0 */
+	mcr	p15, 2, r10, c0, c0, 0	/* select current cache level in cssr */
+	isb
+#endif /* CONFIG_CPU_V7_DCACHE_SKIP */
+
+#else
+	/*
+	 * flush v4 I/D caches
+	 */
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c7, 0	/* flush v3/v4 cache */
+	mcr	p15, 0, r0, c8, c7, 0	/* flush v4 TLB */
+#endif
+
+	/*
+	 * disable MMU stuff and caches
+	 */
+	mrc	p15, 0, r0, c1, c0, 0
+	bic	r0, r0, #0x00002300	/* clear bits 13, 9:8 (--V- --RS) */
+	bic	r0, r0, #0x00000087	/* clear bits 7, 2:0 (B--- -CAM) */
+	orr	r0, r0, #0x00000002	/* set bit 2 (A) Align */
+	orr	r0, r0, #0x00001000	/* set bit 12 (I) I-Cache */
+	mcr	p15, 0, r0, c1, c0, 0
+
+	/*
+	 * before relocating, we have to setup RAM timing
+	 * because memory timing is board-dependend, you will
+	 * find a lowlevel_init.S in your board directory.
+	 */
+#ifdef CONFIG_MACH_DO_LOWLEVEL_INIT
+	bl	board_init_lowlevel
+#endif
+
+relocate:				/* relocate barebox to RAM	    */
+	adr	r0, _start		/* r0 <- current position of code   */
+	ldr	r1, _TEXT_BASE		/* test if we run from flash or RAM */
+	cmp	r0, r1			/* don't reloc during debug         */
+	beq	stack_setup
+
+	ldr	r2, _barebox_start
+	ldr	r3, _bss_start
+	sub	r2, r3, r2		/* r2 <- size of armboot            */
+	add	r2, r0, r2		/* r2 <- source end address         */
+
+copy_loop:
+	ldmia	r0!, {r3-r10}		/* copy from source address [r0]    */
+	stmia	r1!, {r3-r10}		/* copy to   target address [r1]    */
+	cmp	r0, r2			/* until source end addreee [r2]    */
+	ble	copy_loop
+
+	/* Set up the stack						    */
+stack_setup:
+	ldr	r0, _STACK_START
+	sub	sp, r0, #12		/* leave 3 words for abort-stack    */
+
+clear_bss:
+	ldr	r0, _bss_start		/* find start of bss segment        */
+	ldr	r1, _bss_end		/* stop here                        */
+	mov 	r2, #0x00000000		/* clear                            */
+
+clbss_l:
+	str	r2, [r0]		/* clear loop...                    */
+	add	r0, r0, #4
+	cmp	r0, r1
+	ble	clbss_l
+
+	ldr	pc, _start_armboot
+
+_start_armboot:
+	.word start_barebox
diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
deleted file mode 100644
index 53d7ac1..0000000
--- a/arch/arm/cpu/start.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * start-arm.c
- *
- * Copyright (c) 2010 Sascha Hauer <s.hauer at pengutronix.de>, Pengutronix
- *
- * 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 version 2
- * as published by the Free Software Foundation.
- *
- * 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 <init.h>
-#include <asm/barebox-arm.h>
-#include <asm/system.h>
-#include <asm-generic/memory_layout.h>
-
-void __naked __section(.text_entry) exception_vectors(void)
-{
-	__asm__ __volatile__ (
-		"b reset\n"				/* reset */
-		"ldr pc, =undefined_instruction\n"	/* undefined instruction */
-		"ldr pc, =software_interrupt\n"		/* software interrupt (SWI) */
-		"ldr pc, =prefetch_abort\n"		/* prefetch abort */
-		"ldr pc, =data_abort\n"			/* data abort */
-		"ldr pc, =not_used\n"			/* (reserved) */
-		"ldr pc, =irq\n"			/* irq (interrupt) */
-		"ldr pc, =fiq\n"			/* fiq (fast interrupt) */
-	);
-}
-
-extern char __bss_start, _end;
-
-/*
- * The actual reset vector. This code is position independent and usually
- * does not run at the address it's linked at.
- */
-void __naked __bare_init reset(void)
-{
-	uint32_t r;
-
-	/* set the cpu to SVC32 mode */
-	__asm__ __volatile__("mrs %0, cpsr":"=r"(r));
-	r &= ~0x1f;
-	r |= 0xd3;
-	__asm__ __volatile__("msr cpsr, %0" : : "r"(r));
-
-#ifdef CONFIG_ARCH_HAS_LOWLEVEL_INIT
-	arch_init_lowlevel();
-#endif
-	__asm__ __volatile__ (
-		"bl __mmu_cache_flush;"
-		:
-		:
-		: "r0", "r1", "r2", "r3", "r6", "r10", "r12", "cc", "memory"
-	);
-
-	/* disable MMU stuff and caches */
-	r = get_cr();
-	r &= ~(CR_M | CR_C | CR_B | CR_S | CR_R | CR_V);
-	r |= CR_A | CR_I;
-	set_cr(r);
-
-#ifdef CONFIG_MACH_DO_LOWLEVEL_INIT
-	board_init_lowlevel();
-#endif
-	board_init_lowlevel_return();
-}
-
-/*
- * Board code can jump here by either returning from board_init_lowlevel
- * or by calling this funtion directly.
- */
-void __naked __bare_init board_init_lowlevel_return(void)
-{
-	uint32_t r, addr;
-
-	/*
-	 * Get runtime address of this function. Do not
-	 * put any code above this.
-	 */
-	__asm__ __volatile__("1: adr %0, 1b":"=r"(addr));
-
-	/* Setup the stack */
-	r = STACK_BASE + STACK_SIZE - 16;
-	__asm__ __volatile__("mov sp, %0" : : "r"(r));
-
-	/* Get start of binary image */
-	addr -= (uint32_t)&board_init_lowlevel_return - TEXT_BASE;
-
-	/* relocate to link address if necessary */
-	if (addr != TEXT_BASE)
-		memcpy((void *)TEXT_BASE, (void *)addr,
-				(unsigned int)&__bss_start - TEXT_BASE);
-
-	/* clear bss */
-	memset(&__bss_start, 0, &_end - &__bss_start);
-
-	/* call start_barebox with its absolute address */
-	r = (unsigned int)&start_barebox;
-	__asm__ __volatile__("mov pc, %0" : : "r"(r));
-}
-
diff --git a/arch/arm/lib/barebox.lds.S b/arch/arm/lib/barebox.lds.S
index 5bee0a1..a5eaefa 100644
--- a/arch/arm/lib/barebox.lds.S
+++ b/arch/arm/lib/barebox.lds.S
@@ -26,7 +26,7 @@
 
 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 OUTPUT_ARCH(arm)
-ENTRY(exception_vectors)
+ENTRY(_start)
 SECTIONS
 {
 	. = TEXT_BASE;
-- 
1.7.0.4


--------------010608060407030609070102--


From menon.nishanth at gmail.com  Tue Aug 17 06:09:03 2010
From: menon.nishanth at gmail.com (Nishanth Menon)
Date: Tue, 17 Aug 2010 05:09:03 -0500
Subject: [PATCH] beagle: fix usb dependencies
In-Reply-To: <1282034451-18154-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1280915957-2910-13-git-send-email-m.grzeschik@pengutronix.de>
	<1282034451-18154-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <4C6A5FBF.5040102@gmail.com>

On 08/17/2010 03:40 AM, Michael Grzeschik wrote:
> Signed-off-by: Michael Grzeschik<m.grzeschik at pengutronix.de>
Acked-by: Nishanth Menon <nm at ti.com>
> ---
>   arch/arm/boards/omap/Kconfig        |    2 --
>   arch/arm/boards/omap/board-beagle.c |    4 ++++
>   2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/boards/omap/Kconfig b/arch/arm/boards/omap/Kconfig
> index 6012227..d612064 100644
> --- a/arch/arm/boards/omap/Kconfig
> +++ b/arch/arm/boards/omap/Kconfig
> @@ -48,8 +48,6 @@ config MACH_BEAGLE
>   	select MACH_HAS_LOWLEVEL_INIT
>   	select OMAP_CLOCK_ALL
>   	select HAS_OMAP_NAND
> -	select USB_EHCI_OMAP
> -	select USB_TWL4030
>   	  help
>   	  Say Y here if you are using Beagle Board
>
> diff --git a/arch/arm/boards/omap/board-beagle.c b/arch/arm/boards/omap/board-beagle.c
> index c0b6b43..e9d3072 100644
> --- a/arch/arm/boards/omap/board-beagle.c
> +++ b/arch/arm/boards/omap/board-beagle.c
> @@ -273,6 +273,7 @@ static struct device_d sdram_dev = {
>   	.platform_data =&sram_pdata,
>   };
>
> +#ifdef CONFIG_USB_EHCI_OMAP
>   static struct omap_hcd omap_ehci_pdata = {
>   	.port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
>   	.port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
> @@ -295,6 +296,7 @@ static struct device_d usbh_dev = {
>   	.size     = 4 * 1024,
>   	.platform_data =&ehci_pdata,
>   };
> +#endif /* CONFIG_USB_EHCI_OMAP */
>
>   static struct device_d i2c_dev = {
>   	.name		= "i2c-omap",
> @@ -318,8 +320,10 @@ static int beagle_devices_init(void)
>   	i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));
>   	register_device(&i2c_dev);
>
> +#ifdef CONFIG_USB_EHCI_OMAP
>   	if (ehci_omap_init(&omap_ehci_pdata)>= 0)
>   		register_device(&usbh_dev);
> +#endif /* CONFIG_USB_EHCI_OMAP */
>   #ifdef CONFIG_GPMC
>   	/* WP is made high and WAIT1 active Low */
>   	gpmc_generic_init(0x10);



From menon.nishanth at gmail.com  Tue Aug 17 06:40:09 2010
From: menon.nishanth at gmail.com (Nishanth Menon)
Date: Tue, 17 Aug 2010 05:40:09 -0500
Subject: [PATCH|RFC] beagle: make nand ecc command based
In-Reply-To: <1282035337-25094-1-git-send-email-m.grzeschik@pengutronix.de>
References: <1282035337-25094-1-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <4C6A6709.9080107@gmail.com>

On 08/17/2010 03:55 AM, Michael Grzeschik wrote:
> Signed-off-by: Michael Grzeschik<m.grzeschik at pengutronix.de>
> ---
> This will only work once and bring the nand chip into a undefined state
> after a second call. Any ideas for doing this save?
looking at the gpmc logic, it does a reset in gpmc_cs_config by 
disabling and re-enabling it -> so my guess is:
a) in the selection of ecc logic
b) reset of statemachines in mtd layers
c) nand chip not being reset from it's previous state (resetting the 
controller does not mean nand chip is reset) (if i recollect sometime 
back mtd used to do a 0xff and reset)..


personally, IMHO using s/w ecc has not much benefit other than being 
"legacy enabled"
>
>   arch/arm/boards/omap/board-beagle.c |   28 +++++++++++++++++++++++++++-
>   1 files changed, 27 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/boards/omap/board-beagle.c b/arch/arm/boards/omap/board-beagle.c
> index c0b6b43..99766af 100644
> --- a/arch/arm/boards/omap/board-beagle.c
> +++ b/arch/arm/boards/omap/board-beagle.c
> @@ -53,6 +53,7 @@
>    */
>
>   #include<common.h>
> +#include<command.h>
>   #include<console.h>
>   #include<init.h>
>   #include<driver.h>
> @@ -324,7 +325,6 @@ static int beagle_devices_init(void)
>   	/* WP is made high and WAIT1 active Low */
>   	gpmc_generic_init(0x10);
>   #endif
> -	gpmc_generic_nand_devices_init(0, 16, 1);
>
>   	armlinux_add_dram(&sdram_dev);
>   	armlinux_set_bootparams((void *)0x80000100);
> @@ -333,3 +333,29 @@ failed:
>   	return ret;
>   }
>   device_initcall(beagle_devices_init);
> +
> +static int do_ecc(struct command *cmdtp, int argc, char *argv[])
> +{
> +	if (*argv[0] == 's') {
> +		gpmc_generic_nand_devices_init(0, 16, 0);
> +	} else {
> +		gpmc_generic_nand_devices_init(0, 16, 1);
> +	}
> +	return 0;
> +}
> +
> +static const __maybe_unused char cmd_ecc_help[] =
> +"Usage: (s|h)whwcc<device>\n"
> +"set software or hardware ecc for nand controller \n";
> +
> +BAREBOX_CMD_START(hwecc)
> +        .cmd            = do_ecc,
> +        .usage          = "enable HWECC support in NAND",
> +        BAREBOX_CMD_HELP(cmd_ecc_help)
> +BAREBOX_CMD_END
> +
> +BAREBOX_CMD_START(swecc)
> +        .cmd            = do_ecc,
> +        .usage          = "enable SWECC support in NAND",
> +        BAREBOX_CMD_HELP(cmd_ecc_help)
> +BAREBOX_CMD_END



From s.hauer at pengutronix.de  Tue Aug 17 07:25:52 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Tue, 17 Aug 2010 13:25:52 +0200
Subject: omap3: omap3530_beagle_per_uart_defconfig broken
In-Reply-To: <4C6A5FE9.5050303@gmail.com>
References: <4C6A074A.4050606@gmail.com>
	<20100817063554.GR27749@pengutronix.de>
	<20100817065024.GT27749@pengutronix.de>
	<4C6A5FE9.5050303@gmail.com>
Message-ID: <20100817112552.GX27749@pengutronix.de>

On Tue, Aug 17, 2010 at 05:09:45AM -0500, Nishanth Menon wrote:
> On 08/17/2010 01:50 AM, Sascha Hauer wrote:
>> On Tue, Aug 17, 2010 at 08:35:54AM +0200, Sascha Hauer wrote:
>>> On Mon, Aug 16, 2010 at 10:51:38PM -0500, Nishanth Menon wrote:
>>>> Hi,
>>>> while just giving the omap3530 boot from internal sram a whirl, found that
>>>>
>>>> commit 78104ae181f78d83664fdc7522eb632d9c3b2ec9
>>>> Author: Sascha Hauer<s.hauer at pengutronix.de>
>>>> Date:   Fri Apr 16 15:50:30 2010 +0200
>>>>
>>>>      arm: reimplement startup code in C
>>>>
>>>>      Lets translate the startup code to a language we all understand better.
>>>>      Tested on pcm038 (arm v5) and pcm043 (arm v6).
>>>>
>>>>      Signed-off-by: Sascha Hauer<s.hauer at pengutronix.de>
>>>>
>>>> broke the support for OMAP3530 internal boot capability ->  it looks like
>>>> many of the V7Dcache skip logic got dropped off in the patch. will try
>>>> to fix it ahead.. reverting this commit helps the barebox master..
>>>
>>> We worked on Omap lately. I remember that there was a problem with the
>>> call to arch_init_lowlevel. Michael, do you have input on this?
>>
>> This commit indeed broke omap because the call to arch_init_lowlevel was
>> missing afterwards. This got fixed with 3aa5c83. Maybe you have a
>> different problem and stumbled upon this commit while bisecting. You
>> could try checking out 78104ae181f78d83664fdc7522eb632d9c3b2ec9 and
>> cherry-pick 3aa5c83. Does this work?
>
> will try later tonight (but I doubt it - I had tried master and next -

The fixup patch already came in between v2010.06.0 and v2010.07.0. So
there definitely is a window in which barebox was broken. Maybe you hit
this while bisecting. Maybe there is a second one which is the real
cause of your trouble here.

> it did not build yesterday due to ehci/otg changes, but those have  
> patches from Michael today), but to give an idea, attached is my revert  
> patch I applied(against master), but if you see there are two parts  
> between arch_init_lowlevel and board_init_lowlevel:
> cache invalidate
> and configuration of cache
>
> Just glancing, cache invalidate logic that got introduced is the  
> v4/v5(?) logic I guess, not the v7 logic.

Nope, we do have v7 logic.

> let me see later tonight if  
> there is a cleaner way to do it..
>
> Regards,
> Nishanth Menon



-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Tue Aug 17 10:13:16 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Tue, 17 Aug 2010 17:13:16 +0300
Subject: fsl-udc (USB gadget) anyone?
In-Reply-To: <20100816070904.GG27749@pengutronix.de>
References: <20100816063704.GB28343@jasper.tkos.co.il>
	<20100816070904.GG27749@pengutronix.de>
Message-ID: <20100817141315.GE9631@jasper.tkos.co.il>

Hi Sascha,

On Mon, Aug 16, 2010 at 09:09:04AM +0200, Sascha Hauer wrote:
> On Mon, Aug 16, 2010 at 09:37:04AM +0300, Baruch Siach wrote:
> > Hi Barebox list,
> > 
> > I see that there are no in-tree fsl-udc driver users. Does anyone here have 
> > experience with this driver on an i.MX based system? What pre-probe() 
> > initialization does this driver require at the platform code?
> 
> 
> We are using it on a custom i.MX25 board (which is not in mainline
> because hardly anyone could make use of the code). Here is the platform
> initialization code (mixed with ehci host support). It works fine in DFU
> mode, serial support is probably not working. I have tried serial
> support, but had problems integrating it properly in barebox.

[snip]

> +static struct fsl_usb2_platform_data usb_pdata = {
> +	.operating_mode	= FSL_USB2_DR_DEVICE,
> +	.phy_mode	= FSL_USB2_PHY_UTMI,
> +};
> +
> +static struct device_d usbotg_dev = {
> +	.name     = "fsl-udc",
> +	.map_base = IMX_OTG_BASE,
> +	.size     = 0x200,
> +	.platform_data = &usb_pdata,
> +};

Thanks for the info. Unfortunately I was not able to get dfu work on both the 
i.MX25 PDK and our custom board. The board doesn't even get enumerated. The 
USB PHY wiring is the same on both.  After running the 'dfu' command as 
follows:

barebox:/ dfu -V 0x082d -P 0x2000 test(script)

I connect the board to my host and see the following on the host side:

[113870.024034] usb 2-1: new high speed USB device using ehci_hcd and address 101
[113870.092245] hub 2-0:1.0: unable to enumerate USB device on port 1
[113870.584048] usb 6-1: new full speed USB device using uhci_hcd and address 27
[113870.700071] hub 6-0:1.0: unable to enumerate USB device on port 1
[113871.080062] usb 6-1: new full speed USB device using uhci_hcd and address 28
[113871.200106] usb 6-1: device descriptor read/64, error -71
[113871.424073] usb 6-1: device descriptor read/64, error -71
[113871.640069] usb 6-1: new full speed USB device using uhci_hcd and address 29
[113871.760068] usb 6-1: device descriptor read/64, error -71
[113871.984068] usb 6-1: device descriptor read/64, error -71
[113872.200067] usb 6-1: new full speed USB device using uhci_hcd and address 30
[113872.608070] usb 6-1: device not accepting address 30, error -71
[113872.720073] usb 6-1: new full speed USB device using uhci_hcd and address 31
[113873.128058] usb 6-1: device not accepting address 31, error -71
[113873.128079] hub 6-0:1.0: unable to enumerate USB device on port 1

Sprinkling printfs over the fsl-udc driver code didn't reveal much, except 
from repeated USB_STS_PORT_CHANGE and USB_STS_RESET interrupts. Before giving 
up completely I thought I'd just report this failure, maybe someone has a 
clue.

baruch

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From nm at ti.com  Tue Aug 17 12:24:19 2010
From: nm at ti.com (Nishanth Menon)
Date: Tue, 17 Aug 2010 11:24:19 -0500
Subject: [PATCH] omap3: add arch specific dcache flush
In-Reply-To: <omap3: omap3530_beagle_per_uart_defconfig broken>
References: <omap3: omap3530_beagle_per_uart_defconfig broken>
Message-ID: <1282062259-26339-1-git-send-email-nm@ti.com>

Add OMAP3 architecture specific dcache flush back in.

Commit 78104ae181f78d83664fdc7522eb632d9c3b2ec9 isolates
the cache handling to appropriate handlers, but certain
architectures may need special handling esp during boot
time.
without this patch, building barebox with
	omap3530_beagle_per_uart_defconfig
and attempting to use peripheral download with pusb/pserial
will fail as OMAP ROM code depends on 2nd stage bootloaders
to clean up things.

Discussion Thread: http://www.spinics.net/lists/u-boot-v2/msg01286.html

Cc: Michael <mgr at pengutronix.de>
Cc: Sascha Hauer <s.hauer at pengutronix.de>

Signed-off-by: Nishanth Menon <nm at ti.com>
---
This patch is based on master commit id: 3762bb2

 arch/arm/mach-omap/omap3_core.S |   43 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap/omap3_core.S b/arch/arm/mach-omap/omap3_core.S
index d904231..ee4c133 100644
--- a/arch/arm/mach-omap/omap3_core.S
+++ b/arch/arm/mach-omap/omap3_core.S
@@ -86,6 +86,49 @@ next:
         ldr     lr,	[sp]    /* restore current link register */
         ldr     ip,	[sp]    /* restore save ip */
 
+	/* Invalidate all Dcaches */
+#ifndef CONFIG_CPU_V7_DCACHE_SKIP
+	/* If Arch specific ROM code SMI handling does not exist */
+	mrc	p15, 1, r0, c0, c0, 1	/* read clidr */
+	ands	r3, r0, #0x7000000	/* extract loc from clidr */
+	mov	r3, r3, lsr #23		/* left align loc bit field */
+	beq	finished_inval		/* if loc is 0, then no need to clean */
+	mov	r10, #0			/* start clean at cache level 0 */
+inval_loop1:
+	add	r2, r10, r10, lsr #1	/* work out 3x current cache level */
+	mov	r1, r0, lsr r2		/* extract cache type bits from clidr */
+	and	r1, r1, #	7	/* mask of the bits for current cache only */
+	cmp	r1, #2			/* see what cache we have at this level */
+	blt	skip_inval		/* skip if no cache, or just i-cache */
+	mcr	p15, 2, r10, c0, c0, 0	/* select current cache level in cssr */
+	isb				/* isb to sych the new cssr&csidr */
+	mrc	p15, 1, r1, c0, c0, 0	/* read the new csidr */
+	and	r2, r1, #7		/* extract the length of the cache lines */
+	add	r2, r2, #4		/* add 4 (line length offset) */
+	ldr	r4, =0x3ff
+	ands	r4, r4, r1, lsr #3	/* find maximum number on the way size*/
+	clz	r5, r4			/* find bit position of way size increment */
+	ldr	r7, =0x7fff
+	ands	r7, r7, r1, lsr #13	/* extract max number of the index size */
+inval_loop2:
+	mov	r9, r4			/* create working copy of max way size */
+inval_loop3:
+	orr	r11, r10, r9, lsl r5	/* factor way and cache number into r11*/
+	orr	r11, r11, r7, lsl r2	/* factor index number into r11 */
+	mcr	p15, 0, r11, c7, c6, 2	/* invalidate by set/way */
+	subs	r9, r9, #1		/* decrement the way */
+	bge	inval_loop3
+	subs	r7, r7, #1		/* decrement the index */
+	bge	inval_loop2
+skip_inval:
+	add	r10, r10, #2		/* increment cache number */
+	cmp	r3, r10
+	bgt	inval_loop1
+finished_inval:
+	mov	r10, #0			/* swith back to cache level 0 */
+	mcr	p15, 2, r10, c0, c0, 0	/* select current cache level in cssr */
+	isb
+#endif /* CONFIG_CPU_V7_DCACHE_SKIP */
 	/* back to arch calling code */
 	mov	pc,	lr
 
-- 
1.6.3.3



From plagnioj at jcrosoft.com  Tue Aug 17 22:03:09 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed, 18 Aug 2010 04:03:09 +0200
Subject: [PATCH 2/2] at91rm9200: delete choice without type
In-Reply-To: <1282035089-24448-3-git-send-email-m.grzeschik@pengutronix.de>
References: <1282035089-24448-1-git-send-email-m.grzeschik@pengutronix.de>
	<1282035089-24448-3-git-send-email-m.grzeschik@pengutronix.de>
Message-ID: <20100818020309.GB454@game.jcrosoft.org>

On 10:51 Tue 17 Aug     , Michael Grzeschik wrote:
> Signed-off-by: Michael Grzeschik <m.grzeschik at pengutronix.de>
No we need to do remote it completly

I'm currently adding it so please wait few hours

in the at91 mach as in the kernel

Best Regards,
J.


From baruch at tkos.co.il  Wed Aug 18 00:49:51 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Wed, 18 Aug 2010 07:49:51 +0300
Subject: [PATCH 2/2] setser: new command to set serial number on ARM
In-Reply-To: <7a1057f8529fef23994321d48ab50c64a362dfeb.1281007209.git.baruch@tkos.co.il>
References: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
	<7a1057f8529fef23994321d48ab50c64a362dfeb.1281007209.git.baruch@tkos.co.il>
Message-ID: <20100818044951.GB27096@jasper.tkos.co.il>

Hi Barebox list,

Ping?

Should I implement this as a character device? :-)

baruch

On Thu, Aug 05, 2010 at 02:23:18PM +0300, Baruch Siach wrote:
> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
> ---
>  commands/Kconfig  |    8 ++++++++
>  commands/Makefile |    1 +
>  commands/setser.c |   43 +++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 52 insertions(+), 0 deletions(-)
>  create mode 100644 commands/setser.c
> 
> diff --git a/commands/Kconfig b/commands/Kconfig
> index 1ffc826..9d11a8b 100644
> --- a/commands/Kconfig
> +++ b/commands/Kconfig
> @@ -231,6 +231,14 @@ config CMD_BOOTU
>  	   compile in the 'bootu' command to start raw (uncompressed)
>  	   Linux images
>  
> +config CMD_SETSER
> +	tristate
> +	depends on ARM
> +	prompt "setser"
> +	help
> +	  compile in the 'setser' command to set the 64bit serial number to be 
> +	  passed to the Linux kernel upon boot
> +
>  config CMD_LINUX16
>  	tristate
>  	default y if X86
> diff --git a/commands/Makefile b/commands/Makefile
> index b99f042..276af85 100644
> --- a/commands/Makefile
> +++ b/commands/Makefile
> @@ -1,4 +1,5 @@
>  obj-$(CONFIG_CMD_BOOTM)		+= bootm.o
> +obj-$(CONFIG_CMD_SETSER)	+= setser.o
>  obj-$(CONFIG_CMD_LINUX16)	+= linux16.o
>  obj-$(CONFIG_CMD_LOADB)		+= loadb.o xyzModem.o
>  obj-$(CONFIG_CMD_LOADY)		+= loadb.o xyzModem.o
> diff --git a/commands/setser.c b/commands/setser.c
> new file mode 100644
> index 0000000..ef4fb0a
> --- /dev/null
> +++ b/commands/setser.c
> @@ -0,0 +1,43 @@
> +/*
> + * Copyright (c) 2010 Baruch Siach <baruch at tkos.co.il>,
> + *	Orex Computed Radiography
> + *
> + * 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.
> + *
> + * http://www.opensource.org/licenses/gpl-license.html
> + * http://www.gnu.org/copyleft/gpl.html
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <asm/armlinux.h>
> +#include <asm/byteorder.h>
> +
> +static int do_setser(struct command *cmdtp, int argc, char *argv[])
> +{
> +	int ret;
> +	u8 buf[8];
> +
> +	if (argc != 2)
> +		return COMMAND_ERROR_USAGE;
> +
> +	ret = string_to_bin(argv[1], buf, 8);
> +	if (ret < 0)
> +		return COMMAND_ERROR_USAGE;
> +
> +	armlinux_set_serial(be64_to_cpup((u64 *)buf));
> +
> +	return 0;
> +}
> +
> +static const __maybe_unused char cmd_setser_help[] =
> +"Usage: setser xx:xx:xx:xx:xx:xx:xx:xx\n"
> +"Set 64bit serial number to pass to the Linux kernel\n";
> +
> +BAREBOX_CMD_START(setser)
> +	.cmd	= do_setser,
> +	.usage	= "set serial number",
> +	BAREBOX_CMD_HELP(cmd_setser_help)
> +BAREBOX_CMD_END
> -- 
> 1.7.1
> 

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From s.hauer at pengutronix.de  Wed Aug 18 02:42:34 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Wed, 18 Aug 2010 08:42:34 +0200
Subject: [PATCH|RFC] beagle: make nand ecc command based
In-Reply-To: <4C6A6709.9080107@gmail.com>
References: <1282035337-25094-1-git-send-email-m.grzeschik@pengutronix.de>
	<4C6A6709.9080107@gmail.com>
Message-ID: <20100818064233.GY27749@pengutronix.de>

On Tue, Aug 17, 2010 at 05:40:09AM -0500, Nishanth Menon wrote:
> On 08/17/2010 03:55 AM, Michael Grzeschik wrote:
>> Signed-off-by: Michael Grzeschik<m.grzeschik at pengutronix.de>
>> ---
>> This will only work once and bring the nand chip into a undefined state
>> after a second call. Any ideas for doing this save?
> looking at the gpmc logic, it does a reset in gpmc_cs_config by  
> disabling and re-enabling it -> so my guess is:
> a) in the selection of ecc logic
> b) reset of statemachines in mtd layers
> c) nand chip not being reset from it's previous state (resetting the  
> controller does not mean nand chip is reset) (if i recollect sometime  
> back mtd used to do a 0xff and reset)..
>
>
> personally, IMHO using s/w ecc has not much benefit other than being  
> "legacy enabled"

It really seems odd to me that the omap internal ROM code expects hw
ecc while xloader and kernel expect hw ecc. This way we always need
two different ecc algorithms in place which is really inconvenient and
hard for users to get it right.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From menon.nishanth at gmail.com  Wed Aug 18 06:03:15 2010
From: menon.nishanth at gmail.com (Nishanth Menon)
Date: Wed, 18 Aug 2010 05:03:15 -0500
Subject: [PATCH|RFC] beagle: make nand ecc command based
In-Reply-To: <20100818064233.GY27749@pengutronix.de>
References: <1282035337-25094-1-git-send-email-m.grzeschik@pengutronix.de>
	<4C6A6709.9080107@gmail.com>
	<20100818064233.GY27749@pengutronix.de>
Message-ID: <4C6BAFE3.8080805@gmail.com>

On 08/18/2010 01:42 AM, Sascha Hauer wrote:
> On Tue, Aug 17, 2010 at 05:40:09AM -0500, Nishanth Menon wrote:
>> On 08/17/2010 03:55 AM, Michael Grzeschik wrote:
>>> Signed-off-by: Michael Grzeschik<m.grzeschik at pengutronix.de>
>>> ---
>>> This will only work once and bring the nand chip into a undefined state
>>> after a second call. Any ideas for doing this save?
>> looking at the gpmc logic, it does a reset in gpmc_cs_config by
>> disabling and re-enabling it ->  so my guess is:
>> a) in the selection of ecc logic
>> b) reset of statemachines in mtd layers
>> c) nand chip not being reset from it's previous state (resetting the
>> controller does not mean nand chip is reset) (if i recollect sometime
>> back mtd used to do a 0xff and reset)..
>>
>>
>> personally, IMHO using s/w ecc has not much benefit other than being
>> "legacy enabled"
>
> It really seems odd to me that the omap internal ROM code expects hw
> ecc while xloader and kernel expect hw ecc. This way we always need
> two different ecc algorithms in place which is really inconvenient and
> hard for users to get it right.


I agree, but there has been a lot of history behind how this came to 
happen. there is still discussion in linux-omap in getting kernel's mtd 
driver to sanely handle the ecc strategy selectable by the board.

Regards,
Nishanth Menon



From plagnioj at jcrosoft.com  Wed Aug 18 11:15:36 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Wed, 18 Aug 2010 17:15:36 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100818151536.GF454@game.jcrosoft.org>

On 06:17 Sun 08 Aug     , Jean-Christophe PLAGNIOL-VILLARD wrote:
> this will add also the support of the new ncurse interface nconfig
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
is it ok to apply it?

Best Regards,
J.


From plagnioj at jcrosoft.com  Wed Aug 18 22:48:11 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 04:48:11 +0200
Subject: [PATCH 0/6] AT91 fies and new soc & board
Message-ID: <20100819024811.GG454@game.jcrosoft.org>

Hi,

	the following patches add the support of the at91sam9261 with the
	ek ref board and the pm9261 from Ronetix

	this also prepare the re-adding of the RM9200 in the mach-at91

  mmccpu: fix typo in AT91_MAIN_CLOCK (2010-08-18 23:21:16 +0800)

are available in the git repository at:
  git://git.jcrosoft.org/barebox.git at91

Jean-Christophe PLAGNIOL-VILLARD (6):
      dm9000: allow to specify that no srom is present
      at91: Introduction of at91sam9261 SOC.
      at91: add Ronetix pm9261 board support
      at91: rename clocksource.c -> at91sam926x_time.c
      macb: introduce HAS_MACB configuration
      at91: remove non used and obsolete at91rm9200 code

 arch/arm/Kconfig                                   |    5 -
 arch/arm/Makefile                                  |    3 +-
 arch/arm/boards/at91sam9261ek/Makefile             |    1 +
 arch/arm/boards/at91sam9261ek/config.h             |  110 +++
 arch/arm/boards/at91sam9261ek/env/bin/_update      |   36 +
 arch/arm/boards/at91sam9261ek/env/bin/boot         |   47 ++
 arch/arm/boards/at91sam9261ek/env/bin/hush_hack    |    1 +
 arch/arm/boards/at91sam9261ek/env/bin/init         |   38 +
 .../at91sam9261ek/env/bin/update_barebox_xmodem    |   26 +
 .../arm/boards/at91sam9261ek/env/bin/update_kernel |   15 +
 arch/arm/boards/at91sam9261ek/env/bin/update_root  |   16 +
 arch/arm/boards/at91sam9261ek/env/config           |   28 +
 arch/arm/boards/at91sam9261ek/init.c               |  170 +++++
 arch/arm/boards/pm9261/Makefile                    |    1 +
 arch/arm/boards/pm9261/config.h                    |  110 +++
 arch/arm/boards/pm9261/env/bin/_update             |   36 +
 arch/arm/boards/pm9261/env/bin/boot                |   47 ++
 arch/arm/boards/pm9261/env/bin/hush_hack           |    1 +
 arch/arm/boards/pm9261/env/bin/init                |   38 +
 .../boards/pm9261/env/bin/update_barebox_xmodem    |   26 +
 arch/arm/boards/pm9261/env/bin/update_kernel       |   15 +
 arch/arm/boards/pm9261/env/bin/update_root         |   16 +
 arch/arm/boards/pm9261/env/config                  |   28 +
 arch/arm/boards/pm9261/init.c                      |  169 +++++
 arch/arm/boards/scb9328/scb9328.c                  |    1 +
 arch/arm/configs/at91sam9261ek_defconfig           |  242 +++++++
 arch/arm/configs/pm9261_defconfig                  |  250 +++++++
 arch/arm/mach-at91/Kconfig                         |   33 +
 arch/arm/mach-at91/Makefile                        |    7 +-
 arch/arm/mach-at91/at91sam9261.c                   |  230 ++++++
 arch/arm/mach-at91/at91sam9261_devices.c           |  169 +++++
 .../{clocksource.c => at91sam926x_time.c}          |    0
 arch/arm/mach-at91/include/mach/at91sam9261.h      |  109 +++
 .../mach-at91/include/mach/at91sam9261_matrix.h    |   64 ++
 arch/arm/mach-at91rm9200/Kconfig                   |   16 -
 arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h |  762 --------------------
 arch/arm/mach-at91rm9200/include/mach/hardware.h   |   78 --
 drivers/net/Kconfig                                |    5 +-
 drivers/net/dm9000.c                               |    6 +-
 include/dm9000.h                                   |    1 +
 40 files changed, 2088 insertions(+), 868 deletions(-)
 create mode 100644 arch/arm/boards/at91sam9261ek/Makefile
 create mode 100644 arch/arm/boards/at91sam9261ek/config.h
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/_update
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/boot
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/hush_hack
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/init
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/update_barebox_xmodem
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/update_kernel
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/update_root
 create mode 100644 arch/arm/boards/at91sam9261ek/env/config
 create mode 100644 arch/arm/boards/at91sam9261ek/init.c
 create mode 100644 arch/arm/boards/pm9261/Makefile
 create mode 100644 arch/arm/boards/pm9261/config.h
 create mode 100644 arch/arm/boards/pm9261/env/bin/_update
 create mode 100644 arch/arm/boards/pm9261/env/bin/boot
 create mode 100644 arch/arm/boards/pm9261/env/bin/hush_hack
 create mode 100644 arch/arm/boards/pm9261/env/bin/init
 create mode 100644 arch/arm/boards/pm9261/env/bin/update_barebox_xmodem
 create mode 100644 arch/arm/boards/pm9261/env/bin/update_kernel
 create mode 100644 arch/arm/boards/pm9261/env/bin/update_root
 create mode 100644 arch/arm/boards/pm9261/env/config
 create mode 100644 arch/arm/boards/pm9261/init.c
 create mode 100644 arch/arm/configs/at91sam9261ek_defconfig
 create mode 100644 arch/arm/configs/pm9261_defconfig
 create mode 100644 arch/arm/mach-at91/at91sam9261.c
 create mode 100644 arch/arm/mach-at91/at91sam9261_devices.c
 rename arch/arm/mach-at91/{clocksource.c => at91sam926x_time.c} (100%)
 create mode 100644 arch/arm/mach-at91/include/mach/at91sam9261.h
 create mode 100644 arch/arm/mach-at91/include/mach/at91sam9261_matrix.h
 delete mode 100644 arch/arm/mach-at91rm9200/Kconfig
 delete mode 100644 arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h
 delete mode 100644 arch/arm/mach-at91rm9200/include/mach/hardware.h

Best Regards,
J.


From plagnioj at jcrosoft.com  Wed Aug 18 22:48:27 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 04:48:27 +0200
Subject: [PATCH 3/6] at91: add Ronetix pm9261 board support
In-Reply-To: <20100819024811.GG454@game.jcrosoft.org>
References: <20100819024811.GG454@game.jcrosoft.org>
Message-ID: <1282186110-32738-3-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/Makefile                                  |    1 +
 arch/arm/boards/pm9261/Makefile                    |    1 +
 arch/arm/boards/pm9261/config.h                    |  110 +++++++++
 arch/arm/boards/pm9261/env/bin/_update             |   36 +++
 arch/arm/boards/pm9261/env/bin/boot                |   47 ++++
 arch/arm/boards/pm9261/env/bin/hush_hack           |    1 +
 arch/arm/boards/pm9261/env/bin/init                |   38 +++
 .../boards/pm9261/env/bin/update_barebox_xmodem    |   26 ++
 arch/arm/boards/pm9261/env/bin/update_kernel       |   15 ++
 arch/arm/boards/pm9261/env/bin/update_root         |   16 ++
 arch/arm/boards/pm9261/env/config                  |   28 +++
 arch/arm/boards/pm9261/init.c                      |  169 +++++++++++++
 arch/arm/configs/pm9261_defconfig                  |  250 ++++++++++++++++++++
 arch/arm/mach-at91/Kconfig                         |    8 +
 14 files changed, 746 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/boards/pm9261/Makefile
 create mode 100644 arch/arm/boards/pm9261/config.h
 create mode 100644 arch/arm/boards/pm9261/env/bin/_update
 create mode 100644 arch/arm/boards/pm9261/env/bin/boot
 create mode 100644 arch/arm/boards/pm9261/env/bin/hush_hack
 create mode 100644 arch/arm/boards/pm9261/env/bin/init
 create mode 100644 arch/arm/boards/pm9261/env/bin/update_barebox_xmodem
 create mode 100644 arch/arm/boards/pm9261/env/bin/update_kernel
 create mode 100644 arch/arm/boards/pm9261/env/bin/update_root
 create mode 100644 arch/arm/boards/pm9261/env/config
 create mode 100644 arch/arm/boards/pm9261/init.c
 create mode 100644 arch/arm/configs/pm9261_defconfig

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 7d2a118..c1e488c 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -78,6 +78,7 @@ board-$(CONFIG_MACH_PCA100)			:= phycard-i.MX27
 board-$(CONFIG_MACH_PCM037)			:= pcm037
 board-$(CONFIG_MACH_PCM038)			:= pcm038
 board-$(CONFIG_MACH_PCM043)			:= pcm043
+board-$(CONFIG_MACH_PM9261)			:= pm9261
 board-$(CONFIG_MACH_PM9263)			:= pm9263
 board-$(CONFIG_MACH_SCB9328)			:= scb9328
 board-$(CONFIG_MACH_NESO)			:= guf-neso
diff --git a/arch/arm/boards/pm9261/Makefile b/arch/arm/boards/pm9261/Makefile
new file mode 100644
index 0000000..eb072c0
--- /dev/null
+++ b/arch/arm/boards/pm9261/Makefile
@@ -0,0 +1 @@
+obj-y += init.o
diff --git a/arch/arm/boards/pm9261/config.h b/arch/arm/boards/pm9261/config.h
new file mode 100644
index 0000000..1c57448
--- /dev/null
+++ b/arch/arm/boards/pm9261/config.h
@@ -0,0 +1,110 @@
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define AT91_MAIN_CLOCK		18432000	/* 16.367 MHz crystal */
+
+#define MASTER_PLL_DIV		15
+#define MASTER_PLL_MUL		162
+#define MAIN_PLL_DIV		2
+
+/* clocks */
+#define CONFIG_SYS_MOR_VAL						\
+		(AT91_PMC_MOSCEN |					\
+		 (255 << 8))		/* Main Oscillator Start-up Time */
+#define CONFIG_SYS_PLLAR_VAL						\
+		(AT91_PMC_PLLA_WR_ERRATA | /* Bit 29 must be 1 when prog */ \
+		 AT91_PMC_OUT |						\
+		 ((MASTER_PLL_MUL - 1) << 16) | (MASTER_PLL_DIV))
+
+/* PCK/2 = MCK Master Clock from PLLA */
+#define	CONFIG_SYS_MCKR1_VAL		\
+		(AT91_PMC_CSS_SLOW |	\
+		 AT91_PMC_PRES_1 |	\
+		 AT91SAM9_PMC_MDIV_2 |	\
+		 AT91_PMC_PDIV_1)
+
+/* PCK/2 = MCK Master Clock from PLLA */
+#define	CONFIG_SYS_MCKR2_VAL		\
+		(AT91_PMC_CSS_PLLA |	\
+		 AT91_PMC_PRES_1 |	\
+		 AT91SAM9_PMC_MDIV_2 |	\
+		 AT91_PMC_PDIV_1)
+
+/* define PDC[31:16] as DATA[31:16] */
+#define CONFIG_SYS_PIOC_PDR_VAL1	0xFFFF0000
+/* no pull-up for D[31:16] */
+#define CONFIG_SYS_PIOC_PPUDR_VAL	0xFFFF0000
+
+/* EBI_CSA, no pull-ups for D[15:0], CS1 SDRAM, CS3 NAND Flash */
+#define CONFIG_SYS_MATRIX_EBICSA_VAL		\
+       (AT91_MATRIX_DBPUC | AT91_MATRIX_CS1A_SDRAMC)
+
+/* SDRAM */
+/* SDRAMC_MR Mode register */
+#define CONFIG_SYS_SDRC_MR_VAL1		AT91_SDRAMC_MODE_NORMAL
+/* SDRAMC_TR - Refresh Timer register */
+#define CONFIG_SYS_SDRC_TR_VAL1		0x13C
+/* SDRAMC_CR - Configuration register*/
+#define CONFIG_SYS_SDRC_CR_VAL							\
+		(AT91_SDRAMC_NC_9 |						\
+		 AT91_SDRAMC_NR_13 |						\
+		 AT91_SDRAMC_NB_4 |						\
+		 AT91_SDRAMC_CAS_3 |						\
+		 AT91_SDRAMC_DBW_32 |						\
+		 (1 <<  8) |		/* Write Recovery Delay */		\
+		 (7 << 12) |		/* Row Cycle Delay */			\
+		 (3 << 16) |		/* Row Precharge Delay */		\
+		 (2 << 20) |		/* Row to Column Delay */		\
+		 (5 << 24) |		/* Active to Precharge Delay */		\
+		 (1 << 28))		/* Exit Self Refresh to Active Delay */
+
+/* Memory Device Register -> SDRAM */
+#define CONFIG_SYS_SDRC_MDR_VAL		AT91_SDRAMC_MD_SDRAM
+#define CONFIG_SYS_SDRC_MR_VAL2		AT91_SDRAMC_MODE_PRECHARGE
+#define CONFIG_SYS_SDRAM_VAL1		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRC_MR_VAL3		AT91_SDRAMC_MODE_REFRESH
+#define CONFIG_SYS_SDRAM_VAL2		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL3		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL4		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL5		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL6		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL7		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL8		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL9		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRC_MR_VAL4		AT91_SDRAMC_MODE_LMR
+#define CONFIG_SYS_SDRAM_VAL10		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRC_MR_VAL5		AT91_SDRAMC_MODE_NORMAL
+#define CONFIG_SYS_SDRAM_VAL11		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRC_TR_VAL2		1200		/* SDRAM_TR */
+#define CONFIG_SYS_SDRAM_VAL12		0		/* SDRAM_BASE */
+
+/* setup SMC0, CS0 (NOR Flash) - 16-bit, 15 WS */
+#define CONFIG_SYS_SMC0_SETUP0_VAL					\
+		(AT91_SMC_NWESETUP_(10) | AT91_SMC_NCS_WRSETUP_(10) |	\
+		 AT91_SMC_NRDSETUP_(10) | AT91_SMC_NCS_RDSETUP_(10))
+#define CONFIG_SYS_SMC0_PULSE0_VAL					\
+		(AT91_SMC_NWEPULSE_(11) | AT91_SMC_NCS_WRPULSE_(11) |	\
+		 AT91_SMC_NRDPULSE_(11) | AT91_SMC_NCS_RDPULSE_(11))
+#define CONFIG_SYS_SMC0_CYCLE0_VAL	\
+		(AT91_SMC_NWECYCLE_(22) | AT91_SMC_NRDCYCLE_(22))
+#define CONFIG_SYS_SMC0_MODE0_VAL				\
+		(AT91_SMC_READMODE | AT91_SMC_WRITEMODE |	\
+		 AT91_SMC_DBW_16 |				\
+		 AT91_SMC_TDFMODE |				\
+		 AT91_SMC_TDF_(6))
+
+/* user reset enable */
+#define CONFIG_SYS_RSTC_RMR_VAL			\
+		(AT91_RSTC_KEY |		\
+		AT91_RSTC_PROCRST |		\
+		AT91_RSTC_RSTTYP_WAKEUP |	\
+		AT91_RSTC_RSTTYP_WATCHDOG)
+
+/* Disable Watchdog */
+#define CONFIG_SYS_WDTC_WDMR_VAL				\
+		(AT91_WDT_WDIDLEHLT | AT91_WDT_WDDBGHLT |	\
+		 AT91_WDT_WDV |					\
+		 AT91_WDT_WDDIS |				\
+		 AT91_WDT_WDD)
+
+#endif	/* __CONFIG_H */
diff --git a/arch/arm/boards/pm9261/env/bin/_update b/arch/arm/boards/pm9261/env/bin/_update
new file mode 100644
index 0000000..014bce3
--- /dev/null
+++ b/arch/arm/boards/pm9261/env/bin/_update
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+if [ -z "$part" -o -z "$image" ]; then
+	echo "define \$part and \$image"
+	exit 1
+fi
+
+if [ ! -e "$part" ]; then
+	echo "Partition $part does not exist"
+	exit 1
+fi
+
+if [ $# = 1 ]; then
+	image=$1
+fi
+
+if [ x$ip = xdhcp ]; then
+	dhcp
+fi
+
+ping $eth0.serverip
+if [ $? -ne 0 ] ; then
+	echo "update aborted"
+	exit 1
+fi
+
+unprotect $part
+
+echo
+echo "erasing partition $part"
+erase $part
+
+echo
+echo "flashing $image to $part"
+echo
+tftp $image $part
diff --git a/arch/arm/boards/pm9261/env/bin/boot b/arch/arm/boards/pm9261/env/bin/boot
new file mode 100644
index 0000000..533dea7
--- /dev/null
+++ b/arch/arm/boards/pm9261/env/bin/boot
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+. /env/config
+
+if [ x$1 = xnand ]; then
+	root=nand
+	kernel=nand
+fi
+
+if [ x$1 = xnet ]; then
+	root=net
+	kernel=net
+fi
+
+if [ x$1 = xnor ]; then
+	root=nor
+	kernel=nor
+fi
+
+if [ x$ip = xdhcp ]; then
+	bootargs="$bootargs ip=dhcp"
+else
+	bootargs="$bootargs ip=$eth0.ipaddr:$eth0.serverip:$eth0.gateway:$eth0.netmask:::"
+fi
+
+if [ x$root = xnand ]; then
+	bootargs="$bootargs root=$rootpart_nand rootfstype=jffs2"
+elif [ x$root = xnor ]; then
+	bootargs="$bootargs root=$rootpart_nor rootfstype=jffs2"
+else
+	bootargs="$bootargs root=/dev/nfs nfsroot=$eth0.serverip:$nfsroot,v3,tcp"
+fi
+
+bootargs="$bootargs mtdparts=physmap-flash.0:$nor_parts"
+
+if [ $kernel = net ]; then
+	if [ x$ip = xdhcp ]; then
+		dhcp
+	fi
+	tftp $uimage uImage || exit 1
+	bootm uImage
+elif [ $kernel = nor ]; then
+	bootm /dev/nor0.kernel
+else
+	bootm /dev/nand0.kernel.bb
+fi
+
diff --git a/arch/arm/boards/pm9261/env/bin/hush_hack b/arch/arm/boards/pm9261/env/bin/hush_hack
new file mode 100644
index 0000000..5fffa92
--- /dev/null
+++ b/arch/arm/boards/pm9261/env/bin/hush_hack
@@ -0,0 +1 @@
+nand -a /dev/nand0.*
diff --git a/arch/arm/boards/pm9261/env/bin/init b/arch/arm/boards/pm9261/env/bin/init
new file mode 100644
index 0000000..eaa298d
--- /dev/null
+++ b/arch/arm/boards/pm9261/env/bin/init
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+PATH=/env/bin
+export PATH
+
+. /env/config
+if [ -e /dev/nor0 ]; then
+	addpart /dev/nor0 $nor_parts
+fi
+
+if [ -e /dev/nand0 ]; then
+	addpart /dev/nand0 $nand_parts
+
+	# Uh, oh, hush first expands wildcards and then starts executing
+	# commands. What a bug!
+	source /env/bin/hush_hack 
+fi
+
+if [ -z $eth0.ethaddr ]; then
+	while [ -z $eth0.ethaddr ]; do
+		readline "no MAC address set for eth0. please enter the one found on your board: " eth0.ethaddr
+	done
+	echo -a /env/config "eth0.ethaddr=$eth0.ethaddr"
+fi
+
+echo
+echo -n "Hit any key to stop autoboot: "
+timeout -a $autoboot_timeout
+if [ $? != 0 ]; then
+	echo
+	echo "type update_kernel nor [<imagename>] to update kernel into flash"
+	echo "type update_root nor [<imagename>] to update rootfs into flash"
+	echo "type update_barebox_xmodem nor to update barebox into flash"
+	echo
+	exit
+fi
+
+boot
diff --git a/arch/arm/boards/pm9261/env/bin/update_barebox_xmodem b/arch/arm/boards/pm9261/env/bin/update_barebox_xmodem
new file mode 100644
index 0000000..39818b5
--- /dev/null
+++ b/arch/arm/boards/pm9261/env/bin/update_barebox_xmodem
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+. /env/config
+
+if [ x$1 = xnand ]; then
+	part=/dev/nand0.barebox
+elif [ x$1 = xnor ]; then
+	part=/dev/nor0.barebox
+else
+	echo "usage: $0 nor|nand"
+	exit 1
+fi
+
+loadb -f barebox.bin -c
+
+unprotect $part
+echo
+echo "erasing partition $part"
+erase $part
+
+echo
+echo "flashing barebox.bin to $part"
+echo
+cp barebox.bin $part
+crc32 -f barebox.bin
+crc32 -f $part
diff --git a/arch/arm/boards/pm9261/env/bin/update_kernel b/arch/arm/boards/pm9261/env/bin/update_kernel
new file mode 100644
index 0000000..05c822d
--- /dev/null
+++ b/arch/arm/boards/pm9261/env/bin/update_kernel
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+. /env/config
+
+image=$uimage
+if [ x$1 = xnand ]; then
+	part=/dev/nand0.kernel.bb
+elif [ x$1 = xnor ]; then
+	part=/dev/nor0.kernel
+else
+	echo "usage: $0 nor|nand [imagename]"
+	exit 1
+fi
+
+. /env/bin/_update $2
diff --git a/arch/arm/boards/pm9261/env/bin/update_root b/arch/arm/boards/pm9261/env/bin/update_root
new file mode 100644
index 0000000..a751372
--- /dev/null
+++ b/arch/arm/boards/pm9261/env/bin/update_root
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+. /env/config
+
+image=$jffs2
+if [ x$1 = xnand ]; then
+	part=/dev/nand0.root.bb
+elif [ x$1 = xnor ]; then
+	part=/dev/nor0.root
+else
+	echo "usage: $0 nor|nand [imagename]"
+	exit 1
+fi
+
+. /env/bin/_update $2
+
diff --git a/arch/arm/boards/pm9261/env/config b/arch/arm/boards/pm9261/env/config
new file mode 100644
index 0000000..4b322ad
--- /dev/null
+++ b/arch/arm/boards/pm9261/env/config
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+# can be either 'net', 'nor' or 'nand''
+kernel=net
+root=net
+
+uimage=uImage
+jffs2=root.jffs2
+
+autoboot_timeout=3
+
+nfsroot=""
+bootargs="console=ttyS0,115200"
+
+nor_parts="256k(barebox)ro,64k(bareboxenv),1536k(kernel),-(root)"
+rootpart_nor="/dev/mtdblock3"
+
+#nand_parts="256k(barebox)ro,64k(bareboxenv),1536k(kernel),-(root)"
+#rootpart_nand="/dev/mtdblock7"
+
+# use 'dhcp' to do dhcp in barebox and in kernel
+ip=dhcp
+
+# or set your networking parameters here
+#eth0.ipaddr=a.b.c.d
+#eth0.netmask=a.b.c.d
+#eth0.gateway=a.b.c.d
+#eth0.serverip=192.168.23.1
diff --git a/arch/arm/boards/pm9261/init.c b/arch/arm/boards/pm9261/init.c
new file mode 100644
index 0000000..4b0813b
--- /dev/null
+++ b/arch/arm/boards/pm9261/init.c
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2007 Sascha Hauer, Pengutronix
+ *
+ * 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 <init.h>
+#include <environment.h>
+#include <asm/armlinux.h>
+#include <asm/mach-types.h>
+#include <partition.h>
+#include <fs.h>
+#include <fcntl.h>
+#include <asm/io.h>
+#include <asm/hardware.h>
+#include <nand.h>
+#include <linux/mtd/nand.h>
+#include <mach/at91_pmc.h>
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/io.h>
+#include <mach/at91sam9_smc.h>
+#include <mach/sam9_smc.h>
+#include <dm9000.h>
+
+static struct atmel_nand_data nand_pdata = {
+	.ale		= 22,
+	.cle		= 21,
+/*	.det_pin	= ... not connected */
+	.rdy_pin	= AT91_PIN_PA16,
+	.enable_pin	= AT91_PIN_PC14,
+#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
+	.bus_width_16	= 1,
+#else
+	.bus_width_16	= 0,
+#endif
+};
+
+static struct sam9_smc_config pm_nand_smc_config = {
+	.ncs_read_setup		= 0,
+	.nrd_setup		= 1,
+	.ncs_write_setup	= 0,
+	.nwe_setup		= 1,
+
+	.ncs_read_pulse		= 3,
+	.nrd_pulse		= 3,
+	.ncs_write_pulse	= 3,
+	.nwe_pulse		= 3,
+
+	.read_cycle		= 5,
+	.write_cycle		= 5,
+
+	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
+	.tdf_cycles		= 2,
+};
+
+static void pm_add_device_nand(void)
+{
+	/* setup bus-width (8 or 16) */
+	if (nand_pdata.bus_width_16)
+		pm_nand_smc_config.mode |= AT91_SMC_DBW_16;
+	else
+		pm_nand_smc_config.mode |= AT91_SMC_DBW_8;
+
+	/* configure chip-select 3 (NAND) */
+	sam9_smc_configure(3, &pm_nand_smc_config);
+
+	at91_add_device_nand(&nand_pdata);
+}
+
+/*
+ * DM9000 ethernet device
+ */
+#if defined(CONFIG_DRIVER_NET_DM9000)
+static struct dm9000_platform_data dm9000_data = {
+	.iobase		= AT91_CHIPSELECT_2,
+	.iodata		= AT91_CHIPSELECT_2 + 4,
+	.buswidth	= DM9000_WIDTH_16,
+	.srom		= 1,
+};
+
+static struct device_d dm9000_dev = {
+	.name		= "dm9000",
+	.map_base	= AT91_CHIPSELECT_2,
+	.size		= 8,
+	.platform_data	= &dm9000_data,
+};
+
+/*
+ * SMC timings for the DM9000.
+ * Note: These timings were calculated for MASTER_CLOCK = 100000000 according to the DM9000 timings.
+ */
+static struct sam9_smc_config __initdata dm9000_smc_config = {
+	.ncs_read_setup		= 0,
+	.nrd_setup		= 2,
+	.ncs_write_setup	= 0,
+	.nwe_setup		= 2,
+
+	.ncs_read_pulse		= 8,
+	.nrd_pulse		= 4,
+	.ncs_write_pulse	= 8,
+	.nwe_pulse		= 4,
+
+	.read_cycle		= 16,
+	.write_cycle		= 16,
+
+	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE | AT91_SMC_DBW_16,
+	.tdf_cycles		= 1,
+};
+
+static void __init pm_add_device_dm9000(void)
+{
+	/* Configure chip-select 2 (DM9000) */
+	sam9_smc_configure(2, &dm9000_smc_config);
+
+	register_device(&dm9000_dev);
+}
+#else
+static void __init ek_add_device_dm9000(void) {}
+#endif /* CONFIG_DRIVER_NET_DM9000 */
+
+static struct device_d cfi_dev = {
+	.name     = "cfi_flash",
+	.map_base = AT91_CHIPSELECT_0,
+	.size     = 4 * 1024 * 1024,
+};
+
+static int pm9261_devices_init(void)
+{
+
+	at91_add_device_sdram(64 * 1024 * 1024);
+	pm_add_device_nand();
+	register_device(&cfi_dev);
+	pm_add_device_dm9000();
+
+	devfs_add_partition("nor0", 0x00000, 0x40000, PARTITION_FIXED, "self");
+	devfs_add_partition("nor0", 0x40000, 0x10000, PARTITION_FIXED, "env0");
+
+	armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
+	armlinux_set_architecture(MACH_TYPE_PM9261);
+
+	return 0;
+}
+
+device_initcall(pm9261_devices_init);
+
+static int pm9261_console_init(void)
+{
+	at91_register_uart(0, 0);
+	return 0;
+}
+
+console_initcall(pm9261_console_init);
diff --git a/arch/arm/configs/pm9261_defconfig b/arch/arm/configs/pm9261_defconfig
new file mode 100644
index 0000000..a135ef7
--- /dev/null
+++ b/arch/arm/configs/pm9261_defconfig
@@ -0,0 +1,250 @@
+#
+# Automatically generated make config: don't edit
+# U-Boot version: 2.0.0-rc10
+# Wed Oct 21 16:44:38 2009
+#
+# CONFIG_BOARD_LINKER_SCRIPT is not set
+CONFIG_GENERIC_LINKER_SCRIPT=y
+CONFIG_ARM=y
+
+#
+# System Type
+#
+CONFIG_ARCH_AT91=y
+# CONFIG_ARCH_AT91RM9200 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_S3C24xx is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+
+#
+# processor features
+#
+CONFIG_ARCH_TEXT_BASE=0x23f00000
+CONFIG_BOARDINFO="Ronetix PM9261"
+
+#
+# Atmel AT91 System-on-Chip
+#
+# CONFIG_ARCH_AT91SAM9260 is not set
+CONFIG_ARCH_AT91SAM9261=y
+# CONFIG_ARCH_AT91SAM9263 is not set
+# CONFIG_MACH_AT91SAM9261EK is not set
+CONFIG_MACH_PM9261=y
+# CONFIG_AEABI is not set
+
+#
+# Arm specific settings         
+#
+CONFIG_CMD_ARM_CPUINFO=y
+CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
+CONFIG_GREGORIAN_CALENDER=y
+CONFIG_HAS_KALLSYMS=y
+CONFIG_HAS_MODULES=y
+CONFIG_CMD_MEMORY=y
+CONFIG_ENV_HANDLING=y
+CONFIG_GENERIC_GPIO=y
+
+#
+# General Settings              
+#
+CONFIG_LOCALVERSION_AUTO=y
+
+#
+# memory layout                 
+#
+CONFIG_HAVE_CONFIGURABLE_TEXT_BASE=y
+CONFIG_TEXT_BASE=0x23f00000
+CONFIG_HAVE_CONFIGURABLE_MEMORY_LAYOUT=y
+CONFIG_MEMORY_LAYOUT_DEFAULT=y
+# CONFIG_MEMORY_LAYOUT_FIXED is not set
+CONFIG_STACK_SIZE=0x8000
+CONFIG_MALLOC_SIZE=0x400000
+# CONFIG_BROKEN is not set
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_MACH_HAS_LOWLEVEL_INIT=y
+CONFIG_MACH_DO_LOWLEVEL_INIT=y
+CONFIG_PROMPT="PM9261:"
+CONFIG_BAUDRATE=115200
+CONFIG_LONGHELP=y
+CONFIG_CBSIZE=1024
+CONFIG_MAXARGS=16
+CONFIG_SHELL_HUSH=y
+# CONFIG_SHELL_SIMPLE is not set
+CONFIG_GLOB=y
+CONFIG_PROMPT_HUSH_PS2="> "
+# CONFIG_HUSH_FANCY_PROMPT is not set
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+CONFIG_DYNAMIC_CRC_TABLE=y
+CONFIG_ERRNO_MESSAGES=y
+CONFIG_TIMESTAMP=y
+CONFIG_CONSOLE_FULL=y
+CONFIG_CONSOLE_ACTIVATE_FIRST=y
+# CONFIG_OF_FLAT_TREE is not set
+CONFIG_PARTITION=y
+CONFIG_DEFAULT_ENVIRONMENT=y
+CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/pm9261/env/"
+
+#
+# Debugging                     
+#
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_ENABLE_FLASH_NOISE is not set
+# CONFIG_ENABLE_PARTITION_NOISE is not set
+# CONFIG_ENABLE_DEVICE_NOISE is not set
+
+#
+# Commands                      
+#
+
+#
+# scripting                     
+#
+CONFIG_CMD_EDIT=y
+CONFIG_CMD_SLEEP=y
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_LOADENV=y
+CONFIG_CMD_EXPORT=y
+CONFIG_CMD_PRINTENV=y
+CONFIG_CMD_READLINE=y
+CONFIG_CMD_TRUE=y
+CONFIG_CMD_FALSE=y
+
+#
+# file commands                 
+#
+CONFIG_CMD_LS=y
+CONFIG_CMD_RM=y
+CONFIG_CMD_CAT=y
+CONFIG_CMD_MKDIR=y
+CONFIG_CMD_RMDIR=y
+CONFIG_CMD_CP=y
+CONFIG_CMD_PWD=y
+CONFIG_CMD_CD=y
+CONFIG_CMD_MOUNT=y
+CONFIG_CMD_UMOUNT=y
+
+#
+# console                       
+#
+CONFIG_CMD_CLEAR=y
+CONFIG_CMD_ECHO=y
+# CONFIG_CMD_ECHO_E is not set
+
+#
+# memory                        
+#
+# CONFIG_CMD_LOADB is not set
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_CRC=y
+CONFIG_CMD_MTEST=y
+# CONFIG_CMD_MTEST_ALTERNATIVE is not set
+
+#
+# flash                         
+#
+CONFIG_CMD_FLASH=y
+CONFIG_CMD_UBI=y
+
+#
+# booting                       
+#
+CONFIG_CMD_BOOTM=y
+CONFIG_CMD_BOOTM_ZLIB=y
+CONFIG_CMD_BOOTM_BZLIB=y
+CONFIG_CMD_BOOTM_SHOW_TYPE=y
+CONFIG_CMD_BOOTZ=y
+CONFIG_CMD_BOOTU=y
+# CONFIG_CMD_LINUX16 is not set
+CONFIG_CMD_RESET=y
+CONFIG_CMD_GO=y
+CONFIG_CMD_TIMEOUT=y
+CONFIG_CMD_PARTITION=y
+CONFIG_CMD_TEST=y
+CONFIG_CMD_VERSION=y
+CONFIG_CMD_HELP=y
+CONFIG_CMD_DEVINFO=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_UNLZO=y
+CONFIG_NET=y
+CONFIG_NET_DHCP=y
+CONFIG_NET_NFS=y
+CONFIG_NET_PING=y
+CONFIG_NET_TFTP=y
+# CONFIG_NET_TFTP_PUSH is not set
+# CONFIG_NET_NETCONSOLE is not set
+# CONFIG_NET_RESOLV is not set
+
+#
+# Drivers                       
+#
+
+#
+# serial drivers                
+#
+# CONFIG_DRIVER_SERIAL_ARM_DCC is not set
+# CONFIG_DRIVER_SERIAL_NS16550 is not set
+CONFIG_DRIVER_SERIAL_ATMEL=y
+CONFIG_HAS_DM9000=y
+CONFIG_MIIPHY=y
+
+#
+# Network drivers               
+#
+# CONFIG_DRIVER_NET_SMC911X is not set
+# CONFIG_DRIVER_NET_SMC91111 is not set
+CONFIG_DRIVER_NET_DM9000=y
+# CONFIG_DRIVER_NET_MACB is not set
+
+#
+# SPI drivers                   
+#
+# CONFIG_SPI is not set
+# CONFIG_I2C is not set
+
+#
+# flash drivers                 
+#
+CONFIG_DRIVER_CFI=y
+CONFIG_DRIVER_CFI_INTEL=y
+CONFIG_DRIVER_CFI_AMD=y
+CONFIG_DRIVER_CFI_BANK_WIDTH_1=y
+CONFIG_DRIVER_CFI_BANK_WIDTH_2=y
+CONFIG_DRIVER_CFI_BANK_WIDTH_4=y
+# CONFIG_DRIVER_CFI_BANK_WIDTH_8 is not set
+CONFIG_CFI_BUFFER_WRITE=y
+CONFIG_MTD=y
+CONFIG_NAND=y
+CONFIG_NAND_ATMEL=y
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=y
+CONFIG_UBI=y
+# CONFIG_ATA is not set
+# CONFIG_USB is not set
+# CONFIG_USB_GADGET is not set
+# CONFIG_VIDEO is not set
+
+#
+# Filesystem support            
+#
+# CONFIG_FS_CRAMFS is not set
+CONFIG_FS_RAMFS=y
+CONFIG_FS_DEVFS=y
+CONFIG_PARTITION_NEED_MTD=y
+CONFIG_ZLIB=y
+CONFIG_BZLIB=y
+CONFIG_CRC32=y
+# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+# CONFIG_PROCESS_ESCAPE_SEQUENCE is not set
+CONFIG_LZO_DECOMPRESS=y
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index debc7dc..bea238b 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -9,6 +9,7 @@ config BOARDINFO
 	default "Atmel at91sam9261-ek" if MACH_AT91SAM9261EK
 	default "Atmel at91sam9263-ek" if MACH_AT91SAM9263EK
 	default "Bucyrus MMC-CPU" if MACH_MMCCPU
+	default "Ronetix PM9261" if MACH_PM9261
 	default "Ronetix PM9263" if MACH_PM9263
 
 comment "Atmel AT91 System-on-Chip"
@@ -23,6 +24,7 @@ config ARCH_AT91SAM9260
 config ARCH_AT91SAM9261
 	bool "AT91SAM9261"
 	select CPU_ARM926T
+	select MACH_HAS_LOWLEVEL_INIT
 
 config ARCH_AT91SAM9263
 	bool "AT91SAM9263"
@@ -62,6 +64,12 @@ config MACH_AT91SAM9261EK
 	  Select this if you are using Atmel's AT91SAM9261-EK Evaluation Kit.
 	  <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820>
 
+config MACH_PM9261
+	bool "Ronetix PM9261"
+	select HAS_DM9000
+	help
+	  Say y here if you are using the Ronetix PM9261 Board
+
 endchoice
 
 endif
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug 18 22:48:25 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 04:48:25 +0200
Subject: [PATCH 1/6] dm9000: allow to specify that no srom is present
In-Reply-To: <20100819024811.GG454@game.jcrosoft.org>
References: <20100819024811.GG454@game.jcrosoft.org>
Message-ID: <1282186110-32738-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/boards/scb9328/scb9328.c |    1 +
 drivers/net/dm9000.c              |    6 ++++--
 include/dm9000.h                  |    1 +
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/arch/arm/boards/scb9328/scb9328.c b/arch/arm/boards/scb9328/scb9328.c
index e781393..3c04996 100644
--- a/arch/arm/boards/scb9328/scb9328.c
+++ b/arch/arm/boards/scb9328/scb9328.c
@@ -55,6 +55,7 @@ static struct dm9000_platform_data dm9000_data = {
 	.iobase   = 0x16000000,
 	.iodata   = 0x16000004,
 	.buswidth = DM9000_WIDTH_16,
+	.srom     = 1;
 };
 
 static struct device_d dm9000_dev = {
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 2062c66..5f61ddc 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -498,8 +498,10 @@ static int dm9000_probe(struct device_d *dev)
 	edev->send = dm9000_eth_send;
 	edev->recv = dm9000_eth_rx;
 	edev->halt = dm9000_eth_halt;
-	edev->get_ethaddr = dm9000_get_ethaddr;
-	edev->set_ethaddr = dm9000_set_ethaddr;
+	if (pdata->srom) {
+		edev->get_ethaddr = dm9000_get_ethaddr;
+		edev->set_ethaddr = dm9000_set_ethaddr;
+	}
 
 	/* RESET device */
 	dm9000_reset(priv);
diff --git a/include/dm9000.h b/include/dm9000.h
index 3cc5235..b4a04b1 100644
--- a/include/dm9000.h
+++ b/include/dm9000.h
@@ -10,6 +10,7 @@ struct dm9000_platform_data {
 	unsigned long iobase;
 	unsigned long iodata;
 	int buswidth;
+	int srom;
 };
 
 #endif /* __DM9000_H__ */
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug 18 22:48:29 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 04:48:29 +0200
Subject: [PATCH 5/6] macb: introduce HAS_MACB configuration
In-Reply-To: <20100819024811.GG454@game.jcrosoft.org>
References: <20100819024811.GG454@game.jcrosoft.org>
Message-ID: <1282186110-32738-5-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/mach-at91/Kconfig |    2 ++
 drivers/net/Kconfig        |    5 ++++-
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index bea238b..ef54a17 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -20,6 +20,7 @@ choice
 config ARCH_AT91SAM9260
 	bool "AT91SAM9260"
 	select CPU_ARM926T
+	select HAS_MACB
 
 config ARCH_AT91SAM9261
 	bool "AT91SAM9261"
@@ -30,6 +31,7 @@ config ARCH_AT91SAM9263
 	bool "AT91SAM9263"
 	select CPU_ARM926T
 	select MACH_HAS_LOWLEVEL_INIT
+	select HAS_MACB
 
 endchoice
 
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 0955562..a106a7b 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -4,6 +4,9 @@ config HAS_CS8900
 config HAS_DM9000
 	bool
 
+config HAS_MACB
+	bool
+
 config HAS_AT91_ETHER
 	bool
 
@@ -71,7 +74,7 @@ config DRIVER_NET_EP93XX
 
 config DRIVER_NET_MACB
 	bool "macb Ethernet driver"
-	depends on ARCH_AT91
+	depends on HAS_MACB
 	select MIIPHY
 
 config DRIVER_NET_TAP
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug 18 22:48:28 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 04:48:28 +0200
Subject: [PATCH 4/6] at91: rename clocksource.c -> at91sam926x_time.c
In-Reply-To: <20100819024811.GG454@game.jcrosoft.org>
References: <20100819024811.GG454@game.jcrosoft.org>
Message-ID: <1282186110-32738-4-git-send-email-plagnioj@jcrosoft.com>

preparation to move the rm9200 to the same api as other at91

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/mach-at91/Makefile           |    8 ++--
 arch/arm/mach-at91/at91sam926x_time.c |   85 +++++++++++++++++++++++++++++++++
 arch/arm/mach-at91/clocksource.c      |   85 ---------------------------------
 3 files changed, 89 insertions(+), 89 deletions(-)
 create mode 100644 arch/arm/mach-at91/at91sam926x_time.c
 delete mode 100644 arch/arm/mach-at91/clocksource.c

diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index 65a2657..d711f6a 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -1,8 +1,8 @@
-obj-y += clock.o clocksource.o gpio.o
+obj-y += clock.o gpio.o
 
 obj-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel_init.o
 
 # CPU-specific support
-obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam9260_devices.o sam9_smc.o
-obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam9261_devices.o sam9_smc.o
-obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam9263_devices.o sam9_smc.o
+obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o
+obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o
+obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o
diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c
new file mode 100644
index 0000000..84df1a1
--- /dev/null
+++ b/arch/arm/mach-at91/at91sam926x_time.c
@@ -0,0 +1,85 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger at sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Alex Zuepke <azu at sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj at 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 <init.h>
+#include <clock.h>
+#include <asm/hardware.h>
+#include <mach/at91_pit.h>
+#include <mach/at91_pmc.h>
+#include <mach/at91_rstc.h>
+#include <mach/io.h>
+#include <asm/io.h>
+
+uint64_t at91sam9_clocksource_read(void)
+{
+	return at91_sys_read(AT91_PIT_PIIR);
+}
+
+static struct clocksource cs = {
+	.read	= at91sam9_clocksource_read,
+	.mask	= 0xffffffff,
+	.shift	= 10,
+};
+
+static int clocksource_init (void)
+{
+	/*
+	 * Enable PITC Clock
+	 * The clock is already enabled for system controller in boot
+	 */
+	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
+
+	/* Enable PITC */
+	at91_sys_write(AT91_PIT_MR, 0xfffff | AT91_PIT_PITEN);
+
+	cs.mult = clocksource_hz2mult(1000000 * 6, cs.shift);
+
+	init_clock(&cs);
+
+	return 0;
+}
+
+core_initcall(clocksource_init);
+
+/*
+ * Reset the cpu through the reset controller
+ */
+void __noreturn reset_cpu (unsigned long ignored)
+{
+	at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY |
+				     AT91_RSTC_PROCRST |
+				     AT91_RSTC_PERRST);
+
+	/* Not reached */
+	while (1);
+}
+EXPORT_SYMBOL(reset_cpu);
diff --git a/arch/arm/mach-at91/clocksource.c b/arch/arm/mach-at91/clocksource.c
deleted file mode 100644
index 84df1a1..0000000
--- a/arch/arm/mach-at91/clocksource.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2002
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Marius Groeger <mgroeger at sysgo.de>
- *
- * (C) Copyright 2002
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Alex Zuepke <azu at sysgo.de>
- *
- * (C) Copyright 2002
- * Gary Jennejohn, DENX Software Engineering, <gj at 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 <init.h>
-#include <clock.h>
-#include <asm/hardware.h>
-#include <mach/at91_pit.h>
-#include <mach/at91_pmc.h>
-#include <mach/at91_rstc.h>
-#include <mach/io.h>
-#include <asm/io.h>
-
-uint64_t at91sam9_clocksource_read(void)
-{
-	return at91_sys_read(AT91_PIT_PIIR);
-}
-
-static struct clocksource cs = {
-	.read	= at91sam9_clocksource_read,
-	.mask	= 0xffffffff,
-	.shift	= 10,
-};
-
-static int clocksource_init (void)
-{
-	/*
-	 * Enable PITC Clock
-	 * The clock is already enabled for system controller in boot
-	 */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
-
-	/* Enable PITC */
-	at91_sys_write(AT91_PIT_MR, 0xfffff | AT91_PIT_PITEN);
-
-	cs.mult = clocksource_hz2mult(1000000 * 6, cs.shift);
-
-	init_clock(&cs);
-
-	return 0;
-}
-
-core_initcall(clocksource_init);
-
-/*
- * Reset the cpu through the reset controller
- */
-void __noreturn reset_cpu (unsigned long ignored)
-{
-	at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY |
-				     AT91_RSTC_PROCRST |
-				     AT91_RSTC_PERRST);
-
-	/* Not reached */
-	while (1);
-}
-EXPORT_SYMBOL(reset_cpu);
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug 18 22:48:26 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 04:48:26 +0200
Subject: [PATCH 2/6] at91: Introduction of at91sam9261 SOC.
In-Reply-To: <20100819024811.GG454@game.jcrosoft.org>
References: <20100819024811.GG454@game.jcrosoft.org>
Message-ID: <1282186110-32738-2-git-send-email-plagnioj@jcrosoft.com>

AT91sam9261 series is an ARM 926ej-s SOC family clocked at 190/100MHz.

The first board that embeds at91sam9261 chip is the AT91SAM9261-EK.
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/Makefile                                  |    1 +
 arch/arm/boards/at91sam9261ek/Makefile             |    1 +
 arch/arm/boards/at91sam9261ek/config.h             |  110 +++++++++
 arch/arm/boards/at91sam9261ek/env/bin/_update      |   36 +++
 arch/arm/boards/at91sam9261ek/env/bin/boot         |   47 ++++
 arch/arm/boards/at91sam9261ek/env/bin/hush_hack    |    1 +
 arch/arm/boards/at91sam9261ek/env/bin/init         |   38 +++
 .../at91sam9261ek/env/bin/update_barebox_xmodem    |   26 ++
 .../arm/boards/at91sam9261ek/env/bin/update_kernel |   15 ++
 arch/arm/boards/at91sam9261ek/env/bin/update_root  |   16 ++
 arch/arm/boards/at91sam9261ek/env/config           |   28 +++
 arch/arm/boards/at91sam9261ek/init.c               |  170 ++++++++++++++
 arch/arm/configs/at91sam9261ek_defconfig           |  242 ++++++++++++++++++++
 arch/arm/mach-at91/Kconfig                         |   23 ++
 arch/arm/mach-at91/Makefile                        |    1 +
 arch/arm/mach-at91/at91sam9261.c                   |  230 +++++++++++++++++++
 arch/arm/mach-at91/at91sam9261_devices.c           |  169 ++++++++++++++
 arch/arm/mach-at91/include/mach/at91sam9261.h      |  109 +++++++++
 .../mach-at91/include/mach/at91sam9261_matrix.h    |   64 +++++
 19 files changed, 1327 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/boards/at91sam9261ek/Makefile
 create mode 100644 arch/arm/boards/at91sam9261ek/config.h
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/_update
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/boot
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/hush_hack
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/init
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/update_barebox_xmodem
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/update_kernel
 create mode 100644 arch/arm/boards/at91sam9261ek/env/bin/update_root
 create mode 100644 arch/arm/boards/at91sam9261ek/env/config
 create mode 100644 arch/arm/boards/at91sam9261ek/init.c
 create mode 100644 arch/arm/configs/at91sam9261ek_defconfig
 create mode 100644 arch/arm/mach-at91/at91sam9261.c
 create mode 100644 arch/arm/mach-at91/at91sam9261_devices.c
 create mode 100644 arch/arm/mach-at91/include/mach/at91sam9261.h
 create mode 100644 arch/arm/mach-at91/include/mach/at91sam9261_matrix.h

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 4827fe9..7d2a118 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -52,6 +52,7 @@ machine-$(CONFIG_ARCH_S3C24xx)		:= s3c24xx
 board-$(CONFIG_MACH_A9M2410)			:= a9m2410
 board-$(CONFIG_MACH_A9M2440)			:= a9m2440
 board-$(CONFIG_MACH_AT91SAM9260EK)		:= at91sam9260ek
+board-$(CONFIG_MACH_AT91SAM9261EK)		:= at91sam9261ek
 board-$(CONFIG_MACH_AT91SAM9263EK)		:= at91sam9263ek
 board-$(CONFIG_MACH_EDB9301)			:= edb93xx
 board-$(CONFIG_MACH_EDB9302)			:= edb93xx
diff --git a/arch/arm/boards/at91sam9261ek/Makefile b/arch/arm/boards/at91sam9261ek/Makefile
new file mode 100644
index 0000000..eb072c0
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/Makefile
@@ -0,0 +1 @@
+obj-y += init.o
diff --git a/arch/arm/boards/at91sam9261ek/config.h b/arch/arm/boards/at91sam9261ek/config.h
new file mode 100644
index 0000000..bc33227
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/config.h
@@ -0,0 +1,110 @@
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define AT91_MAIN_CLOCK		16367660	/* 16.367 MHz crystal */
+
+#define MASTER_PLL_MUL		171
+#define MASTER_PLL_DIV		14
+
+/* clocks */
+#define CONFIG_SYS_MOR_VAL						\
+		(AT91_PMC_MOSCEN |					\
+		 (255 << 8))		/* Main Oscillator Start-up Time */
+#define CONFIG_SYS_PLLAR_VAL						\
+		(AT91_PMC_PLLA_WR_ERRATA | /* Bit 29 must be 1 when prog */ \
+		 AT91_PMC_OUT |						\
+		 AT91_PMC_PLLCOUNT |	/* PLL Counter */		\
+		 (2 << 28) |		/* PLL Clock Frequency Range */	\
+		 ((MASTER_PLL_MUL - 1) << 16) | (MASTER_PLL_DIV))
+
+/* PCK/2 = MCK Master Clock from PLLA */
+#define	CONFIG_SYS_MCKR1_VAL		\
+		(AT91_PMC_CSS_SLOW |	\
+		 AT91_PMC_PRES_1 |	\
+		 AT91SAM9_PMC_MDIV_2 |	\
+		 AT91_PMC_PDIV_1)
+/* PCK/2 = MCK Master Clock from PLLA */
+#define	CONFIG_SYS_MCKR2_VAL		\
+		(AT91_PMC_CSS_PLLA |	\
+		 AT91_PMC_PRES_1 |	\
+		 AT91SAM9_PMC_MDIV_2 |	\
+		 AT91_PMC_PDIV_1)
+
+/* define PDC[31:16] as DATA[31:16] */
+#define CONFIG_SYS_PIOD_PDR_VAL1	0xFFFF0000
+/* no pull-up for D[31:16] */
+#define CONFIG_SYS_PIOD_PPUDR_VAL	0xFFFF0000
+/* EBI0_CSA, CS1 SDRAM, CS3 NAND Flash, 3.3V memories */
+#define CONFIG_SYS_MATRIX_EBI0CSA_VAL					\
+	(AT91_MATRIX_EBI0_DBPUC | AT91_MATRIX_EBI0_VDDIOMSEL_3_3V |	\
+	 AT91_MATRIX_EBI0_CS1A_SDRAMC)
+
+/* SDRAM */
+/* SDRAMC_MR Mode register */
+#define CONFIG_SYS_SDRC_MR_VAL1		0
+/* SDRAMC_TR - Refresh Timer register */
+#define CONFIG_SYS_SDRC_TR_VAL1		0x13C
+/* SDRAMC_CR - Configuration register*/
+#define CONFIG_SYS_SDRC_CR_VAL							\
+		(AT91_SDRAMC_NC_9 |						\
+		 AT91_SDRAMC_NR_13 |						\
+		 AT91_SDRAMC_NB_4 |						\
+		 AT91_SDRAMC_CAS_3 |						\
+		 AT91_SDRAMC_DBW_32 |						\
+		 (1 <<  8) |		/* Write Recovery Delay */		\
+		 (7 << 12) |		/* Row Cycle Delay */			\
+		 (2 << 16) |		/* Row Precharge Delay */		\
+		 (2 << 20) |		/* Row to Column Delay */		\
+		 (5 << 24) |		/* Active to Precharge Delay */		\
+		 (1 << 28))		/* Exit Self Refresh to Active Delay */
+
+/* Memory Device Register -> SDRAM */
+#define CONFIG_SYS_SDRC_MDR_VAL		AT91_SDRAMC_MD_SDRAM
+#define CONFIG_SYS_SDRC_MR_VAL2		AT91_SDRAMC_MODE_PRECHARGE
+#define CONFIG_SYS_SDRAM_VAL1		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRC_MR_VAL3		AT91_SDRAMC_MODE_REFRESH
+#define CONFIG_SYS_SDRAM_VAL2		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL3		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL4		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL5		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL6		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL7		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL8		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRAM_VAL9		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRC_MR_VAL4		AT91_SDRAMC_MODE_LMR
+#define CONFIG_SYS_SDRAM_VAL10		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRC_MR_VAL5		AT91_SDRAMC_MODE_NORMAL
+#define CONFIG_SYS_SDRAM_VAL11		0		/* SDRAM_BASE */
+#define CONFIG_SYS_SDRC_TR_VAL2		1200		/* SDRAM_TR */
+#define CONFIG_SYS_SDRAM_VAL12		0		/* SDRAM_BASE */
+
+/* setup SMC0, CS0 (NOR Flash) - 16-bit, 15 WS */
+#define CONFIG_SYS_SMC0_SETUP0_VAL					\
+		(AT91_SMC_NWESETUP_(10) | AT91_SMC_NCS_WRSETUP_(10) |	\
+		 AT91_SMC_NRDSETUP_(10) | AT91_SMC_NCS_RDSETUP_(10))
+#define CONFIG_SYS_SMC0_PULSE0_VAL					\
+		(AT91_SMC_NWEPULSE_(11) | AT91_SMC_NCS_WRPULSE_(11) |	\
+		 AT91_SMC_NRDPULSE_(11) | AT91_SMC_NCS_RDPULSE_(11))
+#define CONFIG_SYS_SMC0_CYCLE0_VAL	\
+		(AT91_SMC_NWECYCLE_(22) | AT91_SMC_NRDCYCLE_(22))
+#define CONFIG_SYS_SMC0_MODE0_VAL				\
+		(AT91_SMC_READMODE | AT91_SMC_WRITEMODE |	\
+		 AT91_SMC_DBW_16 |				\
+		 AT91_SMC_TDFMODE |				\
+		 AT91_SMC_TDF_(6))
+
+/* user reset enable */
+#define CONFIG_SYS_RSTC_RMR_VAL			\
+		(AT91_RSTC_KEY |		\
+		AT91_RSTC_PROCRST |		\
+		AT91_RSTC_RSTTYP_WAKEUP |	\
+		AT91_RSTC_RSTTYP_WATCHDOG)
+
+/* Disable Watchdog */
+#define CONFIG_SYS_WDTC_WDMR_VAL				\
+		(AT91_WDT_WDIDLEHLT | AT91_WDT_WDDBGHLT |	\
+		 AT91_WDT_WDV |					\
+		 AT91_WDT_WDDIS |				\
+		 AT91_WDT_WDD)
+
+#endif	/* __CONFIG_H */
diff --git a/arch/arm/boards/at91sam9261ek/env/bin/_update b/arch/arm/boards/at91sam9261ek/env/bin/_update
new file mode 100644
index 0000000..014bce3
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/env/bin/_update
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+if [ -z "$part" -o -z "$image" ]; then
+	echo "define \$part and \$image"
+	exit 1
+fi
+
+if [ ! -e "$part" ]; then
+	echo "Partition $part does not exist"
+	exit 1
+fi
+
+if [ $# = 1 ]; then
+	image=$1
+fi
+
+if [ x$ip = xdhcp ]; then
+	dhcp
+fi
+
+ping $eth0.serverip
+if [ $? -ne 0 ] ; then
+	echo "update aborted"
+	exit 1
+fi
+
+unprotect $part
+
+echo
+echo "erasing partition $part"
+erase $part
+
+echo
+echo "flashing $image to $part"
+echo
+tftp $image $part
diff --git a/arch/arm/boards/at91sam9261ek/env/bin/boot b/arch/arm/boards/at91sam9261ek/env/bin/boot
new file mode 100644
index 0000000..533dea7
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/env/bin/boot
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+. /env/config
+
+if [ x$1 = xnand ]; then
+	root=nand
+	kernel=nand
+fi
+
+if [ x$1 = xnet ]; then
+	root=net
+	kernel=net
+fi
+
+if [ x$1 = xnor ]; then
+	root=nor
+	kernel=nor
+fi
+
+if [ x$ip = xdhcp ]; then
+	bootargs="$bootargs ip=dhcp"
+else
+	bootargs="$bootargs ip=$eth0.ipaddr:$eth0.serverip:$eth0.gateway:$eth0.netmask:::"
+fi
+
+if [ x$root = xnand ]; then
+	bootargs="$bootargs root=$rootpart_nand rootfstype=jffs2"
+elif [ x$root = xnor ]; then
+	bootargs="$bootargs root=$rootpart_nor rootfstype=jffs2"
+else
+	bootargs="$bootargs root=/dev/nfs nfsroot=$eth0.serverip:$nfsroot,v3,tcp"
+fi
+
+bootargs="$bootargs mtdparts=physmap-flash.0:$nor_parts"
+
+if [ $kernel = net ]; then
+	if [ x$ip = xdhcp ]; then
+		dhcp
+	fi
+	tftp $uimage uImage || exit 1
+	bootm uImage
+elif [ $kernel = nor ]; then
+	bootm /dev/nor0.kernel
+else
+	bootm /dev/nand0.kernel.bb
+fi
+
diff --git a/arch/arm/boards/at91sam9261ek/env/bin/hush_hack b/arch/arm/boards/at91sam9261ek/env/bin/hush_hack
new file mode 100644
index 0000000..5fffa92
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/env/bin/hush_hack
@@ -0,0 +1 @@
+nand -a /dev/nand0.*
diff --git a/arch/arm/boards/at91sam9261ek/env/bin/init b/arch/arm/boards/at91sam9261ek/env/bin/init
new file mode 100644
index 0000000..eaa298d
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/env/bin/init
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+PATH=/env/bin
+export PATH
+
+. /env/config
+if [ -e /dev/nor0 ]; then
+	addpart /dev/nor0 $nor_parts
+fi
+
+if [ -e /dev/nand0 ]; then
+	addpart /dev/nand0 $nand_parts
+
+	# Uh, oh, hush first expands wildcards and then starts executing
+	# commands. What a bug!
+	source /env/bin/hush_hack 
+fi
+
+if [ -z $eth0.ethaddr ]; then
+	while [ -z $eth0.ethaddr ]; do
+		readline "no MAC address set for eth0. please enter the one found on your board: " eth0.ethaddr
+	done
+	echo -a /env/config "eth0.ethaddr=$eth0.ethaddr"
+fi
+
+echo
+echo -n "Hit any key to stop autoboot: "
+timeout -a $autoboot_timeout
+if [ $? != 0 ]; then
+	echo
+	echo "type update_kernel nor [<imagename>] to update kernel into flash"
+	echo "type update_root nor [<imagename>] to update rootfs into flash"
+	echo "type update_barebox_xmodem nor to update barebox into flash"
+	echo
+	exit
+fi
+
+boot
diff --git a/arch/arm/boards/at91sam9261ek/env/bin/update_barebox_xmodem b/arch/arm/boards/at91sam9261ek/env/bin/update_barebox_xmodem
new file mode 100644
index 0000000..39818b5
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/env/bin/update_barebox_xmodem
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+. /env/config
+
+if [ x$1 = xnand ]; then
+	part=/dev/nand0.barebox
+elif [ x$1 = xnor ]; then
+	part=/dev/nor0.barebox
+else
+	echo "usage: $0 nor|nand"
+	exit 1
+fi
+
+loadb -f barebox.bin -c
+
+unprotect $part
+echo
+echo "erasing partition $part"
+erase $part
+
+echo
+echo "flashing barebox.bin to $part"
+echo
+cp barebox.bin $part
+crc32 -f barebox.bin
+crc32 -f $part
diff --git a/arch/arm/boards/at91sam9261ek/env/bin/update_kernel b/arch/arm/boards/at91sam9261ek/env/bin/update_kernel
new file mode 100644
index 0000000..05c822d
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/env/bin/update_kernel
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+. /env/config
+
+image=$uimage
+if [ x$1 = xnand ]; then
+	part=/dev/nand0.kernel.bb
+elif [ x$1 = xnor ]; then
+	part=/dev/nor0.kernel
+else
+	echo "usage: $0 nor|nand [imagename]"
+	exit 1
+fi
+
+. /env/bin/_update $2
diff --git a/arch/arm/boards/at91sam9261ek/env/bin/update_root b/arch/arm/boards/at91sam9261ek/env/bin/update_root
new file mode 100644
index 0000000..a751372
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/env/bin/update_root
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+. /env/config
+
+image=$jffs2
+if [ x$1 = xnand ]; then
+	part=/dev/nand0.root.bb
+elif [ x$1 = xnor ]; then
+	part=/dev/nor0.root
+else
+	echo "usage: $0 nor|nand [imagename]"
+	exit 1
+fi
+
+. /env/bin/_update $2
+
diff --git a/arch/arm/boards/at91sam9261ek/env/config b/arch/arm/boards/at91sam9261ek/env/config
new file mode 100644
index 0000000..4b322ad
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/env/config
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+# can be either 'net', 'nor' or 'nand''
+kernel=net
+root=net
+
+uimage=uImage
+jffs2=root.jffs2
+
+autoboot_timeout=3
+
+nfsroot=""
+bootargs="console=ttyS0,115200"
+
+nor_parts="256k(barebox)ro,64k(bareboxenv),1536k(kernel),-(root)"
+rootpart_nor="/dev/mtdblock3"
+
+#nand_parts="256k(barebox)ro,64k(bareboxenv),1536k(kernel),-(root)"
+#rootpart_nand="/dev/mtdblock7"
+
+# use 'dhcp' to do dhcp in barebox and in kernel
+ip=dhcp
+
+# or set your networking parameters here
+#eth0.ipaddr=a.b.c.d
+#eth0.netmask=a.b.c.d
+#eth0.gateway=a.b.c.d
+#eth0.serverip=192.168.23.1
diff --git a/arch/arm/boards/at91sam9261ek/init.c b/arch/arm/boards/at91sam9261ek/init.c
new file mode 100644
index 0000000..e3c5494
--- /dev/null
+++ b/arch/arm/boards/at91sam9261ek/init.c
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2007 Sascha Hauer, Pengutronix
+ *
+ * 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 <init.h>
+#include <environment.h>
+#include <asm/armlinux.h>
+#include <asm/mach-types.h>
+#include <partition.h>
+#include <fs.h>
+#include <fcntl.h>
+#include <asm/io.h>
+#include <asm/hardware.h>
+#include <nand.h>
+#include <linux/mtd/nand.h>
+#include <mach/at91_pmc.h>
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/io.h>
+#include <mach/at91sam9_smc.h>
+#include <mach/sam9_smc.h>
+#include <dm9000.h>
+
+static struct atmel_nand_data nand_pdata = {
+	.ale		= 22,
+	.cle		= 21,
+/*	.det_pin	= ... not connected */
+	.rdy_pin	= AT91_PIN_PC15,
+	.enable_pin	= AT91_PIN_PC14,
+#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
+	.bus_width_16	= 1,
+#else
+	.bus_width_16	= 0,
+#endif
+};
+
+static struct sam9_smc_config ek_nand_smc_config = {
+	.ncs_read_setup		= 0,
+	.nrd_setup		= 1,
+	.ncs_write_setup	= 0,
+	.nwe_setup		= 1,
+
+	.ncs_read_pulse		= 3,
+	.nrd_pulse		= 3,
+	.ncs_write_pulse	= 3,
+	.nwe_pulse		= 3,
+
+	.read_cycle		= 5,
+	.write_cycle		= 5,
+
+	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
+	.tdf_cycles		= 2,
+};
+
+static void ek_add_device_nand(void)
+{
+	/* setup bus-width (8 or 16) */
+	if (nand_pdata.bus_width_16)
+		ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
+	else
+		ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
+
+	/* configure chip-select 3 (NAND) */
+	sam9_smc_configure(3, &ek_nand_smc_config);
+
+	at91_add_device_nand(&nand_pdata);
+}
+
+/*
+ * DM9000 ethernet device
+ */
+#if defined(CONFIG_DRIVER_NET_DM9000)
+static struct dm9000_platform_data dm9000_data = {
+	.iobase		= AT91_CHIPSELECT_2,
+	.iodata		= AT91_CHIPSELECT_2 + 4,
+	.buswidth	= DM9000_WIDTH_16,
+	.srom		= 0,
+};
+
+static struct device_d dm9000_dev = {
+	.name		= "dm9000",
+	.map_base	= AT91_CHIPSELECT_2,
+	.size		= 8,
+	.platform_data	= &dm9000_data,
+};
+
+/*
+ * SMC timings for the DM9000.
+ * Note: These timings were calculated for MASTER_CLOCK = 100000000 according to the DM9000 timings.
+ */
+static struct sam9_smc_config __initdata dm9000_smc_config = {
+	.ncs_read_setup		= 0,
+	.nrd_setup		= 2,
+	.ncs_write_setup	= 0,
+	.nwe_setup		= 2,
+
+	.ncs_read_pulse		= 8,
+	.nrd_pulse		= 4,
+	.ncs_write_pulse	= 8,
+	.nwe_pulse		= 4,
+
+	.read_cycle		= 16,
+	.write_cycle		= 16,
+
+	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE | AT91_SMC_DBW_16,
+	.tdf_cycles		= 1,
+};
+
+static void __init ek_add_device_dm9000(void)
+{
+	/* Configure chip-select 2 (DM9000) */
+	sam9_smc_configure(2, &dm9000_smc_config);
+
+	/* Configure Reset signal as output */
+	at91_set_gpio_output(AT91_PIN_PC10, 0);
+
+	/* Configure Interrupt pin as input, no pull-up */
+	at91_set_gpio_input(AT91_PIN_PC11, 0);
+
+	register_device(&dm9000_dev);
+}
+#else
+static void __init ek_add_device_dm9000(void) {}
+#endif /* CONFIG_DRIVER_NET_DM9000 */
+
+static int at91sam9261ek_devices_init(void)
+{
+
+	at91_add_device_sdram(64 * 1024 * 1024);
+	ek_add_device_nand();
+	ek_add_device_dm9000();
+
+	devfs_add_partition("nand0", 0x00000, 0x80000, PARTITION_FIXED, "self_raw");
+	dev_add_bb_dev("self_raw", "self0");
+	devfs_add_partition("nand0", 0x40000, 0x40000, PARTITION_FIXED, "env_raw");
+	dev_add_bb_dev("env_raw", "env0");
+
+	armlinux_set_bootparams((void *)(AT91_CHIPSELECT_1 + 0x100));
+	armlinux_set_architecture(MACH_TYPE_AT91SAM9261EK);
+
+	return 0;
+}
+
+device_initcall(at91sam9261ek_devices_init);
+
+static int at91sam9261ek_console_init(void)
+{
+	at91_register_uart(0, 0);
+	return 0;
+}
+
+console_initcall(at91sam9261ek_console_init);
diff --git a/arch/arm/configs/at91sam9261ek_defconfig b/arch/arm/configs/at91sam9261ek_defconfig
new file mode 100644
index 0000000..cb9ea75
--- /dev/null
+++ b/arch/arm/configs/at91sam9261ek_defconfig
@@ -0,0 +1,242 @@
+#
+# Automatically generated make config: don't edit
+# U-Boot version: 2.0.0-rc10
+# Wed Oct 21 16:33:44 2009
+#
+# CONFIG_BOARD_LINKER_SCRIPT is not set
+CONFIG_GENERIC_LINKER_SCRIPT=y
+CONFIG_ARM=y
+
+#
+# System Type
+#
+CONFIG_ARCH_AT91=y
+# CONFIG_ARCH_AT91RM9200 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_S3C24xx is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+
+#
+# processor features
+#
+CONFIG_ARCH_TEXT_BASE=0x23f00000
+CONFIG_BOARDINFO="Atmel at91sam9261-ek"
+
+#
+# Atmel AT91 System-on-Chip
+#
+# CONFIG_ARCH_AT91SAM9260 is not set
+CONFIG_ARCH_AT91SAM9261=y
+# CONFIG_ARCH_AT91SAM9263 is not set
+CONFIG_MACH_AT91SAM9261EK=y
+# CONFIG_AEABI is not set
+
+#
+# Arm specific settings         
+#
+CONFIG_CMD_ARM_CPUINFO=y
+CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
+CONFIG_GREGORIAN_CALENDER=y
+CONFIG_HAS_KALLSYMS=y
+CONFIG_HAS_MODULES=y
+CONFIG_CMD_MEMORY=y
+CONFIG_ENV_HANDLING=y
+CONFIG_GENERIC_GPIO=y
+
+#
+# General Settings              
+#
+CONFIG_LOCALVERSION_AUTO=y
+
+#
+# memory layout                 
+#
+CONFIG_HAVE_CONFIGURABLE_TEXT_BASE=y
+CONFIG_TEXT_BASE=0x23f00000
+CONFIG_HAVE_CONFIGURABLE_MEMORY_LAYOUT=y
+CONFIG_MEMORY_LAYOUT_DEFAULT=y
+# CONFIG_MEMORY_LAYOUT_FIXED is not set
+CONFIG_STACK_SIZE=0x8000
+CONFIG_MALLOC_SIZE=0x400000
+# CONFIG_BROKEN is not set
+# CONFIG_EXPERIMENTAL is not set
+CONFIG_MACH_HAS_LOWLEVEL_INIT=y
+CONFIG_MACH_DO_LOWLEVEL_INIT=y
+CONFIG_PROMPT="9261-EK:"
+CONFIG_BAUDRATE=115200
+CONFIG_LONGHELP=y
+CONFIG_CBSIZE=1024
+CONFIG_MAXARGS=16
+CONFIG_SHELL_HUSH=y
+# CONFIG_SHELL_SIMPLE is not set
+CONFIG_GLOB=y
+CONFIG_PROMPT_HUSH_PS2="> "
+# CONFIG_HUSH_FANCY_PROMPT is not set
+CONFIG_CMDLINE_EDITING=y
+CONFIG_AUTO_COMPLETE=y
+CONFIG_DYNAMIC_CRC_TABLE=y
+CONFIG_ERRNO_MESSAGES=y
+CONFIG_TIMESTAMP=y
+CONFIG_CONSOLE_FULL=y
+CONFIG_CONSOLE_ACTIVATE_FIRST=y
+# CONFIG_OF_FLAT_TREE is not set
+CONFIG_PARTITION=y
+CONFIG_DEFAULT_ENVIRONMENT=y
+CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/at91sam9261ek/env"
+
+#
+# Debugging                     
+#
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_ENABLE_FLASH_NOISE is not set
+# CONFIG_ENABLE_PARTITION_NOISE is not set
+# CONFIG_ENABLE_DEVICE_NOISE is not set
+
+#
+# Commands                      
+#
+
+#
+# scripting                     
+#
+CONFIG_CMD_EDIT=y
+CONFIG_CMD_SLEEP=y
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_LOADENV=y
+CONFIG_CMD_EXPORT=y
+CONFIG_CMD_PRINTENV=y
+CONFIG_CMD_READLINE=y
+CONFIG_CMD_TRUE=y
+CONFIG_CMD_FALSE=y
+
+#
+# file commands                 
+#
+CONFIG_CMD_LS=y
+CONFIG_CMD_RM=y
+CONFIG_CMD_CAT=y
+CONFIG_CMD_MKDIR=y
+CONFIG_CMD_RMDIR=y
+CONFIG_CMD_CP=y
+CONFIG_CMD_PWD=y
+CONFIG_CMD_CD=y
+CONFIG_CMD_MOUNT=y
+CONFIG_CMD_UMOUNT=y
+
+#
+# console                       
+#
+CONFIG_CMD_CLEAR=y
+CONFIG_CMD_ECHO=y
+# CONFIG_CMD_ECHO_E is not set
+
+#
+# memory                        
+#
+# CONFIG_CMD_LOADB is not set
+CONFIG_CMD_MEMINFO=y
+CONFIG_CMD_CRC=y
+CONFIG_CMD_MTEST=y
+# CONFIG_CMD_MTEST_ALTERNATIVE is not set
+
+#
+# flash                         
+#
+CONFIG_CMD_FLASH=y
+CONFIG_CMD_UBI=y
+
+#
+# booting                       
+#
+CONFIG_CMD_BOOTM=y
+CONFIG_CMD_BOOTM_ZLIB=y
+CONFIG_CMD_BOOTM_BZLIB=y
+CONFIG_CMD_BOOTM_SHOW_TYPE=y
+CONFIG_CMD_BOOTZ=y
+CONFIG_CMD_BOOTU=y
+# CONFIG_CMD_LINUX16 is not set
+CONFIG_CMD_RESET=y
+CONFIG_CMD_GO=y
+CONFIG_CMD_TIMEOUT=y
+CONFIG_CMD_PARTITION=y
+CONFIG_CMD_TEST=y
+CONFIG_CMD_VERSION=y
+CONFIG_CMD_HELP=y
+CONFIG_CMD_DEVINFO=y
+CONFIG_CMD_GPIO=y
+CONFIG_CMD_UNLZO=y
+CONFIG_NET=y
+CONFIG_NET_DHCP=y
+CONFIG_NET_NFS=y
+CONFIG_NET_PING=y
+CONFIG_NET_TFTP=y
+# CONFIG_NET_TFTP_PUSH is not set
+# CONFIG_NET_NETCONSOLE is not set
+# CONFIG_NET_RESOLV is not set
+
+#
+# Drivers                       
+#
+
+#
+# serial drivers                
+#
+# CONFIG_DRIVER_SERIAL_ARM_DCC is not set
+# CONFIG_DRIVER_SERIAL_NS16550 is not set
+CONFIG_DRIVER_SERIAL_ATMEL=y
+CONFIG_HAS_DM9000=y
+CONFIG_MIIPHY=y
+
+#
+# Network drivers               
+#
+# CONFIG_DRIVER_NET_SMC911X is not set
+# CONFIG_DRIVER_NET_SMC91111 is not set
+CONFIG_DRIVER_NET_DM9000=y
+# CONFIG_DRIVER_NET_MACB is not set
+
+#
+# SPI drivers                   
+#
+# CONFIG_SPI is not set
+# CONFIG_I2C is not set
+
+#
+# flash drivers                 
+#
+# CONFIG_DRIVER_CFI is not set
+CONFIG_MTD=y
+CONFIG_NAND=y
+CONFIG_NAND_ATMEL=y
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=y
+CONFIG_UBI=y
+# CONFIG_ATA is not set
+# CONFIG_USB is not set
+# CONFIG_USB_GADGET is not set
+# CONFIG_VIDEO is not set
+
+#
+# Filesystem support            
+#
+# CONFIG_FS_CRAMFS is not set
+CONFIG_FS_RAMFS=y
+CONFIG_FS_DEVFS=y
+CONFIG_PARTITION_NEED_MTD=y
+CONFIG_ZLIB=y
+CONFIG_BZLIB=y
+CONFIG_CRC32=y
+# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+# CONFIG_PROCESS_ESCAPE_SEQUENCE is not set
+CONFIG_LZO_DECOMPRESS=y
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 923ce0b..debc7dc 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -6,6 +6,7 @@ config ARCH_TEXT_BASE
 
 config BOARDINFO
 	default "Atmel 91SAM9260-EK" if MACH_AT91SAM9260EK
+	default "Atmel at91sam9261-ek" if MACH_AT91SAM9261EK
 	default "Atmel at91sam9263-ek" if MACH_AT91SAM9263EK
 	default "Bucyrus MMC-CPU" if MACH_MMCCPU
 	default "Ronetix PM9263" if MACH_PM9263
@@ -19,6 +20,10 @@ config ARCH_AT91SAM9260
 	bool "AT91SAM9260"
 	select CPU_ARM926T
 
+config ARCH_AT91SAM9261
+	bool "AT91SAM9261"
+	select CPU_ARM926T
+
 config ARCH_AT91SAM9263
 	bool "AT91SAM9263"
 	select CPU_ARM926T
@@ -45,6 +50,24 @@ endif
 
 # ----------------------------------------------------------
 
+if ARCH_AT91SAM9261
+
+choice
+	prompt "AT91SAM9261 Board Type"
+
+config MACH_AT91SAM9261EK
+	bool "Atmel AT91SAM9261-EK Evaluation Kit"
+	select HAS_DM9000
+	help
+	  Select this if you are using Atmel's AT91SAM9261-EK Evaluation Kit.
+	  <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820>
+
+endchoice
+
+endif
+
+# ----------------------------------------------------------
+
 if ARCH_AT91SAM9263
 
 choice
diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index 0f55883..65a2657 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -4,4 +4,5 @@ obj-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel_init.o
 
 # CPU-specific support
 obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam9260_devices.o sam9_smc.o
+obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam9261_devices.o sam9_smc.o
 obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam9263_devices.o sam9_smc.o
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c
new file mode 100644
index 0000000..3d503aa
--- /dev/null
+++ b/arch/arm/mach-at91/at91sam9261.c
@@ -0,0 +1,230 @@
+#include <common.h>
+#include <gpio.h>
+#include <init.h>
+#include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+
+#include "generic.h"
+#include "clock.h"
+
+/* --------------------------------------------------------------------
+ *  Clocks
+ * -------------------------------------------------------------------- */
+
+/*
+ * The peripheral clocks.
+ */
+static struct clk pioA_clk = {
+	.name		= "pioA_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_PIOA,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioB_clk = {
+	.name		= "pioB_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_PIOB,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioC_clk = {
+	.name		= "pioC_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_PIOC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart0_clk = {
+	.name		= "usart0_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_US0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart1_clk = {
+	.name		= "usart1_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_US1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart2_clk = {
+	.name		= "usart2_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_US2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc_clk = {
+	.name		= "mci_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_MCI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk udc_clk = {
+	.name		= "udc_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_UDP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk twi_clk = {
+	.name		= "twi_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_TWI,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi0_clk = {
+	.name		= "spi0_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_SPI0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi1_clk = {
+	.name		= "spi1_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_SPI1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc0_clk = {
+	.name		= "ssc0_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_SSC0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc1_clk = {
+	.name		= "ssc1_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_SSC1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc2_clk = {
+	.name		= "ssc2_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_SSC2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc0_clk = {
+	.name		= "tc0_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_TC0,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc1_clk = {
+	.name		= "tc1_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_TC1,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk tc2_clk = {
+	.name		= "tc2_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_TC2,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk ohci_clk = {
+	.name		= "ohci_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_UHP,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+static struct clk lcdc_clk = {
+	.name		= "lcdc_clk",
+	.pmc_mask	= 1 << AT91SAM9261_ID_LCDC,
+	.type		= CLK_TYPE_PERIPHERAL,
+};
+
+static struct clk *periph_clocks[] = {
+	&pioA_clk,
+	&pioB_clk,
+	&pioC_clk,
+	&usart0_clk,
+	&usart1_clk,
+	&usart2_clk,
+	&mmc_clk,
+	&udc_clk,
+	&twi_clk,
+	&spi0_clk,
+	&spi1_clk,
+	&ssc0_clk,
+	&ssc1_clk,
+	&ssc2_clk,
+	&tc0_clk,
+	&tc1_clk,
+	&tc2_clk,
+	&ohci_clk,
+	&lcdc_clk,
+	// irq0 .. irq2
+};
+
+/*
+ * The four programmable clocks.
+ * You must configure pin multiplexing to bring these signals out.
+ */
+static struct clk pck0 = {
+	.name		= "pck0",
+	.pmc_mask	= AT91_PMC_PCK0,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 0,
+};
+static struct clk pck1 = {
+	.name		= "pck1",
+	.pmc_mask	= AT91_PMC_PCK1,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 1,
+};
+static struct clk pck2 = {
+	.name		= "pck2",
+	.pmc_mask	= AT91_PMC_PCK2,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 2,
+};
+static struct clk pck3 = {
+	.name		= "pck3",
+	.pmc_mask	= AT91_PMC_PCK3,
+	.type		= CLK_TYPE_PROGRAMMABLE,
+	.id		= 3,
+};
+
+/* HClocks */
+static struct clk hck0 = {
+	.name		= "hck0",
+	.pmc_mask	= AT91_PMC_HCK0,
+	.type		= CLK_TYPE_SYSTEM,
+	.id		= 0,
+};
+static struct clk hck1 = {
+	.name		= "hck1",
+	.pmc_mask	= AT91_PMC_HCK1,
+	.type		= CLK_TYPE_SYSTEM,
+	.id		= 1,
+};
+
+static void at91sam9261_register_clocks(void)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
+		clk_register(periph_clocks[i]);
+
+	clk_register(&pck0);
+	clk_register(&pck1);
+	clk_register(&pck2);
+	clk_register(&pck3);
+
+	clk_register(&hck0);
+	clk_register(&hck1);
+}
+
+
+/* --------------------------------------------------------------------
+ *  GPIO
+ * -------------------------------------------------------------------- */
+
+static struct at91_gpio_bank at91sam9261_gpio[] = {
+	{
+		.id		= AT91SAM9261_ID_PIOA,
+		.offset		= AT91_PIOA,
+		.clock		= &pioA_clk,
+	}, {
+		.id		= AT91SAM9261_ID_PIOB,
+		.offset		= AT91_PIOB,
+		.clock		= &pioB_clk,
+	}, {
+		.id		= AT91SAM9261_ID_PIOC,
+		.offset		= AT91_PIOC,
+		.clock		= &pioC_clk,
+	}
+};
+
+
+static int at91sam9261_initialize(void)
+{
+	/* Init clock subsystem */
+	at91_clock_init(AT91_MAIN_CLOCK);
+
+	/* Register the processor-specific clocks */
+	at91sam9261_register_clocks();
+
+	/* Register GPIO subsystem */
+	at91_gpio_init(at91sam9261_gpio, 3);
+	return 0;
+}
+
+core_initcall(at91sam9261_initialize);
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c
new file mode 100644
index 0000000..6725e97
--- /dev/null
+++ b/arch/arm/mach-at91/at91sam9261_devices.c
@@ -0,0 +1,169 @@
+/*
+ * arch/arm/mach-at91/at91sam9261_devices.c
+ *
+ *  Copyright (C) 2006 Atmel
+ *
+ * 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 <asm/armlinux.h>
+#include <asm/hardware.h>
+#include <mach/at91_pmc.h>
+#include <mach/at91sam9261_matrix.h>
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/io.h>
+
+#include "generic.h"
+
+static struct memory_platform_data ram_pdata = {
+	.name = "ram0",
+	.flags = DEVFS_RDWR,
+};
+
+static struct device_d sdram_dev = {
+	.name     = "mem",
+	.map_base = AT91_CHIPSELECT_1,
+	.platform_data = &ram_pdata,
+};
+
+void at91_add_device_sdram(u32 size)
+{
+	sdram_dev.size = size;
+	register_device(&sdram_dev);
+	armlinux_add_dram(&sdram_dev);
+}
+
+#if defined(CONFIG_NAND_ATMEL)
+static struct device_d nand_dev = {
+	.name     = "atmel_nand",
+	.map_base = AT91_CHIPSELECT_3,
+	.size     = 0x10,
+};
+
+void at91_add_device_nand(struct atmel_nand_data *data)
+{
+	unsigned long csa;
+
+	if (!data)
+		return;
+
+	csa = at91_sys_read(AT91_MATRIX_EBICSA);
+	at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);
+
+	/* enable pin */
+	if (data->enable_pin)
+		at91_set_gpio_output(data->enable_pin, 1);
+
+	/* ready/busy pin */
+	if (data->rdy_pin)
+		at91_set_gpio_input(data->rdy_pin, 1);
+
+	/* card detect pin */
+	if (data->det_pin)
+		at91_set_gpio_input(data->det_pin, 1);
+
+	at91_set_A_periph(AT91_PIN_PC0, 0);		/* NANDOE */
+	at91_set_A_periph(AT91_PIN_PC1, 0);		/* NANDWE */
+
+	nand_dev.platform_data = data;
+	register_device(&nand_dev);
+}
+#else
+void at91_add_device_nand(struct atmel_nand_data *data) {}
+#endif
+
+static struct device_d dbgu_serial_device = {
+	.name     = "atmel_serial",
+	.map_base = (AT91_BASE_SYS + AT91_DBGU),
+	.size     = 4096,
+};
+
+static inline void configure_dbgu_pins(void)
+{
+	at91_set_A_periph(AT91_PIN_PA9, 0);		/* DRXD */
+	at91_set_A_periph(AT91_PIN_PA10, 1);		/* DTXD */
+}
+
+static struct device_d uart0_serial_device = {
+	.name     = "atmel_serial",
+	.map_base = AT91SAM9261_BASE_US0,
+	.size     = 4096,
+};
+
+static inline void configure_usart0_pins(unsigned pins)
+{
+	at91_set_A_periph(AT91_PIN_PC8, 1);		/* TXD0 */
+	at91_set_A_periph(AT91_PIN_PC9, 0);		/* RXD0 */
+
+	if (pins & ATMEL_UART_RTS)
+		at91_set_A_periph(AT91_PIN_PC10, 0);	/* RTS0 */
+	if (pins & ATMEL_UART_CTS)
+		at91_set_A_periph(AT91_PIN_PC11, 0);	/* CTS0 */
+}
+
+static struct device_d uart1_serial_device = {
+	.name     = "atmel_serial",
+	.map_base = AT91SAM9261_BASE_US1,
+	.size     = 4096,
+};
+
+static inline void configure_usart1_pins(unsigned pins)
+{
+	at91_set_A_periph(AT91_PIN_PC12, 1);		/* TXD1 */
+	at91_set_A_periph(AT91_PIN_PC13, 0);		/* RXD1 */
+
+	if (pins & ATMEL_UART_RTS)
+		at91_set_B_periph(AT91_PIN_PA12, 0);	/* RTS1 */
+	if (pins & ATMEL_UART_CTS)
+		at91_set_B_periph(AT91_PIN_PA13, 0);	/* CTS1 */
+}
+
+static struct device_d uart2_serial_device = {
+	.name     = "atmel_serial",
+	.map_base = AT91SAM9261_BASE_US2,
+	.size     = 4096,
+};
+
+static inline void configure_usart2_pins(unsigned pins)
+{
+	at91_set_A_periph(AT91_PIN_PC15, 0);		/* RXD2 */
+	at91_set_A_periph(AT91_PIN_PC14, 1);		/* TXD2 */
+
+	if (pins & ATMEL_UART_RTS)
+		at91_set_B_periph(AT91_PIN_PA15, 0);	/* RTS2*/
+	if (pins & ATMEL_UART_CTS)
+		at91_set_B_periph(AT91_PIN_PA16, 0);	/* CTS2 */
+}
+
+void at91_register_uart(unsigned id, unsigned pins)
+{
+	switch (id) {
+		case 0:		/* DBGU */
+			configure_dbgu_pins();
+			at91_clock_associate("mck", &dbgu_serial_device, "usart");
+			register_device(&dbgu_serial_device);
+			break;
+		case AT91SAM9261_ID_US0:
+			configure_usart0_pins(pins);
+			at91_clock_associate("usart0_clk", &uart0_serial_device, "usart");
+			register_device(&uart0_serial_device);
+			break;
+		case AT91SAM9261_ID_US1:
+			configure_usart1_pins(pins);
+			at91_clock_associate("usart1_clk", &uart1_serial_device, "usart");
+			register_device(&uart1_serial_device);
+			break;
+		case AT91SAM9261_ID_US2:
+			configure_usart2_pins(pins);
+			at91_clock_associate("usart2_clk", &uart2_serial_device, "usart");
+			register_device(&uart2_serial_device);
+			break;
+		default:
+			return;
+	}
+}
diff --git a/arch/arm/mach-at91/include/mach/at91sam9261.h b/arch/arm/mach-at91/include/mach/at91sam9261.h
new file mode 100644
index 0000000..b303e07
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/at91sam9261.h
@@ -0,0 +1,109 @@
+/*
+ * [origin: Linux kernel include/asm-arm/arch-at91/at91sam9261.h]
+ *
+ * Copyright (C) SAN People
+ *
+ * Common definitions.
+ * Based on AT91SAM9261 datasheet revision E. (Preliminary)
+ *
+ * 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 AT91SAM9261_H
+#define AT91SAM9261_H
+
+/*
+ * Peripheral identifiers/interrupts.
+ */
+#define AT91_ID_FIQ		0	/* Advanced Interrupt Controller (FIQ) */
+#define AT91_ID_SYS		1	/* System Peripherals */
+#define AT91SAM9261_ID_PIOA	2	/* Parallel IO Controller A */
+#define AT91SAM9261_ID_PIOB	3	/* Parallel IO Controller B */
+#define AT91SAM9261_ID_PIOC	4	/* Parallel IO Controller C */
+#define AT91SAM9261_ID_US0	6	/* USART 0 */
+#define AT91SAM9261_ID_US1	7	/* USART 1 */
+#define AT91SAM9261_ID_US2	8	/* USART 2 */
+#define AT91SAM9261_ID_MCI	9	/* Multimedia Card Interface */
+#define AT91SAM9261_ID_UDP	10	/* USB Device Port */
+#define AT91SAM9261_ID_TWI	11	/* Two-Wire Interface */
+#define AT91SAM9261_ID_SPI0	12	/* Serial Peripheral Interface 0 */
+#define AT91SAM9261_ID_SPI1	13	/* Serial Peripheral Interface 1 */
+#define AT91SAM9261_ID_SSC0	14	/* Serial Synchronous Controller 0 */
+#define AT91SAM9261_ID_SSC1	15	/* Serial Synchronous Controller 1 */
+#define AT91SAM9261_ID_SSC2	16	/* Serial Synchronous Controller 2 */
+#define AT91SAM9261_ID_TC0	17	/* Timer Counter 0 */
+#define AT91SAM9261_ID_TC1	18	/* Timer Counter 1 */
+#define AT91SAM9261_ID_TC2	19	/* Timer Counter 2 */
+#define AT91SAM9261_ID_UHP	20	/* USB Host port */
+#define AT91SAM9261_ID_LCDC	21	/* LDC Controller */
+#define AT91SAM9261_ID_IRQ0	29	/* Advanced Interrupt Controller (IRQ0) */
+#define AT91SAM9261_ID_IRQ1	30	/* Advanced Interrupt Controller (IRQ1) */
+#define AT91SAM9261_ID_IRQ2	31	/* Advanced Interrupt Controller (IRQ2) */
+
+
+/*
+ * User Peripheral physical base addresses.
+ */
+#define AT91SAM9261_BASE_TCB0		0xfffa0000
+#define AT91SAM9261_BASE_TC0		0xfffa0000
+#define AT91SAM9261_BASE_TC1		0xfffa0040
+#define AT91SAM9261_BASE_TC2		0xfffa0080
+#define AT91SAM9261_BASE_UDP		0xfffa4000
+#define AT91SAM9261_BASE_MCI		0xfffa8000
+#define AT91SAM9261_BASE_TWI		0xfffac000
+#define AT91SAM9261_BASE_US0		0xfffb0000
+#define AT91SAM9261_BASE_US1		0xfffb4000
+#define AT91SAM9261_BASE_US2		0xfffb8000
+#define AT91SAM9261_BASE_SSC0		0xfffbc000
+#define AT91SAM9261_BASE_SSC1		0xfffc0000
+#define AT91SAM9261_BASE_SSC2		0xfffc4000
+#define AT91SAM9261_BASE_SPI0		0xfffc8000
+#define AT91SAM9261_BASE_SPI1		0xfffcc000
+#define AT91_BASE_SYS			0xffffea00
+
+
+/*
+ * System Peripherals (offset from AT91_BASE_SYS)
+ */
+#define AT91_SDRAMC	(0xffffea00 - AT91_BASE_SYS)
+#define AT91_SMC	(0xffffec00 - AT91_BASE_SYS)
+#define AT91_MATRIX	(0xffffee00 - AT91_BASE_SYS)
+#define AT91_AIC	(0xfffff000 - AT91_BASE_SYS)
+#define AT91_DBGU	(0xfffff200 - AT91_BASE_SYS)
+#define AT91_PIOA	(0xfffff400 - AT91_BASE_SYS)
+#define AT91_PIOB	(0xfffff600 - AT91_BASE_SYS)
+#define AT91_PIOC	(0xfffff800 - AT91_BASE_SYS)
+#define AT91_PMC	(0xfffffc00 - AT91_BASE_SYS)
+#define AT91_RSTC	(0xfffffd00 - AT91_BASE_SYS)
+#define AT91_SHDWC	(0xfffffd10 - AT91_BASE_SYS)
+#define AT91_RTT	(0xfffffd20 - AT91_BASE_SYS)
+#define AT91_PIT	(0xfffffd30 - AT91_BASE_SYS)
+#define AT91_WDT	(0xfffffd40 - AT91_BASE_SYS)
+#define AT91_GPBR	(0xfffffd50 - AT91_BASE_SYS)
+
+#define AT91_USART0	AT91SAM9261_BASE_US0
+#define AT91_USART1	AT91SAM9261_BASE_US1
+#define AT91_USART2	AT91SAM9261_BASE_US2
+
+
+/*
+ * Internal Memory.
+ */
+#define AT91SAM9261_SRAM_BASE	0x00300000	/* Internal SRAM base address */
+#define AT91SAM9261_SRAM_SIZE	0x00028000	/* Internal SRAM size (160Kb) */
+
+#define AT91SAM9261_ROM_BASE	0x00400000	/* Internal ROM base address */
+#define AT91SAM9261_ROM_SIZE	SZ_32K		/* Internal ROM size (32Kb) */
+
+#define AT91SAM9261_UHP_BASE	0x00500000	/* USB Host controller */
+#define AT91SAM9261_LCDC_BASE	0x00600000	/* LDC controller */
+
+/*
+ * Cpu Name
+ */
+#define AT91_CPU_NAME	"AT91SAM9261"
+
+#endif
diff --git a/arch/arm/mach-at91/include/mach/at91sam9261_matrix.h b/arch/arm/mach-at91/include/mach/at91sam9261_matrix.h
new file mode 100644
index 0000000..7de0157
--- /dev/null
+++ b/arch/arm/mach-at91/include/mach/at91sam9261_matrix.h
@@ -0,0 +1,64 @@
+/*
+ * [origin: Linux kernel include/asm-arm/arch-at91/at91sam9261_matrix.h]
+ *
+ *  Copyright (C) 2007 Atmel Corporation.
+ *
+ * Memory Controllers (MATRIX, EBI) - System peripherals registers.
+ * Based on AT91SAM9261 datasheet revision D.
+ *
+ * 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 AT91SAM9261_MATRIX_H
+#define AT91SAM9261_MATRIX_H
+
+#define AT91_MATRIX_MCFG	(AT91_MATRIX + 0x00)	/* Master Configuration Register */
+#define		AT91_MATRIX_RCB0	(1 << 0)		/* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */
+#define		AT91_MATRIX_RCB1	(1 << 1)		/* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */
+
+#define AT91_MATRIX_SCFG0	(AT91_MATRIX + 0x04)	/* Slave Configuration Register 0 */
+#define AT91_MATRIX_SCFG1	(AT91_MATRIX + 0x08)	/* Slave Configuration Register 1 */
+#define AT91_MATRIX_SCFG2	(AT91_MATRIX + 0x0C)	/* Slave Configuration Register 2 */
+#define AT91_MATRIX_SCFG3	(AT91_MATRIX + 0x10)	/* Slave Configuration Register 3 */
+#define AT91_MATRIX_SCFG4	(AT91_MATRIX + 0x14)	/* Slave Configuration Register 4 */
+#define		AT91_MATRIX_SLOT_CYCLE		(0xff << 0)	/* Maximum Number of Allowed Cycles for a Burst */
+#define		AT91_MATRIX_DEFMSTR_TYPE	(3    << 16)	/* Default Master Type */
+#define			AT91_MATRIX_DEFMSTR_TYPE_NONE	(0 << 16)
+#define			AT91_MATRIX_DEFMSTR_TYPE_LAST	(1 << 16)
+#define			AT91_MATRIX_DEFMSTR_TYPE_FIXED	(2 << 16)
+#define		AT91_MATRIX_FIXED_DEFMSTR	(7    << 18)	/* Fixed Index of Default Master */
+
+#define AT91_MATRIX_TCR		(AT91_MATRIX + 0x24)	/* TCM Configuration Register */
+#define		AT91_MATRIX_ITCM_SIZE		(0xf << 0)	/* Size of ITCM enabled memory block */
+#define			AT91_MATRIX_ITCM_0		(0 << 0)
+#define			AT91_MATRIX_ITCM_16		(5 << 0)
+#define			AT91_MATRIX_ITCM_32		(6 << 0)
+#define			AT91_MATRIX_ITCM_64		(7 << 0)
+#define		AT91_MATRIX_DTCM_SIZE		(0xf << 4)	/* Size of DTCM enabled memory block */
+#define			AT91_MATRIX_DTCM_0		(0 << 4)
+#define			AT91_MATRIX_DTCM_16		(5 << 4)
+#define			AT91_MATRIX_DTCM_32		(6 << 4)
+#define			AT91_MATRIX_DTCM_64		(7 << 4)
+
+#define AT91_MATRIX_EBICSA	(AT91_MATRIX + 0x30)	/* EBI Chip Select Assignment Register */
+#define		AT91_MATRIX_CS1A		(1 << 1)	/* Chip Select 1 Assignment */
+#define			AT91_MATRIX_CS1A_SMC		(0 << 1)
+#define			AT91_MATRIX_CS1A_SDRAMC		(1 << 1)
+#define		AT91_MATRIX_CS3A		(1 << 3)	/* Chip Select 3 Assignment */
+#define			AT91_MATRIX_CS3A_SMC		(0 << 3)
+#define			AT91_MATRIX_CS3A_SMC_SMARTMEDIA	(1 << 3)
+#define		AT91_MATRIX_CS4A		(1 << 4)	/* Chip Select 4 Assignment */
+#define			AT91_MATRIX_CS4A_SMC		(0 << 4)
+#define			AT91_MATRIX_CS4A_SMC_CF1	(1 << 4)
+#define		AT91_MATRIX_CS5A		(1 << 5)	/* Chip Select 5 Assignment */
+#define			AT91_MATRIX_CS5A_SMC		(0 << 5)
+#define			AT91_MATRIX_CS5A_SMC_CF2	(1 << 5)
+#define		AT91_MATRIX_DBPUC		(1 << 8)	/* Data Bus Pull-up Configuration */
+
+#define AT91_MATRIX_USBPUCR	(AT91_MATRIX + 0x34)	/* USB Pad Pull-Up Control Register */
+#define		AT91_MATRIX_USBPUCR_PUON	(1 << 30)	/* USB Device PAD Pull-up Enable */
+
+#endif
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug 18 22:48:30 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 04:48:30 +0200
Subject: [PATCH 6/6] at91: remove non used and obsolete at91rm9200 code
In-Reply-To: <20100819024811.GG454@game.jcrosoft.org>
References: <20100819024811.GG454@game.jcrosoft.org>
Message-ID: <1282186110-32738-6-git-send-email-plagnioj@jcrosoft.com>

this will be re-add as mach-at91
for now on keep the net driver which will be updated to new API

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/Kconfig                                   |    5 -
 arch/arm/Makefile                                  |    1 -
 arch/arm/mach-at91rm9200/Kconfig                   |   16 -
 arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h |  762 --------------------
 arch/arm/mach-at91rm9200/include/mach/hardware.h   |   78 --
 5 files changed, 0 insertions(+), 862 deletions(-)
 delete mode 100644 arch/arm/mach-at91rm9200/Kconfig
 delete mode 100644 arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h
 delete mode 100644 arch/arm/mach-at91rm9200/include/mach/hardware.h

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 82dbfda..945528c 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -30,10 +30,6 @@ config ARCH_AT91
 	bool "Atmel AT91"
 	select GENERIC_GPIO
 
-config ARCH_AT91RM9200
-	bool "Atmel AT91RM9200"
-	select CPU_ARM920T
-
 config ARCH_EP93XX
 	bool "Cirrus Logic EP93xx"
 	select CPU_ARM920T
@@ -65,7 +61,6 @@ endchoice
 source arch/arm/common/Kconfig
 source arch/arm/cpu/Kconfig
 source arch/arm/mach-at91/Kconfig
-source arch/arm/mach-at91rm9200/Kconfig
 source arch/arm/mach-ep93xx/Kconfig
 source arch/arm/mach-imx/Kconfig
 source arch/arm/mach-netx/Kconfig
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index c1e488c..2d03ac9 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -39,7 +39,6 @@ CPPFLAGS += $(CFLAGS_ABI) $(arch-y) $(tune-y)
 # Machine directory name.  This list is sorted alphanumerically
 # by CONFIG_* macro name.
 machine-$(CONFIG_ARCH_AT91)		:= at91
-machine-$(CONFIG_ARCH_AT91RM9200)	:= at91rm9200
 machine-$(CONFIG_ARCH_EP93XX)		:= ep93xx
 machine-$(CONFIG_ARCH_IMX)		:= imx
 machine-$(CONFIG_ARCH_NOMADIK)		:= nomadik
diff --git a/arch/arm/mach-at91rm9200/Kconfig b/arch/arm/mach-at91rm9200/Kconfig
deleted file mode 100644
index c062097..0000000
--- a/arch/arm/mach-at91rm9200/Kconfig
+++ /dev/null
@@ -1,16 +0,0 @@
-if ARCH_AT91RM9200
-
-config ARCH_TEXT_BASE
-	hex
-
-config BOARDINFO
-
-comment "Atmel AT91RM9200 System-on-Chip"
-
-choice
-
-	prompt "AT91RM9200 Board Type"
-
-endchoice
-
-endif
diff --git a/arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h b/arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h
deleted file mode 100644
index 97d4704..0000000
--- a/arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h
+++ /dev/null
@@ -1,762 +0,0 @@
-/*
- * (C) Copyright 2003
- * AT91RM9200 definitions
- * Author : ATMEL AT91 application group
- *
- * 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 AT91RM9200_H
-#define AT91RM9200_H
-
-typedef volatile unsigned int AT91_REG;		/* Hardware register definition */
-
-/******************************************************************************/
-/*        SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface        */
-/******************************************************************************/
-typedef struct _AT91S_TC
-{
-	AT91_REG	 TC_CCR; 	/* Channel Control Register */
-	AT91_REG	 TC_CMR; 	/* Channel Mode Register */
-	AT91_REG	 Reserved0[2]; 	/*  */
-	AT91_REG	 TC_CV; 	/* Counter Value */
-	AT91_REG	 TC_RA; 	/* Register A */
-	AT91_REG	 TC_RB; 	/* Register B */
-	AT91_REG	 TC_RC; 	/* Register C */
-	AT91_REG	 TC_SR; 	/* Status Register */
-	AT91_REG	 TC_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 TC_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 TC_IMR; 	/* Interrupt Mask Register */
-} AT91S_TC, *AT91PS_TC;
-
-#define AT91C_TC_TIMER_DIV1_CLOCK	((unsigned int) 0x0 <<  0) /* (TC) MCK/2 */
-#define AT91C_TC_TIMER_DIV2_CLOCK	((unsigned int) 0x1 <<  0) /* (TC) MCK/8 */
-#define AT91C_TC_TIMER_DIV3_CLOCK	((unsigned int) 0x2 <<  0) /* (TC) MCK/32 */
-#define AT91C_TC_TIMER_DIV4_CLOCK	((unsigned int) 0x3 <<  0) /* (TC) MCK/128 */
-#define AT91C_TC_SLOW_CLOCK		((unsigned int) 0x4 <<  0) /* (TC) SLOW CLK */
-#define AT91C_TC_XC0_CLOCK		((unsigned int) 0x5 <<  0) /* (TC) XC0 */
-#define AT91C_TC_XC1_CLOCK		((unsigned int) 0x6 <<  0) /* (TC) XC1 */
-#define AT91C_TC_XC2_CLOCK		((unsigned int) 0x7 <<  0) /* (TC) XC2 */
-#define AT91C_TCB_TC0XC0S_NONE		((unsigned int) 0x1)       /* (TCB) None signal connected to XC0 */
-#define AT91C_TCB_TC1XC1S_NONE		((unsigned int) 0x1 <<  2) /* (TCB) None signal connected to XC1 */
-#define AT91C_TCB_TC2XC2S_NONE		((unsigned int) 0x1 <<  4) /* (TCB) None signal connected to XC2 */
-#define AT91C_TC_CLKDIS			((unsigned int) 0x1 <<  1) /* (TC) Counter Clock Disable Command */
-#define AT91C_TC_SWTRG			((unsigned int) 0x1 <<  2) /* (TC) Software Trigger Command */
-#define AT91C_TC_CLKEN			((unsigned int) 0x1 <<  0) /* (TC) Counter Clock Enable Command */
-
-/******************************************************************************/
-/*                  SOFTWARE API DEFINITION  FOR Usart                        */
-/******************************************************************************/
-typedef struct _AT91S_USART
-{
-	AT91_REG	 US_CR; 	/* Control Register */
-	AT91_REG	 US_MR; 	/* Mode Register */
-	AT91_REG	 US_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 US_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 US_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 US_CSR; 	/* Channel Status Register */
-	AT91_REG	 US_RHR; 	/* Receiver Holding Register */
-	AT91_REG	 US_THR; 	/* Transmitter Holding Register */
-	AT91_REG	 US_BRGR; 	/* Baud Rate Generator Register */
-	AT91_REG	 US_RTOR; 	/* Receiver Time-out Register */
-	AT91_REG	 US_TTGR; 	/* Transmitter Time-guard Register */
-	AT91_REG	 Reserved0[5]; 	/*  */
-	AT91_REG	 US_FIDI; 	/* FI_DI_Ratio Register */
-	AT91_REG	 US_NER; 	/* Nb Errors Register */
-	AT91_REG	 US_XXR; 	/* XON_XOFF Register */
-	AT91_REG	 US_IF; 	/* IRDA_FILTER Register */
-	AT91_REG	 Reserved1[44];	/*  */
-	AT91_REG	 US_RPR; 	/* Receive Pointer Register */
-	AT91_REG	 US_RCR; 	/* Receive Counter Register */
-	AT91_REG	 US_TPR; 	/* Transmit Pointer Register */
-	AT91_REG	 US_TCR; 	/* Transmit Counter Register */
-	AT91_REG	 US_RNPR; 	/* Receive Next Pointer Register */
-	AT91_REG	 US_RNCR; 	/* Receive Next Counter Register */
-	AT91_REG	 US_TNPR; 	/* Transmit Next Pointer Register */
-	AT91_REG	 US_TNCR; 	/* Transmit Next Counter Register */
-	AT91_REG	 US_PTCR; 	/* PDC Transfer Control Register */
-	AT91_REG	 US_PTSR; 	/* PDC Transfer Status Register */
-} AT91S_USART, *AT91PS_USART;
-
-/******************************************************************************/
-/*          SOFTWARE API DEFINITION  FOR Clock Generator Controler            */
-/******************************************************************************/
-typedef struct _AT91S_CKGR
-{
-	AT91_REG	 CKGR_MOR; 	/* Main Oscillator Register */
-	AT91_REG	 CKGR_MCFR; 	/* Main Clock  Frequency Register */
-	AT91_REG	 CKGR_PLLAR; 	/* PLL A Register */
-	AT91_REG	 CKGR_PLLBR; 	/* PLL B Register */
-} AT91S_CKGR, *AT91PS_CKGR;
-
-/* -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- */
-#define AT91C_CKGR_MOSCEN	((unsigned int) 0x1  <<  0)	/* (CKGR) Main Oscillator Enable */
-#define AT91C_CKGR_OSCTEST	((unsigned int) 0x1  <<  1)	/* (CKGR) Oscillator Test */
-#define AT91C_CKGR_OSCOUNT	((unsigned int) 0xFF <<  8)	/* (CKGR) Main Oscillator Start-up Time */
-
-/* -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- */
-#define AT91C_CKGR_MAINF	((unsigned int) 0xFFFF <<  0)	/* (CKGR) Main Clock Frequency */
-#define AT91C_CKGR_MAINRDY	((unsigned int) 0x1 << 16)	/* (CKGR) Main Clock Ready */
-
-/* -------- CKGR_PLLAR : (CKGR Offset: 0x8) PLL A Register -------- */
-#define AT91C_CKGR_DIVA		((unsigned int) 0xFF  <<  0)	/* (CKGR) Divider Selected */
-#define AT91C_CKGR_DIVA_0	((unsigned int) 0x0)		/* (CKGR) Divider output is 0 */
-#define AT91C_CKGR_DIVA_BYPASS	((unsigned int) 0x1)		/* (CKGR) Divider is bypassed */
-#define AT91C_CKGR_PLLACOUNT	((unsigned int) 0x3F  <<  8)	/* (CKGR) PLL A Counter */
-#define AT91C_CKGR_OUTA		((unsigned int) 0x3   << 14)	/* (CKGR) PLL A Output Frequency Range */
-#define AT91C_CKGR_OUTA_0	((unsigned int) 0x0   << 14)	/* (CKGR) Please refer to the PLLA datasheet */
-#define AT91C_CKGR_OUTA_1	((unsigned int) 0x1   << 14)	/* (CKGR) Please refer to the PLLA datasheet */
-#define AT91C_CKGR_OUTA_2	((unsigned int) 0x2   << 14)	/* (CKGR) Please refer to the PLLA datasheet */
-#define AT91C_CKGR_OUTA_3	((unsigned int) 0x3   << 14)	/* (CKGR) Please refer to the PLLA datasheet */
-#define AT91C_CKGR_MULA		((unsigned int) 0x7FF << 16)	/* (CKGR) PLL A Multiplier */
-#define AT91C_CKGR_SRCA		((unsigned int) 0x1   << 29)	/* (CKGR) PLL A Source */
-
-/* -------- CKGR_PLLBR : (CKGR Offset: 0xc) PLL B Register -------- */
-#define AT91C_CKGR_DIVB		((unsigned int) 0xFF  <<  0)	/* (CKGR) Divider Selected */
-#define AT91C_CKGR_DIVB_0	((unsigned int) 0x0)		/* (CKGR) Divider output is 0 */
-#define AT91C_CKGR_DIVB_BYPASS	((unsigned int) 0x1)		/* (CKGR) Divider is bypassed */
-#define AT91C_CKGR_PLLBCOUNT	((unsigned int) 0x3F  <<  8)	/* (CKGR) PLL B Counter */
-#define AT91C_CKGR_OUTB		((unsigned int) 0x3   << 14)	/* (CKGR) PLL B Output Frequency Range */
-#define AT91C_CKGR_OUTB_0	((unsigned int) 0x0   << 14)	/* (CKGR) Please refer to the PLLB datasheet */
-#define AT91C_CKGR_OUTB_1	((unsigned int) 0x1   << 14)	/* (CKGR) Please refer to the PLLB datasheet */
-#define AT91C_CKGR_OUTB_2	((unsigned int) 0x2   << 14)	/* (CKGR) Please refer to the PLLB datasheet */
-#define AT91C_CKGR_OUTB_3	((unsigned int) 0x3   << 14)	/* (CKGR) Please refer to the PLLB datasheet */
-#define AT91C_CKGR_MULB		((unsigned int) 0x7FF << 16)	/* (CKGR) PLL B Multiplier */
-#define AT91C_CKGR_USB_96M	((unsigned int) 0x1   << 28)	/* (CKGR) Divider for USB Ports */
-#define AT91C_CKGR_USB_PLL	((unsigned int) 0x1   << 29)	/* (CKGR) PLL Use */
-
-/******************************************************************************/
-/*        SOFTWARE API DEFINITION  FOR Parallel Input Output Controler        */
-/******************************************************************************/
-typedef struct _AT91S_PIO
-{
-	AT91_REG	 PIO_PER; 	/* PIO Enable Register */
-	AT91_REG	 PIO_PDR; 	/* PIO Disable Register */
-	AT91_REG	 PIO_PSR; 	/* PIO Status Register */
-	AT91_REG	 Reserved0[1]; 	/*  */
-	AT91_REG	 PIO_OER; 	/* Output Enable Register */
-	AT91_REG	 PIO_ODR; 	/* Output Disable Registerr */
-	AT91_REG	 PIO_OSR; 	/* Output Status Register */
-	AT91_REG	 Reserved1[1]; 	/*  */
-	AT91_REG	 PIO_IFER; 	/* Input Filter Enable Register */
-	AT91_REG	 PIO_IFDR; 	/* Input Filter Disable Register */
-	AT91_REG	 PIO_IFSR; 	/* Input Filter Status Register */
-	AT91_REG	 Reserved2[1]; 	/*  */
-	AT91_REG	 PIO_SODR; 	/* Set Output Data Register */
-	AT91_REG	 PIO_CODR; 	/* Clear Output Data Register */
-	AT91_REG	 PIO_ODSR; 	/* Output Data Status Register */
-	AT91_REG	 PIO_PDSR; 	/* Pin Data Status Register */
-	AT91_REG	 PIO_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 PIO_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 PIO_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 PIO_ISR; 	/* Interrupt Status Register */
-	AT91_REG	 PIO_MDER; 	/* Multi-driver Enable Register */
-	AT91_REG	 PIO_MDDR; 	/* Multi-driver Disable Register */
-	AT91_REG	 PIO_MDSR; 	/* Multi-driver Status Register */
-	AT91_REG	 Reserved3[1]; 	/*  */
-	AT91_REG	 PIO_PPUDR; 	/* Pull-up Disable Register */
-	AT91_REG	 PIO_PPUER; 	/* Pull-up Enable Register */
-	AT91_REG	 PIO_PPUSR; 	/* Pad Pull-up Status Register */
-	AT91_REG	 Reserved4[1]; 	/*  */
-	AT91_REG	 PIO_ASR; 	/* Select A Register */
-	AT91_REG	 PIO_BSR; 	/* Select B Register */
-	AT91_REG	 PIO_ABSR; 	/* AB Select Status Register */
-	AT91_REG	 Reserved5[9]; 	/*  */
-	AT91_REG	 PIO_OWER; 	/* Output Write Enable Register */
-	AT91_REG	 PIO_OWDR; 	/* Output Write Disable Register */
-	AT91_REG	 PIO_OWSR; 	/* Output Write Status Register */
-} AT91S_PIO, *AT91PS_PIO;
-
-
-/******************************************************************************/
-/*              SOFTWARE API DEFINITION  FOR Debug Unit                       */
-/******************************************************************************/
-typedef struct _AT91S_DBGU
-{
-	AT91_REG	 DBGU_CR; 	/* Control Register */
-	AT91_REG	 DBGU_MR; 	/* Mode Register */
-	AT91_REG	 DBGU_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 DBGU_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 DBGU_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 DBGU_CSR; 	/* Channel Status Register */
-	AT91_REG	 DBGU_RHR; 	/* Receiver Holding Register */
-	AT91_REG	 DBGU_THR; 	/* Transmitter Holding Register */
-	AT91_REG	 DBGU_BRGR; 	/* Baud Rate Generator Register */
-	AT91_REG	 Reserved0[7]; 	/*  */
-	AT91_REG	 DBGU_C1R; 	/* Chip ID1 Register */
-	AT91_REG	 DBGU_C2R; 	/* Chip ID2 Register */
-	AT91_REG	 DBGU_FNTR; 	/* Force NTRST Register */
-	AT91_REG	 Reserved1[45]; 	/*  */
-	AT91_REG	 DBGU_RPR; 	/* Receive Pointer Register */
-	AT91_REG	 DBGU_RCR; 	/* Receive Counter Register */
-	AT91_REG	 DBGU_TPR; 	/* Transmit Pointer Register */
-	AT91_REG	 DBGU_TCR; 	/* Transmit Counter Register */
-	AT91_REG	 DBGU_RNPR; 	/* Receive Next Pointer Register */
-	AT91_REG	 DBGU_RNCR; 	/* Receive Next Counter Register */
-	AT91_REG	 DBGU_TNPR; 	/* Transmit Next Pointer Register */
-	AT91_REG	 DBGU_TNCR; 	/* Transmit Next Counter Register */
-	AT91_REG	 DBGU_PTCR; 	/* PDC Transfer Control Register */
-	AT91_REG	 DBGU_PTSR; 	/* PDC Transfer Status Register */
-} AT91S_DBGU, *AT91PS_DBGU;
-
-/* -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register --------  */
-#define AT91C_US_RXRDY		((unsigned int) 0x1 <<  0) /* (DBGU) RXRDY Interrupt */
-#define AT91C_US_TXRDY		((unsigned int) 0x1 <<  1) /* (DBGU) TXRDY Interrupt */
-#define AT91C_US_ENDRX		((unsigned int) 0x1 <<  3) /* (DBGU) End of Receive Transfer Interrupt */
-#define AT91C_US_ENDTX		((unsigned int) 0x1 <<  4) /* (DBGU) End of Transmit Interrupt */
-#define AT91C_US_OVRE		((unsigned int) 0x1 <<  5) /* (DBGU) Overrun Interrupt */
-#define AT91C_US_FRAME		((unsigned int) 0x1 <<  6) /* (DBGU) Framing Error Interrupt */
-#define AT91C_US_PARE		((unsigned int) 0x1 <<  7) /* (DBGU) Parity Error Interrupt */
-#define AT91C_US_TXEMPTY	((unsigned int) 0x1 <<  9) /* (DBGU) TXEMPTY Interrupt */
-#define AT91C_US_TXBUFE		((unsigned int) 0x1 << 11) /* (DBGU) TXBUFE Interrupt */
-#define AT91C_US_RXBUFF		((unsigned int) 0x1 << 12) /* (DBGU) RXBUFF Interrupt */
-#define AT91C_US_COMM_TX	((unsigned int) 0x1 << 30) /* (DBGU) COMM_TX Interrupt */
-#define AT91C_US_COMM_RX	((unsigned int) 0x1 << 31) /* (DBGU) COMM_RX Interrupt */
-
-/* -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register --------  */
-#define AT91C_US_RSTRX		((unsigned int) 0x1 <<  2) /* (DBGU) Reset Receiver */
-#define AT91C_US_RSTTX		((unsigned int) 0x1 <<  3) /* (DBGU) Reset Transmitter */
-#define AT91C_US_RXEN		((unsigned int) 0x1 <<  4) /* (DBGU) Receiver Enable */
-#define AT91C_US_RXDIS		((unsigned int) 0x1 <<  5) /* (DBGU) Receiver Disable */
-#define AT91C_US_TXEN		((unsigned int) 0x1 <<  6) /* (DBGU) Transmitter Enable */
-#define AT91C_US_TXDIS		((unsigned int) 0x1 <<  7) /* (DBGU) Transmitter Disable */
-
-#define AT91C_US_CLKS_CLOCK	((unsigned int) 0x0 <<  4) /* (USART) Clock */
-#define AT91C_US_CHRL_8_BITS	((unsigned int) 0x3 <<  6) /* (USART) Character Length: 8 bits */
-#define AT91C_US_PAR_NONE	((unsigned int) 0x4 <<  9) /* (DBGU) No Parity */
-#define AT91C_US_NBSTOP_1_BIT	((unsigned int) 0x0 << 12) /* (USART) 1 stop bit */
-
-/******************************************************************************/
-/*      SOFTWARE API DEFINITION  FOR Static Memory Controller 2 Interface     */
-/******************************************************************************/
-typedef struct _AT91S_SMC2
-{
-	AT91_REG	 SMC2_CSR[8]; 	/* SMC2 Chip Select Register */
-} AT91S_SMC2, *AT91PS_SMC2;
-
-/* -------- SMC2_CSR : (SMC2 Offset: 0x0) SMC2 Chip Select Register --------  */
-#define AT91C_SMC2_NWS			((unsigned int) 0x7F << 0) /* (SMC2) Number of Wait States */
-#define AT91C_SMC2_WSEN			((unsigned int) 0x1 <<  7) /* (SMC2) Wait State Enable */
-#define AT91C_SMC2_TDF			((unsigned int) 0xF <<  8) /* (SMC2) Data Float Time */
-#define AT91C_SMC2_BAT			((unsigned int) 0x1 << 12) /* (SMC2) Byte Access Type */
-#define AT91C_SMC2_DBW			((unsigned int) 0x1 << 13) /* (SMC2) Data Bus Width */
-#define AT91C_SMC2_DBW_16		((unsigned int) 0x1 << 13) /* (SMC2) 16-bit. */
-#define AT91C_SMC2_DBW_8		((unsigned int) 0x2 << 13) /* (SMC2) 8-bit. */
-#define AT91C_SMC2_DRP			((unsigned int) 0x1 << 15) /* (SMC2) Data Read Protocol */
-#define AT91C_SMC2_ACSS			((unsigned int) 0x3 << 16) /* (SMC2) Address to Chip Select Setup */
-#define AT91C_SMC2_ACSS_STANDARD	((unsigned int) 0x0 << 16) /* (SMC2) Standard, asserted at the beginning of the access and deasserted at the end. */
-#define AT91C_SMC2_ACSS_1_CYCLE		((unsigned int) 0x1 << 16) /* (SMC2) One cycle less at the beginning and the end of the access. */
-#define AT91C_SMC2_ACSS_2_CYCLES	((unsigned int) 0x2 << 16) /* (SMC2) Two cycles less at the beginning and the end of the access. */
-#define AT91C_SMC2_ACSS_3_CYCLES	((unsigned int) 0x3 << 16) /* (SMC2) Three cycles less at the beginning and the end of the access. */
-#define AT91C_SMC2_RWSETUP		((unsigned int) 0x7 << 24) /* (SMC2) Read and Write Signal Setup Time */
-#define AT91C_SMC2_RWHOLD		((unsigned int) 0x7 << 29) /* (SMC2) Read and Write Signal Hold Time */
-
-/******************************************************************************/
-/*           SOFTWARE API DEFINITION  FOR Power Management Controler          */
-/******************************************************************************/
-typedef struct _AT91S_PMC
-{
-	AT91_REG	 PMC_SCER; 	/* System Clock Enable Register */
-	AT91_REG	 PMC_SCDR; 	/* System Clock Disable Register */
-	AT91_REG	 PMC_SCSR; 	/* System Clock Status Register */
-	AT91_REG	 Reserved0[1]; 	/* */
-	AT91_REG	 PMC_PCER; 	/* Peripheral Clock Enable Register */
-	AT91_REG	 PMC_PCDR; 	/* Peripheral Clock Disable Register */
-	AT91_REG	 PMC_PCSR; 	/* Peripheral Clock Status Register */
-	AT91_REG	 Reserved1[5]; 	/* */
-	AT91_REG	 PMC_MCKR; 	/* Master Clock Register */
-	AT91_REG	 Reserved2[3]; 	/* */
-	AT91_REG	 PMC_PCKR[8]; 	/* Programmable Clock Register */
-	AT91_REG	 PMC_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 PMC_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 PMC_SR; 	/* Status Register */
-	AT91_REG	 PMC_IMR; 	/* Interrupt Mask Register */
-} AT91S_PMC, *AT91PS_PMC;
-
-/*------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register --------*/
-#define AT91C_PMC_PCK		((unsigned int) 0x1 <<  0) /* (PMC) Processor Clock */
-#define AT91C_PMC_UDP		((unsigned int) 0x1 <<  1) /* (PMC) USB Device Port Clock */
-#define AT91C_PMC_MCKUDP	((unsigned int) 0x1 <<  2) /* (PMC) USB Device Port Master Clock Automatic Disable on Suspend */
-#define AT91C_PMC_UHP		((unsigned int) 0x1 <<  4) /* (PMC) USB Host Port Clock */
-#define AT91C_PMC_PCK0		((unsigned int) 0x1 <<  8) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK1		((unsigned int) 0x1 <<  9) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK2		((unsigned int) 0x1 << 10) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK3		((unsigned int) 0x1 << 11) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK4		((unsigned int) 0x1 << 12) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK5		((unsigned int) 0x1 << 13) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK6		((unsigned int) 0x1 << 14) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK7		((unsigned int) 0x1 << 15) /* (PMC) Programmable Clock Output */
-/*-------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register ------*/
-/*-------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------*/
-/*-------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register --------*/
-#define AT91C_PMC_CSS		((unsigned int) 0x3 <<  0) /* (PMC) Programmable Clock Selection */
-#define AT91C_PMC_CSS_SLOW_CLK	((unsigned int) 0x0)       /* (PMC) Slow Clock is selected */
-#define AT91C_PMC_CSS_MAIN_CLK	((unsigned int) 0x1)       /* (PMC) Main Clock is selected */
-#define AT91C_PMC_CSS_PLLA_CLK	((unsigned int) 0x2)       /* (PMC) Clock from PLL A is selected */
-#define AT91C_PMC_CSS_PLLB_CLK	((unsigned int) 0x3)       /* (PMC) Clock from PLL B is selected */
-#define AT91C_PMC_PRES		((unsigned int) 0x7 <<  2) /* (PMC) Programmable Clock Prescaler */
-#define AT91C_PMC_PRES_CLK	((unsigned int) 0x0 <<  2) /* (PMC) Selected clock */
-#define AT91C_PMC_PRES_CLK_2	((unsigned int) 0x1 <<  2) /* (PMC) Selected clock divided by 2 */
-#define AT91C_PMC_PRES_CLK_4	((unsigned int) 0x2 <<  2) /* (PMC) Selected clock divided by 4 */
-#define AT91C_PMC_PRES_CLK_8	((unsigned int) 0x3 <<  2) /* (PMC) Selected clock divided by 8 */
-#define AT91C_PMC_PRES_CLK_16	((unsigned int) 0x4 <<  2) /* (PMC) Selected clock divided by 16 */
-#define AT91C_PMC_PRES_CLK_32	((unsigned int) 0x5 <<  2) /* (PMC) Selected clock divided by 32 */
-#define AT91C_PMC_PRES_CLK_64	((unsigned int) 0x6 <<  2) /* (PMC) Selected clock divided by 64 */
-#define AT91C_PMC_MDIV		((unsigned int) 0x3 <<  8) /* (PMC) Master Clock Division */
-#define AT91C_PMC_MDIV_1	((unsigned int) 0x0 <<  8) /* (PMC) The master clock and the processor clock are the same */
-#define AT91C_PMC_MDIV_2	((unsigned int) 0x1 <<  8) /* (PMC) The processor clock is twice as fast as the master clock */
-#define AT91C_PMC_MDIV_3	((unsigned int) 0x2 <<  8) /* (PMC) The processor clock is three times faster than the master clock */
-#define AT91C_PMC_MDIV_4	((unsigned int) 0x3 <<  8) /* (PMC) The processor clock is four times faster than the master clock */
-/*------ PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register --------*/
-/*------ PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------*/
-#define AT91C_PMC_MOSCS		((unsigned int) 0x1 <<  0) /* (PMC) MOSC Status/Enable/Disable/Mask */
-#define AT91C_PMC_LOCKA		((unsigned int) 0x1 <<  1) /* (PMC) PLL A Status/Enable/Disable/Mask */
-#define AT91C_PMC_LOCKB		((unsigned int) 0x1 <<  2) /* (PMC) PLL B Status/Enable/Disable/Mask */
-#define AT91C_PMC_MCKRDY	((unsigned int) 0x1 <<  3) /* (PMC) MCK_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK0RDY	((unsigned int) 0x1 <<  8) /* (PMC) PCK0_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK1RDY	((unsigned int) 0x1 <<  9) /* (PMC) PCK1_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK2RDY	((unsigned int) 0x1 << 10) /* (PMC) PCK2_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK3RDY	((unsigned int) 0x1 << 11) /* (PMC) PCK3_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK4RDY	((unsigned int) 0x1 << 12) /* (PMC) PCK4_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK5RDY	((unsigned int) 0x1 << 13) /* (PMC) PCK5_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK6RDY	((unsigned int) 0x1 << 14) /* (PMC) PCK6_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK7RDY	((unsigned int) 0x1 << 15) /* (PMC) PCK7_RDY Status/Enable/Disable/Mask */
-/*---- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register --------*/
-/*-------- PMC_SR : (PMC Offset: 0x68) PMC Status Register --------*/
-/*-------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register --------*/
-
-/******************************************************************************/
-/*              SOFTWARE API DEFINITION  FOR Ethernet MAC                     */
-/******************************************************************************/
-typedef struct _AT91S_EMAC
-{
-	AT91_REG	 EMAC_CTL; 	/* Network Control Register */
-	AT91_REG	 EMAC_CFG; 	/* Network Configuration Register */
-	AT91_REG	 EMAC_SR; 	/* Network Status Register */
-	AT91_REG	 EMAC_TAR; 	/* Transmit Address Register */
-	AT91_REG	 EMAC_TCR; 	/* Transmit Control Register */
-	AT91_REG	 EMAC_TSR; 	/* Transmit Status Register */
-	AT91_REG	 EMAC_RBQP; 	/* Receive Buffer Queue Pointer */
-	AT91_REG	 Reserved0[1]; 	/*  */
-	AT91_REG	 EMAC_RSR; 	/* Receive Status Register */
-	AT91_REG	 EMAC_ISR; 	/* Interrupt Status Register */
-	AT91_REG	 EMAC_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 EMAC_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 EMAC_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 EMAC_MAN; 	/* PHY Maintenance Register */
-	AT91_REG	 Reserved1[2]; 	/*  */
-	AT91_REG	 EMAC_FRA; 	/* Frames Transmitted OK Register */
-	AT91_REG	 EMAC_SCOL; 	/* Single Collision Frame Register */
-	AT91_REG	 EMAC_MCOL; 	/* Multiple Collision Frame Register */
-	AT91_REG	 EMAC_OK; 	/* Frames Received OK Register */
-	AT91_REG	 EMAC_SEQE; 	/* Frame Check Sequence Error Register */
-	AT91_REG	 EMAC_ALE; 	/* Alignment Error Register */
-	AT91_REG	 EMAC_DTE; 	/* Deferred Transmission Frame Register */
-	AT91_REG	 EMAC_LCOL; 	/* Late Collision Register */
-	AT91_REG	 EMAC_ECOL; 	/* Excessive Collision Register */
-	AT91_REG	 EMAC_CSE; 	/* Carrier Sense Error Register */
-	AT91_REG	 EMAC_TUE; 	/* Transmit Underrun Error Register */
-	AT91_REG	 EMAC_CDE; 	/* Code Error Register */
-	AT91_REG	 EMAC_ELR; 	/* Excessive Length Error Register */
-	AT91_REG	 EMAC_RJB; 	/* Receive Jabber Register */
-	AT91_REG	 EMAC_USF; 	/* Undersize Frame Register */
-	AT91_REG	 EMAC_SQEE; 	/* SQE Test Error Register */
-	AT91_REG	 EMAC_DRFC; 	/* Discarded RX Frame Register */
-	AT91_REG	 Reserved2[3]; 	/*  */
-	AT91_REG	 EMAC_HSH; 	/* Hash Address High[63:32] */
-	AT91_REG	 EMAC_HSL; 	/* Hash Address Low[31:0] */
-	AT91_REG	 EMAC_SA1L; 	/* Specific Address 1 Low, First 4 bytes */
-	AT91_REG	 EMAC_SA1H; 	/* Specific Address 1 High, Last 2 bytes */
-	AT91_REG	 EMAC_SA2L; 	/* Specific Address 2 Low, First 4 bytes */
-	AT91_REG	 EMAC_SA2H; 	/* Specific Address 2 High, Last 2 bytes */
-	AT91_REG	 EMAC_SA3L; 	/* Specific Address 3 Low, First 4 bytes */
-	AT91_REG	 EMAC_SA3H; 	/* Specific Address 3 High, Last 2 bytes */
-	AT91_REG	 EMAC_SA4L; 	/* Specific Address 4 Low, First 4 bytes */
-	AT91_REG	 EMAC_SA4H; 	/* Specific Address 4 High, Last 2 bytesr */
-} AT91S_EMAC, *AT91PS_EMAC;
-
-/* -------- EMAC_CTL : (EMAC Offset: 0x0)  --------  */
-#define AT91C_EMAC_LB		((unsigned int) 0x1 <<  0) /* (EMAC) Loopback. Optional. When set, loopback signal is at high level. */
-#define AT91C_EMAC_LBL		((unsigned int) 0x1 <<  1) /* (EMAC) Loopback local. */
-#define AT91C_EMAC_RE		((unsigned int) 0x1 <<  2) /* (EMAC) Receive enable. */
-#define AT91C_EMAC_TE		((unsigned int) 0x1 <<  3) /* (EMAC) Transmit enable. */
-#define AT91C_EMAC_MPE		((unsigned int) 0x1 <<  4) /* (EMAC) Management port enable. */
-#define AT91C_EMAC_CSR		((unsigned int) 0x1 <<  5) /* (EMAC) Clear statistics registers. */
-#define AT91C_EMAC_ISR		((unsigned int) 0x1 <<  6) /* (EMAC) Increment statistics registers. */
-#define AT91C_EMAC_WES		((unsigned int) 0x1 <<  7) /* (EMAC) Write enable for statistics registers. */
-#define AT91C_EMAC_BP		((unsigned int) 0x1 <<  8) /* (EMAC) Back pressure. */
-
-/* -------- EMAC_CFG : (EMAC Offset: 0x4) Network Configuration Register --------  */
-#define AT91C_EMAC_SPD		((unsigned int) 0x1 <<  0) /* (EMAC) Speed. */
-#define AT91C_EMAC_FD		((unsigned int) 0x1 <<  1) /* (EMAC) Full duplex. */
-#define AT91C_EMAC_BR		((unsigned int) 0x1 <<  2) /* (EMAC) Bit rate. */
-#define AT91C_EMAC_CAF		((unsigned int) 0x1 <<  4) /* (EMAC) Copy all frames. */
-#define AT91C_EMAC_NBC		((unsigned int) 0x1 <<  5) /* (EMAC) No broadcast. */
-#define AT91C_EMAC_MTI		((unsigned int) 0x1 <<  6) /* (EMAC) Multicast hash enable */
-#define AT91C_EMAC_UNI		((unsigned int) 0x1 <<  7) /* (EMAC) Unicast hash enable. */
-#define AT91C_EMAC_BIG		((unsigned int) 0x1 <<  8) /* (EMAC) Receive 1522 bytes. */
-#define AT91C_EMAC_EAE		((unsigned int) 0x1 <<  9) /* (EMAC) External address match enable. */
-#define AT91C_EMAC_CLK		((unsigned int) 0x3 << 10) /* (EMAC) */
-#define AT91C_EMAC_CLK_HCLK_8	((unsigned int) 0x0 << 10) /* (EMAC) HCLK divided by 8 */
-#define AT91C_EMAC_CLK_HCLK_16	((unsigned int) 0x1 << 10) /* (EMAC) HCLK divided by 16 */
-#define AT91C_EMAC_CLK_HCLK_32	((unsigned int) 0x2 << 10) /* (EMAC) HCLK divided by 32 */
-#define AT91C_EMAC_CLK_HCLK_64	((unsigned int) 0x3 << 10) /* (EMAC) HCLK divided by 64 */
-#define AT91C_EMAC_RTY		((unsigned int) 0x1 << 12) /* (EMAC) */
-#define AT91C_EMAC_RMII		((unsigned int) 0x1 << 13) /* (EMAC) */
-
-/* -------- EMAC_SR : (EMAC Offset: 0x8) Network Status Register --------  */
-#define AT91C_EMAC_MDIO		((unsigned int) 0x1 <<  1) /* (EMAC) */
-#define AT91C_EMAC_IDLE		((unsigned int) 0x1 <<  2) /* (EMAC) */
-
-/* -------- EMAC_TCR : (EMAC Offset: 0x10) Transmit Control Register -------- */
-#define AT91C_EMAC_LEN		((unsigned int) 0x7FF <<  0) /* (EMAC) */
-#define AT91C_EMAC_NCRC		((unsigned int) 0x1 << 15) /* (EMAC) */
-
-/* -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Control Register -------- */
-#define AT91C_EMAC_OVR		((unsigned int) 0x1 <<  0) /* (EMAC) */
-#define AT91C_EMAC_COL		((unsigned int) 0x1 <<  1) /* (EMAC) */
-#define AT91C_EMAC_RLE		((unsigned int) 0x1 <<  2) /* (EMAC) */
-#define AT91C_EMAC_TXIDLE	((unsigned int) 0x1 <<  3) /* (EMAC) */
-#define AT91C_EMAC_BNQ		((unsigned int) 0x1 <<  4) /* (EMAC) */
-#define AT91C_EMAC_COMP		((unsigned int) 0x1 <<  5) /* (EMAC) */
-#define AT91C_EMAC_UND		((unsigned int) 0x1 <<  6) /* (EMAC) */
-
-/* -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- */
-#define AT91C_EMAC_BNA		((unsigned int) 0x1 <<  0) /* (EMAC) */
-#define AT91C_EMAC_REC		((unsigned int) 0x1 <<  1) /* (EMAC) */
-#define AT91C_EMAC_RSR_OVR	((unsigned int) 0x1 <<  2) /* (EMAC) */
-
-/* -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- */
-#define AT91C_EMAC_DONE		((unsigned int) 0x1 <<  0) /* (EMAC) */
-#define AT91C_EMAC_RCOM		((unsigned int) 0x1 <<  1) /* (EMAC) */
-#define AT91C_EMAC_RBNA		((unsigned int) 0x1 <<  2) /* (EMAC) */
-#define AT91C_EMAC_TOVR		((unsigned int) 0x1 <<  3) /* (EMAC) */
-#define AT91C_EMAC_TUND		((unsigned int) 0x1 <<  4) /* (EMAC) */
-#define AT91C_EMAC_RTRY		((unsigned int) 0x1 <<  5) /* (EMAC) */
-#define AT91C_EMAC_TBRE		((unsigned int) 0x1 <<  6) /* (EMAC) */
-#define AT91C_EMAC_TCOM		((unsigned int) 0x1 <<  7) /* (EMAC) */
-#define AT91C_EMAC_TIDLE	((unsigned int) 0x1 <<  8) /* (EMAC) */
-#define AT91C_EMAC_LINK		((unsigned int) 0x1 <<  9) /* (EMAC) */
-#define AT91C_EMAC_ROVR		((unsigned int) 0x1 << 10) /* (EMAC) */
-#define AT91C_EMAC_HRESP	((unsigned int) 0x1 << 11) /* (EMAC) */
-
-/* -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- */
-/* -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- */
-/* -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- */
-/* -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- */
-#define AT91C_EMAC_DATA		((unsigned int) 0xFFFF <<  0) /* (EMAC) */
-#define AT91C_EMAC_CODE		((unsigned int) 0x3  << 16) /* (EMAC) */
-#define AT91C_EMAC_CODE_802_3	((unsigned int) 0x2  << 16) /* (EMAC) Write Operation */
-#define AT91C_EMAC_REGA		((unsigned int) 0x1F << 18) /* (EMAC) */
-#define AT91C_EMAC_PHYA		((unsigned int) 0x1F << 23) /* (EMAC) */
-#define AT91C_EMAC_RW		((unsigned int) 0x3  << 28) /* (EMAC) */
-#define AT91C_EMAC_RW_R		((unsigned int) 0x2  << 28) /* (EMAC) Read Operation */
-#define AT91C_EMAC_RW_W		((unsigned int) 0x1  << 28) /* (EMAC) Write Operation */
-#define AT91C_EMAC_HIGH		((unsigned int) 0x1  << 30) /* (EMAC) */
-#define AT91C_EMAC_LOW		((unsigned int) 0x1  << 31) /* (EMAC) */
-
-/******************************************************************************/
-/*           SOFTWARE API DEFINITION  FOR Serial Parallel Interface           */
-/******************************************************************************/
-typedef struct _AT91S_SPI
-{
-	AT91_REG	 SPI_CR; 	/* Control Register */
-	AT91_REG	 SPI_MR; 	/* Mode Register */
-	AT91_REG	 SPI_RDR; 	/* Receive Data Register */
-	AT91_REG	 SPI_TDR; 	/* Transmit Data Register */
-	AT91_REG	 SPI_SR; 	/* Status Register */
-	AT91_REG	 SPI_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 SPI_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 SPI_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 Reserved0[4]; 	/* */
-	AT91_REG	 SPI_CSR[4]; 	/* Chip Select Register */
-	AT91_REG	 Reserved1[48]; /* */
-	AT91_REG	 SPI_RPR; 	/* Receive Pointer Register */
-	AT91_REG	 SPI_RCR; 	/* Receive Counter Register */
-	AT91_REG	 SPI_TPR; 	/* Transmit Pointer Register */
-	AT91_REG	 SPI_TCR; 	/* Transmit Counter Register */
-	AT91_REG	 SPI_RNPR; 	/* Receive Next Pointer Register */
-	AT91_REG	 SPI_RNCR; 	/* Receive Next Counter Register */
-	AT91_REG	 SPI_TNPR; 	/* Transmit Next Pointer Register */
-	AT91_REG	 SPI_TNCR; 	/* Transmit Next Counter Register */
-	AT91_REG	 SPI_PTCR; 	/* PDC Transfer Control Register */
-	AT91_REG	 SPI_PTSR; 	/* PDC Transfer Status Register */
-} AT91S_SPI, *AT91PS_SPI;
-
-/* -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- */
-#define AT91C_SPI_SPIEN		((unsigned int) 0x1 <<  0) /* (SPI) SPI Enable */
-#define AT91C_SPI_SPIDIS	((unsigned int) 0x1 <<  1) /* (SPI) SPI Disable */
-#define AT91C_SPI_SWRST		((unsigned int) 0x1 <<  7) /* (SPI) SPI Software reset */
-
-/* -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- */
-#define AT91C_SPI_MSTR		((unsigned int) 0x1 <<  0) /* (SPI) Master/Slave Mode */
-#define AT91C_SPI_PS		((unsigned int) 0x1 <<  1) /* (SPI) Peripheral Select */
-#define AT91C_SPI_PS_FIXED	((unsigned int) 0x0 <<  1) /* (SPI) Fixed Peripheral Select */
-#define AT91C_SPI_PS_VARIABLE	((unsigned int) 0x1 <<  1) /* (SPI) Variable Peripheral Select */
-#define AT91C_SPI_PCSDEC	((unsigned int) 0x1 <<  2) /* (SPI) Chip Select Decode */
-#define AT91C_SPI_DIV32		((unsigned int) 0x1 <<  3) /* (SPI) Clock Selection */
-#define AT91C_SPI_MODFDIS	((unsigned int) 0x1 <<  4) /* (SPI) Mode Fault Detection */
-#define AT91C_SPI_LLB		((unsigned int) 0x1 <<  7) /* (SPI) Clock Selection */
-#define AT91C_SPI_PCS		((unsigned int) 0xF << 16) /* (SPI) Peripheral Chip Select */
-#define AT91C_SPI_DLYBCS	((unsigned int) 0xFF << 24) /* (SPI) Delay Between Chip Selects */
-
-/* -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- */
-#define AT91C_SPI_RD		((unsigned int) 0xFFFF <<  0) /* (SPI) Receive Data */
-#define AT91C_SPI_RPCS		((unsigned int) 0xF << 16) /* (SPI) Peripheral Chip Select Status */
-
-/* -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- */
-#define AT91C_SPI_TD		((unsigned int) 0xFFFF <<  0) /* (SPI) Transmit Data */
-#define AT91C_SPI_TPCS		((unsigned int) 0xF << 16) /* (SPI) Peripheral Chip Select Status */
-
-/* -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- */
-#define AT91C_SPI_RDRF		((unsigned int) 0x1 <<  0) /* (SPI) Receive Data Register Full */
-#define AT91C_SPI_TDRE		((unsigned int) 0x1 <<  1) /* (SPI) Transmit Data Register Empty */
-#define AT91C_SPI_MODF		((unsigned int) 0x1 <<  2) /* (SPI) Mode Fault Error */
-#define AT91C_SPI_OVRES		((unsigned int) 0x1 <<  3) /* (SPI) Overrun Error Status */
-#define AT91C_SPI_SPENDRX	((unsigned int) 0x1 <<  4) /* (SPI) End of Receiver Transfer */
-#define AT91C_SPI_SPENDTX	((unsigned int) 0x1 <<  5) /* (SPI) End of Receiver Transfer */
-#define AT91C_SPI_RXBUFF	((unsigned int) 0x1 <<  6) /* (SPI) RXBUFF Interrupt */
-#define AT91C_SPI_TXBUFE	((unsigned int) 0x1 <<  7) /* (SPI) TXBUFE Interrupt */
-#define AT91C_SPI_SPIENS	((unsigned int) 0x1 << 16) /* (SPI) Enable Status */
-
-/* -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- */
-/* -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- */
-/* -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- */
-/* -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- */
-#define AT91C_SPI_CPOL		((unsigned int) 0x1  <<  0) /* (SPI) Clock Polarity */
-#define AT91C_SPI_NCPHA		((unsigned int) 0x1  <<  1) /* (SPI) Clock Phase */
-#define AT91C_SPI_BITS		((unsigned int) 0xF  <<  4) /* (SPI) Bits Per Transfer */
-#define AT91C_SPI_BITS_8	((unsigned int) 0x0  <<  4) /* (SPI) 8 Bits Per transfer */
-#define AT91C_SPI_BITS_9	((unsigned int) 0x1  <<  4) /* (SPI) 9 Bits Per transfer */
-#define AT91C_SPI_BITS_10	((unsigned int) 0x2  <<  4) /* (SPI) 10 Bits Per transfer */
-#define AT91C_SPI_BITS_11	((unsigned int) 0x3  <<  4) /* (SPI) 11 Bits Per transfer */
-#define AT91C_SPI_BITS_12	((unsigned int) 0x4  <<  4) /* (SPI) 12 Bits Per transfer */
-#define AT91C_SPI_BITS_13	((unsigned int) 0x5  <<  4) /* (SPI) 13 Bits Per transfer */
-#define AT91C_SPI_BITS_14	((unsigned int) 0x6  <<  4) /* (SPI) 14 Bits Per transfer */
-#define AT91C_SPI_BITS_15	((unsigned int) 0x7  <<  4) /* (SPI) 15 Bits Per transfer */
-#define AT91C_SPI_BITS_16	((unsigned int) 0x8  <<  4) /* (SPI) 16 Bits Per transfer */
-#define AT91C_SPI_SCBR		((unsigned int) 0xFF <<  8) /* (SPI) Serial Clock Baud Rate */
-#define AT91C_SPI_DLYBS		((unsigned int) 0xFF << 16) /* (SPI) Serial Clock Baud Rate */
-#define AT91C_SPI_DLYBCT	((unsigned int) 0xFF << 24) /* (SPI) Delay Between Consecutive Transfers */
-
-/******************************************************************************/
-/*           SOFTWARE API DEFINITION  FOR Peripheral Data Controller          */
-/******************************************************************************/
-typedef struct _AT91S_PDC
-{
-	AT91_REG	 PDC_RPR; 	/* Receive Pointer Register */
-	AT91_REG	 PDC_RCR; 	/* Receive Counter Register */
-	AT91_REG	 PDC_TPR; 	/* Transmit Pointer Register */
-	AT91_REG	 PDC_TCR; 	/* Transmit Counter Register */
-	AT91_REG	 PDC_RNPR; 	/* Receive Next Pointer Register */
-	AT91_REG	 PDC_RNCR; 	/* Receive Next Counter Register */
-	AT91_REG	 PDC_TNPR; 	/* Transmit Next Pointer Register */
-	AT91_REG	 PDC_TNCR; 	/* Transmit Next Counter Register */
-	AT91_REG	 PDC_PTCR; 	/* PDC Transfer Control Register */
-	AT91_REG	 PDC_PTSR; 	/* PDC Transfer Status Register */
-} AT91S_PDC, *AT91PS_PDC;
-
-/* -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- */
-#define AT91C_PDC_RXTEN		((unsigned int) 0x1 <<  0) /* (PDC) Receiver Transfer Enable */
-#define AT91C_PDC_RXTDIS	((unsigned int) 0x1 <<  1) /* (PDC) Receiver Transfer Disable */
-#define AT91C_PDC_TXTEN		((unsigned int) 0x1 <<  8) /* (PDC) Transmitter Transfer Enable */
-#define AT91C_PDC_TXTDIS	((unsigned int) 0x1 <<  9) /* (PDC) Transmitter Transfer Disable */
-/* -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register --------  */
-
-/* ========== Register definition ==================================== */
-#define AT91C_SPI_CSR		((AT91_REG *)	0xFFFE0030) /* (SPI) Chip Select Register */
-#define AT91C_PMC_PCER		((AT91_REG *)	0xFFFFFC10) /* (PMC) Peripheral Clock Enable Register */
-#define AT91C_PMC_PCDR		((AT91_REG *)	0xFFFFFC14) /* (PMC) Peripheral Clock Enable Register */
-#define AT91C_PMC_SCER		((AT91_REG *)	0xFFFFFC00) /* (PMC) Peripheral Clock Enable Register */
-#define AT91C_PMC_SCDR		((AT91_REG *)	0xFFFFFC04) /* (PMC) Peripheral Clock Enable Register */
-#define AT91C_PIOA_PER		((AT91_REG *)	0xFFFFF400) /* (PIOA) PIO Enable Register */
-#define AT91C_PIOA_PDR		((AT91_REG *)	0xFFFFF404) /* (PIOA) PIO Disable Register */
-#define AT91C_PIOA_PSR		((AT91_REG *)	0xFFFFF408) /* (PIOA) PIO Status Register */
-#define AT91C_PIOA_OER		((AT91_REG *)	0xFFFFF410) /* (PIOA) PIO Output Enable Register */
-#define AT91C_PIOA_ODR		((AT91_REG *)	0xFFFFF414) /* (PIOA) PIO Output Disable Register */
-#define AT91C_PIOA_OSR		((AT91_REG *)	0xFFFFF418) /* (PIOA) PIO Output Status Register */
-#define AT91C_PIOA_IFER		((AT91_REG *)	0xFFFFF420) /* (PIOA) PIO Glitch Input Filter Enable Register */
-#define AT91C_PIOA_IFDR		((AT91_REG *)	0xFFFFF424) /* (PIOA) PIO Glitch Input Filter Disable Register */
-#define AT91C_PIOA_IFSR		((AT91_REG *)	0xFFFFF428) /* (PIOA) PIO Glitch Input Filter Status Register */
-#define AT91C_PIOA_SODR		((AT91_REG *)	0xFFFFF430) /* (PIOA) PIO Set Output Data Register */
-#define AT91C_PIOA_CODR		((AT91_REG *)	0xFFFFF434) /* (PIOA) PIO Clear Output Data Register */
-#define AT91C_PIOA_ODSR		((AT91_REG *)	0xFFFFF438) /* (PIOA) PIO Output Data Status Register */
-#define AT91C_PIOA_PDSR		((AT91_REG *)	0xFFFFF43C) /* (PIOA) PIO Pin Data Status Register */
-#define AT91C_PIOA_IER		((AT91_REG *)	0xFFFFF440) /* (PIOA) PIO Interrupt Enable Register */
-#define AT91C_PIOA_IDR		((AT91_REG *)	0xFFFFF444) /* (PIOA) PIO Interrupt Disable Register */
-#define AT91C_PIOA_IMR		((AT91_REG *)	0xFFFFF448) /* (PIOA) PIO Interrupt Mask Register */
-#define AT91C_PIOA_ISR		((AT91_REG *)	0xFFFFF44C) /* (PIOA) PIO Interrupt Status Register */
-#define AT91C_PIOA_MDER		((AT91_REG *)	0xFFFFF450) /* (PIOA) PIO Multi-drive Enable Register */
-#define AT91C_PIOA_MDDR		((AT91_REG *)	0xFFFFF454) /* (PIOA) PIO Multi-drive Disable Register */
-#define AT91C_PIOA_MDSR		((AT91_REG *)	0xFFFFF458) /* (PIOA) PIO Multi-drive Status Register */
-#define AT91C_PIOA_PUDR		((AT91_REG *)	0xFFFFF460) /* (PIOA) PIO Pull-up Disable Register */
-#define AT91C_PIOA_PUER		((AT91_REG *)	0xFFFFF464) /* (PIOA) PIO Pull-up Enable Register */
-#define AT91C_PIOA_PUSR		((AT91_REG *)	0xFFFFF468) /* (PIOA) PIO Pull-up Status Register */
-#define AT91C_PIOA_ASR		((AT91_REG *)	0xFFFFF470) /* (PIOA) PIO Peripheral A Select Register */
-#define AT91C_PIOA_BSR		((AT91_REG *)	0xFFFFF474) /* (PIOA) PIO Peripheral B Select Register */
-#define AT91C_PIOA_ABSR		((AT91_REG *)	0xFFFFF478) /* (PIOA) PIO Peripheral AB Select Register */
-#define AT91C_PIOA_OWER		((AT91_REG *)	0xFFFFF4A0) /* (PIOA) PIO Output Write Enable Register */
-#define AT91C_PIOA_OWDR		((AT91_REG *)	0xFFFFF4A4) /* (PIOA) PIO Output Write Disable Register */
-#define AT91C_PIOA_OWSR		((AT91_REG *)	0xFFFFF4A8) /* (PIOA) PIO Output Write Status Register */
-#define AT91C_PIOB_PDR		((AT91_REG *)	0xFFFFF604) /* (PIOB) PIO Disable Register */
-
-#define AT91C_PIO_PA30		((unsigned int) 1 << 30)	/* Pin Controlled by PA30 */
-#define AT91C_PIO_PC0		((unsigned int) 1 <<  0)	/* Pin Controlled by PC0 */
-#define AT91C_PC0_BFCK		((unsigned int) AT91C_PIO_PC0)	/* Burst Flash Clock */
-#define AT91C_PA30_DRXD		((unsigned int) AT91C_PIO_PA30)	/* DBGU Debug Receive Data */
-#define AT91C_PIO_PA31		((unsigned int) 1 << 31)	/* Pin Controlled by PA31 */
-#define AT91C_PA25_TWD		((unsigned int) 1 << 25)
-#define AT91C_PA26_TWCK		((unsigned int) 1 << 26)
-#define AT91C_PA31_DTXD		((unsigned int) AT91C_PIO_PA31)	/* DBGU Debug Transmit Data */
-#define AT91C_PIO_PA17		((unsigned int) 1 << 17)	/* Pin Controlled by PA17 */
-#define AT91C_PA17_TXD0		AT91C_PIO_PA17			/* USART0 Transmit Data */
-#define AT91C_PIO_PA18		((unsigned int) 1 << 18)	/* Pin Controlled by PA18 */
-#define AT91C_PA18_RXD0		AT91C_PIO_PA18			/* USART0 Receive Data */
-#define AT91C_PIO_PB20		((unsigned int) 1 << 20)	/* Pin Controlled by PB20 */
-#define AT91C_PB20_RXD1		AT91C_PIO_PB20			/* USART1 Receive Data */
-#define AT91C_PIO_PB21		((unsigned int) 1 << 21)	/* Pin Controlled by PB21 */
-#define AT91C_PB21_TXD1		AT91C_PIO_PB21			/* USART1 Transmit Data */
-
-#define AT91C_ID_SYS		((unsigned int)  1) /* System Peripheral */
-#define AT91C_ID_PIOA		((unsigned int)  2) /* PIO port A */
-#define AT91C_ID_PIOB		((unsigned int)  3) /* PIO port B */
-#define AT91C_ID_PIOC		((unsigned int)  4) /* PIO port C */
-#define AT91C_ID_USART0		((unsigned int)  6) /* USART 0 */
-#define AT91C_ID_USART1		((unsigned int)  7) /* USART 1 */
-#define AT91C_ID_TWI		((unsigned int) 12) /* Two Wire Interface */
-#define AT91C_ID_SPI		((unsigned int) 13) /* Serial Peripheral Interface */
-#define AT91C_ID_TC0		((unsigned int) 17) /* Timer Counter 0 */
-#define AT91C_ID_UHP		((unsigned int) 23) /* OHCI USB Host Port */
-#define AT91C_ID_EMAC		((unsigned int) 24) /* Ethernet MAC */
-
-#define AT91C_PIO_PC1		((unsigned int) 1 <<  1)	/* Pin Controlled by PC1 */
-#define AT91C_PC1_BFRDY_SMOE	((unsigned int) AT91C_PIO_PC1)	/*  Burst Flash Ready */
-#define AT91C_PIO_PC3		((unsigned int) 1 <<  3)	/* Pin Controlled by PC3 */
-#define AT91C_PC3_BFBAA_SMWE	((unsigned int) AT91C_PIO_PC3)	/*  Burst Flash Address Advance / SmartMedia Write Enable */
-#define AT91C_PIO_PC2		((unsigned int) 1 <<  2)	/* Pin Controlled by PC2 */
-#define AT91C_PC2_BFAVD		((unsigned int) AT91C_PIO_PC2)	/*  Burst Flash Address Valid */
-#define AT91C_PIO_PB1		((unsigned int) 1 <<  1)	/* Pin Controlled by PB1 */
-
-#define AT91C_PIO_PA23		((unsigned int) 1 << 23)	/* Pin Controlled by PA23 */
-#define AT91C_PA23_TXD2		((unsigned int) AT91C_PIO_PA23)	/* USART 2 Transmit Data */
-
-#define AT91C_PIO_PA0		((unsigned int) 1 <<  0)	/* Pin Controlled by PA0 */
-#define AT91C_PA0_MISO		((unsigned int) AT91C_PIO_PA0)	/* SPI Master In Slave */
-#define AT91C_PIO_PA1		((unsigned int) 1 <<  1)	/* Pin Controlled by PA1 */
-#define AT91C_PA1_MOSI		((unsigned int) AT91C_PIO_PA1)	/* SPI Master Out Slave */
-#define AT91C_PIO_PA2		((unsigned int) 1 <<  2)	/* Pin Controlled by PA2 */
-#define AT91C_PA2_SPCK		((unsigned int) AT91C_PIO_PA2)	/* SPI Serial Clock */
-#define AT91C_PIO_PA3		((unsigned int) 1 <<  3)	/* Pin Controlled by PA3 */
-#define AT91C_PA3_NPCS0		((unsigned int) AT91C_PIO_PA3)	/* SPI Peripheral Chip Select 0 */
-#define AT91C_PIO_PA4		((unsigned int) 1 <<  4)	/* Pin Controlled by PA4 */
-#define AT91C_PA4_NPCS1		((unsigned int) AT91C_PIO_PA4)	/* SPI Peripheral Chip Select 1 */
-#define AT91C_PIO_PA5		((unsigned int) 1 <<  5)	/* Pin Controlled by PA5 */
-#define AT91C_PA5_NPCS2		((unsigned int) AT91C_PIO_PA5)	/* SPI Peripheral Chip Select 2 */
-#define AT91C_PIO_PA6		((unsigned int) 1 <<  6)	/* Pin Controlled by PA6 */
-#define AT91C_PA6_NPCS3		((unsigned int) AT91C_PIO_PA6)	/* SPI Peripheral Chip Select 3 */
-
-#define AT91C_PIO_PA16		((unsigned int) 1 << 16)	/* Pin Controlled by PA16 */
-#define AT91C_PA16_EMDIO	((unsigned int) AT91C_PIO_PA16)	/* Ethernet MAC Management Data Input/Output */
-#define AT91C_PIO_PA15		((unsigned int) 1 << 15)	/* Pin Controlled by PA15 */
-#define AT91C_PA15_EMDC		((unsigned int) AT91C_PIO_PA15)	/* Ethernet MAC Management Data Clock */
-#define AT91C_PIO_PA14		((unsigned int) 1 << 14)	/* Pin Controlled by PA14 */
-#define AT91C_PA14_ERXER	((unsigned int) AT91C_PIO_PA14)	/* Ethernet MAC Receive Error */
-#define AT91C_PIO_PA13		((unsigned int) 1 << 13)	/* Pin Controlled by PA13 */
-#define AT91C_PA13_ERX1		((unsigned int) AT91C_PIO_PA13)	/* Ethernet MAC Receive Data 1 */
-#define AT91C_PIO_PA12		((unsigned int) 1 << 12)	/* Pin Controlled by PA12 */
-#define AT91C_PA12_ERX0		((unsigned int) AT91C_PIO_PA12)	/* Ethernet MAC Receive Data 0 */
-#define AT91C_PIO_PA11		((unsigned int) 1 << 11)	/* Pin Controlled by PA11 */
-#define AT91C_PA11_ECRS_ECRSDV	((unsigned int) AT91C_PIO_PA11)	/* Ethernet MAC Carrier Sense/Carrier Sense and Data Valid */
-#define AT91C_PIO_PA10		((unsigned int) 1 << 10)	/* Pin Controlled by PA10 */
-#define AT91C_PA10_ETX1		((unsigned int) AT91C_PIO_PA10)	/* Ethernet MAC Transmit Data 1 */
-#define AT91C_PIO_PA9		((unsigned int) 1 <<  9)	/* Pin Controlled by PA9 */
-#define AT91C_PA9_ETX0		((unsigned int) AT91C_PIO_PA9)	/* Ethernet MAC Transmit Data 0 */
-#define AT91C_PIO_PA8		((unsigned int) 1 <<  8)	/* Pin Controlled by PA8 */
-#define AT91C_PA8_ETXEN		((unsigned int) AT91C_PIO_PA8)	/* Ethernet MAC Transmit Enable */
-#define AT91C_PIO_PA7		((unsigned int) 1 <<  7)	/* Pin Controlled by PA7 */
-#define AT91C_PA7_ETXCK_EREFCK	((unsigned int) AT91C_PIO_PA7)	/* Ethernet MAC Transmit Clock/Reference Clock */
-
-#define AT91C_PIO_PB3		((unsigned int) 1 <<  3)	/* Pin Controlled by PB3 */
-#define AT91C_PIO_PB4		((unsigned int) 1 <<  4)	/* Pin Controlled by PB4 */
-#define AT91C_PIO_PB5		((unsigned int) 1 <<  5)	/* Pin Controlled by PB5 */
-#define AT91C_PIO_PB6		((unsigned int) 1 <<  6)	/* Pin Controlled by PB6 */
-#define AT91C_PIO_PB7		((unsigned int) 1 <<  7)	/* Pin Controlled by PB7 */
-#define AT91C_PIO_PB25		((unsigned int) 1 << 25)	/* Pin Controlled by PB25 */
-#define AT91C_PB25_DSR1		((unsigned int) AT91C_PIO_PB25)	/* USART 1 Data Set ready */
-#define AT91C_PB25_EF100	((unsigned int) AT91C_PIO_PB25)	/* Ethernet MAC Force 100 Mbits */
-#define AT91C_PIO_PB19		((unsigned int) 1 << 19)	/* Pin Controlled by PB19 */
-#define AT91C_PB19_DTR1		((unsigned int) AT91C_PIO_PB19)	/* USART 1 Data Terminal ready */
-#define AT91C_PB19_ERXCK	((unsigned int) AT91C_PIO_PB19)	/* Ethernet MAC Receive Clock */
-#define AT91C_PIO_PB18		((unsigned int) 1 << 18)	/* Pin Controlled by PB18 */
-#define AT91C_PB18_RI1		((unsigned int) AT91C_PIO_PB18)	/* USART 1 Ring Indicator */
-#define AT91C_PB18_ECOL		((unsigned int) AT91C_PIO_PB18)	/* Ethernet MAC Collision Detected */
-#define AT91C_PIO_PB17		((unsigned int) 1 << 17)	/* Pin Controlled by PB17 */
-#define AT91C_PB17_RF2		((unsigned int) AT91C_PIO_PB17)	/* SSC Receive Frame Sync 2 */
-#define AT91C_PB17_ERXDV	((unsigned int) AT91C_PIO_PB17)	/* Ethernet MAC Receive Data Valid */
-#define AT91C_PIO_PB16		((unsigned int) 1 << 16)	/* Pin Controlled by PB16 */
-#define AT91C_PB16_RK2		((unsigned int) AT91C_PIO_PB16)	/* SSC Receive Clock 2 */
-#define AT91C_PB16_ERX3		((unsigned int) AT91C_PIO_PB16)	/* Ethernet MAC Receive Data 3 */
-#define AT91C_PIO_PB15		((unsigned int) 1 << 15)	/* Pin Controlled by PB15 */
-#define AT91C_PB15_RD2		((unsigned int) AT91C_PIO_PB15)	/* SSC Receive Data 2 */
-#define AT91C_PB15_ERX2		((unsigned int) AT91C_PIO_PB15)	/* Ethernet MAC Receive Data 2 */
-#define AT91C_PIO_PB14		((unsigned int) 1 << 14)	/* Pin Controlled by PB14 */
-#define AT91C_PB14_TD2		((unsigned int) AT91C_PIO_PB14)	/* SSC Transmit Data 2 */
-#define AT91C_PB14_ETXER	((unsigned int) AT91C_PIO_PB14)	/* Ethernet MAC Transmikt Coding Error */
-#define AT91C_PIO_PB13		((unsigned int) 1 << 13)	/* Pin Controlled by PB13 */
-#define AT91C_PB13_TK2		((unsigned int) AT91C_PIO_PB13)	/* SSC Transmit Clock 2 */
-#define AT91C_PB13_ETX3		((unsigned int) AT91C_PIO_PB13)	/* Ethernet MAC Transmit Data 3 */
-#define AT91C_PIO_PB12		((unsigned int) 1 << 12)	/* Pin Controlled by PB12 */
-#define AT91C_PB12_TF2		((unsigned int) AT91C_PIO_PB12)	/* SSC Transmit Frame Sync 2 */
-#define AT91C_PB12_ETX2		((unsigned int) AT91C_PIO_PB12)	/* Ethernet MAC Transmit Data 2 */
-
-#define AT91C_PIOB_BSR		((AT91_REG *)	0xFFFFF674)	/* (PIOB) Select B Register */
-#define AT91C_PIOB_PDR		((AT91_REG *)	0xFFFFF604)	/* (PIOB) PIO Disable Register */
-
-#define AT91C_EBI_CS3A_SMC_SmartMedia	((unsigned int) 0x1 <<  3) /* (EBI) Chip Select 3 is assigned to the Static Memory Controller and the SmartMedia Logic is activated. */
-#define AT91C_SMC2_ACSS_STANDARD	((unsigned int) 0x0 << 16) /* (SMC2) Standard, asserted at the beginning of the access and deasserted at the end. */
-#define AT91C_SMC2_DBW_8	((unsigned int) 0x2 << 13) /* (SMC2) 8-bit. */
-#define AT91C_SMC2_WSEN		((unsigned int) 0x1 <<  7) /* (SMC2) Wait State Enable */
-#define AT91C_PIOC_ASR		((AT91_REG *)	0xFFFFF870) /* (PIOC) Select A Register */
-#define AT91C_PIOC_SODR		((AT91_REG *)	0xFFFFF830) /* (PIOC) Set Output Data Register */
-#define AT91C_PIOC_CODR		((AT91_REG *)	0xFFFFF834) /* (PIOC) Clear Output Data Register */
-#define AT91C_PIOC_PDSR		((AT91_REG *)	0xFFFFF83C) /* (PIOC) Pin Data Status Register */
-
-#define AT91C_BASE_SPI		((AT91PS_SPI)	0xFFFE0000) /* (SPI) Base Address */
-#define AT91C_BASE_EMAC		((AT91PS_EMAC)	0xFFFBC000) /* (EMAC) Base Address */
-#define AT91C_BASE_PMC		((AT91PS_PMC)	0xFFFFFC00) /* (PMC) Base Address */
-#define AT91C_BASE_TC0		((AT91PS_TC)	0xFFFA0000) /* (TC0) Base Address */
-#define AT91C_BASE_DBGU		((AT91PS_DBGU)	0xFFFFF200) /* (DBGU) Base Address */
-#define AT91C_BASE_CKGR		((AT91PS_CKGR)	0xFFFFFC20) /* (CKGR) Base Address */
-#define AT91C_BASE_PIOC		((AT91PS_PIO)	0xFFFFF800) /* (PIOC) Base Address */
-#define AT91C_BASE_PIOB		((AT91PS_PIO)	0xFFFFF600) /* (PIOB) Base Address */
-#define AT91C_BASE_PIOA		((AT91PS_PIO)	0xFFFFF400) /* (PIOA) Base Address */
-#define AT91C_EBI_CSA		((AT91_REG *)	0xFFFFFF60) /* (EBI) Chip Select Assignment Register */
-#define AT91C_BASE_SMC2		((AT91PS_SMC2)	0xFFFFFF70) /* (SMC2) Base Address */
-#define AT91C_BASE_US0		((AT91PS_USART)	0xFFFC0000) /* (US0) Base Address */
-#define AT91C_BASE_US1		((AT91PS_USART) 0xFFFC4000) /* (US1) Base Address */
-#define AT91C_TCB0_BMR		((AT91_REG *)	0xFFFA00C4) /* (TCB0) TC Block Mode Register */
-#define AT91C_TCB0_BCR		((AT91_REG *)	0xFFFA00C0) /* (TCB0) TC Block Control Register */
-#define AT91C_PIOC_PDR		((AT91_REG *)	0xFFFFF804) /* (PIOC) PIO Disable Register */
-#define AT91C_PIOC_PER		((AT91_REG *)	0xFFFFF800) /* (PIOC) PIO Enable Register */
-#define AT91C_PIOC_ODR  	((AT91_REG *)	0xFFFFF814) /* (PIOC) Output Disable Registerr */
-#define AT91C_PIOB_PER		((AT91_REG *)	0xFFFFF600) /* (PIOB) PIO Enable Register */
-#define AT91C_PIOB_ODR		((AT91_REG *)	0xFFFFF614) /* (PIOB) Output Disable Registerr */
-#define AT91C_PIOB_PDSR		((AT91_REG *)	0xFFFFF63C) /* (PIOB) Pin Data Status Register */
-
-#endif
diff --git a/arch/arm/mach-at91rm9200/include/mach/hardware.h b/arch/arm/mach-at91rm9200/include/mach/hardware.h
deleted file mode 100644
index a84c60a..0000000
--- a/arch/arm/mach-at91rm9200/include/mach/hardware.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * linux/include/asm-arm/arch-at91/hardware.h
- *
- *  Copyright (C) 2003 SAN People
- *
- * 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_ARCH_HARDWARE_H
-#define __ASM_ARCH_HARDWARE_H
-
-#include <sizes.h>
-
-#ifndef __ASSEMBLY__
-#include "AT91RM9200.h"
-#else
-#include "AT91RM9200_inc.h"
-#endif
-
-/* Virtual and Physical base address for system peripherals */
-#define AT91_SYS_BASE		0xFFFFF000 /*4K */
-
-/* Virtual and Physical base addresses of user peripherals */
-#define AT91_SPI_BASE		0xFFFE0000 /*16K */
-#define AT91_SSC2_BASE		0xFFFD8000 /*16K */
-#define AT91_SSC1_BASE		0xFFFD4000 /*16K */
-#define AT91_SSC0_BASE		0xFFFD0000 /*16K */
-#define AT91_USART3_BASE	0xFFFCC000 /*16K */
-#define AT91_USART2_BASE	0xFFFC8000 /*16K */
-#define AT91_USART1_BASE	0xFFFC4000 /*16K */
-#define AT91_USART0_BASE	0xFFFC0000 /*16K */
-#define AT91_EMAC_BASE		0xFFFBC000 /*16K */
-#define AT91_TWI_BASE		0xFFFB8000 /*16K */
-#define AT91_MCI_BASE		0xFFFB4000 /*16K */
-#define AT91_UDP_BASE		0xFFFB0000 /*16K */
-#define AT91_TCB1_BASE		0xFFFA4000 /*16K */
-#define AT91_TCB0_BASE		0xFFFA0000 /*16K */
-
-#define AT91_USB_HOST_BASE	0x00300000
-#define CFG_USB_OHCI_REGS_BASE  AT91_USB_HOST_BASE
-
-/*
- * Where in virtual memory the IO devices (timers, system controllers
- * and so on)
- */
-#define AT91_IO_BASE		0xF0000000	/* Virt/Phys Address of IO */
-
-/* FLASH */
-#define AT91_FLASH_BASE		0x10000000	/* NCS0 */
-
-/* SDRAM */
-#define AT91_SDRAM_BASE		0x20000000	/* NCS1 */
-
-/* SmartMedia */
-#define AT91_SMARTMEDIA_BASE	0x40000000	/* NCS3 */
-
-/* Definition of interrupt priority levels */
-#define AT91C_AIC_PRIOR_0 AT91C_AIC_PRIOR_LOWEST
-#define AT91C_AIC_PRIOR_1 ((unsigned int) 0x1)
-#define AT91C_AIC_PRIOR_2 ((unsigned int) 0x2)
-#define AT91C_AIC_PRIOR_3 ((unsigned int) 0x3)
-#define AT91C_AIC_PRIOR_4 ((unsigned int) 0x4)
-#define AT91C_AIC_PRIOR_5 ((unsigned int) 0x5)
-#define AT91C_AIC_PRIOR_6 ((unsigned int) 0x6)
-#define AT91C_AIC_PRIOR_7 AT91C_AIC_PRIOR_HIGEST
-
-#endif
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug 18 22:49:46 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 04:49:46 +0200
Subject: [PATCH] mmccpu: fix typo in AT91_MAIN_CLOCK
Message-ID: <1282186186-521-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/boards/mmccpu/config.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/arm/boards/mmccpu/config.h b/arch/arm/boards/mmccpu/config.h
index 422ac09..c37d5eb 100644
--- a/arch/arm/boards/mmccpu/config.h
+++ b/arch/arm/boards/mmccpu/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_M1IN_CLOCK		18432000
+#define AT91_MAIN_CLOCK		18432000
 
 /* values */
 #define MASTER_PLL_MUL		54
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug 18 23:06:19 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 05:06:19 +0200
Subject: [PATCH] commands: partition.c fix file mod bits
Message-ID: <1282187179-2377-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 0 files changed, 0 insertions(+), 0 deletions(-)
 mode change 100755 => 100644 commands/partition.c

diff --git a/commands/partition.c b/commands/partition.c
old mode 100755
new mode 100644
-- 
1.7.1



From plagnioj at jcrosoft.com  Wed Aug 18 23:53:22 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 05:53:22 +0200
Subject: [PATCH] Add Menu Framework
Message-ID: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>

Introduce a menu framework that allow us to create list menu to simplify
barebox and make it more user-frendly

This kind of menu is very usefull when you do not have a keyboard or a
serial console attached to your board to allow you to interract with
barebox

For the develloper part,
The framework introduce two API

1) C
that allow you to create menu, submenu, entry and complex menu action

2) Command
that allow you as the C API to create menu, submenu, entry and complex
menu action but this time the actions will be store in a function and
then be evaluated and excecuted at runtime.

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 commands/Kconfig  |   10 ++
 commands/Makefile |    1 +
 commands/menu.c   |  463 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 common/Kconfig    |    7 +
 common/Makefile   |    1 +
 common/menu.c     |  303 ++++++++++++++++++++++++++++++++++
 include/menu.h    |   87 ++++++++++
 include/readkey.h |    5 +
 8 files changed, 877 insertions(+), 0 deletions(-)
 create mode 100644 commands/menu.c
 create mode 100644 common/menu.c
 create mode 100644 include/menu.h

diff --git a/commands/Kconfig b/commands/Kconfig
index 1ffc826..57c9b75 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -50,6 +50,16 @@ config CMD_FALSE
 	default y
 	prompt "false"
 
+config CMD_MENU
+	tristate
+	depends on MENU
+	prompt "menu"
+
+config CMD_MENU_MANAGEMENT
+	tristate
+	depends on CMD_MENU
+	prompt "menu scripts management"
+
 endmenu
 
 menu "file commands                 "
diff --git a/commands/Makefile b/commands/Makefile
index b99f042..154a778 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -50,3 +50,4 @@ obj-$(CONFIG_CMD_GPIO)		+= gpio.o
 obj-$(CONFIG_CMD_UNLZO)		+= unlzo.o
 obj-$(CONFIG_CMD_I2C)		+= i2c.o
 obj-$(CONFIG_CMD_UBI)		+= ubi.o
+obj-$(CONFIG_CMD_MENU)		+= menu.o
diff --git a/commands/menu.c b/commands/menu.c
new file mode 100644
index 0000000..4f33877
--- /dev/null
+++ b/commands/menu.c
@@ -0,0 +1,463 @@
+/*
+ * (C) Copyright 2009-2010 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.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; version 2 of
+ * the License.
+ *
+ * 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 <command.h>
+#include <readkey.h>
+#include <menu.h>
+#include <getopt.h>
+#include <errno.h>
+
+typedef enum {
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+	action_add,
+	action_remove,
+	action_select,
+#endif
+	action_list,
+	action_show,
+} menu_action;
+
+struct cmd_menu {
+	char		*menu;
+	menu_action	action;
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+	int		entry;
+	int		re_entrant;
+	char		*description;
+	char		*command;
+	int		num;
+#endif
+};
+
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+#define OPTS		"m:earlc:d:RsSn:"
+#define	is_entry(x)	((x)->entry)
+#else
+#define OPTS		"m:ls"
+#define	is_entry(x)	(0)
+#endif
+
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+/*
+ * menu -e -a -m <menu> -c <command> [-R] -d <description>
+ */
+static int do_menu_entry_add(struct cmd_menu *cm)
+{
+	struct menu_entry *me;
+	struct menu *m;
+	int len;
+	int ret = -ENOMEM;
+
+	if (!cm->menu || !cm->command || !cm->description)
+		return -1;
+
+	m = menu_get_by_name(cm->menu);
+
+	if (!m) {
+		eprintf("Menu '%s' not found\n", cm->menu);
+		return -1;
+	}
+
+	me = menu_entry_alloc();
+
+	if (!me)
+		goto free;
+
+	me->action = menu_action_run;
+
+	len = strlen(cm->command) + 1;
+
+	me->priv = calloc(len, sizeof(char));
+
+	if (!me->priv)
+		goto free;
+
+	strncpy(me->priv, cm->command, len);
+
+	len = strlen(cm->description) + 1;
+
+	me->display = calloc(len, sizeof(char));;
+
+	if (!m->display)
+		goto free;
+
+	strncpy(me->display, cm->description, len);
+
+	ret = menu_add_entry(m, me);
+
+	if (ret)
+		goto free;
+
+	me->non_re_ent = !cm->re_entrant;
+
+	return 0;
+
+free:
+	eputs("Entry add fail\n");
+
+	free(me->priv);
+
+	menu_entry_free(me);
+
+	return ret;
+}
+
+/*
+ * menu -e -r -m <name> -n <num>
+ */
+static int do_menu_entry_remove(struct cmd_menu *cm)
+{
+	struct menu *m;
+	struct menu_entry *me;
+
+	if (!cm->menu || cm->num < 0)
+		return -1;
+
+	m = menu_get_by_name(cm->menu);
+
+	if (!m) {
+		eprintf("Menu '%s' not found\n", cm->menu);
+		return -1;
+	}
+
+	me = menu_entry_get_by_num(m, cm->num);
+
+	if (!me) {
+		eprintf("Entry '%s' not found\n", cm->num);
+		return -1;
+	}
+
+	menu_remove_entry(m, me);
+
+	menu_entry_free(me);
+
+	return 0;
+}
+
+/*
+ * menu -a -m <name> -d <description>
+ */
+static int do_menu_add(struct cmd_menu *cm)
+{
+	struct menu *m;
+	int len = 0;
+	int ret = -ENOMEM;
+
+	if (!cm->menu || !cm->description)
+		return -1;
+
+	m = menu_alloc();
+
+	if (!m)
+		goto free;
+
+	len = strlen(cm->menu) + 1;
+
+	m->name = calloc(len, sizeof(char));;
+	if (!m->name)
+		goto free;
+
+	strncpy(m->name, cm->menu, len);
+
+	len = strlen(cm->description) + 1;
+
+	m->display = calloc(len, sizeof(char));;
+
+	if (!m->display)
+		goto free;
+
+	strncpy(m->display, cm->description, len);
+
+	ret = menu_add(m);
+
+	if (ret)
+		goto free;
+
+	return 0;
+
+free:
+	eprintf("Menu '%s' add fail\n", cm->menu);
+
+	menu_free(m);
+
+	return ret;
+}
+/*
+ * menu -r -m <name>
+ */
+static int do_menu_remove(struct cmd_menu *cm)
+{
+	struct menu *m;
+
+	m = menu_get_by_name(cm->menu);
+
+	if (!m) {
+		eprintf("Menu '%s' not found\n", cm->menu);
+		return -1;
+	}
+
+	menu_remove(m);
+
+	menu_free(m);
+
+	return 0;
+}
+
+/*
+ * menu -m <menu> -S -n <entry num starting at 1>
+ */
+static int do_menu_select(struct cmd_menu *cm)
+{
+	struct menu *m;
+
+	if (cm->num < 0)
+		return -1;
+
+	m = menu_get_by_name(cm->menu);
+
+	if (!m) {
+		eprintf("Menu '%s' not found\n", cm->menu);
+		return -1;
+	}
+
+	if (!menu_set_selected(m, cm->num)) {
+		eprintf("Entry '%d' not found\n", cm->num);
+		return -1;
+	}
+
+	return 0;
+}
+#endif
+
+/*
+ * menu -s -m <menu>
+ */
+static int do_menu_show(struct cmd_menu *cm)
+{
+	struct menu *m;
+
+	if (cm->menu)
+		m = menu_get_by_name(cm->menu);
+	else
+		m = menu_get_by_name("boot");
+
+	return menu_show(m);
+}
+
+static void print_entries(struct menu *m)
+{
+	struct list_head *pos;
+	struct menu_entry *me;
+
+	list_for_each(pos, &(m->entries.list)) {
+		me = list_entry(pos, struct menu_entry, list);
+		printf("%d: %s\n", me->num, me->display);
+	}
+}
+
+/*
+ * menu -l
+ * menu -e -l [menu]
+ */
+static int do_menu_list(struct cmd_menu *cm)
+{
+	struct list_head *pos;
+	struct menu* m = NULL;
+	struct menu* menus = menu_get_menus();
+
+	if (is_entry(cm)) {
+		if (cm->menu)
+			m = menu_get_by_name(cm->menu);
+
+		if (m) {
+			print_entries(m);
+			return 0;
+		}
+	}
+
+	list_for_each(pos, &menus->list) {
+		m = list_entry(pos, struct menu, list);
+		printf("%s: %s\n", m->name, m->display? m->display : m->name);
+		if (is_entry(cm))
+			print_entries(m);
+	}
+
+	return 0;
+}
+
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+static int do_menu_entry(struct cmd_menu *cm)
+{
+	switch(cm->action) {
+	case action_list:
+		return do_menu_list(cm);
+	case action_remove:
+		return do_menu_entry_remove(cm);
+	case action_add:
+		return do_menu_entry_add(cm);
+	case action_select:
+	case action_show:
+		break;
+	}
+	return -1;
+}
+#else
+static int do_menu_entry(struct cmd_menu *cm)
+{
+	return -1;
+}
+#endif
+
+static int do_menu(struct command *cmdtp, int argc, char *argv[])
+{
+	struct cmd_menu cm;
+	int opt;
+
+	memset(&cm, 0, sizeof(struct cmd_menu));
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+	cm.num = -1;
+#endif
+
+	cm.action = action_show;
+
+	while((opt = getopt(argc, argv, OPTS)) > 0) {
+		switch(opt) {
+		case 'm':
+			cm.menu = optarg;
+			break;
+			break;
+		case 'l':
+			cm.action = action_list;
+			break;
+		case 's':
+			cm.action = action_show;
+			break;
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+		case 'e':
+			cm.entry = 1;
+		case 'a':
+			cm.action = action_add;
+			break;
+		case 'r':
+			cm.action = action_remove;
+			break;
+		case 'c':
+			cm.command = optarg;
+			break;
+		case 'd':
+			cm.description = optarg;
+			break;
+		case 'R':
+			cm.re_entrant = 1;
+			break;
+		case 'S':
+			cm.action = action_select;
+			break;
+		case 'n':
+			cm.num = simple_strtoul(optarg, NULL, 10);
+			break;
+#endif
+		default:
+			return 1;
+		}
+	}
+
+	if (is_entry(&cm))
+		return do_menu_entry(&cm);
+
+	switch(cm.action) {
+	case action_list:
+		return do_menu_list(&cm);
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+	case action_remove:
+		return do_menu_remove(&cm);
+	case action_add:
+		return do_menu_add(&cm);
+	case action_select:
+		return do_menu_select(&cm);
+#endif
+	case action_show:
+		return do_menu_show(&cm);
+	}
+
+	return 0;
+}
+	
+static const __maybe_unused char cmd_menu_help[] =
+"Usage: menu [OPTION]... \n"
+"Manage Menu\n"
+"  -m  menu\n"
+"  -l  list\n"
+"  -s  show\n"
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+"Advanced\n"
+"  -e  menu entry\n"
+"  -a  add\n"
+"  -r  remove\n"
+"  -S  select\n"
+#endif
+"\n"
+"How to\n"
+"\n"
+"Show menu\n"
+"  menu -s -m <menu>\n"
+"\n"
+"List menu\n"
+"  menu -l\n"
+"\n"
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+"Add a menu\n"
+"  menu -a -m <name> -d <description>\n"
+"\n"
+"Remove a menu\n"
+"  menu -r -m <name>\n"
+"\n"
+"Add an entry\n"
+"  (-R for do no exit the menu after executing the command)\n"
+"  menu -e -a -m <menu> -c <command> [-R] -d <description>\n"
+"\n"
+"Remove an entry\n"
+"  menu -e -r -m <name> -n <num>\n"
+"\n"
+"Select an entry\n"
+"  menu -m <menu> -S -n <entry num starting at 1>\n"
+"\n"
+"List menu\n"
+"  menu -e -l [menu]\n"
+"\n"
+"Menu example\n"
+"menu -a -m boot -d \"Boot Menu\"\n"
+"menu -e -a -m boot -c boot -d \"Boot\"\n"
+"menu -e -a -m boot -c reset -d \"Reset\"\n"
+"menu -s -m boot\n"
+#else
+"Menu example\n"
+"menu -s -m boot\n"
+#endif
+;
+
+BAREBOX_CMD_START(menu)
+	.cmd		= do_menu,
+	.usage		= "Menu Management",
+	BAREBOX_CMD_HELP(cmd_menu_help)
+BAREBOX_CMD_END
diff --git a/common/Kconfig b/common/Kconfig
index a58f242..c07c638 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -244,6 +244,13 @@ config AUTO_COMPLETE
 	depends on CMDLINE_EDITING
 	prompt "Enable auto completion"
 
+config MENU
+	bool
+	prompt "Menu Framework"
+	help
+	   a menu framework that allow us to create list menu to simplify
+	   barebox and make it more user-frendly
+
 config DYNAMIC_CRC_TABLE
 	bool
 	depends on CRC32
diff --git a/common/Makefile b/common/Makefile
index 14f8643..4b8cce0 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -15,6 +15,7 @@ obj-y += env.o
 obj-y += startup.o
 obj-y += misc.o
 obj-y += memsize.o
+obj-$(CONFIG_MENU) += menu.o
 obj-$(CONFIG_MODULES) += module.o
 extra-$(CONFIG_MODULES) += module.lds
 
diff --git a/common/menu.c b/common/menu.c
new file mode 100644
index 0000000..70553db
--- /dev/null
+++ b/common/menu.c
@@ -0,0 +1,303 @@
+/*
+ * (C) Copyright 2009-2010 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.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; version 2 of
+ * the License.
+ *
+ * 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 <command.h>
+#include <environment.h>
+#include <init.h>
+#include <menu.h>
+#include <malloc.h>
+#include <xfuncs.h>
+#include <errno.h>
+#include <readkey.h>
+
+static struct menu menus;
+
+struct menu* menu_get_menus(void)
+{
+	return &menus;
+}
+
+void menu_free(struct menu *m)
+{
+	struct list_head *pos;
+	struct menu_entry *me;
+
+	if (!m)
+		return;
+	free(m->name);
+	free(m->display);
+
+	list_for_each(pos, &m->entries.list) {
+		me = list_entry(pos, struct menu_entry, list);
+		menu_entry_free(me);
+		list_del(pos);
+	}
+
+	free(m);
+}
+
+int menu_add(struct menu *m)
+{
+	if (!m || !m->name)
+		return -1;
+
+	list_add_tail(&m->list, &menus.list);
+	m->nb_entries = 0;
+
+	INIT_LIST_HEAD(&m->entries.list);
+
+	return 0;
+}
+
+void menu_remove(struct menu *m)
+{
+	if (!m)
+		return;
+
+	list_del(&m->list);
+}
+
+int menu_add_entry(struct menu *m, struct menu_entry *me)
+{
+	int len;
+
+	if (!m || !me || !me->display)
+		return -1;
+
+	len = strlen(me->display);
+
+	m->width = max(len, m->width);
+
+	m->nb_entries++;
+	me->num = m->nb_entries;
+	list_add_tail(&me->list, &m->entries.list);
+
+	return 0;
+}
+
+void menu_remove_entry(struct menu *m, struct menu_entry *me)
+{
+	if (!m || !me)
+		return;
+
+	m->nb_entries--;
+	list_del(&me->list);
+
+	return;
+}
+
+struct menu* menu_get_by_name(char *name)
+{
+	struct list_head *pos;
+	struct menu* m;
+
+	if (!name)
+		return NULL;
+
+	list_for_each(pos, &menus.list) {
+		m = list_entry(pos, struct menu, list);
+		if(strcmp(m->name, name) == 0)
+			return m;
+	}
+
+	return NULL;
+}
+
+struct menu_entry* menu_entry_get_by_num(struct menu* m, int num)
+{
+	struct list_head *pos;
+	struct menu_entry* me;
+
+	if (!m || num < 1 || num > m->nb_entries)
+		return NULL;
+
+	list_for_each(pos, &m->entries.list) {
+		me = list_entry(pos, struct menu_entry, list);
+		if(me->num == num)
+			return me;
+	}
+
+	return NULL;
+}
+
+void menu_entry_free(struct menu_entry *me)
+{
+	if (!me)
+		return;
+
+	free(me->display);
+	free(me);
+}
+
+static void print_menu_entry(struct menu *m, struct menu_entry *me, int reverse)
+{
+	gotoXY(me->num + 1, 3);
+	if (reverse)
+		printf_reverse("%d: %-*s", me->num, m->width, me->display);
+	else
+		printf("%d: %-*s", me->num, m->width, me->display);
+}
+
+int menu_set_selected_entry(struct menu *m, struct menu_entry* me)
+{
+	struct list_head *pos;
+	struct menu_entry* tmp;
+
+	if (!m || !me)
+		return -1;
+
+	list_for_each(pos, &m->entries.list) {
+		tmp = list_entry(pos, struct menu_entry, list);
+		if(me == tmp) {
+			m->selected = me;
+			return 0;
+		}
+	}
+
+	return -1;
+}
+
+int menu_set_selected(struct menu *m, int num)
+{
+	struct menu_entry *me;
+
+	me = menu_entry_get_by_num(m, num);
+
+	if (!me)
+		return -1;
+
+	m->selected = me;
+
+	return 0;
+}
+
+static void print_menu(struct menu *m)
+{
+	struct list_head *pos;
+	struct menu_entry *me;
+
+	clear();
+	gotoXY(1, 2);
+	if(m->display) {
+		puts(m->display);
+	} else {
+		puts("Menu : ");
+		puts(m->name);
+	}
+
+	list_for_each(pos, &m->entries.list) {
+		me = list_entry(pos, struct menu_entry, list);
+		if(m->selected != me)
+			print_menu_entry(m, me, 0);
+	}
+
+	if (!m->selected) {
+		m->selected = list_first_entry(&m->entries.list,
+						struct menu_entry, list);
+	}
+
+	print_menu_entry(m, m->selected, 1);
+}
+
+int menu_show(struct menu *m)
+{
+	int ch;
+	int escape = 0;
+
+	if(!m || list_empty(&m->entries.list))
+		return -1;
+
+	print_menu(m);
+
+	do {
+		ch = getc();
+		switch(ch) {
+		case 0x1b:
+			escape = 1;
+			break;
+		case '[':
+			if (escape)
+				break;
+		case 'A': /* up */
+			escape = 0;
+			print_menu_entry(m, m->selected, 0);
+			m->selected = list_entry(m->selected->list.prev, struct menu_entry,
+						 list);
+			if (&(m->selected->list) == &(m->entries.list)) {
+				m->selected = list_entry(m->selected->list.prev, struct menu_entry,
+							 list);
+			}
+			print_menu_entry(m, m->selected, 1);
+			break;
+		case 'B': /* down */
+			escape = 0;
+			print_menu_entry(m, m->selected, 0);
+			m->selected = list_entry(m->selected->list.next, struct menu_entry,
+						 list);
+			if (&(m->selected->list) == &(m->entries.list)) {
+				m->selected = list_entry(m->selected->list.next, struct menu_entry,
+							 list);
+			}
+			print_menu_entry(m, m->selected, 1);
+			break;
+		case '\n':
+		case '\r':
+			clear();
+			gotoXY(1,1);
+			m->selected->action(m, m->selected);
+			if (m->selected->non_re_ent)
+				return m->selected->num;
+			else
+				print_menu(m);
+		default:
+			break;
+		}
+	} while(1);
+
+	return 0;
+}
+
+void menu_action_exit(struct menu *m, struct menu_entry *me) {}
+
+void menu_action_run(struct menu *m, struct menu_entry *me)
+{
+	int ret;
+	const char *s = getenv((const char*)me->priv);
+
+	/* can be a command as boot */
+	if (!s)
+		s = me->priv;
+
+	ret = run_command (s, 0);
+
+	if (ret < 0)
+		udelay(1000000);
+}
+
+static int menu_init(void)
+{
+	INIT_LIST_HEAD(&menus.list);
+
+	return 0;
+}
+postcore_initcall(menu_init);
diff --git a/include/menu.h b/include/menu.h
new file mode 100644
index 0000000..29f18f2
--- /dev/null
+++ b/include/menu.h
@@ -0,0 +1,87 @@
+/*
+ * (C) Copyright 2009-2010 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.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; version 2 of
+ * the License.
+ *
+ * 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 __MENU_H__
+#define __MENU_H__
+
+#include <linux/list.h>
+#include <malloc.h>
+
+struct menu;
+
+struct menu_entry {
+	int num;
+	char *display;
+	void (*action)(struct menu *m, struct menu_entry *me);
+	int non_re_ent;
+
+	struct list_head list;
+	void *priv;
+};
+
+struct menu {
+	char *name;
+	char *display;
+
+	struct list_head list;
+	struct menu_entry entries;
+	int nb_entries;
+	int width;
+	struct menu_entry *selected;
+	void *priv;
+};
+
+/*
+ * menu functions
+ */
+static inline struct menu* menu_alloc(void)
+{
+	return calloc(1, sizeof(struct menu));
+}
+void menu_free(struct menu *m);
+int menu_add(struct menu* m);
+void menu_remove(struct menu *m);
+struct menu* menu_get_by_name(char *name);
+int menu_show(struct menu *m);
+int menu_set_selected_entry(struct menu *m, struct menu_entry* me);
+int menu_set_selected(struct menu *m, int num);
+struct menu* menu_get_menus(void);
+
+/*
+ * menu entry functions
+ */
+static inline struct menu_entry* menu_entry_alloc(void)
+{
+	return calloc(1, sizeof(struct menu_entry));
+}
+void menu_entry_free(struct menu_entry *me);
+int menu_add_entry(struct menu *m, struct menu_entry* me);
+void menu_remove_entry(struct menu *m, struct menu_entry *me);
+struct menu_entry* menu_entry_get_by_num(struct menu* m, int num);
+
+/*
+ * menu entry action functions
+ */
+void menu_action_run(struct menu *m, struct menu_entry *me);
+void menu_action_exit(struct menu *m, struct menu_entry *me);
+
+#endif /* __MENU_H__ */
diff --git a/include/readkey.h b/include/readkey.h
index 919af64..aabb835 100644
--- a/include/readkey.h
+++ b/include/readkey.h
@@ -22,6 +22,11 @@
 
 #define ANSI_CLEAR_SCREEN "\e[2J\e[;H"
 
+#define printf_reverse(fmt,args...)	printf("\e[7m" fmt "\e[m",##args)
+#define puts_reverse(fmt)		puts("\e[7m" fmt "\e[m")
+#define gotoXY(row, col)		printf("\e[%d;%dH", row, col)
+#define clear()				puts("\e[2J")
+
 int read_key(void);
 
 #endif /* READKEY_H */
-- 
1.7.1



From s.hauer at pengutronix.de  Thu Aug 19 02:32:58 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Thu, 19 Aug 2010 08:32:58 +0200
Subject: [PATCH 1/6] dm9000: allow to specify that no srom is present
In-Reply-To: <1282186110-32738-1-git-send-email-plagnioj@jcrosoft.com>
References: <20100819024811.GG454@game.jcrosoft.org>
	<1282186110-32738-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100819063258.GC27749@pengutronix.de>

Hi Jean-Christophe,

On Thu, Aug 19, 2010 at 04:48:25AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
>  arch/arm/boards/scb9328/scb9328.c |    1 +
>  drivers/net/dm9000.c              |    6 ++++--
>  include/dm9000.h                  |    1 +
>  3 files changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/boards/scb9328/scb9328.c b/arch/arm/boards/scb9328/scb9328.c
> index e781393..3c04996 100644
> --- a/arch/arm/boards/scb9328/scb9328.c
> +++ b/arch/arm/boards/scb9328/scb9328.c
> @@ -55,6 +55,7 @@ static struct dm9000_platform_data dm9000_data = {
>  	.iobase   = 0x16000000,
>  	.iodata   = 0x16000004,
>  	.buswidth = DM9000_WIDTH_16,
> +	.srom     = 1;
>  };
>  
>  static struct device_d dm9000_dev = {
> diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
> index 2062c66..5f61ddc 100644
> --- a/drivers/net/dm9000.c
> +++ b/drivers/net/dm9000.c
> @@ -498,8 +498,10 @@ static int dm9000_probe(struct device_d *dev)
>  	edev->send = dm9000_eth_send;
>  	edev->recv = dm9000_eth_rx;
>  	edev->halt = dm9000_eth_halt;
> -	edev->get_ethaddr = dm9000_get_ethaddr;
> -	edev->set_ethaddr = dm9000_set_ethaddr;
> +	if (pdata->srom) {
> +		edev->get_ethaddr = dm9000_get_ethaddr;
> +		edev->set_ethaddr = dm9000_set_ethaddr;
> +	}

edev->set_ethaddr is not an optional call. Without it the driver won't
work.

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From plagnioj at jcrosoft.com  Thu Aug 19 02:40:29 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 08:40:29 +0200
Subject: [PATCH 1/6 v2] dm9000: allow to specify that no srom is present
In-Reply-To: <1282186110-32738-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282186110-32738-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1282200029-22420-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
v2:

	keep set_ethaddr

Best Regards,
J.
 arch/arm/boards/scb9328/scb9328.c |    1 +
 drivers/net/dm9000.c              |    3 ++-
 include/dm9000.h                  |    1 +
 3 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/arch/arm/boards/scb9328/scb9328.c b/arch/arm/boards/scb9328/scb9328.c
index e781393..3c04996 100644
--- a/arch/arm/boards/scb9328/scb9328.c
+++ b/arch/arm/boards/scb9328/scb9328.c
@@ -55,6 +55,7 @@ static struct dm9000_platform_data dm9000_data = {
 	.iobase   = 0x16000000,
 	.iodata   = 0x16000004,
 	.buswidth = DM9000_WIDTH_16,
+	.srom     = 1;
 };
 
 static struct device_d dm9000_dev = {
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 2062c66..ab06735 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -498,8 +498,9 @@ static int dm9000_probe(struct device_d *dev)
 	edev->send = dm9000_eth_send;
 	edev->recv = dm9000_eth_rx;
 	edev->halt = dm9000_eth_halt;
-	edev->get_ethaddr = dm9000_get_ethaddr;
 	edev->set_ethaddr = dm9000_set_ethaddr;
+	if (pdata->srom)
+		edev->get_ethaddr = dm9000_get_ethaddr;
 
 	/* RESET device */
 	dm9000_reset(priv);
diff --git a/include/dm9000.h b/include/dm9000.h
index 3cc5235..b4a04b1 100644
--- a/include/dm9000.h
+++ b/include/dm9000.h
@@ -10,6 +10,7 @@ struct dm9000_platform_data {
 	unsigned long iobase;
 	unsigned long iodata;
 	int buswidth;
+	int srom;
 };
 
 #endif /* __DM9000_H__ */
-- 
1.7.1



From plagnioj at jcrosoft.com  Thu Aug 19 02:42:21 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 08:42:21 +0200
Subject: [PATCH 1/6 v2] dm9000: allow to specify that no srom is present
In-Reply-To: <1282200029-22420-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282186110-32738-1-git-send-email-plagnioj@jcrosoft.com>
	<1282200029-22420-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100819064221.GH454@game.jcrosoft.org>

On 08:40 Thu 19 Aug     , Jean-Christophe PLAGNIOL-VILLARD wrote:
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
> v2:
> 
> 	keep set_ethaddr
git://git.jcrosoft.org branch at91 updated

Best Regards,
J.


From plagnioj at jcrosoft.com  Thu Aug 19 02:43:48 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 08:43:48 +0200
Subject: [PATCH 1/2] misc: introduce string_to_bin
In-Reply-To: <20100805141304.GD3004@jasper.tkos.co.il>
References: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
	<20100805122349.GC24069@game.jcrosoft.org>
	<20100805124307.GC3004@jasper.tkos.co.il>
	<20100805134114.GE24069@game.jcrosoft.org>
	<20100805141304.GD3004@jasper.tkos.co.il>
Message-ID: <20100819064347.GI454@game.jcrosoft.org>

On 17:13 Thu 05 Aug     , Baruch Siach wrote:
> Hi Jean-Christophe,
> 
> On Thu, Aug 05, 2010 at 03:41:14PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > On 15:43 Thu 05 Aug     , Baruch Siach wrote:
> > > On Thu, Aug 05, 2010 at 02:23:49PM +0200, Jean-Christophe PLAGNIOL-VILLARD 
> > > wrote:
> > > > 	how about use the kernel printf format instead
> > > 
> > > How can I use printf to convert a string representation to binary?
> > as example for ethernet address on the kernel we use %M or for UUID we %U to
> > print it in the right format. so take a look on vsprintf.c
> 
> This is good for converting binary values to strings, not the other way around 
> as we do here.
It's the same here u can do %xs to print it as hexa so it will be easier to
use

Best Regards,
J.


From s.hauer at pengutronix.de  Thu Aug 19 02:52:23 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Thu, 19 Aug 2010 08:52:23 +0200
Subject: [PATCH 2/6] at91: Introduction of at91sam9261 SOC.
In-Reply-To: <1282186110-32738-2-git-send-email-plagnioj@jcrosoft.com>
References: <20100819024811.GG454@game.jcrosoft.org>
	<1282186110-32738-2-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100819065223.GD27749@pengutronix.de>

On Thu, Aug 19, 2010 at 04:48:26AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> AT91sam9261 series is an ARM 926ej-s SOC family clocked at 190/100MHz.
> 
> The first board that embeds at91sam9261 chip is the AT91SAM9261-EK.
> http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
>  arch/arm/Makefile                                  |    1 +
>  arch/arm/boards/at91sam9261ek/Makefile             |    1 +
>  arch/arm/boards/at91sam9261ek/config.h             |  110 +++++++++
>  arch/arm/boards/at91sam9261ek/env/bin/_update      |   36 +++
>  arch/arm/boards/at91sam9261ek/env/bin/boot         |   47 ++++
>  arch/arm/boards/at91sam9261ek/env/bin/hush_hack    |    1 +
>  arch/arm/boards/at91sam9261ek/env/bin/init         |   38 +++
>  .../at91sam9261ek/env/bin/update_barebox_xmodem    |   26 ++
>  .../arm/boards/at91sam9261ek/env/bin/update_kernel |   15 ++
>  arch/arm/boards/at91sam9261ek/env/bin/update_root  |   16 ++
>  arch/arm/boards/at91sam9261ek/env/config           |   28 +++

Care to use the generic environment? What's missing in it for you to use
it?

>  arch/arm/boards/at91sam9261ek/init.c               |  170 ++++++++++++++
>  arch/arm/configs/at91sam9261ek_defconfig           |  242 ++++++++++++++++++++
>  arch/arm/mach-at91/Kconfig                         |   23 ++
>  arch/arm/mach-at91/Makefile                        |    1 +
>  arch/arm/mach-at91/at91sam9261.c                   |  230 +++++++++++++++++++
>  arch/arm/mach-at91/at91sam9261_devices.c           |  169 ++++++++++++++
>  arch/arm/mach-at91/include/mach/at91sam9261.h      |  109 +++++++++

Can you please make two patches out of this? One for the architecture
support and another one for the board support.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From s.hauer at pengutronix.de  Thu Aug 19 04:29:22 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Thu, 19 Aug 2010 10:29:22 +0200
Subject: [PATCH] Add Menu Framework
In-Reply-To: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100819082922.GE27749@pengutronix.de>

On Thu, Aug 19, 2010 at 05:53:22AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Introduce a menu framework that allow us to create list menu to simplify
> barebox and make it more user-frendly
> 
> This kind of menu is very usefull when you do not have a keyboard or a
> serial console attached to your board to allow you to interract with
> barebox

\o/ Cool! I really like it.

This is simple and still very flexible.

Some things which came up during testing:

- I get a data abort when trying to remove a menu without removing the
  entries first. example:

barebox at Phytec phyCORE-i.MX31:/ menu -a -m boot -d "Boot Menu"
barebox at Phytec phyCORE-i.MX31:/ menu -e -a -m boot -c boot -d "Boot"
barebox at Phytec phyCORE-i.MX31:/ menu -r -m boot
data abort
pc : [<87f05058>]    lr : [<87f05098>]
sp : 87affe20  ip : 87f20794  fp : 00000004
r10: 00000002  r9 : 00000000  r8 : 00200200
r7 : 00100100  r6 : 87b0daf8  r5 : 87b0db18  r4 : 001000f0
r3 : 87b0db18  r2 : 87b0db18  r1 : 003b7fff  r0 : 001000f0
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...

- do_menu could use a if (!argc) return COMMAND_ERROR_USAGE;

- It would be nice to have an option to directly create a submenu on the
  command line (though this can be added later). So instead of doing

menu -e -a -m boot -c "menu -s -m network" -R -d "Network settings ->"

we could have a

menu -e -a -m boot -u network -R -d "Network settings ->"

We could than automatically add a 'back' entry if a menu is a submenu.

- It shouldn't be possible to add the same menu twice. example:

barebox at Phytec phyCORE-i.MX31:/ menu -a -m boot -d "Boot Menu"
barebox at Phytec phyCORE-i.MX31:/ menu -a -m boot -d "Boot Menu"
barebox at Phytec phyCORE-i.MX31:/ menu -l
boot: Boot Menu
boot: Boot Menu
barebox at Phytec phyCORE-i.MX31:/

- Removing entries does not work as expected. example:

menu -a -m boot -d "Boot Menu"
menu -e -a -m boot -c boot -d "Boot"
menu -e -a -m boot -c reset -d "Reset"
menu -e -a -m boot -c "exit" -d "Command line"
menu -e -r -m boot -n 1
menu -s -m boot

As expected the first entry is missing, but instead an empty line is
printed. When I then try to add an entry after this the menu is corrupt.

- commands should always return positive error codes. A good practice is
  to pass -E* values up to do_menu, use strerror() to print the error
  code and return 1 afterwards.

> +		switch(opt) {
> +		case 'm':
> +			cm.menu = optarg;
> +			break;
> +			break;
> +		case 'l':
> +			cm.action = action_list;
> +			break;
> +		case 's':
> +			cm.action = action_show;
> +			break;
> +#if defined(CONFIG_CMD_MENU_MANAGEMENT)
> +		case 'e':
> +			cm.entry = 1;
> +		case 'a':

There is a 'break' missing here.

> +			cm.action = action_add;
> +			break;
> +		case 'r':
> +			cm.action = action_remove;
> +			break;
> +		case 'c':
> +			cm.command = optarg;
> +			break;

Thank you for this work. I really appreciate it ;)

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From baruch at tkos.co.il  Thu Aug 19 08:37:12 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Thu, 19 Aug 2010 15:37:12 +0300
Subject: [PATCH 1/2] misc: introduce string_to_bin
In-Reply-To: <20100819064347.GI454@game.jcrosoft.org>
References: <f375ed4cd64b27529dd717f6f39518eb261e1853.1281007209.git.baruch@tkos.co.il>
	<20100805122349.GC24069@game.jcrosoft.org>
	<20100805124307.GC3004@jasper.tkos.co.il>
	<20100805134114.GE24069@game.jcrosoft.org>
	<20100805141304.GD3004@jasper.tkos.co.il>
	<20100819064347.GI454@game.jcrosoft.org>
Message-ID: <20100819123712.GC2421@tarshish>

Hi Jean-Christophe,

On Thu, Aug 19, 2010 at 08:43:48AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 17:13 Thu 05 Aug     , Baruch Siach wrote:
> > On Thu, Aug 05, 2010 at 03:41:14PM +0200, Jean-Christophe PLAGNIOL-VILLARD 
> > wrote:
> > > On 15:43 Thu 05 Aug     , Baruch Siach wrote:
> > > > On Thu, Aug 05, 2010 at 02:23:49PM +0200, Jean-Christophe PLAGNIOL-VILLARD 
> > > > wrote:
> > > > > 	how about use the kernel printf format instead
> > > > 
> > > > How can I use printf to convert a string representation to binary?
> > > as example for ethernet address on the kernel we use %M or for UUID we %U to
> > > print it in the right format. so take a look on vsprintf.c
> > 
> > This is good for converting binary values to strings, not the other way around 
> > as we do here.
> It's the same here u can do %xs to print it as hexa so it will be easier to
> use

Apparently I'm missing something obvious here. I'll try to clarify how I see 
things. Feel free to correct my understanding.

The various printf() variants take binary data as an argument, and translate 
it into a string representation, according to the format string.

The purposed string_to_bin() function does the opposite. It takes a string 
argument

const char* mac_str = "01:02:03:04:05:06";

and return the binary equivalent of this string in the buf pointer:

u8 mac[6];

string_to_bin(mac_str, mac, 6)

now the mac[] array contains the binary representation of the string mac_str, 
in big-endian order.

I've found no way to do the same with printf.

baruch

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From plagnioj at jcrosoft.com  Thu Aug 19 11:42:18 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 19 Aug 2010 17:42:18 +0200
Subject: [PATCH 2/6] at91: Introduction of at91sam9261 SOC.
In-Reply-To: <20100819065223.GD27749@pengutronix.de>
References: <20100819024811.GG454@game.jcrosoft.org>
	<1282186110-32738-2-git-send-email-plagnioj@jcrosoft.com>
	<20100819065223.GD27749@pengutronix.de>
Message-ID: <20100819154218.GK454@game.jcrosoft.org>

On 08:52 Thu 19 Aug     , Sascha Hauer wrote:
> On Thu, Aug 19, 2010 at 04:48:26AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > AT91sam9261 series is an ARM 926ej-s SOC family clocked at 190/100MHz.
> > 
> > The first board that embeds at91sam9261 chip is the AT91SAM9261-EK.
> > http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820
> > 
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> > ---
> >  arch/arm/Makefile                                  |    1 +
> >  arch/arm/boards/at91sam9261ek/Makefile             |    1 +
> >  arch/arm/boards/at91sam9261ek/config.h             |  110 +++++++++
> >  arch/arm/boards/at91sam9261ek/env/bin/_update      |   36 +++
> >  arch/arm/boards/at91sam9261ek/env/bin/boot         |   47 ++++
> >  arch/arm/boards/at91sam9261ek/env/bin/hush_hack    |    1 +
> >  arch/arm/boards/at91sam9261ek/env/bin/init         |   38 +++
> >  .../at91sam9261ek/env/bin/update_barebox_xmodem    |   26 ++
> >  .../arm/boards/at91sam9261ek/env/bin/update_kernel |   15 ++
> >  arch/arm/boards/at91sam9261ek/env/bin/update_root  |   16 ++
> >  arch/arm/boards/at91sam9261ek/env/config           |   28 +++
> 
> Care to use the generic environment? What's missing in it for you to use
> it?
miss it in the code
> 
> >  arch/arm/boards/at91sam9261ek/init.c               |  170 ++++++++++++++
> >  arch/arm/configs/at91sam9261ek_defconfig           |  242 ++++++++++++++++++++
> >  arch/arm/mach-at91/Kconfig                         |   23 ++
> >  arch/arm/mach-at91/Makefile                        |    1 +
> >  arch/arm/mach-at91/at91sam9261.c                   |  230 +++++++++++++++++++
> >  arch/arm/mach-at91/at91sam9261_devices.c           |  169 ++++++++++++++
> >  arch/arm/mach-at91/include/mach/at91sam9261.h      |  109 +++++++++
> 
> Can you please make two patches out of this? One for the architecture
> support and another one for the board support.
Personnaly I prefer to add the first board at the same as e do for the kernel
otherwise ok

Best Regards,
J.


From plagnioj at jcrosoft.com  Thu Aug 19 23:21:01 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 20 Aug 2010 05:21:01 +0200
Subject: [PATCH] Add Menu Framework
In-Reply-To: <20100819082922.GE27749@pengutronix.de>
References: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
	<20100819082922.GE27749@pengutronix.de>
Message-ID: <20100820032101.GA8693@game.jcrosoft.org>

On 10:29 Thu 19 Aug     , Sascha Hauer wrote:
> On Thu, Aug 19, 2010 at 05:53:22AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > Introduce a menu framework that allow us to create list menu to simplify
> > barebox and make it more user-frendly
> > 
> > This kind of menu is very usefull when you do not have a keyboard or a
> > serial console attached to your board to allow you to interract with
> > barebox
> 
> \o/ Cool! I really like it.
> 
> This is simple and still very flexible.
> 
> Some things which came up during testing:
> 
> - I get a data abort when trying to remove a menu without removing the
>   entries first. example:
> 
> barebox at Phytec phyCORE-i.MX31:/ menu -a -m boot -d "Boot Menu"
> barebox at Phytec phyCORE-i.MX31:/ menu -e -a -m boot -c boot -d "Boot"
> barebox at Phytec phyCORE-i.MX31:/ menu -r -m boot
> data abort
> pc : [<87f05058>]    lr : [<87f05098>]
> sp : 87affe20  ip : 87f20794  fp : 00000004
> r10: 00000002  r9 : 00000000  r8 : 00200200
> r7 : 00100100  r6 : 87b0daf8  r5 : 87b0db18  r4 : 001000f0
> r3 : 87b0db18  r2 : 87b0db18  r1 : 003b7fff  r0 : 001000f0
> Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
> Resetting CPU ...
> 
FIx
> - do_menu could use a if (!argc) return COMMAND_ERROR_USAGE;
> 
too
> - It would be nice to have an option to directly create a submenu on the
>   command line (though this can be added later). So instead of doing
> 
> menu -e -a -m boot -c "menu -s -m network" -R -d "Network settings ->"
> 
> we could have a
> 
> menu -e -a -m boot -u network -R -d "Network settings ->"
> 
> We could than automatically add a 'back' entry if a menu is a submenu.
I disagree here about the automatic adding of a 'back" entry
as you may want to put at the top or the bottom or where ever you want and you
may not write the menu in English or the text "Back"
so I will prefer to let it done manually as this

menu -a -m boot -d "Boot Menu"
menu -a -m network -d "Network settings"
menu -e -a -m network -c "echo ok" -R -d "test"
menu -e -a -m network -u boot -d "Back"
menu -e -a -m boot -u network -d "Network settings ->"
menu -e -a -m boot -c reset -R -d "Exit"

> 
> - It shouldn't be possible to add the same menu twice. example:
> 
> barebox at Phytec phyCORE-i.MX31:/ menu -a -m boot -d "Boot Menu"
> barebox at Phytec phyCORE-i.MX31:/ menu -a -m boot -d "Boot Menu"
> barebox at Phytec phyCORE-i.MX31:/ menu -l
> boot: Boot Menu
> boot: Boot Menu
> barebox at Phytec phyCORE-i.MX31:/
fix
> 
> - Removing entries does not work as expected. example:
> 
> menu -a -m boot -d "Boot Menu"
> menu -e -a -m boot -c boot -d "Boot"
> menu -e -a -m boot -c reset -d "Reset"
> menu -e -a -m boot -c "exit" -d "Command line"
> menu -e -r -m boot -n 1
> menu -s -m boot
fix
> 
> - commands should always return positive error codes. A good practice is
>   to pass -E* values up to do_menu, use strerror() to print the error
>   code and return 1 afterwards.
I agree but but of the time there is no -E* related to this Framework

so do u want to create them?
> 
> > +		switch(opt) {
> > +		case 'm':
> > +			cm.menu = optarg;
> > +			break;
> > +			break;
> > +		case 'l':
> > +			cm.action = action_list;
> > +			break;
> > +		case 's':
> > +			cm.action = action_show;
> > +			break;
> > +#if defined(CONFIG_CMD_MENU_MANAGEMENT)
> > +		case 'e':
> > +			cm.entry = 1;
> > +		case 'a':
> 
> There is a 'break' missing here.
> 
fix
> > +			cm.action = action_add;
> > +			break;
> > +		case 'r':
> > +			cm.action = action_remove;
> > +			break;
> > +		case 'c':
> > +			cm.command = optarg;
> > +			break;
> 
> Thank you for this work. I really appreciate it ;)
Your welcome
My goal was to make the bootloader more easy to use for end user and device without keyboard

and keep 2 API
commands as it's easy to manage at run time

and C for very complex menu

I plan to have this also via FrameBuffer and with a background image
so maybe barebox could replace grub & co aneday :)

Best Regards,
J.


From s.hauer at pengutronix.de  Fri Aug 20 02:38:22 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Fri, 20 Aug 2010 08:38:22 +0200
Subject: [PATCH] Add Menu Framework
In-Reply-To: <20100820032101.GA8693@game.jcrosoft.org>
References: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
	<20100819082922.GE27749@pengutronix.de>
	<20100820032101.GA8693@game.jcrosoft.org>
Message-ID: <20100820063822.GH27749@pengutronix.de>

On Fri, Aug 20, 2010 at 05:21:01AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > menu -e -a -m boot -c "menu -s -m network" -R -d "Network settings ->"
> > 
> > we could have a
> > 
> > menu -e -a -m boot -u network -R -d "Network settings ->"
> > 
> > We could than automatically add a 'back' entry if a menu is a submenu.
> I disagree here about the automatic adding of a 'back" entry
> as you may want to put at the top or the bottom or where ever you want and you
> may not write the menu in English or the text "Back"
> so I will prefer to let it done manually as this
> 
> menu -a -m boot -d "Boot Menu"
> menu -a -m network -d "Network settings"
> menu -e -a -m network -c "echo ok" -R -d "test"
> menu -e -a -m network -u boot -d "Back"
> menu -e -a -m boot -u network -d "Network settings ->"
> menu -e -a -m boot -c reset -R -d "Exit"

That's better, agreed.

> 
> > 
> > - It shouldn't be possible to add the same menu twice. example:
> > 
> > barebox at Phytec phyCORE-i.MX31:/ menu -a -m boot -d "Boot Menu"
> > barebox at Phytec phyCORE-i.MX31:/ menu -a -m boot -d "Boot Menu"
> > barebox at Phytec phyCORE-i.MX31:/ menu -l
> > boot: Boot Menu
> > boot: Boot Menu
> > barebox at Phytec phyCORE-i.MX31:/
> fix
> > 
> > - Removing entries does not work as expected. example:
> > 
> > menu -a -m boot -d "Boot Menu"
> > menu -e -a -m boot -c boot -d "Boot"
> > menu -e -a -m boot -c reset -d "Reset"
> > menu -e -a -m boot -c "exit" -d "Command line"
> > menu -e -r -m boot -n 1
> > menu -s -m boot
> fix
> > 
> > - commands should always return positive error codes. A good practice is
> >   to pass -E* values up to do_menu, use strerror() to print the error
> >   code and return 1 afterwards.
> I agree but but of the time there is no -E* related to this Framework
> 
> so do u want to create them?

No. The use of strerror might not be appropriate here, but all functions
used should return some error value instead of -1, with -EINVAL as
fallback when no better value can be found.

> > 
> > There is a 'break' missing here.
> > 
> fix
> > > +			cm.action = action_add;
> > > +			break;
> > > +		case 'r':
> > > +			cm.action = action_remove;
> > > +			break;
> > > +		case 'c':
> > > +			cm.command = optarg;
> > > +			break;
> > 
> > Thank you for this work. I really appreciate it ;)
> Your welcome
> My goal was to make the bootloader more easy to use for end user and
> device without keyboard

Do you know openmoko? They also have a menu in U-Boot, but it's more or
less hardcoded to their exact needs.

> 
> and keep 2 API
> commands as it's easy to manage at run time
> 
> and C for very complex menu
> 
> I plan to have this also via FrameBuffer and with a background image
> so maybe barebox could replace grub & co aneday :)

A long way to go ;)

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From plagnioj at jcrosoft.com  Fri Aug 20 02:51:39 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 20 Aug 2010 08:51:39 +0200
Subject: [PATCH] Add Menu Framework
In-Reply-To: <20100820063822.GH27749@pengutronix.de>
References: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
	<20100819082922.GE27749@pengutronix.de>
	<20100820032101.GA8693@game.jcrosoft.org>
	<20100820063822.GH27749@pengutronix.de>
Message-ID: <20100820065139.GG8693@game.jcrosoft.org>

> > > 
> > > - commands should always return positive error codes. A good practice is
> > >   to pass -E* values up to do_menu, use strerror() to print the error
> > >   code and return 1 afterwards.
> > I agree but but of the time there is no -E* related to this Framework
> > 
> > so do u want to create them?
> 
> No. The use of strerror might not be appropriate here, but all functions
> used should return some error value instead of -1, with -EINVAL as
> fallback when no better value can be found.
ok
> 
> > > 
> > > There is a 'break' missing here.
> > > 
> > fix
> > > > +			cm.action = action_add;
> > > > +			break;
> > > > +		case 'r':
> > > > +			cm.action = action_remove;
> > > > +			break;
> > > > +		case 'c':
> > > > +			cm.command = optarg;
> > > > +			break;
> > > 
> > > Thank you for this work. I really appreciate it ;)
> > Your welcome
> > My goal was to make the bootloader more easy to use for end user and
> > device without keyboard
> 
> Do you know openmoko? They also have a menu in U-Boot, but it's more or
> less hardcoded to their exact needs.
yeah I known, Denk force me to take a look at it when I send my patch to u-boot
ML but as you said everything is hardcoded and very limited
and for the record my code is NOT based on there work :)
so as I said him I do not like there stuff and think this one is as you said
flexible and simple

> > 
> > I plan to have this also via FrameBuffer and with a background image
> > so maybe barebox could replace grub & co aneday :)
> 
> A long way to go ;)
but a good target :-)

Best Regards,
J.


From r.schwebel at pengutronix.de  Fri Aug 20 03:09:32 2010
From: r.schwebel at pengutronix.de (Robert Schwebel)
Date: Fri, 20 Aug 2010 09:09:32 +0200
Subject: [PATCH] Add Menu Framework
In-Reply-To: <20100820065139.GG8693@game.jcrosoft.org>
References: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
	<20100819082922.GE27749@pengutronix.de>
	<20100820032101.GA8693@game.jcrosoft.org>
	<20100820063822.GH27749@pengutronix.de>
	<20100820065139.GG8693@game.jcrosoft.org>
Message-ID: <20100820070932.GT30096@pengutronix.de>

On Fri, Aug 20, 2010 at 08:51:39AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > > I plan to have this also via FrameBuffer and with a background image
> > > so maybe barebox could replace grub & co aneday :)
> >
> > A long way to go ;)
>
> but a good target :-)

Note that J?rgen has already pushed initial x86 support (ontop of BIOS)
into Barebox. What's mainly needed to be useful for people is:

- framebuffer console
- support for fetchin the kernel from filesystems

rsc
-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From plagnioj at jcrosoft.com  Fri Aug 20 04:18:27 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 20 Aug 2010 10:18:27 +0200
Subject: [PATCH] Add Menu Framework
In-Reply-To: <20100820070932.GT30096@pengutronix.de>
References: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
	<20100819082922.GE27749@pengutronix.de>
	<20100820032101.GA8693@game.jcrosoft.org>
	<20100820063822.GH27749@pengutronix.de>
	<20100820065139.GG8693@game.jcrosoft.org>
	<20100820070932.GT30096@pengutronix.de>
Message-ID: <20100820081827.GH8693@game.jcrosoft.org>

On 09:09 Fri 20 Aug     , Robert Schwebel wrote:
> On Fri, Aug 20, 2010 at 08:51:39AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > > > I plan to have this also via FrameBuffer and with a background image
> > > > so maybe barebox could replace grub & co aneday :)
> > >
> > > A long way to go ;)
> >
> > but a good target :-)
> 
> Note that J?rgen has already pushed initial x86 support (ontop of BIOS)
> into Barebox. What's mainly needed to be useful for people is:
> 
> - framebuffer console
> - support for fetchin the kernel from filesystems
so we are not so far as for some project I need also fs support

Best Regards,
J.


From plagnioj at jcrosoft.com  Fri Aug 20 04:22:47 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 20 Aug 2010 10:22:47 +0200
Subject: [PATCH 1/2 v2] Add Menu Framework
In-Reply-To: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1282292568-3994-1-git-send-email-plagnioj@jcrosoft.com>

Introduce a menu framework that allow us to create list menu to simplify
barebox and make it more user-frendly

This kind of menu is very usefull when you do not have a keyboard or a
serial console attached to your board to allow you to interract with
barebox

For the develloper part,
The framework introduce two API

1) C
that allow you to create menu, submenu, entry and complex menu action

2) Command
that allow you as the C API to create menu, submenu, entry and complex
menu action but this time the actions will be store in a function and
then be evaluated and excecuted at runtime.

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
V2:
	bug fix

Best Regards,
J.
 commands/Kconfig  |   10 +
 commands/Makefile |    1 +
 commands/menu.c   |  481 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 common/Kconfig    |    7 +
 common/Makefile   |    1 +
 common/menu.c     |  315 +++++++++++++++++++++++++++++++++++
 include/menu.h    |   87 ++++++++++
 include/readkey.h |    5 +
 8 files changed, 907 insertions(+), 0 deletions(-)
 create mode 100644 commands/menu.c
 create mode 100644 common/menu.c
 create mode 100644 include/menu.h

diff --git a/commands/Kconfig b/commands/Kconfig
index 1ffc826..57c9b75 100644
--- a/commands/Kconfig
+++ b/commands/Kconfig
@@ -50,6 +50,16 @@ config CMD_FALSE
 	default y
 	prompt "false"
 
+config CMD_MENU
+	tristate
+	depends on MENU
+	prompt "menu"
+
+config CMD_MENU_MANAGEMENT
+	tristate
+	depends on CMD_MENU
+	prompt "menu scripts management"
+
 endmenu
 
 menu "file commands                 "
diff --git a/commands/Makefile b/commands/Makefile
index b99f042..154a778 100644
--- a/commands/Makefile
+++ b/commands/Makefile
@@ -50,3 +50,4 @@ obj-$(CONFIG_CMD_GPIO)		+= gpio.o
 obj-$(CONFIG_CMD_UNLZO)		+= unlzo.o
 obj-$(CONFIG_CMD_I2C)		+= i2c.o
 obj-$(CONFIG_CMD_UBI)		+= ubi.o
+obj-$(CONFIG_CMD_MENU)		+= menu.o
diff --git a/commands/menu.c b/commands/menu.c
new file mode 100644
index 0000000..c1bd0e2
--- /dev/null
+++ b/commands/menu.c
@@ -0,0 +1,481 @@
+/*
+ * (C) Copyright 2009-2010 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.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; version 2 of
+ * the License.
+ *
+ * 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 <command.h>
+#include <readkey.h>
+#include <menu.h>
+#include <getopt.h>
+#include <errno.h>
+
+typedef enum {
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+	action_add,
+	action_remove,
+	action_select,
+#endif
+	action_list,
+	action_show,
+} menu_action;
+
+struct cmd_menu {
+	char		*menu;
+	menu_action	action;
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+	int		entry;
+	int		re_entrant;
+	char		*description;
+	char		*command;
+	int		num;
+#endif
+};
+
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+#define OPTS		"m:earlc:d:RsSn:"
+#define	is_entry(x)	((x)->entry)
+#else
+#define OPTS		"m:ls"
+#define	is_entry(x)	(0)
+#endif
+
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+/*
+ * menu -e -a -m <menu> -c <command> [-R] -d <description>
+ */
+static int do_menu_entry_add(struct cmd_menu *cm)
+{
+	struct menu_entry *me;
+	struct menu *m;
+	int len;
+	int ret = -ENOMEM;
+
+	if (!cm->menu || !cm->command || !cm->description)
+		return -EINVAL;
+
+	m = menu_get_by_name(cm->menu);
+
+	if (!m) {
+		eprintf("Menu '%s' not found\n", cm->menu);
+		return -EINVAL;
+	}
+
+	me = menu_entry_alloc();
+
+	if (!me)
+		goto free;
+
+	me->action = menu_action_run;
+
+	len = strlen(cm->command) + 1;
+
+	me->priv = calloc(len, sizeof(char));
+
+	if (!me->priv)
+		goto free;
+
+	strncpy(me->priv, cm->command, len);
+
+	len = strlen(cm->description) + 1;
+
+	me->display = calloc(len, sizeof(char));;
+
+	if (!m->display)
+		goto free;
+
+	strncpy(me->display, cm->description, len);
+
+	ret = menu_add_entry(m, me);
+
+	if (ret)
+		goto free;
+
+	me->non_re_ent = !cm->re_entrant;
+
+	return 0;
+
+free:
+	eputs("Entry add fail\n");
+
+	free(me->priv);
+
+	menu_entry_free(me);
+
+	return ret;
+}
+
+/*
+ * menu -e -r -m <name> -n <num>
+ */
+static int do_menu_entry_remove(struct cmd_menu *cm)
+{
+	struct menu *m;
+	struct menu_entry *me;
+
+	if (!cm->menu || cm->num < 0)
+		return -EINVAL;
+
+	m = menu_get_by_name(cm->menu);
+
+	if (!m) {
+		eprintf("Menu '%s' not found\n", cm->menu);
+		return -EINVAL;
+	}
+
+	me = menu_entry_get_by_num(m, cm->num);
+
+	if (!me) {
+		eprintf("Entry '%s' not found\n", cm->num);
+		return -EINVAL;
+	}
+
+	menu_remove_entry(m, me);
+
+	menu_entry_free(me);
+
+	return 0;
+}
+
+/*
+ * menu -a -m <name> -d <description>
+ */
+static int do_menu_add(struct cmd_menu *cm)
+{
+	struct menu *m;
+	int len = 0;
+	int ret = -ENOMEM;
+
+	if (!cm->menu || !cm->description)
+		return -EINVAL;
+
+	m = menu_alloc();
+
+	if (!m)
+		goto free;
+
+	len = strlen(cm->menu) + 1;
+
+	m->name = calloc(len, sizeof(char));;
+	if (!m->name)
+		goto free;
+
+	strncpy(m->name, cm->menu, len);
+
+	len = strlen(cm->description) + 1;
+
+	m->display = calloc(len, sizeof(char));;
+
+	if (!m->display)
+		goto free;
+
+	strncpy(m->display, cm->description, len);
+
+	ret = menu_add(m);
+
+	if (ret)
+		goto free;
+
+	return 0;
+
+free:
+	eprintf("Menu '%s' add fail", cm->menu);
+	if (ret == -EEXIST)
+		eputs(" already exist");
+	eputs("\n");
+
+	menu_free(m);
+
+	return ret;
+}
+/*
+ * menu -r -m <name>
+ */
+static int do_menu_remove(struct cmd_menu *cm)
+{
+	struct menu *m;
+
+	m = menu_get_by_name(cm->menu);
+
+	if (!m) {
+		eprintf("Menu '%s' not found\n", cm->menu);
+		return -EINVAL;
+	}
+
+	menu_remove(m);
+
+	menu_free(m);
+
+	return 0;
+}
+
+/*
+ * menu -m <menu> -S -n <entry num starting at 1>
+ */
+static int do_menu_select(struct cmd_menu *cm)
+{
+	struct menu *m;
+
+	if (cm->num < 0)
+		return -EINVAL;
+
+	m = menu_get_by_name(cm->menu);
+
+	if (!m) {
+		eprintf("Menu '%s' not found\n", cm->menu);
+		return -EINVAL;
+	}
+
+	if (!menu_set_selected(m, cm->num)) {
+		eprintf("Entry '%d' not found\n", cm->num);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+#endif
+
+/*
+ * menu -s -m <menu>
+ */
+static int do_menu_show(struct cmd_menu *cm)
+{
+	struct menu *m;
+
+	if (cm->menu)
+		m = menu_get_by_name(cm->menu);
+	else
+		m = menu_get_by_name("boot");
+
+	return menu_show(m);
+}
+
+static void print_entries(struct menu *m)
+{
+	struct list_head *pos;
+	struct menu_entry *me;
+
+	list_for_each(pos, &(m->entries.list)) {
+		me = list_entry(pos, struct menu_entry, list);
+		printf("%d: %s\n", me->num, me->display);
+	}
+}
+
+/*
+ * menu -l
+ * menu -e -l [menu]
+ */
+static int do_menu_list(struct cmd_menu *cm)
+{
+	struct list_head *pos;
+	struct menu* m = NULL;
+	struct menu* menus = menu_get_menus();
+
+	if (is_entry(cm)) {
+		if (cm->menu)
+			m = menu_get_by_name(cm->menu);
+
+		if (m) {
+			print_entries(m);
+			return 0;
+		}
+	}
+
+	list_for_each(pos, &menus->list) {
+		m = list_entry(pos, struct menu, list);
+		printf("%s: %s\n", m->name, m->display? m->display : m->name);
+		if (is_entry(cm))
+			print_entries(m);
+	}
+
+	return 0;
+}
+
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+static int do_menu_entry(struct cmd_menu *cm)
+{
+	switch(cm->action) {
+	case action_list:
+		return do_menu_list(cm);
+	case action_remove:
+		return do_menu_entry_remove(cm);
+	case action_add:
+		return do_menu_entry_add(cm);
+	case action_select:
+	case action_show:
+		break;
+	}
+	return -EINVAL;
+}
+#else
+static int do_menu_entry(struct cmd_menu *cm)
+{
+	return -EINVAL;
+}
+#endif
+
+static int do_menu(struct command *cmdtp, int argc, char *argv[])
+{
+	struct cmd_menu cm;
+	int opt;
+	int ret = -EINVAL;
+
+	if (!argc)
+		return COMMAND_ERROR_USAGE;
+
+	memset(&cm, 0, sizeof(struct cmd_menu));
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+	cm.num = -EINVAL;
+#endif
+
+	cm.action = action_show;
+
+	while((opt = getopt(argc, argv, OPTS)) > 0) {
+		switch(opt) {
+		case 'm':
+			cm.menu = optarg;
+			break;
+		case 'l':
+			cm.action = action_list;
+			break;
+		case 's':
+			cm.action = action_show;
+			break;
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+		case 'e':
+			cm.entry = 1;
+			break;
+		case 'a':
+			cm.action = action_add;
+			break;
+		case 'r':
+			cm.action = action_remove;
+			break;
+		case 'c':
+			cm.command = optarg;
+			break;
+		case 'd':
+			cm.description = optarg;
+			break;
+		case 'R':
+			cm.re_entrant = 1;
+			break;
+		case 'S':
+			cm.action = action_select;
+			break;
+		case 'n':
+			cm.num = simple_strtoul(optarg, NULL, 10);
+			break;
+#endif
+		default:
+			return 1;
+		}
+	}
+
+	if (is_entry(&cm)) {
+		ret = do_menu_entry(&cm);
+		goto end;
+	}
+
+	switch(cm.action) {
+	case action_list:
+		ret = do_menu_list(&cm);
+		break;
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+	case action_remove:
+		ret = do_menu_remove(&cm);
+		break;
+	case action_add:
+		ret = do_menu_add(&cm);
+		break;
+	case action_select:
+		ret = do_menu_select(&cm);
+		break;
+#endif
+	case action_show:
+		ret = do_menu_show(&cm);
+		break;
+	}
+
+end:
+	if (ret)
+		return 0;
+
+	return 1;
+}
+
+static const __maybe_unused char cmd_menu_help[] =
+"Usage: menu [OPTION]... \n"
+"Manage Menu\n"
+"  -m  menu\n"
+"  -l  list\n"
+"  -s  show\n"
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+"Advanced\n"
+"  -e  menu entry\n"
+"  -a  add\n"
+"  -r  remove\n"
+"  -S  select\n"
+#endif
+"\n"
+"How to\n"
+"\n"
+"Show menu\n"
+"  menu -s -m <menu>\n"
+"\n"
+"List menu\n"
+"  menu -l\n"
+"\n"
+#if defined(CONFIG_CMD_MENU_MANAGEMENT)
+"Add a menu\n"
+"  menu -a -m <name> -d <description>\n"
+"\n"
+"Remove a menu\n"
+"  menu -r -m <name>\n"
+"\n"
+"Add an entry\n"
+"  (-R for do no exit the menu after executing the command)\n"
+"  menu -e -a -m <menu> -c <command> [-R] -d <description>\n"
+"\n"
+"Remove an entry\n"
+"  menu -e -r -m <name> -n <num>\n"
+"\n"
+"Select an entry\n"
+"  menu -m <menu> -S -n <entry num starting at 1>\n"
+"\n"
+"List menu\n"
+"  menu -e -l [menu]\n"
+"\n"
+"Menu example\n"
+"menu -a -m boot -d \"Boot Menu\"\n"
+"menu -e -a -m boot -c boot -d \"Boot\"\n"
+"menu -e -a -m boot -c reset -d \"Reset\"\n"
+"menu -s -m boot\n"
+#else
+"Menu example\n"
+"menu -s -m boot\n"
+#endif
+;
+
+BAREBOX_CMD_START(menu)
+	.cmd		= do_menu,
+	.usage		= "Menu Management",
+	BAREBOX_CMD_HELP(cmd_menu_help)
+BAREBOX_CMD_END
diff --git a/common/Kconfig b/common/Kconfig
index a58f242..c07c638 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -244,6 +244,13 @@ config AUTO_COMPLETE
 	depends on CMDLINE_EDITING
 	prompt "Enable auto completion"
 
+config MENU
+	bool
+	prompt "Menu Framework"
+	help
+	   a menu framework that allow us to create list menu to simplify
+	   barebox and make it more user-frendly
+
 config DYNAMIC_CRC_TABLE
 	bool
 	depends on CRC32
diff --git a/common/Makefile b/common/Makefile
index 14f8643..4b8cce0 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -15,6 +15,7 @@ obj-y += env.o
 obj-y += startup.o
 obj-y += misc.o
 obj-y += memsize.o
+obj-$(CONFIG_MENU) += menu.o
 obj-$(CONFIG_MODULES) += module.o
 extra-$(CONFIG_MODULES) += module.lds
 
diff --git a/common/menu.c b/common/menu.c
new file mode 100644
index 0000000..e03e4d1
--- /dev/null
+++ b/common/menu.c
@@ -0,0 +1,315 @@
+/*
+ * (C) Copyright 2009-2010 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.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; version 2 of
+ * the License.
+ *
+ * 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 <command.h>
+#include <environment.h>
+#include <init.h>
+#include <menu.h>
+#include <malloc.h>
+#include <xfuncs.h>
+#include <errno.h>
+#include <readkey.h>
+
+static struct menu menus;
+
+struct menu* menu_get_menus(void)
+{
+	return &menus;
+}
+
+void menu_free(struct menu *m)
+{
+	struct list_head *pos;
+	struct menu_entry *me;
+
+	if (!m)
+		return;
+	free(m->name);
+	free(m->display);
+
+	pos = &m->entries.list;
+
+	if (pos->prev != pos->next && pos->prev != 0)
+		list_for_each(pos, &m->entries.list) {
+			me = list_entry(pos, struct menu_entry, list);
+			menu_entry_free(me);
+		}
+
+	free(m);
+}
+
+int menu_add(struct menu *m)
+{
+	if (!m || !m->name)
+		return -EINVAL;
+
+	if (menu_get_by_name(m->name))
+		return -EEXIST;
+
+	list_add_tail(&m->list, &menus.list);
+
+	m->nb_entries = 0;
+
+	INIT_LIST_HEAD(&m->entries.list);
+
+	return 0;
+}
+
+void menu_remove(struct menu *m)
+{
+	if (!m)
+		return;
+
+	list_del(&m->list);
+}
+
+int menu_add_entry(struct menu *m, struct menu_entry *me)
+{
+	int len;
+
+	if (!m || !me || !me->display)
+		return -EINVAL;
+
+	len = strlen(me->display);
+
+	m->width = max(len, m->width);
+
+	m->nb_entries++;
+	me->num = m->nb_entries;
+	list_add_tail(&me->list, &m->entries.list);
+
+	return 0;
+}
+
+void menu_remove_entry(struct menu *m, struct menu_entry *me)
+{
+	struct list_head *pos;
+	int i = 1;
+
+	if (!m || !me)
+		return;
+
+	m->nb_entries--;
+	list_del(&me->list);
+
+	list_for_each(pos, &m->entries.list) {
+		me = list_entry(pos, struct menu_entry, list);
+		me->num = i++;
+	}
+}
+
+struct menu* menu_get_by_name(char *name)
+{
+	struct list_head *pos;
+	struct menu* m;
+
+	if (!name)
+		return NULL;
+
+	list_for_each(pos, &menus.list) {
+		m = list_entry(pos, struct menu, list);
+		if(strcmp(m->name, name) == 0)
+			return m;
+	}
+
+	return NULL;
+}
+
+struct menu_entry* menu_entry_get_by_num(struct menu* m, int num)
+{
+	struct list_head *pos;
+	struct menu_entry* me;
+
+	if (!m || num < 1 || num > m->nb_entries)
+		return NULL;
+
+	list_for_each(pos, &m->entries.list) {
+		me = list_entry(pos, struct menu_entry, list);
+		if(me->num == num)
+			return me;
+	}
+
+	return NULL;
+}
+
+void menu_entry_free(struct menu_entry *me)
+{
+	if (!me)
+		return;
+
+	free(me->display);
+	free(me);
+}
+
+static void print_menu_entry(struct menu *m, struct menu_entry *me, int reverse)
+{
+	gotoXY(me->num + 1, 3);
+	if (reverse)
+		printf_reverse("%d: %-*s", me->num, m->width, me->display);
+	else
+		printf("%d: %-*s", me->num, m->width, me->display);
+}
+
+int menu_set_selected_entry(struct menu *m, struct menu_entry* me)
+{
+	struct list_head *pos;
+	struct menu_entry* tmp;
+
+	if (!m || !me)
+		return -EINVAL;
+
+	list_for_each(pos, &m->entries.list) {
+		tmp = list_entry(pos, struct menu_entry, list);
+		if(me == tmp) {
+			m->selected = me;
+			return 0;
+		}
+	}
+
+	return -EINVAL;
+}
+
+int menu_set_selected(struct menu *m, int num)
+{
+	struct menu_entry *me;
+
+	me = menu_entry_get_by_num(m, num);
+
+	if (!me)
+		return -EINVAL;
+
+	m->selected = me;
+
+	return 0;
+}
+
+static void print_menu(struct menu *m)
+{
+	struct list_head *pos;
+	struct menu_entry *me;
+
+	clear();
+	gotoXY(1, 2);
+	if(m->display) {
+		puts(m->display);
+	} else {
+		puts("Menu : ");
+		puts(m->name);
+	}
+
+	list_for_each(pos, &m->entries.list) {
+		me = list_entry(pos, struct menu_entry, list);
+		if(m->selected != me)
+			print_menu_entry(m, me, 0);
+	}
+
+	if (!m->selected) {
+		m->selected = list_first_entry(&m->entries.list,
+						struct menu_entry, list);
+	}
+
+	print_menu_entry(m, m->selected, 1);
+}
+
+int menu_show(struct menu *m)
+{
+	int ch;
+	int escape = 0;
+
+	if(!m || list_empty(&m->entries.list))
+		return -EINVAL;
+
+	print_menu(m);
+
+	do {
+		ch = getc();
+		switch(ch) {
+		case 0x1b:
+			escape = 1;
+			break;
+		case '[':
+			if (escape)
+				break;
+		case 'A': /* up */
+			escape = 0;
+			print_menu_entry(m, m->selected, 0);
+			m->selected = list_entry(m->selected->list.prev, struct menu_entry,
+						 list);
+			if (&(m->selected->list) == &(m->entries.list)) {
+				m->selected = list_entry(m->selected->list.prev, struct menu_entry,
+							 list);
+			}
+			print_menu_entry(m, m->selected, 1);
+			break;
+		case 'B': /* down */
+			escape = 0;
+			print_menu_entry(m, m->selected, 0);
+			m->selected = list_entry(m->selected->list.next, struct menu_entry,
+						 list);
+			if (&(m->selected->list) == &(m->entries.list)) {
+				m->selected = list_entry(m->selected->list.next, struct menu_entry,
+							 list);
+			}
+			print_menu_entry(m, m->selected, 1);
+			break;
+		case '\n':
+		case '\r':
+			clear();
+			gotoXY(1,1);
+			m->selected->action(m, m->selected);
+			if (m->selected->non_re_ent)
+				return m->selected->num;
+			else
+				print_menu(m);
+		default:
+			break;
+		}
+	} while(1);
+
+	return 0;
+}
+
+void menu_action_exit(struct menu *m, struct menu_entry *me) {}
+
+void menu_action_run(struct menu *m, struct menu_entry *me)
+{
+	int ret;
+	const char *s = getenv((const char*)me->priv);
+
+	/* can be a command as boot */
+	if (!s)
+		s = me->priv;
+
+	ret = run_command (s, 0);
+
+	if (ret < 0)
+		udelay(1000000);
+}
+
+static int menu_init(void)
+{
+	INIT_LIST_HEAD(&menus.list);
+
+	return 0;
+}
+postcore_initcall(menu_init);
diff --git a/include/menu.h b/include/menu.h
new file mode 100644
index 0000000..29f18f2
--- /dev/null
+++ b/include/menu.h
@@ -0,0 +1,87 @@
+/*
+ * (C) Copyright 2009-2010 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.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; version 2 of
+ * the License.
+ *
+ * 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 __MENU_H__
+#define __MENU_H__
+
+#include <linux/list.h>
+#include <malloc.h>
+
+struct menu;
+
+struct menu_entry {
+	int num;
+	char *display;
+	void (*action)(struct menu *m, struct menu_entry *me);
+	int non_re_ent;
+
+	struct list_head list;
+	void *priv;
+};
+
+struct menu {
+	char *name;
+	char *display;
+
+	struct list_head list;
+	struct menu_entry entries;
+	int nb_entries;
+	int width;
+	struct menu_entry *selected;
+	void *priv;
+};
+
+/*
+ * menu functions
+ */
+static inline struct menu* menu_alloc(void)
+{
+	return calloc(1, sizeof(struct menu));
+}
+void menu_free(struct menu *m);
+int menu_add(struct menu* m);
+void menu_remove(struct menu *m);
+struct menu* menu_get_by_name(char *name);
+int menu_show(struct menu *m);
+int menu_set_selected_entry(struct menu *m, struct menu_entry* me);
+int menu_set_selected(struct menu *m, int num);
+struct menu* menu_get_menus(void);
+
+/*
+ * menu entry functions
+ */
+static inline struct menu_entry* menu_entry_alloc(void)
+{
+	return calloc(1, sizeof(struct menu_entry));
+}
+void menu_entry_free(struct menu_entry *me);
+int menu_add_entry(struct menu *m, struct menu_entry* me);
+void menu_remove_entry(struct menu *m, struct menu_entry *me);
+struct menu_entry* menu_entry_get_by_num(struct menu* m, int num);
+
+/*
+ * menu entry action functions
+ */
+void menu_action_run(struct menu *m, struct menu_entry *me);
+void menu_action_exit(struct menu *m, struct menu_entry *me);
+
+#endif /* __MENU_H__ */
diff --git a/include/readkey.h b/include/readkey.h
index 919af64..aabb835 100644
--- a/include/readkey.h
+++ b/include/readkey.h
@@ -22,6 +22,11 @@
 
 #define ANSI_CLEAR_SCREEN "\e[2J\e[;H"
 
+#define printf_reverse(fmt,args...)	printf("\e[7m" fmt "\e[m",##args)
+#define puts_reverse(fmt)		puts("\e[7m" fmt "\e[m")
+#define gotoXY(row, col)		printf("\e[%d;%dH", row, col)
+#define clear()				puts("\e[2J")
+
 int read_key(void);
 
 #endif /* READKEY_H */
-- 
1.7.1



From plagnioj at jcrosoft.com  Fri Aug 20 04:22:48 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 20 Aug 2010 10:22:48 +0200
Subject: [PATCH 2/2] Menu/cmd: add sub menu entry command support
In-Reply-To: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282190002-6807-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1282292568-3994-2-git-send-email-plagnioj@jcrosoft.com>

this will simplify the creation of navigation link

as this

menu -a -m boot -d "Boot Menu"
menu -a -m network -d "Network settings"
menu -e -a -m network -u boot -d "Back"
menu -e -a -m boot -u network -d "Network settings ->"
menu -e -a -m boot -c reset -R -d "Reset"
menu -e -a -m boot -c clear -d "Exit"
menu -s -m boot

in C

struct menu m_boot = {
	.name = "boot",
	.display = "Boot Menu",
};

struct menu m_network = {
	.name = "network",
	.display = "Network settings",
};

struct menu_entry e_to_network = {
	.display = "Network settings ->",
	.action = menu_action_show,
	.priv = &m_network,
};

struct menu_entry e_to_boot = {
	.display = "Back",
	.action = menu_action_show,
	.priv = &m_boot,
};

struct menu_entry e_reset = {
	.display = "Reset",
	.action = menu_action_run,
	.priv = "reset",
};

struct menu_entry e_exit = {
	.display = "Exit",
	.action = menu_action_run,
	.non_re_ent = 1,
	.priv = "clear",
};

void menu_test(void)
{
	menu_add(&m_boot);
	menu_add(&m_network);
	menu_add_entry(&m_boot, &e_to_network);
	menu_add_entry(&m_boot, &e_reset);
	menu_add_entry(&m_boot, &e_exit);
	menu_add_entry(&m_network, &e_to_boot);
	menu_show(&m_boot);
}



Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 commands/menu.c |   40 +++++++++++++++++++++++++++++++---------
 common/menu.c   |    7 +++++++
 include/menu.h  |    1 +
 3 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/commands/menu.c b/commands/menu.c
index c1bd0e2..237de9f 100644
--- a/commands/menu.c
+++ b/commands/menu.c
@@ -45,12 +45,13 @@ struct cmd_menu {
 	int		re_entrant;
 	char		*description;
 	char		*command;
+	char		*submenu;
 	int		num;
 #endif
 };
 
 #if defined(CONFIG_CMD_MENU_MANAGEMENT)
-#define OPTS		"m:earlc:d:RsSn:"
+#define OPTS		"m:earlc:d:RsSn:u:"
 #define	is_entry(x)	((x)->entry)
 #else
 #define OPTS		"m:ls"
@@ -60,15 +61,16 @@ struct cmd_menu {
 #if defined(CONFIG_CMD_MENU_MANAGEMENT)
 /*
  * menu -e -a -m <menu> -c <command> [-R] -d <description>
+ * menu -e -a -m <menu> -u submenu -d <description>
  */
 static int do_menu_entry_add(struct cmd_menu *cm)
 {
 	struct menu_entry *me;
-	struct menu *m;
+	struct menu *m, *sm;
 	int len;
 	int ret = -ENOMEM;
 
-	if (!cm->menu || !cm->command || !cm->description)
+	if (!cm->menu || (!cm->command && !cm->submenu) || !cm->description)
 		return -EINVAL;
 
 	m = menu_get_by_name(cm->menu);
@@ -83,16 +85,29 @@ static int do_menu_entry_add(struct cmd_menu *cm)
 	if (!me)
 		goto free;
 
-	me->action = menu_action_run;
+	if (cm->submenu) {
+		me->action = menu_action_show;
 
-	len = strlen(cm->command) + 1;
+		sm = menu_get_by_name(cm->submenu);
 
-	me->priv = calloc(len, sizeof(char));
+		if (!sm) {
+			eprintf("SubMenu '%s' not found\n", cm->menu);
+			goto free;
+		}
 
-	if (!me->priv)
-		goto free;
+		me->priv = sm;
+	} else {
+		me->action = menu_action_run;
+
+		len = strlen(cm->command) + 1;
+
+		me->priv = calloc(len, sizeof(char));
 
-	strncpy(me->priv, cm->command, len);
+		if (!me->priv)
+			goto free;
+
+		strncpy(me->priv, cm->command, len);
+	}
 
 	len = strlen(cm->description) + 1;
 
@@ -371,6 +386,9 @@ static int do_menu(struct command *cmdtp, int argc, char *argv[])
 		case 'c':
 			cm.command = optarg;
 			break;
+		case 'u':
+			cm.submenu = optarg;
+			break;
 		case 'd':
 			cm.description = optarg;
 			break;
@@ -453,6 +471,10 @@ static const __maybe_unused char cmd_menu_help[] =
 "Add an entry\n"
 "  (-R for do no exit the menu after executing the command)\n"
 "  menu -e -a -m <menu> -c <command> [-R] -d <description>\n"
+
+"Add a submenu entry\n"
+"  (-R is not needed)\n"
+"  menu -e -a -m <menu> -u <menu> -d <description>\n"
 "\n"
 "Remove an entry\n"
 "  menu -e -r -m <name> -n <num>\n"
diff --git a/common/menu.c b/common/menu.c
index e03e4d1..b201644 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -306,6 +306,13 @@ void menu_action_run(struct menu *m, struct menu_entry *me)
 		udelay(1000000);
 }
 
+void menu_action_show(struct menu *m, struct menu_entry *me)
+{
+	struct menu *sm = me->priv;
+
+	menu_show(sm);
+}
+
 static int menu_init(void)
 {
 	INIT_LIST_HEAD(&menus.list);
diff --git a/include/menu.h b/include/menu.h
index 29f18f2..4405ced 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -82,6 +82,7 @@ struct menu_entry* menu_entry_get_by_num(struct menu* m, int num);
  * menu entry action functions
  */
 void menu_action_run(struct menu *m, struct menu_entry *me);
+void menu_action_show(struct menu *m, struct menu_entry *me);
 void menu_action_exit(struct menu *m, struct menu_entry *me);
 
 #endif /* __MENU_H__ */
-- 
1.7.1



From s.hauer at pengutronix.de  Sat Aug 21 06:27:34 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Sat, 21 Aug 2010 12:27:34 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100818151536.GF454@game.jcrosoft.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100818151536.GF454@game.jcrosoft.org>
Message-ID: <20100821102734.GN27749@pengutronix.de>

On Wed, Aug 18, 2010 at 05:15:36PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 06:17 Sun 08 Aug     , Jean-Christophe PLAGNIOL-VILLARD wrote:
> > this will add also the support of the new ncurse interface nconfig
> > 
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> is it ok to apply it?

Generally ok, yes. I just thought we should wait a little for a later
version, or have I misunderstood Sam?

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From sam at ravnborg.org  Sat Aug 21 07:35:50 2010
From: sam at ravnborg.org (Sam Ravnborg)
Date: Sat, 21 Aug 2010 13:35:50 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100821102734.GN27749@pengutronix.de>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100818151536.GF454@game.jcrosoft.org>
	<20100821102734.GN27749@pengutronix.de>
Message-ID: <20100821113550.GA25293@merkur.ravnborg.org>

On Sat, Aug 21, 2010 at 12:27:34PM +0200, Sascha Hauer wrote:
> On Wed, Aug 18, 2010 at 05:15:36PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > On 06:17 Sun 08 Aug     , Jean-Christophe PLAGNIOL-VILLARD wrote:
> > > this will add also the support of the new ncurse interface nconfig
> > > 
> > > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> > is it ok to apply it?
> 
> Generally ok, yes. I just thought we should wait a little for a later
> version, or have I misunderstood Sam?

Current state of kconfig in v2.6.36-rc1 (which is a later version than
the one Jean-Christophe references) is the following:
- savedefconfig bugs fixed
- reading a minimal config (created by savedefconfig) fixed

The nconfig issues I mentioned regarding search are
not yet ready.
And I am not sure if they go in until next merge window.

Likewise there are patches in the works that will ease
the integration with external projects.
The patches does the following:
- Allows the prefix to be configured (CONFIG_ => BR2_)
- No more hardcoded "kernel" strings
- mainmenu in the config file is used as headline

These patches will go in during next merge window if they
are finished in due time.

So all-in-all I would recommend to use kconfig from
v2.6.36-rc1 (rather than some random commit) and
then upgrade again around v2.6.37-rc1 time.

	Sam


From plagnioj at jcrosoft.com  Sun Aug 22 01:07:10 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 22 Aug 2010 07:07:10 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100821113550.GA25293@merkur.ravnborg.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100818151536.GF454@game.jcrosoft.org>
	<20100821102734.GN27749@pengutronix.de>
	<20100821113550.GA25293@merkur.ravnborg.org>
Message-ID: <20100822050710.GN8693@game.jcrosoft.org>

On 13:35 Sat 21 Aug     , Sam Ravnborg wrote:
> On Sat, Aug 21, 2010 at 12:27:34PM +0200, Sascha Hauer wrote:
> > On Wed, Aug 18, 2010 at 05:15:36PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > > On 06:17 Sun 08 Aug     , Jean-Christophe PLAGNIOL-VILLARD wrote:
> > > > this will add also the support of the new ncurse interface nconfig
> > > > 
> > > > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> > > is it ok to apply it?
> > 
> > Generally ok, yes. I just thought we should wait a little for a later
> > version, or have I misunderstood Sam?
> 
> Current state of kconfig in v2.6.36-rc1 (which is a later version than
> the one Jean-Christophe references) is the following:
> - savedefconfig bugs fixed
> - reading a minimal config (created by savedefconfig) fixed
> 
> The nconfig issues I mentioned regarding search are
> not yet ready.
> And I am not sure if they go in until next merge window.
> 
> Likewise there are patches in the works that will ease
> the integration with external projects.
> The patches does the following:
> - Allows the prefix to be configured (CONFIG_ => BR2_)
> - No more hardcoded "kernel" strings
> - mainmenu in the config file is used as headline
> 
> These patches will go in during next merge window if they
> are finished in due time.
> 
> So all-in-all I would recommend to use kconfig from
> v2.6.36-rc1 (rather than some random commit) and
> then upgrade again around v2.6.37-rc1 time.
ok I upgrade the patch

and it will be good to update it regulary I will follow it
is there a ML for Kconfig?

Best Regards,
J.


From plagnioj at jcrosoft.com  Sun Aug 22 01:17:42 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 22 Aug 2010 07:17:42 +0200
Subject: [PATCH v2] Kconfig: sync with linux kernel v2.6.36-rc1-168-ge36c886
In-Reply-To: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100822051742.GO8693@game.jcrosoft.org>

Hi,

	I've push the new version on git://git.jcrosoft.org kconfig

The following changes since commit 77df62be5d5140b083152316d67a756d9fae962c:

  beagle: fix usb dependencies (2010-08-18 08:47:33 +0200)

are available in the git repository at:
  git://git.jcrosoft.org/barebox.git kconfig

Jean-Christophe PLAGNIOL-VILLARD (1):
      Kconfig: sync with linux kernel v2.6.36-rc1-168-ge36c886

 Makefile                                   |    2 +-
 common/Kconfig                             |   13 +
 scripts/kconfig/.gitignore                 |    4 +
 scripts/kconfig/Makefile                   |  175 ++-
 scripts/kconfig/POTFILES.in                |    7 +
 scripts/kconfig/check.sh                   |   14 +
 scripts/kconfig/conf.c                     |  439 ++++----
 scripts/kconfig/confdata.c                 |  537 +++++++---
 scripts/kconfig/expr.c                     |   65 +-
 scripts/kconfig/expr.h                     |  106 ++-
 scripts/kconfig/gconf.c                    |  145 +--
 scripts/kconfig/gconf.glade                |   30 +-
 scripts/kconfig/kxgettext.c                |    8 +-
 scripts/kconfig/lex.zconf.c_shipped        |  127 ++-
 scripts/kconfig/lkc.h                      |   40 +-
 scripts/kconfig/lkc_proto.h                |    9 +-
 scripts/kconfig/lxdialog/BIG.FAT.WARNING   |    2 +-
 scripts/kconfig/lxdialog/check-lxdialog.sh |   20 +-
 scripts/kconfig/lxdialog/checklist.c       |   17 +-
 scripts/kconfig/lxdialog/dialog.h          |   11 +-
 scripts/kconfig/lxdialog/inputbox.c        |   10 +-
 scripts/kconfig/lxdialog/menubox.c         |   28 +-
 scripts/kconfig/lxdialog/textbox.c         |    2 +-
 scripts/kconfig/lxdialog/util.c            |   34 +-
 scripts/kconfig/lxdialog/yesno.c           |    4 +-
 scripts/kconfig/mconf.c                    |  262 ++---
 scripts/kconfig/menu.c                     |  211 +++-
 scripts/kconfig/nconf.c                    | 1570 ++++++++++++++++++++++++++
 scripts/kconfig/nconf.gui.c                |  617 ++++++++++
 scripts/kconfig/nconf.h                    |   95 ++
 scripts/kconfig/qconf.cc                   |  255 +++--
 scripts/kconfig/qconf.h                    |   17 +-
 scripts/kconfig/streamline_config.pl       |  422 +++++++
 scripts/kconfig/symbol.c                   |  501 +++++++--
 scripts/kconfig/util.c                     |   44 +-
 scripts/kconfig/zconf.gperf                |    6 +-
 scripts/kconfig/zconf.hash.c_shipped       |  225 ++--
 scripts/kconfig/zconf.l                    |   21 +-
 scripts/kconfig/zconf.tab.c_shipped        | 1665 +++++++++++++++-------------
 scripts/kconfig/zconf.y                    |   62 +-
 40 files changed, 5815 insertions(+), 2007 deletions(-)
 create mode 100755 scripts/kconfig/check.sh
 create mode 100644 scripts/kconfig/nconf.c
 create mode 100644 scripts/kconfig/nconf.gui.c
 create mode 100644 scripts/kconfig/nconf.h
 create mode 100644 scripts/kconfig/streamline_config.pl

Best Regards,
J.


From sam at ravnborg.org  Sun Aug 22 01:55:48 2010
From: sam at ravnborg.org (Sam Ravnborg)
Date: Sun, 22 Aug 2010 07:55:48 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100822050710.GN8693@game.jcrosoft.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100818151536.GF454@game.jcrosoft.org>
	<20100821102734.GN27749@pengutronix.de>
	<20100821113550.GA25293@merkur.ravnborg.org>
	<20100822050710.GN8693@game.jcrosoft.org>
Message-ID: <20100822055548.GA27725@merkur.ravnborg.org>

> > 
> > So all-in-all I would recommend to use kconfig from
> > v2.6.36-rc1 (rather than some random commit) and
> > then upgrade again around v2.6.37-rc1 time.
> ok I upgrade the patch
> 
> and it will be good to update it regulary I will follow it
> is there a ML for Kconfig?

kconfig is mostly discussed on linux-kbuild at vger.kernel.org
but sometimes also/only on lkml.

On lkml this is usually stuff that is a bit remote
to kconfig. It was on lkml the defconfigs was discussed
which triggered "savedefconfig".

	Sam


From plagnioj at jcrosoft.com  Sun Aug 22 02:48:56 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 22 Aug 2010 08:48:56 +0200
Subject: [PATCH] move board.dox to Documentation and update it
Message-ID: <1282459736-2378-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 Documentation/board.dox      |   95 ++++++++++++++++++++++++++++++++++++++++++
 Documentation/manual_org.dox |    4 +-
 board/board.dox              |   95 ------------------------------------------
 3 files changed, 97 insertions(+), 97 deletions(-)
 create mode 100644 Documentation/board.dox
 delete mode 100644 board/board.dox

diff --git a/Documentation/board.dox b/Documentation/board.dox
new file mode 100644
index 0000000..07425e4
--- /dev/null
+++ b/Documentation/board.dox
@@ -0,0 +1,95 @@
+/** @page dev_board Adapting a new Board
+
+To add a new board to @a barebox a few steps must be done, to extend and modify
+the @a barebox source tree.
+
+ at section board_add_files Files/Directories to be added
+
+ - arch/\<architecture\>/boards/\<boardname\>
+ - arch/\<architecture\>/boards/\<boardname\>/Makefile
+ - arch/\<architecture\>/boards/\<boardname\>/\<boardname\>.c
+ - arch/\<architecture\>/boards/\<boardname\>/\<boardname\>.dox
+ - include/configs/\<boardname\>.h
+ - arch/\<architecture\>/configs/\<boardname\>_defconfig
+
+ at subsection board_makefile arch/\<architecture\>/boards/\<boardname\>Makefile
+
+ at verbatim
+	obj-y += all files that builds the BSP (Assembler and/or C files)
+ at endverbatim
+
+ at subsection board_basefile arch/\<architecture\>/boards/\<boardname\>\<boardname\>.c
+
+TBD
+
+ at subsection board_doxygen arch/\<architecture\>/boards/\<boardname\>/\<boardname\>.dox
+
+This file should describe in short words your new board, what CPU
+it uses, what resources are provided and features it supports.
+
+Use the doxygen style for this kind of documentation. Below you find a
+template for this kind of file:
+
+ at verbatim
+/** @page <boardname> <Manufacturer> <Board's Name>
+
+This board uses an <architecture> based CPU. The board is shipped with:
+
+- many MiB NOR type Flash Memory
+- many MiB SDRAM
+- a very special network controller
+
+and so on.
+
+*/
+ at endverbatim
+
+To make your new shiny file visible in the automatically generated
+documentation you must sort in the used page lable ("<boardname>" in the
+template above) into Documentation/boards.dox as:
+
+ at verbatim
+ ...
+ @subpage <boardname>
+ ...
+ at endverbatim
+
+at the right architecture.
+
+ at note Consider to use an unique page lable.
+
+ at subsection board_lscript arch/\<architecture\>/boards/\<boardname\>/barebox.lds.S
+
+If your board needs a special binary @a barebox layout, you can provide a local
+board linker script file. This will replace the generic one provided by your
+architecture or CPU support.
+
+Add this file with
+
+ at verbatim
+	extra-y += <board_linker_script>
+ at endverbatim
+
+in your local \b Makefile to the list of files, forwarded to the last linking step.
+
+ at section board_defconfig arch/\<architecture\>/configs/\<boardname\>_defconfig
+
+TBD
+
+ at section board_mod_files These files needs to be modified:
+
+ - modify Documentation/board.dox
+ - modify arch/\<architecture\>/Kconfig
+  - add your board (MACH_*) to the list
+  - add your default text base address for this architecture (ARCH_TEXT_BASE)
+  - add BOARDINFO with valueable info for your board
+ - modify arch/\<architecture\>/Makefile:
+  - add board-$(MACH_*) = \<your board_dir\>
+
+First, the new board should be visible in the menu.
+
+ at section board_specific_cpu Porting hints for specific CPUs
+
+ at li @subpage dev_s3c24xx_mach
+
+*/
diff --git a/Documentation/manual_org.dox b/Documentation/manual_org.dox
index 6f3b157..17238f0 100644
--- a/Documentation/manual_org.dox
+++ b/Documentation/manual_org.dox
@@ -10,7 +10,7 @@ than listed here. But these files are the main control files:
    - Documentation/users_manual.dox
     - Documentation/commands.dox
    - Documentation/developers_manual.dox
-    - board/board.dox
+    - Documentation/board.dox
     - arch/architecture.dox
      - arch/arm/mach-arm.dox
      - arch/blackfin/mach-bf.dox
@@ -24,4 +24,4 @@ their pages should be listed in this file.
 
 New boards should forward their content to Documentation/boards.dox, so
 their pages should be listed in this file.
-*/
\ No newline at end of file
+*/
diff --git a/board/board.dox b/board/board.dox
deleted file mode 100644
index 6bda416..0000000
--- a/board/board.dox
+++ /dev/null
@@ -1,95 +0,0 @@
-/** @page dev_board Adapting a new Board
-
-To add a new board to @a barebox a few steps must be done, to extend and modify
-the @a barebox source tree.
-
- at section board_add_files Files/Directories to be added
-
- - arch/\<architecture\>/boards/\<boardname\>
- - arch/\<architecture\>/boards/\<boardname\>/Makefile
- - arch/\<architecture\>/boards/\<boardname\>/\<boardname\>.c
- - arch/\<architecture\>/boards/\<boardname\>/\<boardname\>.dox
- - include/configs/\<boardname\>.h
- - arch/\<architecture\>/configs/\<boardname\>_defconfig
-
- at subsection board_makefile arch/\<architecture\>/boards/\<boardname\>Makefile
-
- at verbatim
-	obj-y += all files that builds the BSP (Assembler and/or C files)
- at endverbatim
-
- at subsection board_basefile arch/\<architecture\>/boards/\<boardname\>\<boardname\>.c
-
-TBD
-
- at subsection board_doxygen arch/\<architecture\>/boards/\<boardname\>/\<boardname\>.dox
-
-This file should describe in short words your new board, what CPU
-it uses, what resources are provided and features it supports.
-
-Use the doxygen style for this kind of documentation. Below you find a
-template for this kind of file:
-
- at verbatim
-/** @page <boardname> <Manufacturer> <Board's Name>
-
-This board uses an <architecture> based CPU. The board is shipped with:
-
-- many MiB NOR type Flash Memory
-- many MiB SDRAM
-- a very special network controller
-
-and so on.
-
-*/
- at endverbatim
-
-To make your new shiny file visible in the automatically generated
-documentation you must sort in the used page lable ("<boardname>" in the
-template above) into Documentation/boards.dox as:
-
- at verbatim
- ...
- @subpage <boardname>
- ...
- at endverbatim
-
-at the right architecture.
-
- at note Consider to use an unique page lable.
-
- at subsection board_lscript arch/\<architecture\>/boards/\<boardname\>/barebox.lds.S
-
-If your board needs a special binary @a barebox layout, you can provide a local
-board linker script file. This will replace the generic one provided by your
-architecture or CPU support.
-
-Add this file with
-
- at verbatim
-	extra-y += <board_linker_script>
- at endverbatim
-
-in your local \b Makefile to the list of files, forwarded to the last linking step.
-
- at section board_defconfig arch/\<architecture\>/configs/\<boardname\>_defconfig
-
-TBD
-
- at section board_mod_files These files needs to be modified:
-
- - modify board/board.dox
- - modify arch/\<architecture\>/Kconfig
-  - add your board (MACH_*) to the list
-  - add your default text base address for this architecture (ARCH_TEXT_BASE)
-  - add BOARDINFO with valueable info for your board
- - modify arch/\<architecture\>/Makefile:
-  - add board-$(MACH_*) = \<your board_dir\>
-
-First, the new board should be visible in the menu.
-
- at section board_specific_cpu Porting hints for specific CPUs
-
- at li @subpage dev_s3c24xx_mach
-
-*/
-- 
1.7.1



From jacmet at sunsite.dk  Sun Aug 22 08:54:38 2010
From: jacmet at sunsite.dk (Peter Korsgaard)
Date: Sun, 22 Aug 2010 14:54:38 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100809064923.GL30096@pengutronix.de> (Robert Schwebel's
	message of "Mon, 9 Aug 2010 08:49:23 +0200")
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100808064846.GA31364@merkur.ravnborg.org>
	<20100809064923.GL30096@pengutronix.de>
Message-ID: <87wrrikdtd.fsf@macbook.be.48ers.dk>

>>>>> "Robert" == Robert Schwebel <r.schwebel at pengutronix.de> writes:

[Sorry, old thread - Been away on vacation]

 >> Which bring up another question. We have plenty of projects out there
 >> that rely on kconfig.

 Robert> ptxdist as well.

And Buildroot and OpenWrt and crosstool-ng, ...

 >> What can we do to kconfig to make the integration easier?
 >> 
 >> We have discussed that kconfig should be a seperate installable tool
 >> (as rpm, deb whatever). But there is a few quirks needed before we can
 >> do so.

 Robert> I don't think that it is necessary. Last time I checked the most
 Robert> complicated thing was to exchange the project name ("Linux kernel") to
 Robert> something else, because there were quite a lot of hand coded numbers
 Robert> representing the string length or length-1. But we are not up to the
 Robert> latest versions - I'll have to re-check.

Yeah. Buildroot has historically done s/CONFIG_/BR2_/ as well, but I'm
strongly considering going back to CONFIG_.

-- 
Bye, Peter Korsgaard


From jacmet at sunsite.dk  Sun Aug 22 09:48:07 2010
From: jacmet at sunsite.dk (Peter Korsgaard)
Date: Sun, 22 Aug 2010 15:48:07 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100821113550.GA25293@merkur.ravnborg.org> (Sam Ravnborg's
	message of "Sat, 21 Aug 2010 13:35:50 +0200")
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100818151536.GF454@game.jcrosoft.org>
	<20100821102734.GN27749@pengutronix.de>
	<20100821113550.GA25293@merkur.ravnborg.org>
Message-ID: <87sk26kbc8.fsf@macbook.be.48ers.dk>

>>>>> "Sam" == Sam Ravnborg <sam at ravnborg.org> writes:

Hi,

 Sam> Current state of kconfig in v2.6.36-rc1 (which is a later version
 Sam> than the one Jean-Christophe references) is the following: -
 Sam> savedefconfig bugs fixed - reading a minimal config (created by
 Sam> savedefconfig) fixed

 Sam> The nconfig issues I mentioned regarding search are
 Sam> not yet ready.
 Sam> And I am not sure if they go in until next merge window.

 Sam> Likewise there are patches in the works that will ease
 Sam> the integration with external projects.
 Sam> The patches does the following:
 Sam> - Allows the prefix to be configured (CONFIG_ => BR2_)
 Sam> - No more hardcoded "kernel" strings
 Sam> - mainmenu in the config file is used as headline

 Sam> These patches will go in during next merge window if they
 Sam> are finished in due time.

Nice! FYI, I'm planning on syncing kconfig for buildroot after the
2010.08 release.

-- 
Bye, Peter Korsgaard


From plagnioj at jcrosoft.com  Sun Aug 22 22:51:23 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 23 Aug 2010 04:51:23 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <87wrrikdtd.fsf@macbook.be.48ers.dk>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100808064846.GA31364@merkur.ravnborg.org>
	<20100809064923.GL30096@pengutronix.de>
	<87wrrikdtd.fsf@macbook.be.48ers.dk>
Message-ID: <20100823025123.GP8693@game.jcrosoft.org>

On 14:54 Sun 22 Aug     , Peter Korsgaard wrote:
> >>>>> "Robert" == Robert Schwebel <r.schwebel at pengutronix.de> writes:
> 
> [Sorry, old thread - Been away on vacation]
> 
>  >> Which bring up another question. We have plenty of projects out there
>  >> that rely on kconfig.
> 
>  Robert> ptxdist as well.
> 
> And Buildroot and OpenWrt and crosstool-ng, ...
> 
>  >> What can we do to kconfig to make the integration easier?
>  >> 
>  >> We have discussed that kconfig should be a seperate installable tool
>  >> (as rpm, deb whatever). But there is a few quirks needed before we can
>  >> do so.
> 
>  Robert> I don't think that it is necessary. Last time I checked the most
>  Robert> complicated thing was to exchange the project name ("Linux kernel") to
>  Robert> something else, because there were quite a lot of hand coded numbers
>  Robert> representing the string length or length-1. But we are not up to the
>  Robert> latest versions - I'll have to re-check.
> 
> Yeah. Buildroot has historically done s/CONFIG_/BR2_/ as well, but I'm
> strongly considering going back to CONFIG_.
I agree too

Best Regards,
J.


From plagnioj at jcrosoft.com  Sun Aug 22 23:30:59 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 23 Aug 2010 05:30:59 +0200
Subject: [PATCH 0/5] AT91 fix and preparation for at91rm9200 readding and
	at91sam9261
Message-ID: <20100823033059.GS8693@game.jcrosoft.org>

Hi Sascha,

this contain fix up and prepacation for adding at91rm9200 and at91sam9261

please pull

The following changes since commit c52f80cc89e559ade702486d03bb8bfe3113db6c:

  Add missing include (2010-08-22 12:08:10 +0200)

are available in the git repository at:
  git://git.jcrosoft.org/barebox.git at91

Jean-Christophe PLAGNIOL-VILLARD (5):
      mmccpu: fix typo in AT91_MAIN_CLOCK
      dm9000: allow to specify that no srom is present
      at91: rename clocksource.c -> at91sam926x_time.c
      macb: introduce HAS_MACB configuration
      at91: remove non used and obsolete at91rm9200 code

 arch/arm/Kconfig                                   |    5 -
 arch/arm/Makefile                                  |    1 -
 arch/arm/boards/mmccpu/config.h                    |    2 +-
 arch/arm/boards/scb9328/scb9328.c                  |    1 +
 arch/arm/mach-at91/Kconfig                         |    2 +
 arch/arm/mach-at91/Makefile                        |    6 +-
 .../{clocksource.c => at91sam926x_time.c}          |    0
 arch/arm/mach-at91rm9200/Kconfig                   |   16 -
 arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h |  762 --------------------
 arch/arm/mach-at91rm9200/include/mach/hardware.h   |   78 --
 drivers/net/Kconfig                                |    5 +-
 drivers/net/dm9000.c                               |    3 +-
 include/dm9000.h                                   |    1 +
 13 files changed, 14 insertions(+), 868 deletions(-)
 rename arch/arm/mach-at91/{clocksource.c => at91sam926x_time.c} (100%)
 delete mode 100644 arch/arm/mach-at91rm9200/Kconfig
 delete mode 100644 arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h
 delete mode 100644 arch/arm/mach-at91rm9200/include/mach/hardware.h


From plagnioj at jcrosoft.com  Sun Aug 22 23:33:52 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 23 Aug 2010 05:33:52 +0200
Subject: [PATCH 2/5] dm9000: allow to specify that no srom is present
In-Reply-To: <20100823033059.GS8693@game.jcrosoft.org>
References: <20100823033059.GS8693@game.jcrosoft.org>
Message-ID: <1282534435-20881-2-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/boards/scb9328/scb9328.c |    1 +
 drivers/net/dm9000.c              |    3 ++-
 include/dm9000.h                  |    1 +
 3 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/arch/arm/boards/scb9328/scb9328.c b/arch/arm/boards/scb9328/scb9328.c
index e781393..3c04996 100644
--- a/arch/arm/boards/scb9328/scb9328.c
+++ b/arch/arm/boards/scb9328/scb9328.c
@@ -55,6 +55,7 @@ static struct dm9000_platform_data dm9000_data = {
 	.iobase   = 0x16000000,
 	.iodata   = 0x16000004,
 	.buswidth = DM9000_WIDTH_16,
+	.srom     = 1;
 };
 
 static struct device_d dm9000_dev = {
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index 2062c66..ab06735 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -498,8 +498,9 @@ static int dm9000_probe(struct device_d *dev)
 	edev->send = dm9000_eth_send;
 	edev->recv = dm9000_eth_rx;
 	edev->halt = dm9000_eth_halt;
-	edev->get_ethaddr = dm9000_get_ethaddr;
 	edev->set_ethaddr = dm9000_set_ethaddr;
+	if (pdata->srom)
+		edev->get_ethaddr = dm9000_get_ethaddr;
 
 	/* RESET device */
 	dm9000_reset(priv);
diff --git a/include/dm9000.h b/include/dm9000.h
index 3cc5235..b4a04b1 100644
--- a/include/dm9000.h
+++ b/include/dm9000.h
@@ -10,6 +10,7 @@ struct dm9000_platform_data {
 	unsigned long iobase;
 	unsigned long iodata;
 	int buswidth;
+	int srom;
 };
 
 #endif /* __DM9000_H__ */
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug 22 23:33:51 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 23 Aug 2010 05:33:51 +0200
Subject: [PATCH 1/5] mmccpu: fix typo in AT91_MAIN_CLOCK
In-Reply-To: <20100823033059.GS8693@game.jcrosoft.org>
References: <20100823033059.GS8693@game.jcrosoft.org>
Message-ID: <1282534435-20881-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/boards/mmccpu/config.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/arm/boards/mmccpu/config.h b/arch/arm/boards/mmccpu/config.h
index 422ac09..c37d5eb 100644
--- a/arch/arm/boards/mmccpu/config.h
+++ b/arch/arm/boards/mmccpu/config.h
@@ -1,7 +1,7 @@
 #ifndef __CONFIG_H
 #define __CONFIG_H
 
-#define AT91_M1IN_CLOCK		18432000
+#define AT91_MAIN_CLOCK		18432000
 
 /* values */
 #define MASTER_PLL_MUL		54
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug 22 23:33:53 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 23 Aug 2010 05:33:53 +0200
Subject: [PATCH 3/5] at91: rename clocksource.c -> at91sam926x_time.c
In-Reply-To: <20100823033059.GS8693@game.jcrosoft.org>
References: <20100823033059.GS8693@game.jcrosoft.org>
Message-ID: <1282534435-20881-3-git-send-email-plagnioj@jcrosoft.com>

preparation to move the rm9200 to the same api as other at91

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/mach-at91/Makefile           |    6 +-
 arch/arm/mach-at91/at91sam926x_time.c |   85 +++++++++++++++++++++++++++++++++
 arch/arm/mach-at91/clocksource.c      |   85 ---------------------------------
 3 files changed, 88 insertions(+), 88 deletions(-)
 create mode 100644 arch/arm/mach-at91/at91sam926x_time.c
 delete mode 100644 arch/arm/mach-at91/clocksource.c

diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
index 0f55883..2878b04 100644
--- a/arch/arm/mach-at91/Makefile
+++ b/arch/arm/mach-at91/Makefile
@@ -1,7 +1,7 @@
-obj-y += clock.o clocksource.o gpio.o
+obj-y += clock.o gpio.o
 
 obj-$(CONFIG_MACH_DO_LOWLEVEL_INIT) += lowlevel_init.o
 
 # CPU-specific support
-obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam9260_devices.o sam9_smc.o
-obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam9263_devices.o sam9_smc.o
+obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o
+obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o
diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c
new file mode 100644
index 0000000..84df1a1
--- /dev/null
+++ b/arch/arm/mach-at91/at91sam926x_time.c
@@ -0,0 +1,85 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger at sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Alex Zuepke <azu at sysgo.de>
+ *
+ * (C) Copyright 2002
+ * Gary Jennejohn, DENX Software Engineering, <gj at 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 <init.h>
+#include <clock.h>
+#include <asm/hardware.h>
+#include <mach/at91_pit.h>
+#include <mach/at91_pmc.h>
+#include <mach/at91_rstc.h>
+#include <mach/io.h>
+#include <asm/io.h>
+
+uint64_t at91sam9_clocksource_read(void)
+{
+	return at91_sys_read(AT91_PIT_PIIR);
+}
+
+static struct clocksource cs = {
+	.read	= at91sam9_clocksource_read,
+	.mask	= 0xffffffff,
+	.shift	= 10,
+};
+
+static int clocksource_init (void)
+{
+	/*
+	 * Enable PITC Clock
+	 * The clock is already enabled for system controller in boot
+	 */
+	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
+
+	/* Enable PITC */
+	at91_sys_write(AT91_PIT_MR, 0xfffff | AT91_PIT_PITEN);
+
+	cs.mult = clocksource_hz2mult(1000000 * 6, cs.shift);
+
+	init_clock(&cs);
+
+	return 0;
+}
+
+core_initcall(clocksource_init);
+
+/*
+ * Reset the cpu through the reset controller
+ */
+void __noreturn reset_cpu (unsigned long ignored)
+{
+	at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY |
+				     AT91_RSTC_PROCRST |
+				     AT91_RSTC_PERRST);
+
+	/* Not reached */
+	while (1);
+}
+EXPORT_SYMBOL(reset_cpu);
diff --git a/arch/arm/mach-at91/clocksource.c b/arch/arm/mach-at91/clocksource.c
deleted file mode 100644
index 84df1a1..0000000
--- a/arch/arm/mach-at91/clocksource.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * (C) Copyright 2002
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Marius Groeger <mgroeger at sysgo.de>
- *
- * (C) Copyright 2002
- * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
- * Alex Zuepke <azu at sysgo.de>
- *
- * (C) Copyright 2002
- * Gary Jennejohn, DENX Software Engineering, <gj at 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 <init.h>
-#include <clock.h>
-#include <asm/hardware.h>
-#include <mach/at91_pit.h>
-#include <mach/at91_pmc.h>
-#include <mach/at91_rstc.h>
-#include <mach/io.h>
-#include <asm/io.h>
-
-uint64_t at91sam9_clocksource_read(void)
-{
-	return at91_sys_read(AT91_PIT_PIIR);
-}
-
-static struct clocksource cs = {
-	.read	= at91sam9_clocksource_read,
-	.mask	= 0xffffffff,
-	.shift	= 10,
-};
-
-static int clocksource_init (void)
-{
-	/*
-	 * Enable PITC Clock
-	 * The clock is already enabled for system controller in boot
-	 */
-	at91_sys_write(AT91_PMC_PCER, 1 << AT91_ID_SYS);
-
-	/* Enable PITC */
-	at91_sys_write(AT91_PIT_MR, 0xfffff | AT91_PIT_PITEN);
-
-	cs.mult = clocksource_hz2mult(1000000 * 6, cs.shift);
-
-	init_clock(&cs);
-
-	return 0;
-}
-
-core_initcall(clocksource_init);
-
-/*
- * Reset the cpu through the reset controller
- */
-void __noreturn reset_cpu (unsigned long ignored)
-{
-	at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY |
-				     AT91_RSTC_PROCRST |
-				     AT91_RSTC_PERRST);
-
-	/* Not reached */
-	while (1);
-}
-EXPORT_SYMBOL(reset_cpu);
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug 22 23:33:54 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 23 Aug 2010 05:33:54 +0200
Subject: [PATCH 4/5] macb: introduce HAS_MACB configuration
In-Reply-To: <20100823033059.GS8693@game.jcrosoft.org>
References: <20100823033059.GS8693@game.jcrosoft.org>
Message-ID: <1282534435-20881-4-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/mach-at91/Kconfig |    2 ++
 drivers/net/Kconfig        |    5 ++++-
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 923ce0b..99d0f4d 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -18,11 +18,13 @@ choice
 config ARCH_AT91SAM9260
 	bool "AT91SAM9260"
 	select CPU_ARM926T
+	select HAS_MACB
 
 config ARCH_AT91SAM9263
 	bool "AT91SAM9263"
 	select CPU_ARM926T
 	select MACH_HAS_LOWLEVEL_INIT
+	select HAS_MACB
 
 endchoice
 
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 0955562..a106a7b 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -4,6 +4,9 @@ config HAS_CS8900
 config HAS_DM9000
 	bool
 
+config HAS_MACB
+	bool
+
 config HAS_AT91_ETHER
 	bool
 
@@ -71,7 +74,7 @@ config DRIVER_NET_EP93XX
 
 config DRIVER_NET_MACB
 	bool "macb Ethernet driver"
-	depends on ARCH_AT91
+	depends on HAS_MACB
 	select MIIPHY
 
 config DRIVER_NET_TAP
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug 22 23:33:55 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 23 Aug 2010 05:33:55 +0200
Subject: [PATCH 5/5] at91: remove non used and obsolete at91rm9200 code
In-Reply-To: <20100823033059.GS8693@game.jcrosoft.org>
References: <20100823033059.GS8693@game.jcrosoft.org>
Message-ID: <1282534435-20881-5-git-send-email-plagnioj@jcrosoft.com>

this will be re-add as mach-at91
for now on keep the net driver which will be updated to new API

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/Kconfig                                   |    5 -
 arch/arm/Makefile                                  |    1 -
 arch/arm/mach-at91rm9200/Kconfig                   |   16 -
 arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h |  762 --------------------
 arch/arm/mach-at91rm9200/include/mach/hardware.h   |   78 --
 5 files changed, 0 insertions(+), 862 deletions(-)
 delete mode 100644 arch/arm/mach-at91rm9200/Kconfig
 delete mode 100644 arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h
 delete mode 100644 arch/arm/mach-at91rm9200/include/mach/hardware.h

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 82dbfda..945528c 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -30,10 +30,6 @@ config ARCH_AT91
 	bool "Atmel AT91"
 	select GENERIC_GPIO
 
-config ARCH_AT91RM9200
-	bool "Atmel AT91RM9200"
-	select CPU_ARM920T
-
 config ARCH_EP93XX
 	bool "Cirrus Logic EP93xx"
 	select CPU_ARM920T
@@ -65,7 +61,6 @@ endchoice
 source arch/arm/common/Kconfig
 source arch/arm/cpu/Kconfig
 source arch/arm/mach-at91/Kconfig
-source arch/arm/mach-at91rm9200/Kconfig
 source arch/arm/mach-ep93xx/Kconfig
 source arch/arm/mach-imx/Kconfig
 source arch/arm/mach-netx/Kconfig
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 4827fe9..e542c03 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -39,7 +39,6 @@ CPPFLAGS += $(CFLAGS_ABI) $(arch-y) $(tune-y)
 # Machine directory name.  This list is sorted alphanumerically
 # by CONFIG_* macro name.
 machine-$(CONFIG_ARCH_AT91)		:= at91
-machine-$(CONFIG_ARCH_AT91RM9200)	:= at91rm9200
 machine-$(CONFIG_ARCH_EP93XX)		:= ep93xx
 machine-$(CONFIG_ARCH_IMX)		:= imx
 machine-$(CONFIG_ARCH_NOMADIK)		:= nomadik
diff --git a/arch/arm/mach-at91rm9200/Kconfig b/arch/arm/mach-at91rm9200/Kconfig
deleted file mode 100644
index c062097..0000000
--- a/arch/arm/mach-at91rm9200/Kconfig
+++ /dev/null
@@ -1,16 +0,0 @@
-if ARCH_AT91RM9200
-
-config ARCH_TEXT_BASE
-	hex
-
-config BOARDINFO
-
-comment "Atmel AT91RM9200 System-on-Chip"
-
-choice
-
-	prompt "AT91RM9200 Board Type"
-
-endchoice
-
-endif
diff --git a/arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h b/arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h
deleted file mode 100644
index 97d4704..0000000
--- a/arch/arm/mach-at91rm9200/include/mach/AT91RM9200.h
+++ /dev/null
@@ -1,762 +0,0 @@
-/*
- * (C) Copyright 2003
- * AT91RM9200 definitions
- * Author : ATMEL AT91 application group
- *
- * 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 AT91RM9200_H
-#define AT91RM9200_H
-
-typedef volatile unsigned int AT91_REG;		/* Hardware register definition */
-
-/******************************************************************************/
-/*        SOFTWARE API DEFINITION  FOR Timer Counter Channel Interface        */
-/******************************************************************************/
-typedef struct _AT91S_TC
-{
-	AT91_REG	 TC_CCR; 	/* Channel Control Register */
-	AT91_REG	 TC_CMR; 	/* Channel Mode Register */
-	AT91_REG	 Reserved0[2]; 	/*  */
-	AT91_REG	 TC_CV; 	/* Counter Value */
-	AT91_REG	 TC_RA; 	/* Register A */
-	AT91_REG	 TC_RB; 	/* Register B */
-	AT91_REG	 TC_RC; 	/* Register C */
-	AT91_REG	 TC_SR; 	/* Status Register */
-	AT91_REG	 TC_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 TC_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 TC_IMR; 	/* Interrupt Mask Register */
-} AT91S_TC, *AT91PS_TC;
-
-#define AT91C_TC_TIMER_DIV1_CLOCK	((unsigned int) 0x0 <<  0) /* (TC) MCK/2 */
-#define AT91C_TC_TIMER_DIV2_CLOCK	((unsigned int) 0x1 <<  0) /* (TC) MCK/8 */
-#define AT91C_TC_TIMER_DIV3_CLOCK	((unsigned int) 0x2 <<  0) /* (TC) MCK/32 */
-#define AT91C_TC_TIMER_DIV4_CLOCK	((unsigned int) 0x3 <<  0) /* (TC) MCK/128 */
-#define AT91C_TC_SLOW_CLOCK		((unsigned int) 0x4 <<  0) /* (TC) SLOW CLK */
-#define AT91C_TC_XC0_CLOCK		((unsigned int) 0x5 <<  0) /* (TC) XC0 */
-#define AT91C_TC_XC1_CLOCK		((unsigned int) 0x6 <<  0) /* (TC) XC1 */
-#define AT91C_TC_XC2_CLOCK		((unsigned int) 0x7 <<  0) /* (TC) XC2 */
-#define AT91C_TCB_TC0XC0S_NONE		((unsigned int) 0x1)       /* (TCB) None signal connected to XC0 */
-#define AT91C_TCB_TC1XC1S_NONE		((unsigned int) 0x1 <<  2) /* (TCB) None signal connected to XC1 */
-#define AT91C_TCB_TC2XC2S_NONE		((unsigned int) 0x1 <<  4) /* (TCB) None signal connected to XC2 */
-#define AT91C_TC_CLKDIS			((unsigned int) 0x1 <<  1) /* (TC) Counter Clock Disable Command */
-#define AT91C_TC_SWTRG			((unsigned int) 0x1 <<  2) /* (TC) Software Trigger Command */
-#define AT91C_TC_CLKEN			((unsigned int) 0x1 <<  0) /* (TC) Counter Clock Enable Command */
-
-/******************************************************************************/
-/*                  SOFTWARE API DEFINITION  FOR Usart                        */
-/******************************************************************************/
-typedef struct _AT91S_USART
-{
-	AT91_REG	 US_CR; 	/* Control Register */
-	AT91_REG	 US_MR; 	/* Mode Register */
-	AT91_REG	 US_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 US_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 US_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 US_CSR; 	/* Channel Status Register */
-	AT91_REG	 US_RHR; 	/* Receiver Holding Register */
-	AT91_REG	 US_THR; 	/* Transmitter Holding Register */
-	AT91_REG	 US_BRGR; 	/* Baud Rate Generator Register */
-	AT91_REG	 US_RTOR; 	/* Receiver Time-out Register */
-	AT91_REG	 US_TTGR; 	/* Transmitter Time-guard Register */
-	AT91_REG	 Reserved0[5]; 	/*  */
-	AT91_REG	 US_FIDI; 	/* FI_DI_Ratio Register */
-	AT91_REG	 US_NER; 	/* Nb Errors Register */
-	AT91_REG	 US_XXR; 	/* XON_XOFF Register */
-	AT91_REG	 US_IF; 	/* IRDA_FILTER Register */
-	AT91_REG	 Reserved1[44];	/*  */
-	AT91_REG	 US_RPR; 	/* Receive Pointer Register */
-	AT91_REG	 US_RCR; 	/* Receive Counter Register */
-	AT91_REG	 US_TPR; 	/* Transmit Pointer Register */
-	AT91_REG	 US_TCR; 	/* Transmit Counter Register */
-	AT91_REG	 US_RNPR; 	/* Receive Next Pointer Register */
-	AT91_REG	 US_RNCR; 	/* Receive Next Counter Register */
-	AT91_REG	 US_TNPR; 	/* Transmit Next Pointer Register */
-	AT91_REG	 US_TNCR; 	/* Transmit Next Counter Register */
-	AT91_REG	 US_PTCR; 	/* PDC Transfer Control Register */
-	AT91_REG	 US_PTSR; 	/* PDC Transfer Status Register */
-} AT91S_USART, *AT91PS_USART;
-
-/******************************************************************************/
-/*          SOFTWARE API DEFINITION  FOR Clock Generator Controler            */
-/******************************************************************************/
-typedef struct _AT91S_CKGR
-{
-	AT91_REG	 CKGR_MOR; 	/* Main Oscillator Register */
-	AT91_REG	 CKGR_MCFR; 	/* Main Clock  Frequency Register */
-	AT91_REG	 CKGR_PLLAR; 	/* PLL A Register */
-	AT91_REG	 CKGR_PLLBR; 	/* PLL B Register */
-} AT91S_CKGR, *AT91PS_CKGR;
-
-/* -------- CKGR_MOR : (CKGR Offset: 0x0) Main Oscillator Register -------- */
-#define AT91C_CKGR_MOSCEN	((unsigned int) 0x1  <<  0)	/* (CKGR) Main Oscillator Enable */
-#define AT91C_CKGR_OSCTEST	((unsigned int) 0x1  <<  1)	/* (CKGR) Oscillator Test */
-#define AT91C_CKGR_OSCOUNT	((unsigned int) 0xFF <<  8)	/* (CKGR) Main Oscillator Start-up Time */
-
-/* -------- CKGR_MCFR : (CKGR Offset: 0x4) Main Clock Frequency Register -------- */
-#define AT91C_CKGR_MAINF	((unsigned int) 0xFFFF <<  0)	/* (CKGR) Main Clock Frequency */
-#define AT91C_CKGR_MAINRDY	((unsigned int) 0x1 << 16)	/* (CKGR) Main Clock Ready */
-
-/* -------- CKGR_PLLAR : (CKGR Offset: 0x8) PLL A Register -------- */
-#define AT91C_CKGR_DIVA		((unsigned int) 0xFF  <<  0)	/* (CKGR) Divider Selected */
-#define AT91C_CKGR_DIVA_0	((unsigned int) 0x0)		/* (CKGR) Divider output is 0 */
-#define AT91C_CKGR_DIVA_BYPASS	((unsigned int) 0x1)		/* (CKGR) Divider is bypassed */
-#define AT91C_CKGR_PLLACOUNT	((unsigned int) 0x3F  <<  8)	/* (CKGR) PLL A Counter */
-#define AT91C_CKGR_OUTA		((unsigned int) 0x3   << 14)	/* (CKGR) PLL A Output Frequency Range */
-#define AT91C_CKGR_OUTA_0	((unsigned int) 0x0   << 14)	/* (CKGR) Please refer to the PLLA datasheet */
-#define AT91C_CKGR_OUTA_1	((unsigned int) 0x1   << 14)	/* (CKGR) Please refer to the PLLA datasheet */
-#define AT91C_CKGR_OUTA_2	((unsigned int) 0x2   << 14)	/* (CKGR) Please refer to the PLLA datasheet */
-#define AT91C_CKGR_OUTA_3	((unsigned int) 0x3   << 14)	/* (CKGR) Please refer to the PLLA datasheet */
-#define AT91C_CKGR_MULA		((unsigned int) 0x7FF << 16)	/* (CKGR) PLL A Multiplier */
-#define AT91C_CKGR_SRCA		((unsigned int) 0x1   << 29)	/* (CKGR) PLL A Source */
-
-/* -------- CKGR_PLLBR : (CKGR Offset: 0xc) PLL B Register -------- */
-#define AT91C_CKGR_DIVB		((unsigned int) 0xFF  <<  0)	/* (CKGR) Divider Selected */
-#define AT91C_CKGR_DIVB_0	((unsigned int) 0x0)		/* (CKGR) Divider output is 0 */
-#define AT91C_CKGR_DIVB_BYPASS	((unsigned int) 0x1)		/* (CKGR) Divider is bypassed */
-#define AT91C_CKGR_PLLBCOUNT	((unsigned int) 0x3F  <<  8)	/* (CKGR) PLL B Counter */
-#define AT91C_CKGR_OUTB		((unsigned int) 0x3   << 14)	/* (CKGR) PLL B Output Frequency Range */
-#define AT91C_CKGR_OUTB_0	((unsigned int) 0x0   << 14)	/* (CKGR) Please refer to the PLLB datasheet */
-#define AT91C_CKGR_OUTB_1	((unsigned int) 0x1   << 14)	/* (CKGR) Please refer to the PLLB datasheet */
-#define AT91C_CKGR_OUTB_2	((unsigned int) 0x2   << 14)	/* (CKGR) Please refer to the PLLB datasheet */
-#define AT91C_CKGR_OUTB_3	((unsigned int) 0x3   << 14)	/* (CKGR) Please refer to the PLLB datasheet */
-#define AT91C_CKGR_MULB		((unsigned int) 0x7FF << 16)	/* (CKGR) PLL B Multiplier */
-#define AT91C_CKGR_USB_96M	((unsigned int) 0x1   << 28)	/* (CKGR) Divider for USB Ports */
-#define AT91C_CKGR_USB_PLL	((unsigned int) 0x1   << 29)	/* (CKGR) PLL Use */
-
-/******************************************************************************/
-/*        SOFTWARE API DEFINITION  FOR Parallel Input Output Controler        */
-/******************************************************************************/
-typedef struct _AT91S_PIO
-{
-	AT91_REG	 PIO_PER; 	/* PIO Enable Register */
-	AT91_REG	 PIO_PDR; 	/* PIO Disable Register */
-	AT91_REG	 PIO_PSR; 	/* PIO Status Register */
-	AT91_REG	 Reserved0[1]; 	/*  */
-	AT91_REG	 PIO_OER; 	/* Output Enable Register */
-	AT91_REG	 PIO_ODR; 	/* Output Disable Registerr */
-	AT91_REG	 PIO_OSR; 	/* Output Status Register */
-	AT91_REG	 Reserved1[1]; 	/*  */
-	AT91_REG	 PIO_IFER; 	/* Input Filter Enable Register */
-	AT91_REG	 PIO_IFDR; 	/* Input Filter Disable Register */
-	AT91_REG	 PIO_IFSR; 	/* Input Filter Status Register */
-	AT91_REG	 Reserved2[1]; 	/*  */
-	AT91_REG	 PIO_SODR; 	/* Set Output Data Register */
-	AT91_REG	 PIO_CODR; 	/* Clear Output Data Register */
-	AT91_REG	 PIO_ODSR; 	/* Output Data Status Register */
-	AT91_REG	 PIO_PDSR; 	/* Pin Data Status Register */
-	AT91_REG	 PIO_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 PIO_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 PIO_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 PIO_ISR; 	/* Interrupt Status Register */
-	AT91_REG	 PIO_MDER; 	/* Multi-driver Enable Register */
-	AT91_REG	 PIO_MDDR; 	/* Multi-driver Disable Register */
-	AT91_REG	 PIO_MDSR; 	/* Multi-driver Status Register */
-	AT91_REG	 Reserved3[1]; 	/*  */
-	AT91_REG	 PIO_PPUDR; 	/* Pull-up Disable Register */
-	AT91_REG	 PIO_PPUER; 	/* Pull-up Enable Register */
-	AT91_REG	 PIO_PPUSR; 	/* Pad Pull-up Status Register */
-	AT91_REG	 Reserved4[1]; 	/*  */
-	AT91_REG	 PIO_ASR; 	/* Select A Register */
-	AT91_REG	 PIO_BSR; 	/* Select B Register */
-	AT91_REG	 PIO_ABSR; 	/* AB Select Status Register */
-	AT91_REG	 Reserved5[9]; 	/*  */
-	AT91_REG	 PIO_OWER; 	/* Output Write Enable Register */
-	AT91_REG	 PIO_OWDR; 	/* Output Write Disable Register */
-	AT91_REG	 PIO_OWSR; 	/* Output Write Status Register */
-} AT91S_PIO, *AT91PS_PIO;
-
-
-/******************************************************************************/
-/*              SOFTWARE API DEFINITION  FOR Debug Unit                       */
-/******************************************************************************/
-typedef struct _AT91S_DBGU
-{
-	AT91_REG	 DBGU_CR; 	/* Control Register */
-	AT91_REG	 DBGU_MR; 	/* Mode Register */
-	AT91_REG	 DBGU_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 DBGU_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 DBGU_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 DBGU_CSR; 	/* Channel Status Register */
-	AT91_REG	 DBGU_RHR; 	/* Receiver Holding Register */
-	AT91_REG	 DBGU_THR; 	/* Transmitter Holding Register */
-	AT91_REG	 DBGU_BRGR; 	/* Baud Rate Generator Register */
-	AT91_REG	 Reserved0[7]; 	/*  */
-	AT91_REG	 DBGU_C1R; 	/* Chip ID1 Register */
-	AT91_REG	 DBGU_C2R; 	/* Chip ID2 Register */
-	AT91_REG	 DBGU_FNTR; 	/* Force NTRST Register */
-	AT91_REG	 Reserved1[45]; 	/*  */
-	AT91_REG	 DBGU_RPR; 	/* Receive Pointer Register */
-	AT91_REG	 DBGU_RCR; 	/* Receive Counter Register */
-	AT91_REG	 DBGU_TPR; 	/* Transmit Pointer Register */
-	AT91_REG	 DBGU_TCR; 	/* Transmit Counter Register */
-	AT91_REG	 DBGU_RNPR; 	/* Receive Next Pointer Register */
-	AT91_REG	 DBGU_RNCR; 	/* Receive Next Counter Register */
-	AT91_REG	 DBGU_TNPR; 	/* Transmit Next Pointer Register */
-	AT91_REG	 DBGU_TNCR; 	/* Transmit Next Counter Register */
-	AT91_REG	 DBGU_PTCR; 	/* PDC Transfer Control Register */
-	AT91_REG	 DBGU_PTSR; 	/* PDC Transfer Status Register */
-} AT91S_DBGU, *AT91PS_DBGU;
-
-/* -------- DBGU_IER : (DBGU Offset: 0x8) Debug Unit Interrupt Enable Register --------  */
-#define AT91C_US_RXRDY		((unsigned int) 0x1 <<  0) /* (DBGU) RXRDY Interrupt */
-#define AT91C_US_TXRDY		((unsigned int) 0x1 <<  1) /* (DBGU) TXRDY Interrupt */
-#define AT91C_US_ENDRX		((unsigned int) 0x1 <<  3) /* (DBGU) End of Receive Transfer Interrupt */
-#define AT91C_US_ENDTX		((unsigned int) 0x1 <<  4) /* (DBGU) End of Transmit Interrupt */
-#define AT91C_US_OVRE		((unsigned int) 0x1 <<  5) /* (DBGU) Overrun Interrupt */
-#define AT91C_US_FRAME		((unsigned int) 0x1 <<  6) /* (DBGU) Framing Error Interrupt */
-#define AT91C_US_PARE		((unsigned int) 0x1 <<  7) /* (DBGU) Parity Error Interrupt */
-#define AT91C_US_TXEMPTY	((unsigned int) 0x1 <<  9) /* (DBGU) TXEMPTY Interrupt */
-#define AT91C_US_TXBUFE		((unsigned int) 0x1 << 11) /* (DBGU) TXBUFE Interrupt */
-#define AT91C_US_RXBUFF		((unsigned int) 0x1 << 12) /* (DBGU) RXBUFF Interrupt */
-#define AT91C_US_COMM_TX	((unsigned int) 0x1 << 30) /* (DBGU) COMM_TX Interrupt */
-#define AT91C_US_COMM_RX	((unsigned int) 0x1 << 31) /* (DBGU) COMM_RX Interrupt */
-
-/* -------- DBGU_CR : (DBGU Offset: 0x0) Debug Unit Control Register --------  */
-#define AT91C_US_RSTRX		((unsigned int) 0x1 <<  2) /* (DBGU) Reset Receiver */
-#define AT91C_US_RSTTX		((unsigned int) 0x1 <<  3) /* (DBGU) Reset Transmitter */
-#define AT91C_US_RXEN		((unsigned int) 0x1 <<  4) /* (DBGU) Receiver Enable */
-#define AT91C_US_RXDIS		((unsigned int) 0x1 <<  5) /* (DBGU) Receiver Disable */
-#define AT91C_US_TXEN		((unsigned int) 0x1 <<  6) /* (DBGU) Transmitter Enable */
-#define AT91C_US_TXDIS		((unsigned int) 0x1 <<  7) /* (DBGU) Transmitter Disable */
-
-#define AT91C_US_CLKS_CLOCK	((unsigned int) 0x0 <<  4) /* (USART) Clock */
-#define AT91C_US_CHRL_8_BITS	((unsigned int) 0x3 <<  6) /* (USART) Character Length: 8 bits */
-#define AT91C_US_PAR_NONE	((unsigned int) 0x4 <<  9) /* (DBGU) No Parity */
-#define AT91C_US_NBSTOP_1_BIT	((unsigned int) 0x0 << 12) /* (USART) 1 stop bit */
-
-/******************************************************************************/
-/*      SOFTWARE API DEFINITION  FOR Static Memory Controller 2 Interface     */
-/******************************************************************************/
-typedef struct _AT91S_SMC2
-{
-	AT91_REG	 SMC2_CSR[8]; 	/* SMC2 Chip Select Register */
-} AT91S_SMC2, *AT91PS_SMC2;
-
-/* -------- SMC2_CSR : (SMC2 Offset: 0x0) SMC2 Chip Select Register --------  */
-#define AT91C_SMC2_NWS			((unsigned int) 0x7F << 0) /* (SMC2) Number of Wait States */
-#define AT91C_SMC2_WSEN			((unsigned int) 0x1 <<  7) /* (SMC2) Wait State Enable */
-#define AT91C_SMC2_TDF			((unsigned int) 0xF <<  8) /* (SMC2) Data Float Time */
-#define AT91C_SMC2_BAT			((unsigned int) 0x1 << 12) /* (SMC2) Byte Access Type */
-#define AT91C_SMC2_DBW			((unsigned int) 0x1 << 13) /* (SMC2) Data Bus Width */
-#define AT91C_SMC2_DBW_16		((unsigned int) 0x1 << 13) /* (SMC2) 16-bit. */
-#define AT91C_SMC2_DBW_8		((unsigned int) 0x2 << 13) /* (SMC2) 8-bit. */
-#define AT91C_SMC2_DRP			((unsigned int) 0x1 << 15) /* (SMC2) Data Read Protocol */
-#define AT91C_SMC2_ACSS			((unsigned int) 0x3 << 16) /* (SMC2) Address to Chip Select Setup */
-#define AT91C_SMC2_ACSS_STANDARD	((unsigned int) 0x0 << 16) /* (SMC2) Standard, asserted at the beginning of the access and deasserted at the end. */
-#define AT91C_SMC2_ACSS_1_CYCLE		((unsigned int) 0x1 << 16) /* (SMC2) One cycle less at the beginning and the end of the access. */
-#define AT91C_SMC2_ACSS_2_CYCLES	((unsigned int) 0x2 << 16) /* (SMC2) Two cycles less at the beginning and the end of the access. */
-#define AT91C_SMC2_ACSS_3_CYCLES	((unsigned int) 0x3 << 16) /* (SMC2) Three cycles less at the beginning and the end of the access. */
-#define AT91C_SMC2_RWSETUP		((unsigned int) 0x7 << 24) /* (SMC2) Read and Write Signal Setup Time */
-#define AT91C_SMC2_RWHOLD		((unsigned int) 0x7 << 29) /* (SMC2) Read and Write Signal Hold Time */
-
-/******************************************************************************/
-/*           SOFTWARE API DEFINITION  FOR Power Management Controler          */
-/******************************************************************************/
-typedef struct _AT91S_PMC
-{
-	AT91_REG	 PMC_SCER; 	/* System Clock Enable Register */
-	AT91_REG	 PMC_SCDR; 	/* System Clock Disable Register */
-	AT91_REG	 PMC_SCSR; 	/* System Clock Status Register */
-	AT91_REG	 Reserved0[1]; 	/* */
-	AT91_REG	 PMC_PCER; 	/* Peripheral Clock Enable Register */
-	AT91_REG	 PMC_PCDR; 	/* Peripheral Clock Disable Register */
-	AT91_REG	 PMC_PCSR; 	/* Peripheral Clock Status Register */
-	AT91_REG	 Reserved1[5]; 	/* */
-	AT91_REG	 PMC_MCKR; 	/* Master Clock Register */
-	AT91_REG	 Reserved2[3]; 	/* */
-	AT91_REG	 PMC_PCKR[8]; 	/* Programmable Clock Register */
-	AT91_REG	 PMC_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 PMC_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 PMC_SR; 	/* Status Register */
-	AT91_REG	 PMC_IMR; 	/* Interrupt Mask Register */
-} AT91S_PMC, *AT91PS_PMC;
-
-/*------- PMC_SCER : (PMC Offset: 0x0) System Clock Enable Register --------*/
-#define AT91C_PMC_PCK		((unsigned int) 0x1 <<  0) /* (PMC) Processor Clock */
-#define AT91C_PMC_UDP		((unsigned int) 0x1 <<  1) /* (PMC) USB Device Port Clock */
-#define AT91C_PMC_MCKUDP	((unsigned int) 0x1 <<  2) /* (PMC) USB Device Port Master Clock Automatic Disable on Suspend */
-#define AT91C_PMC_UHP		((unsigned int) 0x1 <<  4) /* (PMC) USB Host Port Clock */
-#define AT91C_PMC_PCK0		((unsigned int) 0x1 <<  8) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK1		((unsigned int) 0x1 <<  9) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK2		((unsigned int) 0x1 << 10) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK3		((unsigned int) 0x1 << 11) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK4		((unsigned int) 0x1 << 12) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK5		((unsigned int) 0x1 << 13) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK6		((unsigned int) 0x1 << 14) /* (PMC) Programmable Clock Output */
-#define AT91C_PMC_PCK7		((unsigned int) 0x1 << 15) /* (PMC) Programmable Clock Output */
-/*-------- PMC_SCDR : (PMC Offset: 0x4) System Clock Disable Register ------*/
-/*-------- PMC_SCSR : (PMC Offset: 0x8) System Clock Status Register -------*/
-/*-------- PMC_MCKR : (PMC Offset: 0x30) Master Clock Register --------*/
-#define AT91C_PMC_CSS		((unsigned int) 0x3 <<  0) /* (PMC) Programmable Clock Selection */
-#define AT91C_PMC_CSS_SLOW_CLK	((unsigned int) 0x0)       /* (PMC) Slow Clock is selected */
-#define AT91C_PMC_CSS_MAIN_CLK	((unsigned int) 0x1)       /* (PMC) Main Clock is selected */
-#define AT91C_PMC_CSS_PLLA_CLK	((unsigned int) 0x2)       /* (PMC) Clock from PLL A is selected */
-#define AT91C_PMC_CSS_PLLB_CLK	((unsigned int) 0x3)       /* (PMC) Clock from PLL B is selected */
-#define AT91C_PMC_PRES		((unsigned int) 0x7 <<  2) /* (PMC) Programmable Clock Prescaler */
-#define AT91C_PMC_PRES_CLK	((unsigned int) 0x0 <<  2) /* (PMC) Selected clock */
-#define AT91C_PMC_PRES_CLK_2	((unsigned int) 0x1 <<  2) /* (PMC) Selected clock divided by 2 */
-#define AT91C_PMC_PRES_CLK_4	((unsigned int) 0x2 <<  2) /* (PMC) Selected clock divided by 4 */
-#define AT91C_PMC_PRES_CLK_8	((unsigned int) 0x3 <<  2) /* (PMC) Selected clock divided by 8 */
-#define AT91C_PMC_PRES_CLK_16	((unsigned int) 0x4 <<  2) /* (PMC) Selected clock divided by 16 */
-#define AT91C_PMC_PRES_CLK_32	((unsigned int) 0x5 <<  2) /* (PMC) Selected clock divided by 32 */
-#define AT91C_PMC_PRES_CLK_64	((unsigned int) 0x6 <<  2) /* (PMC) Selected clock divided by 64 */
-#define AT91C_PMC_MDIV		((unsigned int) 0x3 <<  8) /* (PMC) Master Clock Division */
-#define AT91C_PMC_MDIV_1	((unsigned int) 0x0 <<  8) /* (PMC) The master clock and the processor clock are the same */
-#define AT91C_PMC_MDIV_2	((unsigned int) 0x1 <<  8) /* (PMC) The processor clock is twice as fast as the master clock */
-#define AT91C_PMC_MDIV_3	((unsigned int) 0x2 <<  8) /* (PMC) The processor clock is three times faster than the master clock */
-#define AT91C_PMC_MDIV_4	((unsigned int) 0x3 <<  8) /* (PMC) The processor clock is four times faster than the master clock */
-/*------ PMC_PCKR : (PMC Offset: 0x40) Programmable Clock Register --------*/
-/*------ PMC_IER : (PMC Offset: 0x60) PMC Interrupt Enable Register -------*/
-#define AT91C_PMC_MOSCS		((unsigned int) 0x1 <<  0) /* (PMC) MOSC Status/Enable/Disable/Mask */
-#define AT91C_PMC_LOCKA		((unsigned int) 0x1 <<  1) /* (PMC) PLL A Status/Enable/Disable/Mask */
-#define AT91C_PMC_LOCKB		((unsigned int) 0x1 <<  2) /* (PMC) PLL B Status/Enable/Disable/Mask */
-#define AT91C_PMC_MCKRDY	((unsigned int) 0x1 <<  3) /* (PMC) MCK_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK0RDY	((unsigned int) 0x1 <<  8) /* (PMC) PCK0_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK1RDY	((unsigned int) 0x1 <<  9) /* (PMC) PCK1_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK2RDY	((unsigned int) 0x1 << 10) /* (PMC) PCK2_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK3RDY	((unsigned int) 0x1 << 11) /* (PMC) PCK3_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK4RDY	((unsigned int) 0x1 << 12) /* (PMC) PCK4_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK5RDY	((unsigned int) 0x1 << 13) /* (PMC) PCK5_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK6RDY	((unsigned int) 0x1 << 14) /* (PMC) PCK6_RDY Status/Enable/Disable/Mask */
-#define AT91C_PMC_PCK7RDY	((unsigned int) 0x1 << 15) /* (PMC) PCK7_RDY Status/Enable/Disable/Mask */
-/*---- PMC_IDR : (PMC Offset: 0x64) PMC Interrupt Disable Register --------*/
-/*-------- PMC_SR : (PMC Offset: 0x68) PMC Status Register --------*/
-/*-------- PMC_IMR : (PMC Offset: 0x6c) PMC Interrupt Mask Register --------*/
-
-/******************************************************************************/
-/*              SOFTWARE API DEFINITION  FOR Ethernet MAC                     */
-/******************************************************************************/
-typedef struct _AT91S_EMAC
-{
-	AT91_REG	 EMAC_CTL; 	/* Network Control Register */
-	AT91_REG	 EMAC_CFG; 	/* Network Configuration Register */
-	AT91_REG	 EMAC_SR; 	/* Network Status Register */
-	AT91_REG	 EMAC_TAR; 	/* Transmit Address Register */
-	AT91_REG	 EMAC_TCR; 	/* Transmit Control Register */
-	AT91_REG	 EMAC_TSR; 	/* Transmit Status Register */
-	AT91_REG	 EMAC_RBQP; 	/* Receive Buffer Queue Pointer */
-	AT91_REG	 Reserved0[1]; 	/*  */
-	AT91_REG	 EMAC_RSR; 	/* Receive Status Register */
-	AT91_REG	 EMAC_ISR; 	/* Interrupt Status Register */
-	AT91_REG	 EMAC_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 EMAC_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 EMAC_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 EMAC_MAN; 	/* PHY Maintenance Register */
-	AT91_REG	 Reserved1[2]; 	/*  */
-	AT91_REG	 EMAC_FRA; 	/* Frames Transmitted OK Register */
-	AT91_REG	 EMAC_SCOL; 	/* Single Collision Frame Register */
-	AT91_REG	 EMAC_MCOL; 	/* Multiple Collision Frame Register */
-	AT91_REG	 EMAC_OK; 	/* Frames Received OK Register */
-	AT91_REG	 EMAC_SEQE; 	/* Frame Check Sequence Error Register */
-	AT91_REG	 EMAC_ALE; 	/* Alignment Error Register */
-	AT91_REG	 EMAC_DTE; 	/* Deferred Transmission Frame Register */
-	AT91_REG	 EMAC_LCOL; 	/* Late Collision Register */
-	AT91_REG	 EMAC_ECOL; 	/* Excessive Collision Register */
-	AT91_REG	 EMAC_CSE; 	/* Carrier Sense Error Register */
-	AT91_REG	 EMAC_TUE; 	/* Transmit Underrun Error Register */
-	AT91_REG	 EMAC_CDE; 	/* Code Error Register */
-	AT91_REG	 EMAC_ELR; 	/* Excessive Length Error Register */
-	AT91_REG	 EMAC_RJB; 	/* Receive Jabber Register */
-	AT91_REG	 EMAC_USF; 	/* Undersize Frame Register */
-	AT91_REG	 EMAC_SQEE; 	/* SQE Test Error Register */
-	AT91_REG	 EMAC_DRFC; 	/* Discarded RX Frame Register */
-	AT91_REG	 Reserved2[3]; 	/*  */
-	AT91_REG	 EMAC_HSH; 	/* Hash Address High[63:32] */
-	AT91_REG	 EMAC_HSL; 	/* Hash Address Low[31:0] */
-	AT91_REG	 EMAC_SA1L; 	/* Specific Address 1 Low, First 4 bytes */
-	AT91_REG	 EMAC_SA1H; 	/* Specific Address 1 High, Last 2 bytes */
-	AT91_REG	 EMAC_SA2L; 	/* Specific Address 2 Low, First 4 bytes */
-	AT91_REG	 EMAC_SA2H; 	/* Specific Address 2 High, Last 2 bytes */
-	AT91_REG	 EMAC_SA3L; 	/* Specific Address 3 Low, First 4 bytes */
-	AT91_REG	 EMAC_SA3H; 	/* Specific Address 3 High, Last 2 bytes */
-	AT91_REG	 EMAC_SA4L; 	/* Specific Address 4 Low, First 4 bytes */
-	AT91_REG	 EMAC_SA4H; 	/* Specific Address 4 High, Last 2 bytesr */
-} AT91S_EMAC, *AT91PS_EMAC;
-
-/* -------- EMAC_CTL : (EMAC Offset: 0x0)  --------  */
-#define AT91C_EMAC_LB		((unsigned int) 0x1 <<  0) /* (EMAC) Loopback. Optional. When set, loopback signal is at high level. */
-#define AT91C_EMAC_LBL		((unsigned int) 0x1 <<  1) /* (EMAC) Loopback local. */
-#define AT91C_EMAC_RE		((unsigned int) 0x1 <<  2) /* (EMAC) Receive enable. */
-#define AT91C_EMAC_TE		((unsigned int) 0x1 <<  3) /* (EMAC) Transmit enable. */
-#define AT91C_EMAC_MPE		((unsigned int) 0x1 <<  4) /* (EMAC) Management port enable. */
-#define AT91C_EMAC_CSR		((unsigned int) 0x1 <<  5) /* (EMAC) Clear statistics registers. */
-#define AT91C_EMAC_ISR		((unsigned int) 0x1 <<  6) /* (EMAC) Increment statistics registers. */
-#define AT91C_EMAC_WES		((unsigned int) 0x1 <<  7) /* (EMAC) Write enable for statistics registers. */
-#define AT91C_EMAC_BP		((unsigned int) 0x1 <<  8) /* (EMAC) Back pressure. */
-
-/* -------- EMAC_CFG : (EMAC Offset: 0x4) Network Configuration Register --------  */
-#define AT91C_EMAC_SPD		((unsigned int) 0x1 <<  0) /* (EMAC) Speed. */
-#define AT91C_EMAC_FD		((unsigned int) 0x1 <<  1) /* (EMAC) Full duplex. */
-#define AT91C_EMAC_BR		((unsigned int) 0x1 <<  2) /* (EMAC) Bit rate. */
-#define AT91C_EMAC_CAF		((unsigned int) 0x1 <<  4) /* (EMAC) Copy all frames. */
-#define AT91C_EMAC_NBC		((unsigned int) 0x1 <<  5) /* (EMAC) No broadcast. */
-#define AT91C_EMAC_MTI		((unsigned int) 0x1 <<  6) /* (EMAC) Multicast hash enable */
-#define AT91C_EMAC_UNI		((unsigned int) 0x1 <<  7) /* (EMAC) Unicast hash enable. */
-#define AT91C_EMAC_BIG		((unsigned int) 0x1 <<  8) /* (EMAC) Receive 1522 bytes. */
-#define AT91C_EMAC_EAE		((unsigned int) 0x1 <<  9) /* (EMAC) External address match enable. */
-#define AT91C_EMAC_CLK		((unsigned int) 0x3 << 10) /* (EMAC) */
-#define AT91C_EMAC_CLK_HCLK_8	((unsigned int) 0x0 << 10) /* (EMAC) HCLK divided by 8 */
-#define AT91C_EMAC_CLK_HCLK_16	((unsigned int) 0x1 << 10) /* (EMAC) HCLK divided by 16 */
-#define AT91C_EMAC_CLK_HCLK_32	((unsigned int) 0x2 << 10) /* (EMAC) HCLK divided by 32 */
-#define AT91C_EMAC_CLK_HCLK_64	((unsigned int) 0x3 << 10) /* (EMAC) HCLK divided by 64 */
-#define AT91C_EMAC_RTY		((unsigned int) 0x1 << 12) /* (EMAC) */
-#define AT91C_EMAC_RMII		((unsigned int) 0x1 << 13) /* (EMAC) */
-
-/* -------- EMAC_SR : (EMAC Offset: 0x8) Network Status Register --------  */
-#define AT91C_EMAC_MDIO		((unsigned int) 0x1 <<  1) /* (EMAC) */
-#define AT91C_EMAC_IDLE		((unsigned int) 0x1 <<  2) /* (EMAC) */
-
-/* -------- EMAC_TCR : (EMAC Offset: 0x10) Transmit Control Register -------- */
-#define AT91C_EMAC_LEN		((unsigned int) 0x7FF <<  0) /* (EMAC) */
-#define AT91C_EMAC_NCRC		((unsigned int) 0x1 << 15) /* (EMAC) */
-
-/* -------- EMAC_TSR : (EMAC Offset: 0x14) Transmit Control Register -------- */
-#define AT91C_EMAC_OVR		((unsigned int) 0x1 <<  0) /* (EMAC) */
-#define AT91C_EMAC_COL		((unsigned int) 0x1 <<  1) /* (EMAC) */
-#define AT91C_EMAC_RLE		((unsigned int) 0x1 <<  2) /* (EMAC) */
-#define AT91C_EMAC_TXIDLE	((unsigned int) 0x1 <<  3) /* (EMAC) */
-#define AT91C_EMAC_BNQ		((unsigned int) 0x1 <<  4) /* (EMAC) */
-#define AT91C_EMAC_COMP		((unsigned int) 0x1 <<  5) /* (EMAC) */
-#define AT91C_EMAC_UND		((unsigned int) 0x1 <<  6) /* (EMAC) */
-
-/* -------- EMAC_RSR : (EMAC Offset: 0x20) Receive Status Register -------- */
-#define AT91C_EMAC_BNA		((unsigned int) 0x1 <<  0) /* (EMAC) */
-#define AT91C_EMAC_REC		((unsigned int) 0x1 <<  1) /* (EMAC) */
-#define AT91C_EMAC_RSR_OVR	((unsigned int) 0x1 <<  2) /* (EMAC) */
-
-/* -------- EMAC_ISR : (EMAC Offset: 0x24) Interrupt Status Register -------- */
-#define AT91C_EMAC_DONE		((unsigned int) 0x1 <<  0) /* (EMAC) */
-#define AT91C_EMAC_RCOM		((unsigned int) 0x1 <<  1) /* (EMAC) */
-#define AT91C_EMAC_RBNA		((unsigned int) 0x1 <<  2) /* (EMAC) */
-#define AT91C_EMAC_TOVR		((unsigned int) 0x1 <<  3) /* (EMAC) */
-#define AT91C_EMAC_TUND		((unsigned int) 0x1 <<  4) /* (EMAC) */
-#define AT91C_EMAC_RTRY		((unsigned int) 0x1 <<  5) /* (EMAC) */
-#define AT91C_EMAC_TBRE		((unsigned int) 0x1 <<  6) /* (EMAC) */
-#define AT91C_EMAC_TCOM		((unsigned int) 0x1 <<  7) /* (EMAC) */
-#define AT91C_EMAC_TIDLE	((unsigned int) 0x1 <<  8) /* (EMAC) */
-#define AT91C_EMAC_LINK		((unsigned int) 0x1 <<  9) /* (EMAC) */
-#define AT91C_EMAC_ROVR		((unsigned int) 0x1 << 10) /* (EMAC) */
-#define AT91C_EMAC_HRESP	((unsigned int) 0x1 << 11) /* (EMAC) */
-
-/* -------- EMAC_IER : (EMAC Offset: 0x28) Interrupt Enable Register -------- */
-/* -------- EMAC_IDR : (EMAC Offset: 0x2c) Interrupt Disable Register -------- */
-/* -------- EMAC_IMR : (EMAC Offset: 0x30) Interrupt Mask Register -------- */
-/* -------- EMAC_MAN : (EMAC Offset: 0x34) PHY Maintenance Register -------- */
-#define AT91C_EMAC_DATA		((unsigned int) 0xFFFF <<  0) /* (EMAC) */
-#define AT91C_EMAC_CODE		((unsigned int) 0x3  << 16) /* (EMAC) */
-#define AT91C_EMAC_CODE_802_3	((unsigned int) 0x2  << 16) /* (EMAC) Write Operation */
-#define AT91C_EMAC_REGA		((unsigned int) 0x1F << 18) /* (EMAC) */
-#define AT91C_EMAC_PHYA		((unsigned int) 0x1F << 23) /* (EMAC) */
-#define AT91C_EMAC_RW		((unsigned int) 0x3  << 28) /* (EMAC) */
-#define AT91C_EMAC_RW_R		((unsigned int) 0x2  << 28) /* (EMAC) Read Operation */
-#define AT91C_EMAC_RW_W		((unsigned int) 0x1  << 28) /* (EMAC) Write Operation */
-#define AT91C_EMAC_HIGH		((unsigned int) 0x1  << 30) /* (EMAC) */
-#define AT91C_EMAC_LOW		((unsigned int) 0x1  << 31) /* (EMAC) */
-
-/******************************************************************************/
-/*           SOFTWARE API DEFINITION  FOR Serial Parallel Interface           */
-/******************************************************************************/
-typedef struct _AT91S_SPI
-{
-	AT91_REG	 SPI_CR; 	/* Control Register */
-	AT91_REG	 SPI_MR; 	/* Mode Register */
-	AT91_REG	 SPI_RDR; 	/* Receive Data Register */
-	AT91_REG	 SPI_TDR; 	/* Transmit Data Register */
-	AT91_REG	 SPI_SR; 	/* Status Register */
-	AT91_REG	 SPI_IER; 	/* Interrupt Enable Register */
-	AT91_REG	 SPI_IDR; 	/* Interrupt Disable Register */
-	AT91_REG	 SPI_IMR; 	/* Interrupt Mask Register */
-	AT91_REG	 Reserved0[4]; 	/* */
-	AT91_REG	 SPI_CSR[4]; 	/* Chip Select Register */
-	AT91_REG	 Reserved1[48]; /* */
-	AT91_REG	 SPI_RPR; 	/* Receive Pointer Register */
-	AT91_REG	 SPI_RCR; 	/* Receive Counter Register */
-	AT91_REG	 SPI_TPR; 	/* Transmit Pointer Register */
-	AT91_REG	 SPI_TCR; 	/* Transmit Counter Register */
-	AT91_REG	 SPI_RNPR; 	/* Receive Next Pointer Register */
-	AT91_REG	 SPI_RNCR; 	/* Receive Next Counter Register */
-	AT91_REG	 SPI_TNPR; 	/* Transmit Next Pointer Register */
-	AT91_REG	 SPI_TNCR; 	/* Transmit Next Counter Register */
-	AT91_REG	 SPI_PTCR; 	/* PDC Transfer Control Register */
-	AT91_REG	 SPI_PTSR; 	/* PDC Transfer Status Register */
-} AT91S_SPI, *AT91PS_SPI;
-
-/* -------- SPI_CR : (SPI Offset: 0x0) SPI Control Register -------- */
-#define AT91C_SPI_SPIEN		((unsigned int) 0x1 <<  0) /* (SPI) SPI Enable */
-#define AT91C_SPI_SPIDIS	((unsigned int) 0x1 <<  1) /* (SPI) SPI Disable */
-#define AT91C_SPI_SWRST		((unsigned int) 0x1 <<  7) /* (SPI) SPI Software reset */
-
-/* -------- SPI_MR : (SPI Offset: 0x4) SPI Mode Register -------- */
-#define AT91C_SPI_MSTR		((unsigned int) 0x1 <<  0) /* (SPI) Master/Slave Mode */
-#define AT91C_SPI_PS		((unsigned int) 0x1 <<  1) /* (SPI) Peripheral Select */
-#define AT91C_SPI_PS_FIXED	((unsigned int) 0x0 <<  1) /* (SPI) Fixed Peripheral Select */
-#define AT91C_SPI_PS_VARIABLE	((unsigned int) 0x1 <<  1) /* (SPI) Variable Peripheral Select */
-#define AT91C_SPI_PCSDEC	((unsigned int) 0x1 <<  2) /* (SPI) Chip Select Decode */
-#define AT91C_SPI_DIV32		((unsigned int) 0x1 <<  3) /* (SPI) Clock Selection */
-#define AT91C_SPI_MODFDIS	((unsigned int) 0x1 <<  4) /* (SPI) Mode Fault Detection */
-#define AT91C_SPI_LLB		((unsigned int) 0x1 <<  7) /* (SPI) Clock Selection */
-#define AT91C_SPI_PCS		((unsigned int) 0xF << 16) /* (SPI) Peripheral Chip Select */
-#define AT91C_SPI_DLYBCS	((unsigned int) 0xFF << 24) /* (SPI) Delay Between Chip Selects */
-
-/* -------- SPI_RDR : (SPI Offset: 0x8) Receive Data Register -------- */
-#define AT91C_SPI_RD		((unsigned int) 0xFFFF <<  0) /* (SPI) Receive Data */
-#define AT91C_SPI_RPCS		((unsigned int) 0xF << 16) /* (SPI) Peripheral Chip Select Status */
-
-/* -------- SPI_TDR : (SPI Offset: 0xc) Transmit Data Register -------- */
-#define AT91C_SPI_TD		((unsigned int) 0xFFFF <<  0) /* (SPI) Transmit Data */
-#define AT91C_SPI_TPCS		((unsigned int) 0xF << 16) /* (SPI) Peripheral Chip Select Status */
-
-/* -------- SPI_SR : (SPI Offset: 0x10) Status Register -------- */
-#define AT91C_SPI_RDRF		((unsigned int) 0x1 <<  0) /* (SPI) Receive Data Register Full */
-#define AT91C_SPI_TDRE		((unsigned int) 0x1 <<  1) /* (SPI) Transmit Data Register Empty */
-#define AT91C_SPI_MODF		((unsigned int) 0x1 <<  2) /* (SPI) Mode Fault Error */
-#define AT91C_SPI_OVRES		((unsigned int) 0x1 <<  3) /* (SPI) Overrun Error Status */
-#define AT91C_SPI_SPENDRX	((unsigned int) 0x1 <<  4) /* (SPI) End of Receiver Transfer */
-#define AT91C_SPI_SPENDTX	((unsigned int) 0x1 <<  5) /* (SPI) End of Receiver Transfer */
-#define AT91C_SPI_RXBUFF	((unsigned int) 0x1 <<  6) /* (SPI) RXBUFF Interrupt */
-#define AT91C_SPI_TXBUFE	((unsigned int) 0x1 <<  7) /* (SPI) TXBUFE Interrupt */
-#define AT91C_SPI_SPIENS	((unsigned int) 0x1 << 16) /* (SPI) Enable Status */
-
-/* -------- SPI_IER : (SPI Offset: 0x14) Interrupt Enable Register -------- */
-/* -------- SPI_IDR : (SPI Offset: 0x18) Interrupt Disable Register -------- */
-/* -------- SPI_IMR : (SPI Offset: 0x1c) Interrupt Mask Register -------- */
-/* -------- SPI_CSR : (SPI Offset: 0x30) Chip Select Register -------- */
-#define AT91C_SPI_CPOL		((unsigned int) 0x1  <<  0) /* (SPI) Clock Polarity */
-#define AT91C_SPI_NCPHA		((unsigned int) 0x1  <<  1) /* (SPI) Clock Phase */
-#define AT91C_SPI_BITS		((unsigned int) 0xF  <<  4) /* (SPI) Bits Per Transfer */
-#define AT91C_SPI_BITS_8	((unsigned int) 0x0  <<  4) /* (SPI) 8 Bits Per transfer */
-#define AT91C_SPI_BITS_9	((unsigned int) 0x1  <<  4) /* (SPI) 9 Bits Per transfer */
-#define AT91C_SPI_BITS_10	((unsigned int) 0x2  <<  4) /* (SPI) 10 Bits Per transfer */
-#define AT91C_SPI_BITS_11	((unsigned int) 0x3  <<  4) /* (SPI) 11 Bits Per transfer */
-#define AT91C_SPI_BITS_12	((unsigned int) 0x4  <<  4) /* (SPI) 12 Bits Per transfer */
-#define AT91C_SPI_BITS_13	((unsigned int) 0x5  <<  4) /* (SPI) 13 Bits Per transfer */
-#define AT91C_SPI_BITS_14	((unsigned int) 0x6  <<  4) /* (SPI) 14 Bits Per transfer */
-#define AT91C_SPI_BITS_15	((unsigned int) 0x7  <<  4) /* (SPI) 15 Bits Per transfer */
-#define AT91C_SPI_BITS_16	((unsigned int) 0x8  <<  4) /* (SPI) 16 Bits Per transfer */
-#define AT91C_SPI_SCBR		((unsigned int) 0xFF <<  8) /* (SPI) Serial Clock Baud Rate */
-#define AT91C_SPI_DLYBS		((unsigned int) 0xFF << 16) /* (SPI) Serial Clock Baud Rate */
-#define AT91C_SPI_DLYBCT	((unsigned int) 0xFF << 24) /* (SPI) Delay Between Consecutive Transfers */
-
-/******************************************************************************/
-/*           SOFTWARE API DEFINITION  FOR Peripheral Data Controller          */
-/******************************************************************************/
-typedef struct _AT91S_PDC
-{
-	AT91_REG	 PDC_RPR; 	/* Receive Pointer Register */
-	AT91_REG	 PDC_RCR; 	/* Receive Counter Register */
-	AT91_REG	 PDC_TPR; 	/* Transmit Pointer Register */
-	AT91_REG	 PDC_TCR; 	/* Transmit Counter Register */
-	AT91_REG	 PDC_RNPR; 	/* Receive Next Pointer Register */
-	AT91_REG	 PDC_RNCR; 	/* Receive Next Counter Register */
-	AT91_REG	 PDC_TNPR; 	/* Transmit Next Pointer Register */
-	AT91_REG	 PDC_TNCR; 	/* Transmit Next Counter Register */
-	AT91_REG	 PDC_PTCR; 	/* PDC Transfer Control Register */
-	AT91_REG	 PDC_PTSR; 	/* PDC Transfer Status Register */
-} AT91S_PDC, *AT91PS_PDC;
-
-/* -------- PDC_PTCR : (PDC Offset: 0x20) PDC Transfer Control Register -------- */
-#define AT91C_PDC_RXTEN		((unsigned int) 0x1 <<  0) /* (PDC) Receiver Transfer Enable */
-#define AT91C_PDC_RXTDIS	((unsigned int) 0x1 <<  1) /* (PDC) Receiver Transfer Disable */
-#define AT91C_PDC_TXTEN		((unsigned int) 0x1 <<  8) /* (PDC) Transmitter Transfer Enable */
-#define AT91C_PDC_TXTDIS	((unsigned int) 0x1 <<  9) /* (PDC) Transmitter Transfer Disable */
-/* -------- PDC_PTSR : (PDC Offset: 0x24) PDC Transfer Status Register --------  */
-
-/* ========== Register definition ==================================== */
-#define AT91C_SPI_CSR		((AT91_REG *)	0xFFFE0030) /* (SPI) Chip Select Register */
-#define AT91C_PMC_PCER		((AT91_REG *)	0xFFFFFC10) /* (PMC) Peripheral Clock Enable Register */
-#define AT91C_PMC_PCDR		((AT91_REG *)	0xFFFFFC14) /* (PMC) Peripheral Clock Enable Register */
-#define AT91C_PMC_SCER		((AT91_REG *)	0xFFFFFC00) /* (PMC) Peripheral Clock Enable Register */
-#define AT91C_PMC_SCDR		((AT91_REG *)	0xFFFFFC04) /* (PMC) Peripheral Clock Enable Register */
-#define AT91C_PIOA_PER		((AT91_REG *)	0xFFFFF400) /* (PIOA) PIO Enable Register */
-#define AT91C_PIOA_PDR		((AT91_REG *)	0xFFFFF404) /* (PIOA) PIO Disable Register */
-#define AT91C_PIOA_PSR		((AT91_REG *)	0xFFFFF408) /* (PIOA) PIO Status Register */
-#define AT91C_PIOA_OER		((AT91_REG *)	0xFFFFF410) /* (PIOA) PIO Output Enable Register */
-#define AT91C_PIOA_ODR		((AT91_REG *)	0xFFFFF414) /* (PIOA) PIO Output Disable Register */
-#define AT91C_PIOA_OSR		((AT91_REG *)	0xFFFFF418) /* (PIOA) PIO Output Status Register */
-#define AT91C_PIOA_IFER		((AT91_REG *)	0xFFFFF420) /* (PIOA) PIO Glitch Input Filter Enable Register */
-#define AT91C_PIOA_IFDR		((AT91_REG *)	0xFFFFF424) /* (PIOA) PIO Glitch Input Filter Disable Register */
-#define AT91C_PIOA_IFSR		((AT91_REG *)	0xFFFFF428) /* (PIOA) PIO Glitch Input Filter Status Register */
-#define AT91C_PIOA_SODR		((AT91_REG *)	0xFFFFF430) /* (PIOA) PIO Set Output Data Register */
-#define AT91C_PIOA_CODR		((AT91_REG *)	0xFFFFF434) /* (PIOA) PIO Clear Output Data Register */
-#define AT91C_PIOA_ODSR		((AT91_REG *)	0xFFFFF438) /* (PIOA) PIO Output Data Status Register */
-#define AT91C_PIOA_PDSR		((AT91_REG *)	0xFFFFF43C) /* (PIOA) PIO Pin Data Status Register */
-#define AT91C_PIOA_IER		((AT91_REG *)	0xFFFFF440) /* (PIOA) PIO Interrupt Enable Register */
-#define AT91C_PIOA_IDR		((AT91_REG *)	0xFFFFF444) /* (PIOA) PIO Interrupt Disable Register */
-#define AT91C_PIOA_IMR		((AT91_REG *)	0xFFFFF448) /* (PIOA) PIO Interrupt Mask Register */
-#define AT91C_PIOA_ISR		((AT91_REG *)	0xFFFFF44C) /* (PIOA) PIO Interrupt Status Register */
-#define AT91C_PIOA_MDER		((AT91_REG *)	0xFFFFF450) /* (PIOA) PIO Multi-drive Enable Register */
-#define AT91C_PIOA_MDDR		((AT91_REG *)	0xFFFFF454) /* (PIOA) PIO Multi-drive Disable Register */
-#define AT91C_PIOA_MDSR		((AT91_REG *)	0xFFFFF458) /* (PIOA) PIO Multi-drive Status Register */
-#define AT91C_PIOA_PUDR		((AT91_REG *)	0xFFFFF460) /* (PIOA) PIO Pull-up Disable Register */
-#define AT91C_PIOA_PUER		((AT91_REG *)	0xFFFFF464) /* (PIOA) PIO Pull-up Enable Register */
-#define AT91C_PIOA_PUSR		((AT91_REG *)	0xFFFFF468) /* (PIOA) PIO Pull-up Status Register */
-#define AT91C_PIOA_ASR		((AT91_REG *)	0xFFFFF470) /* (PIOA) PIO Peripheral A Select Register */
-#define AT91C_PIOA_BSR		((AT91_REG *)	0xFFFFF474) /* (PIOA) PIO Peripheral B Select Register */
-#define AT91C_PIOA_ABSR		((AT91_REG *)	0xFFFFF478) /* (PIOA) PIO Peripheral AB Select Register */
-#define AT91C_PIOA_OWER		((AT91_REG *)	0xFFFFF4A0) /* (PIOA) PIO Output Write Enable Register */
-#define AT91C_PIOA_OWDR		((AT91_REG *)	0xFFFFF4A4) /* (PIOA) PIO Output Write Disable Register */
-#define AT91C_PIOA_OWSR		((AT91_REG *)	0xFFFFF4A8) /* (PIOA) PIO Output Write Status Register */
-#define AT91C_PIOB_PDR		((AT91_REG *)	0xFFFFF604) /* (PIOB) PIO Disable Register */
-
-#define AT91C_PIO_PA30		((unsigned int) 1 << 30)	/* Pin Controlled by PA30 */
-#define AT91C_PIO_PC0		((unsigned int) 1 <<  0)	/* Pin Controlled by PC0 */
-#define AT91C_PC0_BFCK		((unsigned int) AT91C_PIO_PC0)	/* Burst Flash Clock */
-#define AT91C_PA30_DRXD		((unsigned int) AT91C_PIO_PA30)	/* DBGU Debug Receive Data */
-#define AT91C_PIO_PA31		((unsigned int) 1 << 31)	/* Pin Controlled by PA31 */
-#define AT91C_PA25_TWD		((unsigned int) 1 << 25)
-#define AT91C_PA26_TWCK		((unsigned int) 1 << 26)
-#define AT91C_PA31_DTXD		((unsigned int) AT91C_PIO_PA31)	/* DBGU Debug Transmit Data */
-#define AT91C_PIO_PA17		((unsigned int) 1 << 17)	/* Pin Controlled by PA17 */
-#define AT91C_PA17_TXD0		AT91C_PIO_PA17			/* USART0 Transmit Data */
-#define AT91C_PIO_PA18		((unsigned int) 1 << 18)	/* Pin Controlled by PA18 */
-#define AT91C_PA18_RXD0		AT91C_PIO_PA18			/* USART0 Receive Data */
-#define AT91C_PIO_PB20		((unsigned int) 1 << 20)	/* Pin Controlled by PB20 */
-#define AT91C_PB20_RXD1		AT91C_PIO_PB20			/* USART1 Receive Data */
-#define AT91C_PIO_PB21		((unsigned int) 1 << 21)	/* Pin Controlled by PB21 */
-#define AT91C_PB21_TXD1		AT91C_PIO_PB21			/* USART1 Transmit Data */
-
-#define AT91C_ID_SYS		((unsigned int)  1) /* System Peripheral */
-#define AT91C_ID_PIOA		((unsigned int)  2) /* PIO port A */
-#define AT91C_ID_PIOB		((unsigned int)  3) /* PIO port B */
-#define AT91C_ID_PIOC		((unsigned int)  4) /* PIO port C */
-#define AT91C_ID_USART0		((unsigned int)  6) /* USART 0 */
-#define AT91C_ID_USART1		((unsigned int)  7) /* USART 1 */
-#define AT91C_ID_TWI		((unsigned int) 12) /* Two Wire Interface */
-#define AT91C_ID_SPI		((unsigned int) 13) /* Serial Peripheral Interface */
-#define AT91C_ID_TC0		((unsigned int) 17) /* Timer Counter 0 */
-#define AT91C_ID_UHP		((unsigned int) 23) /* OHCI USB Host Port */
-#define AT91C_ID_EMAC		((unsigned int) 24) /* Ethernet MAC */
-
-#define AT91C_PIO_PC1		((unsigned int) 1 <<  1)	/* Pin Controlled by PC1 */
-#define AT91C_PC1_BFRDY_SMOE	((unsigned int) AT91C_PIO_PC1)	/*  Burst Flash Ready */
-#define AT91C_PIO_PC3		((unsigned int) 1 <<  3)	/* Pin Controlled by PC3 */
-#define AT91C_PC3_BFBAA_SMWE	((unsigned int) AT91C_PIO_PC3)	/*  Burst Flash Address Advance / SmartMedia Write Enable */
-#define AT91C_PIO_PC2		((unsigned int) 1 <<  2)	/* Pin Controlled by PC2 */
-#define AT91C_PC2_BFAVD		((unsigned int) AT91C_PIO_PC2)	/*  Burst Flash Address Valid */
-#define AT91C_PIO_PB1		((unsigned int) 1 <<  1)	/* Pin Controlled by PB1 */
-
-#define AT91C_PIO_PA23		((unsigned int) 1 << 23)	/* Pin Controlled by PA23 */
-#define AT91C_PA23_TXD2		((unsigned int) AT91C_PIO_PA23)	/* USART 2 Transmit Data */
-
-#define AT91C_PIO_PA0		((unsigned int) 1 <<  0)	/* Pin Controlled by PA0 */
-#define AT91C_PA0_MISO		((unsigned int) AT91C_PIO_PA0)	/* SPI Master In Slave */
-#define AT91C_PIO_PA1		((unsigned int) 1 <<  1)	/* Pin Controlled by PA1 */
-#define AT91C_PA1_MOSI		((unsigned int) AT91C_PIO_PA1)	/* SPI Master Out Slave */
-#define AT91C_PIO_PA2		((unsigned int) 1 <<  2)	/* Pin Controlled by PA2 */
-#define AT91C_PA2_SPCK		((unsigned int) AT91C_PIO_PA2)	/* SPI Serial Clock */
-#define AT91C_PIO_PA3		((unsigned int) 1 <<  3)	/* Pin Controlled by PA3 */
-#define AT91C_PA3_NPCS0		((unsigned int) AT91C_PIO_PA3)	/* SPI Peripheral Chip Select 0 */
-#define AT91C_PIO_PA4		((unsigned int) 1 <<  4)	/* Pin Controlled by PA4 */
-#define AT91C_PA4_NPCS1		((unsigned int) AT91C_PIO_PA4)	/* SPI Peripheral Chip Select 1 */
-#define AT91C_PIO_PA5		((unsigned int) 1 <<  5)	/* Pin Controlled by PA5 */
-#define AT91C_PA5_NPCS2		((unsigned int) AT91C_PIO_PA5)	/* SPI Peripheral Chip Select 2 */
-#define AT91C_PIO_PA6		((unsigned int) 1 <<  6)	/* Pin Controlled by PA6 */
-#define AT91C_PA6_NPCS3		((unsigned int) AT91C_PIO_PA6)	/* SPI Peripheral Chip Select 3 */
-
-#define AT91C_PIO_PA16		((unsigned int) 1 << 16)	/* Pin Controlled by PA16 */
-#define AT91C_PA16_EMDIO	((unsigned int) AT91C_PIO_PA16)	/* Ethernet MAC Management Data Input/Output */
-#define AT91C_PIO_PA15		((unsigned int) 1 << 15)	/* Pin Controlled by PA15 */
-#define AT91C_PA15_EMDC		((unsigned int) AT91C_PIO_PA15)	/* Ethernet MAC Management Data Clock */
-#define AT91C_PIO_PA14		((unsigned int) 1 << 14)	/* Pin Controlled by PA14 */
-#define AT91C_PA14_ERXER	((unsigned int) AT91C_PIO_PA14)	/* Ethernet MAC Receive Error */
-#define AT91C_PIO_PA13		((unsigned int) 1 << 13)	/* Pin Controlled by PA13 */
-#define AT91C_PA13_ERX1		((unsigned int) AT91C_PIO_PA13)	/* Ethernet MAC Receive Data 1 */
-#define AT91C_PIO_PA12		((unsigned int) 1 << 12)	/* Pin Controlled by PA12 */
-#define AT91C_PA12_ERX0		((unsigned int) AT91C_PIO_PA12)	/* Ethernet MAC Receive Data 0 */
-#define AT91C_PIO_PA11		((unsigned int) 1 << 11)	/* Pin Controlled by PA11 */
-#define AT91C_PA11_ECRS_ECRSDV	((unsigned int) AT91C_PIO_PA11)	/* Ethernet MAC Carrier Sense/Carrier Sense and Data Valid */
-#define AT91C_PIO_PA10		((unsigned int) 1 << 10)	/* Pin Controlled by PA10 */
-#define AT91C_PA10_ETX1		((unsigned int) AT91C_PIO_PA10)	/* Ethernet MAC Transmit Data 1 */
-#define AT91C_PIO_PA9		((unsigned int) 1 <<  9)	/* Pin Controlled by PA9 */
-#define AT91C_PA9_ETX0		((unsigned int) AT91C_PIO_PA9)	/* Ethernet MAC Transmit Data 0 */
-#define AT91C_PIO_PA8		((unsigned int) 1 <<  8)	/* Pin Controlled by PA8 */
-#define AT91C_PA8_ETXEN		((unsigned int) AT91C_PIO_PA8)	/* Ethernet MAC Transmit Enable */
-#define AT91C_PIO_PA7		((unsigned int) 1 <<  7)	/* Pin Controlled by PA7 */
-#define AT91C_PA7_ETXCK_EREFCK	((unsigned int) AT91C_PIO_PA7)	/* Ethernet MAC Transmit Clock/Reference Clock */
-
-#define AT91C_PIO_PB3		((unsigned int) 1 <<  3)	/* Pin Controlled by PB3 */
-#define AT91C_PIO_PB4		((unsigned int) 1 <<  4)	/* Pin Controlled by PB4 */
-#define AT91C_PIO_PB5		((unsigned int) 1 <<  5)	/* Pin Controlled by PB5 */
-#define AT91C_PIO_PB6		((unsigned int) 1 <<  6)	/* Pin Controlled by PB6 */
-#define AT91C_PIO_PB7		((unsigned int) 1 <<  7)	/* Pin Controlled by PB7 */
-#define AT91C_PIO_PB25		((unsigned int) 1 << 25)	/* Pin Controlled by PB25 */
-#define AT91C_PB25_DSR1		((unsigned int) AT91C_PIO_PB25)	/* USART 1 Data Set ready */
-#define AT91C_PB25_EF100	((unsigned int) AT91C_PIO_PB25)	/* Ethernet MAC Force 100 Mbits */
-#define AT91C_PIO_PB19		((unsigned int) 1 << 19)	/* Pin Controlled by PB19 */
-#define AT91C_PB19_DTR1		((unsigned int) AT91C_PIO_PB19)	/* USART 1 Data Terminal ready */
-#define AT91C_PB19_ERXCK	((unsigned int) AT91C_PIO_PB19)	/* Ethernet MAC Receive Clock */
-#define AT91C_PIO_PB18		((unsigned int) 1 << 18)	/* Pin Controlled by PB18 */
-#define AT91C_PB18_RI1		((unsigned int) AT91C_PIO_PB18)	/* USART 1 Ring Indicator */
-#define AT91C_PB18_ECOL		((unsigned int) AT91C_PIO_PB18)	/* Ethernet MAC Collision Detected */
-#define AT91C_PIO_PB17		((unsigned int) 1 << 17)	/* Pin Controlled by PB17 */
-#define AT91C_PB17_RF2		((unsigned int) AT91C_PIO_PB17)	/* SSC Receive Frame Sync 2 */
-#define AT91C_PB17_ERXDV	((unsigned int) AT91C_PIO_PB17)	/* Ethernet MAC Receive Data Valid */
-#define AT91C_PIO_PB16		((unsigned int) 1 << 16)	/* Pin Controlled by PB16 */
-#define AT91C_PB16_RK2		((unsigned int) AT91C_PIO_PB16)	/* SSC Receive Clock 2 */
-#define AT91C_PB16_ERX3		((unsigned int) AT91C_PIO_PB16)	/* Ethernet MAC Receive Data 3 */
-#define AT91C_PIO_PB15		((unsigned int) 1 << 15)	/* Pin Controlled by PB15 */
-#define AT91C_PB15_RD2		((unsigned int) AT91C_PIO_PB15)	/* SSC Receive Data 2 */
-#define AT91C_PB15_ERX2		((unsigned int) AT91C_PIO_PB15)	/* Ethernet MAC Receive Data 2 */
-#define AT91C_PIO_PB14		((unsigned int) 1 << 14)	/* Pin Controlled by PB14 */
-#define AT91C_PB14_TD2		((unsigned int) AT91C_PIO_PB14)	/* SSC Transmit Data 2 */
-#define AT91C_PB14_ETXER	((unsigned int) AT91C_PIO_PB14)	/* Ethernet MAC Transmikt Coding Error */
-#define AT91C_PIO_PB13		((unsigned int) 1 << 13)	/* Pin Controlled by PB13 */
-#define AT91C_PB13_TK2		((unsigned int) AT91C_PIO_PB13)	/* SSC Transmit Clock 2 */
-#define AT91C_PB13_ETX3		((unsigned int) AT91C_PIO_PB13)	/* Ethernet MAC Transmit Data 3 */
-#define AT91C_PIO_PB12		((unsigned int) 1 << 12)	/* Pin Controlled by PB12 */
-#define AT91C_PB12_TF2		((unsigned int) AT91C_PIO_PB12)	/* SSC Transmit Frame Sync 2 */
-#define AT91C_PB12_ETX2		((unsigned int) AT91C_PIO_PB12)	/* Ethernet MAC Transmit Data 2 */
-
-#define AT91C_PIOB_BSR		((AT91_REG *)	0xFFFFF674)	/* (PIOB) Select B Register */
-#define AT91C_PIOB_PDR		((AT91_REG *)	0xFFFFF604)	/* (PIOB) PIO Disable Register */
-
-#define AT91C_EBI_CS3A_SMC_SmartMedia	((unsigned int) 0x1 <<  3) /* (EBI) Chip Select 3 is assigned to the Static Memory Controller and the SmartMedia Logic is activated. */
-#define AT91C_SMC2_ACSS_STANDARD	((unsigned int) 0x0 << 16) /* (SMC2) Standard, asserted at the beginning of the access and deasserted at the end. */
-#define AT91C_SMC2_DBW_8	((unsigned int) 0x2 << 13) /* (SMC2) 8-bit. */
-#define AT91C_SMC2_WSEN		((unsigned int) 0x1 <<  7) /* (SMC2) Wait State Enable */
-#define AT91C_PIOC_ASR		((AT91_REG *)	0xFFFFF870) /* (PIOC) Select A Register */
-#define AT91C_PIOC_SODR		((AT91_REG *)	0xFFFFF830) /* (PIOC) Set Output Data Register */
-#define AT91C_PIOC_CODR		((AT91_REG *)	0xFFFFF834) /* (PIOC) Clear Output Data Register */
-#define AT91C_PIOC_PDSR		((AT91_REG *)	0xFFFFF83C) /* (PIOC) Pin Data Status Register */
-
-#define AT91C_BASE_SPI		((AT91PS_SPI)	0xFFFE0000) /* (SPI) Base Address */
-#define AT91C_BASE_EMAC		((AT91PS_EMAC)	0xFFFBC000) /* (EMAC) Base Address */
-#define AT91C_BASE_PMC		((AT91PS_PMC)	0xFFFFFC00) /* (PMC) Base Address */
-#define AT91C_BASE_TC0		((AT91PS_TC)	0xFFFA0000) /* (TC0) Base Address */
-#define AT91C_BASE_DBGU		((AT91PS_DBGU)	0xFFFFF200) /* (DBGU) Base Address */
-#define AT91C_BASE_CKGR		((AT91PS_CKGR)	0xFFFFFC20) /* (CKGR) Base Address */
-#define AT91C_BASE_PIOC		((AT91PS_PIO)	0xFFFFF800) /* (PIOC) Base Address */
-#define AT91C_BASE_PIOB		((AT91PS_PIO)	0xFFFFF600) /* (PIOB) Base Address */
-#define AT91C_BASE_PIOA		((AT91PS_PIO)	0xFFFFF400) /* (PIOA) Base Address */
-#define AT91C_EBI_CSA		((AT91_REG *)	0xFFFFFF60) /* (EBI) Chip Select Assignment Register */
-#define AT91C_BASE_SMC2		((AT91PS_SMC2)	0xFFFFFF70) /* (SMC2) Base Address */
-#define AT91C_BASE_US0		((AT91PS_USART)	0xFFFC0000) /* (US0) Base Address */
-#define AT91C_BASE_US1		((AT91PS_USART) 0xFFFC4000) /* (US1) Base Address */
-#define AT91C_TCB0_BMR		((AT91_REG *)	0xFFFA00C4) /* (TCB0) TC Block Mode Register */
-#define AT91C_TCB0_BCR		((AT91_REG *)	0xFFFA00C0) /* (TCB0) TC Block Control Register */
-#define AT91C_PIOC_PDR		((AT91_REG *)	0xFFFFF804) /* (PIOC) PIO Disable Register */
-#define AT91C_PIOC_PER		((AT91_REG *)	0xFFFFF800) /* (PIOC) PIO Enable Register */
-#define AT91C_PIOC_ODR  	((AT91_REG *)	0xFFFFF814) /* (PIOC) Output Disable Registerr */
-#define AT91C_PIOB_PER		((AT91_REG *)	0xFFFFF600) /* (PIOB) PIO Enable Register */
-#define AT91C_PIOB_ODR		((AT91_REG *)	0xFFFFF614) /* (PIOB) Output Disable Registerr */
-#define AT91C_PIOB_PDSR		((AT91_REG *)	0xFFFFF63C) /* (PIOB) Pin Data Status Register */
-
-#endif
diff --git a/arch/arm/mach-at91rm9200/include/mach/hardware.h b/arch/arm/mach-at91rm9200/include/mach/hardware.h
deleted file mode 100644
index a84c60a..0000000
--- a/arch/arm/mach-at91rm9200/include/mach/hardware.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * linux/include/asm-arm/arch-at91/hardware.h
- *
- *  Copyright (C) 2003 SAN People
- *
- * 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_ARCH_HARDWARE_H
-#define __ASM_ARCH_HARDWARE_H
-
-#include <sizes.h>
-
-#ifndef __ASSEMBLY__
-#include "AT91RM9200.h"
-#else
-#include "AT91RM9200_inc.h"
-#endif
-
-/* Virtual and Physical base address for system peripherals */
-#define AT91_SYS_BASE		0xFFFFF000 /*4K */
-
-/* Virtual and Physical base addresses of user peripherals */
-#define AT91_SPI_BASE		0xFFFE0000 /*16K */
-#define AT91_SSC2_BASE		0xFFFD8000 /*16K */
-#define AT91_SSC1_BASE		0xFFFD4000 /*16K */
-#define AT91_SSC0_BASE		0xFFFD0000 /*16K */
-#define AT91_USART3_BASE	0xFFFCC000 /*16K */
-#define AT91_USART2_BASE	0xFFFC8000 /*16K */
-#define AT91_USART1_BASE	0xFFFC4000 /*16K */
-#define AT91_USART0_BASE	0xFFFC0000 /*16K */
-#define AT91_EMAC_BASE		0xFFFBC000 /*16K */
-#define AT91_TWI_BASE		0xFFFB8000 /*16K */
-#define AT91_MCI_BASE		0xFFFB4000 /*16K */
-#define AT91_UDP_BASE		0xFFFB0000 /*16K */
-#define AT91_TCB1_BASE		0xFFFA4000 /*16K */
-#define AT91_TCB0_BASE		0xFFFA0000 /*16K */
-
-#define AT91_USB_HOST_BASE	0x00300000
-#define CFG_USB_OHCI_REGS_BASE  AT91_USB_HOST_BASE
-
-/*
- * Where in virtual memory the IO devices (timers, system controllers
- * and so on)
- */
-#define AT91_IO_BASE		0xF0000000	/* Virt/Phys Address of IO */
-
-/* FLASH */
-#define AT91_FLASH_BASE		0x10000000	/* NCS0 */
-
-/* SDRAM */
-#define AT91_SDRAM_BASE		0x20000000	/* NCS1 */
-
-/* SmartMedia */
-#define AT91_SMARTMEDIA_BASE	0x40000000	/* NCS3 */
-
-/* Definition of interrupt priority levels */
-#define AT91C_AIC_PRIOR_0 AT91C_AIC_PRIOR_LOWEST
-#define AT91C_AIC_PRIOR_1 ((unsigned int) 0x1)
-#define AT91C_AIC_PRIOR_2 ((unsigned int) 0x2)
-#define AT91C_AIC_PRIOR_3 ((unsigned int) 0x3)
-#define AT91C_AIC_PRIOR_4 ((unsigned int) 0x4)
-#define AT91C_AIC_PRIOR_5 ((unsigned int) 0x5)
-#define AT91C_AIC_PRIOR_6 ((unsigned int) 0x6)
-#define AT91C_AIC_PRIOR_7 AT91C_AIC_PRIOR_HIGEST
-
-#endif
-- 
1.7.1



From ghankp at gmail.com  Mon Aug 16 09:44:52 2010
From: ghankp at gmail.com (kuldeep ghan)
Date: Mon, 16 Aug 2010 19:14:52 +0530
Subject: changes for reducing DDR size
In-Reply-To: <20100816091330.GN27749@pengutronix.de>
References: <AANLkTin5C2PLPS26q5BjyBZC3Dt_aYCVWYifSNri8p+G@mail.gmail.com>
	<20100816091330.GN27749@pengutronix.de>
Message-ID: <AANLkTi=i9OVu5g1i1_AXquB_TzX8uE9o6=vMTqmxmhRo@mail.gmail.com>

Hi Sascha,
    >> You have to adjust the TEXT_BASE in arch/arm/mach-imx/Kconfig so that
the
resulting link address is is your address space.

        I have changed the TEXT_BASE to 0xA1F000000. Now it is pointing to
31st MB of 1st chip select. I did not understand what do you mean by "
resulting
link address is your address space " ?

According to TEXT_BASE at 0xA1F000000, i have following stack and malloc
area's

                     Malloc space: 0xa1900000 -> 0xa1f00000 (size  6 MB)
                     Stack space : 0xa18f8000 -> 0xa1900000 (size 32 kB)

    >> For Linux you have to adjust the device size of  the device which is
passed to armlinux_add_dram() to 64MB.

 I am adding two device using armlinux_add_dram() each with 32MB size and
map_base address of 0xA0000000 and 0xB0000000 respectively.. Is that fine or
Can I have one device registered with map_base address of 0xA0000000 and
64MB size??

I have enabled MMU in barebox. There also i have a change for
arm_create_section(). Following is section of code i have in
pcm038_mmu_init()

*static void pcm038_mmu_init(void)
{
        mmu_init();

        arm_create_section(0xa0000000, 0xa0000000, 32, PMD_SECT_DEF_CACHED);
        arm_create_section(0xb0000000, 0xa0000000, 32,
PMD_SECT_DEF_UNCACHED);


        setup_dma_coherent(0x10000000);

#if TEXT_BASE & (0x100000 - 1)
#warning cannot create vector section. Adjust TEXT_BASE to a 1M boundary
#else
        arm_create_section(0x0,        TEXT_BASE,   1,
PMD_SECT_DEF_UNCACHED);
#endif
        mmu_enable();
}*

With all these changes, I see ping command hangs.. :(

   If I replace the macro from PMD_SECT_DEF_UNCACHED to PMD_SECT_DEF_CACHED
in the function pcm038_mmu_init(),  the ping command throws some
transmission timeout messages and exits saying the the destination is not
Alive.

It would be great if you can help me out!!

Thanks,
Kuldeep.

On Mon, Aug 16, 2010 at 2:43 PM, Sascha Hauer <s.hauer at pengutronix.de>wrote:

>
> Hi,
>
> On Fri, Aug 13, 2010 at 08:47:38PM +0530, kuldeep ghan wrote:
> > Hi,
> >         I am using PCM038 based custom board with changes in Memory
> > configuration. I want to know what all changes i have to do in barebox
> > source if I am reducing the size of DDR to 64 MB.
> > I have two 32MB DDR chips interfaced on CSD0 and CSD1. I am able to boot
> the
> > board with changes in pcm038 and lowlevel_init.S. I see that both the
> DDRs
> > are initialized properly and able to write and read to DDR address space.
> >          Ping to command is failing with these changes.  And I am not
> sure
> > about the changes required for stack size and malloc size.
>
> You have to adjust the TEXT_BASE in arch/arm/mach-imx/Kconfig so that the
> resulting link address is is your address space. This should be
> sufficient for barebox. For Linux you have to adjust the device size of
> the device which is passed to armlinux_add_dram() to 64MB.
>
> I hope this helps
>
> Sascha
>
>
> --
> Pengutronix e.K.                           |                             |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |
> Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
> Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100816/7f779f6a/attachment.html>

From natarajsn at gmail.com  Mon Aug 23 00:47:05 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Mon, 23 Aug 2010 10:17:05 +0530
Subject: YAFFS
Message-ID: <AANLkTimhfWcb+q0AzmJs=tW2-B59A8Hg4nU_KqfU7J-e@mail.gmail.com>

Hi

I am u-boot-at91.  My board is at91sam9263ek. Would like to know if barebox
supports YAFFS2?

 Need also an advice on going for Yaffs or Ubifs for Fs on NAND Flash?


Warm regards

Nataraj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100823/ca1cb01b/attachment.html>

From natarajsn at gmail.com  Mon Aug 23 00:53:19 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Mon, 23 Aug 2010 10:23:19 +0530
Subject: barebox and YAFFS
Message-ID: <AANLkTik+qgVTcHQh098CWGBocck_FK=8qgw7R5iSjy39@mail.gmail.com>

Hi

I am u-boot-at91.  My board is at91sam9263ek. Would like to know if barebox
supports YAFFS2?

 Need also an advice on going for Yaffs or Ubifs for Fs on NAND Flash?


Warm regards

Nataraj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100823/4005c25e/attachment.html>

From s.hauer at pengutronix.de  Mon Aug 23 02:24:11 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:11 +0200
Subject: [PATCH 7/9] menu: fix memory corruption
In-Reply-To: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
Message-ID: <1282544653-11508-8-git-send-email-s.hauer@pengutronix.de>

menu_free and menu_entry_free are called on not fully initialized
entries, so we have to check for validity before freeing the
members.

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 common/menu.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/common/menu.c b/common/menu.c
index 6e6637a..294e372 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -46,8 +46,10 @@ void menu_free(struct menu *m)
 
 	if (!m)
 		return;
-	free(m->name);
-	free(m->display);
+	if (m->name)
+		free(m->name);
+	if (m->display)
+		free(m->display);
 
 	list_for_each_entry_safe(me, tmp, &m->entries, list)
 		menu_entry_free(me);
@@ -143,7 +145,9 @@ void menu_entry_free(struct menu_entry *me)
 	if (!me)
 		return;
 
-	free(me->display);
+	if (me->display)
+		free(me->display);
+
 	free(me);
 }
 
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 23 02:24:12 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:12 +0200
Subject: [PATCH 8/9] menu: do not go to free if there's nothing to free
In-Reply-To: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
Message-ID: <1282544653-11508-9-git-send-email-s.hauer@pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 commands/menu.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/commands/menu.c b/commands/menu.c
index b874ccb..f3bd78d 100644
--- a/commands/menu.c
+++ b/commands/menu.c
@@ -80,9 +80,8 @@ static int do_menu_entry_add(struct cmd_menu *cm)
 	}
 
 	me = menu_entry_alloc();
-
 	if (!me)
-		goto free;
+		return -ENOMEM;
 
 	if (cm->submenu) {
 		me->action = menu_action_show;
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 23 02:24:04 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:04 +0200
Subject: Update patches for menu framework
Message-ID: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>

Hi Jean-christophe and all,

Here are some patches to fix some oddities in the menu framework recently
posted.

Sascha



From s.hauer at pengutronix.de  Mon Aug 23 02:24:10 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:10 +0200
Subject: [PATCH 6/9] menu: use an initialized struct list as menu list
In-Reply-To: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
Message-ID: <1282544653-11508-7-git-send-email-s.hauer@pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 commands/menu.c |    3 +++
 common/menu.c   |   19 +++++++------------
 2 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/commands/menu.c b/commands/menu.c
index 5efaa61..b874ccb 100644
--- a/commands/menu.c
+++ b/commands/menu.c
@@ -278,6 +278,9 @@ static int do_menu_list(struct cmd_menu *cm)
 	struct menu* m = NULL;
 	struct menu* menus = menu_get_menus();
 
+	if (!menus)
+		return 0;
+
 	if (is_entry(cm)) {
 		if (cm->menu)
 			m = menu_get_by_name(cm->menu);
diff --git a/common/menu.c b/common/menu.c
index 3596e21..6e6637a 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -30,11 +30,14 @@
 #include <errno.h>
 #include <readkey.h>
 
-static struct menu menus;
+static LIST_HEAD(menus);
 
 struct menu* menu_get_menus(void)
 {
-	return &menus;
+	if (list_empty(&menus))
+		return NULL;
+
+	return list_entry(&menus, struct menu, list);
 }
 
 void menu_free(struct menu *m)
@@ -60,7 +63,7 @@ int menu_add(struct menu *m)
 	if (menu_get_by_name(m->name))
 		return -EEXIST;
 
-	list_add_tail(&m->list, &menus.list);
+	list_add_tail(&m->list, &menus);
 
 	return 0;
 }
@@ -112,7 +115,7 @@ struct menu* menu_get_by_name(char *name)
 	if (!name)
 		return NULL;
 
-	list_for_each_entry(m, &menus.list, list) {
+	list_for_each_entry(m, &menus, list) {
 		if(strcmp(m->name, name) == 0)
 			return m;
 	}
@@ -291,11 +294,3 @@ void menu_action_show(struct menu *m, struct menu_entry *me)
 
 	menu_show(sm);
 }
-
-static int menu_init(void)
-{
-	INIT_LIST_HEAD(&menus.list);
-
-	return 0;
-}
-postcore_initcall(menu_init);
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 23 02:24:06 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:06 +0200
Subject: [PATCH 2/9] menu: Use strdup instead of malloc/strncpy
In-Reply-To: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
Message-ID: <1282544653-11508-3-git-send-email-s.hauer@pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 commands/menu.c |   31 +++++--------------------------
 1 files changed, 5 insertions(+), 26 deletions(-)

diff --git a/commands/menu.c b/commands/menu.c
index 237de9f..39f106b 100644
--- a/commands/menu.c
+++ b/commands/menu.c
@@ -67,7 +67,6 @@ static int do_menu_entry_add(struct cmd_menu *cm)
 {
 	struct menu_entry *me;
 	struct menu *m, *sm;
-	int len;
 	int ret = -ENOMEM;
 
 	if (!cm->menu || (!cm->command && !cm->submenu) || !cm->description)
@@ -99,25 +98,15 @@ static int do_menu_entry_add(struct cmd_menu *cm)
 	} else {
 		me->action = menu_action_run;
 
-		len = strlen(cm->command) + 1;
-
-		me->priv = calloc(len, sizeof(char));
-
+		me->priv = strdup(cm->command);
 		if (!me->priv)
 			goto free;
-
-		strncpy(me->priv, cm->command, len);
 	}
 
-	len = strlen(cm->description) + 1;
-
-	me->display = calloc(len, sizeof(char));;
-
-	if (!m->display)
+	me->display = strdup(cm->description);
+	if (!me->display)
 		goto free;
 
-	strncpy(me->display, cm->description, len);
-
 	ret = menu_add_entry(m, me);
 
 	if (ret)
@@ -175,7 +164,6 @@ static int do_menu_entry_remove(struct cmd_menu *cm)
 static int do_menu_add(struct cmd_menu *cm)
 {
 	struct menu *m;
-	int len = 0;
 	int ret = -ENOMEM;
 
 	if (!cm->menu || !cm->description)
@@ -186,23 +174,14 @@ static int do_menu_add(struct cmd_menu *cm)
 	if (!m)
 		goto free;
 
-	len = strlen(cm->menu) + 1;
-
-	m->name = calloc(len, sizeof(char));;
+	m->name = strdup(cm->menu);
 	if (!m->name)
 		goto free;
 
-	strncpy(m->name, cm->menu, len);
-
-	len = strlen(cm->description) + 1;
-
-	m->display = calloc(len, sizeof(char));;
-
+	m->display = strdup(cm->description);
 	if (!m->display)
 		goto free;
 
-	strncpy(m->display, cm->description, len);
-
 	ret = menu_add(m);
 
 	if (ret)
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 23 02:24:05 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:05 +0200
Subject: [PATCH 1/9] menu: initialize entries list in menu_alloc
In-Reply-To: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
Message-ID: <1282544653-11508-2-git-send-email-s.hauer@pengutronix.de>

Otherwise menu_free fails when menu_add failed.

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 common/menu.c  |    4 ----
 include/menu.h |    9 ++++++++-
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/common/menu.c b/common/menu.c
index b201644..9c40365 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -68,10 +68,6 @@ int menu_add(struct menu *m)
 
 	list_add_tail(&m->list, &menus.list);
 
-	m->nb_entries = 0;
-
-	INIT_LIST_HEAD(&m->entries.list);
-
 	return 0;
 }
 
diff --git a/include/menu.h b/include/menu.h
index 4405ced..128d671 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -55,7 +55,14 @@ struct menu {
  */
 static inline struct menu* menu_alloc(void)
 {
-	return calloc(1, sizeof(struct menu));
+	struct menu *m;
+
+	m = calloc(1, sizeof(struct menu));
+	if (m) {
+		INIT_LIST_HEAD(&m->entries.list);
+		m->nb_entries = 0;
+	}
+	return m;
 }
 void menu_free(struct menu *m);
 int menu_add(struct menu* m);
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 23 02:24:07 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:07 +0200
Subject: [PATCH 3/9] menu: simplify menu_free with list_for_each_entry_safe
In-Reply-To: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
Message-ID: <1282544653-11508-4-git-send-email-s.hauer@pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 common/menu.c |   12 +++---------
 1 files changed, 3 insertions(+), 9 deletions(-)

diff --git a/common/menu.c b/common/menu.c
index 9c40365..6fd74a0 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -39,21 +39,15 @@ struct menu* menu_get_menus(void)
 
 void menu_free(struct menu *m)
 {
-	struct list_head *pos;
-	struct menu_entry *me;
+	struct menu_entry *me, *tmp;
 
 	if (!m)
 		return;
 	free(m->name);
 	free(m->display);
 
-	pos = &m->entries.list;
-
-	if (pos->prev != pos->next && pos->prev != 0)
-		list_for_each(pos, &m->entries.list) {
-			me = list_entry(pos, struct menu_entry, list);
-			menu_entry_free(me);
-		}
+	list_for_each_entry_safe(me, tmp, &m->entries.list, list)
+		menu_entry_free(me);
 
 	free(m);
 }
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 23 02:24:08 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:08 +0200
Subject: [PATCH 4/9] menu: remove superfluous struct menu_entry member from
	struct menu
In-Reply-To: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
Message-ID: <1282544653-11508-5-git-send-email-s.hauer@pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 commands/menu.c |    2 +-
 common/menu.c   |   20 ++++++++++----------
 include/menu.h  |    5 +++--
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/commands/menu.c b/commands/menu.c
index 39f106b..48834f3 100644
--- a/commands/menu.c
+++ b/commands/menu.c
@@ -266,7 +266,7 @@ static void print_entries(struct menu *m)
 	struct list_head *pos;
 	struct menu_entry *me;
 
-	list_for_each(pos, &(m->entries.list)) {
+	list_for_each(pos, &(m->entries)) {
 		me = list_entry(pos, struct menu_entry, list);
 		printf("%d: %s\n", me->num, me->display);
 	}
diff --git a/common/menu.c b/common/menu.c
index 6fd74a0..27c591a 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -46,7 +46,7 @@ void menu_free(struct menu *m)
 	free(m->name);
 	free(m->display);
 
-	list_for_each_entry_safe(me, tmp, &m->entries.list, list)
+	list_for_each_entry_safe(me, tmp, &m->entries, list)
 		menu_entry_free(me);
 
 	free(m);
@@ -86,7 +86,7 @@ int menu_add_entry(struct menu *m, struct menu_entry *me)
 
 	m->nb_entries++;
 	me->num = m->nb_entries;
-	list_add_tail(&me->list, &m->entries.list);
+	list_add_tail(&me->list, &m->entries);
 
 	return 0;
 }
@@ -102,7 +102,7 @@ void menu_remove_entry(struct menu *m, struct menu_entry *me)
 	m->nb_entries--;
 	list_del(&me->list);
 
-	list_for_each(pos, &m->entries.list) {
+	list_for_each(pos, &m->entries) {
 		me = list_entry(pos, struct menu_entry, list);
 		me->num = i++;
 	}
@@ -133,7 +133,7 @@ struct menu_entry* menu_entry_get_by_num(struct menu* m, int num)
 	if (!m || num < 1 || num > m->nb_entries)
 		return NULL;
 
-	list_for_each(pos, &m->entries.list) {
+	list_for_each(pos, &m->entries) {
 		me = list_entry(pos, struct menu_entry, list);
 		if(me->num == num)
 			return me;
@@ -168,7 +168,7 @@ int menu_set_selected_entry(struct menu *m, struct menu_entry* me)
 	if (!m || !me)
 		return -EINVAL;
 
-	list_for_each(pos, &m->entries.list) {
+	list_for_each(pos, &m->entries) {
 		tmp = list_entry(pos, struct menu_entry, list);
 		if(me == tmp) {
 			m->selected = me;
@@ -207,14 +207,14 @@ static void print_menu(struct menu *m)
 		puts(m->name);
 	}
 
-	list_for_each(pos, &m->entries.list) {
+	list_for_each(pos, &m->entries) {
 		me = list_entry(pos, struct menu_entry, list);
 		if(m->selected != me)
 			print_menu_entry(m, me, 0);
 	}
 
 	if (!m->selected) {
-		m->selected = list_first_entry(&m->entries.list,
+		m->selected = list_first_entry(&m->entries,
 						struct menu_entry, list);
 	}
 
@@ -226,7 +226,7 @@ int menu_show(struct menu *m)
 	int ch;
 	int escape = 0;
 
-	if(!m || list_empty(&m->entries.list))
+	if(!m || list_empty(&m->entries))
 		return -EINVAL;
 
 	print_menu(m);
@@ -245,7 +245,7 @@ int menu_show(struct menu *m)
 			print_menu_entry(m, m->selected, 0);
 			m->selected = list_entry(m->selected->list.prev, struct menu_entry,
 						 list);
-			if (&(m->selected->list) == &(m->entries.list)) {
+			if (&(m->selected->list) == &(m->entries)) {
 				m->selected = list_entry(m->selected->list.prev, struct menu_entry,
 							 list);
 			}
@@ -256,7 +256,7 @@ int menu_show(struct menu *m)
 			print_menu_entry(m, m->selected, 0);
 			m->selected = list_entry(m->selected->list.next, struct menu_entry,
 						 list);
-			if (&(m->selected->list) == &(m->entries.list)) {
+			if (&(m->selected->list) == &(m->entries)) {
 				m->selected = list_entry(m->selected->list.next, struct menu_entry,
 							 list);
 			}
diff --git a/include/menu.h b/include/menu.h
index 128d671..4f85ed6 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -43,7 +43,8 @@ struct menu {
 	char *display;
 
 	struct list_head list;
-	struct menu_entry entries;
+	struct list_head entries;
+
 	int nb_entries;
 	int width;
 	struct menu_entry *selected;
@@ -59,7 +60,7 @@ static inline struct menu* menu_alloc(void)
 
 	m = calloc(1, sizeof(struct menu));
 	if (m) {
-		INIT_LIST_HEAD(&m->entries.list);
+		INIT_LIST_HEAD(&m->entries);
 		m->nb_entries = 0;
 	}
 	return m;
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 23 02:24:13 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:13 +0200
Subject: [PATCH 9/9] menu: simplify usage for clients
In-Reply-To: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
Message-ID: <1282544653-11508-10-git-send-email-s.hauer@pengutronix.de>

Clients now only have to call menu_add_submenu or menu_add_command_entry
instead of allocating many strings.
This also fixes some problems in the menu code. The priv field in struct
menu_entry was a pointer to struct menu or a pointer to an allocated string.
It was never freed, only had to be freed when it was an allocated string.
The reference to a submenu is now kept as a string and not to the menu
itself. The code checked the existence of the submenu when creating it, but
crashed when the submenu was removed and referenced afterwards. Now the
code hapily allows references to nonexistant menus but complains during
runtime when the menu is not there.

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 commands/menu.c |   48 +++--------------------
 common/menu.c   |  114 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 include/menu.h  |    6 +-
 3 files changed, 114 insertions(+), 54 deletions(-)

diff --git a/commands/menu.c b/commands/menu.c
index f3bd78d..f734db3 100644
--- a/commands/menu.c
+++ b/commands/menu.c
@@ -26,6 +26,7 @@
 #include <menu.h>
 #include <getopt.h>
 #include <errno.h>
+#include <linux/err.h>
 
 typedef enum {
 #if defined(CONFIG_CMD_MENU_MANAGEMENT)
@@ -66,8 +67,7 @@ struct cmd_menu {
 static int do_menu_entry_add(struct cmd_menu *cm)
 {
 	struct menu_entry *me;
-	struct menu *m, *sm;
-	int ret = -ENOMEM;
+	struct menu *m;
 
 	if (!cm->menu || (!cm->command && !cm->submenu) || !cm->description)
 		return -EINVAL;
@@ -79,50 +79,16 @@ static int do_menu_entry_add(struct cmd_menu *cm)
 		return -EINVAL;
 	}
 
-	me = menu_entry_alloc();
+	if (cm->submenu)
+		me = menu_add_submenu(m, cm->submenu, cm->description);
+	else
+		me = menu_add_command_entry(m, cm->description, cm->command);
 	if (!me)
-		return -ENOMEM;
-
-	if (cm->submenu) {
-		me->action = menu_action_show;
-
-		sm = menu_get_by_name(cm->submenu);
-
-		if (!sm) {
-			eprintf("SubMenu '%s' not found\n", cm->menu);
-			goto free;
-		}
-
-		me->priv = sm;
-	} else {
-		me->action = menu_action_run;
-
-		me->priv = strdup(cm->command);
-		if (!me->priv)
-			goto free;
-	}
-
-	me->display = strdup(cm->description);
-	if (!me->display)
-		goto free;
-
-	ret = menu_add_entry(m, me);
-
-	if (ret)
-		goto free;
+		return PTR_ERR(me);
 
 	me->non_re_ent = !cm->re_entrant;
 
 	return 0;
-
-free:
-	eputs("Entry add fail\n");
-
-	free(me->priv);
-
-	menu_entry_free(me);
-
-	return ret;
 }
 
 /*
diff --git a/common/menu.c b/common/menu.c
index 294e372..24c7b35 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -29,6 +29,7 @@
 #include <xfuncs.h>
 #include <errno.h>
 #include <readkey.h>
+#include <linux/err.h>
 
 static LIST_HEAD(menus);
 
@@ -145,10 +146,7 @@ void menu_entry_free(struct menu_entry *me)
 	if (!me)
 		return;
 
-	if (me->display)
-		free(me->display);
-
-	free(me);
+	me->free(me);
 }
 
 static void print_menu_entry(struct menu *m, struct menu_entry *me, int reverse)
@@ -277,14 +275,76 @@ int menu_show(struct menu *m)
 
 void menu_action_exit(struct menu *m, struct menu_entry *me) {}
 
-void menu_action_run(struct menu *m, struct menu_entry *me)
+struct submenu {
+	char *submenu;
+	struct menu_entry entry;
+};
+
+static void menu_action_show(struct menu *m, struct menu_entry *me)
+{
+	struct submenu *s = container_of(me, struct submenu, entry);
+	struct menu *sm;
+
+	sm = menu_get_by_name(s->submenu);
+	if (sm)
+		menu_show(sm);
+	else
+		eprintf("no such menu: %s\n", s->submenu);
+}
+
+static void submenu_free(struct menu_entry *me)
+{
+	struct submenu *s = container_of(me, struct submenu, entry);
+
+	if (s->entry.display)
+		free(s->entry.display);
+	if (s->submenu)
+		free(s->submenu);
+	free(s);
+}
+
+struct menu_entry *menu_add_submenu(struct menu *parent, char *submenu, char *display)
+{
+	struct submenu *s = calloc(1, sizeof(*s));
+	int ret;
+
+	if (!s)
+		return ERR_PTR(-ENOMEM);
+
+	s->submenu = strdup(submenu);
+	s->entry.action = menu_action_show;
+	s->entry.free = submenu_free;
+	s->entry.display = strdup(display);
+	if (!s->entry.display || !s->submenu) {
+		ret = -ENOMEM;
+		goto err_free;
+	}
+
+	ret = menu_add_entry(parent, &s->entry);
+	if (ret)
+		goto err_free;
+
+	return &s->entry;
+
+err_free:
+	submenu_free(&s->entry);
+	return ERR_PTR(ret);
+}
+
+struct action_entry {
+	char *command;
+	struct menu_entry entry;
+};
+
+static void menu_action_command(struct menu *m, struct menu_entry *me)
 {
+	struct action_entry *e = container_of(me, struct action_entry, entry);
 	int ret;
-	const char *s = getenv((const char*)me->priv);
+	const char *s = getenv(e->command);
 
 	/* can be a command as boot */
 	if (!s)
-		s = me->priv;
+		s = e->command;
 
 	ret = run_command (s, 0);
 
@@ -292,9 +352,43 @@ void menu_action_run(struct menu *m, struct menu_entry *me)
 		udelay(1000000);
 }
 
-void menu_action_show(struct menu *m, struct menu_entry *me)
+static void menu_command_free(struct menu_entry *me)
 {
-	struct menu *sm = me->priv;
+	struct action_entry *e = container_of(me, struct action_entry, entry);
 
-	menu_show(sm);
+	if (e->entry.display)
+		free(e->entry.display);
+	if (e->command)
+		free(e->command);
+
+	free(e);
 }
+
+struct menu_entry *menu_add_command_entry(struct menu *m, char *display, char *command)
+{
+	struct action_entry *e = calloc(1, sizeof(*e));
+	int ret;
+
+	if (!e)
+		return ERR_PTR(-ENOMEM);
+
+	e->command = strdup(command);
+	e->entry.action = menu_action_command;
+	e->entry.free = menu_command_free;
+	e->entry.display = strdup(display);
+
+	if (!e->entry.display || !e->command) {
+		ret = -ENOMEM;
+		goto err_free;
+	}
+
+	ret = menu_add_entry(m, &e->entry);
+	if (ret)
+		goto err_free;
+
+	return &e->entry;
+err_free:
+	menu_command_free(&e->entry);
+	return ERR_PTR(ret);
+}
+
diff --git a/include/menu.h b/include/menu.h
index 4f85ed6..22bfc23 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -32,10 +32,10 @@ struct menu_entry {
 	int num;
 	char *display;
 	void (*action)(struct menu *m, struct menu_entry *me);
+	void (*free)(struct menu_entry *me);
 	int non_re_ent;
 
 	struct list_head list;
-	void *priv;
 };
 
 struct menu {
@@ -65,6 +65,8 @@ static inline struct menu* menu_alloc(void)
 	}
 	return m;
 }
+struct menu_entry *menu_add_submenu(struct menu *parent, char *submenu, char *display);
+struct menu_entry *menu_add_command_entry(struct menu *m, char *display, char *command);
 void menu_free(struct menu *m);
 int menu_add(struct menu* m);
 void menu_remove(struct menu *m);
@@ -89,8 +91,6 @@ struct menu_entry* menu_entry_get_by_num(struct menu* m, int num);
 /*
  * menu entry action functions
  */
-void menu_action_run(struct menu *m, struct menu_entry *me);
-void menu_action_show(struct menu *m, struct menu_entry *me);
 void menu_action_exit(struct menu *m, struct menu_entry *me);
 
 #endif /* __MENU_H__ */
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 23 02:24:09 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:24:09 +0200
Subject: [PATCH 5/9] menu: use list_for_each_entry where appropriate
In-Reply-To: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
Message-ID: <1282544653-11508-6-git-send-email-s.hauer@pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 commands/menu.c |    9 ++-------
 common/menu.c   |   21 +++++----------------
 2 files changed, 7 insertions(+), 23 deletions(-)

diff --git a/commands/menu.c b/commands/menu.c
index 48834f3..5efaa61 100644
--- a/commands/menu.c
+++ b/commands/menu.c
@@ -263,13 +263,10 @@ static int do_menu_show(struct cmd_menu *cm)
 
 static void print_entries(struct menu *m)
 {
-	struct list_head *pos;
 	struct menu_entry *me;
 
-	list_for_each(pos, &(m->entries)) {
-		me = list_entry(pos, struct menu_entry, list);
+	list_for_each_entry(me, &m->entries, list)
 		printf("%d: %s\n", me->num, me->display);
-	}
 }
 
 /*
@@ -278,7 +275,6 @@ static void print_entries(struct menu *m)
  */
 static int do_menu_list(struct cmd_menu *cm)
 {
-	struct list_head *pos;
 	struct menu* m = NULL;
 	struct menu* menus = menu_get_menus();
 
@@ -292,8 +288,7 @@ static int do_menu_list(struct cmd_menu *cm)
 		}
 	}
 
-	list_for_each(pos, &menus->list) {
-		m = list_entry(pos, struct menu, list);
+	list_for_each_entry(m, &menus->list, list) {
 		printf("%s: %s\n", m->name, m->display? m->display : m->name);
 		if (is_entry(cm))
 			print_entries(m);
diff --git a/common/menu.c b/common/menu.c
index 27c591a..3596e21 100644
--- a/common/menu.c
+++ b/common/menu.c
@@ -93,7 +93,6 @@ int menu_add_entry(struct menu *m, struct menu_entry *me)
 
 void menu_remove_entry(struct menu *m, struct menu_entry *me)
 {
-	struct list_head *pos;
 	int i = 1;
 
 	if (!m || !me)
@@ -102,22 +101,18 @@ void menu_remove_entry(struct menu *m, struct menu_entry *me)
 	m->nb_entries--;
 	list_del(&me->list);
 
-	list_for_each(pos, &m->entries) {
-		me = list_entry(pos, struct menu_entry, list);
+	list_for_each_entry(me, &m->entries, list)
 		me->num = i++;
-	}
 }
 
 struct menu* menu_get_by_name(char *name)
 {
-	struct list_head *pos;
 	struct menu* m;
 
 	if (!name)
 		return NULL;
 
-	list_for_each(pos, &menus.list) {
-		m = list_entry(pos, struct menu, list);
+	list_for_each_entry(m, &menus.list, list) {
 		if(strcmp(m->name, name) == 0)
 			return m;
 	}
@@ -127,14 +122,12 @@ struct menu* menu_get_by_name(char *name)
 
 struct menu_entry* menu_entry_get_by_num(struct menu* m, int num)
 {
-	struct list_head *pos;
 	struct menu_entry* me;
 
 	if (!m || num < 1 || num > m->nb_entries)
 		return NULL;
 
-	list_for_each(pos, &m->entries) {
-		me = list_entry(pos, struct menu_entry, list);
+	list_for_each_entry(me, &m->entries, list) {
 		if(me->num == num)
 			return me;
 	}
@@ -162,14 +155,12 @@ static void print_menu_entry(struct menu *m, struct menu_entry *me, int reverse)
 
 int menu_set_selected_entry(struct menu *m, struct menu_entry* me)
 {
-	struct list_head *pos;
 	struct menu_entry* tmp;
 
 	if (!m || !me)
 		return -EINVAL;
 
-	list_for_each(pos, &m->entries) {
-		tmp = list_entry(pos, struct menu_entry, list);
+	list_for_each_entry(tmp, &m->entries, list) {
 		if(me == tmp) {
 			m->selected = me;
 			return 0;
@@ -195,7 +186,6 @@ int menu_set_selected(struct menu *m, int num)
 
 static void print_menu(struct menu *m)
 {
-	struct list_head *pos;
 	struct menu_entry *me;
 
 	clear();
@@ -207,8 +197,7 @@ static void print_menu(struct menu *m)
 		puts(m->name);
 	}
 
-	list_for_each(pos, &m->entries) {
-		me = list_entry(pos, struct menu_entry, list);
+	list_for_each_entry(me, &m->entries, list) {
 		if(m->selected != me)
 			print_menu_entry(m, me, 0);
 	}
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 23 02:26:20 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 08:26:20 +0200
Subject: YAFFS
In-Reply-To: <AANLkTimhfWcb+q0AzmJs=tW2-B59A8Hg4nU_KqfU7J-e@mail.gmail.com>
References: <AANLkTimhfWcb+q0AzmJs=tW2-B59A8Hg4nU_KqfU7J-e@mail.gmail.com>
Message-ID: <20100823062620.GO27749@pengutronix.de>

Hello,

On Mon, Aug 23, 2010 at 10:17:05AM +0530, Nataraj S Narayan wrote:
> Hi
> 
> I am u-boot-at91.  My board is at91sam9263ek. Would like to know if barebox
> supports YAFFS2?

Barebox currently does not support YAFFS2.

> 
>  Need also an advice on going for Yaffs or Ubifs for Fs on NAND Flash?

We currently also do not support UBIFS. We only support UBI (the UBIFS
layer works on top of UBI)

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From jbe at pengutronix.de  Mon Aug 23 03:16:16 2010
From: jbe at pengutronix.de (Juergen Beisert)
Date: Mon, 23 Aug 2010 09:16:16 +0200
Subject: changes for reducing DDR size
In-Reply-To: <AANLkTi=i9OVu5g1i1_AXquB_TzX8uE9o6=vMTqmxmhRo@mail.gmail.com>
References: <AANLkTin5C2PLPS26q5BjyBZC3Dt_aYCVWYifSNri8p+G@mail.gmail.com>
	<20100816091330.GN27749@pengutronix.de>
	<AANLkTi=i9OVu5g1i1_AXquB_TzX8uE9o6=vMTqmxmhRo@mail.gmail.com>
Message-ID: <201008230916.16725.jbe@pengutronix.de>

kuldeep ghan wrote:
> [...]
>  I am adding two device using armlinux_add_dram() each with 32MB size and
> map_base address of 0xA0000000 and 0xB0000000 respectively.. Is that fine
> or Can I have one device registered with map_base address of 0xA0000000 and
> 64MB size??

You are using non continuous memory. I'm not sure, if that is handled in 
barebox correctly. Also Linux may have a problem with this kind of memory 
organization.

jbe

-- 
Pengutronix e.K.                              | Juergen Beisert             |
Linux Solutions for Science and Industry      | Phone: +49-8766-939 228     |
Vertretung Sued/Muenchen, Germany             | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686              | http://www.pengutronix.de/  |


From plagnioj at jcrosoft.com  Mon Aug 23 07:40:15 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 23 Aug 2010 13:40:15 +0200
Subject: [PATCH 7/9] menu: fix memory corruption
In-Reply-To: <1282544653-11508-8-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
	<1282544653-11508-8-git-send-email-s.hauer@pengutronix.de>
Message-ID: <20100823114015.GU8693@game.jcrosoft.org>

On 08:24 Mon 23 Aug     , Sascha Hauer wrote:
> menu_free and menu_entry_free are called on not fully initialized
> entries, so we have to check for validity before freeing the
> members.
> 
I disagree free is suposed to not fail evenif we pass a NULL pointer

Best Regards,
J.


From u.kleine-koenig at pengutronix.de  Mon Aug 23 08:44:19 2010
From: u.kleine-koenig at pengutronix.de (Uwe =?iso-8859-1?Q?Kleine-K=F6nig?=)
Date: Mon, 23 Aug 2010 14:44:19 +0200
Subject: [PATCH 7/9] menu: fix memory corruption
In-Reply-To: <20100823114015.GU8693@game.jcrosoft.org>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
	<1282544653-11508-8-git-send-email-s.hauer@pengutronix.de>
	<20100823114015.GU8693@game.jcrosoft.org>
Message-ID: <20100823124419.GC8018@pengutronix.de>

On Mon, Aug 23, 2010 at 01:40:15PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 08:24 Mon 23 Aug     , Sascha Hauer wrote:
> > menu_free and menu_entry_free are called on not fully initialized
> > entries, so we have to check for validity before freeing the
> > members.
> > 
> I disagree free is suposed to not fail evenif we pass a NULL pointer
Ack.  (ie. free must accept NULL without barfing.)

free(3) has this feature:

	"free() frees the memory space pointed to by ptr [...].  If ptr
	 is NULL, no operation is performed."

and kfree in the kernel accepts NULL, too.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |


From plagnioj at jcrosoft.com  Mon Aug 23 11:18:05 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 23 Aug 2010 17:18:05 +0200
Subject: [PATCH 9/9] menu: simplify usage for clients
In-Reply-To: <1282544653-11508-10-git-send-email-s.hauer@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
	<1282544653-11508-10-git-send-email-s.hauer@pengutronix.de>
Message-ID: <20100823151805.GV8693@game.jcrosoft.org>

On 08:24 Mon 23 Aug     , Sascha Hauer wrote:
> Clients now only have to call menu_add_submenu or menu_add_command_entry
> instead of allocating many strings.
> This also fixes some problems in the menu code. The priv field in struct
> menu_entry was a pointer to struct menu or a pointer to an allocated string.
> It was never freed, only had to be freed when it was an allocated string.
> The reference to a submenu is now kept as a string and not to the menu
> itself. The code checked the existence of the submenu when creating it, but
> crashed when the submenu was removed and referenced afterwards. Now the
> code hapily allows references to nonexistant menus but complains during
> runtime when the menu is not there.
ok but no need to check if the pointer is null before freeing and please do
not remove the priv pointer as I use is in C API for complex menu to pass data
to the action
That's why I keep it as void*
> 
> Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
> ---
>  commands/menu.c |   48 +++--------------------
>  common/menu.c   |  114 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
>  include/menu.h  |    6 +-
>  3 files changed, 114 insertions(+), 54 deletions(-)
> 
> diff --git a/commands/menu.c b/commands/menu.c
> index f3bd78d..f734db3 100644
> --- a/commands/menu.c
> +++ b/commands/menu.c
> @@ -26,6 +26,7 @@
>  #include <menu.h>
>  #include <getopt.h>
>  #include <errno.h>
> +#include <linux/err.h>
>  
>  typedef enum {
>  #if defined(CONFIG_CMD_MENU_MANAGEMENT)
> @@ -66,8 +67,7 @@ struct cmd_menu {
.... 
>  /*
> diff --git a/common/menu.c b/common/menu.c
> index 294e372..24c7b35 100644
> --- a/common/menu.c
> +++ b/common/menu.c
> @@ -29,6 +29,7 @@
>  #include <xfuncs.h>
>  #include <errno.h>
>  #include <readkey.h>
> +#include <linux/err.h>
>  
>  static LIST_HEAD(menus);
>  
> @@ -145,10 +146,7 @@ void menu_entry_free(struct menu_entry *me)
>  	if (!me)
>  		return;
>  
> -	if (me->display)
> -		free(me->display);
> -
> -	free(me);
> +	me->free(me);
we must check the pointer first as in the C API we must be able to overwrite
it or we must check that the C API provice it
>  }
>  
>  static void print_menu_entry(struct menu *m, struct menu_entry *me, int reverse)
> @@ -277,14 +275,76 @@ int menu_show(struct menu *m)
>  
>  void menu_action_exit(struct menu *m, struct menu_entry *me) {}
>  
> -void menu_action_run(struct menu *m, struct menu_entry *me)
> +struct submenu {
> +	char *submenu;
> +	struct menu_entry entry;
> +};
> +
> +static void menu_action_show(struct menu *m, struct menu_entry *me)
> +{
> +	struct submenu *s = container_of(me, struct submenu, entry);
> +	struct menu *sm;
> +
> +	sm = menu_get_by_name(s->submenu);
> +	if (sm)
> +		menu_show(sm);
> +	else
> +		eprintf("no such menu: %s\n", s->submenu);
> +}
> +
> +static void submenu_free(struct menu_entry *me)
> +{
> +	struct submenu *s = container_of(me, struct submenu, entry);
> +
> +	if (s->entry.display)
no need
> +		free(s->entry.display);
> +	if (s->submenu)
no need
etc...
> +		free(s->submenu);
> +	free(s);
> +}
> +
> diff --git a/include/menu.h b/include/menu.h
> index 4f85ed6..22bfc23 100644
> --- a/include/menu.h
> +++ b/include/menu.h
> @@ -32,10 +32,10 @@ struct menu_entry {
>  	int num;
>  	char *display;
>  	void (*action)(struct menu *m, struct menu_entry *me);
> +	void (*free)(struct menu_entry *me);
>  	int non_re_ent;
>  
>  	struct list_head list;
> -	void *priv;
please keep
>  };
>  
Best Regards,
J.


From s.hauer at pengutronix.de  Mon Aug 23 12:49:54 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 23 Aug 2010 18:49:54 +0200
Subject: [PATCH 9/9] menu: simplify usage for clients
In-Reply-To: <20100823151805.GV8693@game.jcrosoft.org>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
	<1282544653-11508-10-git-send-email-s.hauer@pengutronix.de>
	<20100823151805.GV8693@game.jcrosoft.org>
Message-ID: <20100823164954.GW27749@pengutronix.de>

On Mon, Aug 23, 2010 at 05:18:05PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 08:24 Mon 23 Aug     , Sascha Hauer wrote:
> > Clients now only have to call menu_add_submenu or menu_add_command_entry
> > instead of allocating many strings.
> > This also fixes some problems in the menu code. The priv field in struct
> > menu_entry was a pointer to struct menu or a pointer to an allocated string.
> > It was never freed, only had to be freed when it was an allocated string.
> > The reference to a submenu is now kept as a string and not to the menu
> > itself. The code checked the existence of the submenu when creating it, but
> > crashed when the submenu was removed and referenced afterwards. Now the
> > code hapily allows references to nonexistant menus but complains during
> > runtime when the menu is not there.
> ok but no need to check if the pointer is null before freeing and please do
> not remove the priv pointer as I use is in C API for complex menu to pass data
> to the action
> That's why I keep it as void*

So there's data associated to *priv, how do you free it then when...

> > 
> >  #include <errno.h>
> >  #include <readkey.h>
> > +#include <linux/err.h>
> >  
> >  static LIST_HEAD(menus);
> >  
> > @@ -145,10 +146,7 @@ void menu_entry_free(struct menu_entry *me)
> >  	if (!me)
> >  		return;
> >  
> > -	if (me->display)
> > -		free(me->display);
> > -
> > -	free(me);
> > +	me->free(me);
> we must check the pointer first as in the C API we must be able to overwrite
> it or we must check that the C API provice it

... you don't provide a free function?

You can't overwrite menu_entry_free as it is called from menu_free.

> >  }
> >  
> >  static void print_menu_entry(struct menu *m, struct menu_entry *me, int reverse)
> > @@ -277,14 +275,76 @@ int menu_show(struct menu *m)
> >  
> >  void menu_action_exit(struct menu *m, struct menu_entry *me) {}
> >  
> > -void menu_action_run(struct menu *m, struct menu_entry *me)
> > +struct submenu {
> > +	char *submenu;
> > +	struct menu_entry entry;
> > +};

Note how struct menu_entry here is contained in a bigger struct. This
way you can associate private data to a menu_entry using container_of
without the use of a priv pointer.

That said we can keep the priv pointer, but you can't use it for data
which must be freed, at least not without providing a free function.
That was what I was trying to enforce, maybe that went a bit too far.

Ok for the NULL pointer checks before free. I will remove them.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From natarajsn at gmail.com  Tue Aug 24 01:15:48 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Tue, 24 Aug 2010 10:45:48 +0530
Subject: barebox: saveenv issue
Message-ID: <AANLkTimf-=fhyqZni5eyu2KTmv50Pm+QCb+OdNN9rBxE@mail.gmail.com>

Hi

When I give a saveenv command I get this, and the waiting endless,

9263-EK:/ saveenv
saving environment
cfi_protect: unprotect 0xf1851002 (size 131072)

I am on at91sam9263ek.

regards

Nataraj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100824/4ffa1e09/attachment.html>

From u.kleine-koenig at pengutronix.de  Tue Aug 24 13:59:39 2010
From: u.kleine-koenig at pengutronix.de (Uwe =?iso-8859-1?Q?Kleine-K=F6nig?=)
Date: Tue, 24 Aug 2010 19:59:39 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100821113550.GA25293@merkur.ravnborg.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100818151536.GF454@game.jcrosoft.org>
	<20100821102734.GN27749@pengutronix.de>
	<20100821113550.GA25293@merkur.ravnborg.org>
Message-ID: <20100824175939.GA27985@pengutronix.de>

Hi Sam,

On Sat, Aug 21, 2010 at 01:35:50PM +0200, Sam Ravnborg wrote:
> On Sat, Aug 21, 2010 at 12:27:34PM +0200, Sascha Hauer wrote:
> > On Wed, Aug 18, 2010 at 05:15:36PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > > On 06:17 Sun 08 Aug     , Jean-Christophe PLAGNIOL-VILLARD wrote:
> > > > this will add also the support of the new ncurse interface nconfig
> > > > 
> > > > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> > > is it ok to apply it?
> > 
> > Generally ok, yes. I just thought we should wait a little for a later
> > version, or have I misunderstood Sam?
> 
> Current state of kconfig in v2.6.36-rc1 (which is a later version than
> the one Jean-Christophe references) is the following:
> - savedefconfig bugs fixed
> - reading a minimal config (created by savedefconfig) fixed
> 
> The nconfig issues I mentioned regarding search are
> not yet ready.
> And I am not sure if they go in until next merge window.
> 
> Likewise there are patches in the works that will ease
> the integration with external projects.
> The patches does the following:
> - Allows the prefix to be configured (CONFIG_ => BR2_)
> - No more hardcoded "kernel" strings
> - mainmenu in the config file is used as headline
> 
> These patches will go in during next merge window if they
> are finished in due time.
Just in case you run out of ideas, one thing that I would really like to
have is a "Go there" button in the search results.  I often want to
change one symbol.  The easiest way to do this (apart from editing
.config directly) would be:

	make menuorwhateverconfig
	/CONFIG_FOO
	"Go there"
	enable it
	quit+save

Or better:

	make menuorwhateverconfig
	/CONFIG_FOO
	"enable"

OK, it's not that easy as FOO might have dependencies that even might
not be fulfillable, but still, I'd like it.

And there is IMHO a bug in Kconfig.  If I search for "CONFIG_LL" I get a
long list starting with:

	CPU_LLSERIAL_S3C2440_ONLY
	S3C_GPIO_PULL_UP
	S3C2440_PLL_16934400
	USB_GADGET_LANGWELL
	MACH_ARMADILLO5X0

If I had to guess what the problem is, I'd say that kconfig strips
"CONFIG_" before searching.  It should better search for ^LL instead of
LL, no?

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |


From sam at ravnborg.org  Tue Aug 24 14:09:21 2010
From: sam at ravnborg.org (Sam Ravnborg)
Date: Tue, 24 Aug 2010 20:09:21 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100824175939.GA27985@pengutronix.de>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100818151536.GF454@game.jcrosoft.org>
	<20100821102734.GN27749@pengutronix.de>
	<20100821113550.GA25293@merkur.ravnborg.org>
	<20100824175939.GA27985@pengutronix.de>
Message-ID: <20100824180921.GA489@merkur.ravnborg.org>

> Just in case you run out of ideas,
I'm married you know :-)

> one thing that I would really like to
> have is a "Go there" button in the search results.  I often want to
> change one symbol.  The easiest way to do this (apart from editing
> .config directly) would be:
> 
> 	make menuorwhateverconfig
> 	/CONFIG_FOO
> 	"Go there"
> 	enable it
> 	quit+save
> 
> Or better:
> 
> 	make menuorwhateverconfig
> 	/CONFIG_FOO
> 	"enable"
> 
> OK, it's not that easy as FOO might have dependencies that even might
> not be fulfillable, but still, I'd like it.

I always have wished that for any search results I could jump to the
referred menu.
This is one of the features that I hope we can extend nconfig with one day.

Note: In my head menuconfig is soon to be replaced by nconfig.
      "make menuconfig" will thus fire up nconfig and not the
      lxdialog version.
      But it will take a few months before we are that far.


> 
> And there is IMHO a bug in Kconfig.  If I search for "CONFIG_LL" I get a
> long list starting with:
> 
> 	CPU_LLSERIAL_S3C2440_ONLY
> 	S3C_GPIO_PULL_UP
> 	S3C2440_PLL_16934400
> 	USB_GADGET_LANGWELL
> 	MACH_ARMADILLO5X0
> 
> If I had to guess what the problem is, I'd say that kconfig strips
> "CONFIG_" before searching.  It should better search for ^LL instead of
> LL, no?
Sounds right and is simple to implement.
I may take a look at that soon.

	Sam


From r.schwebel at pengutronix.de  Tue Aug 24 14:42:32 2010
From: r.schwebel at pengutronix.de (Robert Schwebel)
Date: Tue, 24 Aug 2010 20:42:32 +0200
Subject: [PATCH] Kconfig: sync with linux kernel v2.6.35-4771-g1787985
In-Reply-To: <20100824180921.GA489@merkur.ravnborg.org>
References: <1281241073-19115-1-git-send-email-plagnioj@jcrosoft.com>
	<20100818151536.GF454@game.jcrosoft.org>
	<20100821102734.GN27749@pengutronix.de>
	<20100821113550.GA25293@merkur.ravnborg.org>
	<20100824175939.GA27985@pengutronix.de>
	<20100824180921.GA489@merkur.ravnborg.org>
Message-ID: <20100824184232.GF30096@pengutronix.de>

On Tue, Aug 24, 2010 at 08:09:21PM +0200, Sam Ravnborg wrote:
> Note: In my head menuconfig is soon to be replaced by nconfig.
>       "make menuconfig" will thus fire up nconfig and not the
>       lxdialog version. But it will take a few months before
>       we are that far.

You should change the colors to blue. Otherwhise you'll end up like Eric
Raymond 8-)

rsc
-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From mkl at pengutronix.de  Tue Aug 24 16:26:09 2010
From: mkl at pengutronix.de (Marc Kleine-Budde)
Date: Tue, 24 Aug 2010 22:26:09 +0200
Subject: [PATCH 0/3] fix defaultenv
Message-ID: <1282681572-20846-1-git-send-email-mkl@pengutronix.de>

Hello,

this series of patches fixes some problems with the defaultenv.

Please review and consider to apply.

cheer, Marc

---

The following changes since commit 3762bb24856e70a9947847cd5b3f124aaa8a8a3a:

  pcm043: remove unused defines (2010-08-16 10:29:36 +0200)

are available in the git repository at:
  git://git.pengutronix.de/git/mkl/barebox.git for-sha

Marc Kleine-Budde (3):
      defaultenv: fix physmap-flash device name
      defaultenv: fix adding of nand_parts
      defaultenv: create /dev/ram0.kernel at offset 8M

 defaultenv/bin/boot |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)



From mkl at pengutronix.de  Tue Aug 24 16:26:10 2010
From: mkl at pengutronix.de (Marc Kleine-Budde)
Date: Tue, 24 Aug 2010 22:26:10 +0200
Subject: [PATCH 1/3] defaultenv: fix physmap-flash device name
In-Reply-To: <1282681572-20846-1-git-send-email-mkl@pengutronix.de>
References: <1282681572-20846-1-git-send-email-mkl@pengutronix.de>
Message-ID: <1282681572-20846-2-git-send-email-mkl@pengutronix.de>

The first physmap-flash device is called "physmap-flash.0" (like zero),
not "physmap-flash.o" (like in oops).

Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
---
 defaultenv/bin/boot |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/defaultenv/bin/boot b/defaultenv/bin/boot
index 6a508fb..5312d1e 100644
--- a/defaultenv/bin/boot
+++ b/defaultenv/bin/boot
@@ -43,7 +43,7 @@ else
 fi
 
 if [ -n $nor_parts ]; then
-	mtdparts="${mtdparts}physmap-flash.o:${nor_parts};"
+	mtdparts="${mtdparts}physmap-flash.0:${nor_parts};"
 fi
 
 if [ -n $nand_parts ]; then
-- 
1.7.1



From mkl at pengutronix.de  Tue Aug 24 16:26:11 2010
From: mkl at pengutronix.de (Marc Kleine-Budde)
Date: Tue, 24 Aug 2010 22:26:11 +0200
Subject: [PATCH 2/3] defaultenv: fix adding of nand_parts
In-Reply-To: <1282681572-20846-1-git-send-email-mkl@pengutronix.de>
References: <1282681572-20846-1-git-send-email-mkl@pengutronix.de>
Message-ID: <1282681572-20846-3-git-send-email-mkl@pengutronix.de>

Really add nand_parts if nand_parts are set, not nor_parts.

Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
---
 defaultenv/bin/boot |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/defaultenv/bin/boot b/defaultenv/bin/boot
index 5312d1e..a9e589b 100644
--- a/defaultenv/bin/boot
+++ b/defaultenv/bin/boot
@@ -47,7 +47,7 @@ if [ -n $nor_parts ]; then
 fi
 
 if [ -n $nand_parts ]; then
-	mtdparts="${mtdparts}$nand_device:${nor_parts};"
+	mtdparts="${mtdparts}${nand_device}:${nand_parts};"
 fi
 
 if [ -n $mtdparts ]; then
-- 
1.7.1



From mkl at pengutronix.de  Tue Aug 24 16:26:12 2010
From: mkl at pengutronix.de (Marc Kleine-Budde)
Date: Tue, 24 Aug 2010 22:26:12 +0200
Subject: [PATCH 3/3] defaultenv: create /dev/ram0.kernel at offset 8M
In-Reply-To: <1282681572-20846-1-git-send-email-mkl@pengutronix.de>
References: <1282681572-20846-1-git-send-email-mkl@pengutronix.de>
Message-ID: <1282681572-20846-4-git-send-email-mkl@pengutronix.de>

otherwise uImages won't boot.

Signed-off-by: Marc Kleine-Budde <mkl at pengutronix.de>
---
 defaultenv/bin/boot |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/defaultenv/bin/boot b/defaultenv/bin/boot
index a9e589b..6476bdb 100644
--- a/defaultenv/bin/boot
+++ b/defaultenv/bin/boot
@@ -62,7 +62,7 @@ fi
 if [ ! -e /dev/ram0.kernel ]; then
 	# Here we can safely put the kernel without risking of overwriting it
 	# while extracting
-	addpart dev/ram0 8M(kernel)
+	addpart dev/ram0 8M at 8M(kernel)
 fi
 
 if [ x$kernel_loc = xnet ]; then
-- 
1.7.1



From mkl at pengutronix.de  Wed Aug 25 08:50:57 2010
From: mkl at pengutronix.de (Marc Kleine-Budde)
Date: Wed, 25 Aug 2010 14:50:57 +0200
Subject: broken quoting
Message-ID: <4C7511B1.6030100@pengutronix.de>

Hello,

in the latest release the quoting is broken:

barebox:/ echo "\""
\"
barebox:/ echo "\
> "
\

cheers, Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 260 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100825/a31e24ab/attachment.sig>

From natarajsn at gmail.com  Thu Aug 26 02:50:59 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Thu, 26 Aug 2010 12:20:59 +0530
Subject: barebox and setenv
Message-ID: <AANLkTimM6xAp48S98Ob1eRwks+AKa6OR++ufO30wZNFH@mail.gmail.com>

Hi

How do I  "setenv bootargs mem=64M console=ttyS0,115200 root=/dev/mtdblock0
rw rootfstype=jffs2" in barebox?

export seems not to work for me.

regards

Nataraj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100826/afac3cbe/attachment.html>

From natarajsn at gmail.com  Thu Aug 26 03:03:11 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Thu, 26 Aug 2010 12:33:11 +0530
Subject: barebox and setenv
In-Reply-To: <AANLkTimM6xAp48S98Ob1eRwks+AKa6OR++ufO30wZNFH@mail.gmail.com>
References: <AANLkTimM6xAp48S98Ob1eRwks+AKa6OR++ufO30wZNFH@mail.gmail.com>
Message-ID: <AANLkTinBvXEwXoxsiVPjEXVL1jtb_B6EiEFEKxjU_q87@mail.gmail.com>

Hi

As a follow up to my previous mail,

I am on barebox 2010.05.0-00446-g02f7dfe-dirty (Aug 23 2010 - 10:05:28).

regards

Nataraj

On Thu, Aug 26, 2010 at 12:20 PM, Nataraj S Narayan <natarajsn at gmail.com>wrote:

> Hi
>
> How do I  "setenv bootargs mem=64M console=ttyS0,115200 root=/dev/mtdblock0
> rw rootfstype=jffs2" in barebox?
>
> export seems not to work for me.
>
> regards
>
> Nataraj
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100826/f75e460e/attachment.html>

From mkl at pengutronix.de  Thu Aug 26 03:35:30 2010
From: mkl at pengutronix.de (Marc Kleine-Budde)
Date: Thu, 26 Aug 2010 09:35:30 +0200
Subject: barebox and setenv
In-Reply-To: <AANLkTimM6xAp48S98Ob1eRwks+AKa6OR++ufO30wZNFH@mail.gmail.com>
References: <AANLkTimM6xAp48S98Ob1eRwks+AKa6OR++ufO30wZNFH@mail.gmail.com>
Message-ID: <4C761942.1020800@pengutronix.de>

Nataraj S Narayan wrote:
> Hi
> 
> How do I  "setenv bootargs mem=64M console=ttyS0,115200 root=/dev/mtdblock0
> rw rootfstype=jffs2" in barebox?
> 
> export seems not to work for me.

the barebox shell is "sh" like, so use

bootargs="mem=64M console=ttyS0,115200 root=/dev/mtdblock0 rw rootfstype=jffs2"

BTW: barebox comes with a default environment for all board. Adopt it to
your needs.

cheers, Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 260 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100826/1f2e0801/attachment.sig>

From u.kleine-koenig at pengutronix.de  Thu Aug 26 04:56:45 2010
From: u.kleine-koenig at pengutronix.de (Uwe =?iso-8859-1?Q?Kleine-K=F6nig?=)
Date: Thu, 26 Aug 2010 10:56:45 +0200
Subject: barebox and setenv
In-Reply-To: <4C761942.1020800@pengutronix.de>
References: <AANLkTimM6xAp48S98Ob1eRwks+AKa6OR++ufO30wZNFH@mail.gmail.com>
	<4C761942.1020800@pengutronix.de>
Message-ID: <20100826085645.GB5355@pengutronix.de>

Hello,

On Thu, Aug 26, 2010 at 09:35:30AM +0200, Marc Kleine-Budde wrote:
> Nataraj S Narayan wrote:
> > Hi
> > 
> > How do I  "setenv bootargs mem=64M console=ttyS0,115200 root=/dev/mtdblock0
> > rw rootfstype=jffs2" in barebox?
> > 
> > export seems not to work for me.
> 
> the barebox shell is "sh" like, so use
> 
> bootargs="mem=64M console=ttyS0,115200 root=/dev/mtdblock0 rw rootfstype=jffs2"
... probably followed by

	export bootargs

as you asked for (C-Shell like) setenv, not set.

BTW, I recently saw a bug concerning export.  Exporting a variable
twice results in an error.  I havn't investigated it though.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |


From natarajsn at gmail.com  Thu Aug 26 05:09:54 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Thu, 26 Aug 2010 14:39:54 +0530
Subject: barebox and setenv
In-Reply-To: <4C761942.1020800@pengutronix.de>
References: <AANLkTimM6xAp48S98Ob1eRwks+AKa6OR++ufO30wZNFH@mail.gmail.com>
	<4C761942.1020800@pengutronix.de>
Message-ID: <AANLkTi=A43fKt4=Rtv4cFGzJ3158EZZbXcU4ZJyaQfe_@mail.gmail.com>

Hi Marc

My board is at91sam9263. I am fully on Nand flash. Before i fully embark
onto barebox, may i have a few hints from you?

1. Can i do away with initial at91bootstrap.bin?
2. Using file jffs2 on Nand which takes at least 10 sec to mount, do you
suggest any substitute that barebox supports?
3. How stable is barebox now?

warm regards

Nataraj

On Thu, Aug 26, 2010 at 1:05 PM, Marc Kleine-Budde <mkl at pengutronix.de>wrote:

> Nataraj S Narayan wrote:
> > Hi
> >
> > How do I  "setenv bootargs mem=64M console=ttyS0,115200
> root=/dev/mtdblock0
> > rw rootfstype=jffs2" in barebox?
> >
> > export seems not to work for me.
>
> the barebox shell is "sh" like, so use
>
> bootargs="mem=64M console=ttyS0,115200 root=/dev/mtdblock0 rw
> rootfstype=jffs2"
>
> BTW: barebox comes with a default environment for all board. Adopt it to
> your needs.
>
> cheers, Marc
>
> --
> Pengutronix e.K.                  | Marc Kleine-Budde           |
> Industrial Linux Solutions        | Phone: +49-231-2826-924     |
> Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
> Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100826/c6624f65/attachment.html>

From plagnioj at jcrosoft.com  Thu Aug 26 12:19:27 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 26 Aug 2010 18:19:27 +0200
Subject: [PATCH 9/9] menu: simplify usage for clients
In-Reply-To: <20100823164954.GW27749@pengutronix.de>
References: <1282544653-11508-1-git-send-email-s.hauer@pengutronix.de>
	<1282544653-11508-10-git-send-email-s.hauer@pengutronix.de>
	<20100823151805.GV8693@game.jcrosoft.org>
	<20100823164954.GW27749@pengutronix.de>
Message-ID: <20100826161927.GA16555@game.jcrosoft.org>

On 18:49 Mon 23 Aug     , Sascha Hauer wrote:
> On Mon, Aug 23, 2010 at 05:18:05PM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > On 08:24 Mon 23 Aug     , Sascha Hauer wrote:
> > > Clients now only have to call menu_add_submenu or menu_add_command_entry
> > > instead of allocating many strings.
> > > This also fixes some problems in the menu code. The priv field in struct
> > > menu_entry was a pointer to struct menu or a pointer to an allocated string.
> > > It was never freed, only had to be freed when it was an allocated string.
> > > The reference to a submenu is now kept as a string and not to the menu
> > > itself. The code checked the existence of the submenu when creating it, but
> > > crashed when the submenu was removed and referenced afterwards. Now the
> > > code hapily allows references to nonexistant menus but complains during
> > > runtime when the menu is not there.
> > ok but no need to check if the pointer is null before freeing and please do
> > not remove the priv pointer as I use is in C API for complex menu to pass data
> > to the action
> > That's why I keep it as void*
> 
> So there's data associated to *priv, how do you free it then when...
no need in my code as i use a pre-alocatied struct
but in your new proposition it will use a specific free callback
> 
> > > 
> > >  #include <errno.h>
> > >  #include <readkey.h>
> > > +#include <linux/err.h>
> > >  
> > >  static LIST_HEAD(menus);
> > >  
> > > @@ -145,10 +146,7 @@ void menu_entry_free(struct menu_entry *me)
> > >  	if (!me)
> > >  		return;
> > >  
> > > -	if (me->display)
> > > -		free(me->display);
> > > -
> > > -	free(me);
> > > +	me->free(me);
> > we must check the pointer first as in the C API we must be able to overwrite
> > it or we must check that the C API provice it
> 
> ... you don't provide a free function?
> 
> You can't overwrite menu_entry_free as it is called from menu_free.
the idea is to allow it as in my mind the client must be able to pass any priv
data to create specific action
> 
> > >  }
> > >  
> > >  static void print_menu_entry(struct menu *m, struct menu_entry *me, int reverse)
> > > @@ -277,14 +275,76 @@ int menu_show(struct menu *m)
> > >  
> > >  void menu_action_exit(struct menu *m, struct menu_entry *me) {}
> > >  
> > > -void menu_action_run(struct menu *m, struct menu_entry *me)
> > > +struct submenu {
> > > +	char *submenu;
> > > +	struct menu_entry entry;
> > > +};
> 
> Note how struct menu_entry here is contained in a bigger struct. This
> way you can associate private data to a menu_entry using container_of
> without the use of a priv pointer.
I known but it will complex the code for adding custom by forcing the client
to declare his own struct for every menu or action 
> 
> That said we can keep the priv pointer, but you can't use it for data
> which must be freed, at least not without providing a free function.
> That was what I was trying to enforce, maybe that went a bit too far.
no I like the idea I just think how to allow the client to create custon
action very easly

Best Regards,
J.


From plagnioj at jcrosoft.com  Thu Aug 26 12:27:52 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 26 Aug 2010 18:27:52 +0200
Subject: [PATCH] net: rework the mii support
Message-ID: <1282840072-8005-1-git-send-email-plagnioj@jcrosoft.com>

this rework is done in order to add a phylib and allow to have phy driver support

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/configs/a9m2410_defconfig                 |    2 +-
 arch/arm/configs/a9m2440_defconfig                 |    2 +-
 arch/arm/configs/at91sam9260ek_defconfig           |    2 +-
 arch/arm/configs/at91sam9263ek_defconfig           |    2 +-
 arch/arm/configs/edb93xx_defconfig                 |    2 +-
 arch/arm/configs/eukrea_cpuimx25_defconfig         |    2 +-
 arch/arm/configs/eukrea_cpuimx27_defconfig         |    2 +-
 arch/arm/configs/eukrea_cpuimx35_defconfig         |    2 +-
 arch/arm/configs/freescale_mx25_3stack_defconfig   |    2 +-
 arch/arm/configs/freescale_mx35_3stack_defconfig   |    2 +-
 arch/arm/configs/mmccpu_defconfig                  |    2 +-
 arch/arm/configs/neso_defconfig                    |    2 +-
 arch/arm/configs/netx_nxdb500_defconfig            |    2 +-
 arch/arm/configs/nhk8815_defconfig                 |    2 +-
 arch/arm/configs/omap3530_beagle_defconfig         |    2 +-
 arch/arm/configs/pca100_defconfig                  |    2 +-
 arch/arm/configs/pcm037_defconfig                  |    2 +-
 arch/arm/configs/pcm038_defconfig                  |    2 +-
 arch/arm/configs/pcm043_defconfig                  |    2 +-
 arch/arm/configs/pm9263_defconfig                  |    2 +-
 arch/arm/configs/scb9328_defconfig                 |    2 +-
 arch/blackfin/configs/ipe337_defconfig             |    2 +-
 .../m68k/configs/phycore_kpukdr1_5475num_defconfig |    2 +-
 arch/m68k/configs/phycore_mcf54xx_defconfig        |    2 +-
 arch/ppc/configs/pcm030_defconfig                  |    2 +-
 drivers/net/Kconfig                                |   18 +-
 drivers/net/Makefile                               |    2 +-
 drivers/net/at91_ether.c                           |   10 +-
 drivers/net/dm9000.c                               |   33 ++--
 drivers/net/ep93xx.c                               |   37 ++--
 drivers/net/ep93xx.h                               |    2 +-
 drivers/net/fec_imx.c                              |   33 ++--
 drivers/net/fec_imx.h                              |    2 +-
 drivers/net/fec_mpc5200.c                          |   35 ++--
 drivers/net/fec_mpc5200.h                          |    2 +-
 drivers/net/macb.c                                 |   33 ++--
 drivers/net/miidev.c                               |  228 +++++++++++++++++++
 drivers/net/miiphy.c                               |  224 -------------------
 drivers/net/netx_eth.c                             |   37 ++--
 drivers/net/smc91111.c                             |   32 ++--
 drivers/net/smc911x.c                              |   33 ++--
 drivers/net/usb/Kconfig                            |    2 +-
 drivers/net/usb/asix.c                             |   26 +--
 drivers/net/usb/usbnet.c                           |    6 +-
 include/linux/mii.h                                |  232 ++++++++++++++++++++
 include/miidev.h                                   |   62 ++++++
 include/miiphy.h                                   |  158 -------------
 include/usb/usbnet.h                               |    4 +-
 net/eth.c                                          |    2 +-
 49 files changed, 711 insertions(+), 592 deletions(-)
 create mode 100644 drivers/net/miidev.c
 delete mode 100644 drivers/net/miiphy.c
 create mode 100644 include/linux/mii.h
 create mode 100644 include/miidev.h
 delete mode 100644 include/miiphy.h

diff --git a/arch/arm/configs/a9m2410_defconfig b/arch/arm/configs/a9m2410_defconfig
index 9e888fc..e9fa74c 100644
--- a/arch/arm/configs/a9m2410_defconfig
+++ b/arch/arm/configs/a9m2410_defconfig
@@ -198,7 +198,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_S3C24X0=y
 # CONFIG_DRIVER_SERIAL_S3C24X0_AUTOSYNC is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/a9m2440_defconfig b/arch/arm/configs/a9m2440_defconfig
index f69dcfd..b7a26bc 100644
--- a/arch/arm/configs/a9m2440_defconfig
+++ b/arch/arm/configs/a9m2440_defconfig
@@ -200,7 +200,7 @@ CONFIG_NET_TFTP=y
 CONFIG_DRIVER_SERIAL_S3C24X0=y
 # CONFIG_DRIVER_SERIAL_S3C24X0_AUTOSYNC is not set
 CONFIG_HAS_CS8900=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/at91sam9260ek_defconfig b/arch/arm/configs/at91sam9260ek_defconfig
index b40485b..0387b71 100644
--- a/arch/arm/configs/at91sam9260ek_defconfig
+++ b/arch/arm/configs/at91sam9260ek_defconfig
@@ -185,7 +185,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/at91sam9263ek_defconfig b/arch/arm/configs/at91sam9263ek_defconfig
index d423c2f..ae4006c 100644
--- a/arch/arm/configs/at91sam9263ek_defconfig
+++ b/arch/arm/configs/at91sam9263ek_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/edb93xx_defconfig b/arch/arm/configs/edb93xx_defconfig
index d8fe23f..936bd47 100644
--- a/arch/arm/configs/edb93xx_defconfig
+++ b/arch/arm/configs/edb93xx_defconfig
@@ -199,7 +199,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_PL010=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/eukrea_cpuimx25_defconfig b/arch/arm/configs/eukrea_cpuimx25_defconfig
index 14f06c2..abafc72 100644
--- a/arch/arm/configs/eukrea_cpuimx25_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx25_defconfig
@@ -211,7 +211,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/eukrea_cpuimx27_defconfig b/arch/arm/configs/eukrea_cpuimx27_defconfig
index c7f6b78..13df567 100644
--- a/arch/arm/configs/eukrea_cpuimx27_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx27_defconfig
@@ -219,7 +219,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 CONFIG_DRIVER_SERIAL_NS16550=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/eukrea_cpuimx35_defconfig b/arch/arm/configs/eukrea_cpuimx35_defconfig
index 7c5b49a..77f5246 100644
--- a/arch/arm/configs/eukrea_cpuimx35_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx35_defconfig
@@ -214,7 +214,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/freescale_mx25_3stack_defconfig b/arch/arm/configs/freescale_mx25_3stack_defconfig
index fd7dd42..b45b995 100644
--- a/arch/arm/configs/freescale_mx25_3stack_defconfig
+++ b/arch/arm/configs/freescale_mx25_3stack_defconfig
@@ -201,7 +201,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/freescale_mx35_3stack_defconfig b/arch/arm/configs/freescale_mx35_3stack_defconfig
index 4321fbc..ff3ba6a 100644
--- a/arch/arm/configs/freescale_mx35_3stack_defconfig
+++ b/arch/arm/configs/freescale_mx35_3stack_defconfig
@@ -201,7 +201,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/mmccpu_defconfig b/arch/arm/configs/mmccpu_defconfig
index a8c41e7..e196a0c 100644
--- a/arch/arm/configs/mmccpu_defconfig
+++ b/arch/arm/configs/mmccpu_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/neso_defconfig b/arch/arm/configs/neso_defconfig
index 3f2a978..03673f2 100644
--- a/arch/arm/configs/neso_defconfig
+++ b/arch/arm/configs/neso_defconfig
@@ -212,7 +212,7 @@ CONFIG_NET_RESOLV=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/netx_nxdb500_defconfig b/arch/arm/configs/netx_nxdb500_defconfig
index 95afb5e..7047d6b 100644
--- a/arch/arm/configs/netx_nxdb500_defconfig
+++ b/arch/arm/configs/netx_nxdb500_defconfig
@@ -184,7 +184,7 @@ CONFIG_NET_TFTP=y
 CONFIG_DRIVER_SERIAL_NETX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_HAS_NETX_ETHER=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/nhk8815_defconfig b/arch/arm/configs/nhk8815_defconfig
index 1488838..21d596f 100644
--- a/arch/arm/configs/nhk8815_defconfig
+++ b/arch/arm/configs/nhk8815_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_SERIAL_AMBA_PL011=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/omap3530_beagle_defconfig b/arch/arm/configs/omap3530_beagle_defconfig
index 2383c63..41b8d87 100644
--- a/arch/arm/configs/omap3530_beagle_defconfig
+++ b/arch/arm/configs/omap3530_beagle_defconfig
@@ -202,7 +202,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_NS16550=y
 CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pca100_defconfig b/arch/arm/configs/pca100_defconfig
index accc6ef..5053bf6 100644
--- a/arch/arm/configs/pca100_defconfig
+++ b/arch/arm/configs/pca100_defconfig
@@ -210,7 +210,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pcm037_defconfig b/arch/arm/configs/pcm037_defconfig
index bb67995..bfee2b2 100644
--- a/arch/arm/configs/pcm037_defconfig
+++ b/arch/arm/configs/pcm037_defconfig
@@ -211,7 +211,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pcm038_defconfig b/arch/arm/configs/pcm038_defconfig
index 2925c9c..a2b31f2 100644
--- a/arch/arm/configs/pcm038_defconfig
+++ b/arch/arm/configs/pcm038_defconfig
@@ -211,7 +211,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pcm043_defconfig b/arch/arm/configs/pcm043_defconfig
index 31c65f1..b374c7c 100644
--- a/arch/arm/configs/pcm043_defconfig
+++ b/arch/arm/configs/pcm043_defconfig
@@ -213,7 +213,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pm9263_defconfig b/arch/arm/configs/pm9263_defconfig
index d5ee46a..da7a856 100644
--- a/arch/arm/configs/pm9263_defconfig
+++ b/arch/arm/configs/pm9263_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/scb9328_defconfig b/arch/arm/configs/scb9328_defconfig
index 7dc56dd..eaf7bd4 100644
--- a/arch/arm/configs/scb9328_defconfig
+++ b/arch/arm/configs/scb9328_defconfig
@@ -201,7 +201,7 @@ CONFIG_NET_TFTP=y
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_HAS_DM9000=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/blackfin/configs/ipe337_defconfig b/arch/blackfin/configs/ipe337_defconfig
index 33fd2fc..e5667dc 100644
--- a/arch/blackfin/configs/ipe337_defconfig
+++ b/arch/blackfin/configs/ipe337_defconfig
@@ -146,7 +146,7 @@ CONFIG_NET_TFTP=y
 #
 CONFIG_DRIVER_SERIAL_BLACKFIN=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig b/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig
index bb91152..d868808 100644
--- a/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig
+++ b/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig
@@ -163,7 +163,7 @@ CONFIG_NET_TFTP=y
 # serial drivers
 #
 CONFIG_DRIVER_SERIAL_MCFV4E=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/m68k/configs/phycore_mcf54xx_defconfig b/arch/m68k/configs/phycore_mcf54xx_defconfig
index f64ca8b..ca3387a 100644
--- a/arch/m68k/configs/phycore_mcf54xx_defconfig
+++ b/arch/m68k/configs/phycore_mcf54xx_defconfig
@@ -163,7 +163,7 @@ CONFIG_NET_TFTP=y
 # serial drivers                
 #
 CONFIG_DRIVER_SERIAL_MCFV4E=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/ppc/configs/pcm030_defconfig b/arch/ppc/configs/pcm030_defconfig
index efdfb52..56d8844 100644
--- a/arch/ppc/configs/pcm030_defconfig
+++ b/arch/ppc/configs/pcm030_defconfig
@@ -154,7 +154,7 @@ CONFIG_NET_TFTP=y
 #
 CONFIG_DRIVER_SERIAL_MPC5XXX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index a106a7b..69f3352 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -13,7 +13,7 @@ config HAS_AT91_ETHER
 config HAS_NETX_ETHER
 	bool
 
-config MIIPHY
+config MIIDEV
 	bool
 
 menu "Network drivers               "
@@ -25,7 +25,7 @@ config DRIVER_NET_CS8900
 
 config DRIVER_NET_SMC911X
 	bool "smc911x ethernet driver"
-	select MIIPHY
+	select MIIDEV
 	help
 	  This option enables support for the SMSC LAN9[12]1[567]
 	  ethernet chip.
@@ -38,7 +38,7 @@ config DRIVER_NET_SMC911X_ADDRESS_SHIFT
 
 config DRIVER_NET_SMC91111
 	bool "smc91111 ethernet driver"
-	select MIIPHY
+	select MIIDEV
 	help
 	  This option enables support for the SMSC LAN91C111
 	  ethernet chip.
@@ -46,12 +46,12 @@ config DRIVER_NET_SMC91111
 config DRIVER_NET_DM9000
 	bool "Davicom dm9000 ethernet driver"
 	depends on HAS_DM9000
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_NETX
 	bool "Hilscher Netx ethernet driver"
 	depends on HAS_NETX_ETHER
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_AT91_ETHER
 	bool "at91 ethernet driver"
@@ -60,22 +60,22 @@ config DRIVER_NET_AT91_ETHER
 config DRIVER_NET_MPC5200
 	bool "MPC5200 Ethernet driver"
 	depends on ARCH_MPC5200
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_FEC_IMX
 	bool "i.MX FEC Ethernet driver"
 	depends on ARCH_HAS_FEC_IMX
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_EP93XX
 	bool "EP93xx Ethernet driver"
 	depends on ARCH_EP93XX
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_MACB
 	bool "macb Ethernet driver"
 	depends on HAS_MACB
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_TAP
 	bool "tap Ethernet driver"
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 1b6f104..96d3d32 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -9,5 +9,5 @@ obj-$(CONFIG_DRIVER_NET_FEC_IMX)	+= fec_imx.o
 obj-$(CONFIG_DRIVER_NET_EP93XX)		+= ep93xx.o
 obj-$(CONFIG_DRIVER_NET_MACB)		+= macb.o
 obj-$(CONFIG_DRIVER_NET_TAP)		+= tap.o
-obj-$(CONFIG_MIIPHY)			+= miiphy.o
+obj-$(CONFIG_MIIDEV)			+= miidev.o
 obj-$(CONFIG_NET_USB)			+= usb/
diff --git a/drivers/net/at91_ether.c b/drivers/net/at91_ether.c
index 3c4f4b0..4563ff3 100644
--- a/drivers/net/at91_ether.c
+++ b/drivers/net/at91_ether.c
@@ -24,7 +24,7 @@
 #include <at91rm9200_net.h>
 #include <init.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <driver.h>
 
@@ -208,7 +208,7 @@ static void at91rm9200_eth_halt (struct eth_device *edev)
 };
 
 #if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
-int  at91rm9200_miiphy_read(char *devname, unsigned char addr,
+int  at91rm9200_miidev_read(char *devname, unsigned char addr,
 		unsigned char reg, unsigned short * value)
 {
 	at91rm9200_EmacEnableMDIO (p_mac);
@@ -217,7 +217,7 @@ int  at91rm9200_miiphy_read(char *devname, unsigned char addr,
 	return 0;
 }
 
-int  at91rm9200_miiphy_write(char *devname, unsigned char addr,
+int  at91rm9200_miidev_write(char *devname, unsigned char addr,
 		unsigned char reg, unsigned short value)
 {
 	at91rm9200_EmacEnableMDIO (p_mac);
@@ -228,10 +228,10 @@ int  at91rm9200_miiphy_write(char *devname, unsigned char addr,
 
 #endif	/* defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII) */
 
-int at91rm9200_miiphy_initialize(void)
+int at91rm9200_miidev_initialize(void)
 {
 #if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
-	miiphy_register("at91rm9200phy", at91rm9200_miiphy_read, at91rm9200_miiphy_write);
+	mii_register("at91rm9200phy", at91rm9200_miidev_read, at91rm9200_miidev_write);
 #endif
 	return 0;
 }
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index ab06735..c31cf1a 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -46,7 +46,7 @@
 #include <command.h>
 #include <driver.h>
 #include <clock.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <net.h>
 #include <init.h>
@@ -167,7 +167,7 @@
 struct dm9000_priv {
 	unsigned long iobase;
 	unsigned long iodata;
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	int buswidth;
 };
 
@@ -200,9 +200,9 @@ static void DM9000_iow(struct dm9000_priv *priv, int reg, u8 value)
 	writeb(value, priv->iodata);
 }
 
-static int dm9000_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-		uint8_t reg, uint16_t * val)
+static int dm9000_phy_read(struct mii_device *mdev, int addr, int reg)
 {
+	int val;
 	struct eth_device *edev = mdev->edev;
 	struct dm9000_priv *priv = edev->priv;
 
@@ -211,15 +211,14 @@ static int dm9000_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
 	DM9000_iow(priv, DM9000_EPCR, 0xc);	/* Issue phyxcer read command */
 	udelay(100);			/* Wait read complete */
 	DM9000_iow(priv, DM9000_EPCR, 0x0);	/* Clear phyxcer read command */
-	*val = (DM9000_ior(priv, DM9000_EPDRH) << 8) | DM9000_ior(priv, DM9000_EPDRL);
+	val = (DM9000_ior(priv, DM9000_EPDRH) << 8) | DM9000_ior(priv, DM9000_EPDRL);
 
 	/* The read data keeps on REG_0D & REG_0E */
 	debug("phy_read(%d): %d\n", reg, val);
-	return 0;
+	return val;
 }
 
-static int dm9000_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-	uint8_t reg, uint16_t val)
+static int dm9000_phy_write(struct mii_device *mdev, int addr, int reg, int val)
 {
 	struct eth_device *edev = mdev->edev;
 	struct dm9000_priv *priv = edev->priv;
@@ -268,8 +267,8 @@ static int dm9000_eth_open(struct eth_device *edev)
 {
 	struct dm9000_priv *priv = (struct dm9000_priv *)edev->priv;
 
-	miiphy_wait_aneg(&priv->miiphy);
-	miiphy_print_status(&priv->miiphy);
+	miidev_wait_aneg(&priv->miidev);
+	miidev_print_status(&priv->miidev);
 	return 0;
 }
 
@@ -466,7 +465,7 @@ static int dm9000_init_dev(struct eth_device *edev)
 {
 	struct dm9000_priv *priv = (struct dm9000_priv *)edev->priv;
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 	return 0;
 }
 
@@ -523,13 +522,13 @@ static int dm9000_probe(struct device_d *dev)
 	DM9000_iow(priv, DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);	/* RX enable */
 	DM9000_iow(priv, DM9000_IMR, IMR_PAR);	/* Enable TX/RX interrupt mask */
 
-	priv->miiphy.read = dm9000_phy_read;
-	priv->miiphy.write = dm9000_phy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
-	priv->miiphy.edev = edev;
+	priv->miidev.read = dm9000_phy_read;
+	priv->miidev.write = dm9000_phy_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
+	priv->miidev.edev = edev;
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
         return 0;
diff --git a/drivers/net/ep93xx.c b/drivers/net/ep93xx.c
index c6c4671..851f6af 100644
--- a/drivers/net/ep93xx.c
+++ b/drivers/net/ep93xx.c
@@ -34,16 +34,15 @@
 #include <command.h>
 #include <init.h>
 #include <malloc.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <asm/io.h>
 #include <linux/types.h>
 #include <mach/ep93xx-regs.h>
 #include "ep93xx.h"
 
-static int ep93xx_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-			uint8_t phy_reg, uint16_t *value);
-static int ep93xx_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-			uint8_t phy_reg, uint16_t value);
+static int ep93xx_phy_read(struct mii_device *mdev, int phy_addr, int phy_reg);
+static int ep93xx_phy_write(struct mii_device *mdev, int phy_addr, int phy_reg,
+			    int value);
 
 static inline struct ep93xx_eth_priv *ep93xx_get_priv(struct eth_device *edev)
 {
@@ -497,10 +496,10 @@ static int ep93xx_eth_probe(struct device_d *dev)
 	edev->get_ethaddr = ep93xx_eth_get_ethaddr;
 	edev->set_ethaddr = ep93xx_eth_set_ethaddr;
 
-	priv->miiphy.read = ep93xx_phy_read;
-	priv->miiphy.write = ep93xx_phy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
+	priv->miidev.read = ep93xx_phy_read;
+	priv->miidev.write = ep93xx_phy_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
 
 	priv->tx_dq.base = calloc(NUMTXDESC,
 				sizeof(struct tx_descriptor));
@@ -530,7 +529,7 @@ static int ep93xx_eth_probe(struct device_d *dev)
 		goto eth_probe_failed_3;
 	}
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
 	ret = 0;
@@ -573,11 +572,10 @@ eth_probe_done:
 /**
  * Read a 16-bit value from an MII register.
  */
-static int ep93xx_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-			uint8_t phy_reg, uint16_t *value)
+static int ep93xx_phy_read(struct mii_device *mdev, int phy_addr, int phy_reg)
 {
 	struct mac_regs *regs = ep93xx_get_regs(mdev->edev);
-	int ret = -1;
+	int value = -1;
 	uint32_t self_ctl;
 
 	pr_debug("+ep93xx_phy_read\n");
@@ -604,26 +602,23 @@ static int ep93xx_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
 	while (readl(&regs->miists) & MIISTS_BUSY)
 		; /* noop */
 
-	*value = (unsigned short)readl(&regs->miidata);
+	value = (unsigned short)readl(&regs->miidata);
 
 	/* Restore the saved SelfCTL value and return. */
 	writel(self_ctl, &regs->selfctl);
 
-	ret = 0;
-
 	pr_debug("-ep93xx_phy_read\n");
 
-	return ret;
+	return value;
 }
 
 /**
  * Write a 16-bit value to an MII register.
  */
-static int ep93xx_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
+static int ep93xx_phy_write(struct mii_device *mdev, uint8_t phy_addr,
 			uint8_t phy_reg, uint16_t value)
 {
 	struct mac_regs *regs = ep93xx_get_regs(mdev->edev);
-	int ret = -1;
 	uint32_t self_ctl;
 
 	pr_debug("+ep93xx_phy_write\n");
@@ -651,11 +646,9 @@ static int ep93xx_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
 	/* Restore the saved SelfCTL value and return. */
 	writel(self_ctl, &regs->selfctl);
 
-	ret = 0;
-
 	pr_debug("-ep93xx_phy_write\n");
 
-	return ret;
+	return 0;
 }
 
 static struct driver_d ep93xx_eth_driver = {
diff --git a/drivers/net/ep93xx.h b/drivers/net/ep93xx.h
index ae45c54..875715f 100644
--- a/drivers/net/ep93xx.h
+++ b/drivers/net/ep93xx.h
@@ -141,7 +141,7 @@ struct ep93xx_eth_priv {
 	struct tx_descriptor_queue	tx_dq;
 	struct tx_status_queue		tx_sq;
 
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 };
 
 #endif
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 9e752f6..73b7a54 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -22,9 +22,9 @@
 #include <malloc.h>
 #include <net.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <driver.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <fec.h>
 
 #include <asm/mmu.h>
@@ -47,8 +47,7 @@ struct fec_frame {
 /*
  * MII-interface related functions
  */
-static int fec_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t * retVal)
+static int fec_miidev_read(struct mii_device *mdev, int phyAddr, int regAddr)
 {
 	struct eth_device *edev = mdev->edev;
 	struct fec_priv *fec = (struct fec_priv *)edev->priv;
@@ -88,13 +87,11 @@ static int fec_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
 	/*
 	 * it's now safe to read the PHY's register
 	 */
-	*retVal = readl(fec->regs + FEC_MII_DATA);
-
-	return 0;
+	return readl(fec->regs + FEC_MII_DATA);
 }
 
-static int fec_miiphy_write(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t data)
+static int fec_miidev_write(struct mii_device *mdev, int phyAddr,
+	int regAddr, int data)
 {
 	struct eth_device *edev = mdev->edev;
 	struct fec_priv *fec = (struct fec_priv *)edev->priv;
@@ -317,7 +314,7 @@ static int fec_init(struct eth_device *dev)
 	writel(FEC_MAX_PKT_SIZE, fec->regs + FEC_EMRBR);
 
 	if (fec->xcv_type != SEVENWIRE)
-		miiphy_restart_aneg(&fec->miiphy);
+		miidev_restart_aneg(&fec->miidev);
 
 	return 0;
 }
@@ -351,10 +348,10 @@ static int fec_open(struct eth_device *edev)
 	fec_rx_task_enable(fec);
 
 	if (fec->xcv_type != SEVENWIRE) {
-		ret = miiphy_wait_aneg(&fec->miiphy);
+		ret = miidev_wait_aneg(&fec->miidev);
 		if (ret)
 			return ret;
-		miiphy_print_status(&fec->miiphy);
+		miidev_print_status(&fec->miidev);
 	}
 
 	return 0;
@@ -583,13 +580,13 @@ static int fec_probe(struct device_d *dev)
 	fec->xcv_type = pdata->xcv_type;
 
 	if (fec->xcv_type != SEVENWIRE) {
-		fec->miiphy.read = fec_miiphy_read;
-		fec->miiphy.write = fec_miiphy_write;
-		fec->miiphy.address = pdata->phy_addr;
-		fec->miiphy.flags = pdata->xcv_type == MII10 ? MIIPHY_FORCE_10 : 0;
-		fec->miiphy.edev = edev;
+		fec->miidev.read = fec_miidev_read;
+		fec->miidev.write = fec_miidev_write;
+		fec->miidev.address = pdata->phy_addr;
+		fec->miidev.flags = pdata->xcv_type == MII10 ? MIIDEV_FORCE_10 : 0;
+		fec->miidev.edev = edev;
 
-		miiphy_register(&fec->miiphy);
+		mii_register(&fec->miidev);
 	}
 
 	eth_register(edev);
diff --git a/drivers/net/fec_imx.h b/drivers/net/fec_imx.h
index 353799c..e1473a4 100644
--- a/drivers/net/fec_imx.h
+++ b/drivers/net/fec_imx.h
@@ -141,7 +141,7 @@ struct fec_priv {
 	int rbd_index;				/* next receive BD to read   */
 	struct buffer_descriptor *tbd_base;	/* TBD ring                  */
 	int tbd_index;				/* next transmit BD to write */
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 };
 
 /**
diff --git a/drivers/net/fec_mpc5200.c b/drivers/net/fec_mpc5200.c
index ce9a21d..f239c68 100644
--- a/drivers/net/fec_mpc5200.c
+++ b/drivers/net/fec_mpc5200.c
@@ -11,12 +11,12 @@
 #include <malloc.h>
 #include <net.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <driver.h>
 #include <mach/sdma.h>
 #include <mach/fec.h>
 #include <mach/clocks.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include "fec_mpc5200.h"
 
 #define CONFIG_PHY_ADDR 1 /* FIXME */
@@ -31,8 +31,7 @@ typedef struct {
 /*
  * MII-interface related functions
  */
-static int fec5xxx_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t * retVal)
+static int fec5xxx_miidev_read(struct mii_device *mdev, int phyAddr, int regAddr)
 {
 	struct eth_device *edev = mdev->edev;
 	mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)edev->priv;
@@ -68,13 +67,11 @@ static int fec5xxx_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
 	/*
 	 * it's now safe to read the PHY's register
 	 */
-	*retVal = (uint16_t) fec->eth->mii_data;
-
-	return 0;
+	return fec->eth->mii_data;
 }
 
-static int fec5xxx_miiphy_write(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t data)
+static int fec5xxx_miidev_write(struct mii_device *mdev, int phyAddr,
+	int regAddr, int data)
 {
 	struct eth_device *edev = mdev->edev;
 	mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)edev->priv;
@@ -385,7 +382,7 @@ static int mpc5xxx_fec_init(struct eth_device *dev)
 	debug("mpc5xxx_fec_init... Done \n");
 
 	if (fec->xcv_type != SEVENWIRE)
-		miiphy_restart_aneg(&fec->miiphy);
+		miidev_restart_aneg(&fec->miidev);
 
 	return 0;
 }
@@ -416,8 +413,8 @@ static int mpc5xxx_fec_open(struct eth_device *edev)
 	SDMA_TASK_ENABLE(FEC_RECV_TASK_NO);
 
 	if (fec->xcv_type != SEVENWIRE) {
-		miiphy_wait_aneg(&fec->miiphy);
-		miiphy_print_status(&fec->miiphy);
+		miidev_wait_aneg(&fec->miidev);
+		miidev_print_status(&fec->miidev);
 	}
 
 	return 0;
@@ -559,7 +556,7 @@ static int mpc5xxx_fec_send(struct eth_device *dev, void *eth_data,
 	 */
 	if (fec->xcv_type != SEVENWIRE) {
 		uint16_t phyStatus;
-		fec5xxx_miiphy_read(&fec->miiphy, 0, 0x1, &phyStatus);
+		fec5xxx_miidev_read(&fec->miidev, 0, 0x1, &phyStatus);
 	}
 
 	/*
@@ -685,13 +682,13 @@ int mpc5xxx_fec_probe(struct device_d *dev)
 	loadtask(0, 2);
 
 	if (fec->xcv_type != SEVENWIRE) {
-		fec->miiphy.read = fec5xxx_miiphy_read;
-		fec->miiphy.write = fec5xxx_miiphy_write;
-		fec->miiphy.address = CONFIG_PHY_ADDR;
-		fec->miiphy.flags = pdata->xcv_type == MII10 ? MIIPHY_FORCE_10 : 0;
-		fec->miiphy.edev = edev;
+		fec->miidev.read = fec5xxx_miidev_read;
+		fec->miidev.write = fec5xxx_miidev_write;
+		fec->miidev.address = CONFIG_PHY_ADDR;
+		fec->miidev.flags = pdata->xcv_type == MII10 ? MIIDEV_FORCE_10 : 0;
+		fec->miidev.edev = edev;
 
-		miiphy_register(&fec->miiphy);
+		mii_register(&fec->miidev);
 	}
 
 	eth_register(edev);
diff --git a/drivers/net/fec_mpc5200.h b/drivers/net/fec_mpc5200.h
index 9eabc1e..f6da3e5 100644
--- a/drivers/net/fec_mpc5200.h
+++ b/drivers/net/fec_mpc5200.h
@@ -260,7 +260,7 @@ typedef struct {
 	uint16_t usedTbdIndex;		/* next transmit BD to clean */
 	uint16_t cleanTbdNum;		/* the number of available transmit BDs */
 
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 } mpc5xxx_fec_priv;
 
 /* Ethernet parameter area */
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 6864119..df3b6af 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -44,7 +44,7 @@
 #include <malloc.h>
 #include <xfuncs.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <errno.h>
 #include <asm/io.h>
 #include <mach/board.h>
@@ -98,7 +98,7 @@ struct macb_device {
 	const struct device	*dev;
 	struct eth_device	netdev;
 
-	struct miiphy_device	miiphy;
+	struct mii_device	miidev;
 
 	unsigned int		flags;
 };
@@ -214,8 +214,8 @@ static int macb_open(struct eth_device *edev)
 
 	debug("%s\n", __func__);
 
-	miiphy_wait_aneg(&macb->miiphy);
-	miiphy_print_status(&macb->miiphy);
+	miidev_wait_aneg(&macb->miidev);
+	miidev_print_status(&macb->miidev);
 
 	ncfgr = readl(macb->regs + MACB_NCFGR);
 	ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD));
@@ -293,8 +293,7 @@ static void macb_halt(struct eth_device *edev)
 	writel(MACB_BIT(CLRSTAT), macb->regs + MACB_NCR);
 }
 
-static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
-		uint8_t reg, uint16_t * value)
+static int macb_phy_read(struct mii_device *mdev, int addr, int reg)
 {
 	struct eth_device *edev = mdev->edev;
 	struct macb_device *macb = edev->priv;
@@ -303,6 +302,7 @@ static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
 	unsigned long netstat;
 	unsigned long frame;
 	int iflag;
+	int value;
 	uint64_t start;
 
 	debug("%s\n", __func__);
@@ -331,7 +331,7 @@ static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
 	} while (!(netstat & MACB_BIT(IDLE)));
 
 	frame = readl(macb->regs + MACB_MAN);
-	*value = MACB_BFEXT(DATA, frame);
+	value = MACB_BFEXT(DATA, frame);
 
 	iflag = disable_interrupts();
 	netctl = readl(macb->regs + MACB_NCR);
@@ -340,11 +340,10 @@ static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
 	if (iflag)
 		enable_interrupts();
 
-	return 0;
+	return value;
 }
 
-static int macb_phy_write(struct miiphy_device *mdev, uint8_t addr,
-	uint8_t reg, uint16_t value)
+static int macb_phy_write(struct mii_device *mdev, int addr, int reg, int value)
 {
 	struct eth_device *edev = mdev->edev;
 	struct macb_device *macb = edev->priv;
@@ -435,12 +434,12 @@ static int macb_probe(struct device_d *dev)
 	edev->get_ethaddr = macb_get_ethaddr;
 	edev->set_ethaddr = macb_set_ethaddr;
 
-	macb->miiphy.read = macb_phy_read;
-	macb->miiphy.write = macb_phy_write;
-	macb->miiphy.address = pdata->phy_addr;
-	macb->miiphy.flags = pdata->flags & AT91SAM_ETHER_FORCE_LINK ?
-		MIIPHY_FORCE_LINK : 0;
-	macb->miiphy.edev = edev;
+	macb->miidev.read = macb_phy_read;
+	macb->miidev.write = macb_phy_write;
+	macb->miidev.address = pdata->phy_addr;
+	macb->miidev.flags = pdata->flags & AT91SAM_ETHER_FORCE_LINK ?
+		MIIDEV_FORCE_LINK : 0;
+	macb->miidev.edev = edev;
 	macb->flags = pdata->flags;
 
 	macb->rx_buffer = xmalloc(CFG_MACB_RX_BUFFER_SIZE); 
@@ -471,7 +470,7 @@ static int macb_probe(struct device_d *dev)
 
 	writel(ncfgr, macb->regs + MACB_NCFGR);
 
-	miiphy_register(&macb->miiphy);
+	mii_register(&macb->miidev);
 	eth_register(edev);
 
 	return 0;
diff --git a/drivers/net/miidev.c b/drivers/net/miidev.c
new file mode 100644
index 0000000..343eb40
--- /dev/null
+++ b/drivers/net/miidev.c
@@ -0,0 +1,228 @@
+/*
+ * miidev.c - generic phy abstraction
+ *
+ * Copyright (c) 2007 Sascha Hauer <s.hauer at pengutronix.de>, Pengutronix
+ *
+ * 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 version 2
+ * as published by the Free Software Foundation.
+ *
+ * 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 <driver.h>
+#include <init.h>
+#include <miidev.h>
+#include <clock.h>
+#include <net.h>
+#include <malloc.h>
+
+int miidev_restart_aneg(struct mii_device *mdev)
+{
+	uint16_t status;
+	int timeout;
+
+	/*
+	 * Reset PHY, then delay 300ns
+	 */
+	mii_write(mdev, mdev->address, MII_BMCR, BMCR_RESET);
+
+	if (mdev->flags & MIIDEV_FORCE_LINK)
+		return 0;
+
+	udelay(1000);
+
+	if (mdev->flags & MIIDEV_FORCE_10) {
+		printf("Forcing 10 Mbps ethernet link... ");
+		status = mii_read(mdev, mdev->address, MII_BMSR);
+		mii_write(mdev, mdev->address, MII_BMCR, BMCR_FULLDPLX | BMCR_CTST);
+
+		timeout = 20;
+		do {	/* wait for link status to go down */
+			udelay(10000);
+			if ((timeout--) == 0) {
+				debug("hmmm, should not have waited...");
+				break;
+			}
+			status = mii_read(mdev, mdev->address, MII_BMSR);
+		} while (status & BMSR_LSTATUS);
+
+	} else {	/* MII100 */
+		/*
+		 * Set the auto-negotiation advertisement register bits
+		 */
+		status = mii_read(mdev, mdev->address, MII_ADVERTISE);
+		status |= ADVERTISE_ALL;
+		mii_write(mdev, mdev->address, MII_ADVERTISE, status);
+
+		mii_write(mdev, mdev->address, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
+	}
+
+	return 0;
+}
+
+int miidev_wait_aneg(struct mii_device *mdev)
+{
+	uint64_t start;
+	int status;
+
+	if (mdev->flags & MIIDEV_FORCE_LINK)
+		return 0;
+
+	/*
+	 * Wait for AN completion
+	 */
+	start = get_time_ns();
+	do {
+		if (is_timeout(start, 5 * SECOND)) {
+			printf("%s: Autonegotiation timeout\n", mdev->cdev.name);
+			return -1;
+		}
+
+		status = mii_read(mdev, mdev->address, MII_BMSR);
+		if (status < 0) {
+			printf("%s: Autonegotiation failed. status: 0x%04x\n", mdev->cdev.name, status);
+			return -1;
+		}
+	} while (!(status & BMSR_LSTATUS));
+
+	return 0;
+}
+
+int miidev_print_status(struct mii_device *mdev)
+{
+	int bmsr, bmcr, lpa;
+	char *duplex;
+	int speed;
+
+	if (mdev->flags & MIIDEV_FORCE_LINK) {
+		printf("Forcing link present...\n");
+		return 0;
+	}
+
+	bmsr = mii_read(mdev, mdev->address, MII_BMSR);
+	if (bmsr < 0)
+		goto err_out;
+	bmcr = mii_read(mdev, mdev->address, MII_BMCR);
+	if (bmcr < 0)
+		goto err_out;
+	lpa = mii_read(mdev, mdev->address, MII_LPA);
+	if (lpa < 0)
+		goto err_out;
+
+	printf("%s: Link is %s", mdev->cdev.name,
+			bmsr & BMSR_LSTATUS ? "up" : "down");
+
+	if (bmcr & BMCR_ANENABLE) {
+		duplex = lpa & LPA_DUPLEX ? "Full" : "Half";
+		speed = lpa & LPA_100 ? 100 : 10;
+	} else {
+		duplex = bmcr & BMCR_FULLDPLX ? "Full" : "Half";
+		speed = bmcr & BMCR_SPEED100 ? 100 : 10;
+	}
+
+	printf(" - %d/%s\n", speed, duplex);
+
+	return 0;
+err_out:
+	printf("%s: failed to read\n", mdev->cdev.name);
+	return -1;
+}
+
+static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
+{
+	int i = count;
+	uint16_t *buf = _buf;
+	struct mii_device *mdev = cdev->priv;
+
+	while (i > 1) {
+		*buf = mii_read(mdev, mdev->address, offset);
+		buf++;
+		i -= 2;
+		offset++;
+	}
+
+	return count;
+}
+
+static ssize_t miidev_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
+{
+	int i = count;
+	const uint16_t *buf = _buf;
+	struct mii_device *mdev = cdev->priv;
+
+	while (i > 1) {
+		mii_write(mdev, mdev->address, offset, *buf);
+		buf++;
+		i -= 2;
+		offset++;
+	}
+
+	return count;
+}
+
+static struct file_operations miidev_ops = {
+	.read  = miidev_read,
+	.write = miidev_write,
+	.lseek = dev_lseek_default,
+};
+
+static int miidev_probe(struct device_d *dev)
+{
+	struct mii_device *mdev = dev->priv;
+
+	mdev->cdev.name = asprintf("phy%d", dev->id);
+	mdev->cdev.size = 32;
+	mdev->cdev.ops = &miidev_ops;
+	mdev->cdev.priv = mdev;
+	mdev->cdev.dev = dev;
+	devfs_create(&mdev->cdev);
+	return 0;
+}
+
+static void miidev_remove(struct device_d *dev)
+{
+	struct mii_device *mdev = dev->priv;
+
+	free(mdev->cdev.name);
+	devfs_remove(&mdev->cdev);
+}
+
+static struct driver_d miidev_drv = {
+        .name  = "miidev",
+        .probe = miidev_probe,
+	.remove = miidev_remove,
+};
+
+int mii_register(struct mii_device *mdev)
+{
+	mdev->dev.priv = mdev;
+	strcpy(mdev->dev.name, "miidev");
+
+	return register_device(&mdev->dev);
+}
+
+void mii_unregister(struct mii_device *mdev)
+{
+	unregister_device(&mdev->dev);
+}
+
+static int miidev_init(void)
+{
+	register_driver(&miidev_drv);
+	return 0;
+}
+
+device_initcall(miidev_init);
+
diff --git a/drivers/net/miiphy.c b/drivers/net/miiphy.c
deleted file mode 100644
index 12aa7a6..0000000
--- a/drivers/net/miiphy.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * miiphy.c - generic phy abstraction
- *
- * Copyright (c) 2007 Sascha Hauer <s.hauer at pengutronix.de>, Pengutronix
- *
- * 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 version 2
- * as published by the Free Software Foundation.
- *
- * 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 <driver.h>
-#include <init.h>
-#include <miiphy.h>
-#include <clock.h>
-#include <net.h>
-#include <malloc.h>
-
-int miiphy_restart_aneg(struct miiphy_device *mdev)
-{
-	uint16_t status;
-	int timeout;
-
-	/*
-	 * Reset PHY, then delay 300ns
-	 */
-	mdev->write(mdev, mdev->address, MII_BMCR, BMCR_RESET);
-
-	if (mdev->flags & MIIPHY_FORCE_LINK)
-		return 0;
-
-	udelay(1000);
-
-	if (mdev->flags & MIIPHY_FORCE_10) {
-		printf("Forcing 10 Mbps ethernet link... ");
-		mdev->read(mdev, mdev->address, MII_BMSR, &status);
-		mdev->write(mdev, mdev->address, MII_BMCR, BMCR_FULLDPLX | BMCR_CTST);
-
-		timeout = 20;
-		do {	/* wait for link status to go down */
-			udelay(10000);
-			if ((timeout--) == 0) {
-				debug("hmmm, should not have waited...");
-				break;
-			}
-			mdev->read(mdev, mdev->address, MII_BMSR, &status);
-		} while (status & BMSR_LSTATUS);
-
-	} else {	/* MII100 */
-		/*
-		 * Set the auto-negotiation advertisement register bits
-		 */
-		mdev->read(mdev, mdev->address, MII_ADVERTISE, &status);
-		status |= ADVERTISE_ALL;
-		mdev->write(mdev, mdev->address, MII_ADVERTISE, status);
-
-		mdev->write(mdev, mdev->address, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
-	}
-
-	return 0;
-}
-
-int miiphy_wait_aneg(struct miiphy_device *mdev)
-{
-	uint64_t start;
-	uint16_t status;
-
-	if (mdev->flags & MIIPHY_FORCE_LINK)
-		return 0;
-
-	/*
-	 * Wait for AN completion
-	 */
-	start = get_time_ns();
-	do {
-		if (is_timeout(start, 5 * SECOND)) {
-			printf("%s: Autonegotiation timeout\n", mdev->cdev.name);
-			return -1;
-		}
-
-		if (mdev->read(mdev, mdev->address, MII_BMSR, &status)) {
-			printf("%s: Autonegotiation failed. status: 0x%04x\n", mdev->cdev.name, status);
-			return -1;
-		}
-	} while (!(status & BMSR_LSTATUS));
-
-	return 0;
-}
-
-int miiphy_print_status(struct miiphy_device *mdev)
-{
-	uint16_t bmsr, bmcr, lpa;
-	char *duplex;
-	int speed;
-
-	if (mdev->flags & MIIPHY_FORCE_LINK) {
-		printf("Forcing link present...\n");
-		return 0;
-	}
-
-	if (mdev->read(mdev, mdev->address, MII_BMSR, &bmsr) != 0)
-		goto err_out;
-	if (mdev->read(mdev, mdev->address, MII_BMCR, &bmcr) != 0)
-		goto err_out;
-	if (mdev->read(mdev, mdev->address, MII_LPA, &lpa) != 0)
-		goto err_out;
-
-	printf("%s: Link is %s", mdev->cdev.name,
-			bmsr & BMSR_LSTATUS ? "up" : "down");
-
-	if (bmcr & BMCR_ANENABLE) {
-		duplex = lpa & LPA_DUPLEX ? "Full" : "Half";
-		speed = lpa & LPA_100 ? 100 : 10;
-	} else {
-		duplex = bmcr & BMCR_FULLDPLX ? "Full" : "Half";
-		speed = bmcr & BMCR_SPEED100 ? 100 : 10;
-	}
-
-	printf(" - %d/%s\n", speed, duplex);
-
-	return 0;
-err_out:
-	printf("%s: failed to read\n", mdev->cdev.name);
-	return -1;
-}
-
-static ssize_t miiphy_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
-{
-	int i = count;
-	uint16_t *buf = _buf;
-	struct miiphy_device *mdev = cdev->priv;
-
-	while (i > 1) {
-		mdev->read(mdev, mdev->address, offset, buf);
-		buf++;
-		i -= 2;
-		offset++;
-	}
-
-	return count;
-}
-
-static ssize_t miiphy_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
-{
-	int i = count;
-	const uint16_t *buf = _buf;
-	struct miiphy_device *mdev = cdev->priv;
-
-	while (i > 1) {
-		mdev->write(mdev, mdev->address, offset, *buf);
-		buf++;
-		i -= 2;
-		offset++;
-	}
-
-	return count;
-}
-
-static struct file_operations miiphy_ops = {
-	.read  = miiphy_read,
-	.write = miiphy_write,
-	.lseek = dev_lseek_default,
-};
-
-static int miiphy_probe(struct device_d *dev)
-{
-	struct miiphy_device *mdev = dev->priv;
-
-	mdev->cdev.name = asprintf("phy%d", dev->id);
-	mdev->cdev.size = 32;
-	mdev->cdev.ops = &miiphy_ops;
-	mdev->cdev.priv = mdev;
-	mdev->cdev.dev = dev;
-	devfs_create(&mdev->cdev);
-	return 0;
-}
-
-static void miiphy_remove(struct device_d *dev)
-{
-	struct miiphy_device *mdev = dev->priv;
-
-	free(mdev->cdev.name);
-	devfs_remove(&mdev->cdev);
-}
-
-static struct driver_d miiphy_drv = {
-        .name  = "miiphy",
-        .probe = miiphy_probe,
-	.remove = miiphy_remove,
-};
-
-int miiphy_register(struct miiphy_device *mdev)
-{
-	mdev->dev.priv = mdev;
-	strcpy(mdev->dev.name, "miiphy");
-
-	return register_device(&mdev->dev);
-}
-
-void miiphy_unregister(struct miiphy_device *mdev)
-{
-	unregister_device(&mdev->dev);
-}
-
-static int miiphy_init(void)
-{
-	register_driver(&miiphy_drv);
-	return 0;
-}
-
-device_initcall(miiphy_init);
-
diff --git a/drivers/net/netx_eth.c b/drivers/net/netx_eth.c
index f2d7b4a..c3083f7 100644
--- a/drivers/net/netx_eth.c
+++ b/drivers/net/netx_eth.c
@@ -2,12 +2,12 @@
 #include <command.h>
 #include <net.h>
 #include <asm/io.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <mach/netx-xc.h>
 #include <mach/netx-eth.h>
 #include <mach/netx-regs.h>
 #include <xfuncs.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <init.h>
 #include <driver.h>
 
@@ -48,7 +48,7 @@
 #define CON_FIFO_PORT_LO(xcno)  (6 + ((xcno) << 3))    /* Index of the FIFO where sent Data packages are confirmed */
 
 struct netx_eth_priv {
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	int xcno;
 };
 
@@ -119,25 +119,28 @@ static int netx_eth_rx (struct eth_device *edev)
 	return 0;
 }
 
-static int netx_miiphy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-		uint8_t reg, uint16_t * val)
+static int netx_miidev_read(struct mii_device *mdev, int phy_addr, int reg)
 {
+	int value;
+
 	MIIMU_REG = MIIMU_SNRDY | MIIMU_PREAMBLE | MIIMU_PHYADDR(phy_addr) |
 	            MIIMU_REGADDR(reg) | MIIMU_PHY_NRES;
 
 	while(MIIMU_REG & MIIMU_SNRDY);
 
-	*val = MIIMU_REG >> 16;
+	value = MIIMU_REG >> 16;
 
-/*	printf("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n",__FUNCTION__,addr,reg,*value); */
+	debug("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n", __FUNCTION__,
+	      addr, reg, value)
 
-	return 0;
+	return value;
 }
 
-static int netx_miiphy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-	uint8_t reg, uint16_t val)
+static int netx_miidev_write(struct mii_device *mdev, int phy_addr,
+	int reg, int val)
 {
-/*	printf("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n",__FUNCTION__,addr,reg,value); */
+	debug("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n",__FUNCTION__,
+	      addr, reg, val);
 
 	MIIMU_REG = MIIMU_SNRDY | MIIMU_PREAMBLE | MIIMU_PHYADDR(phy_addr) |
 	            MIIMU_REGADDR(reg) | MIIMU_PHY_NRES | MIIMU_OPMODE_WRITE |
@@ -187,7 +190,7 @@ static int netx_eth_init_dev(struct eth_device *edev)
 	for (i = 2; i <= 18; i++)
 		PFIFO_REG( PFIFO_BASE(EMPTY_PTR_FIFO(xcno)) ) = FIFO_PTR_FRAMENO(i) | FIFO_PTR_SEGMENT(xcno);
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 	return 0;
 }
 
@@ -257,13 +260,13 @@ static int netx_eth_probe(struct device_d *dev)
 	edev->get_ethaddr = netx_eth_get_ethaddr;
 	edev->set_ethaddr = netx_eth_set_ethaddr;
 
-	priv->miiphy.read = netx_miiphy_read;
-	priv->miiphy.write = netx_miiphy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
+	priv->miidev.read = netx_miidev_read;
+	priv->miidev.write = netx_miidev_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
 
 	netx_eth_init_phy();
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
         return 0;
diff --git a/drivers/net/smc91111.c b/drivers/net/smc91111.c
index 58ebaa9..605a7d8 100644
--- a/drivers/net/smc91111.c
+++ b/drivers/net/smc91111.c
@@ -67,7 +67,7 @@
 
 #include <command.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <init.h>
 #include <xfuncs.h>
@@ -451,7 +451,7 @@ struct accessors {
 };
 
 struct smc91c111_priv {
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	struct accessors a;
 	unsigned long base;
 };
@@ -621,8 +621,8 @@ static void smc_wait_mmu_release_complete(struct smc91c111_priv *priv)
 	}
 }
 
-static int smc91c111_phy_write(struct miiphy_device *mdev, uint8_t phyaddr,
-	uint8_t phyreg, uint16_t phydata)
+static int smc91c111_phy_write(struct mii_device *mdev, int phyaddr,
+	int phyreg, int phydata)
 {
 	struct eth_device *edev = mdev->edev;
 	struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
@@ -723,8 +723,7 @@ static int smc91c111_phy_write(struct miiphy_device *mdev, uint8_t phyaddr,
 	return 0;
 }
 
-static int smc91c111_phy_read(struct miiphy_device *mdev, uint8_t phyaddr,
-		uint8_t phyreg, uint16_t * val)
+static int smc91c111_phy_read(struct mii_device *mdev, int phyaddr, int phyreg)
 {
 	struct eth_device *edev = mdev->edev;
 	struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
@@ -827,8 +826,7 @@ static int smc91c111_phy_read(struct miiphy_device *mdev, uint8_t phyaddr,
 			phydata |= 0x0001;
 	}
 
-	*val = phydata;
-	return 0;
+	return phydata;
 }
 
 static void smc91c111_reset(struct eth_device *edev)
@@ -896,8 +894,8 @@ static int smc91c111_eth_open(struct eth_device *edev)
 	struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
 	smc91c111_enable(edev);
 
-	miiphy_wait_aneg(&priv->miiphy);
-	miiphy_print_status(&priv->miiphy);
+	miidev_wait_aneg(&priv->miidev);
+	miidev_print_status(&priv->miidev);
 
 	return 0;
 }
@@ -1287,7 +1285,7 @@ static int smc91c111_init_dev(struct eth_device *edev)
 	SMC_SELECT_BANK(priv, 0);
 	SMC_outw(priv, RPC_DEFAULT, RPC_REG);
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 
 	return 0;
 }
@@ -1314,16 +1312,16 @@ static int smc91c111_probe(struct device_d *dev)
 	edev->get_ethaddr = smc91c111_get_ethaddr;
 	edev->set_ethaddr = smc91c111_set_ethaddr;
 
-	priv->miiphy.read = smc91c111_phy_read;
-	priv->miiphy.write = smc91c111_phy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
-	priv->miiphy.edev = edev;
+	priv->miidev.read = smc91c111_phy_read;
+	priv->miidev.write = smc91c111_phy_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
+	priv->miidev.edev = edev;
 	priv->base = dev->map_base;
 
 	smc91c111_reset(edev);
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
 	return 0;
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c
index ca320d5..b559590 100644
--- a/drivers/net/smc911x.c
+++ b/drivers/net/smc911x.c
@@ -30,7 +30,7 @@
 
 #include <command.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <init.h>
 #include <xfuncs.h>
@@ -367,7 +367,7 @@
 #define CHIP_9218	0x118a
 
 struct smc911x_priv {
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	unsigned long base;
 };
 
@@ -465,8 +465,7 @@ static int smc911x_set_ethaddr(struct eth_device *edev, unsigned char *m)
 	return 0;
 }
 
-static int smc911x_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-		uint8_t reg, uint16_t * val)
+static int smc911x_phy_read(struct mii_device *mdev, int phy_addr, int reg)
 {
 	struct eth_device *edev = mdev->edev;
 
@@ -477,13 +476,11 @@ static int smc911x_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
 
 	while (smc911x_get_mac_csr(edev, MII_ACC) & MII_ACC_MII_BUSY);
 
-	*val = smc911x_get_mac_csr(edev, MII_DATA);
-
-	return 0;
+	return smc911x_get_mac_csr(edev, MII_DATA);
 }
 
-static int smc911x_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-	uint8_t reg, uint16_t val)
+static int smc911x_phy_write(struct mii_device *mdev, int phy_addr,
+	int reg, int val)
 {
 	struct eth_device *edev = mdev->edev;
 
@@ -579,8 +576,8 @@ static int smc911x_eth_open(struct eth_device *edev)
 {
 	struct smc911x_priv *priv = (struct smc911x_priv *)edev->priv;
 
-	miiphy_wait_aneg(&priv->miiphy);
-	miiphy_print_status(&priv->miiphy);
+	miidev_wait_aneg(&priv->miidev);
+	miidev_print_status(&priv->miidev);
 
 	/* Turn on Tx + Rx */
 	smc911x_enable(edev);
@@ -681,7 +678,7 @@ static int smc911x_init_dev(struct eth_device *edev)
 	smc911x_set_mac_csr(edev, MAC_CR, MAC_CR_TXEN | MAC_CR_RXEN |
 			MAC_CR_HBDIS);
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 
 	return 0;
 }
@@ -729,17 +726,17 @@ static int smc911x_probe(struct device_d *dev)
 	edev->get_ethaddr = smc911x_get_ethaddr;
 	edev->set_ethaddr = smc911x_set_ethaddr;
 
-	priv->miiphy.read = smc911x_phy_read;
-	priv->miiphy.write = smc911x_phy_write;
-	priv->miiphy.address = 1;
-	priv->miiphy.flags = 0;
-	priv->miiphy.edev = edev;
+	priv->miidev.read = smc911x_phy_read;
+	priv->miidev.write = smc911x_phy_write;
+	priv->miidev.address = 1;
+	priv->miidev.flags = 0;
+	priv->miidev.edev = edev;
 	priv->base = dev->map_base;
 
 	smc911x_reset(edev);
 	smc911x_phy_reset(edev);
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
         return 0;
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 972fa40..6482626 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -5,7 +5,7 @@ menuconfig NET_USB
 if NET_USB
 
 config NET_USB_ASIX
-	select MIIPHY
+	select MIIDEV
 	bool "Asix compatible"
 
 endif
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c
index ca71b34..d148925 100644
--- a/drivers/net/usb/asix.c
+++ b/drivers/net/usb/asix.c
@@ -1,7 +1,7 @@
 #include <common.h>
 #include <init.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <usb/usb.h>
 #include <usb/usbnet.h>
 #include <errno.h>
@@ -231,8 +231,7 @@ static inline int asix_set_hw_mii(struct usbnet *dev)
 	return ret;
 }
 
-static int asix_mdio_read(struct miiphy_device *mdev, uint8_t phy_id,
-		uint8_t loc, uint16_t *val)
+static int asix_mdio_read(struct mii_device *mdev, int phy_id, int loc)
 {
 	struct eth_device *eth = mdev->edev;
 	struct usbnet *dev = eth->priv;
@@ -246,13 +245,10 @@ static int asix_mdio_read(struct miiphy_device *mdev, uint8_t phy_id,
 	dev_dbg(&dev->edev.dev, "asix_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x",
 			phy_id, loc, le16_to_cpu(res));
 
-	*val = le16_to_cpu(res);
-
-	return 0;
+	return le16_to_cpu(res);
 }
 
-static int asix_mdio_write(struct miiphy_device *mdev, uint8_t phy_id,
-		uint8_t loc, uint16_t val)
+static int asix_mdio_write(struct mii_device *mdev, int phy_id, int loc, int val)
 {
 	struct eth_device *eth = mdev->edev;
 	struct usbnet *dev = eth->priv;
@@ -473,13 +469,13 @@ static int asix_tx_fixup(struct usbnet *dev,
 
 static int asix_init_mii(struct usbnet *dev)
 {
-	dev->miiphy.read = asix_mdio_read;
-	dev->miiphy.write = asix_mdio_write;
-	dev->miiphy.address = asix_get_phy_addr(dev);
-	dev->miiphy.flags = 0;
-	dev->miiphy.edev = &dev->edev;
+	dev->miidev.read = asix_mdio_read;
+	dev->miidev.write = asix_mdio_write;
+	dev->miidev.address = asix_get_phy_addr(dev);
+	dev->miidev.flags = 0;
+	dev->miidev.edev = &dev->edev;
 
-	return miiphy_register(&dev->miiphy);
+	return mii_register(&dev->miidev);
 }
 
 static int ax88172_link_reset(struct usbnet *dev)
@@ -634,7 +630,7 @@ out:
 
 static void asix_unbind(struct usbnet *dev)
 {
-	miiphy_unregister(&dev->miiphy);
+	mii_unregister(&dev->miidev);
 }
 
 static struct driver_info ax8817x_info = {
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index cc170f6..983d464 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -160,7 +160,7 @@ static int usbnet_init(struct eth_device *edev)
                 return ret;
         }
 
-	miiphy_restart_aneg(&dev->miiphy);
+	miidev_restart_aneg(&dev->miidev);
 
 	return 0;
 }
@@ -171,10 +171,10 @@ static int usbnet_open(struct eth_device *edev)
 
 	dev_dbg(&edev->dev, "%s\n",__func__);
 
-	if (miiphy_wait_aneg(&dev->miiphy))
+	if (miidev_wait_aneg(&dev->miidev))
 		return -1;
 
-	miiphy_print_status(&dev->miiphy);
+	miidev_print_status(&dev->miidev);
 
 	return 0;
 }
diff --git a/include/linux/mii.h b/include/linux/mii.h
new file mode 100644
index 0000000..7345172
--- /dev/null
+++ b/include/linux/mii.h
@@ -0,0 +1,232 @@
+/*
+ * linux/mii.h: definitions for MII-compatible transceivers
+ * Originally drivers/net/sunhme.h.
+ *
+ * Copyright (C) 1996, 1999, 2001 David S. Miller (davem at redhat.com)
+ */
+
+#ifndef __LINUX_MII_H__
+#define __LINUX_MII_H__
+
+/* Generic MII registers. */
+
+#define MII_BMCR            0x00        /* Basic mode control register */
+#define MII_BMSR            0x01        /* Basic mode status register  */
+#define MII_PHYSID1         0x02        /* PHYS ID 1                   */
+#define MII_PHYSID2         0x03        /* PHYS ID 2                   */
+#define MII_ADVERTISE       0x04        /* Advertisement control reg   */
+#define MII_LPA             0x05        /* Link partner ability reg    */
+#define MII_EXPANSION       0x06        /* Expansion register          */
+#define MII_CTRL1000        0x09        /* 1000BASE-T control          */
+#define MII_STAT1000        0x0a        /* 1000BASE-T status           */
+#define MII_ESTATUS	    0x0f	/* Extended Status */
+#define MII_DCOUNTER        0x12        /* Disconnect counter          */
+#define MII_FCSCOUNTER      0x13        /* False carrier counter       */
+#define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */
+#define MII_RERRCOUNTER     0x15        /* Receive error counter       */
+#define MII_SREVISION       0x16        /* Silicon revision            */
+#define MII_RESV1           0x17        /* Reserved...                 */
+#define MII_LBRERROR        0x18        /* Lpback, rx, bypass error    */
+#define MII_PHYADDR         0x19        /* PHY address                 */
+#define MII_RESV2           0x1a        /* Reserved...                 */
+#define MII_TPISTATUS       0x1b        /* TPI status for 10mbps       */
+#define MII_NCONFIG         0x1c        /* Network interface config    */
+
+/* Basic mode control register. */
+#define BMCR_SPEED_MASK		0x2040	/* 10/100/1000		       */
+#define BMCR_SPEED10		0x0000	/* Select 10Mbps	       */
+#define BMCR_RESV               0x003f  /* Unused...                   */
+#define BMCR_SPEED1000		0x0040  /* MSB of Speed (1000)         */
+#define BMCR_CTST               0x0080  /* Collision test              */
+#define BMCR_FULLDPLX           0x0100  /* Full duplex                 */
+#define BMCR_ANRESTART          0x0200  /* Auto negotiation restart    */
+#define BMCR_ISOLATE            0x0400  /* Disconnect DP83840 from MII */
+#define BMCR_PDOWN              0x0800  /* Powerdown the DP83840       */
+#define BMCR_ANENABLE           0x1000  /* Enable auto negotiation     */
+#define BMCR_SPEED100           0x2000  /* Select 100Mbps              */
+#define BMCR_LOOPBACK           0x4000  /* TXD loopback bits           */
+#define BMCR_RESET              0x8000  /* Reset the DP83840           */
+
+/* Basic mode status register. */
+#define BMSR_ERCAP              0x0001  /* Ext-reg capability          */
+#define BMSR_JCD                0x0002  /* Jabber detected             */
+#define BMSR_LSTATUS            0x0004  /* Link status                 */
+#define BMSR_ANEGCAPABLE        0x0008  /* Able to do auto-negotiation */
+#define BMSR_RFAULT             0x0010  /* Remote fault detected       */
+#define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */
+#define BMSR_RESV               0x00c0  /* Unused...                   */
+#define BMSR_ESTATEN		0x0100	/* Extended Status in R15 */
+#define BMSR_100HALF2           0x0200  /* Can do 100BASE-T2 HDX */
+#define BMSR_100FULL2           0x0400  /* Can do 100BASE-T2 FDX */
+#define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */
+#define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */
+#define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */
+#define BMSR_100FULL            0x4000  /* Can do 100mbps, full-duplex */
+#define BMSR_100BASE4           0x8000  /* Can do 100mbps, 4k packets  */
+
+/* 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_1000XFULL     0x0020  /* Try for 1000BASE-X full-duplex */
+#define ADVERTISE_10FULL        0x0040  /* Try for 10mbps full-duplex  */
+#define ADVERTISE_1000XHALF     0x0040  /* Try for 1000BASE-X half-duplex */
+#define ADVERTISE_100HALF       0x0080  /* Try for 100mbps half-duplex */
+#define ADVERTISE_1000XPAUSE    0x0080  /* Try for 1000BASE-X pause    */
+#define ADVERTISE_100FULL       0x0100  /* Try for 100mbps full-duplex */
+#define ADVERTISE_1000XPSE_ASYM 0x0100  /* Try for 1000BASE-X asym pause */
+#define ADVERTISE_100BASE4      0x0200  /* Try for 100mbps 4k packets  */
+#define ADVERTISE_PAUSE_CAP     0x0400  /* Try for pause               */
+#define ADVERTISE_PAUSE_ASYM    0x0800  /* Try for asymetric pause     */
+#define ADVERTISE_RESV          0x1000  /* 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)
+
+/* Link partner ability register. */
+#define LPA_SLCT                0x001f  /* Same as advertise selector  */
+#define LPA_10HALF              0x0020  /* Can do 10mbps half-duplex   */
+#define LPA_1000XFULL           0x0020  /* Can do 1000BASE-X full-duplex */
+#define LPA_10FULL              0x0040  /* Can do 10mbps full-duplex   */
+#define LPA_1000XHALF           0x0040  /* Can do 1000BASE-X half-duplex */
+#define LPA_100HALF             0x0080  /* Can do 100mbps half-duplex  */
+#define LPA_1000XPAUSE          0x0080  /* Can do 1000BASE-X pause     */
+#define LPA_100FULL             0x0100  /* Can do 100mbps full-duplex  */
+#define LPA_1000XPAUSE_ASYM     0x0100  /* Can do 1000BASE-X pause asym*/
+#define LPA_100BASE4            0x0200  /* Can do 100mbps 4k packets   */
+#define LPA_PAUSE_CAP           0x0400  /* Can pause                   */
+#define LPA_PAUSE_ASYM          0x0800  /* Can pause asymetrically     */
+#define LPA_RESV                0x1000  /* Unused...                   */
+#define LPA_RFAULT              0x2000  /* Link partner faulted        */
+#define LPA_LPACK               0x4000  /* Link partner acked us       */
+#define LPA_NPAGE               0x8000  /* Next page bit               */
+
+#define LPA_DUPLEX		(LPA_10FULL | LPA_100FULL)
+#define LPA_100			(LPA_100FULL | LPA_100HALF | LPA_100BASE4)
+
+/* Expansion register for auto-negotiation. */
+#define EXPANSION_NWAY          0x0001  /* Can do N-way auto-nego      */
+#define EXPANSION_LCWP          0x0002  /* Got new RX page code word   */
+#define EXPANSION_ENABLENPAGE   0x0004  /* This enables npage words    */
+#define EXPANSION_NPCAPABLE     0x0008  /* Link partner supports npage */
+#define EXPANSION_MFAULTS       0x0010  /* Multiple faults detected    */
+#define EXPANSION_RESV          0xffe0  /* Unused...                   */
+
+#define ESTATUS_1000_TFULL	0x2000	/* Can do 1000BT Full */
+#define ESTATUS_1000_THALF	0x1000	/* Can do 1000BT Half */
+
+/* N-way test register. */
+#define NWAYTEST_RESV1          0x00ff  /* Unused...                   */
+#define NWAYTEST_LOOPBACK       0x0100  /* Enable loopback for N-way   */
+#define NWAYTEST_RESV2          0xfe00  /* Unused...                   */
+
+/* 1000BASE-T Control register */
+#define ADVERTISE_1000FULL      0x0200  /* Advertise 1000BASE-T full duplex */
+#define ADVERTISE_1000HALF      0x0100  /* Advertise 1000BASE-T half duplex */
+
+/* 1000BASE-T Status register */
+#define LPA_1000LOCALRXOK       0x2000  /* Link partner local receiver status */
+#define LPA_1000REMRXOK         0x1000  /* Link partner remote receiver status */
+#define LPA_1000FULL            0x0800  /* Link partner 1000BASE-T full duplex */
+#define LPA_1000HALF            0x0400  /* Link partner 1000BASE-T half duplex */
+
+/* Flow control flags */
+#define FLOW_CTRL_TX		0x01
+#define FLOW_CTRL_RX		0x02
+
+/**
+ * mii_nway_result
+ * @negotiated: value of MII ANAR and'd with ANLPAR
+ *
+ * Given a set of MII abilities, check each bit and returns the
+ * currently supported media, in the priority order defined by
+ * IEEE 802.3u.  We use LPA_xxx constants but note this is not the
+ * value of LPA solely, as described above.
+ *
+ * The one exception to IEEE 802.3u is that 100baseT4 is placed
+ * between 100T-full and 100T-half.  If your phy does not support
+ * 100T4 this is fine.  If your phy places 100T4 elsewhere in the
+ * priority order, you will need to roll your own function.
+ */
+static inline unsigned int mii_nway_result (unsigned int negotiated)
+{
+	unsigned int ret;
+
+	if (negotiated & LPA_100FULL)
+		ret = LPA_100FULL;
+	else if (negotiated & LPA_100BASE4)
+		ret = LPA_100BASE4;
+	else if (negotiated & LPA_100HALF)
+		ret = LPA_100HALF;
+	else if (negotiated & LPA_10FULL)
+		ret = LPA_10FULL;
+	else
+		ret = LPA_10HALF;
+
+	return ret;
+}
+
+/**
+ * mii_duplex
+ * @duplex_lock: Non-zero if duplex is locked at full
+ * @negotiated: value of MII ANAR and'd with ANLPAR
+ *
+ * A small helper function for a common case.  Returns one
+ * if the media is operating or locked at full duplex, and
+ * returns zero otherwise.
+ */
+static inline unsigned int mii_duplex (unsigned int duplex_lock,
+				       unsigned int negotiated)
+{
+	if (duplex_lock)
+		return 1;
+	if (mii_nway_result(negotiated) & LPA_DUPLEX)
+		return 1;
+	return 0;
+}
+
+/**
+ * mii_advertise_flowctrl - get flow control advertisement flags
+ * @cap: Flow control capabilities (FLOW_CTRL_RX, FLOW_CTRL_TX or both)
+ */
+static inline u16 mii_advertise_flowctrl(int cap)
+{
+	u16 adv = 0;
+
+	if (cap & FLOW_CTRL_RX)
+		adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
+	if (cap & FLOW_CTRL_TX)
+		adv ^= ADVERTISE_PAUSE_ASYM;
+
+	return adv;
+}
+
+/**
+ * mii_resolve_flowctrl_fdx
+ * @lcladv: value of MII ADVERTISE register
+ * @rmtadv: value of MII LPA register
+ *
+ * Resolve full duplex flow control as per IEEE 802.3-2005 table 28B-3
+ */
+static inline u8 mii_resolve_flowctrl_fdx(u16 lcladv, u16 rmtadv)
+{
+	u8 cap = 0;
+
+	if (lcladv & rmtadv & ADVERTISE_PAUSE_CAP) {
+		cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
+	} else if (lcladv & rmtadv & ADVERTISE_PAUSE_ASYM) {
+		if (lcladv & ADVERTISE_PAUSE_CAP)
+			cap = FLOW_CTRL_RX;
+		else if (rmtadv & ADVERTISE_PAUSE_CAP)
+			cap = FLOW_CTRL_TX;
+	}
+
+	return cap;
+}
+
+#endif /* __LINUX_MII_H__ */
diff --git a/include/miidev.h b/include/miidev.h
new file mode 100644
index 0000000..6f653d9
--- /dev/null
+++ b/include/miidev.h
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2001
+ * Gerald Van Baren, Custom IDEAS, vanbaren at cideas.com.
+ *
+ * (C) Copyright 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.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
+ */
+#ifndef __MIIDEV_H__
+#define __MIIDEV_H__
+
+#include <driver.h>
+#include <linux/mii.h>
+
+#define MIIDEV_FORCE_10		(1 << 0)
+#define MIIDEV_FORCE_LINK	(1 << 1)
+
+struct mii_device {
+	struct device_d dev;
+
+	int address;	/* The address the phy has on the bus */
+	int	(*read) (struct mii_device *dev, int addr, int reg);
+	int	(*write) (struct mii_device *dev, int addr, int reg, int value);
+
+	int flags;
+
+	struct eth_device *edev;
+	struct cdev cdev;
+};
+
+int mii_register(struct mii_device *dev);
+void mii_unregister(struct mii_device *mdev);
+int miidev_restart_aneg(struct mii_device *mdev);
+int miidev_wait_aneg(struct mii_device *mdev);
+int miidev_print_status(struct mii_device *mdev);
+
+static int inline mii_write(struct mii_device *dev, int addr, int reg, int value)
+{
+	return dev->write(dev, addr, reg, value);
+}
+
+static int inline mii_read(struct mii_device *dev, int addr, int reg)
+{
+	return dev->read(dev, addr, reg);
+}
+#endif /* __MIIDEV_H__ */
diff --git a/include/miiphy.h b/include/miiphy.h
deleted file mode 100644
index 67f1b1c..0000000
--- a/include/miiphy.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * linux/mii.h: definitions for MII-compatible transceivers
- * Originally drivers/net/sunhme.h.
- *
- * Copyright (C) 1996, 1999, 2001 David S. Miller (davem at redhat.com)
- */
-
-#ifndef _MII_PHY_H_
-#define _MII_PHY_H_
-
-#include <driver.h>
-
-#define MIIPHY_FORCE_10		(1 << 0)
-#define MIIPHY_FORCE_LINK	(1 << 1)
-
-#define MII_BMCR            0x00        /* Basic mode control register */
-#define MII_BMSR            0x01        /* Basic mode status register  */
-#define MII_PHYSID1         0x02        /* PHYS ID 1                   */
-#define MII_PHYSID2         0x03        /* PHYS ID 2                   */
-#define MII_ADVERTISE       0x04        /* Advertisement control reg   */
-#define MII_LPA             0x05        /* Link partner ability reg    */
-#define MII_EXPANSION       0x06        /* Expansion register          */
-#define MII_CTRL1000        0x09        /* 1000BASE-T control          */
-#define MII_STAT1000        0x0a        /* 1000BASE-T status           */
-#define MII_ESTATUS	    0x0f	/* Extended Status             */
-#define MII_DCOUNTER        0x12        /* Disconnect counter          */
-#define MII_FCSCOUNTER      0x13        /* False carrier counter       */
-#define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */
-#define MII_RERRCOUNTER     0x15        /* Receive error counter       */
-#define MII_SREVISION       0x16        /* Silicon revision            */
-#define MII_RESV1           0x17        /* Reserved...                 */
-#define MII_LBRERROR        0x18        /* Lpback, rx, bypass error    */
-#define MII_PHYADDR         0x19        /* PHY address                 */
-#define MII_RESV2           0x1a        /* Reserved...                 */
-#define MII_TPISTATUS       0x1b        /* TPI status for 10mbps       */
-#define MII_NCONFIG         0x1c        /* Network interface config    */
-
-/* Basic mode control register. */
-#define BMCR_RESV               0x003f  /* Unused...                   */
-#define BMCR_SPEED1000		0x0040  /* MSB of Speed (1000)         */
-#define BMCR_CTST               0x0080  /* Collision test              */
-#define BMCR_FULLDPLX           0x0100  /* Full duplex                 */
-#define BMCR_ANRESTART          0x0200  /* Auto negotiation restart    */
-#define BMCR_ISOLATE            0x0400  /* Disconnect DP83840 from MII */
-#define BMCR_PDOWN              0x0800  /* Powerdown the DP83840       */
-#define BMCR_ANENABLE           0x1000  /* Enable auto negotiation     */
-#define BMCR_SPEED100           0x2000  /* Select 100Mbps              */
-#define BMCR_LOOPBACK           0x4000  /* TXD loopback bits           */
-#define BMCR_RESET              0x8000  /* Reset the DP83840           */
-
-/* Basic mode status register. */
-#define BMSR_ERCAP              0x0001  /* Ext-reg capability          */
-#define BMSR_JCD                0x0002  /* Jabber detected             */
-#define BMSR_LSTATUS            0x0004  /* Link status                 */
-#define BMSR_ANEGCAPABLE        0x0008  /* Able to do auto-negotiation */
-#define BMSR_RFAULT             0x0010  /* Remote fault detected       */
-#define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */
-#define BMSR_RESV               0x00c0  /* Unused...                   */
-#define BMSR_ESTATEN		0x0100	/* Extended Status in R15      */
-#define BMSR_100HALF2           0x0200  /* Can do 100BASE-T2 HDX       */
-#define BMSR_100FULL2           0x0400  /* Can do 100BASE-T2 FDX       */
-#define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */
-#define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */
-#define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */
-#define BMSR_100FULL            0x4000  /* Can do 100mbps, full-duplex */
-#define BMSR_100BASE4           0x8000  /* Can do 100mbps, 4k packets  */
-
-/* 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_1000XFULL     0x0020  /* Try for 1000BASE-X full-duplex */
-#define ADVERTISE_10FULL        0x0040  /* Try for 10mbps full-duplex  */
-#define ADVERTISE_1000XHALF     0x0040  /* Try for 1000BASE-X half-duplex */
-#define ADVERTISE_100HALF       0x0080  /* Try for 100mbps half-duplex */
-#define ADVERTISE_1000XPAUSE    0x0080  /* Try for 1000BASE-X pause    */
-#define ADVERTISE_100FULL       0x0100  /* Try for 100mbps full-duplex */
-#define ADVERTISE_1000XPSE_ASYM 0x0100  /* Try for 1000BASE-X asym pause */
-#define ADVERTISE_100BASE4      0x0200  /* Try for 100mbps 4k packets  */
-#define ADVERTISE_PAUSE_CAP     0x0400  /* Try for pause               */
-#define ADVERTISE_PAUSE_ASYM    0x0800  /* Try for asymetric pause     */
-#define ADVERTISE_RESV          0x1000  /* 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)
-
-/* Link partner ability register. */
-#define LPA_SLCT                0x001f  /* Same as advertise selector  */
-#define LPA_10HALF              0x0020  /* Can do 10mbps half-duplex   */
-#define LPA_1000XFULL           0x0020  /* Can do 1000BASE-X full-duplex */
-#define LPA_10FULL              0x0040  /* Can do 10mbps full-duplex   */
-#define LPA_1000XHALF           0x0040  /* Can do 1000BASE-X half-duplex */
-#define LPA_100HALF             0x0080  /* Can do 100mbps half-duplex  */
-#define LPA_1000XPAUSE          0x0080  /* Can do 1000BASE-X pause     */
-#define LPA_100FULL             0x0100  /* Can do 100mbps full-duplex  */
-#define LPA_1000XPAUSE_ASYM     0x0100  /* Can do 1000BASE-X pause asym*/
-#define LPA_100BASE4            0x0200  /* Can do 100mbps 4k packets   */
-#define LPA_PAUSE_CAP           0x0400  /* Can pause                   */
-#define LPA_PAUSE_ASYM          0x0800  /* Can pause asymetrically     */
-#define LPA_RESV                0x1000  /* Unused...                   */
-#define LPA_RFAULT              0x2000  /* Link partner faulted        */
-#define LPA_LPACK               0x4000  /* Link partner acked us       */
-#define LPA_NPAGE               0x8000  /* Next page bit               */
-
-#define LPA_DUPLEX		(LPA_10FULL | LPA_100FULL)
-#define LPA_100			(LPA_100FULL | LPA_100HALF | LPA_100BASE4)
-
-/* Expansion register for auto-negotiation. */
-#define EXPANSION_NWAY          0x0001  /* Can do N-way auto-nego      */
-#define EXPANSION_LCWP          0x0002  /* Got new RX page code word   */
-#define EXPANSION_ENABLENPAGE   0x0004  /* This enables npage words    */
-#define EXPANSION_NPCAPABLE     0x0008  /* Link partner supports npage */
-#define EXPANSION_MFAULTS       0x0010  /* Multiple faults detected    */
-#define EXPANSION_RESV          0xffe0  /* Unused...                   */
-
-#define ESTATUS_1000_TFULL	0x2000	/* Can do 1000BT Full */
-#define ESTATUS_1000_THALF	0x1000	/* Can do 1000BT Half */
-
-/* N-way test register. */
-#define NWAYTEST_RESV1          0x00ff  /* Unused...                   */
-#define NWAYTEST_LOOPBACK       0x0100  /* Enable loopback for N-way   */
-#define NWAYTEST_RESV2          0xfe00  /* Unused...                   */
-
-/* 1000BASE-T Control register */
-#define ADVERTISE_1000FULL      0x0200  /* Advertise 1000BASE-T full duplex */
-#define ADVERTISE_1000HALF      0x0100  /* Advertise 1000BASE-T half duplex */
-
-/* 1000BASE-T Status register */
-#define LPA_1000LOCALRXOK       0x2000  /* Link partner local receiver status */
-#define LPA_1000REMRXOK         0x1000  /* Link partner remote receiver status */
-#define LPA_1000FULL            0x0800  /* Link partner 1000BASE-T full duplex */
-#define LPA_1000HALF            0x0400  /* Link partner 1000BASE-T half duplex */
-
-struct miiphy_device {
-	struct device_d dev;
-
-	int address;	/* The address the phy has on the bus */
-	int (*read)(struct miiphy_device *mdev, uint8_t phy_addr, uint8_t reg_addr, uint16_t *value);
-	int (*write)(struct miiphy_device *mdev, uint8_t phy_addr, uint8_t reg_addr, uint16_t data);
-
-	int flags;
-
-	struct eth_device *edev;
-	struct cdev cdev;
-};
-
-int miiphy_register(struct miiphy_device *mdev);
-void miiphy_unregister(struct miiphy_device *mdev);
-int miiphy_restart_aneg(struct miiphy_device *mdev);
-int miiphy_wait_aneg(struct miiphy_device *mdev);
-int miiphy_print_status(struct miiphy_device *mdev);
-
-#endif
diff --git a/include/usb/usbnet.h b/include/usb/usbnet.h
index e3ea373..1609b2e 100644
--- a/include/usb/usbnet.h
+++ b/include/usb/usbnet.h
@@ -23,7 +23,7 @@
 #define	__LINUX_USB_USBNET_H
 
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 
 /* interface from usbnet core to each USB networking link we handle */
 struct usbnet {
@@ -40,7 +40,7 @@ struct usbnet {
 
 	/* protocol/interface state */
 	struct eth_device	edev;
-	struct miiphy_device	miiphy;
+	struct mii_device	miidev;
 
 	int			msg_enable;
 	unsigned long		data [5];
diff --git a/net/eth.c b/net/eth.c
index 4d58191..cfb0fef 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -26,7 +26,7 @@
 #include <driver.h>
 #include <init.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <errno.h>
 #include <malloc.h>
 
-- 
1.7.1



From plagnioj at jcrosoft.com  Thu Aug 26 12:33:28 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Thu, 26 Aug 2010 18:33:28 +0200
Subject: [PATCH V2] net: rework the mii support
In-Reply-To: <1282840072-8005-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282840072-8005-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1282840408-8653-1-git-send-email-plagnioj@jcrosoft.com>

this rework is done in order to add a phylib and allow to have phy driver support

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
v2:
patch generate with rename detection

 arch/arm/configs/a9m2410_defconfig                 |    2 +-
 arch/arm/configs/a9m2440_defconfig                 |    2 +-
 arch/arm/configs/at91sam9260ek_defconfig           |    2 +-
 arch/arm/configs/at91sam9263ek_defconfig           |    2 +-
 arch/arm/configs/edb93xx_defconfig                 |    2 +-
 arch/arm/configs/eukrea_cpuimx25_defconfig         |    2 +-
 arch/arm/configs/eukrea_cpuimx27_defconfig         |    2 +-
 arch/arm/configs/eukrea_cpuimx35_defconfig         |    2 +-
 arch/arm/configs/freescale_mx25_3stack_defconfig   |    2 +-
 arch/arm/configs/freescale_mx35_3stack_defconfig   |    2 +-
 arch/arm/configs/mmccpu_defconfig                  |    2 +-
 arch/arm/configs/neso_defconfig                    |    2 +-
 arch/arm/configs/netx_nxdb500_defconfig            |    2 +-
 arch/arm/configs/nhk8815_defconfig                 |    2 +-
 arch/arm/configs/omap3530_beagle_defconfig         |    2 +-
 arch/arm/configs/pca100_defconfig                  |    2 +-
 arch/arm/configs/pcm037_defconfig                  |    2 +-
 arch/arm/configs/pcm038_defconfig                  |    2 +-
 arch/arm/configs/pcm043_defconfig                  |    2 +-
 arch/arm/configs/pm9263_defconfig                  |    2 +-
 arch/arm/configs/scb9328_defconfig                 |    2 +-
 arch/blackfin/configs/ipe337_defconfig             |    2 +-
 .../m68k/configs/phycore_kpukdr1_5475num_defconfig |    2 +-
 arch/m68k/configs/phycore_mcf54xx_defconfig        |    2 +-
 arch/ppc/configs/pcm030_defconfig                  |    2 +-
 drivers/net/Kconfig                                |   18 ++--
 drivers/net/Makefile                               |    2 +-
 drivers/net/at91_ether.c                           |   10 +-
 drivers/net/dm9000.c                               |   33 +++---
 drivers/net/ep93xx.c                               |   37 +++----
 drivers/net/ep93xx.h                               |    2 +-
 drivers/net/fec_imx.c                              |   33 +++---
 drivers/net/fec_imx.h                              |    2 +-
 drivers/net/fec_mpc5200.c                          |   35 +++---
 drivers/net/fec_mpc5200.h                          |    2 +-
 drivers/net/macb.c                                 |   33 +++---
 drivers/net/{miiphy.c => miidev.c}                 |   96 ++++++++-------
 drivers/net/netx_eth.c                             |   37 +++---
 drivers/net/smc91111.c                             |   32 +++---
 drivers/net/smc911x.c                              |   33 +++---
 drivers/net/usb/Kconfig                            |    2 +-
 drivers/net/usb/asix.c                             |   26 ++---
 drivers/net/usb/usbnet.c                           |    6 +-
 include/{miiphy.h => linux/mii.h}                  |  132 +++++++++++++++-----
 include/miidev.h                                   |   62 +++++++++
 include/usb/usbnet.h                               |    4 +-
 net/eth.c                                          |    2 +-
 47 files changed, 404 insertions(+), 285 deletions(-)
 rename drivers/net/{miiphy.c => miidev.c} (59%)
 rename include/{miiphy.h => linux/mii.h} (74%)
 create mode 100644 include/miidev.h

diff --git a/arch/arm/configs/a9m2410_defconfig b/arch/arm/configs/a9m2410_defconfig
index 9e888fc..e9fa74c 100644
--- a/arch/arm/configs/a9m2410_defconfig
+++ b/arch/arm/configs/a9m2410_defconfig
@@ -198,7 +198,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_S3C24X0=y
 # CONFIG_DRIVER_SERIAL_S3C24X0_AUTOSYNC is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/a9m2440_defconfig b/arch/arm/configs/a9m2440_defconfig
index f69dcfd..b7a26bc 100644
--- a/arch/arm/configs/a9m2440_defconfig
+++ b/arch/arm/configs/a9m2440_defconfig
@@ -200,7 +200,7 @@ CONFIG_NET_TFTP=y
 CONFIG_DRIVER_SERIAL_S3C24X0=y
 # CONFIG_DRIVER_SERIAL_S3C24X0_AUTOSYNC is not set
 CONFIG_HAS_CS8900=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/at91sam9260ek_defconfig b/arch/arm/configs/at91sam9260ek_defconfig
index b40485b..0387b71 100644
--- a/arch/arm/configs/at91sam9260ek_defconfig
+++ b/arch/arm/configs/at91sam9260ek_defconfig
@@ -185,7 +185,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/at91sam9263ek_defconfig b/arch/arm/configs/at91sam9263ek_defconfig
index d423c2f..ae4006c 100644
--- a/arch/arm/configs/at91sam9263ek_defconfig
+++ b/arch/arm/configs/at91sam9263ek_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/edb93xx_defconfig b/arch/arm/configs/edb93xx_defconfig
index d8fe23f..936bd47 100644
--- a/arch/arm/configs/edb93xx_defconfig
+++ b/arch/arm/configs/edb93xx_defconfig
@@ -199,7 +199,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_PL010=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/eukrea_cpuimx25_defconfig b/arch/arm/configs/eukrea_cpuimx25_defconfig
index 14f06c2..abafc72 100644
--- a/arch/arm/configs/eukrea_cpuimx25_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx25_defconfig
@@ -211,7 +211,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/eukrea_cpuimx27_defconfig b/arch/arm/configs/eukrea_cpuimx27_defconfig
index c7f6b78..13df567 100644
--- a/arch/arm/configs/eukrea_cpuimx27_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx27_defconfig
@@ -219,7 +219,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 CONFIG_DRIVER_SERIAL_NS16550=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/eukrea_cpuimx35_defconfig b/arch/arm/configs/eukrea_cpuimx35_defconfig
index 7c5b49a..77f5246 100644
--- a/arch/arm/configs/eukrea_cpuimx35_defconfig
+++ b/arch/arm/configs/eukrea_cpuimx35_defconfig
@@ -214,7 +214,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/freescale_mx25_3stack_defconfig b/arch/arm/configs/freescale_mx25_3stack_defconfig
index fd7dd42..b45b995 100644
--- a/arch/arm/configs/freescale_mx25_3stack_defconfig
+++ b/arch/arm/configs/freescale_mx25_3stack_defconfig
@@ -201,7 +201,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/freescale_mx35_3stack_defconfig b/arch/arm/configs/freescale_mx35_3stack_defconfig
index 4321fbc..ff3ba6a 100644
--- a/arch/arm/configs/freescale_mx35_3stack_defconfig
+++ b/arch/arm/configs/freescale_mx35_3stack_defconfig
@@ -201,7 +201,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/arm/configs/mmccpu_defconfig b/arch/arm/configs/mmccpu_defconfig
index a8c41e7..e196a0c 100644
--- a/arch/arm/configs/mmccpu_defconfig
+++ b/arch/arm/configs/mmccpu_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/neso_defconfig b/arch/arm/configs/neso_defconfig
index 3f2a978..03673f2 100644
--- a/arch/arm/configs/neso_defconfig
+++ b/arch/arm/configs/neso_defconfig
@@ -212,7 +212,7 @@ CONFIG_NET_RESOLV=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/netx_nxdb500_defconfig b/arch/arm/configs/netx_nxdb500_defconfig
index 95afb5e..7047d6b 100644
--- a/arch/arm/configs/netx_nxdb500_defconfig
+++ b/arch/arm/configs/netx_nxdb500_defconfig
@@ -184,7 +184,7 @@ CONFIG_NET_TFTP=y
 CONFIG_DRIVER_SERIAL_NETX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_HAS_NETX_ETHER=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/nhk8815_defconfig b/arch/arm/configs/nhk8815_defconfig
index 1488838..21d596f 100644
--- a/arch/arm/configs/nhk8815_defconfig
+++ b/arch/arm/configs/nhk8815_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_SERIAL_AMBA_PL011=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/omap3530_beagle_defconfig b/arch/arm/configs/omap3530_beagle_defconfig
index 2383c63..41b8d87 100644
--- a/arch/arm/configs/omap3530_beagle_defconfig
+++ b/arch/arm/configs/omap3530_beagle_defconfig
@@ -202,7 +202,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_NS16550=y
 CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pca100_defconfig b/arch/arm/configs/pca100_defconfig
index accc6ef..5053bf6 100644
--- a/arch/arm/configs/pca100_defconfig
+++ b/arch/arm/configs/pca100_defconfig
@@ -210,7 +210,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pcm037_defconfig b/arch/arm/configs/pcm037_defconfig
index bb67995..bfee2b2 100644
--- a/arch/arm/configs/pcm037_defconfig
+++ b/arch/arm/configs/pcm037_defconfig
@@ -211,7 +211,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pcm038_defconfig b/arch/arm/configs/pcm038_defconfig
index 2925c9c..a2b31f2 100644
--- a/arch/arm/configs/pcm038_defconfig
+++ b/arch/arm/configs/pcm038_defconfig
@@ -211,7 +211,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pcm043_defconfig b/arch/arm/configs/pcm043_defconfig
index 31c65f1..b374c7c 100644
--- a/arch/arm/configs/pcm043_defconfig
+++ b/arch/arm/configs/pcm043_defconfig
@@ -213,7 +213,7 @@ CONFIG_NET_NETCONSOLE=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/pm9263_defconfig b/arch/arm/configs/pm9263_defconfig
index d5ee46a..da7a856 100644
--- a/arch/arm/configs/pm9263_defconfig
+++ b/arch/arm/configs/pm9263_defconfig
@@ -189,7 +189,7 @@ CONFIG_NET_TFTP=y
 # CONFIG_DRIVER_SERIAL_ARM_DCC is not set
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_DRIVER_SERIAL_ATMEL=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/arm/configs/scb9328_defconfig b/arch/arm/configs/scb9328_defconfig
index 7dc56dd..eaf7bd4 100644
--- a/arch/arm/configs/scb9328_defconfig
+++ b/arch/arm/configs/scb9328_defconfig
@@ -201,7 +201,7 @@ CONFIG_NET_TFTP=y
 CONFIG_DRIVER_SERIAL_IMX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
 CONFIG_HAS_DM9000=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/blackfin/configs/ipe337_defconfig b/arch/blackfin/configs/ipe337_defconfig
index 33fd2fc..e5667dc 100644
--- a/arch/blackfin/configs/ipe337_defconfig
+++ b/arch/blackfin/configs/ipe337_defconfig
@@ -146,7 +146,7 @@ CONFIG_NET_TFTP=y
 #
 CONFIG_DRIVER_SERIAL_BLACKFIN=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig b/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig
index bb91152..d868808 100644
--- a/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig
+++ b/arch/m68k/configs/phycore_kpukdr1_5475num_defconfig
@@ -163,7 +163,7 @@ CONFIG_NET_TFTP=y
 # serial drivers
 #
 CONFIG_DRIVER_SERIAL_MCFV4E=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers
diff --git a/arch/m68k/configs/phycore_mcf54xx_defconfig b/arch/m68k/configs/phycore_mcf54xx_defconfig
index f64ca8b..ca3387a 100644
--- a/arch/m68k/configs/phycore_mcf54xx_defconfig
+++ b/arch/m68k/configs/phycore_mcf54xx_defconfig
@@ -163,7 +163,7 @@ CONFIG_NET_TFTP=y
 # serial drivers                
 #
 CONFIG_DRIVER_SERIAL_MCFV4E=y
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/arch/ppc/configs/pcm030_defconfig b/arch/ppc/configs/pcm030_defconfig
index efdfb52..56d8844 100644
--- a/arch/ppc/configs/pcm030_defconfig
+++ b/arch/ppc/configs/pcm030_defconfig
@@ -154,7 +154,7 @@ CONFIG_NET_TFTP=y
 #
 CONFIG_DRIVER_SERIAL_MPC5XXX=y
 # CONFIG_DRIVER_SERIAL_NS16550 is not set
-CONFIG_MIIPHY=y
+CONFIG_MIIDEV=y
 
 #
 # Network drivers               
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index a106a7b..69f3352 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -13,7 +13,7 @@ config HAS_AT91_ETHER
 config HAS_NETX_ETHER
 	bool
 
-config MIIPHY
+config MIIDEV
 	bool
 
 menu "Network drivers               "
@@ -25,7 +25,7 @@ config DRIVER_NET_CS8900
 
 config DRIVER_NET_SMC911X
 	bool "smc911x ethernet driver"
-	select MIIPHY
+	select MIIDEV
 	help
 	  This option enables support for the SMSC LAN9[12]1[567]
 	  ethernet chip.
@@ -38,7 +38,7 @@ config DRIVER_NET_SMC911X_ADDRESS_SHIFT
 
 config DRIVER_NET_SMC91111
 	bool "smc91111 ethernet driver"
-	select MIIPHY
+	select MIIDEV
 	help
 	  This option enables support for the SMSC LAN91C111
 	  ethernet chip.
@@ -46,12 +46,12 @@ config DRIVER_NET_SMC91111
 config DRIVER_NET_DM9000
 	bool "Davicom dm9000 ethernet driver"
 	depends on HAS_DM9000
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_NETX
 	bool "Hilscher Netx ethernet driver"
 	depends on HAS_NETX_ETHER
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_AT91_ETHER
 	bool "at91 ethernet driver"
@@ -60,22 +60,22 @@ config DRIVER_NET_AT91_ETHER
 config DRIVER_NET_MPC5200
 	bool "MPC5200 Ethernet driver"
 	depends on ARCH_MPC5200
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_FEC_IMX
 	bool "i.MX FEC Ethernet driver"
 	depends on ARCH_HAS_FEC_IMX
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_EP93XX
 	bool "EP93xx Ethernet driver"
 	depends on ARCH_EP93XX
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_MACB
 	bool "macb Ethernet driver"
 	depends on HAS_MACB
-	select MIIPHY
+	select MIIDEV
 
 config DRIVER_NET_TAP
 	bool "tap Ethernet driver"
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 1b6f104..96d3d32 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -9,5 +9,5 @@ obj-$(CONFIG_DRIVER_NET_FEC_IMX)	+= fec_imx.o
 obj-$(CONFIG_DRIVER_NET_EP93XX)		+= ep93xx.o
 obj-$(CONFIG_DRIVER_NET_MACB)		+= macb.o
 obj-$(CONFIG_DRIVER_NET_TAP)		+= tap.o
-obj-$(CONFIG_MIIPHY)			+= miiphy.o
+obj-$(CONFIG_MIIDEV)			+= miidev.o
 obj-$(CONFIG_NET_USB)			+= usb/
diff --git a/drivers/net/at91_ether.c b/drivers/net/at91_ether.c
index 3c4f4b0..4563ff3 100644
--- a/drivers/net/at91_ether.c
+++ b/drivers/net/at91_ether.c
@@ -24,7 +24,7 @@
 #include <at91rm9200_net.h>
 #include <init.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <driver.h>
 
@@ -208,7 +208,7 @@ static void at91rm9200_eth_halt (struct eth_device *edev)
 };
 
 #if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
-int  at91rm9200_miiphy_read(char *devname, unsigned char addr,
+int  at91rm9200_miidev_read(char *devname, unsigned char addr,
 		unsigned char reg, unsigned short * value)
 {
 	at91rm9200_EmacEnableMDIO (p_mac);
@@ -217,7 +217,7 @@ int  at91rm9200_miiphy_read(char *devname, unsigned char addr,
 	return 0;
 }
 
-int  at91rm9200_miiphy_write(char *devname, unsigned char addr,
+int  at91rm9200_miidev_write(char *devname, unsigned char addr,
 		unsigned char reg, unsigned short value)
 {
 	at91rm9200_EmacEnableMDIO (p_mac);
@@ -228,10 +228,10 @@ int  at91rm9200_miiphy_write(char *devname, unsigned char addr,
 
 #endif	/* defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII) */
 
-int at91rm9200_miiphy_initialize(void)
+int at91rm9200_miidev_initialize(void)
 {
 #if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)
-	miiphy_register("at91rm9200phy", at91rm9200_miiphy_read, at91rm9200_miiphy_write);
+	mii_register("at91rm9200phy", at91rm9200_miidev_read, at91rm9200_miidev_write);
 #endif
 	return 0;
 }
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c
index ab06735..c31cf1a 100644
--- a/drivers/net/dm9000.c
+++ b/drivers/net/dm9000.c
@@ -46,7 +46,7 @@
 #include <command.h>
 #include <driver.h>
 #include <clock.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <net.h>
 #include <init.h>
@@ -167,7 +167,7 @@
 struct dm9000_priv {
 	unsigned long iobase;
 	unsigned long iodata;
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	int buswidth;
 };
 
@@ -200,9 +200,9 @@ static void DM9000_iow(struct dm9000_priv *priv, int reg, u8 value)
 	writeb(value, priv->iodata);
 }
 
-static int dm9000_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-		uint8_t reg, uint16_t * val)
+static int dm9000_phy_read(struct mii_device *mdev, int addr, int reg)
 {
+	int val;
 	struct eth_device *edev = mdev->edev;
 	struct dm9000_priv *priv = edev->priv;
 
@@ -211,15 +211,14 @@ static int dm9000_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
 	DM9000_iow(priv, DM9000_EPCR, 0xc);	/* Issue phyxcer read command */
 	udelay(100);			/* Wait read complete */
 	DM9000_iow(priv, DM9000_EPCR, 0x0);	/* Clear phyxcer read command */
-	*val = (DM9000_ior(priv, DM9000_EPDRH) << 8) | DM9000_ior(priv, DM9000_EPDRL);
+	val = (DM9000_ior(priv, DM9000_EPDRH) << 8) | DM9000_ior(priv, DM9000_EPDRL);
 
 	/* The read data keeps on REG_0D & REG_0E */
 	debug("phy_read(%d): %d\n", reg, val);
-	return 0;
+	return val;
 }
 
-static int dm9000_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-	uint8_t reg, uint16_t val)
+static int dm9000_phy_write(struct mii_device *mdev, int addr, int reg, int val)
 {
 	struct eth_device *edev = mdev->edev;
 	struct dm9000_priv *priv = edev->priv;
@@ -268,8 +267,8 @@ static int dm9000_eth_open(struct eth_device *edev)
 {
 	struct dm9000_priv *priv = (struct dm9000_priv *)edev->priv;
 
-	miiphy_wait_aneg(&priv->miiphy);
-	miiphy_print_status(&priv->miiphy);
+	miidev_wait_aneg(&priv->miidev);
+	miidev_print_status(&priv->miidev);
 	return 0;
 }
 
@@ -466,7 +465,7 @@ static int dm9000_init_dev(struct eth_device *edev)
 {
 	struct dm9000_priv *priv = (struct dm9000_priv *)edev->priv;
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 	return 0;
 }
 
@@ -523,13 +522,13 @@ static int dm9000_probe(struct device_d *dev)
 	DM9000_iow(priv, DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);	/* RX enable */
 	DM9000_iow(priv, DM9000_IMR, IMR_PAR);	/* Enable TX/RX interrupt mask */
 
-	priv->miiphy.read = dm9000_phy_read;
-	priv->miiphy.write = dm9000_phy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
-	priv->miiphy.edev = edev;
+	priv->miidev.read = dm9000_phy_read;
+	priv->miidev.write = dm9000_phy_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
+	priv->miidev.edev = edev;
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
         return 0;
diff --git a/drivers/net/ep93xx.c b/drivers/net/ep93xx.c
index c6c4671..851f6af 100644
--- a/drivers/net/ep93xx.c
+++ b/drivers/net/ep93xx.c
@@ -34,16 +34,15 @@
 #include <command.h>
 #include <init.h>
 #include <malloc.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <asm/io.h>
 #include <linux/types.h>
 #include <mach/ep93xx-regs.h>
 #include "ep93xx.h"
 
-static int ep93xx_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-			uint8_t phy_reg, uint16_t *value);
-static int ep93xx_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-			uint8_t phy_reg, uint16_t value);
+static int ep93xx_phy_read(struct mii_device *mdev, int phy_addr, int phy_reg);
+static int ep93xx_phy_write(struct mii_device *mdev, int phy_addr, int phy_reg,
+			    int value);
 
 static inline struct ep93xx_eth_priv *ep93xx_get_priv(struct eth_device *edev)
 {
@@ -497,10 +496,10 @@ static int ep93xx_eth_probe(struct device_d *dev)
 	edev->get_ethaddr = ep93xx_eth_get_ethaddr;
 	edev->set_ethaddr = ep93xx_eth_set_ethaddr;
 
-	priv->miiphy.read = ep93xx_phy_read;
-	priv->miiphy.write = ep93xx_phy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
+	priv->miidev.read = ep93xx_phy_read;
+	priv->miidev.write = ep93xx_phy_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
 
 	priv->tx_dq.base = calloc(NUMTXDESC,
 				sizeof(struct tx_descriptor));
@@ -530,7 +529,7 @@ static int ep93xx_eth_probe(struct device_d *dev)
 		goto eth_probe_failed_3;
 	}
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
 	ret = 0;
@@ -573,11 +572,10 @@ eth_probe_done:
 /**
  * Read a 16-bit value from an MII register.
  */
-static int ep93xx_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-			uint8_t phy_reg, uint16_t *value)
+static int ep93xx_phy_read(struct mii_device *mdev, int phy_addr, int phy_reg)
 {
 	struct mac_regs *regs = ep93xx_get_regs(mdev->edev);
-	int ret = -1;
+	int value = -1;
 	uint32_t self_ctl;
 
 	pr_debug("+ep93xx_phy_read\n");
@@ -604,26 +602,23 @@ static int ep93xx_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
 	while (readl(&regs->miists) & MIISTS_BUSY)
 		; /* noop */
 
-	*value = (unsigned short)readl(&regs->miidata);
+	value = (unsigned short)readl(&regs->miidata);
 
 	/* Restore the saved SelfCTL value and return. */
 	writel(self_ctl, &regs->selfctl);
 
-	ret = 0;
-
 	pr_debug("-ep93xx_phy_read\n");
 
-	return ret;
+	return value;
 }
 
 /**
  * Write a 16-bit value to an MII register.
  */
-static int ep93xx_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
+static int ep93xx_phy_write(struct mii_device *mdev, uint8_t phy_addr,
 			uint8_t phy_reg, uint16_t value)
 {
 	struct mac_regs *regs = ep93xx_get_regs(mdev->edev);
-	int ret = -1;
 	uint32_t self_ctl;
 
 	pr_debug("+ep93xx_phy_write\n");
@@ -651,11 +646,9 @@ static int ep93xx_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
 	/* Restore the saved SelfCTL value and return. */
 	writel(self_ctl, &regs->selfctl);
 
-	ret = 0;
-
 	pr_debug("-ep93xx_phy_write\n");
 
-	return ret;
+	return 0;
 }
 
 static struct driver_d ep93xx_eth_driver = {
diff --git a/drivers/net/ep93xx.h b/drivers/net/ep93xx.h
index ae45c54..875715f 100644
--- a/drivers/net/ep93xx.h
+++ b/drivers/net/ep93xx.h
@@ -141,7 +141,7 @@ struct ep93xx_eth_priv {
 	struct tx_descriptor_queue	tx_dq;
 	struct tx_status_queue		tx_sq;
 
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 };
 
 #endif
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 9e752f6..73b7a54 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -22,9 +22,9 @@
 #include <malloc.h>
 #include <net.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <driver.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <fec.h>
 
 #include <asm/mmu.h>
@@ -47,8 +47,7 @@ struct fec_frame {
 /*
  * MII-interface related functions
  */
-static int fec_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t * retVal)
+static int fec_miidev_read(struct mii_device *mdev, int phyAddr, int regAddr)
 {
 	struct eth_device *edev = mdev->edev;
 	struct fec_priv *fec = (struct fec_priv *)edev->priv;
@@ -88,13 +87,11 @@ static int fec_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
 	/*
 	 * it's now safe to read the PHY's register
 	 */
-	*retVal = readl(fec->regs + FEC_MII_DATA);
-
-	return 0;
+	return readl(fec->regs + FEC_MII_DATA);
 }
 
-static int fec_miiphy_write(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t data)
+static int fec_miidev_write(struct mii_device *mdev, int phyAddr,
+	int regAddr, int data)
 {
 	struct eth_device *edev = mdev->edev;
 	struct fec_priv *fec = (struct fec_priv *)edev->priv;
@@ -317,7 +314,7 @@ static int fec_init(struct eth_device *dev)
 	writel(FEC_MAX_PKT_SIZE, fec->regs + FEC_EMRBR);
 
 	if (fec->xcv_type != SEVENWIRE)
-		miiphy_restart_aneg(&fec->miiphy);
+		miidev_restart_aneg(&fec->miidev);
 
 	return 0;
 }
@@ -351,10 +348,10 @@ static int fec_open(struct eth_device *edev)
 	fec_rx_task_enable(fec);
 
 	if (fec->xcv_type != SEVENWIRE) {
-		ret = miiphy_wait_aneg(&fec->miiphy);
+		ret = miidev_wait_aneg(&fec->miidev);
 		if (ret)
 			return ret;
-		miiphy_print_status(&fec->miiphy);
+		miidev_print_status(&fec->miidev);
 	}
 
 	return 0;
@@ -583,13 +580,13 @@ static int fec_probe(struct device_d *dev)
 	fec->xcv_type = pdata->xcv_type;
 
 	if (fec->xcv_type != SEVENWIRE) {
-		fec->miiphy.read = fec_miiphy_read;
-		fec->miiphy.write = fec_miiphy_write;
-		fec->miiphy.address = pdata->phy_addr;
-		fec->miiphy.flags = pdata->xcv_type == MII10 ? MIIPHY_FORCE_10 : 0;
-		fec->miiphy.edev = edev;
+		fec->miidev.read = fec_miidev_read;
+		fec->miidev.write = fec_miidev_write;
+		fec->miidev.address = pdata->phy_addr;
+		fec->miidev.flags = pdata->xcv_type == MII10 ? MIIDEV_FORCE_10 : 0;
+		fec->miidev.edev = edev;
 
-		miiphy_register(&fec->miiphy);
+		mii_register(&fec->miidev);
 	}
 
 	eth_register(edev);
diff --git a/drivers/net/fec_imx.h b/drivers/net/fec_imx.h
index 353799c..e1473a4 100644
--- a/drivers/net/fec_imx.h
+++ b/drivers/net/fec_imx.h
@@ -141,7 +141,7 @@ struct fec_priv {
 	int rbd_index;				/* next receive BD to read   */
 	struct buffer_descriptor *tbd_base;	/* TBD ring                  */
 	int tbd_index;				/* next transmit BD to write */
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 };
 
 /**
diff --git a/drivers/net/fec_mpc5200.c b/drivers/net/fec_mpc5200.c
index ce9a21d..f239c68 100644
--- a/drivers/net/fec_mpc5200.c
+++ b/drivers/net/fec_mpc5200.c
@@ -11,12 +11,12 @@
 #include <malloc.h>
 #include <net.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <driver.h>
 #include <mach/sdma.h>
 #include <mach/fec.h>
 #include <mach/clocks.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include "fec_mpc5200.h"
 
 #define CONFIG_PHY_ADDR 1 /* FIXME */
@@ -31,8 +31,7 @@ typedef struct {
 /*
  * MII-interface related functions
  */
-static int fec5xxx_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t * retVal)
+static int fec5xxx_miidev_read(struct mii_device *mdev, int phyAddr, int regAddr)
 {
 	struct eth_device *edev = mdev->edev;
 	mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)edev->priv;
@@ -68,13 +67,11 @@ static int fec5xxx_miiphy_read(struct miiphy_device *mdev, uint8_t phyAddr,
 	/*
 	 * it's now safe to read the PHY's register
 	 */
-	*retVal = (uint16_t) fec->eth->mii_data;
-
-	return 0;
+	return fec->eth->mii_data;
 }
 
-static int fec5xxx_miiphy_write(struct miiphy_device *mdev, uint8_t phyAddr,
-	uint8_t regAddr, uint16_t data)
+static int fec5xxx_miidev_write(struct mii_device *mdev, int phyAddr,
+	int regAddr, int data)
 {
 	struct eth_device *edev = mdev->edev;
 	mpc5xxx_fec_priv *fec = (mpc5xxx_fec_priv *)edev->priv;
@@ -385,7 +382,7 @@ static int mpc5xxx_fec_init(struct eth_device *dev)
 	debug("mpc5xxx_fec_init... Done \n");
 
 	if (fec->xcv_type != SEVENWIRE)
-		miiphy_restart_aneg(&fec->miiphy);
+		miidev_restart_aneg(&fec->miidev);
 
 	return 0;
 }
@@ -416,8 +413,8 @@ static int mpc5xxx_fec_open(struct eth_device *edev)
 	SDMA_TASK_ENABLE(FEC_RECV_TASK_NO);
 
 	if (fec->xcv_type != SEVENWIRE) {
-		miiphy_wait_aneg(&fec->miiphy);
-		miiphy_print_status(&fec->miiphy);
+		miidev_wait_aneg(&fec->miidev);
+		miidev_print_status(&fec->miidev);
 	}
 
 	return 0;
@@ -559,7 +556,7 @@ static int mpc5xxx_fec_send(struct eth_device *dev, void *eth_data,
 	 */
 	if (fec->xcv_type != SEVENWIRE) {
 		uint16_t phyStatus;
-		fec5xxx_miiphy_read(&fec->miiphy, 0, 0x1, &phyStatus);
+		fec5xxx_miidev_read(&fec->miidev, 0, 0x1, &phyStatus);
 	}
 
 	/*
@@ -685,13 +682,13 @@ int mpc5xxx_fec_probe(struct device_d *dev)
 	loadtask(0, 2);
 
 	if (fec->xcv_type != SEVENWIRE) {
-		fec->miiphy.read = fec5xxx_miiphy_read;
-		fec->miiphy.write = fec5xxx_miiphy_write;
-		fec->miiphy.address = CONFIG_PHY_ADDR;
-		fec->miiphy.flags = pdata->xcv_type == MII10 ? MIIPHY_FORCE_10 : 0;
-		fec->miiphy.edev = edev;
+		fec->miidev.read = fec5xxx_miidev_read;
+		fec->miidev.write = fec5xxx_miidev_write;
+		fec->miidev.address = CONFIG_PHY_ADDR;
+		fec->miidev.flags = pdata->xcv_type == MII10 ? MIIDEV_FORCE_10 : 0;
+		fec->miidev.edev = edev;
 
-		miiphy_register(&fec->miiphy);
+		mii_register(&fec->miidev);
 	}
 
 	eth_register(edev);
diff --git a/drivers/net/fec_mpc5200.h b/drivers/net/fec_mpc5200.h
index 9eabc1e..f6da3e5 100644
--- a/drivers/net/fec_mpc5200.h
+++ b/drivers/net/fec_mpc5200.h
@@ -260,7 +260,7 @@ typedef struct {
 	uint16_t usedTbdIndex;		/* next transmit BD to clean */
 	uint16_t cleanTbdNum;		/* the number of available transmit BDs */
 
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 } mpc5xxx_fec_priv;
 
 /* Ethernet parameter area */
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 6864119..df3b6af 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -44,7 +44,7 @@
 #include <malloc.h>
 #include <xfuncs.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <errno.h>
 #include <asm/io.h>
 #include <mach/board.h>
@@ -98,7 +98,7 @@ struct macb_device {
 	const struct device	*dev;
 	struct eth_device	netdev;
 
-	struct miiphy_device	miiphy;
+	struct mii_device	miidev;
 
 	unsigned int		flags;
 };
@@ -214,8 +214,8 @@ static int macb_open(struct eth_device *edev)
 
 	debug("%s\n", __func__);
 
-	miiphy_wait_aneg(&macb->miiphy);
-	miiphy_print_status(&macb->miiphy);
+	miidev_wait_aneg(&macb->miidev);
+	miidev_print_status(&macb->miidev);
 
 	ncfgr = readl(macb->regs + MACB_NCFGR);
 	ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD));
@@ -293,8 +293,7 @@ static void macb_halt(struct eth_device *edev)
 	writel(MACB_BIT(CLRSTAT), macb->regs + MACB_NCR);
 }
 
-static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
-		uint8_t reg, uint16_t * value)
+static int macb_phy_read(struct mii_device *mdev, int addr, int reg)
 {
 	struct eth_device *edev = mdev->edev;
 	struct macb_device *macb = edev->priv;
@@ -303,6 +302,7 @@ static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
 	unsigned long netstat;
 	unsigned long frame;
 	int iflag;
+	int value;
 	uint64_t start;
 
 	debug("%s\n", __func__);
@@ -331,7 +331,7 @@ static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
 	} while (!(netstat & MACB_BIT(IDLE)));
 
 	frame = readl(macb->regs + MACB_MAN);
-	*value = MACB_BFEXT(DATA, frame);
+	value = MACB_BFEXT(DATA, frame);
 
 	iflag = disable_interrupts();
 	netctl = readl(macb->regs + MACB_NCR);
@@ -340,11 +340,10 @@ static int macb_phy_read(struct miiphy_device *mdev, uint8_t addr,
 	if (iflag)
 		enable_interrupts();
 
-	return 0;
+	return value;
 }
 
-static int macb_phy_write(struct miiphy_device *mdev, uint8_t addr,
-	uint8_t reg, uint16_t value)
+static int macb_phy_write(struct mii_device *mdev, int addr, int reg, int value)
 {
 	struct eth_device *edev = mdev->edev;
 	struct macb_device *macb = edev->priv;
@@ -435,12 +434,12 @@ static int macb_probe(struct device_d *dev)
 	edev->get_ethaddr = macb_get_ethaddr;
 	edev->set_ethaddr = macb_set_ethaddr;
 
-	macb->miiphy.read = macb_phy_read;
-	macb->miiphy.write = macb_phy_write;
-	macb->miiphy.address = pdata->phy_addr;
-	macb->miiphy.flags = pdata->flags & AT91SAM_ETHER_FORCE_LINK ?
-		MIIPHY_FORCE_LINK : 0;
-	macb->miiphy.edev = edev;
+	macb->miidev.read = macb_phy_read;
+	macb->miidev.write = macb_phy_write;
+	macb->miidev.address = pdata->phy_addr;
+	macb->miidev.flags = pdata->flags & AT91SAM_ETHER_FORCE_LINK ?
+		MIIDEV_FORCE_LINK : 0;
+	macb->miidev.edev = edev;
 	macb->flags = pdata->flags;
 
 	macb->rx_buffer = xmalloc(CFG_MACB_RX_BUFFER_SIZE); 
@@ -471,7 +470,7 @@ static int macb_probe(struct device_d *dev)
 
 	writel(ncfgr, macb->regs + MACB_NCFGR);
 
-	miiphy_register(&macb->miiphy);
+	mii_register(&macb->miidev);
 	eth_register(edev);
 
 	return 0;
diff --git a/drivers/net/miiphy.c b/drivers/net/miidev.c
similarity index 59%
rename from drivers/net/miiphy.c
rename to drivers/net/miidev.c
index 12aa7a6..343eb40 100644
--- a/drivers/net/miiphy.c
+++ b/drivers/net/miidev.c
@@ -1,5 +1,5 @@
 /*
- * miiphy.c - generic phy abstraction
+ * miidev.c - generic phy abstraction
  *
  * Copyright (c) 2007 Sascha Hauer <s.hauer at pengutronix.de>, Pengutronix
  *
@@ -23,12 +23,12 @@
 #include <common.h>
 #include <driver.h>
 #include <init.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <clock.h>
 #include <net.h>
 #include <malloc.h>
 
-int miiphy_restart_aneg(struct miiphy_device *mdev)
+int miidev_restart_aneg(struct mii_device *mdev)
 {
 	uint16_t status;
 	int timeout;
@@ -36,17 +36,17 @@ int miiphy_restart_aneg(struct miiphy_device *mdev)
 	/*
 	 * Reset PHY, then delay 300ns
 	 */
-	mdev->write(mdev, mdev->address, MII_BMCR, BMCR_RESET);
+	mii_write(mdev, mdev->address, MII_BMCR, BMCR_RESET);
 
-	if (mdev->flags & MIIPHY_FORCE_LINK)
+	if (mdev->flags & MIIDEV_FORCE_LINK)
 		return 0;
 
 	udelay(1000);
 
-	if (mdev->flags & MIIPHY_FORCE_10) {
+	if (mdev->flags & MIIDEV_FORCE_10) {
 		printf("Forcing 10 Mbps ethernet link... ");
-		mdev->read(mdev, mdev->address, MII_BMSR, &status);
-		mdev->write(mdev, mdev->address, MII_BMCR, BMCR_FULLDPLX | BMCR_CTST);
+		status = mii_read(mdev, mdev->address, MII_BMSR);
+		mii_write(mdev, mdev->address, MII_BMCR, BMCR_FULLDPLX | BMCR_CTST);
 
 		timeout = 20;
 		do {	/* wait for link status to go down */
@@ -55,29 +55,29 @@ int miiphy_restart_aneg(struct miiphy_device *mdev)
 				debug("hmmm, should not have waited...");
 				break;
 			}
-			mdev->read(mdev, mdev->address, MII_BMSR, &status);
+			status = mii_read(mdev, mdev->address, MII_BMSR);
 		} while (status & BMSR_LSTATUS);
 
 	} else {	/* MII100 */
 		/*
 		 * Set the auto-negotiation advertisement register bits
 		 */
-		mdev->read(mdev, mdev->address, MII_ADVERTISE, &status);
+		status = mii_read(mdev, mdev->address, MII_ADVERTISE);
 		status |= ADVERTISE_ALL;
-		mdev->write(mdev, mdev->address, MII_ADVERTISE, status);
+		mii_write(mdev, mdev->address, MII_ADVERTISE, status);
 
-		mdev->write(mdev, mdev->address, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
+		mii_write(mdev, mdev->address, MII_BMCR, BMCR_ANENABLE | BMCR_ANRESTART);
 	}
 
 	return 0;
 }
 
-int miiphy_wait_aneg(struct miiphy_device *mdev)
+int miidev_wait_aneg(struct mii_device *mdev)
 {
 	uint64_t start;
-	uint16_t status;
+	int status;
 
-	if (mdev->flags & MIIPHY_FORCE_LINK)
+	if (mdev->flags & MIIDEV_FORCE_LINK)
 		return 0;
 
 	/*
@@ -90,7 +90,8 @@ int miiphy_wait_aneg(struct miiphy_device *mdev)
 			return -1;
 		}
 
-		if (mdev->read(mdev, mdev->address, MII_BMSR, &status)) {
+		status = mii_read(mdev, mdev->address, MII_BMSR);
+		if (status < 0) {
 			printf("%s: Autonegotiation failed. status: 0x%04x\n", mdev->cdev.name, status);
 			return -1;
 		}
@@ -99,22 +100,25 @@ int miiphy_wait_aneg(struct miiphy_device *mdev)
 	return 0;
 }
 
-int miiphy_print_status(struct miiphy_device *mdev)
+int miidev_print_status(struct mii_device *mdev)
 {
-	uint16_t bmsr, bmcr, lpa;
+	int bmsr, bmcr, lpa;
 	char *duplex;
 	int speed;
 
-	if (mdev->flags & MIIPHY_FORCE_LINK) {
+	if (mdev->flags & MIIDEV_FORCE_LINK) {
 		printf("Forcing link present...\n");
 		return 0;
 	}
 
-	if (mdev->read(mdev, mdev->address, MII_BMSR, &bmsr) != 0)
+	bmsr = mii_read(mdev, mdev->address, MII_BMSR);
+	if (bmsr < 0)
 		goto err_out;
-	if (mdev->read(mdev, mdev->address, MII_BMCR, &bmcr) != 0)
+	bmcr = mii_read(mdev, mdev->address, MII_BMCR);
+	if (bmcr < 0)
 		goto err_out;
-	if (mdev->read(mdev, mdev->address, MII_LPA, &lpa) != 0)
+	lpa = mii_read(mdev, mdev->address, MII_LPA);
+	if (lpa < 0)
 		goto err_out;
 
 	printf("%s: Link is %s", mdev->cdev.name,
@@ -136,14 +140,14 @@ err_out:
 	return -1;
 }
 
-static ssize_t miiphy_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
+static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
 {
 	int i = count;
 	uint16_t *buf = _buf;
-	struct miiphy_device *mdev = cdev->priv;
+	struct mii_device *mdev = cdev->priv;
 
 	while (i > 1) {
-		mdev->read(mdev, mdev->address, offset, buf);
+		*buf = mii_read(mdev, mdev->address, offset);
 		buf++;
 		i -= 2;
 		offset++;
@@ -152,14 +156,14 @@ static ssize_t miiphy_read(struct cdev *cdev, void *_buf, size_t count, ulong of
 	return count;
 }
 
-static ssize_t miiphy_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
+static ssize_t miidev_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
 {
 	int i = count;
 	const uint16_t *buf = _buf;
-	struct miiphy_device *mdev = cdev->priv;
+	struct mii_device *mdev = cdev->priv;
 
 	while (i > 1) {
-		mdev->write(mdev, mdev->address, offset, *buf);
+		mii_write(mdev, mdev->address, offset, *buf);
 		buf++;
 		i -= 2;
 		offset++;
@@ -168,57 +172,57 @@ static ssize_t miiphy_write(struct cdev *cdev, const void *_buf, size_t count, u
 	return count;
 }
 
-static struct file_operations miiphy_ops = {
-	.read  = miiphy_read,
-	.write = miiphy_write,
+static struct file_operations miidev_ops = {
+	.read  = miidev_read,
+	.write = miidev_write,
 	.lseek = dev_lseek_default,
 };
 
-static int miiphy_probe(struct device_d *dev)
+static int miidev_probe(struct device_d *dev)
 {
-	struct miiphy_device *mdev = dev->priv;
+	struct mii_device *mdev = dev->priv;
 
 	mdev->cdev.name = asprintf("phy%d", dev->id);
 	mdev->cdev.size = 32;
-	mdev->cdev.ops = &miiphy_ops;
+	mdev->cdev.ops = &miidev_ops;
 	mdev->cdev.priv = mdev;
 	mdev->cdev.dev = dev;
 	devfs_create(&mdev->cdev);
 	return 0;
 }
 
-static void miiphy_remove(struct device_d *dev)
+static void miidev_remove(struct device_d *dev)
 {
-	struct miiphy_device *mdev = dev->priv;
+	struct mii_device *mdev = dev->priv;
 
 	free(mdev->cdev.name);
 	devfs_remove(&mdev->cdev);
 }
 
-static struct driver_d miiphy_drv = {
-        .name  = "miiphy",
-        .probe = miiphy_probe,
-	.remove = miiphy_remove,
+static struct driver_d miidev_drv = {
+        .name  = "miidev",
+        .probe = miidev_probe,
+	.remove = miidev_remove,
 };
 
-int miiphy_register(struct miiphy_device *mdev)
+int mii_register(struct mii_device *mdev)
 {
 	mdev->dev.priv = mdev;
-	strcpy(mdev->dev.name, "miiphy");
+	strcpy(mdev->dev.name, "miidev");
 
 	return register_device(&mdev->dev);
 }
 
-void miiphy_unregister(struct miiphy_device *mdev)
+void mii_unregister(struct mii_device *mdev)
 {
 	unregister_device(&mdev->dev);
 }
 
-static int miiphy_init(void)
+static int miidev_init(void)
 {
-	register_driver(&miiphy_drv);
+	register_driver(&miidev_drv);
 	return 0;
 }
 
-device_initcall(miiphy_init);
+device_initcall(miidev_init);
 
diff --git a/drivers/net/netx_eth.c b/drivers/net/netx_eth.c
index f2d7b4a..c3083f7 100644
--- a/drivers/net/netx_eth.c
+++ b/drivers/net/netx_eth.c
@@ -2,12 +2,12 @@
 #include <command.h>
 #include <net.h>
 #include <asm/io.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <mach/netx-xc.h>
 #include <mach/netx-eth.h>
 #include <mach/netx-regs.h>
 #include <xfuncs.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <init.h>
 #include <driver.h>
 
@@ -48,7 +48,7 @@
 #define CON_FIFO_PORT_LO(xcno)  (6 + ((xcno) << 3))    /* Index of the FIFO where sent Data packages are confirmed */
 
 struct netx_eth_priv {
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	int xcno;
 };
 
@@ -119,25 +119,28 @@ static int netx_eth_rx (struct eth_device *edev)
 	return 0;
 }
 
-static int netx_miiphy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-		uint8_t reg, uint16_t * val)
+static int netx_miidev_read(struct mii_device *mdev, int phy_addr, int reg)
 {
+	int value;
+
 	MIIMU_REG = MIIMU_SNRDY | MIIMU_PREAMBLE | MIIMU_PHYADDR(phy_addr) |
 	            MIIMU_REGADDR(reg) | MIIMU_PHY_NRES;
 
 	while(MIIMU_REG & MIIMU_SNRDY);
 
-	*val = MIIMU_REG >> 16;
+	value = MIIMU_REG >> 16;
 
-/*	printf("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n",__FUNCTION__,addr,reg,*value); */
+	debug("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n", __FUNCTION__,
+	      addr, reg, value)
 
-	return 0;
+	return value;
 }
 
-static int netx_miiphy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-	uint8_t reg, uint16_t val)
+static int netx_miidev_write(struct mii_device *mdev, int phy_addr,
+	int reg, int val)
 {
-/*	printf("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n",__FUNCTION__,addr,reg,value); */
+	debug("%s: addr: 0x%02x reg: 0x%02x val: 0x%04x\n",__FUNCTION__,
+	      addr, reg, val);
 
 	MIIMU_REG = MIIMU_SNRDY | MIIMU_PREAMBLE | MIIMU_PHYADDR(phy_addr) |
 	            MIIMU_REGADDR(reg) | MIIMU_PHY_NRES | MIIMU_OPMODE_WRITE |
@@ -187,7 +190,7 @@ static int netx_eth_init_dev(struct eth_device *edev)
 	for (i = 2; i <= 18; i++)
 		PFIFO_REG( PFIFO_BASE(EMPTY_PTR_FIFO(xcno)) ) = FIFO_PTR_FRAMENO(i) | FIFO_PTR_SEGMENT(xcno);
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 	return 0;
 }
 
@@ -257,13 +260,13 @@ static int netx_eth_probe(struct device_d *dev)
 	edev->get_ethaddr = netx_eth_get_ethaddr;
 	edev->set_ethaddr = netx_eth_set_ethaddr;
 
-	priv->miiphy.read = netx_miiphy_read;
-	priv->miiphy.write = netx_miiphy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
+	priv->miidev.read = netx_miidev_read;
+	priv->miidev.write = netx_miidev_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
 
 	netx_eth_init_phy();
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
         return 0;
diff --git a/drivers/net/smc91111.c b/drivers/net/smc91111.c
index 58ebaa9..605a7d8 100644
--- a/drivers/net/smc91111.c
+++ b/drivers/net/smc91111.c
@@ -67,7 +67,7 @@
 
 #include <command.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <init.h>
 #include <xfuncs.h>
@@ -451,7 +451,7 @@ struct accessors {
 };
 
 struct smc91c111_priv {
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	struct accessors a;
 	unsigned long base;
 };
@@ -621,8 +621,8 @@ static void smc_wait_mmu_release_complete(struct smc91c111_priv *priv)
 	}
 }
 
-static int smc91c111_phy_write(struct miiphy_device *mdev, uint8_t phyaddr,
-	uint8_t phyreg, uint16_t phydata)
+static int smc91c111_phy_write(struct mii_device *mdev, int phyaddr,
+	int phyreg, int phydata)
 {
 	struct eth_device *edev = mdev->edev;
 	struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
@@ -723,8 +723,7 @@ static int smc91c111_phy_write(struct miiphy_device *mdev, uint8_t phyaddr,
 	return 0;
 }
 
-static int smc91c111_phy_read(struct miiphy_device *mdev, uint8_t phyaddr,
-		uint8_t phyreg, uint16_t * val)
+static int smc91c111_phy_read(struct mii_device *mdev, int phyaddr, int phyreg)
 {
 	struct eth_device *edev = mdev->edev;
 	struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
@@ -827,8 +826,7 @@ static int smc91c111_phy_read(struct miiphy_device *mdev, uint8_t phyaddr,
 			phydata |= 0x0001;
 	}
 
-	*val = phydata;
-	return 0;
+	return phydata;
 }
 
 static void smc91c111_reset(struct eth_device *edev)
@@ -896,8 +894,8 @@ static int smc91c111_eth_open(struct eth_device *edev)
 	struct smc91c111_priv *priv = (struct smc91c111_priv *)edev->priv;
 	smc91c111_enable(edev);
 
-	miiphy_wait_aneg(&priv->miiphy);
-	miiphy_print_status(&priv->miiphy);
+	miidev_wait_aneg(&priv->miidev);
+	miidev_print_status(&priv->miidev);
 
 	return 0;
 }
@@ -1287,7 +1285,7 @@ static int smc91c111_init_dev(struct eth_device *edev)
 	SMC_SELECT_BANK(priv, 0);
 	SMC_outw(priv, RPC_DEFAULT, RPC_REG);
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 
 	return 0;
 }
@@ -1314,16 +1312,16 @@ static int smc91c111_probe(struct device_d *dev)
 	edev->get_ethaddr = smc91c111_get_ethaddr;
 	edev->set_ethaddr = smc91c111_set_ethaddr;
 
-	priv->miiphy.read = smc91c111_phy_read;
-	priv->miiphy.write = smc91c111_phy_write;
-	priv->miiphy.address = 0;
-	priv->miiphy.flags = 0;
-	priv->miiphy.edev = edev;
+	priv->miidev.read = smc91c111_phy_read;
+	priv->miidev.write = smc91c111_phy_write;
+	priv->miidev.address = 0;
+	priv->miidev.flags = 0;
+	priv->miidev.edev = edev;
 	priv->base = dev->map_base;
 
 	smc91c111_reset(edev);
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
 	return 0;
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c
index ca320d5..b559590 100644
--- a/drivers/net/smc911x.c
+++ b/drivers/net/smc911x.c
@@ -30,7 +30,7 @@
 
 #include <command.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <malloc.h>
 #include <init.h>
 #include <xfuncs.h>
@@ -367,7 +367,7 @@
 #define CHIP_9218	0x118a
 
 struct smc911x_priv {
-	struct miiphy_device miiphy;
+	struct mii_device miidev;
 	unsigned long base;
 };
 
@@ -465,8 +465,7 @@ static int smc911x_set_ethaddr(struct eth_device *edev, unsigned char *m)
 	return 0;
 }
 
-static int smc911x_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
-		uint8_t reg, uint16_t * val)
+static int smc911x_phy_read(struct mii_device *mdev, int phy_addr, int reg)
 {
 	struct eth_device *edev = mdev->edev;
 
@@ -477,13 +476,11 @@ static int smc911x_phy_read(struct miiphy_device *mdev, uint8_t phy_addr,
 
 	while (smc911x_get_mac_csr(edev, MII_ACC) & MII_ACC_MII_BUSY);
 
-	*val = smc911x_get_mac_csr(edev, MII_DATA);
-
-	return 0;
+	return smc911x_get_mac_csr(edev, MII_DATA);
 }
 
-static int smc911x_phy_write(struct miiphy_device *mdev, uint8_t phy_addr,
-	uint8_t reg, uint16_t val)
+static int smc911x_phy_write(struct mii_device *mdev, int phy_addr,
+	int reg, int val)
 {
 	struct eth_device *edev = mdev->edev;
 
@@ -579,8 +576,8 @@ static int smc911x_eth_open(struct eth_device *edev)
 {
 	struct smc911x_priv *priv = (struct smc911x_priv *)edev->priv;
 
-	miiphy_wait_aneg(&priv->miiphy);
-	miiphy_print_status(&priv->miiphy);
+	miidev_wait_aneg(&priv->miidev);
+	miidev_print_status(&priv->miidev);
 
 	/* Turn on Tx + Rx */
 	smc911x_enable(edev);
@@ -681,7 +678,7 @@ static int smc911x_init_dev(struct eth_device *edev)
 	smc911x_set_mac_csr(edev, MAC_CR, MAC_CR_TXEN | MAC_CR_RXEN |
 			MAC_CR_HBDIS);
 
-	miiphy_restart_aneg(&priv->miiphy);
+	miidev_restart_aneg(&priv->miidev);
 
 	return 0;
 }
@@ -729,17 +726,17 @@ static int smc911x_probe(struct device_d *dev)
 	edev->get_ethaddr = smc911x_get_ethaddr;
 	edev->set_ethaddr = smc911x_set_ethaddr;
 
-	priv->miiphy.read = smc911x_phy_read;
-	priv->miiphy.write = smc911x_phy_write;
-	priv->miiphy.address = 1;
-	priv->miiphy.flags = 0;
-	priv->miiphy.edev = edev;
+	priv->miidev.read = smc911x_phy_read;
+	priv->miidev.write = smc911x_phy_write;
+	priv->miidev.address = 1;
+	priv->miidev.flags = 0;
+	priv->miidev.edev = edev;
 	priv->base = dev->map_base;
 
 	smc911x_reset(edev);
 	smc911x_phy_reset(edev);
 
-	miiphy_register(&priv->miiphy);
+	mii_register(&priv->miidev);
 	eth_register(edev);
 
         return 0;
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index 972fa40..6482626 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -5,7 +5,7 @@ menuconfig NET_USB
 if NET_USB
 
 config NET_USB_ASIX
-	select MIIPHY
+	select MIIDEV
 	bool "Asix compatible"
 
 endif
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c
index ca71b34..d148925 100644
--- a/drivers/net/usb/asix.c
+++ b/drivers/net/usb/asix.c
@@ -1,7 +1,7 @@
 #include <common.h>
 #include <init.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <usb/usb.h>
 #include <usb/usbnet.h>
 #include <errno.h>
@@ -231,8 +231,7 @@ static inline int asix_set_hw_mii(struct usbnet *dev)
 	return ret;
 }
 
-static int asix_mdio_read(struct miiphy_device *mdev, uint8_t phy_id,
-		uint8_t loc, uint16_t *val)
+static int asix_mdio_read(struct mii_device *mdev, int phy_id, int loc)
 {
 	struct eth_device *eth = mdev->edev;
 	struct usbnet *dev = eth->priv;
@@ -246,13 +245,10 @@ static int asix_mdio_read(struct miiphy_device *mdev, uint8_t phy_id,
 	dev_dbg(&dev->edev.dev, "asix_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x",
 			phy_id, loc, le16_to_cpu(res));
 
-	*val = le16_to_cpu(res);
-
-	return 0;
+	return le16_to_cpu(res);
 }
 
-static int asix_mdio_write(struct miiphy_device *mdev, uint8_t phy_id,
-		uint8_t loc, uint16_t val)
+static int asix_mdio_write(struct mii_device *mdev, int phy_id, int loc, int val)
 {
 	struct eth_device *eth = mdev->edev;
 	struct usbnet *dev = eth->priv;
@@ -473,13 +469,13 @@ static int asix_tx_fixup(struct usbnet *dev,
 
 static int asix_init_mii(struct usbnet *dev)
 {
-	dev->miiphy.read = asix_mdio_read;
-	dev->miiphy.write = asix_mdio_write;
-	dev->miiphy.address = asix_get_phy_addr(dev);
-	dev->miiphy.flags = 0;
-	dev->miiphy.edev = &dev->edev;
+	dev->miidev.read = asix_mdio_read;
+	dev->miidev.write = asix_mdio_write;
+	dev->miidev.address = asix_get_phy_addr(dev);
+	dev->miidev.flags = 0;
+	dev->miidev.edev = &dev->edev;
 
-	return miiphy_register(&dev->miiphy);
+	return mii_register(&dev->miidev);
 }
 
 static int ax88172_link_reset(struct usbnet *dev)
@@ -634,7 +630,7 @@ out:
 
 static void asix_unbind(struct usbnet *dev)
 {
-	miiphy_unregister(&dev->miiphy);
+	mii_unregister(&dev->miidev);
 }
 
 static struct driver_info ax8817x_info = {
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
index cc170f6..983d464 100644
--- a/drivers/net/usb/usbnet.c
+++ b/drivers/net/usb/usbnet.c
@@ -160,7 +160,7 @@ static int usbnet_init(struct eth_device *edev)
                 return ret;
         }
 
-	miiphy_restart_aneg(&dev->miiphy);
+	miidev_restart_aneg(&dev->miidev);
 
 	return 0;
 }
@@ -171,10 +171,10 @@ static int usbnet_open(struct eth_device *edev)
 
 	dev_dbg(&edev->dev, "%s\n",__func__);
 
-	if (miiphy_wait_aneg(&dev->miiphy))
+	if (miidev_wait_aneg(&dev->miidev))
 		return -1;
 
-	miiphy_print_status(&dev->miiphy);
+	miidev_print_status(&dev->miidev);
 
 	return 0;
 }
diff --git a/include/miiphy.h b/include/linux/mii.h
similarity index 74%
rename from include/miiphy.h
rename to include/linux/mii.h
index 67f1b1c..7345172 100644
--- a/include/miiphy.h
+++ b/include/linux/mii.h
@@ -5,13 +5,10 @@
  * Copyright (C) 1996, 1999, 2001 David S. Miller (davem at redhat.com)
  */
 
-#ifndef _MII_PHY_H_
-#define _MII_PHY_H_
+#ifndef __LINUX_MII_H__
+#define __LINUX_MII_H__
 
-#include <driver.h>
-
-#define MIIPHY_FORCE_10		(1 << 0)
-#define MIIPHY_FORCE_LINK	(1 << 1)
+/* Generic MII registers. */
 
 #define MII_BMCR            0x00        /* Basic mode control register */
 #define MII_BMSR            0x01        /* Basic mode status register  */
@@ -22,7 +19,7 @@
 #define MII_EXPANSION       0x06        /* Expansion register          */
 #define MII_CTRL1000        0x09        /* 1000BASE-T control          */
 #define MII_STAT1000        0x0a        /* 1000BASE-T status           */
-#define MII_ESTATUS	    0x0f	/* Extended Status             */
+#define MII_ESTATUS	    0x0f	/* Extended Status */
 #define MII_DCOUNTER        0x12        /* Disconnect counter          */
 #define MII_FCSCOUNTER      0x13        /* False carrier counter       */
 #define MII_NWAYTEST        0x14        /* N-way auto-neg test reg     */
@@ -36,6 +33,8 @@
 #define MII_NCONFIG         0x1c        /* Network interface config    */
 
 /* Basic mode control register. */
+#define BMCR_SPEED_MASK		0x2040	/* 10/100/1000		       */
+#define BMCR_SPEED10		0x0000	/* Select 10Mbps	       */
 #define BMCR_RESV               0x003f  /* Unused...                   */
 #define BMCR_SPEED1000		0x0040  /* MSB of Speed (1000)         */
 #define BMCR_CTST               0x0080  /* Collision test              */
@@ -56,9 +55,9 @@
 #define BMSR_RFAULT             0x0010  /* Remote fault detected       */
 #define BMSR_ANEGCOMPLETE       0x0020  /* Auto-negotiation complete   */
 #define BMSR_RESV               0x00c0  /* Unused...                   */
-#define BMSR_ESTATEN		0x0100	/* Extended Status in R15      */
-#define BMSR_100HALF2           0x0200  /* Can do 100BASE-T2 HDX       */
-#define BMSR_100FULL2           0x0400  /* Can do 100BASE-T2 FDX       */
+#define BMSR_ESTATEN		0x0100	/* Extended Status in R15 */
+#define BMSR_100HALF2           0x0200  /* Can do 100BASE-T2 HDX */
+#define BMSR_100FULL2           0x0400  /* Can do 100BASE-T2 FDX */
 #define BMSR_10HALF             0x0800  /* Can do 10mbps, half-duplex  */
 #define BMSR_10FULL             0x1000  /* Can do 10mbps, full-duplex  */
 #define BMSR_100HALF            0x2000  /* Can do 100mbps, half-duplex */
@@ -136,23 +135,98 @@
 #define LPA_1000FULL            0x0800  /* Link partner 1000BASE-T full duplex */
 #define LPA_1000HALF            0x0400  /* Link partner 1000BASE-T half duplex */
 
-struct miiphy_device {
-	struct device_d dev;
-
-	int address;	/* The address the phy has on the bus */
-	int (*read)(struct miiphy_device *mdev, uint8_t phy_addr, uint8_t reg_addr, uint16_t *value);
-	int (*write)(struct miiphy_device *mdev, uint8_t phy_addr, uint8_t reg_addr, uint16_t data);
-
-	int flags;
-
-	struct eth_device *edev;
-	struct cdev cdev;
-};
+/* Flow control flags */
+#define FLOW_CTRL_TX		0x01
+#define FLOW_CTRL_RX		0x02
 
-int miiphy_register(struct miiphy_device *mdev);
-void miiphy_unregister(struct miiphy_device *mdev);
-int miiphy_restart_aneg(struct miiphy_device *mdev);
-int miiphy_wait_aneg(struct miiphy_device *mdev);
-int miiphy_print_status(struct miiphy_device *mdev);
-
-#endif
+/**
+ * mii_nway_result
+ * @negotiated: value of MII ANAR and'd with ANLPAR
+ *
+ * Given a set of MII abilities, check each bit and returns the
+ * currently supported media, in the priority order defined by
+ * IEEE 802.3u.  We use LPA_xxx constants but note this is not the
+ * value of LPA solely, as described above.
+ *
+ * The one exception to IEEE 802.3u is that 100baseT4 is placed
+ * between 100T-full and 100T-half.  If your phy does not support
+ * 100T4 this is fine.  If your phy places 100T4 elsewhere in the
+ * priority order, you will need to roll your own function.
+ */
+static inline unsigned int mii_nway_result (unsigned int negotiated)
+{
+	unsigned int ret;
+
+	if (negotiated & LPA_100FULL)
+		ret = LPA_100FULL;
+	else if (negotiated & LPA_100BASE4)
+		ret = LPA_100BASE4;
+	else if (negotiated & LPA_100HALF)
+		ret = LPA_100HALF;
+	else if (negotiated & LPA_10FULL)
+		ret = LPA_10FULL;
+	else
+		ret = LPA_10HALF;
+
+	return ret;
+}
+
+/**
+ * mii_duplex
+ * @duplex_lock: Non-zero if duplex is locked at full
+ * @negotiated: value of MII ANAR and'd with ANLPAR
+ *
+ * A small helper function for a common case.  Returns one
+ * if the media is operating or locked at full duplex, and
+ * returns zero otherwise.
+ */
+static inline unsigned int mii_duplex (unsigned int duplex_lock,
+				       unsigned int negotiated)
+{
+	if (duplex_lock)
+		return 1;
+	if (mii_nway_result(negotiated) & LPA_DUPLEX)
+		return 1;
+	return 0;
+}
+
+/**
+ * mii_advertise_flowctrl - get flow control advertisement flags
+ * @cap: Flow control capabilities (FLOW_CTRL_RX, FLOW_CTRL_TX or both)
+ */
+static inline u16 mii_advertise_flowctrl(int cap)
+{
+	u16 adv = 0;
+
+	if (cap & FLOW_CTRL_RX)
+		adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
+	if (cap & FLOW_CTRL_TX)
+		adv ^= ADVERTISE_PAUSE_ASYM;
+
+	return adv;
+}
+
+/**
+ * mii_resolve_flowctrl_fdx
+ * @lcladv: value of MII ADVERTISE register
+ * @rmtadv: value of MII LPA register
+ *
+ * Resolve full duplex flow control as per IEEE 802.3-2005 table 28B-3
+ */
+static inline u8 mii_resolve_flowctrl_fdx(u16 lcladv, u16 rmtadv)
+{
+	u8 cap = 0;
+
+	if (lcladv & rmtadv & ADVERTISE_PAUSE_CAP) {
+		cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
+	} else if (lcladv & rmtadv & ADVERTISE_PAUSE_ASYM) {
+		if (lcladv & ADVERTISE_PAUSE_CAP)
+			cap = FLOW_CTRL_RX;
+		else if (rmtadv & ADVERTISE_PAUSE_CAP)
+			cap = FLOW_CTRL_TX;
+	}
+
+	return cap;
+}
+
+#endif /* __LINUX_MII_H__ */
diff --git a/include/miidev.h b/include/miidev.h
new file mode 100644
index 0000000..6f653d9
--- /dev/null
+++ b/include/miidev.h
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2001
+ * Gerald Van Baren, Custom IDEAS, vanbaren at cideas.com.
+ *
+ * (C) Copyright 2009 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.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
+ */
+#ifndef __MIIDEV_H__
+#define __MIIDEV_H__
+
+#include <driver.h>
+#include <linux/mii.h>
+
+#define MIIDEV_FORCE_10		(1 << 0)
+#define MIIDEV_FORCE_LINK	(1 << 1)
+
+struct mii_device {
+	struct device_d dev;
+
+	int address;	/* The address the phy has on the bus */
+	int	(*read) (struct mii_device *dev, int addr, int reg);
+	int	(*write) (struct mii_device *dev, int addr, int reg, int value);
+
+	int flags;
+
+	struct eth_device *edev;
+	struct cdev cdev;
+};
+
+int mii_register(struct mii_device *dev);
+void mii_unregister(struct mii_device *mdev);
+int miidev_restart_aneg(struct mii_device *mdev);
+int miidev_wait_aneg(struct mii_device *mdev);
+int miidev_print_status(struct mii_device *mdev);
+
+static int inline mii_write(struct mii_device *dev, int addr, int reg, int value)
+{
+	return dev->write(dev, addr, reg, value);
+}
+
+static int inline mii_read(struct mii_device *dev, int addr, int reg)
+{
+	return dev->read(dev, addr, reg);
+}
+#endif /* __MIIDEV_H__ */
diff --git a/include/usb/usbnet.h b/include/usb/usbnet.h
index e3ea373..1609b2e 100644
--- a/include/usb/usbnet.h
+++ b/include/usb/usbnet.h
@@ -23,7 +23,7 @@
 #define	__LINUX_USB_USBNET_H
 
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 
 /* interface from usbnet core to each USB networking link we handle */
 struct usbnet {
@@ -40,7 +40,7 @@ struct usbnet {
 
 	/* protocol/interface state */
 	struct eth_device	edev;
-	struct miiphy_device	miiphy;
+	struct mii_device	miidev;
 
 	int			msg_enable;
 	unsigned long		data [5];
diff --git a/net/eth.c b/net/eth.c
index 4d58191..cfb0fef 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -26,7 +26,7 @@
 #include <driver.h>
 #include <init.h>
 #include <net.h>
-#include <miiphy.h>
+#include <miidev.h>
 #include <errno.h>
 #include <malloc.h>
 
-- 
1.7.1



From plagnioj at jcrosoft.com  Fri Aug 27 01:15:17 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 07:15:17 +0200
Subject: [PATCH 3/4] introduce phys_addr_t and resource_size_t
In-Reply-To: <1282886118-15217-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282886118-15217-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1282886118-15217-3-git-send-email-plagnioj@jcrosoft.com>

this will allow to support 64bit platform

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/linux/types.h |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/include/linux/types.h b/include/linux/types.h
index 2241364..96e5708 100644
--- a/include/linux/types.h
+++ b/include/linux/types.h
@@ -139,6 +139,14 @@ typedef __u64 __bitwise __be64;
 typedef __u16 __bitwise __sum16;
 typedef __u32 __bitwise __wsum;
 
+#ifdef CONFIG_PHYS_ADDR_T_64BIT
+typedef u64 phys_addr_t;
+#else
+typedef u32 phys_addr_t;
+#endif
+
+typedef phys_addr_t resource_size_t;
+
 struct ustat {
 	__kernel_daddr_t	f_tfree;
 	__kernel_ino_t		f_tinode;
-- 
1.7.1



From plagnioj at jcrosoft.com  Fri Aug 27 01:15:16 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 07:15:16 +0200
Subject: [PATCH 2/4] introduce pure_initcall
In-Reply-To: <1282886118-15217-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282886118-15217-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1282886118-15217-2-git-send-email-plagnioj@jcrosoft.com>

A "pure" initcall has no dependencies on anything else, and purely
initializes variables that couldn't be statically initialized.

This only exists for built-in code, not for modules.

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/init.h |   15 +++++++++++----
 1 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/include/init.h b/include/init.h
index accc4d0..bc70874 100644
--- a/include/init.h
+++ b/include/init.h
@@ -14,10 +14,17 @@ typedef int (*initcall_t)(void);
 	__attribute__((__section__(".initcall." level))) = fn
 
 
-#define core_initcall(fn)		__define_initcall("0",fn,0)
-#define postcore_initcall(fn)		__define_initcall("1",fn,1)
-#define console_initcall(fn)		__define_initcall("2",fn,2)
-#define postconsole_initcall(fn)	__define_initcall("3",fn,3)
+/*
+ * A "pure" initcall has no dependencies on anything else, and purely
+ * initializes variables that couldn't be statically initialized.
+ *
+ * This only exists for built-in code, not for modules.
+ */
+#define pure_initcall(fn)		__define_initcall("0",fn,0)
+
+#define core_initcall(fn)		__define_initcall("1",fn,1)
+#define postcore_initcall(fn)		__define_initcall("2",fn,2)
+#define console_initcall(fn)		__define_initcall("3",fn,3)
 #define coredevice_initcall(fn)		__define_initcall("4",fn,4)
 #define fs_initcall(fn)			__define_initcall("5",fn,5)
 #define device_initcall(fn)		__define_initcall("6",fn,6)
-- 
1.7.1



From plagnioj at jcrosoft.com  Fri Aug 27 01:15:15 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 07:15:15 +0200
Subject: [PATCH 1/4] xfuncs.h: include linux/types.h to avoid non decleration
	of size_t
Message-ID: <1282886118-15217-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/xfuncs.h |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/include/xfuncs.h b/include/xfuncs.h
index 4ce4e92..222ea41 100644
--- a/include/xfuncs.h
+++ b/include/xfuncs.h
@@ -1,6 +1,8 @@
 #ifndef __XFUNCS_H
 #define __XFUNCS_H
 
+#include <linux/types.h>
+
 void *xmalloc(size_t size);
 void *xrealloc(void *ptr, size_t size);
 void *xzalloc(size_t size);
-- 
1.7.1



From plagnioj at jcrosoft.com  Fri Aug 27 01:15:18 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 07:15:18 +0200
Subject: [PATCH 4/4] use resource_size_t for device ressoruces
In-Reply-To: <1282886118-15217-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282886118-15217-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1282886118-15217-4-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/driver.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/driver.h b/include/driver.h
index ae3e777..eddbbf3 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -70,11 +70,11 @@ struct device_d {
 	int id;
 
 	/*! FIXME */
-	unsigned long size;
+	resource_size_t size;
 
 	/*! For devices which are directly mapped into memory, i.e. NOR
 	 * Flash or SDRAM. */
-	unsigned long map_base;
+	resource_size_t map_base;
 
 	void *platform_data; /*! board specific information about this device */
 
-- 
1.7.1



From u.kleine-koenig at pengutronix.de  Fri Aug 27 01:41:23 2010
From: u.kleine-koenig at pengutronix.de (Uwe =?iso-8859-1?Q?Kleine-K=F6nig?=)
Date: Fri, 27 Aug 2010 07:41:23 +0200
Subject: [PATCH 4/4] use resource_size_t for device ressoruces
In-Reply-To: <1282886118-15217-4-git-send-email-plagnioj@jcrosoft.com>
References: <1282886118-15217-1-git-send-email-plagnioj@jcrosoft.com>
	<1282886118-15217-4-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100827054123.GC17521@pengutronix.de>

Hello Jean-Christophe,

$SUBJECT ~= s/ressoruces/resources/

On Fri, Aug 27, 2010 at 07:15:18AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
>  include/driver.h |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/include/driver.h b/include/driver.h
> index ae3e777..eddbbf3 100644
> --- a/include/driver.h
> +++ b/include/driver.h
> @@ -70,11 +70,11 @@ struct device_d {
>  	int id;
>  
>  	/*! FIXME */
What is this fixme about?  Can it be removed?

> -	unsigned long size;
> +	resource_size_t size;
>  
>  	/*! For devices which are directly mapped into memory, i.e. NOR
>  	 * Flash or SDRAM. */
> -	unsigned long map_base;
> +	resource_size_t map_base;
>  
>  	void *platform_data; /*! board specific information about this device */
>  
Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |


From plagnioj at jcrosoft.com  Fri Aug 27 01:49:16 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 07:49:16 +0200
Subject: [PATCH 1/2] udpate fixdep.c to linux kernel v2.6.36-rc1-168-ge36c886
Message-ID: <1282888157-18427-1-git-send-email-plagnioj@jcrosoft.com>

as autoconf.h is store in include/generated and not include/linux anymore

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 scripts/basic/fixdep.c |   55 ++++++++++++++++++++++++++---------------------
 1 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c
index 668a11a..ea26b23 100644
--- a/scripts/basic/fixdep.c
+++ b/scripts/basic/fixdep.c
@@ -16,21 +16,22 @@
  * tells make when to remake a file.
  *
  * To use this list as-is however has the drawback that virtually
- * every file in the kernel includes <linux/config.h> which then again
- * includes <linux/autoconf.h>
+ * every file in the kernel includes autoconf.h.
  *
- * If the user re-runs make *config, linux/autoconf.h will be
+ * If the user re-runs make *config, autoconf.h will be
  * regenerated.  make notices that and will rebuild every file which
  * includes autoconf.h, i.e. basically all files. This is extremely
  * annoying if the user just changed CONFIG_HIS_DRIVER from n to m.
  *
  * So we play the same trick that "mkdep" played before. We replace
- * the dependency on linux/autoconf.h by a dependency on every config
+ * the dependency on autoconf.h by a dependency on every config
  * option which is mentioned in any of the listed prequisites.
  *
- * To be exact, split-include populates a tree in include/config/,
- * e.g. include/config/his/driver.h, which contains the #define/#undef
- * for the CONFIG_HIS_DRIVER option.
+ * kconfig populates a tree in include/config/ with an empty file
+ * for each config symbol and when the configuration is updated
+ * the files representing changed config options are touched
+ * which then let make pick up the changes and the files that use
+ * the config symbols are rebuilt.
  *
  * So if the user changes his CONFIG_HIS_DRIVER option, only the objects
  * which depend on "include/linux/config/his/driver.h" will be rebuilt,
@@ -72,7 +73,7 @@
  *   cmd_<target> = <cmdline>
  *
  * and then basically copies the .<target>.d file to stdout, in the
- * process filtering out the dependency on linux/autoconf.h and adding
+ * process filtering out the dependency on autoconf.h and adding
  * dependencies on include/config/my/option.h for every
  * CONFIG_MY_OPTION encountered in any of the prequisites.
  *
@@ -123,8 +124,7 @@ char *target;
 char *depfile;
 char *cmdline;
 
-void usage(void)
-
+static void usage(void)
 {
 	fprintf(stderr, "Usage: fixdep <depfile> <target> <cmdline>\n");
 	exit(1);
@@ -133,7 +133,7 @@ void usage(void)
 /*
  * Print out the commandline prefixed with cmd_<target filename> :=
  */
-void print_cmdline(void)
+static void print_cmdline(void)
 {
 	printf("cmd_%s := %s\n\n", target, cmdline);
 }
@@ -146,7 +146,7 @@ int    len_config  = 0;
  * Grow the configuration string to a desired length.
  * Usually the first growth is plenty.
  */
-void grow_config(int len)
+static void grow_config(int len)
 {
 	while (len_config + len > size_config) {
 		if (size_config == 0)
@@ -162,7 +162,7 @@ void grow_config(int len)
 /*
  * Lookup a value in the configuration string.
  */
-int is_defined_config(const char * name, int len)
+static int is_defined_config(const char * name, int len)
 {
 	const char * pconfig;
 	const char * plast = str_config + len_config - len;
@@ -178,7 +178,7 @@ int is_defined_config(const char * name, int len)
 /*
  * Add a new value to the configuration string.
  */
-void define_config(const char * name, int len)
+static void define_config(const char * name, int len)
 {
 	grow_config(len + 1);
 
@@ -190,7 +190,7 @@ void define_config(const char * name, int len)
 /*
  * Clear the set of configuration strings.
  */
-void clear_config(void)
+static void clear_config(void)
 {
 	len_config = 0;
 	define_config("", 0);
@@ -199,7 +199,7 @@ void clear_config(void)
 /*
  * Record the use of a CONFIG_* word.
  */
-void use_config(char *m, int slen)
+static void use_config(char *m, int slen)
 {
 	char s[PATH_MAX];
 	char *p;
@@ -220,7 +220,7 @@ void use_config(char *m, int slen)
 	printf("    $(wildcard include/config/%s.h) \\\n", s);
 }
 
-void parse_config_file(char *map, size_t len)
+static void parse_config_file(char *map, size_t len)
 {
 	int *end = (int *) (map + len);
 	/* start at +1, so that p can never be < map */
@@ -245,12 +245,16 @@ void parse_config_file(char *map, size_t len)
 		continue;
 
 	found:
+		if (!memcmp(q - 7, "_MODULE", 7))
+			q -= 7;
+		if( (q-p-7) < 0 )
+			continue;
 		use_config(p+7, q-p-7);
 	}
 }
 
 /* test is s ends in sub */
-int strrcmp(char *s, char *sub)
+static int strrcmp(char *s, char *sub)
 {
 	int slen = strlen(s);
 	int sublen = strlen(sub);
@@ -261,7 +265,7 @@ int strrcmp(char *s, char *sub)
 	return memcmp(s + slen - sublen, sub, sublen);
 }
 
-void do_config_file(char *filename)
+static void do_config_file(char *filename)
 {
 	struct stat st;
 	int fd;
@@ -292,7 +296,7 @@ void do_config_file(char *filename)
 	close(fd);
 }
 
-void parse_dep_file(void *map, size_t len)
+static void parse_dep_file(void *map, size_t len)
 {
 	char *m = map;
 	char *end = m + len;
@@ -320,7 +324,7 @@ void parse_dep_file(void *map, size_t len)
 			p++;
 		}
 		memcpy(s, m, p-m); s[p-m] = 0;
-		if (strrcmp(s, "include/linux/autoconf.h") &&
+		if (strrcmp(s, "include/generated/autoconf.h") &&
 		    strrcmp(s, "arch/um/include/uml-config.h") &&
 		    strrcmp(s, ".ver")) {
 			printf("  %s \\\n", s);
@@ -332,7 +336,7 @@ void parse_dep_file(void *map, size_t len)
 	printf("$(deps_%s):\n", target);
 }
 
-void print_deps(void)
+static void print_deps(void)
 {
 	struct stat st;
 	int fd;
@@ -364,13 +368,14 @@ void print_deps(void)
 	close(fd);
 }
 
-void traps(void)
+static void traps(void)
 {
 	static char test[] __attribute__((aligned(sizeof(int)))) = "CONF";
+	int *p = (int *)test;
 
-	if (*(int *)test != INT_CONF) {
+	if (*p != INT_CONF) {
 		fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianess? %#x\n",
-			*(int *)test);
+			*p);
 		exit(2);
 	}
 }
-- 
1.7.1



From plagnioj at jcrosoft.com  Fri Aug 27 01:49:17 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 07:49:17 +0200
Subject: [PATCH 2/2] Makefile: fix autoconf.h location
In-Reply-To: <1282888157-18427-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282888157-18427-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1282888157-18427-2-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 Makefile |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index b4c7ae5..90252cc 100644
--- a/Makefile
+++ b/Makefile
@@ -290,7 +290,7 @@ LINUXINCLUDE    := -Iinclude \
                    $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
 		   -I$(srctree)/arch/$(ARCH)/include \
 		   -I$(objtree)/arch/$(ARCH)/include \
-		   -include include/linux/autoconf.h
+                   -include include/generated/autoconf.h
 
 CPPFLAGS        := -D__KERNEL__ -D__BAREBOX__ $(LINUXINCLUDE) -fno-builtin -ffreestanding
 
@@ -979,7 +979,7 @@ CLEAN_FILES +=	barebox System.map include/barebox_default_env.h \
 # Directories & files removed with 'make mrproper'
 MRPROPER_DIRS  += include/config include2 usr/include
 MRPROPER_FILES += .config .config.old include/asm .version .old_version \
-                  include/linux/autoconf.h include/linux/version.h      \
+                  include/generated/autoconf.h include/linux/version.h      \
                   include/linux/utsrelease.h include/config.h           \
 		  Module.symvers tags TAGS cscope*
 
-- 
1.7.1



From plagnioj at jcrosoft.com  Fri Aug 27 01:53:27 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 07:53:27 +0200
Subject: [PATCH 4/4] use resource_size_t for device ressoruces
In-Reply-To: <20100827054123.GC17521@pengutronix.de>
References: <1282886118-15217-1-git-send-email-plagnioj@jcrosoft.com>
	<1282886118-15217-4-git-send-email-plagnioj@jcrosoft.com>
	<20100827054123.GC17521@pengutronix.de>
Message-ID: <20100827055327.GB16555@game.jcrosoft.org>

On 07:41 Fri 27 Aug     , Uwe Kleine-K?nig wrote:
> Hello Jean-Christophe,
> 
> $SUBJECT ~= s/ressoruces/resources/
> 
> On Fri, Aug 27, 2010 at 07:15:18AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> > ---
> >  include/driver.h |    4 ++--
> >  1 files changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/include/driver.h b/include/driver.h
> > index ae3e777..eddbbf3 100644
> > --- a/include/driver.h
> > +++ b/include/driver.h
> > @@ -70,11 +70,11 @@ struct device_d {
> >  	int id;
> >  
> >  	/*! FIXME */
> What is this fixme about?  Can it be removed?
yeah we can now

Best Regards,
J.


From plagnioj at jcrosoft.com  Fri Aug 27 01:56:02 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 07:56:02 +0200
Subject: [PATCH 4/4 v2] use resource_size_t for device resources
In-Reply-To: <1282886118-15217-4-git-send-email-plagnioj@jcrosoft.com>
References: <1282886118-15217-4-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1282888562-19163-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
v2:
	remove comment as we fix it
	fix commit subject

Best Regards,
J.
 include/driver.h |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/include/driver.h b/include/driver.h
index ae3e777..ee0749d 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -69,12 +69,11 @@ struct device_d {
 	 * something like eth0 or nor0. */
 	int id;
 
-	/*! FIXME */
-	unsigned long size;
+	resource_size_t size;
 
 	/*! For devices which are directly mapped into memory, i.e. NOR
 	 * Flash or SDRAM. */
-	unsigned long map_base;
+	resource_size_t map_base;
 
 	void *platform_data; /*! board specific information about this device */
 
-- 
1.7.1



From baruch at tkos.co.il  Fri Aug 27 01:56:34 2010
From: baruch at tkos.co.il (Baruch Siach)
Date: Fri, 27 Aug 2010 08:56:34 +0300
Subject: [PATCH 1/2] udpate fixdep.c to linux kernel
	v2.6.36-rc1-168-ge36c886
In-Reply-To: <1282888157-18427-1-git-send-email-plagnioj@jcrosoft.com>
References: <1282888157-18427-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <20100827055634.GC2324@tarshish>

Hi Jean-Christophe,

On Fri, Aug 27, 2010 at 07:49:16AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> as autoconf.h is store in include/generated and not include/linux anymore

This log entry seems to belong to the next patch in this series.

baruch

> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
>  scripts/basic/fixdep.c |   55 ++++++++++++++++++++++++++---------------------
>  1 files changed, 30 insertions(+), 25 deletions(-)

-- 
                                                     ~. .~   Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
   - baruch at tkos.co.il - tel: +972.2.679.5364, http://www.tkos.co.il -


From plagnioj at jcrosoft.com  Fri Aug 27 02:05:45 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 08:05:45 +0200
Subject: [PATCH 1/2] udpate fixdep.c to linux kernel
	v2.6.36-rc1-168-ge36c886
In-Reply-To: <20100827055634.GC2324@tarshish>
References: <1282888157-18427-1-git-send-email-plagnioj@jcrosoft.com>
	<20100827055634.GC2324@tarshish>
Message-ID: <20100827060545.GC16555@game.jcrosoft.org>

On 08:56 Fri 27 Aug     , Baruch Siach wrote:
> Hi Jean-Christophe,
> 
> On Fri, Aug 27, 2010 at 07:49:16AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > as autoconf.h is store in include/generated and not include/linux anymore
> 
> This log entry seems to belong to the next patch in this series.
???

it's patch 1 not patch 0

Best Regards,
J.


From natarajsn at gmail.com  Fri Aug 27 00:28:24 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Fri, 27 Aug 2010 09:58:24 +0530
Subject: Barebox: unprotect dataflash
Message-ID: <AANLkTi=fu9YB-Te21U5TBTdVD=BKfpYHxjAW2m7mX1K8@mail.gmail.com>

Hi

I am on barebox 2010.05.0-00446-g02f7dfe-dirty (Aug 23 2010 - 10:05:28).


I need to store the Env onto dataflash. While using u-boot, the env is
written to  0x4000 in the dataflash.

Which of this could be the  Data-flash device?



9263-EK:/ ls -l /dev/
/dev/zero                /dev/defaultenv          /dev/mem
/dev/ram0                /dev/nand0               /dev/nand_oob0
/dev/phy0                /dev/nor0                /dev/self
/dev/env0                /dev/nor0.barebox        /dev/nor0.bareboxenv
/dev/nor0.kernel         /dev/nor0.root

9263-EK:/ ls -l /dev/defaultenv
drwxrwxrwx          0 .
drwxrwxrwx          0 ..
drwxrwxrwx          0 dev
drwxrwxrwx          0 env
-rwxrwxrwx          0 uImage


Tried on /dev/defaultenv to get this , and stalls:-

9263-EK:/ unprotect  /dev/defaultenv
9263-EK:/ saveenv
saving environment
cfi_protect: unprotect 0xf1851002 (size 131072)


regards

Nataraj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100827/64858674/attachment-0001.html>

From natarajsn at gmail.com  Fri Aug 27 09:40:08 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Fri, 27 Aug 2010 19:10:08 +0530
Subject: barebox:Nand flash issue
Message-ID: <AANLkTimgEO3wqt27v2RKYtSHtmMK-w1FGoLP-dH44SnB@mail.gmail.com>

Hi

If

CONFIG_NAND=y
CONFIG_NAND_ATMEL=y


barebox breaks and  wont load from dataflash.

I am trying to get UBI working with:-

CONFIG_CMD_UBI=y
CONFIG_UBI=y


I remove NAND flash from config, barebox loads:-
barebox 2010.08.0-00036-ga74a26f (Aug 27 2010 - 18:52:37)

Board: Atmel at91sam9263-ek
Malloc space: 0x23b00000 -> 0x23f00000 (size  4 MB)
Stack space : 0x23af8000 -> 0x23b00000 (size 32 kB)
Open /dev/env0 No such file or directory
no valid environment found on /dev/env0. Using default environment
running /env/bin/init...
no MAC address set for eth0. please enter the one found on your board:
3a:1f:34:08:54:54

Hit any key to stop autoboot:  1

type update_kernel nor [<imagename>] to update kernel into flash
type update_root nor [<imagename>] to update rootfs into flash
type update_barebox_xmodem nor to update barebox into flash

9263-EK:/
9263-EK:/
9263-EK:/

regards

nataraj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100827/92ad46e6/attachment-0001.html>

From natarajsn at gmail.com  Fri Aug 27 09:45:09 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Fri, 27 Aug 2010 19:15:09 +0530
Subject: barebox:Nand flash issue
In-Reply-To: <AANLkTimgEO3wqt27v2RKYtSHtmMK-w1FGoLP-dH44SnB@mail.gmail.com>
References: <AANLkTimgEO3wqt27v2RKYtSHtmMK-w1FGoLP-dH44SnB@mail.gmail.com>
Message-ID: <AANLkTi=J2rmS2Mebiz5jzsPEXPwytjpdm7S5hhrEkrN1@mail.gmail.com>

Hi

As a follow-up my .config is here:-

#
# Automatically generated make config: don't edit
# barebox version: 2010.08.0
# Fri Aug 27 19:03:43 2010
#
# CONFIG_BOARD_LINKER_SCRIPT is not set
CONFIG_GENERIC_LINKER_SCRIPT=y
CONFIG_ARM=y

#
# System Type
#
CONFIG_ARCH_AT91=y
# CONFIG_ARCH_AT91RM9200 is not set
# CONFIG_ARCH_EP93XX is not set
# CONFIG_ARCH_IMX is not set
# CONFIG_ARCH_NETX is not set
# CONFIG_ARCH_OMAP is not set
# CONFIG_ARCH_S3C24xx is not set

#
# Processor Type
#
CONFIG_CPU_32=y
CONFIG_CPU_ARM926T=y
CONFIG_CPU_32v5=y

#
# processor features
#
CONFIG_ARCH_TEXT_BASE=0x23f00000
CONFIG_BOARDINFO="Atmel at91sam9263-ek"

#
# Atmel AT91 System-on-Chip
#
# CONFIG_ARCH_AT91SAM9260 is not set
CONFIG_ARCH_AT91SAM9263=y
CONFIG_MACH_AT91SAM9263EK=y
# CONFIG_MACH_MMCCPU is not set
# CONFIG_MACH_PM9263 is not set
CONFIG_AEABI=y

#
# Arm specific settings
#
CONFIG_CMD_ARM_CPUINFO=y
CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
CONFIG_GREGORIAN_CALENDER=y
CONFIG_HAS_KALLSYMS=y
CONFIG_HAS_MODULES=y
CONFIG_CMD_MEMORY=y
CONFIG_ENV_HANDLING=y
CONFIG_GENERIC_GPIO=y
#
# General Settings
#
CONFIG_LOCALVERSION_AUTO=y

#
# memory layout
#
CONFIG_HAVE_CONFIGURABLE_TEXT_BASE=y
CONFIG_TEXT_BASE=0x23f00000
CONFIG_HAVE_CONFIGURABLE_MEMORY_LAYOUT=y
CONFIG_MEMORY_LAYOUT_DEFAULT=y
# CONFIG_MEMORY_LAYOUT_FIXED is not set
CONFIG_STACK_SIZE=0x8000
CONFIG_MALLOC_SIZE=0x400000
CONFIG_BROKEN=y
CONFIG_EXPERIMENTAL=y
# CONFIG_MODULES is not set
# CONFIG_KALLSYMS is not set
CONFIG_MACH_HAS_LOWLEVEL_INIT=y
CONFIG_MACH_DO_LOWLEVEL_INIT=y
CONFIG_PROMPT="9263-EK:"
CONFIG_BAUDRATE=115200
CONFIG_LONGHELP=y
CONFIG_CBSIZE=1024
CONFIG_MAXARGS=16
CONFIG_SHELL_HUSH=y
# CONFIG_SHELL_SIMPLE is not set
CONFIG_GLOB=y
CONFIG_PROMPT_HUSH_PS2="> "
# CONFIG_HUSH_FANCY_PROMPT is not set
CONFIG_CMDLINE_EDITING=y
CONFIG_AUTO_COMPLETE=y
CONFIG_DYNAMIC_CRC_TABLE=y
CONFIG_ERRNO_MESSAGES=y
CONFIG_TIMESTAMP=y
CONFIG_CONSOLE_FULL=y
CONFIG_CONSOLE_ACTIVATE_FIRST=y
# CONFIG_OF_FLAT_TREE is not set
CONFIG_PARTITION=y
CONFIG_DEFAULT_ENVIRONMENT=y
CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/at91sam9263ek/env"

#
# Debugging
#
CONFIG_DEBUG_INFO=y
CONFIG_ENABLE_FLASH_NOISE=y
CONFIG_ENABLE_PARTITION_NOISE=y
CONFIG_ENABLE_DEVICE_NOISE=y

#
# Commands
##
# scripting
#
CONFIG_CMD_EDIT=y
CONFIG_CMD_SLEEP=y
CONFIG_CMD_SAVEENV=y
CONFIG_CMD_LOADENV=y
CONFIG_CMD_EXPORT=y
CONFIG_CMD_PRINTENV=y
CONFIG_CMD_READLINE=y
CONFIG_CMD_TRUE=y
CONFIG_CMD_FALSE=y

#
# file commands
#
CONFIG_CMD_LS=y
CONFIG_CMD_RM=y
CONFIG_CMD_CAT=y
CONFIG_CMD_MKDIR=y
CONFIG_CMD_RMDIR=y
CONFIG_CMD_CP=y
CONFIG_CMD_PWD=y
CONFIG_CMD_CD=y
CONFIG_CMD_MOUNT=y
CONFIG_CMD_UMOUNT=y

#
# console
#
CONFIG_CMD_CLEAR=y
CONFIG_CMD_ECHO=y
# CONFIG_CMD_ECHO_E is not set

#
# memory
#
# CONFIG_CMD_LOADB is not set
# CONFIG_CMD_LOADY is not set
# CONFIG_CMD_LOADS is not set
CONFIG_CMD_MEMINFO=y
CONFIG_CMD_CRC=y
CONFIG_CMD_MTEST=y
# CONFIG_CMD_MTEST_ALTERNATIVE is not set

#
# flash
#
CONFIG_CMD_FLASH=y
CONFIG_CMD_UBI=y

#
# booting
#
CONFIG_CMD_BOOTM=y
CONFIG_CMD_BOOTM_ZLIB=y
CONFIG_CMD_BOOTM_BZLIB=y
CONFIG_CMD_BOOTM_SHOW_TYPE=y
CONFIG_CMD_BOOTZ=y
CONFIG_CMD_BOOTU=y
# CONFIG_CMD_LINUX16 is not set
CONFIG_CMD_RESET=y
CONFIG_CMD_GO=y
CONFIG_CMD_TIMEOUT=y
CONFIG_CMD_PARTITION=y
CONFIG_CMD_TEST=y
CONFIG_CMD_VERSION=y
CONFIG_CMD_HELP=y
CONFIG_CMD_DEVINFO=y
# CONFIG_CMD_GPIO is not set
# CONFIG_CMD_UNLZO is not set
# CONFIG_CMD_I2C is not set
CONFIG_NET=y
CONFIG_NET_DHCP=y
CONFIG_NET_NFS=y
CONFIG_NET_PING=y
CONFIG_NET_TFTP=y
# CONFIG_NET_TFTP_PUSH is not set
# CONFIG_NET_NETCONSOLE is not set
# CONFIG_NET_RESOLV is not set

#
# Drivers
#

#
# serial drivers
#
# CONFIG_DRIVER_SERIAL_ARM_DCC is not set
# CONFIG_DRIVER_SERIAL_NS16550 is not set
CONFIG_DRIVER_SERIAL_ATMEL=y
CONFIG_MIIPHY=y

#
# Network drivers
#
# CONFIG_DRIVER_NET_SMC911X is not set
# CONFIG_DRIVER_NET_SMC91111 is not set
CONFIG_DRIVER_NET_MACB=y
# CONFIG_NET_USB is not set

#
# SPI drivers
#
# CONFIG_SPI is not set
CONFIG_I2C=y
CONFIG_DRIVER_I2C_MC13892=y
CONFIG_DRIVER_I2C_MC34704=y
CONFIG_DRIVER_I2C_MC9SDZ60=y
CONFIG_DRIVER_I2C_LP3972=y

# CONFIG_DRIVER_SERIAL_ARM_DCC is not set
# CONFIG_DRIVER_SERIAL_NS16550 is not set
CONFIG_DRIVER_SERIAL_ATMEL=y
CONFIG_MIIPHY=y

#
# Network drivers
#
# CONFIG_DRIVER_NET_SMC911X is not set
# CONFIG_DRIVER_NET_SMC91111 is not set
CONFIG_DRIVER_NET_MACB=y
# CONFIG_NET_USB is not set

#
# SPI drivers
#
# CONFIG_SPI is not set
CONFIG_I2C=y
CONFIG_DRIVER_I2C_MC13892=y
CONFIG_DRIVER_I2C_MC34704=y
CONFIG_DRIVER_I2C_MC9SDZ60=y
CONFIG_DRIVER_I2C_LP3972=y

#
# flash drivers
#
# CONFIG_DRIVER_CFI is not set
CONFIG_MTD=y
CONFIG_NAND=y
CONFIG_NAND_ATMEL=y
# CONFIG_MTD_NAND_VERIFY_WRITE is not set
# CONFIG_MTD_NAND_ECC_SMC is not set
CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_DISKONCHIP is not set
CONFIG_UBI=y
# CONFIG_ATA is not set
CONFIG_USB=y
CONFIG_USB_EHCI=y
# CONFIG_USB_ISP1504 is not set
# CONFIG_USB_GADGET is not set
# CONFIG_VIDEO is not set

#
# Filesystem support
#
# CONFIG_FS_CRAMFS is not set
CONFIG_FS_RAMFS=y
CONFIG_FS_DEVFS=y
CONFIG_PARTITION_NEED_MTD=y
CONFIG_ZLIB=y
CONFIG_BZLIB=y
CONFIG_CRC32=y
# CONFIG_GENERIC_FIND_NEXT_BIT is not set
# CONFIG_PROCESS_ESCAPE_SEQUENCE is not set

regards

Nataraj

On Fri, Aug 27, 2010 at 7:10 PM, Nataraj S Narayan <natarajsn at gmail.com>wrote:

> Hi
>
> If
>
> CONFIG_NAND=y
> CONFIG_NAND_ATMEL=y
>
>
> barebox breaks and  wont load from dataflash.
>
> I am trying to get UBI working with:-
>
> CONFIG_CMD_UBI=y
> CONFIG_UBI=y
>
>
> I remove NAND flash from config, barebox loads:-
> barebox 2010.08.0-00036-ga74a26f (Aug 27 2010 - 18:52:37)
>
> Board: Atmel at91sam9263-ek
> Malloc space: 0x23b00000 -> 0x23f00000 (size  4 MB)
> Stack space : 0x23af8000 -> 0x23b00000 (size 32 kB)
> Open /dev/env0 No such file or directory
> no valid environment found on /dev/env0. Using default environment
> running /env/bin/init...
> no MAC address set for eth0. please enter the one found on your board:
> 3a:1f:34:08:54:54
>
> Hit any key to stop autoboot:  1
>
> type update_kernel nor [<imagename>] to update kernel into flash
> type update_root nor [<imagename>] to update rootfs into flash
> type update_barebox_xmodem nor to update barebox into flash
>
> 9263-EK:/
> 9263-EK:/
> 9263-EK:/
>
> regards
>
> nataraj
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100827/b80ebac7/attachment-0001.html>

From mkl at pengutronix.de  Fri Aug 27 09:52:25 2010
From: mkl at pengutronix.de (Marc Kleine-Budde)
Date: Fri, 27 Aug 2010 15:52:25 +0200
Subject: barebox:Nand flash issue
In-Reply-To: <AANLkTimgEO3wqt27v2RKYtSHtmMK-w1FGoLP-dH44SnB@mail.gmail.com>
References: <AANLkTimgEO3wqt27v2RKYtSHtmMK-w1FGoLP-dH44SnB@mail.gmail.com>
Message-ID: <4C77C319.9090306@pengutronix.de>

Nataraj S Narayan wrote:
> Hi
> 
> If
> 
> CONFIG_NAND=y
> CONFIG_NAND_ATMEL=y
> 
> 
> barebox breaks and  wont load from dataflash.

I'm not sure if dataflash is supported. Try to boot from real NAND or NOR.

Jean-Christophe can probably say something to this.

Cheers, Marc
-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 260 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100827/c1cee29e/attachment.sig>

From plagnioj at jcrosoft.com  Fri Aug 27 11:05:33 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 17:05:33 +0200
Subject: barebox:Nand flash issue
In-Reply-To: <4C77C319.9090306@pengutronix.de>
References: <AANLkTimgEO3wqt27v2RKYtSHtmMK-w1FGoLP-dH44SnB@mail.gmail.com>
	<4C77C319.9090306@pengutronix.de>
Message-ID: <20100827150533.GD16555@game.jcrosoft.org>

On 15:52 Fri 27 Aug     , Marc Kleine-Budde wrote:
> Nataraj S Narayan wrote:
> > Hi
> > 
> > If
> > 
> > CONFIG_NAND=y
> > CONFIG_NAND_ATMEL=y
> > 
> > 
> > barebox breaks and  wont load from dataflash.
> 
> I'm not sure if dataflash is supported. Try to boot from real NAND or NOR.
> 
> Jean-Christophe can probably say something to this.
I've not yet add the spi-flash support
but how do you boot from spi-flash?
via at91bootstrap?

I'm currently travelling so I can not test it by now as I just take some SH4
boards

I plan to add it later next month

Best Regards,
J.


From plagnioj at jcrosoft.com  Fri Aug 27 12:08:42 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Fri, 27 Aug 2010 18:08:42 +0200
Subject: [PATCH] types.h: move _kernel_dev_t to include/linux/types.h
Message-ID: <1282925322-11622-1-git-send-email-plagnioj@jcrosoft.com>

no need to have a arch specific type

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/include/asm/posix_types.h      |    1 -
 arch/blackfin/include/asm/posix_types.h |    1 -
 arch/m68k/include/asm/posix_types.h     |    1 -
 arch/ppc/include/asm/posix_types.h      |    1 -
 arch/sandbox/include/asm/posix_types.h  |    1 -
 arch/x86/include/asm/posix_types.h      |    1 -
 include/linux/types.h                   |    2 ++
 7 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/arch/arm/include/asm/posix_types.h b/arch/arm/include/asm/posix_types.h
index c412486..aee050e 100644
--- a/arch/arm/include/asm/posix_types.h
+++ b/arch/arm/include/asm/posix_types.h
@@ -19,7 +19,6 @@
  * assume GCC is being used.
  */
 
-typedef unsigned short		__kernel_dev_t;
 typedef unsigned long		__kernel_ino_t;
 typedef unsigned short		__kernel_mode_t;
 typedef unsigned short		__kernel_nlink_t;
diff --git a/arch/blackfin/include/asm/posix_types.h b/arch/blackfin/include/asm/posix_types.h
index 98397ca..bbf6e9c 100644
--- a/arch/blackfin/include/asm/posix_types.h
+++ b/arch/blackfin/include/asm/posix_types.h
@@ -34,7 +34,6 @@
  * assume GCC is being used.
  */
 
-typedef unsigned short __kernel_dev_t;
 typedef unsigned long __kernel_ino_t;
 typedef unsigned short __kernel_mode_t;
 typedef unsigned short __kernel_nlink_t;
diff --git a/arch/m68k/include/asm/posix_types.h b/arch/m68k/include/asm/posix_types.h
index c40c41d..d83afe9 100644
--- a/arch/m68k/include/asm/posix_types.h
+++ b/arch/m68k/include/asm/posix_types.h
@@ -27,7 +27,6 @@
 #define __ARCH_M68K_POSIX_TYPES_H
 
 
-typedef unsigned short		__kernel_dev_t;
 typedef unsigned long		__kernel_ino_t;
 typedef unsigned short		__kernel_mode_t;
 typedef unsigned short		__kernel_nlink_t;
diff --git a/arch/ppc/include/asm/posix_types.h b/arch/ppc/include/asm/posix_types.h
index 9170728..a7af406 100644
--- a/arch/ppc/include/asm/posix_types.h
+++ b/arch/ppc/include/asm/posix_types.h
@@ -7,7 +7,6 @@
  * assume GCC is being used.
  */
 
-typedef unsigned int	__kernel_dev_t;
 typedef unsigned int	__kernel_ino_t;
 typedef unsigned int	__kernel_mode_t;
 typedef unsigned short	__kernel_nlink_t;
diff --git a/arch/sandbox/include/asm/posix_types.h b/arch/sandbox/include/asm/posix_types.h
index 5dcc842..4345141 100644
--- a/arch/sandbox/include/asm/posix_types.h
+++ b/arch/sandbox/include/asm/posix_types.h
@@ -7,7 +7,6 @@
  * assume GCC is being used.
  */
 
-typedef unsigned short	__kernel_dev_t;
 typedef unsigned long	__kernel_ino_t;
 typedef unsigned short	__kernel_mode_t;
 typedef unsigned short	__kernel_nlink_t;
diff --git a/arch/x86/include/asm/posix_types.h b/arch/x86/include/asm/posix_types.h
index a22f301..9278681 100644
--- a/arch/x86/include/asm/posix_types.h
+++ b/arch/x86/include/asm/posix_types.h
@@ -27,7 +27,6 @@
 #define _ASM_X86_POSIX_TYPES_H
 
 typedef unsigned long	__kernel_ino_t;
-typedef unsigned short	__kernel_dev_t;
 typedef unsigned short	__kernel_mode_t;
 typedef unsigned short	__kernel_nlink_t;
 typedef long		__kernel_off_t;
diff --git a/include/linux/types.h b/include/linux/types.h
index 96e5708..2145b6d 100644
--- a/include/linux/types.h
+++ b/include/linux/types.h
@@ -6,6 +6,8 @@
 
 #ifndef __KERNEL_STRICT_NAMES
 
+typedef __u32 __kernel_dev_t;
+
 typedef __kernel_fd_set		fd_set;
 typedef __kernel_dev_t		dev_t;
 typedef __kernel_ino_t		ino_t;
-- 
1.7.1



From natarajsn at gmail.com  Sat Aug 28 08:15:17 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Sat, 28 Aug 2010 17:45:17 +0530
Subject: Barebox: Nand flash
Message-ID: <AANLkTikVJ7wU7neSsep=OG23tstrv4f=LpQ_YptFu1Cd@mail.gmail.com>

Hi

on commit a74a26f25477ec65229a57ca15e0f2c56396c69a

I don't find nand0.rootfs.

9263-EK:/  ls /dev/

/dev/zero           /dev/defaultenv     /dev/mem
/dev/ram0           /dev/nand0          /dev/nand_oob0
/dev/phy0           /dev/self_raw       /dev/self0
/dev/env_raw        /dev/env0


Am I missing anything?


regards

Nataraj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100828/bbcdac98/attachment.html>

From s.hauer at pengutronix.de  Sat Aug 28 10:13:26 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Sat, 28 Aug 2010 16:13:26 +0200
Subject: Barebox: Nand flash
In-Reply-To: <AANLkTikVJ7wU7neSsep=OG23tstrv4f=LpQ_YptFu1Cd@mail.gmail.com>
References: <AANLkTikVJ7wU7neSsep=OG23tstrv4f=LpQ_YptFu1Cd@mail.gmail.com>
Message-ID: <20100828141326.GH1473@pengutronix.de>

On Sat, Aug 28, 2010 at 05:45:17PM +0530, Nataraj S Narayan wrote:
> Hi
> 
> on commit a74a26f25477ec65229a57ca15e0f2c56396c69a
> 
> I don't find nand0.rootfs.
> 
> 9263-EK:/  ls /dev/
> 
> /dev/zero           /dev/defaultenv     /dev/mem
> /dev/ram0           /dev/nand0          /dev/nand_oob0
> /dev/phy0           /dev/self_raw       /dev/self0
> /dev/env_raw        /dev/env0

/dev/nand0 is there, so there's only partitioning missing. Try something
like

addpart /dev/nand0 256k(barebox),256k(bareboxenv),2M(kernel),-(rootfs)
nand -a /dev/nand0.*

Normally your environment does this for you.

Note that /dev/nand0.rootfs is not intended for direct use, instead use
/dev/nand0.rootfs.bb. The .bb devices automatically skip bad blocks
while writing on it or reading from it.

Regards,
  Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From plagnioj at jcrosoft.com  Sun Aug 29 01:52:25 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 29 Aug 2010 07:52:25 +0200
Subject: [PATCH] module: move EXPORT_SYMBOL_GPL define to module.h
Message-ID: <1283061145-27417-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 drivers/mtd/ubi/ubi-barebox.h |    1 -
 include/module.h              |    4 ++++
 2 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/drivers/mtd/ubi/ubi-barebox.h b/drivers/mtd/ubi/ubi-barebox.h
index 84c589f..d23228f 100644
--- a/drivers/mtd/ubi/ubi-barebox.h
+++ b/drivers/mtd/ubi/ubi-barebox.h
@@ -172,7 +172,6 @@ struct cdev_ {
 #define module_put(...)		do { } while (0)
 #define module_init(...)
 #define module_exit(...)
-#define EXPORT_SYMBOL_GPL(...)
 #define module_param_call(...)
 #define MODULE_PARM_DESC(...)
 #define MODULE_VERSION(...)
diff --git a/include/module.h b/include/module.h
index 9d0e803..228a543 100644
--- a/include/module.h
+++ b/include/module.h
@@ -36,6 +36,9 @@ struct module * load_module(void *mod_image, unsigned long len);
 #define EXPORT_SYMBOL(sym)					\
 	__EXPORT_SYMBOL(sym, "")
 
+#define EXPORT_SYMBOL_GPL(sym)					\
+	__EXPORT_SYMBOL(sym, "")
+
 struct module {
 	/* Unique handle for this module */
 	char name[MODULE_NAME_LEN];
@@ -71,6 +74,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
 		       struct module *mod);
 #else
 #define EXPORT_SYMBOL(sym)
+#define EXPORT_SYMBOL_GPL(sym)
 #endif /* CONFIG_MODULES */
 
 extern struct list_head module_list;
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug 29 12:24:22 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 29 Aug 2010 18:24:22 +0200
Subject: [PATCH] add WARN_ON and WARN support
Message-ID: <1283099062-20675-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/common.h |   25 +++++++++++++++++++++++++
 1 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/include/common.h b/include/common.h
index 0edc778..64f49db 100644
--- a/include/common.h
+++ b/include/common.h
@@ -56,6 +56,31 @@
 } while (0)
 #define BUG_ON(condition) do { if (unlikely((condition)!=0)) BUG(); } while(0)
 
+
+#define __WARN() do { 								\
+	printf("WARNING: at %s:%d/%s()!\n", __FILE__, __LINE__, __FUNCTION__);	\
+} while (0)
+
+#ifndef WARN_ON
+#define WARN_ON(condition) ({						\
+	int __ret_warn_on = !!(condition);				\
+	if (unlikely(__ret_warn_on))					\
+		__WARN();						\
+	unlikely(__ret_warn_on);					\
+})
+#endif
+
+#ifndef WARN
+#define WARN(condition, format...) ({					\
+	int __ret_warn_on = !!(condition);				\
+	if (unlikely(__ret_warn_on))					\
+		__WARN();						\
+		puts("WARNING: ");					\
+		printf(format);						\
+	unlikely(__ret_warn_on);					\
+})
+#endif
+
 typedef void (interrupt_handler_t)(void *);
 
 #include <asm/barebox.h> /* boot information for Linux kernel */
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug 29 12:33:45 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 29 Aug 2010 18:33:45 +0200
Subject: [PATCH] move include/unaligned to include/linux/unaligned/
Message-ID: <1283099625-21699-1-git-send-email-plagnioj@jcrosoft.com>

as originally in linux

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/include/asm/unaligned.h              |    6 +++---
 include/{ => linux}/unaligned/access_ok.h     |    0
 include/{ => linux}/unaligned/be_byteshift.h  |    0
 include/{ => linux}/unaligned/be_memmove.h    |    0
 include/{ => linux}/unaligned/be_struct.h     |    0
 include/{ => linux}/unaligned/generic.h       |    0
 include/{ => linux}/unaligned/le_byteshift.h  |    0
 include/{ => linux}/unaligned/le_memmove.h    |    0
 include/{ => linux}/unaligned/le_struct.h     |    0
 include/{ => linux}/unaligned/memmove.h       |    0
 include/{ => linux}/unaligned/packed_struct.h |    0
 11 files changed, 3 insertions(+), 3 deletions(-)
 rename include/{ => linux}/unaligned/access_ok.h (100%)
 rename include/{ => linux}/unaligned/be_byteshift.h (100%)
 rename include/{ => linux}/unaligned/be_memmove.h (100%)
 rename include/{ => linux}/unaligned/be_struct.h (100%)
 rename include/{ => linux}/unaligned/generic.h (100%)
 rename include/{ => linux}/unaligned/le_byteshift.h (100%)
 rename include/{ => linux}/unaligned/le_memmove.h (100%)
 rename include/{ => linux}/unaligned/le_struct.h (100%)
 rename include/{ => linux}/unaligned/memmove.h (100%)
 rename include/{ => linux}/unaligned/packed_struct.h (100%)

diff --git a/arch/arm/include/asm/unaligned.h b/arch/arm/include/asm/unaligned.h
index 34f7838..44593a8 100644
--- a/arch/arm/include/asm/unaligned.h
+++ b/arch/arm/include/asm/unaligned.h
@@ -1,9 +1,9 @@
 #ifndef _ASM_ARM_UNALIGNED_H
 #define _ASM_ARM_UNALIGNED_H
 
-#include <unaligned/le_byteshift.h>
-#include <unaligned/be_byteshift.h>
-#include <unaligned/generic.h>
+#include <linux/unaligned/le_byteshift.h>
+#include <linux/unaligned/be_byteshift.h>
+#include <linux/unaligned/generic.h>
 
 /*
  * Select endianness
diff --git a/include/unaligned/access_ok.h b/include/linux/unaligned/access_ok.h
similarity index 100%
rename from include/unaligned/access_ok.h
rename to include/linux/unaligned/access_ok.h
diff --git a/include/unaligned/be_byteshift.h b/include/linux/unaligned/be_byteshift.h
similarity index 100%
rename from include/unaligned/be_byteshift.h
rename to include/linux/unaligned/be_byteshift.h
diff --git a/include/unaligned/be_memmove.h b/include/linux/unaligned/be_memmove.h
similarity index 100%
rename from include/unaligned/be_memmove.h
rename to include/linux/unaligned/be_memmove.h
diff --git a/include/unaligned/be_struct.h b/include/linux/unaligned/be_struct.h
similarity index 100%
rename from include/unaligned/be_struct.h
rename to include/linux/unaligned/be_struct.h
diff --git a/include/unaligned/generic.h b/include/linux/unaligned/generic.h
similarity index 100%
rename from include/unaligned/generic.h
rename to include/linux/unaligned/generic.h
diff --git a/include/unaligned/le_byteshift.h b/include/linux/unaligned/le_byteshift.h
similarity index 100%
rename from include/unaligned/le_byteshift.h
rename to include/linux/unaligned/le_byteshift.h
diff --git a/include/unaligned/le_memmove.h b/include/linux/unaligned/le_memmove.h
similarity index 100%
rename from include/unaligned/le_memmove.h
rename to include/linux/unaligned/le_memmove.h
diff --git a/include/unaligned/le_struct.h b/include/linux/unaligned/le_struct.h
similarity index 100%
rename from include/unaligned/le_struct.h
rename to include/linux/unaligned/le_struct.h
diff --git a/include/unaligned/memmove.h b/include/linux/unaligned/memmove.h
similarity index 100%
rename from include/unaligned/memmove.h
rename to include/linux/unaligned/memmove.h
diff --git a/include/unaligned/packed_struct.h b/include/linux/unaligned/packed_struct.h
similarity index 100%
rename from include/unaligned/packed_struct.h
rename to include/linux/unaligned/packed_struct.h
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug 29 12:53:03 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 29 Aug 2010 18:53:03 +0200
Subject: [PATCH V2] initcall: add postconsole_initcall
In-Reply-To: <1280840019-11421-1-git-send-email-plagnioj@jcrosoft.com>
References: <1280840019-11421-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1283100783-23625-1-git-send-email-plagnioj@jcrosoft.com>

this will allow us to print information as soon as the console will be enable

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
HI,

	this patch is a rebase version which is needed by at91 since the
	switch to linux clk framework

	which was forget

Best Regards,
J.
 include/init.h |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/include/init.h b/include/init.h
index bc70874..9651f2a 100644
--- a/include/init.h
+++ b/include/init.h
@@ -25,10 +25,11 @@ typedef int (*initcall_t)(void);
 #define core_initcall(fn)		__define_initcall("1",fn,1)
 #define postcore_initcall(fn)		__define_initcall("2",fn,2)
 #define console_initcall(fn)		__define_initcall("3",fn,3)
-#define coredevice_initcall(fn)		__define_initcall("4",fn,4)
-#define fs_initcall(fn)			__define_initcall("5",fn,5)
-#define device_initcall(fn)		__define_initcall("6",fn,6)
-#define late_initcall(fn)		__define_initcall("7",fn,7)
+#define postconsole_initcall(fn)	__define_initcall("4",fn,4)
+#define coredevice_initcall(fn)		__define_initcall("5",fn,5)
+#define fs_initcall(fn)			__define_initcall("6",fn,6)
+#define device_initcall(fn)		__define_initcall("7",fn,7)
+#define late_initcall(fn)		__define_initcall("8",fn,8)
 
 /* section for code used very early when
  * - we're not running from where we linked at
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug 29 12:57:02 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Sun, 29 Aug 2010 18:57:02 +0200
Subject: [PATCH] at91: remove non-needed include of autoconf.h
Message-ID: <1283101022-24099-1-git-send-email-plagnioj@jcrosoft.com>

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/mach-at91/lowlevel_init.S |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/arch/arm/mach-at91/lowlevel_init.S b/arch/arm/mach-at91/lowlevel_init.S
index 5bd32e8..497cc0d 100644
--- a/arch/arm/mach-at91/lowlevel_init.S
+++ b/arch/arm/mach-at91/lowlevel_init.S
@@ -26,7 +26,6 @@
  * MA 02111-1307 USA
  */
 
-#include <linux/autoconf.h>
 #include <config.h>
 #include <mach/hardware.h>
 #include <mach/at91_pmc.h>
-- 
1.7.1



From plagnioj at jcrosoft.com  Sun Aug 29 21:21:46 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 30 Aug 2010 03:21:46 +0200
Subject: [PATCH V3] initcall: add postconsole_initcall
In-Reply-To: <1283100783-23625-1-git-send-email-plagnioj@jcrosoft.com>
References: <1283100783-23625-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1283131306-6696-1-git-send-email-plagnioj@jcrosoft.com>

this will allow us to print information as soon as the console will be enable

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
HI,

	this patch is a rebase version which is needed by at91 since the
	switch to linux clk framework

	which was forget

v3:

	add missing KEEP for linker script
Best Regards,
J.
 include/asm-generic/barebox.lds.h |    3 ++-
 include/init.h                    |    9 +++++----
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/include/asm-generic/barebox.lds.h b/include/asm-generic/barebox.lds.h
index 99ccc5e..1d3f4f7 100644
--- a/include/asm-generic/barebox.lds.h
+++ b/include/asm-generic/barebox.lds.h
@@ -15,7 +15,8 @@
 	KEEP(*(.initcall.4))			\
 	KEEP(*(.initcall.5))			\
 	KEEP(*(.initcall.6))			\
-	KEEP(*(.initcall.7))
+	KEEP(*(.initcall.7))			\
+	KEEP(*(.initcall.8))
 
 #define BAREBOX_CMDS	KEEP(*(SORT_BY_NAME(.barebox_cmd*)))
 
diff --git a/include/init.h b/include/init.h
index bc70874..8692b68 100644
--- a/include/init.h
+++ b/include/init.h
@@ -25,10 +25,11 @@ typedef int (*initcall_t)(void);
 #define core_initcall(fn)		__define_initcall("1",fn,1)
 #define postcore_initcall(fn)		__define_initcall("2",fn,2)
 #define console_initcall(fn)		__define_initcall("3",fn,3)
-#define coredevice_initcall(fn)		__define_initcall("4",fn,4)
-#define fs_initcall(fn)			__define_initcall("5",fn,5)
-#define device_initcall(fn)		__define_initcall("6",fn,6)
-#define late_initcall(fn)		__define_initcall("7",fn,7)
+#define postconsole_initcall(fn)	__define_initcall("4",fn,4)
+#define coredevice_initcall(fn)		__define_initcall("5",fn,5)
+#define fs_initcall(fn)			__define_initcall("6",fn,6)
+#define device_initcall(fn)		__define_initcall("7",fn,7)
+#define late_initcall(fn)		__define_initcall("8",fn,8)
 
 /* section for code used very early when
  * - we're not running from where we linked at
-- 
1.7.1



From plagnioj at jcrosoft.com  Mon Aug 30 00:05:06 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 30 Aug 2010 06:05:06 +0200
Subject: [PATCH 2/2] stm8815: fix the uart device clock match
In-Reply-To: <1283141106-21671-1-git-send-email-plagnioj@jcrosoft.com>
References: <1283141106-21671-1-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1283141106-21671-2-git-send-email-plagnioj@jcrosoft.com>

that use the device name + id to found it's clock
to use the right match as we fix the dev_name macro

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/mach-nomadik/8815.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-nomadik/8815.c b/arch/arm/mach-nomadik/8815.c
index 8598f14..f1d5e8c 100644
--- a/arch/arm/mach-nomadik/8815.c
+++ b/arch/arm/mach-nomadik/8815.c
@@ -50,12 +50,14 @@ void st8815_add_device_sdram(u32 size)
 }
 
 static struct device_d uart0_serial_device = {
+	id = 0,
 	.name = "uart-pl011",
 	.map_base = NOMADIK_UART0_BASE,
 	.size = 4096,
 };
 
 static struct device_d uart1_serial_device = {
+	id = 1,
 	.name = "uart-pl011",
 	.map_base = NOMADIK_UART1_BASE,
 	.size = 4096,
@@ -65,12 +67,12 @@ void st8815_register_uart(unsigned id)
 {
 	switch (id) {
 	case 0:
-		nmdk_clk_create(&st8815_clk_48, uart0_serial_device.name);
 		register_device(&uart0_serial_device);
+		nmdk_clk_create(&st8815_clk_48, dev_name(uart0_serial_device));
 		break;
 	case 1:
-		nmdk_clk_create(&st8815_clk_48, uart1_serial_device.name);
 		register_device(&uart1_serial_device);
+		nmdk_clk_create(&st8815_clk_48, dev_name(uart0_serial_device));
 		break;
 	}
 }
-- 
1.7.1



From plagnioj at jcrosoft.com  Mon Aug 30 00:05:05 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 30 Aug 2010 06:05:05 +0200
Subject: [PATCH 1/2] device: fix dev_name
Message-ID: <1283141106-21671-1-git-send-email-plagnioj@jcrosoft.com>

dev_name is supposed to return the name of the device plus the id

currently we use %s%d format where in the kernel the use %s.%d
we may think to switch to this format for the device name and keeping the %s%d
for the devfs

this will be usefull to not modify the clock device name as example

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 include/driver.h |   12 +++++++-----
 lib/driver.c     |   16 +++++++---------
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/include/driver.h b/include/driver.h
index ee0749d..ab1f850 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -25,7 +25,8 @@
 
 #include <linux/list.h>
 
-#define MAX_DRIVER_NAME 32
+#define MAX_DRIVER_NAME		32
+#define FORMAT_DRIVER_MANE_ID	"%s%d"
 
 #include <param.h>
 
@@ -176,9 +177,11 @@ int get_free_deviceid(const char *name_template);
 
 char *deviceid_from_spec_str(const char *str, char **endp);
 
+extern const char *dev_id(const struct device_d *dev);
+
 static inline const char *dev_name(const struct device_d *dev)
 {
-	return dev->name;
+	return dev_id(dev);
 }
 
 /* linear list over all available devices
@@ -239,11 +242,10 @@ static inline int dev_close_default(struct device_d *dev, struct filep *f)
 }
 
 /* debugging and troubleshooting/diagnostic helpers. */
-extern const char *dev_id(const struct device_d *dev);
 
 #define dev_printf(dev, format, arg...)	\
-	printf("%s@%s: " format , dev_name(dev) , \
-	       dev_id(dev) , ## arg)
+	printf("%s@%s: " format , dev->name , \
+	       dev_name(dev) , ## arg)
 
 #define dev_emerg(dev, format, arg...)		\
 	dev_printf((dev) , format , ## arg)
diff --git a/lib/driver.c b/lib/driver.c
index b600745..03a2817 100644
--- a/lib/driver.c
+++ b/lib/driver.c
@@ -45,11 +45,9 @@ static LIST_HEAD(active);
 struct device_d *get_device_by_name(const char *name)
 {
 	struct device_d *dev;
-	char devname[MAX_DRIVER_NAME + 3];
 
 	for_each_device(dev) {
-		sprintf(devname, "%s%d", dev->name, dev->id);
-		if(!strcmp(name, devname))
+		if(!strcmp(dev_name(dev), name))
 			return dev;
 	}
 
@@ -62,7 +60,7 @@ int get_free_deviceid(const char *name_template)
 	char name[MAX_DRIVER_NAME + 3];
 
 	while (1) {
-		sprintf(name, "%s%d", name_template, i);
+		sprintf(name, FORMAT_DRIVER_MANE_ID, name_template, i);
 		if (!get_device_by_name(name))
 			return i;
 		i++;
@@ -97,7 +95,7 @@ int register_device(struct device_d *new_device)
 
 	new_device->id = get_free_deviceid(new_device->name);
 
-	debug ("register_device: %s\n",new_device->name);
+	debug ("register_device: %s\n", dev_name(new_device));
 
 	if (!new_device->bus) {
 //		dev_err(new_device, "no bus type associated. Needs fixup\n");
@@ -120,7 +118,7 @@ EXPORT_SYMBOL(register_device);
 
 int unregister_device(struct device_d *old_dev)
 {
-	debug("unregister_device: %s:%s\n",old_dev->name, old_dev->id);
+	debug("unregister_device: %s\n", dev_name(old_dev->name));
 
 	if (!list_empty(&old_dev->children)) {
 		errno = -EBUSY;
@@ -164,7 +162,7 @@ struct driver_d *get_driver_by_name(const char *name)
 
 static void noinfo(struct device_d *dev)
 {
-	printf("no info available for %s\n", dev->name);
+	printf("no info available for %s\n", dev_name(dev));
 }
 
 static void noshortinfo(struct device_d *dev)
@@ -237,7 +235,7 @@ static int do_devinfo_subtree(struct device_d *dev, int depth, char edge)
 	for (i = 0; i < depth; i++)
 		printf("|    ");
 
-	printf("%c----%s%d", edge, dev->name, dev->id);
+	printf("%c----%s", edge, dev_name(dev));
 	if (!list_empty(&dev->cdevs)) {
 		printf(" (");
 		list_for_each_entry(cdev, &dev->cdevs, devices_list) {
@@ -264,7 +262,7 @@ const char *dev_id(const struct device_d *dev)
 {
 	static char buf[sizeof(unsigned long) * 2];
 
-	sprintf(buf, "%s%d", dev->name, dev->id);
+	sprintf(buf, FORMAT_DRIVER_MANE_ID, dev->name, dev->id);
 
 	return buf;
 }
-- 
1.7.1



From mkl at pengutronix.de  Mon Aug 30 03:36:49 2010
From: mkl at pengutronix.de (Marc Kleine-Budde)
Date: Mon, 30 Aug 2010 09:36:49 +0200
Subject: [PATCH 2/2] stm8815: fix the uart device clock match
In-Reply-To: <1283141106-21671-2-git-send-email-plagnioj@jcrosoft.com>
References: <1283141106-21671-1-git-send-email-plagnioj@jcrosoft.com>
	<1283141106-21671-2-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <4C7B5F91.6010506@pengutronix.de>

Jean-Christophe PLAGNIOL-VILLARD wrote:
> that use the device name + id to found it's clock
> to use the right match as we fix the dev_name macro
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> ---
>  arch/arm/mach-nomadik/8815.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/mach-nomadik/8815.c b/arch/arm/mach-nomadik/8815.c
> index 8598f14..f1d5e8c 100644
> --- a/arch/arm/mach-nomadik/8815.c
> +++ b/arch/arm/mach-nomadik/8815.c
> @@ -50,12 +50,14 @@ void st8815_add_device_sdram(u32 size)
>  }
>  
>  static struct device_d uart0_serial_device = {
> +	id = 0,
        ^

you missed a dot, here.
>  	.name = "uart-pl011",
>  	.map_base = NOMADIK_UART0_BASE,
>  	.size = 4096,
>  };
>  
>  static struct device_d uart1_serial_device = {
> +	id = 1,
dito
>  	.name = "uart-pl011",
>  	.map_base = NOMADIK_UART1_BASE,
>  	.size = 4096,
> @@ -65,12 +67,12 @@ void st8815_register_uart(unsigned id)
>  {
>  	switch (id) {
>  	case 0:
> -		nmdk_clk_create(&st8815_clk_48, uart0_serial_device.name);
>  		register_device(&uart0_serial_device);
> +		nmdk_clk_create(&st8815_clk_48, dev_name(uart0_serial_device));
>  		break;
>  	case 1:
> -		nmdk_clk_create(&st8815_clk_48, uart1_serial_device.name);
>  		register_device(&uart1_serial_device);
> +		nmdk_clk_create(&st8815_clk_48, dev_name(uart0_serial_device));
>  		break;
>  	}
>  }

cheers, Marc


-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 260 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100830/4fff0d91/attachment.sig>

From plagnioj at jcrosoft.com  Mon Aug 30 03:37:42 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 30 Aug 2010 09:37:42 +0200
Subject: [PATCH 2/2] stm8815: fix the uart device clock match
In-Reply-To: <4C7B5F91.6010506@pengutronix.de>
References: <1283141106-21671-1-git-send-email-plagnioj@jcrosoft.com>
	<1283141106-21671-2-git-send-email-plagnioj@jcrosoft.com>
	<4C7B5F91.6010506@pengutronix.de>
Message-ID: <20100830073742.GC23081@game.jcrosoft.org>

On 09:36 Mon 30 Aug     , Marc Kleine-Budde wrote:
> Jean-Christophe PLAGNIOL-VILLARD wrote:
> > that use the device name + id to found it's clock
> > to use the right match as we fix the dev_name macro
> > 
> > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> > ---
> >  arch/arm/mach-nomadik/8815.c |    6 ++++--
> >  1 files changed, 4 insertions(+), 2 deletions(-)
> > 
> > diff --git a/arch/arm/mach-nomadik/8815.c b/arch/arm/mach-nomadik/8815.c
> > index 8598f14..f1d5e8c 100644
> > --- a/arch/arm/mach-nomadik/8815.c
> > +++ b/arch/arm/mach-nomadik/8815.c
> > @@ -50,12 +50,14 @@ void st8815_add_device_sdram(u32 size)
> >  }
> >  
> >  static struct device_d uart0_serial_device = {
> > +	id = 0,
>         ^
> 
> you missed a dot, here.
bad paste

Best Regards,
J.


From plagnioj at jcrosoft.com  Mon Aug 30 03:40:20 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Mon, 30 Aug 2010 09:40:20 +0200
Subject: [PATCH 2/2 v2] stm8815: fix the uart device clock match
In-Reply-To: <1283141106-21671-2-git-send-email-plagnioj@jcrosoft.com>
References: <1283141106-21671-2-git-send-email-plagnioj@jcrosoft.com>
Message-ID: <1283154020-9650-1-git-send-email-plagnioj@jcrosoft.com>

that use the device name + id to found it's clock
to use the right match as we fix the dev_name macro

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 arch/arm/mach-nomadik/8815.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/arm/mach-nomadik/8815.c b/arch/arm/mach-nomadik/8815.c
index 8598f14..e79c3a2 100644
--- a/arch/arm/mach-nomadik/8815.c
+++ b/arch/arm/mach-nomadik/8815.c
@@ -50,12 +50,14 @@ void st8815_add_device_sdram(u32 size)
 }
 
 static struct device_d uart0_serial_device = {
+	.id = 0,
 	.name = "uart-pl011",
 	.map_base = NOMADIK_UART0_BASE,
 	.size = 4096,
 };
 
 static struct device_d uart1_serial_device = {
+	.id = 1,
 	.name = "uart-pl011",
 	.map_base = NOMADIK_UART1_BASE,
 	.size = 4096,
@@ -65,12 +67,12 @@ void st8815_register_uart(unsigned id)
 {
 	switch (id) {
 	case 0:
-		nmdk_clk_create(&st8815_clk_48, uart0_serial_device.name);
 		register_device(&uart0_serial_device);
+		nmdk_clk_create(&st8815_clk_48, dev_name(uart0_serial_device));
 		break;
 	case 1:
-		nmdk_clk_create(&st8815_clk_48, uart1_serial_device.name);
 		register_device(&uart1_serial_device);
+		nmdk_clk_create(&st8815_clk_48, dev_name(uart0_serial_device));
 		break;
 	}
 }
-- 
1.7.1



From s.hauer at pengutronix.de  Mon Aug 30 15:12:25 2010
From: s.hauer at pengutronix.de (Sascha Hauer)
Date: Mon, 30 Aug 2010 21:12:25 +0200
Subject: v2010.09.0
Message-ID: <20100830191225.GN1473@pengutronix.de>

Hi all,

We have a new release: v2010.09.0. See the changelog attached to see
what happened since the last release. It's the first time a release is
out before the next month begins, that's because I'm off for holiday for
the next two weeks. I probably won't be able to answer any mails during
this time.

Have fun
 Sascha


The following changes since commit 68d0d31d41d9034a6246991ee1d486dc805ff479:

  Release v2010.08.0 (2010-08-03 09:30:32 +0200)

are available in the git repository at:
  git://git.pengutronix.de/git/barebox.git ..BRANCH.NOT.VERIFIED..

Baruch Siach (3):
      fs: add basic sanity check before accessing the files array
      md: fix help text
      cp: fix help text

Eric B?nard (2):
      eukrea_cpuimx35: fix board support
      eukrea_cpuimx25: update default config

Jean-Christophe PLAGNIOL-VILLARD (3):
      barebox_default_env: fix out of tree build
      move boards to arch/<architecure>/boards
      drivers/usb: regorganisation

Marc Kleine-Budde (3):
      defaultenv: fix physmap-flash device name
      defaultenv: fix adding of nand_parts
      defaultenv: create /dev/ram0.kernel at offset 8M

Michael Grzeschik (2):
      beagle: add missing nand headerfile
      omap clock: bugfix remove silicon offset sil_index

Nishanth Menon (1):
      omap3: add arch specific dcache invalidate

Sascha Hauer (23):
      omap: remove unused defines and corresponding kconfig options
      omap nand: cleanup
      beagle: Whitespace cleanup
      Add Garz+Fricke Neso support
      Add Garz+Fricke Neso defconfig
      crc32: activate crc32_no_comp (needed for jffs2 and UBI)
      move drivers/nand to drivers/mtd/nand
      add rbtree support (needed for ubi)
      add partition mtd support
      cfi_flash: Do not typedef struct flash_info
      cfi_flash: Do not print debug info while erasing
      cfi_flash: Add mtd partition support for UBI
      devfs: only check for ioctl function when needed
      include stuff missing for ubi
      add ubi support from u-boot. Just enough to compile and scan
      barebox ubi changes
      Add UBI commands: ubiattach, ubidetach, ubimkvol, ubirmvol
      Merge remote branch 'origin/guf-neso' into next
      Merge remote branch 'origin/omap' into next
      atmel_nand: fix comment where this code is derived from
      Merge branch 'next'
      pcm043: remove unused defines
      Release v2010.09.0

 Documentation/barebox-main.dox                     |    4 +-
 Makefile                                           |    8 +-
 TODO                                               |    3 +-
 arch/arm/Makefile                                  |    3 +-
 {board => arch/arm/boards}/a9m2410/Makefile        |    0
 {board => arch/arm/boards}/a9m2410/a9m2410.c       |    0
 {board => arch/arm/boards}/a9m2410/config.h        |    0
 {board => arch/arm/boards}/a9m2410/env/bin/_update |    0
 {board => arch/arm/boards}/a9m2410/env/bin/boot    |    0
 .../arm/boards}/a9m2410/env/bin/hush_hack          |    0
 {board => arch/arm/boards}/a9m2410/env/bin/init    |    0
 .../arm/boards}/a9m2410/env/bin/update_kernel      |    0
 .../arm/boards}/a9m2410/env/bin/update_root        |    0
 {board => arch/arm/boards}/a9m2410/env/config      |    0
 {board => arch/arm/boards}/a9m2410/lowlevel_init.S |    0
 {board => arch/arm/boards}/a9m2440/Makefile        |    0
 {board => arch/arm/boards}/a9m2440/a9m2410dev.c    |    0
 {board => arch/arm/boards}/a9m2440/a9m2440.c       |    0
 {board => arch/arm/boards}/a9m2440/baseboards.h    |    0
 {board => arch/arm/boards}/a9m2440/config.h        |    0
 {board => arch/arm/boards}/a9m2440/env/bin/_update |    0
 {board => arch/arm/boards}/a9m2440/env/bin/boot    |    0
 .../arm/boards}/a9m2440/env/bin/hush_hack          |    0
 {board => arch/arm/boards}/a9m2440/env/bin/init    |    0
 .../arm/boards}/a9m2440/env/bin/update_kernel      |    0
 .../arm/boards}/a9m2440/env/bin/update_root        |    0
 {board => arch/arm/boards}/a9m2440/env/config      |    0
 {board => arch/arm/boards}/a9m2440/lowlevel_init.S |    0
 {board => arch/arm/boards}/at91sam9260ek/Makefile  |    0
 {board => arch/arm/boards}/at91sam9260ek/config.h  |    0
 .../arm/boards}/at91sam9260ek/env/bin/_update      |    0
 .../arm/boards}/at91sam9260ek/env/bin/boot         |    0
 .../arm/boards}/at91sam9260ek/env/bin/init         |    0
 .../arm/boards}/at91sam9260ek/env/bin/pcidmaloop   |    0
 .../arm/boards}/at91sam9260ek/env/bin/pciloop      |    0
 .../boards}/at91sam9260ek/env/bin/update_kernel    |    0
 .../arm/boards}/at91sam9260ek/env/bin/update_root  |    0
 .../arm/boards}/at91sam9260ek/env/config           |    0
 {board => arch/arm/boards}/at91sam9260ek/init.c    |    0
 .../arm/boards}/at91sam9260ek/lowlevel_init.S      |    0
 {board => arch/arm/boards}/at91sam9263ek/Makefile  |    0
 {board => arch/arm/boards}/at91sam9263ek/config.h  |    0
 .../arm/boards}/at91sam9263ek/env/bin/_update      |    0
 .../arm/boards}/at91sam9263ek/env/bin/boot         |    0
 .../arm/boards}/at91sam9263ek/env/bin/hush_hack    |    0
 .../arm/boards}/at91sam9263ek/env/bin/init         |    0
 .../at91sam9263ek/env/bin/update_barebox_xmodem    |    0
 .../boards}/at91sam9263ek/env/bin/update_kernel    |    0
 .../arm/boards}/at91sam9263ek/env/bin/update_root  |    0
 .../arm/boards}/at91sam9263ek/env/config           |    0
 {board => arch/arm/boards}/at91sam9263ek/init.c    |    0
 {board => arch/arm/boards}/edb93xx/Makefile        |    0
 {board => arch/arm/boards}/edb93xx/config.h        |    0
 {board => arch/arm/boards}/edb93xx/early_udelay.h  |    0
 {board => arch/arm/boards}/edb93xx/edb93xx.c       |    0
 {board => arch/arm/boards}/edb93xx/edb93xx.dox     |    0
 {board => arch/arm/boards}/edb93xx/edb93xx.h       |    0
 {board => arch/arm/boards}/edb93xx/env/bin/boot    |    0
 .../arm/boards}/edb93xx/env/bin/flash_partition    |    0
 {board => arch/arm/boards}/edb93xx/env/bin/init    |    0
 .../arm/boards}/edb93xx/env/bin/set_nor_parts      |    0
 .../arm/boards}/edb93xx/env/bin/update_kernel      |    0
 .../arm/boards}/edb93xx/env/bin/update_rootfs      |    0
 {board => arch/arm/boards}/edb93xx/env/config      |    0
 {board => arch/arm/boards}/edb93xx/flash_cfg.c     |    0
 {board => arch/arm/boards}/edb93xx/pll_cfg.c       |    0
 {board => arch/arm/boards}/edb93xx/pll_cfg.h       |    0
 {board => arch/arm/boards}/edb93xx/sdram_cfg.c     |    0
 {board => arch/arm/boards}/edb93xx/sdram_cfg.h     |    0
 .../arm/boards}/eukrea_cpuimx25/Makefile           |    0
 .../arm/boards}/eukrea_cpuimx25/config.h           |    0
 .../arm/boards}/eukrea_cpuimx25/env/bin/_update    |    0
 .../arm/boards}/eukrea_cpuimx25/env/bin/boot       |    0
 .../arm/boards}/eukrea_cpuimx25/env/bin/hush_hack  |    0
 .../arm/boards}/eukrea_cpuimx25/env/bin/init       |    0
 .../boards}/eukrea_cpuimx25/env/bin/update_kernel  |    0
 .../boards}/eukrea_cpuimx25/env/bin/update_root    |    0
 .../arm/boards}/eukrea_cpuimx25/env/config         |    0
 .../arm/boards}/eukrea_cpuimx25/eukrea_cpuimx25.c  |    0
 .../arm/boards}/eukrea_cpuimx25/lowlevel.c         |    0
 .../arm/boards}/eukrea_cpuimx27/Makefile           |    0
 .../arm/boards}/eukrea_cpuimx27/config.h           |    0
 .../arm/boards}/eukrea_cpuimx27/env/bin/_update    |    0
 .../arm/boards}/eukrea_cpuimx27/env/bin/boot       |    0
 .../arm/boards}/eukrea_cpuimx27/env/bin/hush_hack  |    0
 .../arm/boards}/eukrea_cpuimx27/env/bin/init       |    0
 .../boards}/eukrea_cpuimx27/env/bin/update_kernel  |    0
 .../boards}/eukrea_cpuimx27/env/bin/update_root    |    0
 .../arm/boards}/eukrea_cpuimx27/env/config         |    0
 .../arm/boards}/eukrea_cpuimx27/eukrea_cpuimx27.c  |    0
 .../boards}/eukrea_cpuimx27/eukrea_cpuimx27.dox    |    0
 .../arm/boards}/eukrea_cpuimx27/lowlevel_init.S    |    0
 .../arm/boards}/eukrea_cpuimx35/Makefile           |    0
 .../arm/boards}/eukrea_cpuimx35/config.h           |    0
 .../arm/boards}/eukrea_cpuimx35/env/bin/_update    |    0
 .../arm/boards}/eukrea_cpuimx35/env/bin/boot       |    0
 .../arm/boards}/eukrea_cpuimx35/env/bin/hush_hack  |    0
 .../arm/boards}/eukrea_cpuimx35/env/bin/init       |    4 +
 .../boards}/eukrea_cpuimx35/env/bin/update_kernel  |    0
 .../boards}/eukrea_cpuimx35/env/bin/update_root    |    0
 .../arm/boards}/eukrea_cpuimx35/env/config         |    0
 .../arm/boards}/eukrea_cpuimx35/eukrea_cpuimx35.c  |   28 +-
 .../boards}/eukrea_cpuimx35/eukrea_cpuimx35.dox    |    0
 arch/arm/boards/eukrea_cpuimx35/flash_header.c     |   41 +
 .../arm/boards}/eukrea_cpuimx35/lowlevel.c         |   71 +-
 .../arm/boards}/freescale-mx25-3-stack/3stack.c    |    0
 .../arm/boards}/freescale-mx25-3-stack/Makefile    |    0
 .../arm/boards}/freescale-mx25-3-stack/config.h    |    0
 .../boards}/freescale-mx25-3-stack/env/bin/_update |    0
 .../boards}/freescale-mx25-3-stack/env/bin/boot    |    0
 .../freescale-mx25-3-stack/env/bin/hush_hack       |    0
 .../boards}/freescale-mx25-3-stack/env/bin/init    |    0
 .../freescale-mx25-3-stack/env/bin/update_kernel   |    0
 .../freescale-mx25-3-stack/env/bin/update_root     |    0
 .../arm/boards}/freescale-mx25-3-stack/env/config  |    0
 .../boards}/freescale-mx25-3-stack/lowlevel_init.S |    0
 .../arm/boards}/freescale-mx35-3-stack/3stack.c    |    0
 .../arm/boards}/freescale-mx35-3-stack/3stack.dox  |    0
 .../arm/boards}/freescale-mx35-3-stack/Makefile    |    0
 .../freescale-mx35-3-stack/board-mx35_3stack.h     |    0
 .../arm/boards}/freescale-mx35-3-stack/config.h    |    0
 .../boards}/freescale-mx35-3-stack/env/bin/_update |    0
 .../boards}/freescale-mx35-3-stack/env/bin/boot    |    0
 .../freescale-mx35-3-stack/env/bin/hush_hack       |    0
 .../boards}/freescale-mx35-3-stack/env/bin/init    |    0
 .../freescale-mx35-3-stack/env/bin/update_kernel   |    0
 .../freescale-mx35-3-stack/env/bin/update_rootfs   |    0
 .../arm/boards}/freescale-mx35-3-stack/env/config  |    0
 .../boards}/freescale-mx35-3-stack/flash_header.c  |    0
 .../boards}/freescale-mx35-3-stack/lowlevel_init.S |    0
 arch/arm/boards/guf-neso/Makefile                  |    5 +
 .../pcm038.c => arch/arm/boards/guf-neso/board.c   |  352 ++---
 .../pcm038 => arch/arm/boards/guf-neso}/config.h   |    0
 .../arm/boards/guf-neso}/env/config                |    7 +-
 .../pcm038 => arch/arm/boards/guf-neso}/lowlevel.c |    0
 .../pcm038 => arch/arm/boards/guf-neso}/pll_init.S |    4 +-
 {board => arch/arm/boards}/imx21ads/Makefile       |    0
 {board => arch/arm/boards}/imx21ads/config.h       |    0
 {board => arch/arm/boards}/imx21ads/env/bin/init   |    0
 {board => arch/arm/boards}/imx21ads/imx21ads.c     |    0
 {board => arch/arm/boards}/imx21ads/imx21ads.dox   |    0
 .../arm/boards}/imx21ads/lowlevel_init.S           |    0
 {board => arch/arm/boards}/imx27ads/Makefile       |    0
 {board => arch/arm/boards}/imx27ads/config.h       |    0
 .../arm/boards}/imx27ads/env/bin/_update           |    0
 {board => arch/arm/boards}/imx27ads/env/bin/boot   |    0
 {board => arch/arm/boards}/imx27ads/env/bin/init   |    0
 .../arm/boards}/imx27ads/env/bin/update_kernel     |    0
 .../arm/boards}/imx27ads/env/bin/update_root       |    0
 {board => arch/arm/boards}/imx27ads/env/config     |    0
 {board => arch/arm/boards}/imx27ads/imx27ads.c     |    0
 {board => arch/arm/boards}/imx27ads/imx27ads.dox   |    0
 .../arm/boards}/imx27ads/lowlevel_init.S           |    0
 {board => arch/arm/boards}/mmccpu/Makefile         |    0
 {board => arch/arm/boards}/mmccpu/config.h         |    0
 .../arm/boards/mmccpu}/env/bin/_update             |    0
 {board => arch/arm/boards}/mmccpu/env/bin/boot     |    0
 .../arm/boards}/mmccpu/env/bin/hush_hack           |    0
 {board => arch/arm/boards}/mmccpu/env/bin/init     |    0
 .../arm/boards}/mmccpu/env/bin/update_kernel       |    0
 .../arm/boards}/mmccpu/env/bin/update_root         |    0
 {board => arch/arm/boards}/mmccpu/env/config       |    0
 {board => arch/arm/boards}/mmccpu/init.c           |    0
 {board => arch/arm/boards}/netx/Makefile           |    0
 {board => arch/arm/boards}/netx/config.h           |    0
 {board => arch/arm/boards}/netx/netx.c             |    0
 {board => arch/arm/boards}/netx/netx.dox           |    0
 {board => arch/arm/boards}/netx/platform.S         |    0
 arch/arm/boards/omap/Kconfig                       |   93 ++
 {board => arch/arm/boards}/omap/Makefile           |    2 +-
 arch/arm/boards/omap/board-beagle.c                |  275 ++++
 {board => arch/arm/boards}/omap/board-omap3evm.c   |    4 +-
 {board => arch/arm/boards}/omap/board-sdp343x.c    |    2 +-
 {board => arch/arm/boards}/omap/board.h            |    2 +-
 {board => arch/arm/boards}/omap/config.h           |    7 +-
 .../arm/boards}/omap/devices-gpmc-nand.c           |   65 +-
 {board => arch/arm/boards}/omap/env/bin/init       |    0
 {board => arch/arm/boards}/omap/platform.S         |    2 +-
 {board => arch/arm/boards}/pcm037/Makefile         |    0
 {board => arch/arm/boards}/pcm037/config.h         |    0
 {board => arch/arm/boards}/pcm037/env/config       |    0
 {board => arch/arm/boards}/pcm037/lowlevel_init.S  |    0
 {board => arch/arm/boards}/pcm037/pcm037.c         |    0
 {board => arch/arm/boards}/pcm037/pcm037.dox       |    0
 {board => arch/arm/boards}/pcm038/Makefile         |    0
 .../arm/boards/pcm038}/config.h                    |    0
 {board => arch/arm/boards}/pcm038/env/config       |    0
 {board => arch/arm/boards}/pcm038/lowlevel.c       |    0
 {board => arch/arm/boards}/pcm038/pcm038.c         |    0
 {board => arch/arm/boards}/pcm038/pcm038.dox       |    0
 {board => arch/arm/boards}/pcm038/pll_init.S       |    0
 {board => arch/arm/boards}/pcm043/Makefile         |    0
 {board => arch/arm/boards}/pcm043/config.h         |    0
 {board => arch/arm/boards}/pcm043/env/config       |    0
 {board => arch/arm/boards}/pcm043/lowlevel.c       |    0
 {board => arch/arm/boards}/pcm043/pcm043.c         |    6 -
 {board => arch/arm/boards}/pcm043/pcm043.dox       |    0
 {board => arch/arm/boards}/phycard-i.MX27/Makefile |    0
 .../arm/boards/phycard-i.MX27}/config.h            |    0
 .../arm/boards}/phycard-i.MX27/env/config          |    0
 .../arm/boards}/phycard-i.MX27/lowlevel_init.S     |    0
 {board => arch/arm/boards}/phycard-i.MX27/pca100.c |    0
 .../arm/boards}/phycard-i.MX27/pca100.dox          |    0
 {board => arch/arm/boards}/pm9263/Makefile         |    0
 {board => arch/arm/boards}/pm9263/config.h         |    0
 .../arm/boards/pm9263}/env/bin/_update             |    0
 {board => arch/arm/boards}/pm9263/env/bin/boot     |    0
 .../arm/boards}/pm9263/env/bin/hush_hack           |    0
 {board => arch/arm/boards}/pm9263/env/bin/init     |    0
 .../arm/boards}/pm9263/env/bin/update_kernel       |    0
 .../arm/boards}/pm9263/env/bin/update_root         |    0
 {board => arch/arm/boards}/pm9263/env/config       |    0
 {board => arch/arm/boards}/pm9263/init.c           |    0
 {board => arch/arm/boards}/scb9328/Makefile        |    0
 {board => arch/arm/boards}/scb9328/config.h        |    0
 {board => arch/arm/boards}/scb9328/env/bin/init    |    0
 {board => arch/arm/boards}/scb9328/lowlevel_init.S |    0
 {board => arch/arm/boards}/scb9328/scb9328.c       |    0
 {board => arch/arm/boards}/scb9328/scb9328.dox     |    0
 arch/arm/configs/a9m2410_defconfig                 |    2 +-
 arch/arm/configs/a9m2440_defconfig                 |    2 +-
 arch/arm/configs/at91sam9260ek_defconfig           |    2 +-
 arch/arm/configs/at91sam9263ek_defconfig           |    2 +-
 arch/arm/configs/edb93xx_defconfig                 |    2 +-
 arch/arm/configs/eukrea_cpuimx25_defconfig         |   13 +-
 arch/arm/configs/eukrea_cpuimx27_defconfig         |    2 +-
 arch/arm/configs/eukrea_cpuimx35_defconfig         |   18 +-
 arch/arm/configs/freescale_mx25_3stack_defconfig   |    2 +-
 arch/arm/configs/freescale_mx35_3stack_defconfig   |    2 +-
 arch/arm/configs/mmccpu_defconfig                  |    2 +-
 arch/arm/configs/mx21ads_defconfig                 |    2 +-
 arch/arm/configs/mx27ads_defconfig                 |    2 +-
 arch/arm/configs/neso_defconfig                    |  264 +++
 arch/arm/configs/pca100_defconfig                  |    2 +-
 arch/arm/configs/pcm037_defconfig                  |    2 +-
 arch/arm/configs/pcm038_defconfig                  |    2 +-
 arch/arm/configs/pcm043_defconfig                  |    2 +-
 arch/arm/configs/pm9263_defconfig                  |    2 +-
 arch/arm/configs/scb9328_defconfig                 |    2 +-
 arch/arm/include/asm/barebox-arm.h                 |    2 +-
 arch/arm/mach-imx/Kconfig                          |   10 +
 arch/arm/mach-omap/Kconfig                         |   16 +-
 arch/arm/mach-omap/arch-omap.dox                   |    8 +-
 arch/arm/mach-omap/include/mach/gpmc_nand.h        |   45 +-
 arch/arm/mach-omap/omap3_clock.c                   |   10 +-
 arch/arm/mach-omap/omap3_core.S                    |   43 +
 arch/arm/mach-s3c24xx/generic.c                    |    4 +-
 arch/blackfin/Makefile                             |    2 +-
 {board => arch/blackfin/boards}/ipe337/Makefile    |    0
 .../blackfin/boards}/ipe337/barebox.lds.S          |    0
 .../blackfin/boards}/ipe337/cmd_alternate.c        |    0
 {board => arch/blackfin/boards}/ipe337/config.h    |    0
 .../blackfin/boards}/ipe337/env/bin/_alternate     |    0
 .../blackfin/boards}/ipe337/env/bin/_update        |    0
 .../blackfin/boards}/ipe337/env/bin/boot           |    0
 .../blackfin/boards}/ipe337/env/bin/init           |    0
 .../blackfin/boards}/ipe337/env/bin/magic.bin      |  Bin 4 -> 4 bytes
 .../blackfin/boards}/ipe337/env/bin/reset_ageing   |    0
 .../boards}/ipe337/env/bin/update_application      |    0
 .../boards}/ipe337/env/bin/update_bareboxenv       |    0
 .../blackfin/boards}/ipe337/env/bin/update_kernel  |    0
 .../boards}/ipe337/env/bin/update_persistent       |    0
 .../blackfin/boards}/ipe337/env/bin/update_system  |    0
 {board => arch/blackfin/boards}/ipe337/env/config  |    0
 {board => arch/blackfin/boards}/ipe337/ipe337.c    |    0
 {board => arch/blackfin/boards}/ipe337/ipe337.dox  |    0
 arch/blackfin/configs/ipe337_defconfig             |    2 +-
 arch/m68k/Makefile                                 |    2 +-
 {board => arch/m68k/boards}/kp_ukd_r1_num/Makefile |    0
 .../m68k/boards/kp_ukd_r1_num}/env/bin/_update     |    0
 .../m68k/boards}/kp_ukd_r1_num/env/bin/boot        |    0
 .../m68k/boards}/kp_ukd_r1_num/env/bin/init        |    0
 .../m68k/boards}/kp_ukd_r1_num/env/bin/pcidmaloop  |    0
 .../m68k/boards}/kp_ukd_r1_num/env/bin/pciloop     |    0
 .../boards}/kp_ukd_r1_num/env/bin/update_kernel    |    0
 .../m68k/boards}/kp_ukd_r1_num/env/bin/update_root |    0
 .../m68k/boards}/kp_ukd_r1_num/env/config          |    0
 .../m68k/boards}/kp_ukd_r1_num/highlevel_init.c    |    0
 .../m68k/boards}/kp_ukd_r1_num/kp_ukd_r1_num.c     |    0
 .../m68k/boards}/kp_ukd_r1_num/kp_ukd_r1_num.dox   |    0
 .../m68k/boards}/kp_ukd_r1_num/lowlevel_init.c     |    0
 .../m68k/boards}/kp_ukd_r1_num/pci-stubs.c         |    0
 .../m68k/boards}/phycore_mcf54xx/Makefile          |    0
 .../m68k/boards/phycore_mcf54xx}/env/bin/_update   |    0
 .../m68k/boards}/phycore_mcf54xx/env/bin/boot      |    0
 .../m68k/boards}/phycore_mcf54xx/env/bin/init      |    0
 .../boards}/phycore_mcf54xx/env/bin/pcidmaloop     |    0
 .../m68k/boards}/phycore_mcf54xx/env/bin/pciloop   |    0
 .../boards}/phycore_mcf54xx/env/bin/update_kernel  |    0
 .../boards}/phycore_mcf54xx/env/bin/update_root    |    0
 .../m68k/boards}/phycore_mcf54xx/env/config        |    0
 .../m68k/boards}/phycore_mcf54xx/highlevel_init.c  |    0
 .../m68k/boards}/phycore_mcf54xx/lowlevel_init.c   |    0
 .../m68k/boards}/phycore_mcf54xx/pci-stubs.c       |    0
 .../m68k/boards}/phycore_mcf54xx/phyCore_MCF54xx.c |    0
 .../boards}/phycore_mcf54xx/phyCore_MCF54xx.dox    |    0
 .../m68k/configs/phycore_kpukdr1_5475num_defconfig |    2 +-
 arch/m68k/configs/phycore_mcf54xx_defconfig        |    2 +-
 arch/ppc/Makefile                                  |    2 +-
 {board => arch/ppc/boards}/pcm030/Makefile         |    0
 {board => arch/ppc/boards}/pcm030/barebox.lds.S    |    0
 {board => arch/ppc/boards}/pcm030/config.h         |    0
 {board => arch/ppc/boards}/pcm030/mt46v32m16-75.h  |    0
 {board => arch/ppc/boards}/pcm030/pcm030.c         |    0
 {board => arch/ppc/boards}/pcm030/pcm030.dox       |    0
 arch/sandbox/Makefile                              |   10 +-
 {board/sandbox => arch/sandbox/board}/.gitignore   |    0
 {board/sandbox => arch/sandbox/board}/Makefile     |    0
 .../sandbox => arch/sandbox/board}/barebox.lds.S   |    0
 {board/sandbox => arch/sandbox/board}/board.c      |    0
 {board/sandbox => arch/sandbox/board}/clock.c      |    0
 {board/sandbox => arch/sandbox/board}/config.h     |    0
 {board/sandbox => arch/sandbox/board}/console.c    |    0
 {board/sandbox => arch/sandbox/board}/env/bin/init |    0
 {board/sandbox => arch/sandbox/board}/env/config   |    0
 {board/sandbox => arch/sandbox/board}/hostfile.c   |    0
 arch/sandbox/configs/sandbox_defconfig             |    2 +-
 arch/x86/Makefile                                  |    2 +-
 {board => arch/x86/boards}/x86_generic/Makefile    |    0
 {board => arch/x86/boards}/x86_generic/config.h    |    0
 .../x86/boards}/x86_generic/env/bin/boot           |    0
 .../x86/boards}/x86_generic/env/bin/init           |    0
 {board => arch/x86/boards}/x86_generic/env/config  |    0
 .../x86/boards}/x86_generic/generic_pc.c           |    0
 arch/x86/configs/generic_defconfig                 |    2 +-
 board/board.dox                                    |   16 +-
 board/eukrea_cpuimx35/flash_header.c               |   60 -
 board/omap/Kconfig                                 |  162 --
 board/omap/board-beagle.c                          |  270 ----
 commands/Kconfig                                   |    6 +
 commands/Makefile                                  |    1 +
 commands/cp.c                                      |    2 -
 commands/mem.c                                     |    1 -
 commands/ubi.c                                     |  129 ++
 common/Makefile                                    |    8 +-
 defaultenv/bin/boot                                |    6 +-
 drivers/Kconfig                                    |    2 +-
 drivers/Makefile                                   |    2 +-
 drivers/mtd/Kconfig                                |    9 +
 drivers/mtd/Makefile                               |    3 +
 drivers/{ => mtd}/nand/Kconfig                     |   10 +-
 drivers/{ => mtd}/nand/Makefile                    |    0
 drivers/{ => mtd}/nand/atmel_nand.c                |    4 +-
 drivers/{ => mtd}/nand/atmel_nand_ecc.h            |    0
 drivers/{ => mtd}/nand/diskonchip.c                |    0
 drivers/{ => mtd}/nand/nand.c                      |    2 +
 drivers/{ => mtd}/nand/nand_base.c                 |    0
 drivers/{ => mtd}/nand/nand_bbt.c                  |    0
 drivers/{ => mtd}/nand/nand_ecc.c                  |    0
 drivers/{ => mtd}/nand/nand_ids.c                  |    0
 drivers/{ => mtd}/nand/nand_imx.c                  |    0
 drivers/{ => mtd}/nand/nand_omap_gpmc.c            |  103 +-
 drivers/{ => mtd}/nand/nand_s3c2410.c              |    0
 drivers/{ => mtd}/nand/nand_util.c                 |    0
 drivers/mtd/partition.c                            |  143 ++
 drivers/mtd/ubi/Kconfig                            |    6 +
 drivers/mtd/ubi/Makefile                           |    3 +
 drivers/mtd/ubi/build.c                            | 1059 +++++++++++++
 drivers/mtd/ubi/cdev.c                             |  238 +++
 drivers/mtd/ubi/crc32defs.h                        |   32 +
 drivers/mtd/ubi/debug.c                            |  192 +++
 drivers/mtd/ubi/debug.h                            |  152 ++
 drivers/mtd/ubi/eba.c                              | 1256 +++++++++++++++
 drivers/mtd/ubi/io.c                               | 1274 +++++++++++++++
 drivers/mtd/ubi/kapi.c                             |  638 ++++++++
 drivers/mtd/ubi/misc.c                             |  106 ++
 drivers/mtd/ubi/scan.c                             | 1362 ++++++++++++++++
 drivers/mtd/ubi/scan.h                             |  165 ++
 drivers/mtd/ubi/ubi-barebox.h                      |  191 +++
 drivers/mtd/ubi/ubi-media.h                        |  372 +++++
 drivers/mtd/ubi/ubi.h                              |  648 ++++++++
 drivers/mtd/ubi/upd.c                              |  445 ++++++
 drivers/mtd/ubi/vmt.c                              |  866 ++++++++++
 drivers/mtd/ubi/vtbl.c                             |  837 ++++++++++
 drivers/mtd/ubi/wl.c                               | 1675 ++++++++++++++++++++
 drivers/nor/cfi_flash.c                            |  143 ++-
 drivers/nor/cfi_flash.h                            |   55 +-
 drivers/nor/cfi_flash_amd.c                        |   14 +-
 drivers/nor/cfi_flash_intel.c                      |   12 +-
 drivers/usb/Kconfig                                |   10 +-
 drivers/usb/Makefile                               |    7 +-
 drivers/usb/core/Makefile                          |    2 +
 drivers/usb/{ => core}/usb.c                       |    0
 drivers/usb/host/Kconfig                           |    2 +
 drivers/usb/host/Makefile                          |    1 +
 drivers/usb/{usb_ehci_core.h => host/ehci-core.h}  |    0
 drivers/usb/{usb_ehci_core.c => host/ehci-hcd.c}   |    2 +-
 drivers/usb/{usb_ehci.h => host/ehci.h}            |    0
 drivers/usb/otg/Kconfig                            |    6 +
 drivers/usb/otg/Makefile                           |    2 +
 drivers/usb/{ => otg}/isp1504.c                    |    0
 drivers/usb/{ => otg}/ulpi.c                       |    0
 fs/Kconfig                                         |    3 +
 fs/devfs.c                                         |   46 +-
 fs/fs.c                                            |   34 +
 include/common.h                                   |    4 +-
 include/driver.h                                   |    1 +
 include/linux/mtd/mtd-abi.h                        |    1 +
 include/linux/mtd/mtd.h                            |   13 +
 include/linux/mtd/ubi.h                            |  186 +++
 include/linux/rbtree.h                             |  160 ++
 include/mtd/ubi-user.h                             |  300 ++++
 lib/Makefile                                       |    1 +
 lib/crc32.c                                        |   11 +-
 lib/rbtree.c                                       |  389 +++++
 scripts/genenv                                     |    8 +-
 406 files changed, 14262 insertions(+), 1090 deletions(-)
 rename {board => arch/arm/boards}/a9m2410/Makefile (100%)
 rename {board => arch/arm/boards}/a9m2410/a9m2410.c (100%)
 rename {board => arch/arm/boards}/a9m2410/config.h (100%)
 rename {board => arch/arm/boards}/a9m2410/env/bin/_update (100%)
 rename {board => arch/arm/boards}/a9m2410/env/bin/boot (100%)
 rename {board => arch/arm/boards}/a9m2410/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/a9m2410/env/bin/init (100%)
 rename {board => arch/arm/boards}/a9m2410/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/a9m2410/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/a9m2410/env/config (100%)
 rename {board => arch/arm/boards}/a9m2410/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/a9m2440/Makefile (100%)
 rename {board => arch/arm/boards}/a9m2440/a9m2410dev.c (100%)
 rename {board => arch/arm/boards}/a9m2440/a9m2440.c (100%)
 rename {board => arch/arm/boards}/a9m2440/baseboards.h (100%)
 rename {board => arch/arm/boards}/a9m2440/config.h (100%)
 rename {board => arch/arm/boards}/a9m2440/env/bin/_update (100%)
 rename {board => arch/arm/boards}/a9m2440/env/bin/boot (100%)
 rename {board => arch/arm/boards}/a9m2440/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/a9m2440/env/bin/init (100%)
 rename {board => arch/arm/boards}/a9m2440/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/a9m2440/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/a9m2440/env/config (100%)
 rename {board => arch/arm/boards}/a9m2440/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/Makefile (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/config.h (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/env/bin/_update (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/env/bin/boot (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/env/bin/init (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/env/bin/pcidmaloop (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/env/bin/pciloop (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/env/config (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/init.c (100%)
 rename {board => arch/arm/boards}/at91sam9260ek/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/Makefile (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/config.h (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/env/bin/_update (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/env/bin/boot (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/env/bin/init (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/env/bin/update_barebox_xmodem (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/env/config (100%)
 rename {board => arch/arm/boards}/at91sam9263ek/init.c (100%)
 rename {board => arch/arm/boards}/edb93xx/Makefile (100%)
 rename {board => arch/arm/boards}/edb93xx/config.h (100%)
 rename {board => arch/arm/boards}/edb93xx/early_udelay.h (100%)
 rename {board => arch/arm/boards}/edb93xx/edb93xx.c (100%)
 rename {board => arch/arm/boards}/edb93xx/edb93xx.dox (100%)
 rename {board => arch/arm/boards}/edb93xx/edb93xx.h (100%)
 rename {board => arch/arm/boards}/edb93xx/env/bin/boot (100%)
 rename {board => arch/arm/boards}/edb93xx/env/bin/flash_partition (100%)
 rename {board => arch/arm/boards}/edb93xx/env/bin/init (100%)
 rename {board => arch/arm/boards}/edb93xx/env/bin/set_nor_parts (100%)
 rename {board => arch/arm/boards}/edb93xx/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/edb93xx/env/bin/update_rootfs (100%)
 rename {board => arch/arm/boards}/edb93xx/env/config (100%)
 rename {board => arch/arm/boards}/edb93xx/flash_cfg.c (100%)
 rename {board => arch/arm/boards}/edb93xx/pll_cfg.c (100%)
 rename {board => arch/arm/boards}/edb93xx/pll_cfg.h (100%)
 rename {board => arch/arm/boards}/edb93xx/sdram_cfg.c (100%)
 rename {board => arch/arm/boards}/edb93xx/sdram_cfg.h (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/Makefile (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/config.h (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/env/bin/_update (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/env/bin/boot (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/env/bin/init (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/env/config (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/eukrea_cpuimx25.c (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx25/lowlevel.c (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/Makefile (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/config.h (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/env/bin/_update (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/env/bin/boot (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/env/bin/init (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/env/config (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/eukrea_cpuimx27.c (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/eukrea_cpuimx27.dox (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx27/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/Makefile (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/config.h (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/env/bin/_update (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/env/bin/boot (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/env/bin/init (91%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/env/config (100%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/eukrea_cpuimx35.c (95%)
 rename {board => arch/arm/boards}/eukrea_cpuimx35/eukrea_cpuimx35.dox (100%)
 create mode 100644 arch/arm/boards/eukrea_cpuimx35/flash_header.c
 rename {board => arch/arm/boards}/eukrea_cpuimx35/lowlevel.c (72%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/3stack.c (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/Makefile (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/config.h (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/env/bin/_update (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/env/bin/boot (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/env/bin/init (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/env/config (100%)
 rename {board => arch/arm/boards}/freescale-mx25-3-stack/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/3stack.c (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/3stack.dox (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/Makefile (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/board-mx35_3stack.h (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/config.h (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/env/bin/_update (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/env/bin/boot (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/env/bin/init (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/env/bin/update_rootfs (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/env/config (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/flash_header.c (100%)
 rename {board => arch/arm/boards}/freescale-mx35-3-stack/lowlevel_init.S (100%)
 create mode 100644 arch/arm/boards/guf-neso/Makefile
 copy board/pcm038/pcm038.c => arch/arm/boards/guf-neso/board.c (52%)
 copy {board/pcm038 => arch/arm/boards/guf-neso}/config.h (100%)
 copy {board/phycard-i.MX27 => arch/arm/boards/guf-neso}/env/config (91%)
 copy {board/pcm038 => arch/arm/boards/guf-neso}/lowlevel.c (100%)
 copy {board/pcm038 => arch/arm/boards/guf-neso}/pll_init.S (94%)
 rename {board => arch/arm/boards}/imx21ads/Makefile (100%)
 rename {board => arch/arm/boards}/imx21ads/config.h (100%)
 rename {board => arch/arm/boards}/imx21ads/env/bin/init (100%)
 rename {board => arch/arm/boards}/imx21ads/imx21ads.c (100%)
 rename {board => arch/arm/boards}/imx21ads/imx21ads.dox (100%)
 rename {board => arch/arm/boards}/imx21ads/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/imx27ads/Makefile (100%)
 rename {board => arch/arm/boards}/imx27ads/config.h (100%)
 rename {board => arch/arm/boards}/imx27ads/env/bin/_update (100%)
 rename {board => arch/arm/boards}/imx27ads/env/bin/boot (100%)
 rename {board => arch/arm/boards}/imx27ads/env/bin/init (100%)
 rename {board => arch/arm/boards}/imx27ads/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/imx27ads/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/imx27ads/env/config (100%)
 rename {board => arch/arm/boards}/imx27ads/imx27ads.c (100%)
 rename {board => arch/arm/boards}/imx27ads/imx27ads.dox (100%)
 rename {board => arch/arm/boards}/imx27ads/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/mmccpu/Makefile (100%)
 rename {board => arch/arm/boards}/mmccpu/config.h (100%)
 rename {board/kp_ukd_r1_num => arch/arm/boards/mmccpu}/env/bin/_update (100%)
 rename {board => arch/arm/boards}/mmccpu/env/bin/boot (100%)
 rename {board => arch/arm/boards}/mmccpu/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/mmccpu/env/bin/init (100%)
 rename {board => arch/arm/boards}/mmccpu/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/mmccpu/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/mmccpu/env/config (100%)
 rename {board => arch/arm/boards}/mmccpu/init.c (100%)
 rename {board => arch/arm/boards}/netx/Makefile (100%)
 rename {board => arch/arm/boards}/netx/config.h (100%)
 rename {board => arch/arm/boards}/netx/netx.c (100%)
 rename {board => arch/arm/boards}/netx/netx.dox (100%)
 rename {board => arch/arm/boards}/netx/platform.S (100%)
 create mode 100644 arch/arm/boards/omap/Kconfig
 rename {board => arch/arm/boards}/omap/Makefile (94%)
 create mode 100644 arch/arm/boards/omap/board-beagle.c
 rename {board => arch/arm/boards}/omap/board-omap3evm.c (98%)
 rename {board => arch/arm/boards}/omap/board-sdp343x.c (99%)
 rename {board => arch/arm/boards}/omap/board.h (96%)
 rename {board => arch/arm/boards}/omap/config.h (82%)
 rename {board => arch/arm/boards}/omap/devices-gpmc-nand.c (60%)
 rename {board => arch/arm/boards}/omap/env/bin/init (100%)
 rename {board => arch/arm/boards}/omap/platform.S (97%)
 rename {board => arch/arm/boards}/pcm037/Makefile (100%)
 rename {board => arch/arm/boards}/pcm037/config.h (100%)
 rename {board => arch/arm/boards}/pcm037/env/config (100%)
 rename {board => arch/arm/boards}/pcm037/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/pcm037/pcm037.c (100%)
 rename {board => arch/arm/boards}/pcm037/pcm037.dox (100%)
 rename {board => arch/arm/boards}/pcm038/Makefile (100%)
 rename {board/phycard-i.MX27 => arch/arm/boards/pcm038}/config.h (100%)
 rename {board => arch/arm/boards}/pcm038/env/config (100%)
 rename {board => arch/arm/boards}/pcm038/lowlevel.c (100%)
 rename {board => arch/arm/boards}/pcm038/pcm038.c (100%)
 rename {board => arch/arm/boards}/pcm038/pcm038.dox (100%)
 rename {board => arch/arm/boards}/pcm038/pll_init.S (100%)
 rename {board => arch/arm/boards}/pcm043/Makefile (100%)
 rename {board => arch/arm/boards}/pcm043/config.h (100%)
 rename {board => arch/arm/boards}/pcm043/env/config (100%)
 rename {board => arch/arm/boards}/pcm043/lowlevel.c (100%)
 rename {board => arch/arm/boards}/pcm043/pcm043.c (97%)
 rename {board => arch/arm/boards}/pcm043/pcm043.dox (100%)
 rename {board => arch/arm/boards}/phycard-i.MX27/Makefile (100%)
 rename {board/pcm038 => arch/arm/boards/phycard-i.MX27}/config.h (100%)
 rename {board => arch/arm/boards}/phycard-i.MX27/env/config (100%)
 rename {board => arch/arm/boards}/phycard-i.MX27/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/phycard-i.MX27/pca100.c (100%)
 rename {board => arch/arm/boards}/phycard-i.MX27/pca100.dox (100%)
 rename {board => arch/arm/boards}/pm9263/Makefile (100%)
 rename {board => arch/arm/boards}/pm9263/config.h (100%)
 rename {board/mmccpu => arch/arm/boards/pm9263}/env/bin/_update (100%)
 rename {board => arch/arm/boards}/pm9263/env/bin/boot (100%)
 rename {board => arch/arm/boards}/pm9263/env/bin/hush_hack (100%)
 rename {board => arch/arm/boards}/pm9263/env/bin/init (100%)
 rename {board => arch/arm/boards}/pm9263/env/bin/update_kernel (100%)
 rename {board => arch/arm/boards}/pm9263/env/bin/update_root (100%)
 rename {board => arch/arm/boards}/pm9263/env/config (100%)
 rename {board => arch/arm/boards}/pm9263/init.c (100%)
 rename {board => arch/arm/boards}/scb9328/Makefile (100%)
 rename {board => arch/arm/boards}/scb9328/config.h (100%)
 rename {board => arch/arm/boards}/scb9328/env/bin/init (100%)
 rename {board => arch/arm/boards}/scb9328/lowlevel_init.S (100%)
 rename {board => arch/arm/boards}/scb9328/scb9328.c (100%)
 rename {board => arch/arm/boards}/scb9328/scb9328.dox (100%)
 create mode 100644 arch/arm/configs/neso_defconfig
 rename {board => arch/blackfin/boards}/ipe337/Makefile (100%)
 rename {board => arch/blackfin/boards}/ipe337/barebox.lds.S (100%)
 rename {board => arch/blackfin/boards}/ipe337/cmd_alternate.c (100%)
 rename {board => arch/blackfin/boards}/ipe337/config.h (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/_alternate (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/_update (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/boot (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/init (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/magic.bin (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/reset_ageing (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/update_application (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/update_bareboxenv (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/update_kernel (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/update_persistent (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/bin/update_system (100%)
 rename {board => arch/blackfin/boards}/ipe337/env/config (100%)
 rename {board => arch/blackfin/boards}/ipe337/ipe337.c (100%)
 rename {board => arch/blackfin/boards}/ipe337/ipe337.dox (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/Makefile (100%)
 rename {board/phycore_mcf54xx => arch/m68k/boards/kp_ukd_r1_num}/env/bin/_update (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/env/bin/boot (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/env/bin/init (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/env/bin/pcidmaloop (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/env/bin/pciloop (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/env/bin/update_kernel (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/env/bin/update_root (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/env/config (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/highlevel_init.c (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/kp_ukd_r1_num.c (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/kp_ukd_r1_num.dox (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/lowlevel_init.c (100%)
 rename {board => arch/m68k/boards}/kp_ukd_r1_num/pci-stubs.c (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/Makefile (100%)
 rename {board/pm9263 => arch/m68k/boards/phycore_mcf54xx}/env/bin/_update (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/env/bin/boot (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/env/bin/init (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/env/bin/pcidmaloop (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/env/bin/pciloop (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/env/bin/update_kernel (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/env/bin/update_root (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/env/config (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/highlevel_init.c (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/lowlevel_init.c (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/pci-stubs.c (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/phyCore_MCF54xx.c (100%)
 rename {board => arch/m68k/boards}/phycore_mcf54xx/phyCore_MCF54xx.dox (100%)
 rename {board => arch/ppc/boards}/pcm030/Makefile (100%)
 rename {board => arch/ppc/boards}/pcm030/barebox.lds.S (100%)
 rename {board => arch/ppc/boards}/pcm030/config.h (100%)
 rename {board => arch/ppc/boards}/pcm030/mt46v32m16-75.h (100%)
 rename {board => arch/ppc/boards}/pcm030/pcm030.c (100%)
 rename {board => arch/ppc/boards}/pcm030/pcm030.dox (100%)
 rename {board/sandbox => arch/sandbox/board}/.gitignore (100%)
 rename {board/sandbox => arch/sandbox/board}/Makefile (100%)
 rename {board/sandbox => arch/sandbox/board}/barebox.lds.S (100%)
 rename {board/sandbox => arch/sandbox/board}/board.c (100%)
 rename {board/sandbox => arch/sandbox/board}/clock.c (100%)
 rename {board/sandbox => arch/sandbox/board}/config.h (100%)
 rename {board/sandbox => arch/sandbox/board}/console.c (100%)
 rename {board/sandbox => arch/sandbox/board}/env/bin/init (100%)
 rename {board/sandbox => arch/sandbox/board}/env/config (100%)
 rename {board/sandbox => arch/sandbox/board}/hostfile.c (100%)
 rename {board => arch/x86/boards}/x86_generic/Makefile (100%)
 rename {board => arch/x86/boards}/x86_generic/config.h (100%)
 rename {board => arch/x86/boards}/x86_generic/env/bin/boot (100%)
 rename {board => arch/x86/boards}/x86_generic/env/bin/init (100%)
 rename {board => arch/x86/boards}/x86_generic/env/config (100%)
 rename {board => arch/x86/boards}/x86_generic/generic_pc.c (100%)
 delete mode 100644 board/eukrea_cpuimx35/flash_header.c
 delete mode 100644 board/omap/Kconfig
 delete mode 100644 board/omap/board-beagle.c
 create mode 100644 commands/ubi.c
 create mode 100644 drivers/mtd/Kconfig
 create mode 100644 drivers/mtd/Makefile
 rename drivers/{ => mtd}/nand/Kconfig (92%)
 rename drivers/{ => mtd}/nand/Makefile (100%)
 rename drivers/{ => mtd}/nand/atmel_nand.c (99%)
 rename drivers/{ => mtd}/nand/atmel_nand_ecc.h (100%)
 rename drivers/{ => mtd}/nand/diskonchip.c (100%)
 rename drivers/{ => mtd}/nand/nand.c (99%)
 rename drivers/{ => mtd}/nand/nand_base.c (100%)
 rename drivers/{ => mtd}/nand/nand_bbt.c (100%)
 rename drivers/{ => mtd}/nand/nand_ecc.c (100%)
 rename drivers/{ => mtd}/nand/nand_ids.c (100%)
 rename drivers/{ => mtd}/nand/nand_imx.c (100%)
 rename drivers/{ => mtd}/nand/nand_omap_gpmc.c (90%)
 rename drivers/{ => mtd}/nand/nand_s3c2410.c (100%)
 rename drivers/{ => mtd}/nand/nand_util.c (100%)
 create mode 100644 drivers/mtd/partition.c
 create mode 100644 drivers/mtd/ubi/Kconfig
 create mode 100644 drivers/mtd/ubi/Makefile
 create mode 100644 drivers/mtd/ubi/build.c
 create mode 100644 drivers/mtd/ubi/cdev.c
 create mode 100644 drivers/mtd/ubi/crc32defs.h
 create mode 100644 drivers/mtd/ubi/debug.c
 create mode 100644 drivers/mtd/ubi/debug.h
 create mode 100644 drivers/mtd/ubi/eba.c
 create mode 100644 drivers/mtd/ubi/io.c
 create mode 100644 drivers/mtd/ubi/kapi.c
 create mode 100644 drivers/mtd/ubi/misc.c
 create mode 100644 drivers/mtd/ubi/scan.c
 create mode 100644 drivers/mtd/ubi/scan.h
 create mode 100644 drivers/mtd/ubi/ubi-barebox.h
 create mode 100644 drivers/mtd/ubi/ubi-media.h
 create mode 100644 drivers/mtd/ubi/ubi.h
 create mode 100644 drivers/mtd/ubi/upd.c
 create mode 100644 drivers/mtd/ubi/vmt.c
 create mode 100644 drivers/mtd/ubi/vtbl.c
 create mode 100644 drivers/mtd/ubi/wl.c
 create mode 100644 drivers/usb/core/Makefile
 rename drivers/usb/{ => core}/usb.c (100%)
 create mode 100644 drivers/usb/host/Kconfig
 create mode 100644 drivers/usb/host/Makefile
 rename drivers/usb/{usb_ehci_core.h => host/ehci-core.h} (100%)
 rename drivers/usb/{usb_ehci_core.c => host/ehci-hcd.c} (99%)
 rename drivers/usb/{usb_ehci.h => host/ehci.h} (100%)
 create mode 100644 drivers/usb/otg/Kconfig
 create mode 100644 drivers/usb/otg/Makefile
 rename drivers/usb/{ => otg}/isp1504.c (100%)
 rename drivers/usb/{ => otg}/ulpi.c (100%)
 create mode 100644 include/linux/mtd/ubi.h
 create mode 100644 include/linux/rbtree.h
 create mode 100644 include/mtd/ubi-user.h
 create mode 100644 lib/rbtree.c
-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |


From natarajsn at gmail.com  Tue Aug 31 00:47:40 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Tue, 31 Aug 2010 10:17:40 +0530
Subject: barebox as first stage bootloader
Message-ID: <AANLkTimqR7T24m3NSz5+tBje7CrtUHLwVJ8khJ=wg9iL@mail.gmail.com>

Hi

Is it possible to use barebox as a first stage boot loader replacing
"nandflash_at91sam9263ek.bin"?

I tried to put barebox.bin onto 0x0 in Nand flash using sam-ba, but sam-ba
complains about huge file size.

warm regards

Nataraj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100831/672d016a/attachment.html>

From plagnioj at jcrosoft.com  Tue Aug 31 00:53:55 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue, 31 Aug 2010 06:53:55 +0200
Subject: barebox as first stage bootloader
In-Reply-To: <AANLkTimqR7T24m3NSz5+tBje7CrtUHLwVJ8khJ=wg9iL@mail.gmail.com>
References: <AANLkTimqR7T24m3NSz5+tBje7CrtUHLwVJ8khJ=wg9iL@mail.gmail.com>
Message-ID: <20100831045355.GM23081@game.jcrosoft.org>

Hi,

	yes for sure I use it on my 9263ek in the past but I use a ICE not
	sam-ba tool

	maybe to need to load in ddr a small version of barebox and then flash
	it by download it via ethernet or serial

Best Regards,
J.
On 10:17 Tue 31 Aug     , Nataraj S Narayan wrote:
>    Hi
> 
>    Is it possible to use barebox as a first stage boot loader replacing
>    "nandflash_at91sam9263ek.bin"?
> 
>    I tried to put barebox.bin onto 0x0 in Nand flash using sam-ba, but sam-ba
>    complains about huge file size.
> 
>    warm regards
> 
>    Nataraj

> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox



From plagnioj at jcrosoft.com  Tue Aug 31 00:56:28 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue, 31 Aug 2010 06:56:28 +0200
Subject: Applications
Message-ID: <20100831045628.GN23081@game.jcrosoft.org>

Hi,

	I'd like to known what is the status of the formal u-boot application
	in barebox?

Best Regards,
J.


From natarajsn at gmail.com  Tue Aug 31 01:16:47 2010
From: natarajsn at gmail.com (Nataraj S Narayan)
Date: Tue, 31 Aug 2010 10:46:47 +0530
Subject: barebox :i2c error
Message-ID: <AANLkTimX=cnQKO78ejygmv-1m6LzcUfmKO20Cg_waz-9@mail.gmail.com>

Hi

On commit 3d5d2279c0c5d3a7e83f94d98434c1cf29e35311.

root at debian:/software/barebox# make ARCH=arm
CROSS_COMPILE=/armbin/arm-linux-
make[1]: `arch/arm/include/asm/mach-types.h' is up to date.
  CHK     include/linux/version.h
  CHK     include/linux/utsrelease.h
  SYMLINK include/config.h -> arch/arm/boards/at91sam9263ek//config.h
  CC      drivers/i2c/i2c.o
drivers/i2c/i2c.c:375: error: 'i2c_register_master' undeclared here (not in
a function)
drivers/i2c/i2c.c:375: warning: type defaults to 'int' in declaration of
'i2c_register_master'
make[2]: *** [drivers/i2c/i2c.o] Error 1
make[1]: *** [drivers/i2c] Error 2
make: *** [drivers] Error 2


# grep I2C .config
# CONFIG_CMD_I2C is not set
CONFIG_I2C=y
CONFIG_DRIVER_I2C_MC13892=y
CONFIG_DRIVER_I2C_MC34704=y
CONFIG_DRIVER_I2C_MC9SDZ60=y
CONFIG_DRIVER_I2C_LP3972=y
# CONFIG_DRIVER_I2C_TWL4030 is not set



regards

Nataraj
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100831/7dd0c466/attachment.html>

From stefan.reinauer at coresystems.de  Tue Aug 31 06:25:28 2010
From: stefan.reinauer at coresystems.de (Stefan Reinauer)
Date: Tue, 31 Aug 2010 12:25:28 +0200
Subject: barebox on x86
Message-ID: <4C7CD898.9040902@coresystems.de>

 Hi,

here's some initial work on getting barebox working on x86 (again?).

The patch is very ugly, and it makes some assumptions on me using
Darwin/Mac OS X to compile barebox.
What kind of becomes clear though, is that there is no clear distinction
between which set of headers are used for the user space utilities and
which set of headers are used for the barebox binary. I think that's the
reason why barebox features an include/linux directory which seems to
duplicate about half of what Linux usually has in there, but more than
barebox uses (or should use, ftm).

With the attached patch I get as far as the linking stage.

> i386-elf-ld -Map barebox.map -o barebox -T arch/x86/lib/barebox.lds
--start-group common/built-in.o drivers/built-in.o commands/built-in.o
lib/built-in.o net/built-in.o fs/built-in.o
arch/x86/boards/x86_generic/built-in.o arch/x86/mach-i386/built-in.o
arch/x86/lib/built-in.o arch/x86/boot/built-in.o --end-group

When I define CONFIG_X86_HDBOOT
I get:

i386-elf-ld: barebox section `.initcall.8' will not fit in region `mbr'
i386-elf-ld: section .initcall.8 loaded at
[0000000000000400,000000000000040b] overlaps section .bootstrapping
loaded at [0000000000000400,00000000000008e7]
i386-elf-ld: region `mbr' overflowed by 12 bytes

If I choose "native", I get

arch/x86/lib/barebox.lds:124: nonconstant expression for load base

Since barebox is not really specialized in doing complex hardware
initialization like it's needed on x86 machines, and coreboot is not
really specialized in providing any kind of user interface I would like
to work on making barebox available as a coreboot payload. For that I
need to produce an ELF file that does no BIOS calls because coreboot is
not a BIOS or UEFI but only does the most necessary hardware
initialization on x86 systems.

Any hints and help is highly appreciated.

Best regards,
Stefan



-- 
coresystems GmbH ? Brahmsstr. 16 ? D-79104 Freiburg i. Br.
      Tel.: +49 761 7668825 ? Fax: +49 761 7664613
Email: info at coresystems.de  ? http://www.coresystems.de/
Registergericht: Amtsgericht Freiburg ? HRB 7656
Gesch?ftsf?hrer: Stefan Reinauer ? Ust-IdNr.: DE245674866

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: barebox-x86.diff
URL: <http://lists.infradead.org/pipermail/barebox/attachments/20100831/6c8ee7d0/attachment-0001.ksh>

From plagnioj at jcrosoft.com  Tue Aug 31 09:18:17 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue, 31 Aug 2010 15:18:17 +0200
Subject: barebox on x86
In-Reply-To: <4C7CD898.9040902@coresystems.de>
References: <4C7CD898.9040902@coresystems.de>
Message-ID: <20100831131817.GA1883@game.jcrosoft.org>

On 12:25 Tue 31 Aug     , Stefan Reinauer wrote:
>  Hi,
> 
> here's some initial work on getting barebox working on x86 (again?).
> 
> The patch is very ugly, and it makes some assumptions on me using
> Darwin/Mac OS X to compile barebox.
> What kind of becomes clear though, is that there is no clear distinction
> between which set of headers are used for the user space utilities and
> which set of headers are used for the barebox binary. I think that's the
> reason why barebox features an include/linux directory which seems to
> duplicate about half of what Linux usually has in there, but more than
> barebox uses (or should use, ftm).
> 
> With the attached patch I get as far as the linking stage.
why do you touch it?
barebox is self content so I do not understand why you do such modificaton
specially uf we are supposed to do crosscompile

Best Regards,
J.


From stepan at coresystems.de  Tue Aug 31 09:50:27 2010
From: stepan at coresystems.de (Stefan Reinauer)
Date: Tue, 31 Aug 2010 15:50:27 +0200
Subject: barebox on x86
In-Reply-To: <20100831131817.GA1883@game.jcrosoft.org>
References: <4C7CD898.9040902@coresystems.de>
	<20100831131817.GA1883@game.jcrosoft.org>
Message-ID: <4C7D08A3.8000505@coresystems.de>

 Hi Jean-Christophe,

On 8/31/10 3:18 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> why do you touch it?
Sorry, touch _what_ in particular?

> barebox is self content so I do not understand why you do such modificaton
> specially uf we are supposed to do crosscompile
>
Unfortunately that assumption is wrong, at least for the x86 target.
Almost all my patch does is trying to fix exactly that (along with
dropping the requirement to use Linux on the host side)

And, yes, I am using an i386-elf- cross compiler.

Best regards,
Stefan


From w.sang at pengutronix.de  Tue Aug 31 10:33:18 2010
From: w.sang at pengutronix.de (Wolfram Sang)
Date: Tue, 31 Aug 2010 16:33:18 +0200
Subject: [PATCH] i2c: fix wrong comment and symbol export for
	i2c_add_numbered_adapter()
In-Reply-To: <AANLkTimX=cnQKO78ejygmv-1m6LzcUfmKO20Cg_waz-9@mail.gmail.com>
References: <AANLkTimX=cnQKO78ejygmv-1m6LzcUfmKO20Cg_waz-9@mail.gmail.com>
Message-ID: <1283265198-3266-1-git-send-email-w.sang@pengutronix.de>

Signed-off-by: Wolfram Sang <w.sang at pengutronix.de>
---

Can you please check this patch?

 drivers/i2c/i2c.c |   26 ++++++++++++--------------
 1 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/drivers/i2c/i2c.c b/drivers/i2c/i2c.c
index 87360f3..5df0d30 100644
--- a/drivers/i2c/i2c.c
+++ b/drivers/i2c/i2c.c
@@ -344,21 +344,19 @@ struct i2c_adapter *i2c_get_adapter(int busnum)
 }
 
 /**
- * i2c_register_master - register I2C master controller
+ * i2c_add_numbered_adapter - declare i2c adapter, use static bus number
+ * @adapter: the adapter to register (with adap->nr initialized)
  *
- * @param	master	initialized master, originally from i2c_alloc_master()
- *
- * I2C master controllers connect to their drivers using some non-I2C
- * bus, such as the platform bus. The final stage of probe() in that
- * code includes calling i2c_register_master() to hook up to this I2C
- * bus glue.
- *
- * I2C controllers use board specific (often SOC specific) bus
- * numbers, and board-specific addressing for I2C devices combines
- * those numbers with chip select numbers. Since I2C does not directly
- * support dynamic device identification, boards need configuration
- * tables telling which chip is at which address.
+ * This routine is used to declare an I2C adapter when its bus number
+ * matters.  For example, use it for I2C adapters from system-on-chip CPUs,
+ * or otherwise built in to the system's mainboard, and where i2c_board_info
+ * is used to properly configure I2C devices.
  *
+ * When this returns zero, the specified adapter became available for
+ * clients using the bus number provided in adap->nr.  Also, the table
+ * of I2C devices pre-declared using i2c_register_board_info() is scanned,
+ * and the appropriate driver model device nodes are created.  Otherwise, a
+ * negative errno value is returned.
  */
 int i2c_add_numbered_adapter(struct i2c_adapter *adapter)
 {
@@ -372,4 +370,4 @@ int i2c_add_numbered_adapter(struct i2c_adapter *adapter)
 
 	return 0;
 }
-EXPORT_SYMBOL(i2c_register_master);
+EXPORT_SYMBOL(i2c_add_numbered_adapter);
-- 
1.7.1



From plagnioj at jcrosoft.com  Tue Aug 31 11:18:19 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue, 31 Aug 2010 17:18:19 +0200
Subject: barebox on x86
In-Reply-To: <4C7D08A3.8000505@coresystems.de>
References: <4C7CD898.9040902@coresystems.de>
	<20100831131817.GA1883@game.jcrosoft.org>
	<4C7D08A3.8000505@coresystems.de>
Message-ID: <20100831151819.GA22790@game.jcrosoft.org>

On 15:50 Tue 31 Aug     , Stefan Reinauer wrote:
>  Hi Jean-Christophe,
> 
> On 8/31/10 3:18 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > why do you touch it?
> Sorry, touch _what_ in particular?
> 
> > barebox is self content so I do not understand why you do such modificaton
> > specially uf we are supposed to do crosscompile
> >
> Unfortunately that assumption is wrong, at least for the x86 target.
> Almost all my patch does is trying to fix exactly that (along with
> dropping the requirement to use Linux on the host side)
> 
> And, yes, I am using an i386-elf- cross compiler.
you need a linux toolchains and it's build correctly
I build it on MacOS too

Best Regards,
J.


From jbe at pengutronix.de  Tue Aug 31 11:45:26 2010
From: jbe at pengutronix.de (Juergen Beisert)
Date: Tue, 31 Aug 2010 17:45:26 +0200
Subject: barebox on x86
In-Reply-To: <4C7CD898.9040902@coresystems.de>
References: <4C7CD898.9040902@coresystems.de>
Message-ID: <201008311745.27052.jbe@pengutronix.de>

Hi Stefan,

Stefan Reinauer wrote:
> here's some initial work on getting barebox working on x86 (again?).
>
> The patch is very ugly, and it makes some assumptions on me using
> Darwin/Mac OS X to compile barebox.
> What kind of becomes clear though, is that there is no clear distinction
> between which set of headers are used for the user space utilities and
> which set of headers are used for the barebox binary. I think that's the
> reason why barebox features an include/linux directory which seems to
> duplicate about half of what Linux usually has in there, but more than
> barebox uses (or should use, ftm).
>
> With the attached patch I get as far as the linking stage.
>
> > i386-elf-ld -Map barebox.map -o barebox -T arch/x86/lib/barebox.lds
>
> --start-group common/built-in.o drivers/built-in.o commands/built-in.o
> lib/built-in.o net/built-in.o fs/built-in.o
> arch/x86/boards/x86_generic/built-in.o arch/x86/mach-i386/built-in.o
> arch/x86/lib/built-in.o arch/x86/boot/built-in.o --end-group
>
> When I define CONFIG_X86_HDBOOT
> I get:
>
> i386-elf-ld: barebox section `.initcall.8' will not fit in region `mbr'
> i386-elf-ld: section .initcall.8 loaded at
> [0000000000000400,000000000000040b] overlaps section .bootstrapping
> loaded at [0000000000000400,00000000000008e7]
> i386-elf-ld: region `mbr' overflowed by 12 bytes

-> MBR -> 16 Bit boot loader.

> If I choose "native", I get
>
> arch/x86/lib/barebox.lds:124: nonconstant expression for load base

The 'native' case is not finished yet. It does not use any 16 bit code nor 
BIOS calls. But need adaptions to get some vital information about the system 
(for example memory size).

> Since barebox is not really specialized in doing complex hardware
> initialization like it's needed on x86 machines, and coreboot is not
> really specialized in providing any kind of user interface I would like
> to work on making barebox available as a coreboot payload. For that I
> need to produce an ELF file that does no BIOS calls because coreboot is
> not a BIOS or UEFI but only does the most necessary hardware
> initialization on x86 systems.

The 'native' case is the correct direction to get it work with coreboot.

jbe

-- 
Pengutronix e.K.                              | Juergen Beisert             |
Linux Solutions for Science and Industry      | Phone: +49-8766-939 228     |
Vertretung Sued/Muenchen, Germany             | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686              | http://www.pengutronix.de/  |


From stepan at coresystems.de  Tue Aug 31 11:59:59 2010
From: stepan at coresystems.de (Stefan Reinauer)
Date: Tue, 31 Aug 2010 17:59:59 +0200
Subject: barebox on x86
In-Reply-To: <20100831151819.GA22790@game.jcrosoft.org>
References: <4C7CD898.9040902@coresystems.de>
	<20100831131817.GA1883@game.jcrosoft.org>
	<4C7D08A3.8000505@coresystems.de>
	<20100831151819.GA22790@game.jcrosoft.org>
Message-ID: <4C7D26FF.2030706@coresystems.de>

 Hi Jean-Christophe,

On 8/31/10 5:18 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> On 15:50 Tue 31 Aug     , Stefan Reinauer wrote:
>>  Hi Jean-Christophe,
>>
>> On 8/31/10 3:18 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
>>> why do you touch it?
>> Sorry, touch _what_ in particular?
>>
>>> barebox is self content so I do not understand why you do such modificaton
>>> specially uf we are supposed to do crosscompile
>>>
>> Unfortunately that assumption is wrong, at least for the x86 target.
>> Almost all my patch does is trying to fix exactly that (along with
>> dropping the requirement to use Linux on the host side)
>>
>> And, yes, I am using an i386-elf- cross compiler.
> you need a linux toolchains and it's build correctly

So, barebox needs glibc and a Linux kernel to build? Hm. Then consider
my patch fixing that problem. Almost. With my patch it's self-content.
But the linking problems are still open. Do you have any hint on those,
too, maybe?

> I build it on MacOS too
>
How did you overcome the programs in scripts/ using Linux system headers
that are not there with HOSTCC (even with a Linux cross toolchain)?

> Best Regards,
> J.
>

Best regards,
Stefan


From jbe at pengutronix.de  Tue Aug 31 12:23:13 2010
From: jbe at pengutronix.de (Juergen Beisert)
Date: Tue, 31 Aug 2010 18:23:13 +0200
Subject: barebox on x86
In-Reply-To: <4C7D26FF.2030706@coresystems.de>
References: <4C7CD898.9040902@coresystems.de>
	<20100831151819.GA22790@game.jcrosoft.org>
	<4C7D26FF.2030706@coresystems.de>
Message-ID: <201008311823.13981.jbe@pengutronix.de>

Stefan Reinauer wrote:
>  Hi Jean-Christophe,
>
> On 8/31/10 5:18 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > On 15:50 Tue 31 Aug     , Stefan Reinauer wrote:
> >>  Hi Jean-Christophe,
> >>
> >> On 8/31/10 3:18 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> >>> why do you touch it?
> >>
> >> Sorry, touch _what_ in particular?
> >>
> >>> barebox is self content so I do not understand why you do such
> >>> modificaton specially uf we are supposed to do crosscompile
> >>
> >> Unfortunately that assumption is wrong, at least for the x86 target.
> >> Almost all my patch does is trying to fix exactly that (along with
> >> dropping the requirement to use Linux on the host side)
> >>
> >> And, yes, I am using an i386-elf- cross compiler.
> >
> > you need a linux toolchains and it's build correctly
>
> So, barebox needs glibc and a Linux kernel to build?

No. Everything needed comes with the barebox sources. Else it is a bug.

jbe

-- 
Pengutronix e.K.                              | Juergen Beisert             |
Linux Solutions for Science and Industry      | Phone: +49-8766-939 228     |
Vertretung Sued/Muenchen, Germany             | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686              | http://www.pengutronix.de/  |


From plagnioj at jcrosoft.com  Tue Aug 31 13:08:14 2010
From: plagnioj at jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
Date: Tue, 31 Aug 2010 19:08:14 +0200
Subject: barebox on x86
In-Reply-To: <4C7D26FF.2030706@coresystems.de>
References: <4C7CD898.9040902@coresystems.de>
	<20100831131817.GA1883@game.jcrosoft.org>
	<4C7D08A3.8000505@coresystems.de>
	<20100831151819.GA22790@game.jcrosoft.org>
	<4C7D26FF.2030706@coresystems.de>
Message-ID: <20100831170814.GC22790@game.jcrosoft.org>

On 17:59 Tue 31 Aug     , Stefan Reinauer wrote:
>  Hi Jean-Christophe,
> 
> On 8/31/10 5:18 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> > On 15:50 Tue 31 Aug     , Stefan Reinauer wrote:
> >>  Hi Jean-Christophe,
> >>
> >> On 8/31/10 3:18 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
> >>> why do you touch it?
> >> Sorry, touch _what_ in particular?
> >>
> >>> barebox is self content so I do not understand why you do such modificaton
> >>> specially uf we are supposed to do crosscompile
> >>>
> >> Unfortunately that assumption is wrong, at least for the x86 target.
> >> Almost all my patch does is trying to fix exactly that (along with
> >> dropping the requirement to use Linux on the host side)
> >>
> >> And, yes, I am using an i386-elf- cross compiler.
> > you need a linux toolchains and it's build correctly
> 
> So, barebox needs glibc and a Linux kernel to build? Hm. Then consider
> my patch fixing that problem. Almost. With my patch it's self-content.
> But the linking problems are still open. Do you have any hint on those,
> too, maybe?
> 
> > I build it on MacOS too
> >
> How did you overcome the programs in scripts/ using Linux system headers
> that are not there with HOSTCC (even with a Linux cross toolchain)?
the tool chain provive it and it's the same for compiling the kernel on MacOS

Best Regards,
J.


From stepan at coresystems.de  Tue Aug 31 15:06:01 2010
From: stepan at coresystems.de (Stefan Reinauer)
Date: Tue, 31 Aug 2010 21:06:01 +0200
Subject: barebox on x86
In-Reply-To: <20100831170814.GC22790@game.jcrosoft.org>
References: <4C7CD898.9040902@coresystems.de>
	<20100831131817.GA1883@game.jcrosoft.org>
	<4C7D08A3.8000505@coresystems.de>
	<20100831151819.GA22790@game.jcrosoft.org>
	<4C7D26FF.2030706@coresystems.de>
	<20100831170814.GC22790@game.jcrosoft.org>
Message-ID: <4C7D5299.2060503@coresystems.de>

 On 8/31/10 7:08 PM, Jean-Christophe PLAGNIOL-VILLARD wrote:
>>> I build it on MacOS too
>>>
>> How did you overcome the programs in scripts/ using Linux system headers
>> that are not there with HOSTCC (even with a Linux cross toolchain)?
> the tool chain provive it and it's the same for compiling the kernel on MacOS

Hm... maybe I need a different host toolchain on MacOS then?

I am using Xcode 3.2.2, i.e. gcc version 4.2.1 (Apple Inc. build 5659)
for the host parts - that's those not intended for the target but for
running on MacOS during the build process, like setupmbr, mk_elfconfig
and modpost. And that toolchain does for example not come with an elf.h
header file (mostly because ELF is not used on MacOS). For obvious
reasons, the target compiler's (cross compiler) include files are taboo
for compiling the host programs.

Best regards,
Stefan


From stefan.reinauer at coresystems.de  Tue Aug 31 15:09:08 2010
From: stefan.reinauer at coresystems.de (Stefan Reinauer)
Date: Tue, 31 Aug 2010 21:09:08 +0200
Subject: barebox on x86
In-Reply-To: <201008311745.27052.jbe@pengutronix.de>
References: <4C7CD898.9040902@coresystems.de>
	<201008311745.27052.jbe@pengutronix.de>
Message-ID: <4C7D5354.7000702@coresystems.de>

 On 8/31/10 5:45 PM, Juergen Beisert wrote:
> Hi Stefan,
>
> Stefan Reinauer wrote:
>> here's some initial work on getting barebox working on x86 (again?).
>>
>> The patch is very ugly, and it makes some assumptions on me using
>> Darwin/Mac OS X to compile barebox.
>> What kind of becomes clear though, is that there is no clear distinction
>> between which set of headers are used for the user space utilities and
>> which set of headers are used for the barebox binary. I think that's the
>> reason why barebox features an include/linux directory which seems to
>> duplicate about half of what Linux usually has in there, but more than
>> barebox uses (or should use, ftm).
>>
>> With the attached patch I get as far as the linking stage.
>>
>>> i386-elf-ld -Map barebox.map -o barebox -T arch/x86/lib/barebox.lds
>> --start-group common/built-in.o drivers/built-in.o commands/built-in.o
>> lib/built-in.o net/built-in.o fs/built-in.o
>> arch/x86/boards/x86_generic/built-in.o arch/x86/mach-i386/built-in.o
>> arch/x86/lib/built-in.o arch/x86/boot/built-in.o --end-group
>>
>> When I define CONFIG_X86_HDBOOT
>> I get:
>>
>> i386-elf-ld: barebox section `.initcall.8' will not fit in region `mbr'
>> i386-elf-ld: section .initcall.8 loaded at
>> [0000000000000400,000000000000040b] overlaps section .bootstrapping
>> loaded at [0000000000000400,00000000000008e7]
>> i386-elf-ld: region `mbr' overflowed by 12 bytes
> -> MBR -> 16 Bit boot loader.

Yes, I wanted to compile the "known working" version first, but it seems
to choke on the "late_initcall" mechanism somehow.

>> If I choose "native", I get
>>
>> arch/x86/lib/barebox.lds:124: nonconstant expression for load base
> The 'native' case is not finished yet. It does not use any 16 bit code nor 
> BIOS calls. But need adaptions to get some vital information about the system 
> (for example memory size).
Ok, will try to figure this one out.

>> Since barebox is not really specialized in doing complex hardware
>> initialization like it's needed on x86 machines, and coreboot is not
>> really specialized in providing any kind of user interface I would like
>> to work on making barebox available as a coreboot payload. For that I
>> need to produce an ELF file that does no BIOS calls because coreboot is
>> not a BIOS or UEFI but only does the most necessary hardware
>> initialization on x86 systems.
> The 'native' case is the correct direction to get it work with coreboot.

Great! That's what I assumed. Thanks for the input.



