mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
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:
parent
36f1648644
commit
4fe97a54da
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user