commit
ad608a21f8
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,252 @@ |
||||
/*
|
||||
* 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 <common.h> |
||||
#include <linux/kernel.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 = 250000000000ULL, |
||||
.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); |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,64 @@ |
||||
#ifndef __ASM_ARCH_PXA3XX_NAND_H |
||||
#define __ASM_ARCH_PXA3XX_NAND_H |
||||
|
||||
#include <linux/mtd/mtd.h> |
||||
#include <linux/mtd/partitions.h> |
||||
|
||||
struct pxa3xx_nand_timing { |
||||
unsigned int tCH; /* Enable signal hold time */ |
||||
unsigned int tCS; /* Enable signal setup time */ |
||||
unsigned int tWH; /* ND_nWE high duration */ |
||||
unsigned int tWP; /* ND_nWE pulse time */ |
||||
unsigned int tRH; /* ND_nRE high duration */ |
||||
unsigned int tRP; /* ND_nRE pulse width */ |
||||
unsigned int tR; /* ND_nWE high to ND_nRE low for read */ |
||||
unsigned int tWHR; /* ND_nWE high to ND_nRE low for status read */ |
||||
unsigned int tAR; /* ND_ALE low to ND_nRE low delay */ |
||||
}; |
||||
|
||||
struct pxa3xx_nand_flash { |
||||
uint32_t chip_id; |
||||
unsigned int flash_width; /* Width of Flash memory (DWIDTH_M) */ |
||||
unsigned int dfc_width; /* Width of flash controller(DWIDTH_C) */ |
||||
struct pxa3xx_nand_timing *timing; /* NAND Flash timing */ |
||||
}; |
||||
|
||||
/*
|
||||
* Current pxa3xx_nand controller has two chip select which |
||||
* both be workable. |
||||
* |
||||
* Notice should be taken that: |
||||
* When you want to use this feature, you should not enable the |
||||
* keep configuration feature, for two chip select could be |
||||
* attached with different nand chip. The different page size |
||||
* and timing requirement make the keep configuration impossible. |
||||
*/ |
||||
|
||||
/* The max num of chip select current support */ |
||||
#define NUM_CHIP_SELECT (2) |
||||
struct pxa3xx_nand_platform_data { |
||||
/* the data flash bus is shared between the Static Memory
|
||||
* Controller and the Data Flash Controller, the arbiter |
||||
* controls the ownership of the bus |
||||
*/ |
||||
int enable_arbiter; |
||||
|
||||
/* allow platform code to keep OBM/bootloader defined NFC config */ |
||||
int keep_config; |
||||
|
||||
/* indicate how many chip selects will be used */ |
||||
int num_cs; |
||||
|
||||
/* use an flash-based bad block table */ |
||||
bool flash_bbt; |
||||
|
||||
/* requested ECC strength and ECC step size */ |
||||
int ecc_strength, ecc_step_size; |
||||
|
||||
const struct mtd_partition *parts[NUM_CHIP_SELECT]; |
||||
unsigned int nr_parts[NUM_CHIP_SELECT]; |
||||
|
||||
const struct pxa3xx_nand_flash *flash; |
||||
size_t num_flash; |
||||
}; |
||||
#endif /* __ASM_ARCH_PXA3XX_NAND_H */ |
Loading…
Reference in new issue