From mboxrd@z Thu Jan 1 00:00:00 1970 From: Xiaolei Li To: , CC: , , , Subject: [PATCH 6/8] mtd: rawnand: mtk: Introduce mtk_ecc_calc_parity_bytes() function Date: Wed, 11 Apr 2018 11:41:56 +0800 Message-ID: <1523418118-57686-7-git-send-email-xiaolei.li@mediatek.com> In-Reply-To: <1523418118-57686-1-git-send-email-xiaolei.li@mediatek.com> References: <1523418118-57686-1-git-send-email-xiaolei.li@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Introduce mtk_ecc_calc_parity_bytes() function to calculate ECC parity byte number. Signed-off-by: Xiaolei Li --- drivers/mtd/nand/raw/mtk_ecc.c | 10 ++++++++-- drivers/mtd/nand/raw/mtk_ecc.h | 1 + drivers/mtd/nand/raw/mtk_nand.c | 6 ++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/mtd/nand/raw/mtk_ecc.c b/drivers/mtd/nand/raw/mtk_ecc.c index 40d86a8..717d553 100644 --- a/drivers/mtd/nand/raw/mtk_ecc.c +++ b/drivers/mtd/nand/raw/mtk_ecc.c @@ -408,7 +408,7 @@ int mtk_ecc_encode(struct mtk_ecc *ecc, struct mtk_ecc_config *config, mtk_ecc_wait_idle(ecc, ECC_ENCODE); /* Program ECC bytes to OOB: per sector oob = FDM + ECC + SPARE */ - len = (config->strength * ecc->caps->parity_bits + 7) >> 3; + len = mtk_ecc_calc_parity_bytes(ecc, config->strength); /* write the parity bytes generated by the ECC back to temp buffer */ __ioread32_copy(ecc->eccdata, @@ -451,6 +451,12 @@ unsigned int mtk_ecc_get_parity_bits(struct mtk_ecc *ecc) } EXPORT_SYMBOL(mtk_ecc_get_parity_bits); +int mtk_ecc_calc_parity_bytes(struct mtk_ecc *ecc, int ecc_strength) +{ + return DIV_ROUND_UP(ecc->caps->parity_bits * ecc_strength, 8); +} +EXPORT_SYMBOL(mtk_ecc_calc_parity_bytes); + static const struct mtk_ecc_caps mtk_ecc_caps_mt2701 = { .err_mask = 0x3f, .ecc_strength = ecc_strength_mt2701, @@ -516,7 +522,7 @@ static int mtk_ecc_probe(struct platform_device *pdev) max_eccdata_size = ecc->caps->num_ecc_strength - 1; max_eccdata_size = ecc->caps->ecc_strength[max_eccdata_size]; - max_eccdata_size = (max_eccdata_size * ecc->caps->parity_bits + 7) >> 3; + max_eccdata_size = mtk_ecc_calc_parity_bytes(ecc, max_eccdata_size); max_eccdata_size = round_up(max_eccdata_size, 4); ecc->eccdata = devm_kzalloc(dev, max_eccdata_size, GFP_KERNEL); if (!ecc->eccdata) diff --git a/drivers/mtd/nand/raw/mtk_ecc.h b/drivers/mtd/nand/raw/mtk_ecc.h index a455df0..c1546f9 100644 --- a/drivers/mtd/nand/raw/mtk_ecc.h +++ b/drivers/mtd/nand/raw/mtk_ecc.h @@ -42,6 +42,7 @@ struct mtk_ecc_config { void mtk_ecc_disable(struct mtk_ecc *); void mtk_ecc_adjust_strength(struct mtk_ecc *ecc, u32 *p); unsigned int mtk_ecc_get_parity_bits(struct mtk_ecc *ecc); +int mtk_ecc_calc_parity_bytes(struct mtk_ecc *ecc, int ecc_strength); struct mtk_ecc *of_mtk_ecc_get(struct device_node *); void mtk_ecc_release(struct mtk_ecc *); diff --git a/drivers/mtd/nand/raw/mtk_nand.c b/drivers/mtd/nand/raw/mtk_nand.c index 2c244c2..249b3fb 100644 --- a/drivers/mtd/nand/raw/mtk_nand.c +++ b/drivers/mtd/nand/raw/mtk_nand.c @@ -1143,8 +1143,7 @@ static int mtk_nfc_set_fdm(struct mtk_nfc_fdm *fdm, struct mtd_info *mtd) struct mtk_nfc *nfc = nand_get_controller_data(nand); u32 ecc_bytes; - ecc_bytes = DIV_ROUND_UP(nand->ecc.strength * - mtk_ecc_get_parity_bits(nfc->ecc), 8); + ecc_bytes = mtk_ecc_calc_parity_bytes(nfc->ecc, nand->ecc.strength); fdm->reg_size = chip->spare_per_sector - ecc_bytes; if (fdm->reg_size > NFI_FDM_MAX_SIZE) { @@ -1245,8 +1244,7 @@ static int mtk_nfc_ecc_init(struct device *dev, struct mtd_info *mtd) return ret; /* calculate oob bytes except ecc parity data */ - free = (nand->ecc.strength * mtk_ecc_get_parity_bits(nfc->ecc) - + 7) >> 3; + free = mtk_ecc_calc_parity_bytes(nfc->ecc, nand->ecc.strength); free = spare - free; /* -- 1.9.1