mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-01 09:34:10 -04:00
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>
This commit is contained in:
committed by
Tudor Ambarus
parent
c0aa05123f
commit
362f786ea0
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/mtd/spi-nor.h>
|
||||
|
||||
#include "core.h"
|
||||
@@ -37,8 +38,6 @@
|
||||
(SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR3)
|
||||
#define SPINOR_REG_CYPRESS_CFR3_PGSZ BIT(4) /* Page size. */
|
||||
#define SPINOR_REG_CYPRESS_CFR5 0x6
|
||||
#define SPINOR_REG_CYPRESS_CFR5V \
|
||||
(SPINOR_REG_CYPRESS_VREG + SPINOR_REG_CYPRESS_CFR5)
|
||||
#define SPINOR_REG_CYPRESS_CFR5_BIT6 BIT(6)
|
||||
#define SPINOR_REG_CYPRESS_CFR5_DDR BIT(1)
|
||||
#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)
|
||||
|
||||
static int cypress_nor_octal_dtr_en(struct spi_nor *nor)
|
||||
{
|
||||
const struct spi_nor_flash_parameter *params = nor->params;
|
||||
u8 *buf = nor->bouncebuf;
|
||||
u64 addr;
|
||||
int ret;
|
||||
|
||||
ret = cypress_nor_set_memlat(nor, SPINOR_REG_CYPRESS_CFR2V);
|
||||
addr = params->vreg_offset[0] + SPINOR_REG_CYPRESS_CFR2;
|
||||
ret = cypress_nor_set_memlat(nor, addr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = cypress_nor_set_octal_dtr_bits(nor, SPINOR_REG_CYPRESS_CFR5V);
|
||||
addr = params->vreg_offset[0] + SPINOR_REG_CYPRESS_CFR5;
|
||||
ret = cypress_nor_set_octal_dtr_bits(nor, addr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -247,9 +250,11 @@ static int cypress_nor_set_single_spi_bits(struct spi_nor *nor, u64 addr)
|
||||
static int cypress_nor_octal_dtr_dis(struct spi_nor *nor)
|
||||
{
|
||||
u8 *buf = nor->bouncebuf;
|
||||
u64 addr;
|
||||
int ret;
|
||||
|
||||
ret = cypress_nor_set_single_spi_bits(nor, SPINOR_REG_CYPRESS_CFR5V);
|
||||
addr = nor->params->vreg_offset[0] + SPINOR_REG_CYPRESS_CFR5;
|
||||
ret = cypress_nor_set_single_spi_bits(nor, addr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -714,7 +719,15 @@ static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,
|
||||
|
||||
static int s28hx_t_late_init(struct spi_nor *nor)
|
||||
{
|
||||
nor->params->set_octal_dtr = cypress_nor_set_octal_dtr;
|
||||
struct spi_nor_flash_parameter *params = nor->params;
|
||||
|
||||
if (!params->n_dice || !params->vreg_offset) {
|
||||
dev_err(nor->dev, "%s failed. The volatile register offset could not be retrieved from SFDP.\n",
|
||||
__func__);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
params->set_octal_dtr = cypress_nor_set_octal_dtr;
|
||||
cypress_nor_ecc_init(nor);
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user