• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (C) 2014 Free Electrons
3  *
4  *  Author: Boris BREZILLON <boris.brezillon@free-electrons.com>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  */
11 #include <linux/kernel.h>
12 #include <linux/err.h>
13 #include <linux/export.h>
14 #include <linux/mtd/nand.h>
15 
16 static const struct nand_sdr_timings onfi_sdr_timings[] = {
17 	/* Mode 0 */
18 	{
19 		.tADL_min = 200000,
20 		.tALH_min = 20000,
21 		.tALS_min = 50000,
22 		.tAR_min = 25000,
23 		.tCEA_max = 100000,
24 		.tCEH_min = 20000,
25 		.tCH_min = 20000,
26 		.tCHZ_max = 100000,
27 		.tCLH_min = 20000,
28 		.tCLR_min = 20000,
29 		.tCLS_min = 50000,
30 		.tCOH_min = 0,
31 		.tCS_min = 70000,
32 		.tDH_min = 20000,
33 		.tDS_min = 40000,
34 		.tFEAT_max = 1000000,
35 		.tIR_min = 10000,
36 		.tITC_max = 1000000,
37 		.tRC_min = 100000,
38 		.tREA_max = 40000,
39 		.tREH_min = 30000,
40 		.tRHOH_min = 0,
41 		.tRHW_min = 200000,
42 		.tRHZ_max = 200000,
43 		.tRLOH_min = 0,
44 		.tRP_min = 50000,
45 		.tRST_max = 250000000000ULL,
46 		.tWB_max = 200000,
47 		.tRR_min = 40000,
48 		.tWC_min = 100000,
49 		.tWH_min = 30000,
50 		.tWHR_min = 120000,
51 		.tWP_min = 50000,
52 		.tWW_min = 100000,
53 	},
54 	/* Mode 1 */
55 	{
56 		.tADL_min = 100000,
57 		.tALH_min = 10000,
58 		.tALS_min = 25000,
59 		.tAR_min = 10000,
60 		.tCEA_max = 45000,
61 		.tCEH_min = 20000,
62 		.tCH_min = 10000,
63 		.tCHZ_max = 50000,
64 		.tCLH_min = 10000,
65 		.tCLR_min = 10000,
66 		.tCLS_min = 25000,
67 		.tCOH_min = 15000,
68 		.tCS_min = 35000,
69 		.tDH_min = 10000,
70 		.tDS_min = 20000,
71 		.tFEAT_max = 1000000,
72 		.tIR_min = 0,
73 		.tITC_max = 1000000,
74 		.tRC_min = 50000,
75 		.tREA_max = 30000,
76 		.tREH_min = 15000,
77 		.tRHOH_min = 15000,
78 		.tRHW_min = 100000,
79 		.tRHZ_max = 100000,
80 		.tRLOH_min = 0,
81 		.tRP_min = 25000,
82 		.tRR_min = 20000,
83 		.tRST_max = 500000000,
84 		.tWB_max = 100000,
85 		.tWC_min = 45000,
86 		.tWH_min = 15000,
87 		.tWHR_min = 80000,
88 		.tWP_min = 25000,
89 		.tWW_min = 100000,
90 	},
91 	/* Mode 2 */
92 	{
93 		.tADL_min = 100000,
94 		.tALH_min = 10000,
95 		.tALS_min = 15000,
96 		.tAR_min = 10000,
97 		.tCEA_max = 30000,
98 		.tCEH_min = 20000,
99 		.tCH_min = 10000,
100 		.tCHZ_max = 50000,
101 		.tCLH_min = 10000,
102 		.tCLR_min = 10000,
103 		.tCLS_min = 15000,
104 		.tCOH_min = 15000,
105 		.tCS_min = 25000,
106 		.tDH_min = 5000,
107 		.tDS_min = 15000,
108 		.tFEAT_max = 1000000,
109 		.tIR_min = 0,
110 		.tITC_max = 1000000,
111 		.tRC_min = 35000,
112 		.tREA_max = 25000,
113 		.tREH_min = 15000,
114 		.tRHOH_min = 15000,
115 		.tRHW_min = 100000,
116 		.tRHZ_max = 100000,
117 		.tRLOH_min = 0,
118 		.tRR_min = 20000,
119 		.tRST_max = 500000000,
120 		.tWB_max = 100000,
121 		.tRP_min = 17000,
122 		.tWC_min = 35000,
123 		.tWH_min = 15000,
124 		.tWHR_min = 80000,
125 		.tWP_min = 17000,
126 		.tWW_min = 100000,
127 	},
128 	/* Mode 3 */
129 	{
130 		.tADL_min = 100000,
131 		.tALH_min = 5000,
132 		.tALS_min = 10000,
133 		.tAR_min = 10000,
134 		.tCEA_max = 25000,
135 		.tCEH_min = 20000,
136 		.tCH_min = 5000,
137 		.tCHZ_max = 50000,
138 		.tCLH_min = 5000,
139 		.tCLR_min = 10000,
140 		.tCLS_min = 10000,
141 		.tCOH_min = 15000,
142 		.tCS_min = 25000,
143 		.tDH_min = 5000,
144 		.tDS_min = 10000,
145 		.tFEAT_max = 1000000,
146 		.tIR_min = 0,
147 		.tITC_max = 1000000,
148 		.tRC_min = 30000,
149 		.tREA_max = 20000,
150 		.tREH_min = 10000,
151 		.tRHOH_min = 15000,
152 		.tRHW_min = 100000,
153 		.tRHZ_max = 100000,
154 		.tRLOH_min = 0,
155 		.tRP_min = 15000,
156 		.tRR_min = 20000,
157 		.tRST_max = 500000000,
158 		.tWB_max = 100000,
159 		.tWC_min = 30000,
160 		.tWH_min = 10000,
161 		.tWHR_min = 80000,
162 		.tWP_min = 15000,
163 		.tWW_min = 100000,
164 	},
165 	/* Mode 4 */
166 	{
167 		.tADL_min = 70000,
168 		.tALH_min = 5000,
169 		.tALS_min = 10000,
170 		.tAR_min = 10000,
171 		.tCEA_max = 25000,
172 		.tCEH_min = 20000,
173 		.tCH_min = 5000,
174 		.tCHZ_max = 30000,
175 		.tCLH_min = 5000,
176 		.tCLR_min = 10000,
177 		.tCLS_min = 10000,
178 		.tCOH_min = 15000,
179 		.tCS_min = 20000,
180 		.tDH_min = 5000,
181 		.tDS_min = 10000,
182 		.tFEAT_max = 1000000,
183 		.tIR_min = 0,
184 		.tITC_max = 1000000,
185 		.tRC_min = 25000,
186 		.tREA_max = 20000,
187 		.tREH_min = 10000,
188 		.tRHOH_min = 15000,
189 		.tRHW_min = 100000,
190 		.tRHZ_max = 100000,
191 		.tRLOH_min = 5000,
192 		.tRP_min = 12000,
193 		.tRR_min = 20000,
194 		.tRST_max = 500000000,
195 		.tWB_max = 100000,
196 		.tWC_min = 25000,
197 		.tWH_min = 10000,
198 		.tWHR_min = 80000,
199 		.tWP_min = 12000,
200 		.tWW_min = 100000,
201 	},
202 	/* Mode 5 */
203 	{
204 		.tADL_min = 70000,
205 		.tALH_min = 5000,
206 		.tALS_min = 10000,
207 		.tAR_min = 10000,
208 		.tCEA_max = 25000,
209 		.tCEH_min = 20000,
210 		.tCH_min = 5000,
211 		.tCHZ_max = 30000,
212 		.tCLH_min = 5000,
213 		.tCLR_min = 10000,
214 		.tCLS_min = 10000,
215 		.tCOH_min = 15000,
216 		.tCS_min = 15000,
217 		.tDH_min = 5000,
218 		.tDS_min = 7000,
219 		.tFEAT_max = 1000000,
220 		.tIR_min = 0,
221 		.tITC_max = 1000000,
222 		.tRC_min = 20000,
223 		.tREA_max = 16000,
224 		.tREH_min = 7000,
225 		.tRHOH_min = 15000,
226 		.tRHW_min = 100000,
227 		.tRHZ_max = 100000,
228 		.tRLOH_min = 5000,
229 		.tRP_min = 10000,
230 		.tRR_min = 20000,
231 		.tRST_max = 500000000,
232 		.tWB_max = 100000,
233 		.tWC_min = 20000,
234 		.tWH_min = 7000,
235 		.tWHR_min = 80000,
236 		.tWP_min = 10000,
237 		.tWW_min = 100000,
238 	},
239 };
240 
241 /**
242  * onfi_async_timing_mode_to_sdr_timings - [NAND Interface] Retrieve NAND
243  * timings according to the given ONFI timing mode
244  * @mode: ONFI timing mode
245  */
onfi_async_timing_mode_to_sdr_timings(int mode)246 const struct nand_sdr_timings *onfi_async_timing_mode_to_sdr_timings(int mode)
247 {
248 	if (mode < 0 || mode >= ARRAY_SIZE(onfi_sdr_timings))
249 		return ERR_PTR(-EINVAL);
250 
251 	return &onfi_sdr_timings[mode];
252 }
253 EXPORT_SYMBOL(onfi_async_timing_mode_to_sdr_timings);
254