
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, hs@denx.de
- See file CREDITS for list of people who contributed to this
- project.
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License as
- published by the Free Software Foundation; either version 2 of
- the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- MA 02111-1307 USA
- */
+#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: office@denx.de =====================================================================