提交 e6b1bb4e 编写于 作者: L Lee Jones 提交者: Brian Norris

mtd: st_spi_fsm: Move runtime configurable msg sequences into device's struct

Until now the dynamically configurable message sequences for read, write
and enable 32bit addressing have been global. Brian makes a good point
why this should not be the case. If there are ever two FSM's located on
the same platform, we could be potentially introducing a race condition
on "needlessly shared data".
Suggested-by: NBrian Norris <computersforpeace@gmail.com>
Acked-by Angus Clark <angus.clark@st.com>
Signed-off-by: NLee Jones <lee.jones@linaro.org>
Signed-off-by: NBrian Norris <computersforpeace@gmail.com>
上级 cd7cac9e
...@@ -273,6 +273,19 @@ ...@@ -273,6 +273,19 @@
#define CFG_ERASESEC_TOGGLE_32BIT_ADDR 0x00000008 #define CFG_ERASESEC_TOGGLE_32BIT_ADDR 0x00000008
#define CFG_S25FL_CHECK_ERROR_FLAGS 0x00000010 #define CFG_S25FL_CHECK_ERROR_FLAGS 0x00000010
struct stfsm_seq {
uint32_t data_size;
uint32_t addr1;
uint32_t addr2;
uint32_t addr_cfg;
uint32_t seq_opc[5];
uint32_t mode;
uint32_t dummy;
uint32_t status;
uint8_t seq[16];
uint32_t seq_cfg;
} __packed __aligned(4);
struct stfsm { struct stfsm {
struct device *dev; struct device *dev;
void __iomem *base; void __iomem *base;
...@@ -286,20 +299,11 @@ struct stfsm { ...@@ -286,20 +299,11 @@ struct stfsm {
bool booted_from_spi; bool booted_from_spi;
bool reset_signal; bool reset_signal;
bool reset_por; bool reset_por;
};
struct stfsm_seq { struct stfsm_seq stfsm_seq_read;
uint32_t data_size; struct stfsm_seq stfsm_seq_write;
uint32_t addr1; struct stfsm_seq stfsm_seq_en_32bit_addr;
uint32_t addr2; };
uint32_t addr_cfg;
uint32_t seq_opc[5];
uint32_t mode;
uint32_t dummy;
uint32_t status;
uint8_t seq[16];
uint32_t seq_cfg;
} __packed __aligned(4);
/* Parameters to configure a READ or WRITE FSM sequence */ /* Parameters to configure a READ or WRITE FSM sequence */
struct seq_rw_config { struct seq_rw_config {
...@@ -587,10 +591,6 @@ static struct seq_rw_config stfsm_s25fl_write4_configs[] = { ...@@ -587,10 +591,6 @@ static struct seq_rw_config stfsm_s25fl_write4_configs[] = {
*/ */
#define W25Q_STATUS_QE (0x1 << 9) #define W25Q_STATUS_QE (0x1 << 9)
static struct stfsm_seq stfsm_seq_read; /* Dynamically populated */
static struct stfsm_seq stfsm_seq_write; /* Dynamically populated */
static struct stfsm_seq stfsm_seq_en_32bit_addr;/* Dynamically populated */
static struct stfsm_seq stfsm_seq_read_jedec = { static struct stfsm_seq stfsm_seq_read_jedec = {
.data_size = TRANSFER_SIZE(8), .data_size = TRANSFER_SIZE(8),
.seq_opc[0] = (SEQ_OPC_PADS_1 | .seq_opc[0] = (SEQ_OPC_PADS_1 |
...@@ -826,7 +826,7 @@ static int stfsm_write_fifo(struct stfsm *fsm, ...@@ -826,7 +826,7 @@ static int stfsm_write_fifo(struct stfsm *fsm,
static int stfsm_enter_32bit_addr(struct stfsm *fsm, int enter) static int stfsm_enter_32bit_addr(struct stfsm *fsm, int enter)
{ {
struct stfsm_seq *seq = &stfsm_seq_en_32bit_addr; struct stfsm_seq *seq = &fsm->stfsm_seq_en_32bit_addr;
uint32_t cmd = enter ? FLASH_CMD_EN4B_ADDR : FLASH_CMD_EX4B_ADDR; uint32_t cmd = enter ? FLASH_CMD_EN4B_ADDR : FLASH_CMD_EX4B_ADDR;
seq->seq_opc[0] = (SEQ_OPC_PADS_1 | seq->seq_opc[0] = (SEQ_OPC_PADS_1 |
...@@ -1101,7 +1101,7 @@ static int stfsm_prepare_rwe_seqs_default(struct stfsm *fsm) ...@@ -1101,7 +1101,7 @@ static int stfsm_prepare_rwe_seqs_default(struct stfsm *fsm)
int ret; int ret;
/* Configure 'READ' sequence */ /* Configure 'READ' sequence */
ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_read, ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_read,
default_read_configs); default_read_configs);
if (ret) { if (ret) {
dev_err(fsm->dev, dev_err(fsm->dev,
...@@ -1111,7 +1111,7 @@ static int stfsm_prepare_rwe_seqs_default(struct stfsm *fsm) ...@@ -1111,7 +1111,7 @@ static int stfsm_prepare_rwe_seqs_default(struct stfsm *fsm)
} }
/* Configure 'WRITE' sequence */ /* Configure 'WRITE' sequence */
ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_write, ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_write,
default_write_configs); default_write_configs);
if (ret) { if (ret) {
dev_err(fsm->dev, dev_err(fsm->dev,
...@@ -1146,7 +1146,7 @@ static int stfsm_mx25_config(struct stfsm *fsm) ...@@ -1146,7 +1146,7 @@ static int stfsm_mx25_config(struct stfsm *fsm)
*/ */
if (flags & FLASH_FLAG_32BIT_ADDR) { if (flags & FLASH_FLAG_32BIT_ADDR) {
/* Configure 'enter_32bitaddr' FSM sequence */ /* Configure 'enter_32bitaddr' FSM sequence */
stfsm_mx25_en_32bit_addr_seq(&stfsm_seq_en_32bit_addr); stfsm_mx25_en_32bit_addr_seq(&fsm->stfsm_seq_en_32bit_addr);
soc_reset = stfsm_can_handle_soc_reset(fsm); soc_reset = stfsm_can_handle_soc_reset(fsm);
if (soc_reset || !fsm->booted_from_spi) { if (soc_reset || !fsm->booted_from_spi) {
...@@ -1169,7 +1169,7 @@ static int stfsm_mx25_config(struct stfsm *fsm) ...@@ -1169,7 +1169,7 @@ static int stfsm_mx25_config(struct stfsm *fsm)
} }
/* For QUAD mode, set 'QE' STATUS bit */ /* For QUAD mode, set 'QE' STATUS bit */
data_pads = ((stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1; data_pads = ((fsm->stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1;
if (data_pads == 4) { if (data_pads == 4) {
stfsm_read_status(fsm, FLASH_CMD_RDSR, &sta); stfsm_read_status(fsm, FLASH_CMD_RDSR, &sta);
sta |= MX25_STATUS_QE; sta |= MX25_STATUS_QE;
...@@ -1188,10 +1188,10 @@ static int stfsm_n25q_config(struct stfsm *fsm) ...@@ -1188,10 +1188,10 @@ static int stfsm_n25q_config(struct stfsm *fsm)
/* Configure 'READ' sequence */ /* Configure 'READ' sequence */
if (flags & FLASH_FLAG_32BIT_ADDR) if (flags & FLASH_FLAG_32BIT_ADDR)
ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_read, ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_read,
n25q_read4_configs); n25q_read4_configs);
else else
ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_read, ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_read,
n25q_read3_configs); n25q_read3_configs);
if (ret) { if (ret) {
dev_err(fsm->dev, dev_err(fsm->dev,
...@@ -1201,7 +1201,7 @@ static int stfsm_n25q_config(struct stfsm *fsm) ...@@ -1201,7 +1201,7 @@ static int stfsm_n25q_config(struct stfsm *fsm)
} }
/* Configure 'WRITE' sequence (default configs) */ /* Configure 'WRITE' sequence (default configs) */
ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_write, ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_write,
default_write_configs); default_write_configs);
if (ret) { if (ret) {
dev_err(fsm->dev, dev_err(fsm->dev,
...@@ -1215,7 +1215,7 @@ static int stfsm_n25q_config(struct stfsm *fsm) ...@@ -1215,7 +1215,7 @@ static int stfsm_n25q_config(struct stfsm *fsm)
/* Configure 32-bit address support */ /* Configure 32-bit address support */
if (flags & FLASH_FLAG_32BIT_ADDR) { if (flags & FLASH_FLAG_32BIT_ADDR) {
stfsm_n25q_en_32bit_addr_seq(&stfsm_seq_en_32bit_addr); stfsm_n25q_en_32bit_addr_seq(&fsm->stfsm_seq_en_32bit_addr);
soc_reset = stfsm_can_handle_soc_reset(fsm); soc_reset = stfsm_can_handle_soc_reset(fsm);
if (soc_reset || !fsm->booted_from_spi) { if (soc_reset || !fsm->booted_from_spi) {
...@@ -1374,12 +1374,12 @@ static int stfsm_s25fl_config(struct stfsm *fsm) ...@@ -1374,12 +1374,12 @@ static int stfsm_s25fl_config(struct stfsm *fsm)
* Prepare Read/Write/Erase sequences according to S25FLxxx * Prepare Read/Write/Erase sequences according to S25FLxxx
* 32-bit address command set * 32-bit address command set
*/ */
ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_read, ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_read,
stfsm_s25fl_read4_configs); stfsm_s25fl_read4_configs);
if (ret) if (ret)
return ret; return ret;
ret = stfsm_search_prepare_rw_seq(fsm, &stfsm_seq_write, ret = stfsm_search_prepare_rw_seq(fsm, &fsm->stfsm_seq_write,
stfsm_s25fl_write4_configs); stfsm_s25fl_write4_configs);
if (ret) if (ret)
return ret; return ret;
...@@ -1415,7 +1415,7 @@ static int stfsm_s25fl_config(struct stfsm *fsm) ...@@ -1415,7 +1415,7 @@ static int stfsm_s25fl_config(struct stfsm *fsm)
} }
/* Check status of 'QE' bit */ /* Check status of 'QE' bit */
data_pads = ((stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1; data_pads = ((fsm->stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1;
stfsm_read_status(fsm, FLASH_CMD_RDSR2, &cr1); stfsm_read_status(fsm, FLASH_CMD_RDSR2, &cr1);
if (data_pads == 4) { if (data_pads == 4) {
if (!(cr1 & STFSM_S25FL_CONFIG_QE)) { if (!(cr1 & STFSM_S25FL_CONFIG_QE)) {
...@@ -1465,7 +1465,7 @@ static int stfsm_w25q_config(struct stfsm *fsm) ...@@ -1465,7 +1465,7 @@ static int stfsm_w25q_config(struct stfsm *fsm)
return ret; return ret;
/* If using QUAD mode, set QE STATUS bit */ /* If using QUAD mode, set QE STATUS bit */
data_pads = ((stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1; data_pads = ((fsm->stfsm_seq_read.seq_cfg >> 16) & 0x3) + 1;
if (data_pads == 4) { if (data_pads == 4) {
stfsm_read_status(fsm, FLASH_CMD_RDSR, &sta1); stfsm_read_status(fsm, FLASH_CMD_RDSR, &sta1);
stfsm_read_status(fsm, FLASH_CMD_RDSR2, &sta2); stfsm_read_status(fsm, FLASH_CMD_RDSR2, &sta2);
...@@ -1485,7 +1485,7 @@ static int stfsm_w25q_config(struct stfsm *fsm) ...@@ -1485,7 +1485,7 @@ static int stfsm_w25q_config(struct stfsm *fsm)
static int stfsm_read(struct stfsm *fsm, uint8_t *buf, uint32_t size, static int stfsm_read(struct stfsm *fsm, uint8_t *buf, uint32_t size,
uint32_t offset) uint32_t offset)
{ {
struct stfsm_seq *seq = &stfsm_seq_read; struct stfsm_seq *seq = &fsm->stfsm_seq_read;
uint32_t data_pads; uint32_t data_pads;
uint32_t read_mask; uint32_t read_mask;
uint32_t size_ub; uint32_t size_ub;
...@@ -1546,7 +1546,7 @@ static int stfsm_read(struct stfsm *fsm, uint8_t *buf, uint32_t size, ...@@ -1546,7 +1546,7 @@ static int stfsm_read(struct stfsm *fsm, uint8_t *buf, uint32_t size,
static int stfsm_write(struct stfsm *fsm, const uint8_t *const buf, static int stfsm_write(struct stfsm *fsm, const uint8_t *const buf,
const uint32_t size, const uint32_t offset) const uint32_t size, const uint32_t offset)
{ {
struct stfsm_seq *seq = &stfsm_seq_write; struct stfsm_seq *seq = &fsm->stfsm_seq_write;
uint32_t data_pads; uint32_t data_pads;
uint32_t write_mask; uint32_t write_mask;
uint32_t size_ub; uint32_t size_ub;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册