Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 4a69c12

Browse files
Witold Sadowskibroonie
authored andcommitted
spi: cadence: Ensure data lines set to low during dummy-cycle period
During dummy-cycles xSPI will switch GPIO into Hi-Z mode. In that dummy period voltage on data lines will slowly drop, what can cause unintentional modebyte transmission. Value send to SPI memory chip will depend on last address, and clock frequency. To prevent unforeseen consequences of that behaviour, force send single modebyte(0x00). Modebyte will be send only if number of dummy-cycles is not equal to 0. Code must also reduce dummycycle byte count by one - as one byte is send as modebyte. Signed-off-by: Witold Sadowski <wsadowski@marvell.com> Link: https://msgid.link/r/20240529074037.1345882-2-wsadowski@marvell.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 3aac9f4 commit 4a69c12

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

drivers/spi/spi-cadence-xspi.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@
145145
#define CDNS_XSPI_STIG_DONE_FLAG BIT(0)
146146
#define CDNS_XSPI_TRD_STATUS 0x0104
147147

148+
#define MODE_NO_OF_BYTES GENMASK(25, 24)
149+
#define MODEBYTES_COUNT 1
150+
148151
/* Helper macros for filling command registers */
149152
#define CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_1(op, data_phase) ( \
150153
FIELD_PREP(CDNS_XSPI_CMD_INSTR_TYPE, (data_phase) ? \
@@ -157,9 +160,10 @@
157160
FIELD_PREP(CDNS_XSPI_CMD_P1_R2_ADDR3, ((op)->addr.val >> 24) & 0xFF) | \
158161
FIELD_PREP(CDNS_XSPI_CMD_P1_R2_ADDR4, ((op)->addr.val >> 32) & 0xFF))
159162

160-
#define CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op) ( \
163+
#define CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op, modebytes) ( \
161164
FIELD_PREP(CDNS_XSPI_CMD_P1_R3_ADDR5, ((op)->addr.val >> 40) & 0xFF) | \
162165
FIELD_PREP(CDNS_XSPI_CMD_P1_R3_CMD, (op)->cmd.opcode) | \
166+
FIELD_PREP(MODE_NO_OF_BYTES, modebytes) | \
163167
FIELD_PREP(CDNS_XSPI_CMD_P1_R3_NUM_ADDR_BYTES, (op)->addr.nbytes))
164168

165169
#define CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_4(op, chipsel) ( \
@@ -173,12 +177,12 @@
173177
#define CDNS_XSPI_CMD_FLD_DSEQ_CMD_2(op) \
174178
FIELD_PREP(CDNS_XSPI_CMD_DSEQ_R2_DCNT_L, (op)->data.nbytes & 0xFFFF)
175179

176-
#define CDNS_XSPI_CMD_FLD_DSEQ_CMD_3(op) ( \
180+
#define CDNS_XSPI_CMD_FLD_DSEQ_CMD_3(op, dummybytes) ( \
177181
FIELD_PREP(CDNS_XSPI_CMD_DSEQ_R3_DCNT_H, \
178182
((op)->data.nbytes >> 16) & 0xffff) | \
179183
FIELD_PREP(CDNS_XSPI_CMD_DSEQ_R3_NUM_OF_DUMMY, \
180184
(op)->dummy.buswidth != 0 ? \
181-
(((op)->dummy.nbytes * 8) / (op)->dummy.buswidth) : \
185+
(((dummybytes) * 8) / (op)->dummy.buswidth) : \
182186
0))
183187

184188
#define CDNS_XSPI_CMD_FLD_DSEQ_CMD_4(op, chipsel) ( \
@@ -351,6 +355,7 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
351355
u32 cmd_regs[6];
352356
u32 cmd_status;
353357
int ret;
358+
int dummybytes = op->dummy.nbytes;
354359

355360
ret = cdns_xspi_wait_for_controller_idle(cdns_xspi);
356361
if (ret < 0)
@@ -365,7 +370,12 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
365370
memset(cmd_regs, 0, sizeof(cmd_regs));
366371
cmd_regs[1] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_1(op, data_phase);
367372
cmd_regs[2] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_2(op);
368-
cmd_regs[3] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op);
373+
if (dummybytes != 0) {
374+
cmd_regs[3] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op, 1);
375+
dummybytes--;
376+
} else {
377+
cmd_regs[3] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_3(op, 0);
378+
}
369379
cmd_regs[4] = CDNS_XSPI_CMD_FLD_P1_INSTR_CMD_4(op,
370380
cdns_xspi->cur_cs);
371381

@@ -375,7 +385,7 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi,
375385
cmd_regs[0] = CDNS_XSPI_STIG_DONE_FLAG;
376386
cmd_regs[1] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_1(op);
377387
cmd_regs[2] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_2(op);
378-
cmd_regs[3] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_3(op);
388+
cmd_regs[3] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_3(op, dummybytes);
379389
cmd_regs[4] = CDNS_XSPI_CMD_FLD_DSEQ_CMD_4(op,
380390
cdns_xspi->cur_cs);
381391

0 commit comments

Comments
 (0)