/*
 * Genericish driver for memory mapped NAND devices
 *
 * Copyright (c) 2006-2009 Analog Devices Inc.
 * Licensed under the GPL-2 or later.
 */

/* Your board must implement the following macros:
 *  NAND_PLAT_WRITE_CMD(chip, cmd)
 *  NAND_PLAT_WRITE_ADR(chip, cmd)
 *  NAND_PLAT_INIT()
 *
 * It may also implement the following:
 *  NAND_PLAT_DEV_READY(chip)
 */

#include <common.h>
#include <asm/io.h>

#include <nand.h>

static void plat_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
	struct nand_chip *this = mtd->priv;

	if (cmd == NAND_CMD_NONE)
		return;

	if (ctrl & NAND_CLE)
		NAND_PLAT_WRITE_CMD(this, cmd);
	else
		NAND_PLAT_WRITE_ADR(this, cmd);
}

#ifdef NAND_PLAT_DEV_READY
static int plat_dev_ready(struct mtd_info *mtd)
{
	return NAND_PLAT_DEV_READY((struct nand_chip *)mtd->priv);
}
#else
# define plat_dev_ready NULL
#endif

int board_nand_init(struct nand_chip *nand)
{
	NAND_PLAT_INIT();

	nand->cmd_ctrl = plat_cmd_ctrl;
	nand->dev_ready = plat_dev_ready;
	nand->ecc.mode = NAND_ECC_SOFT;

	return 0;
}
