forked from Minki/linux
mtd: rawnand: Add onfi_fill_nvddr_interface_config() helper
Same logic as for the SDR path, let's create a onfi_fill_nvddr_interface_config() helper to fill an interface configuration structure with NV-DDR timings, given a specific ONFI mode. There is one additional thing to do compared to SDR mode: tCAD timing can be fast or slow and this depends on an ONFI parameter page bit. By default the slow value is declared in the timings structure definition, but this helper can shrink it down if necessary. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20210505213750.257417-12-miquel.raynal@bootlin.com
This commit is contained in:
parent
94c8ce8e3e
commit
45606518f9
@ -315,6 +315,7 @@ int nand_onfi_detect(struct nand_chip *chip)
|
|||||||
onfi->tBERS = le16_to_cpu(p->t_bers);
|
onfi->tBERS = le16_to_cpu(p->t_bers);
|
||||||
onfi->tR = le16_to_cpu(p->t_r);
|
onfi->tR = le16_to_cpu(p->t_r);
|
||||||
onfi->tCCS = le16_to_cpu(p->t_ccs);
|
onfi->tCCS = le16_to_cpu(p->t_ccs);
|
||||||
|
onfi->fast_tCAD = p->nvddr_nvddr2_features & BIT(0);
|
||||||
onfi->sdr_timing_modes = le16_to_cpu(p->sdr_timing_modes);
|
onfi->sdr_timing_modes = le16_to_cpu(p->sdr_timing_modes);
|
||||||
if (p->features & ONFI_FEATURE_NV_DDR)
|
if (p->features & ONFI_FEATURE_NV_DDR)
|
||||||
onfi->nvddr_timing_modes = p->nvddr_timing_modes;
|
onfi->nvddr_timing_modes = p->nvddr_timing_modes;
|
||||||
|
@ -636,6 +636,45 @@ static void onfi_fill_sdr_interface_config(struct nand_chip *chip,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* onfi_fill_nvddr_interface_config - Initialize a NVDDR interface config from a
|
||||||
|
* given ONFI mode
|
||||||
|
* @chip: The NAND chip
|
||||||
|
* @iface: The interface configuration to fill
|
||||||
|
* @timing_mode: The ONFI timing mode
|
||||||
|
*/
|
||||||
|
static void onfi_fill_nvddr_interface_config(struct nand_chip *chip,
|
||||||
|
struct nand_interface_config *iface,
|
||||||
|
unsigned int timing_mode)
|
||||||
|
{
|
||||||
|
struct onfi_params *onfi = chip->parameters.onfi;
|
||||||
|
|
||||||
|
if (WARN_ON(timing_mode >= ARRAY_SIZE(onfi_nvddr_timings)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
*iface = onfi_nvddr_timings[timing_mode];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize timings that cannot be deduced from timing mode:
|
||||||
|
* tPROG, tBERS, tR, tCCS and tCAD.
|
||||||
|
* These information are part of the ONFI parameter page.
|
||||||
|
*/
|
||||||
|
if (onfi) {
|
||||||
|
struct nand_nvddr_timings *timings = &iface->timings.nvddr;
|
||||||
|
|
||||||
|
/* microseconds -> picoseconds */
|
||||||
|
timings->tPROG_max = 1000000ULL * onfi->tPROG;
|
||||||
|
timings->tBERS_max = 1000000ULL * onfi->tBERS;
|
||||||
|
timings->tR_max = 1000000ULL * onfi->tR;
|
||||||
|
|
||||||
|
/* nanoseconds -> picoseconds */
|
||||||
|
timings->tCCS_min = 1000UL * onfi->tCCS;
|
||||||
|
|
||||||
|
if (onfi->fast_tCAD)
|
||||||
|
timings->tCAD_min = 25000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* onfi_fill_interface_config - Initialize an interface config from a given
|
* onfi_fill_interface_config - Initialize an interface config from a given
|
||||||
* ONFI mode
|
* ONFI mode
|
||||||
@ -651,4 +690,6 @@ void onfi_fill_interface_config(struct nand_chip *chip,
|
|||||||
{
|
{
|
||||||
if (type == NAND_SDR_IFACE)
|
if (type == NAND_SDR_IFACE)
|
||||||
return onfi_fill_sdr_interface_config(chip, iface, timing_mode);
|
return onfi_fill_sdr_interface_config(chip, iface, timing_mode);
|
||||||
|
else
|
||||||
|
return onfi_fill_nvddr_interface_config(chip, iface, timing_mode);
|
||||||
}
|
}
|
||||||
|
@ -162,6 +162,7 @@ struct onfi_ext_param_page {
|
|||||||
* @tBERS: Block erase time
|
* @tBERS: Block erase time
|
||||||
* @tR: Page read time
|
* @tR: Page read time
|
||||||
* @tCCS: Change column setup time
|
* @tCCS: Change column setup time
|
||||||
|
* @fast_tCAD: Command/Address/Data slow or fast delay (NV-DDR only)
|
||||||
* @sdr_timing_modes: Supported asynchronous/SDR timing modes
|
* @sdr_timing_modes: Supported asynchronous/SDR timing modes
|
||||||
* @nvddr_timing_modes: Supported source synchronous/NV-DDR timing modes
|
* @nvddr_timing_modes: Supported source synchronous/NV-DDR timing modes
|
||||||
* @vendor_revision: Vendor specific revision number
|
* @vendor_revision: Vendor specific revision number
|
||||||
@ -173,6 +174,7 @@ struct onfi_params {
|
|||||||
u16 tBERS;
|
u16 tBERS;
|
||||||
u16 tR;
|
u16 tR;
|
||||||
u16 tCCS;
|
u16 tCCS;
|
||||||
|
bool fast_tCAD;
|
||||||
u16 sdr_timing_modes;
|
u16 sdr_timing_modes;
|
||||||
u16 nvddr_timing_modes;
|
u16 nvddr_timing_modes;
|
||||||
u16 vendor_revision;
|
u16 vendor_revision;
|
||||||
|
Loading…
Reference in New Issue
Block a user