• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*-
2  * Copyright 2013 Broadcom Corporation
3  *
4  * Copyright (c) 2009-2010 Micron Technology, Inc.
5  *
6  * This software is licensed under the terms of the GNU General Public
7  * License version 2, as published by the Free Software Foundation, and
8  * may be copied, distributed, and modified under those terms.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * Henry Pan <hspan@micron.com>
16  *
17  * based on nand.h
18  */
19 #ifndef __LINUX_MTD_SPI_NAND_H
20 #define __LINUX_MTD_SPI_NAND_H
21 
22 #include <linux/wait.h>
23 #include <linux/spinlock.h>
24 #include <linux/mtd/mtd.h>
25 
26 /* cmd */
27 #define CMD_READ			0x13
28 #define CMD_READ_RDM			0x03
29 #define CMD_PROG_PAGE_CLRCACHE		0x02
30 #define CMD_PROG_PAGE			0x84
31 #define CMD_PROG_PAGE_EXC		0x10
32 #define CMD_ERASE_BLK			0xd8
33 #define CMD_WR_ENABLE			0x06
34 #define CMD_WR_DISABLE			0x04
35 #define CMD_READ_ID			0x9f
36 #define CMD_RESET			0xff
37 #define CMD_READ_REG			0x0f
38 #define CMD_WRITE_REG			0x1f
39 
40 /* feature/ status reg */
41 #define REG_BLOCK_LOCK			0xa0
42 #define REG_OTP				0xb0
43 #define REG_STATUS			0xc0/* timing */
44 
45 /* status */
46 #define STATUS_OIP_MASK			0x01
47 #define STATUS_READY			(0 << 0)
48 #define STATUS_BUSY			(1 << 0)
49 
50 #define STATUS_E_FAIL_MASK		0x04
51 #define STATUS_E_FAIL			(1 << 2)
52 
53 #define STATUS_P_FAIL_MASK		0x08
54 #define STATUS_P_FAIL			(1 << 3)
55 
56 #define STATUS_ECC_MASK			0x30
57 #define STATUS_ECC_1BIT_CORRECTED	(1 << 4)
58 #define STATUS_ECC_ERROR		(2 << 4)
59 #define STATUS_ECC_RESERVED		(3 << 4)
60 
61 /*ECC enable defines*/
62 #define OTP_ECC_MASK			0x10
63 #define OTP_ECC_OFF			0
64 #define OTP_ECC_ON			1
65 
66 #define ECC_DISABLED
67 #define ECC_IN_NAND
68 #define ECC_SOFT
69 
70 /* block lock */
71 #define BL_ALL_LOCKED      0x38
72 #define BL_1_2_LOCKED      0x30
73 #define BL_1_4_LOCKED      0x28
74 #define BL_1_8_LOCKED      0x20
75 #define BL_1_16_LOCKED     0x18
76 #define BL_1_32_LOCKED     0x10
77 #define BL_1_64_LOCKED     0x08
78 #define BL_ALL_UNLOCKED    0
79 
80 struct spinand_info {
81 	struct nand_ecclayout *ecclayout;
82 	struct spi_device *spi;
83 	void *priv;
84 };
85 
86 struct spinand_state {
87 	uint32_t	col;
88 	uint32_t	row;
89 	int		buf_ptr;
90 	u8		*buf;
91 };
92 
93 struct spinand_cmd {
94 	u8		cmd;
95 	u32		n_addr;		/* Number of address */
96 	u8		addr[3];	/* Reg Offset */
97 	u32		n_dummy;	/* Dummy use */
98 	u32		n_tx;		/* Number of tx bytes */
99 	u8		*tx_buf;	/* Tx buf */
100 	u32		n_rx;		/* Number of rx bytes */
101 	u8		*rx_buf;	/* Rx buf */
102 };
103 
104 extern int spinand_mtd(struct mtd_info *mtd);
105 extern void spinand_mtd_release(struct mtd_info *mtd);
106 
107 #endif /* __LINUX_MTD_SPI_NAND_H */
108