254 lines
		
	
	
	
		
			5.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			254 lines
		
	
	
	
		
			5.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  *  Copyright (C) 2014 Free Electrons | ||
|  |  * | ||
|  |  *  Author: Boris BREZILLON <boris.brezillon@free-electrons.com> | ||
|  |  * | ||
|  |  * This program is free software; you can redistribute it and/or modify | ||
|  |  * it under the terms of the GNU General Public License version 2 as | ||
|  |  * published by the Free Software Foundation. | ||
|  |  * | ||
|  |  */ | ||
|  | #include <linux/kernel.h>
 | ||
|  | #include <linux/err.h>
 | ||
|  | #include <linux/export.h>
 | ||
|  | #include <linux/mtd/nand.h>
 | ||
|  | 
 | ||
|  | static const struct nand_sdr_timings onfi_sdr_timings[] = { | ||
|  | 	/* Mode 0 */ | ||
|  | 	{ | ||
|  | 		.tADL_min = 200000, | ||
|  | 		.tALH_min = 20000, | ||
|  | 		.tALS_min = 50000, | ||
|  | 		.tAR_min = 25000, | ||
|  | 		.tCEA_max = 100000, | ||
|  | 		.tCEH_min = 20000, | ||
|  | 		.tCH_min = 20000, | ||
|  | 		.tCHZ_max = 100000, | ||
|  | 		.tCLH_min = 20000, | ||
|  | 		.tCLR_min = 20000, | ||
|  | 		.tCLS_min = 50000, | ||
|  | 		.tCOH_min = 0, | ||
|  | 		.tCS_min = 70000, | ||
|  | 		.tDH_min = 20000, | ||
|  | 		.tDS_min = 40000, | ||
|  | 		.tFEAT_max = 1000000, | ||
|  | 		.tIR_min = 10000, | ||
|  | 		.tITC_max = 1000000, | ||
|  | 		.tRC_min = 100000, | ||
|  | 		.tREA_max = 40000, | ||
|  | 		.tREH_min = 30000, | ||
|  | 		.tRHOH_min = 0, | ||
|  | 		.tRHW_min = 200000, | ||
|  | 		.tRHZ_max = 200000, | ||
|  | 		.tRLOH_min = 0, | ||
|  | 		.tRP_min = 50000, | ||
|  | 		.tRST_max = 250000000000, | ||
|  | 		.tWB_max = 200000, | ||
|  | 		.tRR_min = 40000, | ||
|  | 		.tWC_min = 100000, | ||
|  | 		.tWH_min = 30000, | ||
|  | 		.tWHR_min = 120000, | ||
|  | 		.tWP_min = 50000, | ||
|  | 		.tWW_min = 100000, | ||
|  | 	}, | ||
|  | 	/* Mode 1 */ | ||
|  | 	{ | ||
|  | 		.tADL_min = 100000, | ||
|  | 		.tALH_min = 10000, | ||
|  | 		.tALS_min = 25000, | ||
|  | 		.tAR_min = 10000, | ||
|  | 		.tCEA_max = 45000, | ||
|  | 		.tCEH_min = 20000, | ||
|  | 		.tCH_min = 10000, | ||
|  | 		.tCHZ_max = 50000, | ||
|  | 		.tCLH_min = 10000, | ||
|  | 		.tCLR_min = 10000, | ||
|  | 		.tCLS_min = 25000, | ||
|  | 		.tCOH_min = 15000, | ||
|  | 		.tCS_min = 35000, | ||
|  | 		.tDH_min = 10000, | ||
|  | 		.tDS_min = 20000, | ||
|  | 		.tFEAT_max = 1000000, | ||
|  | 		.tIR_min = 0, | ||
|  | 		.tITC_max = 1000000, | ||
|  | 		.tRC_min = 50000, | ||
|  | 		.tREA_max = 30000, | ||
|  | 		.tREH_min = 15000, | ||
|  | 		.tRHOH_min = 15000, | ||
|  | 		.tRHW_min = 100000, | ||
|  | 		.tRHZ_max = 100000, | ||
|  | 		.tRLOH_min = 0, | ||
|  | 		.tRP_min = 25000, | ||
|  | 		.tRR_min = 20000, | ||
|  | 		.tRST_max = 500000000, | ||
|  | 		.tWB_max = 100000, | ||
|  | 		.tWC_min = 45000, | ||
|  | 		.tWH_min = 15000, | ||
|  | 		.tWHR_min = 80000, | ||
|  | 		.tWP_min = 25000, | ||
|  | 		.tWW_min = 100000, | ||
|  | 	}, | ||
|  | 	/* Mode 2 */ | ||
|  | 	{ | ||
|  | 		.tADL_min = 100000, | ||
|  | 		.tALH_min = 10000, | ||
|  | 		.tALS_min = 15000, | ||
|  | 		.tAR_min = 10000, | ||
|  | 		.tCEA_max = 30000, | ||
|  | 		.tCEH_min = 20000, | ||
|  | 		.tCH_min = 10000, | ||
|  | 		.tCHZ_max = 50000, | ||
|  | 		.tCLH_min = 10000, | ||
|  | 		.tCLR_min = 10000, | ||
|  | 		.tCLS_min = 15000, | ||
|  | 		.tCOH_min = 15000, | ||
|  | 		.tCS_min = 25000, | ||
|  | 		.tDH_min = 5000, | ||
|  | 		.tDS_min = 15000, | ||
|  | 		.tFEAT_max = 1000000, | ||
|  | 		.tIR_min = 0, | ||
|  | 		.tITC_max = 1000000, | ||
|  | 		.tRC_min = 35000, | ||
|  | 		.tREA_max = 25000, | ||
|  | 		.tREH_min = 15000, | ||
|  | 		.tRHOH_min = 15000, | ||
|  | 		.tRHW_min = 100000, | ||
|  | 		.tRHZ_max = 100000, | ||
|  | 		.tRLOH_min = 0, | ||
|  | 		.tRR_min = 20000, | ||
|  | 		.tRST_max = 500000000, | ||
|  | 		.tWB_max = 100000, | ||
|  | 		.tRP_min = 17000, | ||
|  | 		.tWC_min = 35000, | ||
|  | 		.tWH_min = 15000, | ||
|  | 		.tWHR_min = 80000, | ||
|  | 		.tWP_min = 17000, | ||
|  | 		.tWW_min = 100000, | ||
|  | 	}, | ||
|  | 	/* Mode 3 */ | ||
|  | 	{ | ||
|  | 		.tADL_min = 100000, | ||
|  | 		.tALH_min = 5000, | ||
|  | 		.tALS_min = 10000, | ||
|  | 		.tAR_min = 10000, | ||
|  | 		.tCEA_max = 25000, | ||
|  | 		.tCEH_min = 20000, | ||
|  | 		.tCH_min = 5000, | ||
|  | 		.tCHZ_max = 50000, | ||
|  | 		.tCLH_min = 5000, | ||
|  | 		.tCLR_min = 10000, | ||
|  | 		.tCLS_min = 10000, | ||
|  | 		.tCOH_min = 15000, | ||
|  | 		.tCS_min = 25000, | ||
|  | 		.tDH_min = 5000, | ||
|  | 		.tDS_min = 10000, | ||
|  | 		.tFEAT_max = 1000000, | ||
|  | 		.tIR_min = 0, | ||
|  | 		.tITC_max = 1000000, | ||
|  | 		.tRC_min = 30000, | ||
|  | 		.tREA_max = 20000, | ||
|  | 		.tREH_min = 10000, | ||
|  | 		.tRHOH_min = 15000, | ||
|  | 		.tRHW_min = 100000, | ||
|  | 		.tRHZ_max = 100000, | ||
|  | 		.tRLOH_min = 0, | ||
|  | 		.tRP_min = 15000, | ||
|  | 		.tRR_min = 20000, | ||
|  | 		.tRST_max = 500000000, | ||
|  | 		.tWB_max = 100000, | ||
|  | 		.tWC_min = 30000, | ||
|  | 		.tWH_min = 10000, | ||
|  | 		.tWHR_min = 80000, | ||
|  | 		.tWP_min = 15000, | ||
|  | 		.tWW_min = 100000, | ||
|  | 	}, | ||
|  | 	/* Mode 4 */ | ||
|  | 	{ | ||
|  | 		.tADL_min = 70000, | ||
|  | 		.tALH_min = 5000, | ||
|  | 		.tALS_min = 10000, | ||
|  | 		.tAR_min = 10000, | ||
|  | 		.tCEA_max = 25000, | ||
|  | 		.tCEH_min = 20000, | ||
|  | 		.tCH_min = 5000, | ||
|  | 		.tCHZ_max = 30000, | ||
|  | 		.tCLH_min = 5000, | ||
|  | 		.tCLR_min = 10000, | ||
|  | 		.tCLS_min = 10000, | ||
|  | 		.tCOH_min = 15000, | ||
|  | 		.tCS_min = 20000, | ||
|  | 		.tDH_min = 5000, | ||
|  | 		.tDS_min = 10000, | ||
|  | 		.tFEAT_max = 1000000, | ||
|  | 		.tIR_min = 0, | ||
|  | 		.tITC_max = 1000000, | ||
|  | 		.tRC_min = 25000, | ||
|  | 		.tREA_max = 20000, | ||
|  | 		.tREH_min = 10000, | ||
|  | 		.tRHOH_min = 15000, | ||
|  | 		.tRHW_min = 100000, | ||
|  | 		.tRHZ_max = 100000, | ||
|  | 		.tRLOH_min = 5000, | ||
|  | 		.tRP_min = 12000, | ||
|  | 		.tRR_min = 20000, | ||
|  | 		.tRST_max = 500000000, | ||
|  | 		.tWB_max = 100000, | ||
|  | 		.tWC_min = 25000, | ||
|  | 		.tWH_min = 10000, | ||
|  | 		.tWHR_min = 80000, | ||
|  | 		.tWP_min = 12000, | ||
|  | 		.tWW_min = 100000, | ||
|  | 	}, | ||
|  | 	/* Mode 5 */ | ||
|  | 	{ | ||
|  | 		.tADL_min = 70000, | ||
|  | 		.tALH_min = 5000, | ||
|  | 		.tALS_min = 10000, | ||
|  | 		.tAR_min = 10000, | ||
|  | 		.tCEA_max = 25000, | ||
|  | 		.tCEH_min = 20000, | ||
|  | 		.tCH_min = 5000, | ||
|  | 		.tCHZ_max = 30000, | ||
|  | 		.tCLH_min = 5000, | ||
|  | 		.tCLR_min = 10000, | ||
|  | 		.tCLS_min = 10000, | ||
|  | 		.tCOH_min = 15000, | ||
|  | 		.tCS_min = 15000, | ||
|  | 		.tDH_min = 5000, | ||
|  | 		.tDS_min = 7000, | ||
|  | 		.tFEAT_max = 1000000, | ||
|  | 		.tIR_min = 0, | ||
|  | 		.tITC_max = 1000000, | ||
|  | 		.tRC_min = 20000, | ||
|  | 		.tREA_max = 16000, | ||
|  | 		.tREH_min = 7000, | ||
|  | 		.tRHOH_min = 15000, | ||
|  | 		.tRHW_min = 100000, | ||
|  | 		.tRHZ_max = 100000, | ||
|  | 		.tRLOH_min = 5000, | ||
|  | 		.tRP_min = 10000, | ||
|  | 		.tRR_min = 20000, | ||
|  | 		.tRST_max = 500000000, | ||
|  | 		.tWB_max = 100000, | ||
|  | 		.tWC_min = 20000, | ||
|  | 		.tWH_min = 7000, | ||
|  | 		.tWHR_min = 80000, | ||
|  | 		.tWP_min = 10000, | ||
|  | 		.tWW_min = 100000, | ||
|  | 	}, | ||
|  | }; | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * onfi_async_timing_mode_to_sdr_timings - [NAND Interface] Retrieve NAND | ||
|  |  * timings according to the given ONFI timing mode | ||
|  |  * @mode: ONFI timing mode | ||
|  |  */ | ||
|  | const struct nand_sdr_timings *onfi_async_timing_mode_to_sdr_timings(int mode) | ||
|  | { | ||
|  | 	if (mode < 0 || mode >= ARRAY_SIZE(onfi_sdr_timings)) | ||
|  | 		return ERR_PTR(-EINVAL); | ||
|  | 
 | ||
|  | 	return &onfi_sdr_timings[mode]; | ||
|  | } | ||
|  | EXPORT_SYMBOL(onfi_async_timing_mode_to_sdr_timings); |