Skip to content

Commit 362f786

Browse files
Kuwano-sanambarus
authored andcommitted
mtd: spi-nor: spansion: switch set_octal_dtr method to use vreg_offset
All the Infineon flashes that currently support octal DTR mode define the optional SCCR SFDP table, thus all retrieve vreg_offset. Switch all the available octal DTR Infineon flashes to use the volatile register offset to set the configuration registers. The goal is to have a single pair of methods for both single/multi-chip package devices. Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano@infineon.com> Link: https://lore.kernel.org/r/20230726075257.12985-5-tudor.ambarus@linaro.org Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
1 parent c0aa051 commit 362f786

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

drivers/mtd/spi-nor/spansion.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <linux/bitfield.h>
88
#include <linux/device.h>
9+
#include <linux/errno.h>
910
#include <linux/mtd/spi-nor.h>
1011

1112
#include "core.h"
@@ -37,8 +38,6 @@
3738
(SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR3)
3839
#define SPINOR_REG_CYPRESS_CFR3_PGSZ BIT(4) /* Page size. */
3940
#define SPINOR_REG_CYPRESS_CFR5 0x6
40-
#define SPINOR_REG_CYPRESS_CFR5V \
41-
(SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR5)
4241
#define SPINOR_REG_CYPRESS_CFR5_BIT6 BIT(6)
4342
#define SPINOR_REG_CYPRESS_CFR5_DDR BIT(1)
4443
#define SPINOR_REG_CYPRESS_CFR5_OPI BIT(0)
@@ -202,14 +201,18 @@ static int cypress_nor_set_octal_dtr_bits(struct spi_nor *nor, u64 addr)
202201

203202
static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
204203
{
204+
const struct spi_nor_flash_parameter *params = nor->params;
205205
u8 *buf = nor->bouncebuf;
206+
u64 addr;
206207
int ret;
207208

208-
ret = cypress_nor_set_memlat(nor, SPINOR_REG_CYPRESS_CFR2V);
209+
addr = params->vreg_offset[0] + SPINOR_REG_CYPRESS_CFR2;
210+
ret = cypress_nor_set_memlat(nor, addr);
209211
if (ret)
210212
return ret;
211213

212-
ret = cypress_nor_set_octal_dtr_bits(nor, SPINOR_REG_CYPRESS_CFR5V);
214+
addr = params->vreg_offset[0] + SPINOR_REG_CYPRESS_CFR5;
215+
ret = cypress_nor_set_octal_dtr_bits(nor, addr);
213216
if (ret)
214217
return ret;
215218

@@ -247,9 +250,11 @@ static int cypress_nor_set_single_spi_bits(struct spi_nor *nor, u64 addr)
247250
static int cypress_nor_octal_dtr_dis(struct spi_nor *nor)
248251
{
249252
u8 *buf = nor->bouncebuf;
253+
u64 addr;
250254
int ret;
251255

252-
ret = cypress_nor_set_single_spi_bits(nor, SPINOR_REG_CYPRESS_CFR5V);
256+
addr = nor->params->vreg_offset[0] + SPINOR_REG_CYPRESS_CFR5;
257+
ret = cypress_nor_set_single_spi_bits(nor, addr);
253258
if (ret)
254259
return ret;
255260

@@ -714,7 +719,15 @@ static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,
714719

715720
static int s28hx_t_late_init(struct spi_nor *nor)
716721
{
717-
nor->params->set_octal_dtr = cypress_nor_set_octal_dtr;
722+
struct spi_nor_flash_parameter *params = nor->params;
723+
724+
if (!params->n_dice || !params->vreg_offset) {
725+
dev_err(nor->dev, "%s failed. The volatile register offset could not be retrieved from SFDP.\n",
726+
__func__);
727+
return -EOPNOTSUPP;
728+
}
729+
730+
params->set_octal_dtr = cypress_nor_set_octal_dtr;
718731
cypress_nor_ecc_init(nor);
719732

720733
return 0;

0 commit comments

Comments
 (0)