2 * Copyright (C) 2014 Free Electrons
4 * Author: Boris BREZILLON <boris.brezillon@free-electrons.com>
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.
12 #include <linux/kernel.h>
13 #include <linux/mtd/rawnand.h>
15 static const struct nand_data_interface onfi_sdr_timings[] = {
18 .type = NAND_SDR_IFACE,
49 .tRST_max = 250000000000ULL,
60 .type = NAND_SDR_IFACE,
91 .tRST_max = 500000000,
102 .type = NAND_SDR_IFACE,
121 .tFEAT_max = 1000000,
132 .tRST_max = 500000000,
144 .type = NAND_SDR_IFACE,
163 .tFEAT_max = 1000000,
175 .tRST_max = 500000000,
186 .type = NAND_SDR_IFACE,
205 .tFEAT_max = 1000000,
217 .tRST_max = 500000000,
228 .type = NAND_SDR_IFACE,
247 .tFEAT_max = 1000000,
259 .tRST_max = 500000000,
271 * onfi_async_timing_mode_to_sdr_timings - [NAND Interface] Retrieve NAND
272 * timings according to the given ONFI timing mode
273 * @mode: ONFI timing mode
275 const struct nand_sdr_timings *onfi_async_timing_mode_to_sdr_timings(int mode)
277 if (mode < 0 || mode >= ARRAY_SIZE(onfi_sdr_timings))
278 return ERR_PTR(-EINVAL);
280 return &onfi_sdr_timings[mode].timings.sdr;
282 EXPORT_SYMBOL(onfi_async_timing_mode_to_sdr_timings);
285 * onfi_init_data_interface - [NAND Interface] Initialize a data interface from
287 * @iface: The data interface to be initialized
288 * @mode: The ONFI timing mode
290 int onfi_init_data_interface(struct nand_chip *chip,
291 struct nand_data_interface *iface,
292 enum nand_data_interface_type type,
295 if (type != NAND_SDR_IFACE)
298 if (timing_mode < 0 || timing_mode >= ARRAY_SIZE(onfi_sdr_timings))
301 *iface = onfi_sdr_timings[timing_mode];
304 * Initialize timings that cannot be deduced from timing mode:
305 * tR, tPROG, tCCS, ...
306 * These information are part of the ONFI parameter page.
308 if (chip->onfi_version) {
309 struct nand_onfi_params *params = &chip->onfi_params;
310 struct nand_sdr_timings *timings = &iface->timings.sdr;
312 /* microseconds -> picoseconds */
313 timings->tPROG_max = 1000000ULL * le16_to_cpu(params->t_prog);
314 timings->tBERS_max = 1000000ULL * le16_to_cpu(params->t_bers);
315 timings->tR_max = 1000000ULL * le16_to_cpu(params->t_r);
317 /* nanoseconds -> picoseconds */
318 timings->tCCS_min = 1000UL * le16_to_cpu(params->t_ccs);
323 EXPORT_SYMBOL(onfi_init_data_interface);
326 * nand_get_default_data_interface - [NAND Interface] Retrieve NAND
327 * data interface for mode 0. This is used as default timing after
330 const struct nand_data_interface *nand_get_default_data_interface(void)
332 return &onfi_sdr_timings[0];
334 EXPORT_SYMBOL(nand_get_default_data_interface);