summaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorOleksij Rempel <o.rempel@pengutronix.de>2019-08-20 09:06:38 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2019-08-21 08:50:24 +0200
commit9b9b3ac2d5f3450375eeedd403d32707ff8a828d (patch)
treeb3e0b3528a189e3b830079648381ee55e52e49d0 /drivers/mtd
parent484add97d1467e1fb30c5131dd91f32e62afec73 (diff)
downloadbarebox-9b9b3ac2d5f3450375eeedd403d32707ff8a828d.tar.gz
barebox-9b9b3ac2d5f3450375eeedd403d32707ff8a828d.tar.xz
mtd: spi-nor: add UNLOCK_GLOBAL_BLOCK support
Ported from linux-4.19-at91 linux4sam_6.1 and needed for SAMA5D27 SOM1 EK. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/spi-nor/spi-nor.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index 9dbc8302ed..68c79014bb 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -57,7 +57,7 @@ struct flash_info {
u16 page_size;
u16 addr_width;
- u16 flags;
+ u32 flags;
#define SECT_4K BIT(0) /* SPINOR_OP_BE_4K works uniformly */
#define SPI_NOR_NO_ERASE BIT(1) /* No erase command needed */
#define SST_WRITE BIT(2) /* use SST byte programming */
@@ -86,6 +86,7 @@ struct flash_info {
#define SPI_NOR_SKIP_SFDP BIT(13) /* Skip parsing of SFDP tables */
#define USE_CLSR BIT(14) /* use CLSR command */
#define SPI_NOR_OCTAL_READ BIT(15) /* Flash supports Octal Read */
+#define UNLOCK_GLOBAL_BLOCK BIT(16) /* Unlock global block protection */
};
enum spi_nor_read_command_index {
@@ -1067,6 +1068,17 @@ spi_nor_set_pp_settings(struct spi_nor_pp_command *pp,
pp->proto = proto;
}
+static int spi_nor_unlock_global_block_protection(struct spi_nor *nor)
+{
+ int ret;
+
+ write_enable(nor);
+ ret = nor->write_reg(nor, SPINOR_OP_GBULK, NULL, 0);
+ if (ret < 0)
+ return ret;
+ return spi_nor_wait_till_ready(nor);
+}
+
static int spi_nor_init_params(struct spi_nor *nor,
const struct flash_info *info,
struct spi_nor_flash_parameter *params)
@@ -1110,6 +1122,17 @@ static int spi_nor_init_params(struct spi_nor *nor,
spi_nor_set_pp_settings(&params->page_programs[SNOR_CMD_PP],
SPINOR_OP_PP, SNOR_PROTO_1_1_1);
+ if (info->flags & UNLOCK_GLOBAL_BLOCK) {
+ int err;
+
+ err = spi_nor_unlock_global_block_protection(nor);
+ if (err) {
+ dev_err(nor->dev,
+ "Cannot unlock the global block protection\n");
+ return err;
+ }
+ }
+
/* Select the procedure to set the Quad Enable bit. */
if (params->hwcaps.mask & (SNOR_HWCAPS_READ_QUAD |
SNOR_HWCAPS_PP_QUAD))