]> git.sur5r.net Git - u-boot/commitdiff
sf: macronix: disable write protection when initializing
authorSimon Guinot <sguinot@lacie.com>
Mon, 2 May 2011 11:01:38 +0000 (11:01 +0000)
committerWolfgang Denk <wd@denx.de>
Tue, 2 Aug 2011 20:02:34 +0000 (22:02 +0200)
Signed-off-by: Simon Guinot <sguinot@lacie.com>
drivers/mtd/spi/macronix.c

index 96fd5f00520f433c14b44347248117b580f819bc..dacbc28b3e5e2d5bb86bdb84314aeb1388df0bd9 100644 (file)
@@ -117,6 +117,45 @@ static const struct macronix_spi_flash_params macronix_spi_flash_table[] = {
        },
 };
 
+static int macronix_write_status(struct spi_flash *flash, u8 sr)
+{
+       u8 cmd;
+       int ret;
+
+       ret = spi_flash_cmd_write_enable(flash);
+       if (ret < 0) {
+               debug("SF: enabling write failed\n");
+               return ret;
+       }
+
+       cmd = CMD_MX25XX_WRSR;
+       ret = spi_flash_cmd_write(flash->spi, &cmd, 1, &sr, 1);
+       if (ret) {
+               debug("SF: fail to write status register\n");
+               return ret;
+       }
+
+       ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
+       if (ret < 0) {
+               debug("SF: write status register timed out\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+static int macronix_unlock(struct spi_flash *flash)
+{
+       int ret;
+
+       /* Enable status register writing and clear BP# bits */
+       ret = macronix_write_status(flash, 0);
+       if (ret)
+               debug("SF: fail to disable write protection\n");
+
+       return ret;
+}
+
 static int macronix_erase(struct spi_flash *flash, u32 offset, size_t len)
 {
        return spi_flash_cmd_erase(flash, CMD_MX25XX_BE, offset, len);
@@ -157,5 +196,8 @@ struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
                * params->sectors_per_block;
        flash->size = flash->sector_size * params->nr_blocks;
 
+       /* Clear BP# bits for read-only flash */
+       macronix_unlock(flash);
+
        return flash;
 }