mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-12-21 09:21:33 +01:00
mtd: spinand: Refactor spinand_init* functions
No functional changes, just some refactoring to better match linux kernel driver. changes: * move spinand configuration reading out from spinand_init_cfg_cache() to separate function spinand_read_cfg() * move spinand flash initialization to separate function spinand_init_flash() * move direct mapping initialization to the end of spinand_init() Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu> Reviewed-by: Frieder Schrempf <frieder.schrempf@kontron.de> Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
This commit is contained in:
parent
4254ed38ec
commit
a3770a6325
@ -160,20 +160,12 @@ int spinand_select_target(struct spinand_device *spinand, unsigned int target)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int spinand_init_cfg_cache(struct spinand_device *spinand)
|
||||
static int spinand_read_cfg(struct spinand_device *spinand)
|
||||
{
|
||||
struct nand_device *nand = spinand_to_nand(spinand);
|
||||
struct udevice *dev = spinand->slave->dev;
|
||||
unsigned int target;
|
||||
int ret;
|
||||
|
||||
spinand->cfg_cache = devm_kzalloc(dev,
|
||||
sizeof(*spinand->cfg_cache) *
|
||||
nand->memorg.ntargets,
|
||||
GFP_KERNEL);
|
||||
if (!spinand->cfg_cache)
|
||||
return -ENOMEM;
|
||||
|
||||
for (target = 0; target < nand->memorg.ntargets; target++) {
|
||||
ret = spinand_select_target(spinand, target);
|
||||
if (ret)
|
||||
@ -192,6 +184,21 @@ static int spinand_init_cfg_cache(struct spinand_device *spinand)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int spinand_init_cfg_cache(struct spinand_device *spinand)
|
||||
{
|
||||
struct nand_device *nand = spinand_to_nand(spinand);
|
||||
struct udevice *dev = spinand->slave->dev;
|
||||
|
||||
spinand->cfg_cache = devm_kcalloc(dev,
|
||||
nand->memorg.ntargets,
|
||||
sizeof(*spinand->cfg_cache),
|
||||
GFP_KERNEL);
|
||||
if (!spinand->cfg_cache)
|
||||
return -ENOMEM;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int spinand_init_quad_enable(struct spinand_device *spinand)
|
||||
{
|
||||
bool enable = false;
|
||||
@ -1103,11 +1110,55 @@ static const struct mtd_ooblayout_ops spinand_noecc_ooblayout = {
|
||||
.rfree = spinand_noecc_ooblayout_free,
|
||||
};
|
||||
|
||||
static int spinand_init_flash(struct spinand_device *spinand)
|
||||
{
|
||||
struct udevice *dev = spinand->slave->dev;
|
||||
struct nand_device *nand = spinand_to_nand(spinand);
|
||||
int ret, i;
|
||||
|
||||
ret = spinand_read_cfg(spinand);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = spinand_init_quad_enable(spinand);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = spinand_upd_cfg(spinand, CFG_OTP_ENABLE, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = spinand_manufacturer_init(spinand);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"Failed to initialize the SPI NAND chip (err = %d)\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* After power up, all blocks are locked, so unlock them here. */
|
||||
for (i = 0; i < nand->memorg.ntargets; i++) {
|
||||
ret = spinand_select_target(spinand, i);
|
||||
if (ret)
|
||||
break;
|
||||
|
||||
ret = spinand_lock_block(spinand, BL_ALL_UNLOCKED);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
spinand_manufacturer_cleanup(spinand);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int spinand_init(struct spinand_device *spinand)
|
||||
{
|
||||
struct udevice *dev = spinand->slave->dev;
|
||||
struct mtd_info *mtd = spinand_to_mtd(spinand);
|
||||
struct nand_device *nand = mtd_to_nanddev(mtd);
|
||||
int ret, i;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* We need a scratch buffer because the spi_mem interface requires that
|
||||
@ -1140,41 +1191,10 @@ static int spinand_init(struct spinand_device *spinand)
|
||||
if (ret)
|
||||
goto err_free_bufs;
|
||||
|
||||
ret = spinand_init_quad_enable(spinand);
|
||||
ret = spinand_init_flash(spinand);
|
||||
if (ret)
|
||||
goto err_free_bufs;
|
||||
|
||||
ret = spinand_upd_cfg(spinand, CFG_OTP_ENABLE, 0);
|
||||
if (ret)
|
||||
goto err_free_bufs;
|
||||
|
||||
ret = spinand_manufacturer_init(spinand);
|
||||
if (ret) {
|
||||
dev_err(spinand->slave->dev,
|
||||
"Failed to initialize the SPI NAND chip (err = %d)\n",
|
||||
ret);
|
||||
goto err_free_bufs;
|
||||
}
|
||||
|
||||
ret = spinand_create_dirmaps(spinand);
|
||||
if (ret) {
|
||||
dev_err(spinand->slave->dev,
|
||||
"Failed to create direct mappings for read/write operations (err = %d)\n",
|
||||
ret);
|
||||
goto err_manuf_cleanup;
|
||||
}
|
||||
|
||||
/* After power up, all blocks are locked, so unlock them here. */
|
||||
for (i = 0; i < nand->memorg.ntargets; i++) {
|
||||
ret = spinand_select_target(spinand, i);
|
||||
if (ret)
|
||||
goto err_manuf_cleanup;
|
||||
|
||||
ret = spinand_lock_block(spinand, BL_ALL_UNLOCKED);
|
||||
if (ret)
|
||||
goto err_manuf_cleanup;
|
||||
}
|
||||
|
||||
ret = nanddev_init(nand, &spinand_ops, THIS_MODULE);
|
||||
if (ret)
|
||||
goto err_manuf_cleanup;
|
||||
@ -1201,6 +1221,14 @@ static int spinand_init(struct spinand_device *spinand)
|
||||
|
||||
mtd->oobavail = ret;
|
||||
|
||||
ret = spinand_create_dirmaps(spinand);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"Failed to create direct mappings for read/write operations (err = %d)\n",
|
||||
ret);
|
||||
goto err_cleanup_nanddev;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_cleanup_nanddev:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user