xref: /openbmc/u-boot/include/linux/mtd/onenand.h (revision d438d50848e9425286e5fb0493e0affb5a0b1e1b)
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 
20*d438d508SKyungmin 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;
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);
85d7e8ce10SKyungmin Park 	int (*read_bufferram) (struct mtd_info * mtd, int area,
86d7e8ce10SKyungmin Park 			       unsigned char *buffer, int offset, size_t count);
87d7e8ce10SKyungmin Park 	int (*write_bufferram) (struct mtd_info * mtd, int area,
88d7e8ce10SKyungmin Park 				const unsigned char *buffer, int offset,
89d7e8ce10SKyungmin Park 				size_t count);
90d7e8ce10SKyungmin Park 	unsigned short (*read_word) (void __iomem * addr);
91d7e8ce10SKyungmin Park 	void (*write_word) (unsigned short value, void __iomem * addr);
92d7e8ce10SKyungmin Park 	void (*mmcontrol) (struct mtd_info * mtd, int sync_read);
93*d438d508SKyungmin Park 	int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);
94*d438d508SKyungmin Park 	int (*scan_bbt)(struct mtd_info *mtd);
95d7e8ce10SKyungmin Park 
96d7e8ce10SKyungmin Park 	spinlock_t chip_lock;
97d7e8ce10SKyungmin Park 	wait_queue_head_t wq;
98*d438d508SKyungmin Park 	int state;
99d7e8ce10SKyungmin Park 
100d7e8ce10SKyungmin Park 	struct nand_oobinfo *autooob;
101d7e8ce10SKyungmin Park 
102d7e8ce10SKyungmin Park 	void *bbm;
103d7e8ce10SKyungmin Park 
104d7e8ce10SKyungmin Park 	void *priv;
105d7e8ce10SKyungmin Park };
106d7e8ce10SKyungmin Park 
107d7e8ce10SKyungmin Park #define ONENAND_CURRENT_BUFFERRAM(this)		(this->bufferram_index)
108d7e8ce10SKyungmin Park #define ONENAND_NEXT_BUFFERRAM(this)		(this->bufferram_index ^ 1)
109d7e8ce10SKyungmin Park #define ONENAND_SET_NEXT_BUFFERRAM(this)	(this->bufferram_index ^= 1)
110d7e8ce10SKyungmin Park 
111d7e8ce10SKyungmin Park /*
112d7e8ce10SKyungmin Park  * Options bits
113d7e8ce10SKyungmin Park  */
114d7e8ce10SKyungmin Park #define ONENAND_CONT_LOCK		(0x0001)
115d7e8ce10SKyungmin Park 
116d7e8ce10SKyungmin Park /*
117d7e8ce10SKyungmin Park  * OneNAND Flash Manufacturer ID Codes
118d7e8ce10SKyungmin Park  */
119d7e8ce10SKyungmin Park #define ONENAND_MFR_SAMSUNG	0xec
120d7e8ce10SKyungmin Park #define ONENAND_MFR_UNKNOWN	0x00
121d7e8ce10SKyungmin Park 
122d7e8ce10SKyungmin Park /**
123d7e8ce10SKyungmin Park  * struct nand_manufacturers - NAND Flash Manufacturer ID Structure
124d7e8ce10SKyungmin Park  * @param name:		Manufacturer name
125d7e8ce10SKyungmin Park  * @param id:		manufacturer ID code of device.
126d7e8ce10SKyungmin Park */
127d7e8ce10SKyungmin Park struct onenand_manufacturers {
128d7e8ce10SKyungmin Park 	int id;
129d7e8ce10SKyungmin Park 	char *name;
130d7e8ce10SKyungmin Park };
131d7e8ce10SKyungmin Park 
132d7e8ce10SKyungmin Park #endif				/* __LINUX_MTD_ONENAND_H */
133