[PATCH 6/8] mtd: rawnand: mtk: Introduce mtk_ecc_calc_parity_bytes() function
Xiaolei Li
xiaolei.li at mediatek.com
Tue Apr 10 20:41:56 PDT 2018
Introduce mtk_ecc_calc_parity_bytes() function to calculate ECC
parity byte number.
Signed-off-by: Xiaolei Li <xiaolei.li at mediatek.com>
---
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
More information about the Linux-mediatek
mailing list