/*
 * drivers/mtd/devices/goldfish_nand_reg.h
 *
 * Copyright (C) 2007 Google, Inc.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * 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.
 *
 */

#ifndef GOLDFISH_NAND_REG_H
#define GOLDFISH_NAND_REG_H

enum nand_cmd {
	/* Write device name for NAND_DEV to NAND_DATA (vaddr) */
	NAND_CMD_GET_DEV_NAME,
	NAND_CMD_READ,
	NAND_CMD_WRITE,
	NAND_CMD_ERASE,
	/* NAND_RESULT is 1 if block is bad, 0 if it is not */
	NAND_CMD_BLOCK_BAD_GET,
	NAND_CMD_BLOCK_BAD_SET,
	NAND_CMD_READ_WITH_PARAMS,
	NAND_CMD_WRITE_WITH_PARAMS,
	NAND_CMD_ERASE_WITH_PARAMS
};

enum nand_dev_flags {
	NAND_DEV_FLAG_READ_ONLY = 0x00000001,
	NAND_DEV_FLAG_CMD_PARAMS_CAP = 0x00000002,
};

#define NAND_VERSION_CURRENT (1)

enum nand_reg {
	/* Global */
	NAND_VERSION        = 0x000,
	NAND_NUM_DEV        = 0x004,
	NAND_DEV            = 0x008,

	/* Dev info */
	NAND_DEV_FLAGS      = 0x010,
	NAND_DEV_NAME_LEN   = 0x014,
	NAND_DEV_PAGE_SIZE  = 0x018,
	NAND_DEV_EXTRA_SIZE = 0x01c,
	NAND_DEV_ERASE_SIZE = 0x020,
	NAND_DEV_SIZE_LOW   = 0x028,
	NAND_DEV_SIZE_HIGH  = 0x02c,

	/* Command */
	NAND_RESULT         = 0x040,
	NAND_COMMAND        = 0x044,
	NAND_DATA           = 0x048,
	NAND_DATA_HIGH	    = 0x100,
	NAND_TRANSFER_SIZE  = 0x04c,
	NAND_ADDR_LOW       = 0x050,
	NAND_ADDR_HIGH      = 0x054,
	NAND_CMD_PARAMS_ADDR_LOW = 0x058,
	NAND_CMD_PARAMS_ADDR_HIGH = 0x05c,
};

struct cmd_params {
	u32 dev;
	u32 addr_low;
	u32 addr_high;
	u32 transfer_size;
	unsigned long data;
	u32 result;
};
#endif
