mtd: slram: simplify register_device() cleanup

Use local variables for the list entry, mtd_info, and private data while
initializing a new device. This keeps the initialization path easier to
read and publishes the new list entry only after mtd_device_register()
has succeeded.

Signed-off-by: Ruoyu Wang <ruoyuw560@gmail.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
This commit is contained in:
Ruoyu Wang 2026-06-09 16:45:28 +08:00 committed by Miquel Raynal
parent 36f1648644
commit 4fe97a54da

View File

@ -129,6 +129,9 @@ static int slram_write(struct mtd_info *mtd, loff_t to, size_t len,
static int register_device(char *name, unsigned long start, unsigned long length)
{
slram_mtd_list_t **curmtd;
slram_mtd_list_t *new_mtd;
struct mtd_info *mtdinfo;
slram_priv_t *priv;
int ret = -ENOMEM;
curmtd = &slram_mtdlist;
@ -136,73 +139,68 @@ static int register_device(char *name, unsigned long start, unsigned long length
curmtd = &(*curmtd)->next;
}
*curmtd = kmalloc_obj(slram_mtd_list_t);
if (!(*curmtd)) {
new_mtd = kmalloc_obj(slram_mtd_list_t);
if (!new_mtd) {
E("slram: Cannot allocate new MTD device.\n");
return(-ENOMEM);
}
(*curmtd)->mtdinfo = kzalloc_obj(struct mtd_info);
(*curmtd)->next = NULL;
new_mtd->next = NULL;
if ((*curmtd)->mtdinfo) {
(*curmtd)->mtdinfo->priv =
kzalloc_obj(slram_priv_t);
if (!(*curmtd)->mtdinfo->priv) {
kfree((*curmtd)->mtdinfo);
(*curmtd)->mtdinfo = NULL;
}
}
if (!(*curmtd)->mtdinfo) {
mtdinfo = kzalloc_obj(struct mtd_info);
if (!mtdinfo) {
E("slram: Cannot allocate new MTD device.\n");
goto err_free_list;
}
new_mtd->mtdinfo = mtdinfo;
if (!(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start =
memremap(start, length,
MEMREMAP_WB | MEMREMAP_WT | MEMREMAP_WC))) {
priv = kzalloc_obj(slram_priv_t);
if (!priv) {
E("slram: Cannot allocate new MTD device.\n");
goto err_free_mtdinfo;
}
mtdinfo->priv = priv;
priv->start = memremap(start, length,
MEMREMAP_WB | MEMREMAP_WT | MEMREMAP_WC);
if (!priv->start) {
E("slram: memremap failed\n");
ret = -EIO;
goto err_free_priv;
}
((slram_priv_t *)(*curmtd)->mtdinfo->priv)->end =
((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start + length;
priv->end = priv->start + length;
mtdinfo->name = name;
mtdinfo->size = length;
mtdinfo->flags = MTD_CAP_RAM;
mtdinfo->_erase = slram_erase;
mtdinfo->_point = slram_point;
mtdinfo->_unpoint = slram_unpoint;
mtdinfo->_read = slram_read;
mtdinfo->_write = slram_write;
mtdinfo->owner = THIS_MODULE;
mtdinfo->type = MTD_RAM;
mtdinfo->erasesize = SLRAM_BLK_SZ;
mtdinfo->writesize = 1;
(*curmtd)->mtdinfo->name = name;
(*curmtd)->mtdinfo->size = length;
(*curmtd)->mtdinfo->flags = MTD_CAP_RAM;
(*curmtd)->mtdinfo->_erase = slram_erase;
(*curmtd)->mtdinfo->_point = slram_point;
(*curmtd)->mtdinfo->_unpoint = slram_unpoint;
(*curmtd)->mtdinfo->_read = slram_read;
(*curmtd)->mtdinfo->_write = slram_write;
(*curmtd)->mtdinfo->owner = THIS_MODULE;
(*curmtd)->mtdinfo->type = MTD_RAM;
(*curmtd)->mtdinfo->erasesize = SLRAM_BLK_SZ;
(*curmtd)->mtdinfo->writesize = 1;
if (mtd_device_register((*curmtd)->mtdinfo, NULL, 0)) {
if (mtd_device_register(mtdinfo, NULL, 0)) {
E("slram: Failed to register new device\n");
ret = -EAGAIN;
goto err_unmap;
}
*curmtd = new_mtd;
T("slram: Registered device %s from %luKiB to %luKiB\n", name,
(start / 1024), ((start + length) / 1024));
T("slram: Mapped from 0x%p to 0x%p\n",
((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start,
((slram_priv_t *)(*curmtd)->mtdinfo->priv)->end);
return(0);
T("slram: Mapped from 0x%p to 0x%p\n", priv->start, priv->end);
return 0;
err_unmap:
memunmap(((slram_priv_t *)(*curmtd)->mtdinfo->priv)->start);
memunmap(priv->start);
err_free_priv:
kfree((*curmtd)->mtdinfo->priv);
kfree(priv);
err_free_mtdinfo:
kfree(mtdinfo);
err_free_list:
kfree((*curmtd)->mtdinfo);
kfree(*curmtd);
*curmtd = NULL;
kfree(new_mtd);
return ret;
}