|
|
|
|
@@ -45,7 +45,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
/* dummy register offsets, used by write_reg_dma */
|
|
|
|
|
#define NAND_DEV_CMD1_RESTORE 0xdead
|
|
|
|
|
@@ -131,6 +134,11 @@
|
|
|
|
|
@@ -135,6 +138,11 @@
|
|
|
|
|
#define ERASED_PAGE (PAGE_ALL_ERASED | PAGE_ERASED)
|
|
|
|
|
#define ERASED_CW (CODEWORD_ALL_ERASED | CODEWORD_ERASED)
|
|
|
|
|
|
|
|
|
|
@@ -57,9 +57,9 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
/* Version Mask */
|
|
|
|
|
#define NAND_VERSION_MAJOR_MASK 0xf0000000
|
|
|
|
|
#define NAND_VERSION_MAJOR_SHIFT 28
|
|
|
|
|
@@ -148,6 +156,9 @@
|
|
|
|
|
#define FETCH_ID 0xb
|
|
|
|
|
#define RESET_DEVICE 0xd
|
|
|
|
|
@@ -156,6 +164,9 @@
|
|
|
|
|
#define NAND_DEV_CMD_VLD_VAL (READ_START_VLD | WRITE_START_VLD | \
|
|
|
|
|
ERASE_START_VLD | SEQ_READ_START_VLD)
|
|
|
|
|
|
|
|
|
|
+/* NAND_CTRL bits */
|
|
|
|
|
+#define BAM_MODE_EN BIT(0)
|
|
|
|
|
@@ -67,7 +67,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
/*
|
|
|
|
|
* the NAND controller performs reads/writes with ECC in 516 byte chunks.
|
|
|
|
|
* the driver calls the chunks 'step' or 'codeword' interchangeably
|
|
|
|
|
@@ -169,12 +180,77 @@
|
|
|
|
|
@@ -177,12 +188,77 @@
|
|
|
|
|
#define ECC_BCH_4BIT BIT(2)
|
|
|
|
|
#define ECC_BCH_8BIT BIT(3)
|
|
|
|
|
|
|
|
|
|
@@ -145,7 +145,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@@ -202,6 +278,13 @@ struct nandc_regs {
|
|
|
|
|
@@ -210,6 +286,13 @@ struct nandc_regs {
|
|
|
|
|
__le32 orig_vld;
|
|
|
|
|
|
|
|
|
|
__le32 ecc_buf_cfg;
|
|
|
|
|
@@ -159,7 +159,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@@ -217,6 +300,7 @@ struct nandc_regs {
|
|
|
|
|
@@ -225,6 +308,7 @@ struct nandc_regs {
|
|
|
|
|
* @aon_clk: another controller clock
|
|
|
|
|
*
|
|
|
|
|
* @chan: dma channel
|
|
|
|
|
@@ -167,7 +167,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
* @cmd_crci: ADM DMA CRCI for command flow control
|
|
|
|
|
* @data_crci: ADM DMA CRCI for data flow control
|
|
|
|
|
* @desc_list: DMA descriptor list (list of desc_infos)
|
|
|
|
|
@@ -242,6 +326,7 @@ struct nandc_regs {
|
|
|
|
|
@@ -250,6 +334,7 @@ struct nandc_regs {
|
|
|
|
|
struct qcom_nand_controller {
|
|
|
|
|
struct nand_hw_control controller;
|
|
|
|
|
struct list_head host_list;
|
|
|
|
|
@@ -175,7 +175,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
struct device *dev;
|
|
|
|
|
|
|
|
|
|
@@ -342,6 +427,45 @@ struct qcom_nand_driver_data {
|
|
|
|
|
@@ -350,6 +435,45 @@ struct qcom_nand_driver_data {
|
|
|
|
|
bool dma_bam_enabled;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@@ -221,7 +221,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
static inline struct qcom_nand_host *to_qcom_nand_host(struct nand_chip *chip)
|
|
|
|
|
{
|
|
|
|
|
return container_of(chip, struct qcom_nand_host, chip);
|
|
|
|
|
@@ -398,6 +522,16 @@ static __le32 *offset_to_nandc_reg(struc
|
|
|
|
|
@@ -406,6 +530,16 @@ static __le32 *offset_to_nandc_reg(struc
|
|
|
|
|
return ®s->orig_vld;
|
|
|
|
|
case NAND_EBI2_ECC_BUF_CFG:
|
|
|
|
|
return ®s->ecc_buf_cfg;
|
|
|
|
|
@@ -238,7 +238,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
default:
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
@@ -439,7 +573,7 @@ static void update_rw_regs(struct qcom_n
|
|
|
|
|
@@ -447,7 +581,7 @@ static void update_rw_regs(struct qcom_n
|
|
|
|
|
{
|
|
|
|
|
struct nand_chip *chip = &host->chip;
|
|
|
|
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
|
|
|
|
@@ -247,7 +247,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
if (read) {
|
|
|
|
|
if (host->use_ecc)
|
|
|
|
|
@@ -456,12 +590,20 @@ static void update_rw_regs(struct qcom_n
|
|
|
|
|
@@ -464,12 +598,20 @@ static void update_rw_regs(struct qcom_n
|
|
|
|
|
|
|
|
|
|
cfg1 = host->cfg1;
|
|
|
|
|
ecc_bch_cfg = host->ecc_bch_cfg;
|
|
|
|
|
@@ -268,7 +268,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nandc_set_reg(nandc, NAND_FLASH_CMD, cmd);
|
|
|
|
|
@@ -472,8 +614,104 @@ static void update_rw_regs(struct qcom_n
|
|
|
|
|
@@ -480,8 +622,104 @@ static void update_rw_regs(struct qcom_n
|
|
|
|
|
nandc_set_reg(nandc, NAND_FLASH_STATUS, host->clrflashstatus);
|
|
|
|
|
nandc_set_reg(nandc, NAND_READ_STATUS, host->clrreadstatus);
|
|
|
|
|
nandc_set_reg(nandc, NAND_EXEC_CMD, 1);
|
|
|
|
|
@@ -373,7 +373,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
static int prep_dma_desc(struct qcom_nand_controller *nandc, bool read,
|
|
|
|
|
int reg_off, const void *vaddr, int size,
|
|
|
|
|
bool flow_control)
|
|
|
|
|
@@ -552,7 +790,7 @@ err:
|
|
|
|
|
@@ -560,7 +798,7 @@ err:
|
|
|
|
|
* @num_regs: number of registers to read
|
|
|
|
|
*/
|
|
|
|
|
static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
|
|
|
|
@@ -382,7 +382,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
{
|
|
|
|
|
bool flow_control = false;
|
|
|
|
|
void *vaddr;
|
|
|
|
|
@@ -561,10 +799,18 @@ static int read_reg_dma(struct qcom_nand
|
|
|
|
|
@@ -569,10 +807,18 @@ static int read_reg_dma(struct qcom_nand
|
|
|
|
|
if (first == NAND_READ_ID || first == NAND_FLASH_STATUS)
|
|
|
|
|
flow_control = true;
|
|
|
|
|
|
|
|
|
|
@@ -402,7 +402,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
return prep_dma_desc(nandc, true, first, vaddr, size, flow_control);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -576,7 +822,7 @@ static int read_reg_dma(struct qcom_nand
|
|
|
|
|
@@ -584,7 +830,7 @@ static int read_reg_dma(struct qcom_nand
|
|
|
|
|
* @num_regs: number of registers to write
|
|
|
|
|
*/
|
|
|
|
|
static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
|
|
|
|
|
@@ -411,7 +411,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
{
|
|
|
|
|
bool flow_control = false;
|
|
|
|
|
struct nandc_regs *regs = nandc->regs;
|
|
|
|
|
@@ -588,12 +834,29 @@ static int write_reg_dma(struct qcom_nan
|
|
|
|
|
@@ -596,12 +842,29 @@ static int write_reg_dma(struct qcom_nan
|
|
|
|
|
if (first == NAND_FLASH_CMD)
|
|
|
|
|
flow_control = true;
|
|
|
|
|
|
|
|
|
|
@@ -441,7 +441,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
size = num_regs * sizeof(u32);
|
|
|
|
|
|
|
|
|
|
return prep_dma_desc(nandc, false, first, vaddr, size, flow_control);
|
|
|
|
|
@@ -608,8 +871,12 @@ static int write_reg_dma(struct qcom_nan
|
|
|
|
|
@@ -616,8 +879,12 @@ static int write_reg_dma(struct qcom_nan
|
|
|
|
|
* @size: DMA transaction size in bytes
|
|
|
|
|
*/
|
|
|
|
|
static int read_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
|
|
|
|
@@ -455,7 +455,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
return prep_dma_desc(nandc, true, reg_off, vaddr, size, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -622,8 +889,12 @@ static int read_data_dma(struct qcom_nan
|
|
|
|
|
@@ -630,8 +897,12 @@ static int read_data_dma(struct qcom_nan
|
|
|
|
|
* @size: DMA transaction size in bytes
|
|
|
|
|
*/
|
|
|
|
|
static int write_data_dma(struct qcom_nand_controller *nandc, int reg_off,
|
|
|
|
|
@@ -469,7 +469,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
return prep_dma_desc(nandc, false, reg_off, vaddr, size, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -633,14 +904,57 @@ static int write_data_dma(struct qcom_na
|
|
|
|
|
@@ -641,14 +912,57 @@ static int write_data_dma(struct qcom_na
|
|
|
|
|
*/
|
|
|
|
|
static void config_cw_read(struct qcom_nand_controller *nandc)
|
|
|
|
|
{
|
|
|
|
|
@@ -533,7 +533,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@@ -649,19 +963,20 @@ static void config_cw_read(struct qcom_n
|
|
|
|
|
@@ -657,19 +971,20 @@ static void config_cw_read(struct qcom_n
|
|
|
|
|
*/
|
|
|
|
|
static void config_cw_write_pre(struct qcom_nand_controller *nandc)
|
|
|
|
|
{
|
|
|
|
|
@@ -561,7 +561,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@@ -675,6 +990,8 @@ static int nandc_param(struct qcom_nand_
|
|
|
|
|
@@ -683,6 +998,8 @@ static int nandc_param(struct qcom_nand_
|
|
|
|
|
struct nand_chip *chip = &host->chip;
|
|
|
|
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
|
|
|
|
|
|
|
|
|
@@ -570,7 +570,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
/*
|
|
|
|
|
* NAND_CMD_PARAM is called before we know much about the FLASH chip
|
|
|
|
|
* in use. we configure the controller to perform a raw read of 512
|
|
|
|
|
@@ -708,9 +1025,13 @@ static int nandc_param(struct qcom_nand_
|
|
|
|
|
@@ -715,9 +1032,13 @@ static int nandc_param(struct qcom_nand_
|
|
|
|
|
|
|
|
|
|
nandc_set_reg(nandc, NAND_DEV_CMD1_RESTORE, nandc->cmd1);
|
|
|
|
|
nandc_set_reg(nandc, NAND_DEV_CMD_VLD_RESTORE, nandc->vld);
|
|
|
|
|
@@ -586,7 +586,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
nandc->buf_count = 512;
|
|
|
|
|
memset(nandc->data_buffer, 0xff, nandc->buf_count);
|
|
|
|
|
@@ -718,11 +1039,12 @@ static int nandc_param(struct qcom_nand_
|
|
|
|
|
@@ -725,11 +1046,12 @@ static int nandc_param(struct qcom_nand_
|
|
|
|
|
config_cw_read(nandc);
|
|
|
|
|
|
|
|
|
|
read_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer,
|
|
|
|
|
@@ -602,7 +602,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
@@ -733,6 +1055,8 @@ static int erase_block(struct qcom_nand_
|
|
|
|
|
@@ -740,6 +1062,8 @@ static int erase_block(struct qcom_nand_
|
|
|
|
|
struct nand_chip *chip = &host->chip;
|
|
|
|
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
|
|
|
|
|
|
|
|
|
@@ -611,7 +611,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
nandc_set_reg(nandc, NAND_FLASH_CMD,
|
|
|
|
|
BLOCK_ERASE | PAGE_ACC | LAST_PAGE);
|
|
|
|
|
nandc_set_reg(nandc, NAND_ADDR0, page_addr);
|
|
|
|
|
@@ -744,14 +1068,15 @@ static int erase_block(struct qcom_nand_
|
|
|
|
|
@@ -751,14 +1075,15 @@ static int erase_block(struct qcom_nand_
|
|
|
|
|
nandc_set_reg(nandc, NAND_FLASH_STATUS, host->clrflashstatus);
|
|
|
|
|
nandc_set_reg(nandc, NAND_READ_STATUS, host->clrreadstatus);
|
|
|
|
|
|
|
|
|
|
@@ -633,7 +633,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
@@ -765,16 +1090,19 @@ static int read_id(struct qcom_nand_host
|
|
|
|
|
@@ -772,16 +1097,19 @@ static int read_id(struct qcom_nand_host
|
|
|
|
|
if (column == -1)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
@@ -657,7 +657,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
@@ -785,28 +1113,108 @@ static int reset(struct qcom_nand_host *
|
|
|
|
|
@@ -792,28 +1120,108 @@ static int reset(struct qcom_nand_host *
|
|
|
|
|
struct nand_chip *chip = &host->chip;
|
|
|
|
|
struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
|
|
|
|
|
|
|
|
|
|
@@ -771,7 +771,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
@@ -817,7 +1225,16 @@ static void free_descs(struct qcom_nand_
|
|
|
|
|
@@ -824,7 +1232,16 @@ static void free_descs(struct qcom_nand_
|
|
|
|
|
|
|
|
|
|
list_for_each_entry_safe(desc, n, &nandc->desc_list, node) {
|
|
|
|
|
list_del(&desc->node);
|
|
|
|
|
@@ -789,7 +789,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
kfree(desc);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -1128,6 +1545,9 @@ static int read_page_ecc(struct qcom_nan
|
|
|
|
|
@@ -1135,6 +1552,9 @@ static int read_page_ecc(struct qcom_nan
|
|
|
|
|
struct nand_ecc_ctrl *ecc = &chip->ecc;
|
|
|
|
|
int i, ret;
|
|
|
|
|
|
|
|
|
|
@@ -799,7 +799,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
/* queue cmd descs for each codeword */
|
|
|
|
|
for (i = 0; i < ecc->steps; i++) {
|
|
|
|
|
int data_size, oob_size;
|
|
|
|
|
@@ -1141,11 +1561,36 @@ static int read_page_ecc(struct qcom_nan
|
|
|
|
|
@@ -1148,11 +1568,36 @@ static int read_page_ecc(struct qcom_nan
|
|
|
|
|
oob_size = host->ecc_bytes_hw + host->spare_bytes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -838,7 +838,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* when ecc is enabled, the controller doesn't read the real
|
|
|
|
|
@@ -1161,7 +1606,7 @@ static int read_page_ecc(struct qcom_nan
|
|
|
|
|
@@ -1168,7 +1613,7 @@ static int read_page_ecc(struct qcom_nan
|
|
|
|
|
*oob_buf++ = 0xff;
|
|
|
|
|
|
|
|
|
|
read_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
|
|
|
|
@@ -847,7 +847,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (data_buf)
|
|
|
|
|
@@ -1200,10 +1645,14 @@ static int copy_last_cw(struct qcom_nand
|
|
|
|
|
@@ -1207,10 +1652,14 @@ static int copy_last_cw(struct qcom_nand
|
|
|
|
|
|
|
|
|
|
set_address(host, host->cw_size * (ecc->steps - 1), page);
|
|
|
|
|
update_rw_regs(host, 1, true);
|
|
|
|
|
@@ -863,7 +863,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
ret = submit_descs(nandc);
|
|
|
|
|
if (ret)
|
|
|
|
|
@@ -1226,6 +1675,7 @@ static int qcom_nandc_read_page(struct m
|
|
|
|
|
@@ -1233,6 +1682,7 @@ static int qcom_nandc_read_page(struct m
|
|
|
|
|
data_buf = buf;
|
|
|
|
|
oob_buf = oob_required ? chip->oob_poi : NULL;
|
|
|
|
|
|
|
|
|
|
@@ -871,7 +871,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
ret = read_page_ecc(host, data_buf, oob_buf);
|
|
|
|
|
if (ret) {
|
|
|
|
|
dev_err(nandc->dev, "failure to read page\n");
|
|
|
|
|
@@ -1245,13 +1695,19 @@ static int qcom_nandc_read_page_raw(stru
|
|
|
|
|
@@ -1252,13 +1702,19 @@ static int qcom_nandc_read_page_raw(stru
|
|
|
|
|
u8 *data_buf, *oob_buf;
|
|
|
|
|
struct nand_ecc_ctrl *ecc = &chip->ecc;
|
|
|
|
|
int i, ret;
|
|
|
|
|
@@ -891,7 +891,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
for (i = 0; i < ecc->steps; i++) {
|
|
|
|
|
int data_size1, data_size2, oob_size1, oob_size2;
|
|
|
|
|
int reg_off = FLASH_BUF_ACC;
|
|
|
|
|
@@ -1269,21 +1725,49 @@ static int qcom_nandc_read_page_raw(stru
|
|
|
|
|
@@ -1276,21 +1732,49 @@ static int qcom_nandc_read_page_raw(stru
|
|
|
|
|
oob_size2 = host->ecc_bytes_hw + host->spare_bytes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -946,7 +946,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
oob_buf += oob_size2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1306,6 +1790,7 @@ static int qcom_nandc_read_oob(struct mt
|
|
|
|
|
@@ -1313,6 +1797,7 @@ static int qcom_nandc_read_oob(struct mt
|
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
|
|
clear_read_regs(nandc);
|
|
|
|
|
@@ -954,7 +954,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
host->use_ecc = true;
|
|
|
|
|
set_address(host, 0, page);
|
|
|
|
|
@@ -1329,6 +1814,7 @@ static int qcom_nandc_write_page(struct
|
|
|
|
|
@@ -1336,6 +1821,7 @@ static int qcom_nandc_write_page(struct
|
|
|
|
|
int i, ret;
|
|
|
|
|
|
|
|
|
|
clear_read_regs(nandc);
|
|
|
|
|
@@ -962,7 +962,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
data_buf = (u8 *)buf;
|
|
|
|
|
oob_buf = chip->oob_poi;
|
|
|
|
|
@@ -1350,7 +1836,8 @@ static int qcom_nandc_write_page(struct
|
|
|
|
|
@@ -1357,7 +1843,8 @@ static int qcom_nandc_write_page(struct
|
|
|
|
|
|
|
|
|
|
config_cw_write_pre(nandc);
|
|
|
|
|
|
|
|
|
|
@@ -972,7 +972,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* when ECC is enabled, we don't really need to write anything
|
|
|
|
|
@@ -1363,7 +1850,7 @@ static int qcom_nandc_write_page(struct
|
|
|
|
|
@@ -1370,7 +1857,7 @@ static int qcom_nandc_write_page(struct
|
|
|
|
|
oob_buf += host->bbm_size;
|
|
|
|
|
|
|
|
|
|
write_data_dma(nandc, FLASH_BUF_ACC + data_size,
|
|
|
|
|
@@ -981,7 +981,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
config_cw_write_post(nandc);
|
|
|
|
|
@@ -1393,6 +1880,7 @@ static int qcom_nandc_write_page_raw(str
|
|
|
|
|
@@ -1400,6 +1887,7 @@ static int qcom_nandc_write_page_raw(str
|
|
|
|
|
int i, ret;
|
|
|
|
|
|
|
|
|
|
clear_read_regs(nandc);
|
|
|
|
|
@@ -989,7 +989,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
data_buf = (u8 *)buf;
|
|
|
|
|
oob_buf = chip->oob_poi;
|
|
|
|
|
@@ -1419,19 +1907,22 @@ static int qcom_nandc_write_page_raw(str
|
|
|
|
|
@@ -1426,19 +1914,22 @@ static int qcom_nandc_write_page_raw(str
|
|
|
|
|
|
|
|
|
|
config_cw_write_pre(nandc);
|
|
|
|
|
|
|
|
|
|
@@ -1016,7 +1016,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
oob_buf += oob_size2;
|
|
|
|
|
|
|
|
|
|
config_cw_write_post(nandc);
|
|
|
|
|
@@ -1467,6 +1958,7 @@ static int qcom_nandc_write_oob(struct m
|
|
|
|
|
@@ -1474,6 +1965,7 @@ static int qcom_nandc_write_oob(struct m
|
|
|
|
|
|
|
|
|
|
host->use_ecc = true;
|
|
|
|
|
|
|
|
|
|
@@ -1024,7 +1024,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
ret = copy_last_cw(host, page);
|
|
|
|
|
if (ret)
|
|
|
|
|
return ret;
|
|
|
|
|
@@ -1486,7 +1978,7 @@ static int qcom_nandc_write_oob(struct m
|
|
|
|
|
@@ -1493,7 +1985,7 @@ static int qcom_nandc_write_oob(struct m
|
|
|
|
|
|
|
|
|
|
config_cw_write_pre(nandc);
|
|
|
|
|
write_data_dma(nandc, FLASH_BUF_ACC, nandc->data_buffer,
|
|
|
|
|
@@ -1033,7 +1033,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
config_cw_write_post(nandc);
|
|
|
|
|
|
|
|
|
|
ret = submit_descs(nandc);
|
|
|
|
|
@@ -1524,6 +2016,7 @@ static int qcom_nandc_block_bad(struct m
|
|
|
|
|
@@ -1531,6 +2023,7 @@ static int qcom_nandc_block_bad(struct m
|
|
|
|
|
*/
|
|
|
|
|
host->use_ecc = false;
|
|
|
|
|
|
|
|
|
|
@@ -1041,7 +1041,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
ret = copy_last_cw(host, page);
|
|
|
|
|
if (ret)
|
|
|
|
|
goto err;
|
|
|
|
|
@@ -1554,6 +2047,7 @@ static int qcom_nandc_block_markbad(stru
|
|
|
|
|
@@ -1561,6 +2054,7 @@ static int qcom_nandc_block_markbad(stru
|
|
|
|
|
int page, ret, status = 0;
|
|
|
|
|
|
|
|
|
|
clear_read_regs(nandc);
|
|
|
|
|
@@ -1049,7 +1049,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* to mark the BBM as bad, we flash the entire last codeword with 0s.
|
|
|
|
|
@@ -1570,7 +2064,8 @@ static int qcom_nandc_block_markbad(stru
|
|
|
|
|
@@ -1577,7 +2071,8 @@ static int qcom_nandc_block_markbad(stru
|
|
|
|
|
update_rw_regs(host, 1, false);
|
|
|
|
|
|
|
|
|
|
config_cw_write_pre(nandc);
|
|
|
|
|
@@ -1059,7 +1059,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
config_cw_write_post(nandc);
|
|
|
|
|
|
|
|
|
|
ret = submit_descs(nandc);
|
|
|
|
|
@@ -1930,6 +2425,8 @@ static int qcom_nand_host_setup(struct q
|
|
|
|
|
@@ -1937,6 +2432,8 @@ static int qcom_nand_host_setup(struct q
|
|
|
|
|
|
|
|
|
|
host->clrflashstatus = FS_READY_BSY_N;
|
|
|
|
|
host->clrreadstatus = 0xc0;
|
|
|
|
|
@@ -1068,7 +1068,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
|
|
|
|
|
dev_dbg(nandc->dev,
|
|
|
|
|
"cfg0 %x cfg1 %x ecc_buf_cfg %x ecc_bch cfg %x cw_size %d cw_data %d strength %d parity_bytes %d steps %d\n",
|
|
|
|
|
@@ -2008,6 +2505,12 @@ static int qcom_nandc_alloc(struct qcom_
|
|
|
|
|
@@ -2015,6 +2512,12 @@ static int qcom_nandc_alloc(struct qcom_
|
|
|
|
|
dev_err(nandc->dev, "failed to request cmd channel\n");
|
|
|
|
|
return -ENODEV;
|
|
|
|
|
}
|
|
|
|
|
@@ -1081,7 +1081,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
INIT_LIST_HEAD(&nandc->desc_list);
|
|
|
|
|
@@ -2043,6 +2546,9 @@ static void qcom_nandc_unalloc(struct qc
|
|
|
|
|
@@ -2050,6 +2553,9 @@ static void qcom_nandc_unalloc(struct qc
|
|
|
|
|
devm_kfree(nandc->dev, nandc->reg_read_buf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1091,7 +1091,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
if (nandc->regs)
|
|
|
|
|
devm_kfree(nandc->dev, nandc->regs);
|
|
|
|
|
|
|
|
|
|
@@ -2053,11 +2559,18 @@ static void qcom_nandc_unalloc(struct qc
|
|
|
|
|
@@ -2060,12 +2566,19 @@ static void qcom_nandc_unalloc(struct qc
|
|
|
|
|
/* one time setup of a few nand controller registers */
|
|
|
|
|
static int qcom_nandc_setup(struct qcom_nand_controller *nandc)
|
|
|
|
|
{
|
|
|
|
|
@@ -1099,6 +1099,7 @@ Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
|
|
|
|
|
+
|
|
|
|
|
/* kill onenand */
|
|
|
|
|
nandc_write(nandc, SFLASHC_BURST_CFG, 0);
|
|
|
|
|
nandc_write(nandc, NAND_DEV_CMD_VLD, NAND_DEV_CMD_VLD_VAL);
|
|
|
|
|
|
|
|
|
|
- /* enable ADM DMA */
|
|
|
|
|
- nandc_write(nandc, NAND_FLASH_CHIP_SELECT, DM_EN);
|
|
|
|
|
|