xref: /openbmc/u-boot/include/linux/mtd/onenand.h (revision 4678d674f0cacc983dca7f6b9933cd8291c9797c)
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
33ef0921d6SKyungmin Park  * @param blockpage	block & page address in BufferRAM
34d7e8ce10SKyungmin Park  */
35d7e8ce10SKyungmin Park struct onenand_bufferram {
36ef0921d6SKyungmin Park 	int blockpage;
37d7e8ce10SKyungmin Park };
38d7e8ce10SKyungmin Park 
39d7e8ce10SKyungmin Park /**
40d7e8ce10SKyungmin Park  * struct onenand_chip - OneNAND Private Flash Chip Data
41d7e8ce10SKyungmin Park  * @param base		[BOARDSPECIFIC] address to access OneNAND
42d7e8ce10SKyungmin Park  * @param chipsize	[INTERN] the size of one chip for multichip arrays
43d7e8ce10SKyungmin Park  * @param device_id	[INTERN] device ID
44d7e8ce10SKyungmin Park  * @param verstion_id	[INTERN] version ID
45d7e8ce10SKyungmin Park  * @param options	[BOARDSPECIFIC] various chip options. They can partly be set to inform onenand_scan about
46d7e8ce10SKyungmin Park  * @param erase_shift	[INTERN] number of address bits in a block
47d7e8ce10SKyungmin Park  * @param page_shift	[INTERN] number of address bits in a page
48d7e8ce10SKyungmin Park  * @param ppb_shift	[INTERN] number of address bits in a pages per block
49d7e8ce10SKyungmin Park  * @param page_mask	[INTERN] a page per block mask
50c45912d8SScott Wood  * @param writesize	[INTERN] a real page size
51d7e8ce10SKyungmin Park  * @param bufferam_index	[INTERN] BufferRAM index
52d7e8ce10SKyungmin Park  * @param bufferam	[INTERN] BufferRAM info
53d7e8ce10SKyungmin Park  * @param readw		[REPLACEABLE] hardware specific function for read short
54d7e8ce10SKyungmin Park  * @param writew	[REPLACEABLE] hardware specific function for write short
55d7e8ce10SKyungmin Park  * @param command	[REPLACEABLE] hardware specific function for writing commands to the chip
56d7e8ce10SKyungmin Park  * @param wait		[REPLACEABLE] hardware specific function for wait on ready
57d7e8ce10SKyungmin Park  * @param read_bufferram	[REPLACEABLE] hardware specific function for BufferRAM Area
58d7e8ce10SKyungmin Park  * @param write_bufferram	[REPLACEABLE] hardware specific function for BufferRAM Area
59d7e8ce10SKyungmin Park  * @param chip_lock	[INTERN] spinlock used to protect access to this structure and the chip
60d7e8ce10SKyungmin Park  * @param wq		[INTERN] wait queue to sleep on if a OneNAND operation is in progress
61d7e8ce10SKyungmin Park  * @param state		[INTERN] the current state of the OneNAND device
62d7e8ce10SKyungmin Park  * @param autooob	[REPLACEABLE] the default (auto)placement scheme
63d7e8ce10SKyungmin Park  * @param priv		[OPTIONAL] pointer to private chip date
64d7e8ce10SKyungmin Park  */
65d7e8ce10SKyungmin Park struct onenand_chip {
66d7e8ce10SKyungmin Park 	void __iomem *base;
67d7e8ce10SKyungmin Park 	unsigned int chipsize;
68d7e8ce10SKyungmin Park 	unsigned int device_id;
69ef0921d6SKyungmin Park 	unsigned int version_id;
70ef0921d6SKyungmin Park 	unsigned int density_mask;
71d7e8ce10SKyungmin Park 	unsigned int options;
72d7e8ce10SKyungmin Park 
73d7e8ce10SKyungmin Park 	unsigned int erase_shift;
74d7e8ce10SKyungmin Park 	unsigned int page_shift;
75d7e8ce10SKyungmin Park 	unsigned int ppb_shift;	/* Pages per block shift */
76d7e8ce10SKyungmin Park 	unsigned int page_mask;
77bfd7f386SKyungmin Park 	unsigned int writesize;
78d7e8ce10SKyungmin Park 
79d7e8ce10SKyungmin Park 	unsigned int bufferram_index;
80d7e8ce10SKyungmin Park 	struct onenand_bufferram bufferram[MAX_BUFFERRAM];
81d7e8ce10SKyungmin Park 
82d7e8ce10SKyungmin Park 	int (*command) (struct mtd_info *mtd, int cmd, loff_t address,
83d7e8ce10SKyungmin Park 			size_t len);
84d7e8ce10SKyungmin Park 	int (*wait) (struct mtd_info *mtd, int state);
85ef0921d6SKyungmin Park 	int (*bbt_wait) (struct mtd_info *mtd, int state);
86ce3277a6SKyungmin Park 	void (*unlock_all)(struct mtd_info *mtd);
87ef0921d6SKyungmin Park 	int (*read_bufferram) (struct mtd_info *mtd, loff_t addr, int area,
88d7e8ce10SKyungmin Park 			       unsigned char *buffer, int offset, size_t count);
89ef0921d6SKyungmin Park 	int (*write_bufferram) (struct mtd_info *mtd, loff_t addr, int area,
90d7e8ce10SKyungmin Park 				const unsigned char *buffer, int offset,
91d7e8ce10SKyungmin Park 				size_t count);
92d7e8ce10SKyungmin Park 	unsigned short (*read_word) (void __iomem *addr);
93d7e8ce10SKyungmin Park 	void (*write_word) (unsigned short value, void __iomem *addr);
94d7e8ce10SKyungmin Park 	void (*mmcontrol) (struct mtd_info *mtd, int sync_read);
95d438d508SKyungmin Park 	int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
96d438d508SKyungmin Park 	int (*scan_bbt)(struct mtd_info *mtd);
97d7e8ce10SKyungmin Park 
98ef0921d6SKyungmin Park 	unsigned char		*main_buf;
99ef0921d6SKyungmin Park 	unsigned char		*spare_buf;
100ef0921d6SKyungmin Park #ifdef DONT_USE_UBOOT
101ef0921d6SKyungmin Park 	spinlock_t chip_lock;
102ef0921d6SKyungmin Park 	wait_queue_head_t wq;
103ef0921d6SKyungmin Park #endif
104d438d508SKyungmin Park 	int state;
105bfd7f386SKyungmin Park 	unsigned char		*page_buf;
106bfd7f386SKyungmin Park 	unsigned char		*oob_buf;
107d7e8ce10SKyungmin Park 
108d7e8ce10SKyungmin Park 	struct nand_oobinfo *autooob;
1091ae39862SStefan Roese 	int			subpagesize;
110bfd7f386SKyungmin Park 	struct nand_ecclayout	*ecclayout;
111d7e8ce10SKyungmin Park 
112d7e8ce10SKyungmin Park 	void *bbm;
113d7e8ce10SKyungmin Park 
114d7e8ce10SKyungmin Park 	void *priv;
115d7e8ce10SKyungmin Park };
116d7e8ce10SKyungmin Park 
117bfd7f386SKyungmin Park /*
118bfd7f386SKyungmin Park  * Helper macros
119bfd7f386SKyungmin Park  */
120d7e8ce10SKyungmin Park #define ONENAND_CURRENT_BUFFERRAM(this)		(this->bufferram_index)
121d7e8ce10SKyungmin Park #define ONENAND_NEXT_BUFFERRAM(this)		(this->bufferram_index ^ 1)
122d7e8ce10SKyungmin Park #define ONENAND_SET_NEXT_BUFFERRAM(this)	(this->bufferram_index ^= 1)
123bfd7f386SKyungmin Park #define ONENAND_SET_PREV_BUFFERRAM(this)	(this->bufferram_index ^= 1)
124bfd7f386SKyungmin Park #define ONENAND_SET_BUFFERRAM0(this)		(this->bufferram_index = 0)
125bfd7f386SKyungmin Park #define ONENAND_SET_BUFFERRAM1(this)		(this->bufferram_index = 1)
126bfd7f386SKyungmin Park 
127bfd7f386SKyungmin Park #define ONENAND_IS_DDP(this)						\
128bfd7f386SKyungmin Park 	(this->device_id & ONENAND_DEVICE_IS_DDP)
129bfd7f386SKyungmin Park 
130bfd7f386SKyungmin Park #define ONENAND_IS_2PLANE(this)			(0)
131d7e8ce10SKyungmin Park 
132d7e8ce10SKyungmin Park /*
133d7e8ce10SKyungmin Park  * Options bits
134d7e8ce10SKyungmin Park  */
135ef0921d6SKyungmin Park #define ONENAND_HAS_CONT_LOCK		(0x0001)
136ef0921d6SKyungmin Park #define ONENAND_HAS_UNLOCK_ALL		(0x0002)
137ef0921d6SKyungmin Park #define ONENAND_HAS_2PLANE		(0x0004)
138*4678d674SMinkyu Kang #define ONENAND_RUNTIME_BADBLOCK_CHECK	(0x0200)
139bfd7f386SKyungmin Park #define ONENAND_PAGEBUF_ALLOC		(0x1000)
140bfd7f386SKyungmin Park #define ONENAND_OOBBUF_ALLOC		(0x2000)
141d7e8ce10SKyungmin Park 
142d7e8ce10SKyungmin Park /*
143d7e8ce10SKyungmin Park  * OneNAND Flash Manufacturer ID Codes
144d7e8ce10SKyungmin Park  */
145d7e8ce10SKyungmin Park #define ONENAND_MFR_SAMSUNG	0xec
146d7e8ce10SKyungmin Park 
147d7e8ce10SKyungmin Park /**
148d7e8ce10SKyungmin Park  * struct nand_manufacturers - NAND Flash Manufacturer ID Structure
149d7e8ce10SKyungmin Park  * @param name:		Manufacturer name
150d7e8ce10SKyungmin Park  * @param id:		manufacturer ID code of device.
151d7e8ce10SKyungmin Park */
152d7e8ce10SKyungmin Park struct onenand_manufacturers {
153d7e8ce10SKyungmin Park 	int id;
154d7e8ce10SKyungmin Park 	char *name;
155d7e8ce10SKyungmin Park };
156d7e8ce10SKyungmin Park 
157bfd7f386SKyungmin Park int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
158bfd7f386SKyungmin Park 			struct mtd_oob_ops *ops);
159bfd7f386SKyungmin Park 
160d7e8ce10SKyungmin Park #endif				/* __LINUX_MTD_ONENAND_H */
161