Patchwork [U-Boot,v3] arm: cm4008, cm41xx: use common cfi_flash support

login
register
mail settings
Submitter Yann Vernier
Date July 6, 2012, 8:27 a.m.
Message ID <201207061031.58382.yann.vernier@orsoc.se>
Download mbox | patch
Permalink /patch/169376/
State Not Applicable
Delegated to: Albert ARIBAUD
Headers show

Comments

Yann Vernier - July 6, 2012, 8:27 a.m.
This change allows use of other flash chips than the two supported by
the cm4008 flash.c. Tested with Micrel KSZ8695X demo board.
---
Changes for v2:
   - Update cm41xx also
   - Remove unused board specific flash code
Changes for v3:
   - Do not define to 1 where it is not required, just define

Signed-off-by: Yann Vernier <yann.vernier@orsoc.se>
---
 board/cm4008/Makefile    |    2 +-
 board/cm4008/flash.c     |  410 ----------------------------------------------
 board/cm41xx/Makefile    |    2 +-
 board/cm41xx/flash.c     |  410 ----------------------------------------------
 include/configs/cm4008.h |    4 +
 include/configs/cm41xx.h |    4 +
 6 files changed, 10 insertions(+), 822 deletions(-)
 delete mode 100644 board/cm4008/flash.c
 delete mode 100644 board/cm41xx/flash.c
Andreas Bießmann - July 6, 2012, 8:47 a.m.
On 06.07.2012 10:27, Yann Vernier wrote:
> This change allows use of other flash chips than the two supported by
> the cm4008 flash.c. Tested with Micrel KSZ8695X demo board.
> ---
> Changes for v2:
>    - Update cm41xx also
>    - Remove unused board specific flash code
> Changes for v3:
>    - Do not define to 1 where it is not required, just define
> 
> Signed-off-by: Yann Vernier <yann.vernieu@orsoc.se>

Acked-by: Andreas Bießmann <andreas.devel@googlemail.com>

(although I do not know who will pick it ...)

> ---
>  board/cm4008/Makefile    |    2 +-
>  board/cm4008/flash.c     |  410 ----------------------------------------------
>  board/cm41xx/Makefile    |    2 +-
>  board/cm41xx/flash.c     |  410 ----------------------------------------------
>  include/configs/cm4008.h |    4 +
>  include/configs/cm41xx.h |    4 +
>  6 files changed, 10 insertions(+), 822 deletions(-)
>  delete mode 100644 board/cm4008/flash.c
>  delete mode 100644 board/cm41xx/flash.c
Albert ARIBAUD - July 6, 2012, 11:33 a.m.
Hi Andreas,

On Fri, 06 Jul 2012 10:47:11 +0200, "Andreas Bießmann"
<andreas.devel@googlemail.com> wrote:
> On 06.07.2012 10:27, Yann Vernier wrote:
> > This change allows use of other flash chips than the two supported
> > by the cm4008 flash.c. Tested with Micrel KSZ8695X demo board.
> > ---
> > Changes for v2:
> >    - Update cm41xx also
> >    - Remove unused board specific flash code
> > Changes for v3:
> >    - Do not define to 1 where it is not required, just define
> > 
> > Signed-off-by: Yann Vernier <yann.vernieu@orsoc.se>
> 
> Acked-by: Andreas Bießmann <andreas.devel@googlemail.com>
> 
> (although I do not know who will pick it ...)

Always a problem, those board config patches... :)

I'll take this one in u-boot-arm/next, but later this week-end. if by
Monday I haven't sent an 'applied' mail, ping me.

Amicalement,
Yann Vernier - Aug. 9, 2012, 1:33 p.m.
On Fri, 6 Jul 2012 13:33:42 +0200
Albert ARIBAUD <albert.u.boot@aribaud.net> wrote:

> Always a problem, those board config patches... :)
> 
> I'll take this one in u-boot-arm/next, but later this week-end. if by
> Monday I haven't sent an 'applied' mail, ping me.

I haven't seen an applied mail, nor a commit in the git, so I figure
this is still not merged. I've since made an attempt at cleaning up the
magic constants. Since this is fairly intrusive I have a much larger
patch affecting the same sections. I've attempted to split it up, though
some combinations of these patches will likely not be very useful. 

Yann Vernier (11):
  arm: ks8695: use defined constants for UART
  arm: ks8695: more macros for register values
  arm: ks8695eth: Use MAC address from environment
  arm: cm4008, cm41xx: use common cfi_flash support
  arm: cm4008, cm41xx: set gd->ram_size in dram_init
  arm: cm4008, cm41xx: Fix ROM relocation
  arm: ks8695/cm4008/cm41xx: Parameterize SDRAM
  arm: cm4008, cm41xx: don't define to 1
  arm: ks8695/cm4xxx: don't reconfigure switch
  arm: ks8695: document bus speed
  arm: cm4008, cm41xx: read MAC address from flash

 arch/arm/cpu/arm920t/ks8695/lowlevel_init.S  |   95 +++---
 arch/arm/include/asm/arch-ks8695/platform.h  |   55 ++--
 arch/arm/include/asm/arch-ks8695/regvalues.h |  112 +++++++
 board/cm4008/Makefile                        |    2 +-
 board/cm4008/cm4008.c                        |   17 +-
 board/cm4008/config.mk                       |    1 -
 board/cm4008/flash.c                         |  410
 --------------------------
 board/cm41xx/Makefile                        |    2 +-
 board/cm41xx/cm41xx.c                        |   17 +-
 board/cm41xx/config.mk                       |    1 -
 board/cm41xx/flash.c                         |  410
 --------------------------
 drivers/net/ks8695eth.c                      |   38 +--
 include/configs/cm4008.h                     |   38 ++-
 include/configs/cm41xx.h                     |   32 +- 14 files
 changed, 305 insertions(+), 925 deletions(-) create mode 100644
 arch/arm/include/asm/arch-ks8695/regvalues.h delete mode 100644
 board/cm4008/config.mk delete mode 100644 board/cm4008/flash.c delete
 mode 100644 board/cm41xx/config.mk delete mode 100644
 board/cm41xx/flash.c
Yann Vernier - Aug. 9, 2012, 1:33 p.m.
Just use the existing #define instead of magic number.

Signed-off-by: Yann Vernier <yann.vernier@orsoc.se>
---
 arch/arm/cpu/arm920t/ks8695/lowlevel_init.S |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
b/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S index 31b028b..ba37c28
100644 --- a/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
+++ b/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
@@ -199,8 +199,8 @@ highflash:
 	/*
 	 * set pll to top speed
 	 */
-	ldr	r1, =(KS8695_IO_BASE+KS8695_SYSTEN_BUS_CLOCK)
-	mov	r2, #0
+	ldr	r1, =(KS8695_IO_BASE+KS8695_SYSTEM_BUS_CLOCK)
+	mov	r2, #KS8695_BUS_CLOCK_125MHZ
 	str	r2, [r1]		/* set pll clock to 166MHz
*/ 
 	ldr	r1, =(KS8695_IO_BASE+KS8695_SWITCH_CTRL0)
Yann Vernier - Aug. 9, 2012, 1:33 p.m.
A small bug caused code to set up LEDs to instead disable lots
of functionality in the Ethernet switch, including bounds checks.

Signed-off-by: Yann Vernier <yann.vernier@orsoc.se>
---
 arch/arm/cpu/arm920t/ks8695/lowlevel_init.S |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
b/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S index bec9738..31b028b
100644 --- a/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
+++ b/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
@@ -205,7 +205,7 @@ highflash:
 
 	ldr	r1, =(KS8695_IO_BASE+KS8695_SWITCH_CTRL0)
 	ldr	r2, [r1]		/* Get switch ctrl0
register       */
-	and	r2, r2, #0x0fc00000	/* Mask out LED control
bits       */
+	bic	r2, r2, #0x0fc00000	/* Mask out LED control
bits       */ orr	r2, r2, #0x01800000	/* Set
Link/activity/speed actions */ str	r2, [r1]
Yann Vernier - Aug. 9, 2012, 1:33 p.m.
Allows configuration macros to set SDRAM parameters.

Signed-off-by: Yann Vernier <yann.vernier@orsoc.se>
---
 arch/arm/cpu/arm920t/ks8695/lowlevel_init.S |   20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
b/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S index 74579ed..bec9738
100644 --- a/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
+++ b/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
@@ -157,19 +157,20 @@ highflash:
 	/*
 	 * before relocating, we have to setup RAM timing
 	 */
+#if CONFIG_SYS_SDCS0_PARAMS
 	ldr	r1, =(KS8695_IO_BASE+KS8695_SDRAM_CTRL0)
-#if (PHYS_SDRAM_1_SIZE == 0x02000000)
-	ldr	r2, =0x7fc0000e		/* 32MB */
-#else
-	ldr	r2, =0x3fc0000e		/* 16MB */
-#endif
+	ldr	r2, =CONFIG_KS8695_SDCON0_VALUE
 	str	r2, [r1]		/* configure sdram bank0
setup */ +#endif
+#if CONFIG_SYS_SDCS1_PARAMS
 	ldr	r1, =(KS8695_IO_BASE+KS8695_SDRAM_CTRL1)
-	mov	r2, #0
+	mov	r2, #CONFIG_KS8695_SDCON1_VALUE
 	str	r2, [r1]		/* configure sdram bank1
setup */ +#endif
 
+#if CONFIG_SYS_SDCS0_PARAMS || CONFIG_SYS_SDCS1_PARAMS
 	ldr	r1, =(KS8695_IO_BASE+KS8695_SDRAM_GENERAL)
-	ldr	r2, =0x0000000a
+	ldr	r2, =CONFIG_KS8695_SDGCON_VALUE
 	str	r2, [r1]		/* set RAS/CAS timing */
 
 	ldr	r1, =(KS8695_IO_BASE+KS8695_SDRAM_BUFFER)
@@ -184,15 +185,16 @@ highflash:
 	ldr	r2, =0x00000020
 	str	r2, [r1]		/* set for fast refresh */
 	DELAY_FOR 0x100, r0
-	ldr	r2, =0x00000190
+	ldr	r2, =CONFIG_SYS_SDRAM_REFRESH_RATE
 	str	r2, [r1]		/* set normal refresh
timing */ 
 	ldr	r1, =(KS8695_IO_BASE+KS8695_SDRAM_BUFFER)
-	ldr	r2, =0x00020033
+	ldr	r2, =(0x00020000 | CONFIG_SYS_SDRAM_MODE)
 	str	r2, [r1]		/* send mode command */
 	DELAY_FOR 0x100, r0
 	ldr	r2, =0x01f00000
 	str	r2, [r1]		/* enable sdram fifos */
+#endif
 
 	/*
 	 * set pll to top speed
Yann Vernier - Aug. 9, 2012, 1:33 p.m.
CONFIG_BAUDRATE and KS8695_UART_LINEC_WLEN8 used for UART registers

Signed-off-by: Yann Vernier <yann.vernier@orsoc.se>
---
 arch/arm/cpu/arm920t/ks8695/lowlevel_init.S |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
b/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S index e9f1227..1bba571
100644 --- a/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
+++ b/arch/arm/cpu/arm920t/ks8695/lowlevel_init.S
@@ -72,10 +72,10 @@ lowlevel_init:
 	 * enable UART for early debug trace
 	 */
 	ldr	r1, =(KS8695_IO_BASE+KS8695_UART_DIVISOR)
-	mov	r2, #0xd9
-	str	r2, [r1]		/* 115200 baud */
+	mov	r2, #((25000000+CONFIG_BAUDRATE/2) /
CONFIG_BAUDRATE)
+	str	r2, [r1]
 	ldr	r1, =(KS8695_IO_BASE+KS8695_UART_LINE_CTRL)
-	mov	r2, #0x03
+	mov	r2, #KS8695_UART_LINEC_WLEN8
 	str	r2, [r1]		/* 8 data bits, no parity,
1 stop */ ldr	r1, =(KS8695_IO_BASE+KS8695_UART_TX_HOLDING)
 	mov	r2, #0x41
Albert ARIBAUD - Oct. 4, 2012, 9:15 a.m.
Hi Yann,

On Thu, 9 Aug 2012 15:33:06 +0200, Yann Vernier <yann.vernier@orsoc.se>
wrote:

> On Fri, 6 Jul 2012 13:33:42 +0200
> Albert ARIBAUD <albert.u.boot@aribaud.net> wrote:
> 
> > Always a problem, those board config patches... :)
> > 
> > I'll take this one in u-boot-arm/next, but later this week-end. if by
> > Monday I haven't sent an 'applied' mail, ping me.
> 
> I haven't seen an applied mail, nor a commit in the git, so I figure
> this is still not merged. I've since made an attempt at cleaning up the
> magic constants. Since this is fairly intrusive I have a much larger
> patch affecting the same sections. I've attempted to split it up, though
> some combinations of these patches will likely not be very useful. 
> 
> Yann Vernier (11):
>   arm: ks8695: use defined constants for UART
>   arm: ks8695: more macros for register values
>   arm: ks8695eth: Use MAC address from environment
>   arm: cm4008, cm41xx: use common cfi_flash support
>   arm: cm4008, cm41xx: set gd->ram_size in dram_init
>   arm: cm4008, cm41xx: Fix ROM relocation
>   arm: ks8695/cm4008/cm41xx: Parameterize SDRAM
>   arm: cm4008, cm41xx: don't define to 1
>   arm: ks8695/cm4xxx: don't reconfigure switch
>   arm: ks8695: document bus speed
>   arm: cm4008, cm41xx: read MAC address from flash
> 
>  arch/arm/cpu/arm920t/ks8695/lowlevel_init.S  |   95 +++---
>  arch/arm/include/asm/arch-ks8695/platform.h  |   55 ++--
>  arch/arm/include/asm/arch-ks8695/regvalues.h |  112 +++++++
>  board/cm4008/Makefile                        |    2 +-
>  board/cm4008/cm4008.c                        |   17 +-
>  board/cm4008/config.mk                       |    1 -
>  board/cm4008/flash.c                         |  410
>  --------------------------
>  board/cm41xx/Makefile                        |    2 +-
>  board/cm41xx/cm41xx.c                        |   17 +-
>  board/cm41xx/config.mk                       |    1 -
>  board/cm41xx/flash.c                         |  410
>  --------------------------
>  drivers/net/ks8695eth.c                      |   38 +--
>  include/configs/cm4008.h                     |   38 ++-
>  include/configs/cm41xx.h                     |   32 +- 14 files
>  changed, 305 insertions(+), 925 deletions(-) create mode 100644
>  arch/arm/include/asm/arch-ks8695/regvalues.h delete mode 100644
>  board/cm4008/config.mk delete mode 100644 board/cm4008/flash.c delete
>  mode 100644 board/cm41xx/config.mk delete mode 100644
>  board/cm41xx/flash.c
> 

Sorry it took me so long to crawl my backlog... This series was posted
with long lines folded apparently, which makes it impossible to process
and explains why patchwork did not have all of it. Can you please
repost it, this time using 'git send-email'?

Amicalement,
Yann Vernier - Oct. 5, 2012, 12:09 p.m.
On Thu, 4 Oct 2012 11:15:06 +0200
Albert ARIBAUD <albert.u.boot@aribaud.net> wrote:
> Sorry it took me so long to crawl my backlog... This series was posted
> with long lines folded apparently, which makes it impossible to process
> and explains why patchwork did not have all of it. Can you please
> repost it, this time using 'git send-email'?

Terribly sorry. This should fix that problem.
In the meantime, work on our board progresses nicely, and we plan to
submit it after registering a machine ID. We have u-boot support for
PCI, FPGA configuration, and I2C for power control working, the
latter two via GPIO.

Yann Vernier (11):
  arm: ks8695: use defined constants for UART
  arm: ks8695: more macros for register values
  arm: ks8695eth: Use MAC address from environment
  arm: cm4008, cm41xx: use common cfi_flash support
  arm: cm4008, cm41xx: set gd->ram_size in dram_init
  arm: cm4008, cm41xx: Fix ROM relocation
  arm: ks8695/cm4008/cm41xx: Parameterize SDRAM
  arm: cm4008, cm41xx: don't define to 1
  arm: ks8695/cm4xxx: don't reconfigure switch
  arm: ks8695: document bus speed
  arm: cm4008, cm41xx: read MAC address from flash

 arch/arm/cpu/arm920t/ks8695/lowlevel_init.S  |   95 +++---
 arch/arm/include/asm/arch-ks8695/platform.h  |   55 ++--
 arch/arm/include/asm/arch-ks8695/regvalues.h |  112 +++++++
 board/cm4008/Makefile                        |    2 +-
 board/cm4008/cm4008.c                        |   17 +-
 board/cm4008/config.mk                       |    1 -
 board/cm4008/flash.c                         |  410 --------------------------
 board/cm41xx/Makefile                        |    2 +-
 board/cm41xx/cm41xx.c                        |   17 +-
 board/cm41xx/config.mk                       |    1 -
 board/cm41xx/flash.c                         |  410 --------------------------
 drivers/net/ks8695eth.c                      |   38 +--
 include/configs/cm4008.h                     |   38 ++-
 include/configs/cm41xx.h                     |   32 +-
 14 files changed, 305 insertions(+), 925 deletions(-)
 create mode 100644 arch/arm/include/asm/arch-ks8695/regvalues.h
 delete mode 100644 board/cm4008/config.mk
 delete mode 100644 board/cm4008/flash.c
 delete mode 100644 board/cm41xx/config.mk
 delete mode 100644 board/cm41xx/flash.c
Albert ARIBAUD - Nov. 10, 2012, 8:03 a.m.
Hi Yann,

On Fri,  5 Oct 2012 14:09:47 +0200, Yann Vernier
<yann.vernier@orsoc.se> wrote:

> On Thu, 4 Oct 2012 11:15:06 +0200
> Albert ARIBAUD <albert.u.boot@aribaud.net> wrote:
> > Sorry it took me so long to crawl my backlog... This series was posted
> > with long lines folded apparently, which makes it impossible to process
> > and explains why patchwork did not have all of it. Can you please
> > repost it, this time using 'git send-email'?
> 
> Terribly sorry. This should fix that problem.
> In the meantime, work on our board progresses nicely, and we plan to
> submit it after registering a machine ID. We have u-boot support for
> PCI, FPGA configuration, and I2C for power control working, the
> latter two via GPIO.

There were several comments on this series, but I haven't seen any
V2 for it. Did I miss it?

Amicalement,
Yann Vernier - Nov. 13, 2012, 12:46 p.m.
On Sat, 10 Nov 2012 09:03:32 +0100
Albert ARIBAUD <albert.u.boot@aribaud.net> wrote:

> Hi Yann,
> 
> On Fri,  5 Oct 2012 14:09:47 +0200, Yann Vernier
> <yann.vernier@orsoc.se> wrote:
> 
> > On Thu, 4 Oct 2012 11:15:06 +0200
> > Albert ARIBAUD <albert.u.boot@aribaud.net> wrote:
> > > Sorry it took me so long to crawl my backlog... This series was
> > > posted with long lines folded apparently, which makes it
> > > impossible to process and explains why patchwork did not have all
> > > of it. Can you please repost it, this time using 'git send-email'?
> > 
> > Terribly sorry. This should fix that problem.
> > In the meantime, work on our board progresses nicely, and we plan to
> > submit it after registering a machine ID. We have u-boot support for
> > PCI, FPGA configuration, and I2C for power control working, the
> > latter two via GPIO.
> 
> There were several comments on this series, but I haven't seen any
> V2 for it. Did I miss it?
> 
> Amicalement,


Sorry, I have not yet made it. I do intend to correct the patches but
we got a high priority job in between.

Patch

diff --git a/board/cm4008/Makefile b/board/cm4008/Makefile
index 5b98824..dac422b 100644
--- a/board/cm4008/Makefile
+++ b/board/cm4008/Makefile
@@ -25,7 +25,7 @@  include $(TOPDIR)/config.mk
 
 LIB	= $(obj)lib$(BOARD).o
 
-COBJS	:= cm4008.o flash.o
+COBJS	:= cm4008.o
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS	:= $(addprefix $(obj),$(COBJS))
diff --git a/board/cm4008/flash.c b/board/cm4008/flash.c
deleted file mode 100644
index 5522bf0..0000000
--- a/board/cm4008/flash.c
+++ /dev/null
@@ -1,410 +0,0 @@ 
-/*
- * (C) Copyright 2005
- * Greg Ungerer, OpenGear Inc, greg.ungerer@opengear.com
- *
- * (C) Copyright 2001
- * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
- *
- * (C) Copyright 2001
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <common.h>
-#include <linux/byteorder/swab.h>
-
-
-flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];	/* info for FLASH chips */
-
-#define mb() __asm__ __volatile__ ("" : : : "memory")
-
-/*-----------------------------------------------------------------------
- * Functions
- */
-static ulong flash_get_size (unsigned char * addr, flash_info_t * info);
-static int write_data (flash_info_t * info, ulong dest, unsigned char data);
-static void flash_get_offsets (ulong base, flash_info_t * info);
-void inline spin_wheel (void);
-
-/*-----------------------------------------------------------------------
- */
-
-unsigned long flash_init (void)
-{
-	int i;
-	ulong size = 0;
-
-	for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
-		switch (i) {
-		case 0:
-			flash_get_size ((unsigned char *) PHYS_FLASH_1, &flash_info[i]);
-			flash_get_offsets (PHYS_FLASH_1, &flash_info[i]);
-			break;
-		case 1:
-			/* ignore for now */
-			flash_info[i].flash_id = FLASH_UNKNOWN;
-			break;
-		default:
-			panic ("configured too many flash banks!\n");
-			break;
-		}
-		size += flash_info[i].size;
-	}
-
-	/* Protect monitor and environment sectors
-	 */
-	flash_protect (FLAG_PROTECT_SET,
-		       CONFIG_SYS_FLASH_BASE,
-		       CONFIG_SYS_FLASH_BASE + _bss_start_ofs,
-		       &flash_info[0]);
-
-	return size;
-}
-
-/*-----------------------------------------------------------------------
- */
-static void flash_get_offsets (ulong base, flash_info_t * info)
-{
-	int i;
-
-	if (info->flash_id == FLASH_UNKNOWN)
-		return;
-
-	if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
-		for (i = 0; i < info->sector_count; i++) {
-			info->start[i] = base + (i * PHYS_FLASH_SECT_SIZE);
-			info->protect[i] = 0;
-		}
-	}
-}
-
-/*-----------------------------------------------------------------------
- */
-void flash_print_info (flash_info_t * info)
-{
-	int i;
-
-	if (info->flash_id == FLASH_UNKNOWN) {
-		printf ("missing or unknown FLASH type\n");
-		return;
-	}
-
-	switch (info->flash_id & FLASH_VENDMASK) {
-	case FLASH_MAN_INTEL:
-		printf ("INTEL ");
-		break;
-	default:
-		printf ("Unknown Vendor ");
-		break;
-	}
-
-	switch (info->flash_id & FLASH_TYPEMASK) {
-	case FLASH_28F128J3A:
-		printf ("28F128J3A\n");
-		break;
-	default:
-		printf ("Unknown Chip Type\n");
-		break;
-	}
-
-	printf ("  Size: %ld MB in %d Sectors\n",
-		info->size >> 20, info->sector_count);
-
-	printf ("  Sector Start Addresses:");
-	for (i = 0; i < info->sector_count; ++i) {
-		if ((i % 5) == 0)
-			printf ("\n   ");
-		printf (" %08lX%s",
-			info->start[i], info->protect[i] ? " (RO)" : "     ");
-	}
-	printf ("\n");
-	return;
-}
-
-/*
- * The following code cannot be run from FLASH!
- */
-static ulong flash_get_size (unsigned char * addr, flash_info_t * info)
-{
-	volatile unsigned char value;
-
-	/* Write auto select command: read Manufacturer ID */
-	addr[0x5555] = 0xAA;
-	addr[0x2AAA] = 0x55;
-	addr[0x5555] = 0x90;
-
-	mb ();
-	value = addr[0];
-
-	switch (value) {
-
-	case (unsigned char)INTEL_MANUFACT:
-		info->flash_id = FLASH_MAN_INTEL;
-		break;
-
-	default:
-		info->flash_id = FLASH_UNKNOWN;
-		info->sector_count = 0;
-		info->size = 0;
-		addr[0] = 0xFF;	/* restore read mode */
-		return (0);	/* no or unknown flash  */
-	}
-
-	mb ();
-	value = addr[2];	/* device ID            */
-
-	switch (value) {
-
-	case (unsigned char)INTEL_ID_28F640J3A:
-		info->flash_id += FLASH_28F640J3A;
-		info->sector_count = 64;
-		info->size = 0x00800000;
-		break;		/* => 8 MB     */
-
-	case (unsigned char)INTEL_ID_28F128J3A:
-		info->flash_id += FLASH_28F128J3A;
-		info->sector_count = 128;
-		info->size = 0x01000000;
-		break;		/* => 16 MB     */
-
-	default:
-		info->flash_id = FLASH_UNKNOWN;
-		break;
-	}
-
-	if (info->sector_count > CONFIG_SYS_MAX_FLASH_SECT) {
-		printf ("** ERROR: sector count %d > max (%d) **\n",
-			info->sector_count, CONFIG_SYS_MAX_FLASH_SECT);
-		info->sector_count = CONFIG_SYS_MAX_FLASH_SECT;
-	}
-
-	addr[0] = 0xFF;	/* restore read mode */
-
-	return (info->size);
-}
-
-
-/*-----------------------------------------------------------------------
- */
-
-int flash_erase (flash_info_t * info, int s_first, int s_last)
-{
-	int prot, sect;
-	ulong type;
-	int rcode = 0;
-	ulong start;
-
-	if ((s_first < 0) || (s_first > s_last)) {
-		if (info->flash_id == FLASH_UNKNOWN) {
-			printf ("- missing\n");
-		} else {
-			printf ("- no sectors to erase\n");
-		}
-		return 1;
-	}
-
-	type = (info->flash_id & FLASH_VENDMASK);
-	if ((type != FLASH_MAN_INTEL)) {
-		printf ("Can't erase unknown flash type %08lx - aborted\n",
-			info->flash_id);
-		return 1;
-	}
-
-	prot = 0;
-	for (sect = s_first; sect <= s_last; ++sect) {
-		if (info->protect[sect]) {
-			prot++;
-		}
-	}
-
-	if (prot)
-		printf ("- Warning: %d protected sectors will not be erased!\n", prot);
-	else
-		printf ("\n");
-
-	/* Disable interrupts which might cause a timeout here */
-	disable_interrupts();
-
-	/* Start erase on unprotected sectors */
-	for (sect = s_first; sect <= s_last; sect++) {
-		if (info->protect[sect] == 0) {	/* not protected */
-			volatile unsigned char *addr;
-			unsigned char status;
-
-			printf ("Erasing sector %2d ... ", sect);
-
-			/* arm simple, non interrupt dependent timer */
-			start = get_timer(0);
-
-			addr = (volatile unsigned char *) (info->start[sect]);
-			*addr = 0x50;	/* clear status register */
-			*addr = 0x20;	/* erase setup */
-			*addr = 0xD0;	/* erase confirm */
-
-			while (((status = *addr) & 0x80) != 0x80) {
-				if (get_timer(start) >
-				    CONFIG_SYS_FLASH_ERASE_TOUT) {
-					printf ("Timeout\n");
-					*addr = 0xB0;	/* suspend erase */
-					*addr = 0xFF;	/* reset to read mode */
-					rcode = 1;
-					break;
-				}
-			}
-
-			*addr = 0x50;	/* clear status register cmd */
-			*addr = 0xFF;	/* resest to read mode */
-
-			printf (" done\n");
-		}
-	}
-	return rcode;
-}
-
-/*-----------------------------------------------------------------------
- * Copy memory to flash, returns:
- * 0 - OK
- * 1 - write timeout
- * 2 - Flash not erased
- * 4 - Flash not identified
- */
-
-int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
-{
-	ulong cp, wp;
-	unsigned char data;
-	int count, i, l, rc, port_width;
-
-	if (info->flash_id == FLASH_UNKNOWN)
-		return 4;
-
-	wp = addr;
-	port_width = 1;
-
-	/*
-	 * handle unaligned start bytes
-	 */
-	if ((l = addr - wp) != 0) {
-		data = 0;
-		for (i = 0, cp = wp; i < l; ++i, ++cp) {
-			data = (data << 8) | (*(uchar *) cp);
-		}
-		for (; i < port_width && cnt > 0; ++i) {
-			data = (data << 8) | *src++;
-			--cnt;
-			++cp;
-		}
-		for (; cnt == 0 && i < port_width; ++i, ++cp) {
-			data = (data << 8) | (*(uchar *) cp);
-		}
-
-		if ((rc = write_data (info, wp, data)) != 0) {
-			return (rc);
-		}
-		wp += port_width;
-	}
-
-	/*
-	 * handle word aligned part
-	 */
-	count = 0;
-	while (cnt >= port_width) {
-		data = 0;
-		for (i = 0; i < port_width; ++i) {
-			data = (data << 8) | *src++;
-		}
-		if ((rc = write_data (info, wp, data)) != 0) {
-			return (rc);
-		}
-		wp += port_width;
-		cnt -= port_width;
-		if (count++ > 0x800) {
-			spin_wheel ();
-			count = 0;
-		}
-	}
-
-	if (cnt == 0) {
-		return (0);
-	}
-
-	/*
-	 * handle unaligned tail bytes
-	 */
-	data = 0;
-	for (i = 0, cp = wp; i < port_width && cnt > 0; ++i, ++cp) {
-		data = (data << 8) | *src++;
-		--cnt;
-	}
-	for (; i < port_width; ++i, ++cp) {
-		data = (data << 8) | (*(uchar *) cp);
-	}
-
-	return (write_data (info, wp, data));
-}
-
-/*-----------------------------------------------------------------------
- * Write a word or halfword to Flash, returns:
- * 0 - OK
- * 1 - write timeout
- * 2 - Flash not erased
- */
-static int write_data (flash_info_t * info, ulong dest, unsigned char data)
-{
-	volatile unsigned char *addr = (volatile unsigned char *) dest;
-	ulong status;
-	ulong start;
-
-	/* Check if Flash is (sufficiently) erased */
-	if ((*addr & data) != data) {
-		printf ("not erased at %08lx (%lx)\n", (ulong) addr,
-			(ulong) * addr);
-		return (2);
-	}
-	/* Disable interrupts which might cause a timeout here */
-	disable_interrupts();
-
-	*addr = 0x40;	/* write setup */
-	*addr = data;
-
-	/* arm simple, non interrupt dependent timer */
-	start = get_timer(0);
-
-	/* wait while polling the status register */
-	while (((status = *addr) & 0x80) != 0x80) {
-		if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
-			*addr = 0xFF;	/* restore read mode */
-			return (1);
-		}
-	}
-
-	*addr = 0xFF;	/* restore read mode */
-
-	return (0);
-}
-
-void inline spin_wheel (void)
-{
-	static int p = 0;
-	static char w[] = "\\/-";
-
-	printf ("\010%c", w[p]);
-	(++p == 3) ? (p = 0) : 0;
-}
diff --git a/board/cm41xx/Makefile b/board/cm41xx/Makefile
index 6214f8c..d49fce1 100644
--- a/board/cm41xx/Makefile
+++ b/board/cm41xx/Makefile
@@ -25,7 +25,7 @@  include $(TOPDIR)/config.mk
 
 LIB	= $(obj)lib$(BOARD).o
 
-COBJS	:= cm41xx.o flash.o
+COBJS	:= cm41xx.o
 
 SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS	:= $(addprefix $(obj),$(COBJS))
diff --git a/board/cm41xx/flash.c b/board/cm41xx/flash.c
deleted file mode 100644
index 5522bf0..0000000
--- a/board/cm41xx/flash.c
+++ /dev/null
@@ -1,410 +0,0 @@ 
-/*
- * (C) Copyright 2005
- * Greg Ungerer, OpenGear Inc, greg.ungerer@opengear.com
- *
- * (C) Copyright 2001
- * Kyle Harris, Nexus Technologies, Inc. kharris@nexus-tech.net
- *
- * (C) Copyright 2001
- * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
- *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
- */
-
-#include <common.h>
-#include <linux/byteorder/swab.h>
-
-
-flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];	/* info for FLASH chips */
-
-#define mb() __asm__ __volatile__ ("" : : : "memory")
-
-/*-----------------------------------------------------------------------
- * Functions
- */
-static ulong flash_get_size (unsigned char * addr, flash_info_t * info);
-static int write_data (flash_info_t * info, ulong dest, unsigned char data);
-static void flash_get_offsets (ulong base, flash_info_t * info);
-void inline spin_wheel (void);
-
-/*-----------------------------------------------------------------------
- */
-
-unsigned long flash_init (void)
-{
-	int i;
-	ulong size = 0;
-
-	for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i++) {
-		switch (i) {
-		case 0:
-			flash_get_size ((unsigned char *) PHYS_FLASH_1, &flash_info[i]);
-			flash_get_offsets (PHYS_FLASH_1, &flash_info[i]);
-			break;
-		case 1:
-			/* ignore for now */
-			flash_info[i].flash_id = FLASH_UNKNOWN;
-			break;
-		default:
-			panic ("configured too many flash banks!\n");
-			break;
-		}
-		size += flash_info[i].size;
-	}
-
-	/* Protect monitor and environment sectors
-	 */
-	flash_protect (FLAG_PROTECT_SET,
-		       CONFIG_SYS_FLASH_BASE,
-		       CONFIG_SYS_FLASH_BASE + _bss_start_ofs,
-		       &flash_info[0]);
-
-	return size;
-}
-
-/*-----------------------------------------------------------------------
- */
-static void flash_get_offsets (ulong base, flash_info_t * info)
-{
-	int i;
-
-	if (info->flash_id == FLASH_UNKNOWN)
-		return;
-
-	if ((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL) {
-		for (i = 0; i < info->sector_count; i++) {
-			info->start[i] = base + (i * PHYS_FLASH_SECT_SIZE);
-			info->protect[i] = 0;
-		}
-	}
-}
-
-/*-----------------------------------------------------------------------
- */
-void flash_print_info (flash_info_t * info)
-{
-	int i;
-
-	if (info->flash_id == FLASH_UNKNOWN) {
-		printf ("missing or unknown FLASH type\n");
-		return;
-	}
-
-	switch (info->flash_id & FLASH_VENDMASK) {
-	case FLASH_MAN_INTEL:
-		printf ("INTEL ");
-		break;
-	default:
-		printf ("Unknown Vendor ");
-		break;
-	}
-
-	switch (info->flash_id & FLASH_TYPEMASK) {
-	case FLASH_28F128J3A:
-		printf ("28F128J3A\n");
-		break;
-	default:
-		printf ("Unknown Chip Type\n");
-		break;
-	}
-
-	printf ("  Size: %ld MB in %d Sectors\n",
-		info->size >> 20, info->sector_count);
-
-	printf ("  Sector Start Addresses:");
-	for (i = 0; i < info->sector_count; ++i) {
-		if ((i % 5) == 0)
-			printf ("\n   ");
-		printf (" %08lX%s",
-			info->start[i], info->protect[i] ? " (RO)" : "     ");
-	}
-	printf ("\n");
-	return;
-}
-
-/*
- * The following code cannot be run from FLASH!
- */
-static ulong flash_get_size (unsigned char * addr, flash_info_t * info)
-{
-	volatile unsigned char value;
-
-	/* Write auto select command: read Manufacturer ID */
-	addr[0x5555] = 0xAA;
-	addr[0x2AAA] = 0x55;
-	addr[0x5555] = 0x90;
-
-	mb ();
-	value = addr[0];
-
-	switch (value) {
-
-	case (unsigned char)INTEL_MANUFACT:
-		info->flash_id = FLASH_MAN_INTEL;
-		break;
-
-	default:
-		info->flash_id = FLASH_UNKNOWN;
-		info->sector_count = 0;
-		info->size = 0;
-		addr[0] = 0xFF;	/* restore read mode */
-		return (0);	/* no or unknown flash  */
-	}
-
-	mb ();
-	value = addr[2];	/* device ID            */
-
-	switch (value) {
-
-	case (unsigned char)INTEL_ID_28F640J3A:
-		info->flash_id += FLASH_28F640J3A;
-		info->sector_count = 64;
-		info->size = 0x00800000;
-		break;		/* => 8 MB     */
-
-	case (unsigned char)INTEL_ID_28F128J3A:
-		info->flash_id += FLASH_28F128J3A;
-		info->sector_count = 128;
-		info->size = 0x01000000;
-		break;		/* => 16 MB     */
-
-	default:
-		info->flash_id = FLASH_UNKNOWN;
-		break;
-	}
-
-	if (info->sector_count > CONFIG_SYS_MAX_FLASH_SECT) {
-		printf ("** ERROR: sector count %d > max (%d) **\n",
-			info->sector_count, CONFIG_SYS_MAX_FLASH_SECT);
-		info->sector_count = CONFIG_SYS_MAX_FLASH_SECT;
-	}
-
-	addr[0] = 0xFF;	/* restore read mode */
-
-	return (info->size);
-}
-
-
-/*-----------------------------------------------------------------------
- */
-
-int flash_erase (flash_info_t * info, int s_first, int s_last)
-{
-	int prot, sect;
-	ulong type;
-	int rcode = 0;
-	ulong start;
-
-	if ((s_first < 0) || (s_first > s_last)) {
-		if (info->flash_id == FLASH_UNKNOWN) {
-			printf ("- missing\n");
-		} else {
-			printf ("- no sectors to erase\n");
-		}
-		return 1;
-	}
-
-	type = (info->flash_id & FLASH_VENDMASK);
-	if ((type != FLASH_MAN_INTEL)) {
-		printf ("Can't erase unknown flash type %08lx - aborted\n",
-			info->flash_id);
-		return 1;
-	}
-
-	prot = 0;
-	for (sect = s_first; sect <= s_last; ++sect) {
-		if (info->protect[sect]) {
-			prot++;
-		}
-	}
-
-	if (prot)
-		printf ("- Warning: %d protected sectors will not be erased!\n", prot);
-	else
-		printf ("\n");
-
-	/* Disable interrupts which might cause a timeout here */
-	disable_interrupts();
-
-	/* Start erase on unprotected sectors */
-	for (sect = s_first; sect <= s_last; sect++) {
-		if (info->protect[sect] == 0) {	/* not protected */
-			volatile unsigned char *addr;
-			unsigned char status;
-
-			printf ("Erasing sector %2d ... ", sect);
-
-			/* arm simple, non interrupt dependent timer */
-			start = get_timer(0);
-
-			addr = (volatile unsigned char *) (info->start[sect]);
-			*addr = 0x50;	/* clear status register */
-			*addr = 0x20;	/* erase setup */
-			*addr = 0xD0;	/* erase confirm */
-
-			while (((status = *addr) & 0x80) != 0x80) {
-				if (get_timer(start) >
-				    CONFIG_SYS_FLASH_ERASE_TOUT) {
-					printf ("Timeout\n");
-					*addr = 0xB0;	/* suspend erase */
-					*addr = 0xFF;	/* reset to read mode */
-					rcode = 1;
-					break;
-				}
-			}
-
-			*addr = 0x50;	/* clear status register cmd */
-			*addr = 0xFF;	/* resest to read mode */
-
-			printf (" done\n");
-		}
-	}
-	return rcode;
-}
-
-/*-----------------------------------------------------------------------
- * Copy memory to flash, returns:
- * 0 - OK
- * 1 - write timeout
- * 2 - Flash not erased
- * 4 - Flash not identified
- */
-
-int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
-{
-	ulong cp, wp;
-	unsigned char data;
-	int count, i, l, rc, port_width;
-
-	if (info->flash_id == FLASH_UNKNOWN)
-		return 4;
-
-	wp = addr;
-	port_width = 1;
-
-	/*
-	 * handle unaligned start bytes
-	 */
-	if ((l = addr - wp) != 0) {
-		data = 0;
-		for (i = 0, cp = wp; i < l; ++i, ++cp) {
-			data = (data << 8) | (*(uchar *) cp);
-		}
-		for (; i < port_width && cnt > 0; ++i) {
-			data = (data << 8) | *src++;
-			--cnt;
-			++cp;
-		}
-		for (; cnt == 0 && i < port_width; ++i, ++cp) {
-			data = (data << 8) | (*(uchar *) cp);
-		}
-
-		if ((rc = write_data (info, wp, data)) != 0) {
-			return (rc);
-		}
-		wp += port_width;
-	}
-
-	/*
-	 * handle word aligned part
-	 */
-	count = 0;
-	while (cnt >= port_width) {
-		data = 0;
-		for (i = 0; i < port_width; ++i) {
-			data = (data << 8) | *src++;
-		}
-		if ((rc = write_data (info, wp, data)) != 0) {
-			return (rc);
-		}
-		wp += port_width;
-		cnt -= port_width;
-		if (count++ > 0x800) {
-			spin_wheel ();
-			count = 0;
-		}
-	}
-
-	if (cnt == 0) {
-		return (0);
-	}
-
-	/*
-	 * handle unaligned tail bytes
-	 */
-	data = 0;
-	for (i = 0, cp = wp; i < port_width && cnt > 0; ++i, ++cp) {
-		data = (data << 8) | *src++;
-		--cnt;
-	}
-	for (; i < port_width; ++i, ++cp) {
-		data = (data << 8) | (*(uchar *) cp);
-	}
-
-	return (write_data (info, wp, data));
-}
-
-/*-----------------------------------------------------------------------
- * Write a word or halfword to Flash, returns:
- * 0 - OK
- * 1 - write timeout
- * 2 - Flash not erased
- */
-static int write_data (flash_info_t * info, ulong dest, unsigned char data)
-{
-	volatile unsigned char *addr = (volatile unsigned char *) dest;
-	ulong status;
-	ulong start;
-
-	/* Check if Flash is (sufficiently) erased */
-	if ((*addr & data) != data) {
-		printf ("not erased at %08lx (%lx)\n", (ulong) addr,
-			(ulong) * addr);
-		return (2);
-	}
-	/* Disable interrupts which might cause a timeout here */
-	disable_interrupts();
-
-	*addr = 0x40;	/* write setup */
-	*addr = data;
-
-	/* arm simple, non interrupt dependent timer */
-	start = get_timer(0);
-
-	/* wait while polling the status register */
-	while (((status = *addr) & 0x80) != 0x80) {
-		if (get_timer(start) > CONFIG_SYS_FLASH_WRITE_TOUT) {
-			*addr = 0xFF;	/* restore read mode */
-			return (1);
-		}
-	}
-
-	*addr = 0xFF;	/* restore read mode */
-
-	return (0);
-}
-
-void inline spin_wheel (void)
-{
-	static int p = 0;
-	static char w[] = "\\/-";
-
-	printf ("\010%c", w[p]);
-	(++p == 3) ? (p = 0) : 0;
-}
diff --git a/include/configs/cm4008.h b/include/configs/cm4008.h
index 58b0f4b..b0806cc 100644
--- a/include/configs/cm4008.h
+++ b/include/configs/cm4008.h
@@ -119,6 +119,10 @@ 
 #define PHYS_FLASH_SECT_SIZE    0x00020000 /* 128 KB sectors (x1) */
 #define CONFIG_SYS_FLASH_BASE		PHYS_FLASH_1
 
+#define CONFIG_SYS_FLASH_CFI
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_FLASH_CFI_WIDTH	FLASH_CFI_8BIT
+
 /*-----------------------------------------------------------------------
  * FLASH and environment organization
  */
diff --git a/include/configs/cm41xx.h b/include/configs/cm41xx.h
index d29040c..ea9165a 100644
--- a/include/configs/cm41xx.h
+++ b/include/configs/cm41xx.h
@@ -119,6 +119,10 @@ 
 #define PHYS_FLASH_SECT_SIZE    0x00020000 /* 128 KB sectors (x1) */
 #define CONFIG_SYS_FLASH_BASE		PHYS_FLASH_1
 
+#define CONFIG_SYS_FLASH_CFI
+#define CONFIG_FLASH_CFI_DRIVER
+#define CONFIG_SYS_FLASH_CFI_WIDTH	FLASH_CFI_8BIT
+
 /*-----------------------------------------------------------------------
  * FLASH and environment organization
  */