On Saturday 11 July 2009 10:19:08 Heiko Schocher wrote: > +++ b/drivers/mtd/nand/kmeter1_nand.c > @@ -0,0 +1,153 @@ > +/* > + * (C) Copyright 2009 > + * Heiko Schocher, DENX Software Engineering, h...@denx.de > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > + * MA 02111-1307 USA > + */ > + > +#include <common.h> > + > +#if defined(CONFIG_CMD_NAND)
This #if shouldn't be necessary. > +#include <nand.h> > +#include <asm/io.h> > + > +#define CONFIG_NAND_MODE_REG (CONFIG_SYS_NAND_BASE + 0x20000) > +#define CONFIG_NAND_DATA_REG (CONFIG_SYS_NAND_BASE + 0x30000) > + > +#define read_mode() in_8((volatile unsigned char __iomem *) \ > + CONFIG_NAND_MODE_REG) > +#define write_mode(val) out_8((volatile unsigned char __iomem *) \ > + CONFIG_NAND_MODE_REG, val) > +#define read_data() in_8((volatile unsigned char __iomem *) \ > + CONFIG_NAND_DATA_REG) > +#define write_data(val) out_8((volatile unsigned char __iomem *) \ > + CONFIG_NAND_DATA_REG, val) > + > +#define KPN_RDY2 (1 << 7) > +#define KPN_RDY1 (1 << 6) > +#define KPN_WPN (1 << 4) > +#define KPN_CE2N (1 << 3) > +#define KPN_CE1N (1 << 2) > +#define KPN_ALE (1 << 1) > +#define KPN_CLE (1 << 0) > + > +#define KPN_DEFAULT_CHIP_DELAY 50 > + > +static int kpn_chip_ready(void) > +{ > + if (read_mode() & KPN_RDY1) > + return 1; > + > + return 0; > +} > + > +static void kpn_wait_rdy(void) > +{ > + int cnt = 1000000; > + > + while (--cnt && !kpn_chip_ready()) > + udelay(1); > + > + if (!cnt) > + printf ("timeout while waiting for RDY\n"); > +} > + > +static void kpn_nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int > ctrl) +{ > + u8 reg_val = read_mode(); > + > + if (ctrl & NAND_CTRL_CHANGE) { > + if ( ctrl & NAND_NCE) > + reg_val = reg_val & ~KPN_CE1N; > + else > + reg_val = reg_val | KPN_CE1N; > + write_mode(reg_val); > + } > + if (cmd == NAND_CMD_NONE) > + return; > + > + reg_val = reg_val & ~(KPN_ALE + KPN_CLE); > + if (ctrl & NAND_CLE) > + reg_val = reg_val | KPN_CLE; > + if (ctrl & NAND_ALE) > + reg_val = reg_val | KPN_ALE; > + > + /* select register */ > + write_mode(reg_val); > + > + /* write cmd */ > + write_data(cmd); > + > + /* deselect register */ > + reg_val = reg_val & ~(KPN_ALE + KPN_CLE); > + write_mode(reg_val); > + > + /* wait until flash is ready */ > + kpn_wait_rdy(); > +} > + > +static u_char kpn_nand_read_byte(struct mtd_info *mtd) > +{ > + return read_data(); > +} > + > +static void kpn_nand_write_buf(struct mtd_info *mtd, const u_char *buf, > int len) +{ > + int i; > + > + for (i = 0; i < len; i++) { > + write_data(buf[i]); > + kpn_wait_rdy(); > + } > +} > + > +static void kpn_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len) > +{ > + int i; > + > + for (i = 0; i < len; i++) { > + buf[i] = read_data(); > + } Nitpicking: The braces are not necessary (single line statement). Best regards, Stefan ===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: off...@denx.de ===================================================================== _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot