Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
fsmc.h
Go to the documentation of this file.
1 /*
2  * incude/mtd/fsmc.h
3  *
4  * ST Microelectronics
5  * Flexible Static Memory Controller (FSMC)
6  * platform data interface and header file
7  *
8  * Copyright © 2010 ST Microelectronics
9  * Vipin Kumar <[email protected]>
10  *
11  * This file is licensed under the terms of the GNU General Public
12  * License version 2. This program is licensed "as is" without any
13  * warranty of any kind, whether express or implied.
14  */
15 
16 #ifndef __MTD_FSMC_H
17 #define __MTD_FSMC_H
18 
19 #include <linux/io.h>
20 #include <linux/platform_device.h>
21 #include <linux/mtd/physmap.h>
22 #include <linux/types.h>
23 #include <linux/mtd/partitions.h>
24 #include <asm/param.h>
25 
26 #define FSMC_NAND_BW8 1
27 #define FSMC_NAND_BW16 2
28 
29 #define FSMC_MAX_NOR_BANKS 4
30 #define FSMC_MAX_NAND_BANKS 4
31 
32 #define FSMC_FLASH_WIDTH8 1
33 #define FSMC_FLASH_WIDTH16 2
34 
35 /* fsmc controller registers for NOR flash */
36 #define CTRL 0x0
37  /* ctrl register definitions */
38  #define BANK_ENABLE (1 << 0)
39  #define MUXED (1 << 1)
40  #define NOR_DEV (2 << 2)
41  #define WIDTH_8 (0 << 4)
42  #define WIDTH_16 (1 << 4)
43  #define RSTPWRDWN (1 << 6)
44  #define WPROT (1 << 7)
45  #define WRT_ENABLE (1 << 12)
46  #define WAIT_ENB (1 << 13)
47 
48 #define CTRL_TIM 0x4
49  /* ctrl_tim register definitions */
50 
51 #define FSMC_NOR_BANK_SZ 0x8
52 #define FSMC_NOR_REG_SIZE 0x40
53 
54 #define FSMC_NOR_REG(base, bank, reg) (base + \
55  FSMC_NOR_BANK_SZ * (bank) + \
56  reg)
57 
58 /* fsmc controller registers for NAND flash */
59 #define PC 0x00
60  /* pc register definitions */
61  #define FSMC_RESET (1 << 0)
62  #define FSMC_WAITON (1 << 1)
63  #define FSMC_ENABLE (1 << 2)
64  #define FSMC_DEVTYPE_NAND (1 << 3)
65  #define FSMC_DEVWID_8 (0 << 4)
66  #define FSMC_DEVWID_16 (1 << 4)
67  #define FSMC_ECCEN (1 << 6)
68  #define FSMC_ECCPLEN_512 (0 << 7)
69  #define FSMC_ECCPLEN_256 (1 << 7)
70  #define FSMC_TCLR_1 (1)
71  #define FSMC_TCLR_SHIFT (9)
72  #define FSMC_TCLR_MASK (0xF)
73  #define FSMC_TAR_1 (1)
74  #define FSMC_TAR_SHIFT (13)
75  #define FSMC_TAR_MASK (0xF)
76 #define STS 0x04
77  /* sts register definitions */
78  #define FSMC_CODE_RDY (1 << 15)
79 #define COMM 0x08
80  /* comm register definitions */
81  #define FSMC_TSET_0 0
82  #define FSMC_TSET_SHIFT 0
83  #define FSMC_TSET_MASK 0xFF
84  #define FSMC_TWAIT_6 6
85  #define FSMC_TWAIT_SHIFT 8
86  #define FSMC_TWAIT_MASK 0xFF
87  #define FSMC_THOLD_4 4
88  #define FSMC_THOLD_SHIFT 16
89  #define FSMC_THOLD_MASK 0xFF
90  #define FSMC_THIZ_1 1
91  #define FSMC_THIZ_SHIFT 24
92  #define FSMC_THIZ_MASK 0xFF
93 #define ATTRIB 0x0C
94 #define IOATA 0x10
95 #define ECC1 0x14
96 #define ECC2 0x18
97 #define ECC3 0x1C
98 #define FSMC_NAND_BANK_SZ 0x20
99 
100 #define FSMC_NAND_REG(base, bank, reg) (base + FSMC_NOR_REG_SIZE + \
101  (FSMC_NAND_BANK_SZ * (bank)) + \
102  reg)
103 
104 #define FSMC_BUSY_WAIT_TIMEOUT (1 * HZ)
105 
106 /*
107  * There are 13 bytes of ecc for every 512 byte block in FSMC version 8
108  * and it has to be read consecutively and immediately after the 512
109  * byte data block for hardware to generate the error bit offsets
110  * Managing the ecc bytes in the following way is easier. This way is
111  * similar to oobfree structure maintained already in u-boot nand driver
112  */
113 #define MAX_ECCPLACE_ENTRIES 32
114 
118 };
119 
122 };
123 
131 };
132 
136 };
137 
153  unsigned int nr_partitions;
154  unsigned int options;
155  unsigned int width;
156  unsigned int bank;
157 
158  /* CLE, ALE offsets */
159  unsigned int cle_off;
160  unsigned int ale_off;
162 
164 
165  /* priv structures for dma accesses */
168 };
169 
170 extern int __init fsmc_nor_init(struct platform_device *pdev,
171  unsigned long base, uint32_t bank, uint32_t width);
172 extern void __init fsmc_init_board_info(struct platform_device *pdev,
173  struct mtd_partition *partitions, unsigned int nr_partitions,
174  unsigned int width);
175 
176 #endif /* __MTD_FSMC_H */