mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2026-01-24 15:52:58 +00:00
mtd: rawnand: sunxi: Embed sunxi_nand_hw_ecc by value
The sunxi_nand_hw_ecc object is not shared, and it has the same lifetime as the sunxi_nand_chip which points to it, so we can embed it in the outer structure instead of using a pointer. This removes an unnecessary memory allocation and simplifies the error handling code. Signed-off-by: Samuel Holland <samuel@sholland.org> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20230204143520.9682-3-samuel@sholland.org
This commit is contained in:
parent
3998a4611e
commit
ac1c7072e3
@ -193,7 +193,7 @@ struct sunxi_nand_hw_ecc {
|
||||
struct sunxi_nand_chip {
|
||||
struct list_head node;
|
||||
struct nand_chip nand;
|
||||
struct sunxi_nand_hw_ecc *ecc;
|
||||
struct sunxi_nand_hw_ecc ecc;
|
||||
unsigned long clk_rate;
|
||||
u32 timing_cfg;
|
||||
u32 timing_ctl;
|
||||
@ -694,7 +694,7 @@ static void sunxi_nfc_hw_ecc_enable(struct nand_chip *nand)
|
||||
ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
|
||||
ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
|
||||
NFC_ECC_BLOCK_SIZE_MSK);
|
||||
ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(sunxi_nand->ecc->mode) |
|
||||
ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(sunxi_nand->ecc.mode) |
|
||||
NFC_ECC_EXCEPTION | NFC_ECC_PIPELINE;
|
||||
|
||||
if (nand->ecc.size == 512)
|
||||
@ -1626,11 +1626,6 @@ static const struct mtd_ooblayout_ops sunxi_nand_ooblayout_ops = {
|
||||
.free = sunxi_nand_ooblayout_free,
|
||||
};
|
||||
|
||||
static void sunxi_nand_hw_ecc_ctrl_cleanup(struct sunxi_nand_chip *sunxi_nand)
|
||||
{
|
||||
kfree(sunxi_nand->ecc);
|
||||
}
|
||||
|
||||
static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand,
|
||||
struct nand_ecc_ctrl *ecc,
|
||||
struct device_node *np)
|
||||
@ -1641,7 +1636,6 @@ static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand,
|
||||
struct mtd_info *mtd = nand_to_mtd(nand);
|
||||
struct nand_device *nanddev = mtd_to_nanddev(mtd);
|
||||
int nsectors;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
if (nanddev->ecc.user_conf.flags & NAND_ECC_MAXIMIZE_STRENGTH) {
|
||||
@ -1676,10 +1670,6 @@ static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand,
|
||||
if (ecc->size != 512 && ecc->size != 1024)
|
||||
return -EINVAL;
|
||||
|
||||
sunxi_nand->ecc = kzalloc(sizeof(*sunxi_nand->ecc), GFP_KERNEL);
|
||||
if (!sunxi_nand->ecc)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Prefer 1k ECC chunk over 512 ones */
|
||||
if (ecc->size == 512 && mtd->writesize > 512) {
|
||||
ecc->size = 1024;
|
||||
@ -1700,11 +1690,10 @@ static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand,
|
||||
|
||||
if (i >= ARRAY_SIZE(strengths)) {
|
||||
dev_err(nfc->dev, "unsupported strength\n");
|
||||
ret = -ENOTSUPP;
|
||||
goto err;
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
sunxi_nand->ecc->mode = i;
|
||||
sunxi_nand->ecc.mode = i;
|
||||
|
||||
/* HW ECC always request ECC bytes for 1024 bytes blocks */
|
||||
ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
|
||||
@ -1714,10 +1703,8 @@ static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand,
|
||||
|
||||
nsectors = mtd->writesize / ecc->size;
|
||||
|
||||
if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
if (mtd->oobsize < ((ecc->bytes + 4) * nsectors))
|
||||
return -EINVAL;
|
||||
|
||||
ecc->read_oob = sunxi_nfc_hw_ecc_read_oob;
|
||||
ecc->write_oob = sunxi_nfc_hw_ecc_write_oob;
|
||||
@ -1740,25 +1727,6 @@ static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand,
|
||||
ecc->write_oob_raw = nand_write_oob_std;
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
kfree(sunxi_nand->ecc);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void sunxi_nand_ecc_cleanup(struct sunxi_nand_chip *sunxi_nand)
|
||||
{
|
||||
struct nand_ecc_ctrl *ecc = &sunxi_nand->nand.ecc;
|
||||
|
||||
switch (ecc->engine_type) {
|
||||
case NAND_ECC_ENGINE_TYPE_ON_HOST:
|
||||
sunxi_nand_hw_ecc_ctrl_cleanup(sunxi_nand);
|
||||
break;
|
||||
case NAND_ECC_ENGINE_TYPE_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int sunxi_nand_attach_chip(struct nand_chip *nand)
|
||||
@ -1971,7 +1939,6 @@ static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
|
||||
ret = mtd_device_unregister(nand_to_mtd(chip));
|
||||
WARN_ON(ret);
|
||||
nand_cleanup(chip);
|
||||
sunxi_nand_ecc_cleanup(sunxi_nand);
|
||||
list_del(&sunxi_nand->node);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user