xref: /openbmc/u-boot/include/linux/mtd/onenand.h (revision bfd7f38614e21f745b6d6845fcc616ebc5e4d36f)
1d7e8ce10SKyungmin Park /*
2d7e8ce10SKyungmin Park  *  linux/include/linux/mtd/onenand.h
3d7e8ce10SKyungmin Park  *
4d7e8ce10SKyungmin Park  *  Copyright (C) 2005-2007 Samsung Electronics
5d7e8ce10SKyungmin Park  *  Kyungmin Park <kyungmin.park@samsung.com>
6d7e8ce10SKyungmin Park  *
7d7e8ce10SKyungmin Park  * This program is free software; you can redistribute it and/or modify
8d7e8ce10SKyungmin Park  * it under the terms of the GNU General Public License version 2 as
9d7e8ce10SKyungmin Park  * published by the Free Software Foundation.
10d7e8ce10SKyungmin Park  */
11d7e8ce10SKyungmin Park 
12d7e8ce10SKyungmin Park #ifndef __LINUX_MTD_ONENAND_H
13d7e8ce10SKyungmin Park #define __LINUX_MTD_ONENAND_H
14d7e8ce10SKyungmin Park 
15d7e8ce10SKyungmin Park #include <linux/mtd/onenand_regs.h>
16d7e8ce10SKyungmin Park 
17d7e8ce10SKyungmin Park /* Note: The header order is impoertant */
18d7e8ce10SKyungmin Park #include <onenand_uboot.h>
19d7e8ce10SKyungmin Park 
20d438d508SKyungmin Park #include <linux/mtd/compat.h>
21d7e8ce10SKyungmin Park #include <linux/mtd/bbm.h>
22d7e8ce10SKyungmin Park 
23d7e8ce10SKyungmin Park #define MAX_BUFFERRAM		2
24d7e8ce10SKyungmin Park #define MAX_ONENAND_PAGESIZE	(2048 + 64)
25d7e8ce10SKyungmin Park 
26d7e8ce10SKyungmin Park /* Scan and identify a OneNAND device */
27d7e8ce10SKyungmin Park extern int onenand_scan (struct mtd_info *mtd, int max_chips);
28d7e8ce10SKyungmin Park /* Free resources held by the OneNAND device */
29d7e8ce10SKyungmin Park extern void onenand_release (struct mtd_info *mtd);
30d7e8ce10SKyungmin Park 
31d7e8ce10SKyungmin Park /**
32d7e8ce10SKyungmin Park  * struct onenand_bufferram - OneNAND BufferRAM Data
33d7e8ce10SKyungmin Park  * @param block		block address in BufferRAM
34d7e8ce10SKyungmin Park  * @param page		page address in BufferRAM
35d7e8ce10SKyungmin Park  * @param valid		valid flag
36d7e8ce10SKyungmin Park  */
37d7e8ce10SKyungmin Park struct onenand_bufferram {
38d7e8ce10SKyungmin Park 	int block;
39d7e8ce10SKyungmin Park 	int page;
40d7e8ce10SKyungmin Park 	int valid;
41d7e8ce10SKyungmin Park };
42d7e8ce10SKyungmin Park 
43d7e8ce10SKyungmin Park /**
44d7e8ce10SKyungmin Park  * struct onenand_chip - OneNAND Private Flash Chip Data
45d7e8ce10SKyungmin Park  * @param base		[BOARDSPECIFIC] address to access OneNAND
46d7e8ce10SKyungmin Park  * @param chipsize	[INTERN] the size of one chip for multichip arrays
47d7e8ce10SKyungmin Park  * @param device_id	[INTERN] device ID
48d7e8ce10SKyungmin Park  * @param verstion_id	[INTERN] version ID
49d7e8ce10SKyungmin Park  * @param options	[BOARDSPECIFIC] various chip options. They can partly be set to inform onenand_scan about
50d7e8ce10SKyungmin Park  * @param erase_shift	[INTERN] number of address bits in a block
51d7e8ce10SKyungmin Park  * @param page_shift	[INTERN] number of address bits in a page
52d7e8ce10SKyungmin Park  * @param ppb_shift	[INTERN] number of address bits in a pages per block
53d7e8ce10SKyungmin Park  * @param page_mask	[INTERN] a page per block mask
54d7e8ce10SKyungmin Park  * @param bufferam_index	[INTERN] BufferRAM index
55d7e8ce10SKyungmin Park  * @param bufferam	[INTERN] BufferRAM info
56d7e8ce10SKyungmin Park  * @param readw		[REPLACEABLE] hardware specific function for read short
57d7e8ce10SKyungmin Park  * @param writew	[REPLACEABLE] hardware specific function for write short
58d7e8ce10SKyungmin Park  * @param command	[REPLACEABLE] hardware specific function for writing commands to the chip
59d7e8ce10SKyungmin Park  * @param wait		[REPLACEABLE] hardware specific function for wait on ready
60d7e8ce10SKyungmin Park  * @param read_bufferram	[REPLACEABLE] hardware specific function for BufferRAM Area
61d7e8ce10SKyungmin Park  * @param write_bufferram	[REPLACEABLE] hardware specific function for BufferRAM Area
62d7e8ce10SKyungmin Park  * @param chip_lock	[INTERN] spinlock used to protect access to this structure and the chip
63d7e8ce10SKyungmin Park  * @param wq		[INTERN] wait queue to sleep on if a OneNAND operation is in progress
64d7e8ce10SKyungmin Park  * @param state		[INTERN] the current state of the OneNAND device
65d7e8ce10SKyungmin Park  * @param autooob	[REPLACEABLE] the default (auto)placement scheme
66d7e8ce10SKyungmin Park  * @param priv		[OPTIONAL] pointer to private chip date
67d7e8ce10SKyungmin Park  */
68d7e8ce10SKyungmin Park struct onenand_chip {
69d7e8ce10SKyungmin Park 	void __iomem *base;
70d7e8ce10SKyungmin Park 	unsigned int chipsize;
71d7e8ce10SKyungmin Park 	unsigned int device_id;
72d7e8ce10SKyungmin Park 	unsigned int options;
73d7e8ce10SKyungmin Park 
74d7e8ce10SKyungmin Park 	unsigned int erase_shift;
75d7e8ce10SKyungmin Park 	unsigned int page_shift;
76d7e8ce10SKyungmin Park 	unsigned int ppb_shift;	/* Pages per block shift */
77d7e8ce10SKyungmin Park 	unsigned int page_mask;
78*bfd7f386SKyungmin Park 	unsigned int writesize;
79d7e8ce10SKyungmin Park 
80d7e8ce10SKyungmin Park 	unsigned int bufferram_index;
81d7e8ce10SKyungmin Park 	struct onenand_bufferram bufferram[MAX_BUFFERRAM];
82d7e8ce10SKyungmin Park 
83d7e8ce10SKyungmin Park 	int (*command) (struct mtd_info * mtd, int cmd, loff_t address,
84d7e8ce10SKyungmin Park 			size_t len);
85d7e8ce10SKyungmin Park 	int (*wait) (struct mtd_info * mtd, int state);
86d7e8ce10SKyungmin Park 	int (*read_bufferram) (struct mtd_info * mtd, int area,
87d7e8ce10SKyungmin Park 			       unsigned char *buffer, int offset, size_t count);
88d7e8ce10SKyungmin Park 	int (*write_bufferram) (struct mtd_info * mtd, int area,
89d7e8ce10SKyungmin Park 				const unsigned char *buffer, int offset,
90d7e8ce10SKyungmin Park 				size_t count);
91d7e8ce10SKyungmin Park 	unsigned short (*read_word) (void __iomem * addr);
92d7e8ce10SKyungmin Park 	void (*write_word) (unsigned short value, void __iomem * addr);
93d7e8ce10SKyungmin Park 	void (*mmcontrol) (struct mtd_info * mtd, int sync_read);
94d438d508SKyungmin Park 	int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
95d438d508SKyungmin Park 	int (*scan_bbt)(struct mtd_info *mtd);
96d7e8ce10SKyungmin Park 
97d438d508SKyungmin Park 	int state;
98*bfd7f386SKyungmin Park 	unsigned char *page_buf;
99*bfd7f386SKyungmin Park 	unsigned char *oob_buf;
100d7e8ce10SKyungmin Park 
101d7e8ce10SKyungmin Park 	struct nand_oobinfo *autooob;
102*bfd7f386SKyungmin Park 	struct nand_ecclayout *ecclayout;
103d7e8ce10SKyungmin Park 
104d7e8ce10SKyungmin Park 	void *bbm;
105d7e8ce10SKyungmin Park 
106d7e8ce10SKyungmin Park 	void *priv;
107d7e8ce10SKyungmin Park };
108d7e8ce10SKyungmin Park 
109*bfd7f386SKyungmin Park /*
110*bfd7f386SKyungmin Park  * Helper macros
111*bfd7f386SKyungmin Park  */
112d7e8ce10SKyungmin Park #define ONENAND_CURRENT_BUFFERRAM(this)		(this->bufferram_index)
113d7e8ce10SKyungmin Park #define ONENAND_NEXT_BUFFERRAM(this)		(this->bufferram_index ^ 1)
114d7e8ce10SKyungmin Park #define ONENAND_SET_NEXT_BUFFERRAM(this)	(this->bufferram_index ^= 1)
115*bfd7f386SKyungmin Park #define ONENAND_SET_PREV_BUFFERRAM(this)	(this->bufferram_index ^= 1)
116*bfd7f386SKyungmin Park #define ONENAND_SET_BUFFERRAM0(this)		(this->bufferram_index = 0)
117*bfd7f386SKyungmin Park #define ONENAND_SET_BUFFERRAM1(this)		(this->bufferram_index = 1)
118*bfd7f386SKyungmin Park 
119*bfd7f386SKyungmin Park #define ONENAND_IS_DDP(this)						\
120*bfd7f386SKyungmin Park 	(this->device_id & ONENAND_DEVICE_IS_DDP)
121*bfd7f386SKyungmin Park 
122*bfd7f386SKyungmin Park #define ONENAND_IS_2PLANE(this)			(0)
123d7e8ce10SKyungmin Park 
124d7e8ce10SKyungmin Park /*
125d7e8ce10SKyungmin Park  * Options bits
126d7e8ce10SKyungmin Park  */
127d7e8ce10SKyungmin Park #define ONENAND_CONT_LOCK		(0x0001)
128*bfd7f386SKyungmin Park #define ONENAND_PAGEBUF_ALLOC		(0x1000)
129*bfd7f386SKyungmin Park #define ONENAND_OOBBUF_ALLOC		(0x2000)
130d7e8ce10SKyungmin Park 
131d7e8ce10SKyungmin Park /*
132d7e8ce10SKyungmin Park  * OneNAND Flash Manufacturer ID Codes
133d7e8ce10SKyungmin Park  */
134d7e8ce10SKyungmin Park #define ONENAND_MFR_SAMSUNG	0xec
135d7e8ce10SKyungmin Park #define ONENAND_MFR_UNKNOWN	0x00
136d7e8ce10SKyungmin Park 
137d7e8ce10SKyungmin Park /**
138d7e8ce10SKyungmin Park  * struct nand_manufacturers - NAND Flash Manufacturer ID Structure
139d7e8ce10SKyungmin Park  * @param name:		Manufacturer name
140d7e8ce10SKyungmin Park  * @param id:		manufacturer ID code of device.
141d7e8ce10SKyungmin Park */
142d7e8ce10SKyungmin Park struct onenand_manufacturers {
143d7e8ce10SKyungmin Park 	int id;
144d7e8ce10SKyungmin Park 	char *name;
145d7e8ce10SKyungmin Park };
146d7e8ce10SKyungmin Park 
147*bfd7f386SKyungmin Park int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
148*bfd7f386SKyungmin Park 			struct mtd_oob_ops *ops);
149*bfd7f386SKyungmin Park 
150d7e8ce10SKyungmin Park #endif				/* __LINUX_MTD_ONENAND_H */
151