Add error handler when write/erase flash fail. Signed-off-by: Haikun Wang <haikun.w...@freescale.com> --- drivers/mtd/spi/sf_dataflash.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/drivers/mtd/spi/sf_dataflash.c b/drivers/mtd/spi/sf_dataflash.c index f83f994..8f91527 100644 --- a/drivers/mtd/spi/sf_dataflash.c +++ b/drivers/mtd/spi/sf_dataflash.c @@ -174,13 +174,14 @@ static int spi_dataflash_erase(struct udevice *dev, u32 offset, size_t len) status = spi_flash_cmd_write(spi, command, 4, NULL, 0); if (status < 0) { debug("%s: erase send command error!\n", dev->name); - return -EIO; + status = -EIO; + goto release_bus; } status = dataflash_waitready(spi); if (status < 0) { debug("%s: erase waitready error!\n", dev->name); - return status; + goto release_bus; } if (do_block) { @@ -195,6 +196,11 @@ static int spi_dataflash_erase(struct udevice *dev, u32 offset, size_t len) spi_release_bus(spi); return 0; + +release_bus: + spi_release_bus(spi); + + return status; } /* @@ -329,14 +335,15 @@ int spi_dataflash_write(struct udevice *dev, u32 offset, size_t len, if (status < 0) { debug("%s: write(<pagesize) command error!\n", dev->name); - return -EIO; + status = -EIO; + goto release_bus; } status = dataflash_waitready(spi); if (status < 0) { debug("%s: write(<pagesize) waitready error!\n", dev->name); - return status; + goto release_bus; } } @@ -354,13 +361,14 @@ int spi_dataflash_write(struct udevice *dev, u32 offset, size_t len, 4, writebuf, writelen); if (status < 0) { debug("%s: write send command error!\n", dev->name); - return -EIO; + status = -EIO; + goto release_bus; } status = dataflash_waitready(spi); if (status < 0) { debug("%s: write waitready error!\n", dev->name); - return status; + goto release_bus; } #ifdef CONFIG_SPI_DATAFLASH_WRITE_VERIFY @@ -379,7 +387,8 @@ int spi_dataflash_write(struct udevice *dev, u32 offset, size_t len, if (status < 0) { debug("%s: write(compare) send command error!\n", dev->name); - return -EIO; + status = -EIO; + goto release_bus; } status = dataflash_waitready(spi); @@ -390,7 +399,7 @@ int spi_dataflash_write(struct udevice *dev, u32 offset, size_t len, pageaddr, status); remaining = 0; status = -EIO; - break; + goto release_bus; } else { status = 0; } @@ -410,6 +419,11 @@ int spi_dataflash_write(struct udevice *dev, u32 offset, size_t len, spi_release_bus(spi); return 0; + +release_bus: + spi_release_bus(spi); + + return status; } static int add_dataflash(struct udevice *dev, char *name, int nr_pages, -- 2.1.0.27.g96db324 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot