diff options
Diffstat (limited to 'target/linux/ipq806x/patches-4.9/861-qcom-mtd-nand-Added-bam-transaction-and-support-addi.patch')
-rw-r--r-- | target/linux/ipq806x/patches-4.9/861-qcom-mtd-nand-Added-bam-transaction-and-support-addi.patch | 103 |
1 files changed, 52 insertions, 51 deletions
diff --git a/target/linux/ipq806x/patches-4.9/861-qcom-mtd-nand-Added-bam-transaction-and-support-addi.patch b/target/linux/ipq806x/patches-4.9/861-qcom-mtd-nand-Added-bam-transaction-and-support-addi.patch index 84f90b4..4b9f672 100644 --- a/target/linux/ipq806x/patches-4.9/861-qcom-mtd-nand-Added-bam-transaction-and-support-addi.patch +++ b/target/linux/ipq806x/patches-4.9/861-qcom-mtd-nand-Added-bam-transaction-and-support-addi.patch @@ -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); |