Patchwork [U-Boot,5/5] sf: unify status register writing (and thus block unlocking)

login
register
mail settings
Submitter Mike Frysinger
Date March 5, 2012, 4:21 a.m.
Message ID <1330921319-19419-5-git-send-email-vapier@gentoo.org>
Download mbox | patch
Permalink /patch/144597/
State Accepted
Commit 41e1713425d9817fdbe4fc89ad11b8dc9c4fca30
Delegated to: Mike Frysinger
Headers show

Comments

Mike Frysinger - March 5, 2012, 4:21 a.m.
The only two drivers to write the status register do it in the same
way, so unify the implementations.  This also makes the block unlock
logic the same.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
---
 drivers/mtd/spi/macronix.c           |   41 +---------------------------------
 drivers/mtd/spi/spi_flash.c          |   27 ++++++++++++++++++++++
 drivers/mtd/spi/spi_flash_internal.h |    3 ++
 drivers/mtd/spi/sst.c                |   23 +------------------
 4 files changed, 32 insertions(+), 62 deletions(-)

Patch

diff --git a/drivers/mtd/spi/macronix.c b/drivers/mtd/spi/macronix.c
index 5268c66..c97a39d 100644
--- a/drivers/mtd/spi/macronix.c
+++ b/drivers/mtd/spi/macronix.c
@@ -79,45 +79,6 @@  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_WRITE_STATUS;
-	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;
-}
-
 struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
 {
 	const struct macronix_spi_flash_params *params;
@@ -153,7 +114,7 @@  struct spi_flash *spi_flash_probe_macronix(struct spi_slave *spi, u8 *idcode)
 	flash->size = flash->sector_size * params->nr_blocks;
 
 	/* Clear BP# bits for read-only flash */
-	macronix_unlock(flash);
+	spi_flash_cmd_write_status(flash, 0);
 
 	return flash;
 }
diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index 4ab4e13..00aece9 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -242,6 +242,33 @@  int spi_flash_cmd_erase(struct spi_flash *flash, u32 offset, size_t len)
 	return ret;
 }
 
+int spi_flash_cmd_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_WRITE_STATUS;
+	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;
+}
+
 /*
  * The following table holds all device probe functions
  *
diff --git a/drivers/mtd/spi/spi_flash_internal.h b/drivers/mtd/spi/spi_flash_internal.h
index 3c6bccf..141cfa8 100644
--- a/drivers/mtd/spi/spi_flash_internal.h
+++ b/drivers/mtd/spi/spi_flash_internal.h
@@ -74,6 +74,9 @@  static inline int spi_flash_cmd_write_disable(struct spi_flash *flash)
 	return spi_flash_cmd(flash->spi, CMD_WRITE_DISABLE, NULL, 0);
 }
 
+/* Program the status register. */
+int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr);
+
 /*
  * Same as spi_flash_cmd_read() except it also claims/releases the SPI
  * bus. Used as common part of the ->read() operation.
diff --git a/drivers/mtd/spi/sst.c b/drivers/mtd/spi/sst.c
index 04cc50a..ced4f24 100644
--- a/drivers/mtd/spi/sst.c
+++ b/drivers/mtd/spi/sst.c
@@ -185,27 +185,6 @@  sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, const void *buf)
 	return ret;
 }
 
-static int
-sst_unlock(struct spi_flash *flash)
-{
-	int ret;
-	u8 cmd, status;
-
-	ret = spi_flash_cmd_write_enable(flash);
-	if (ret)
-		return ret;
-
-	cmd = CMD_WRITE_STATUS;
-	status = 0;
-	ret = spi_flash_cmd_write(flash->spi, &cmd, 1, &status, 1);
-	if (ret)
-		debug("SF: Unable to set status byte\n");
-
-	debug("SF: sst: status = %x\n", spi_w8r8(flash->spi, CMD_READ_STATUS));
-
-	return ret;
-}
-
 struct spi_flash *
 spi_flash_probe_sst(struct spi_slave *spi, u8 *idcode)
 {
@@ -245,7 +224,7 @@  spi_flash_probe_sst(struct spi_slave *spi, u8 *idcode)
 	stm->flash.size = stm->flash.sector_size * params->nr_sectors;
 
 	/* Flash powers up read-only, so clear BP# bits */
-	sst_unlock(&stm->flash);
+	spi_flash_cmd_write_status(&stm->flash, 0);
 
 	return &stm->flash;
 }