@@ -352,34 +352,25 @@ static int intel_spi_opcode_index(struct intel_spi *ispi, u8 opcode, int optype)
352352 return 0 ;
353353}
354354
355- static int intel_spi_hw_cycle (struct intel_spi * ispi , u8 opcode , size_t len )
355+ static int intel_spi_hw_cycle (struct intel_spi * ispi ,
356+ const struct intel_spi_mem_op * iop , size_t len )
356357{
357358 u32 val , status ;
358359 int ret ;
359360
361+ if (!iop -> replacement_op )
362+ return - EINVAL ;
363+
360364 val = readl (ispi -> base + HSFSTS_CTL );
361365 val &= ~(HSFSTS_CTL_FCYCLE_MASK | HSFSTS_CTL_FDBC_MASK );
362366
363- switch (opcode ) {
364- case SPINOR_OP_RDID :
365- val |= HSFSTS_CTL_FCYCLE_RDID ;
366- break ;
367- case SPINOR_OP_WRSR :
368- val |= HSFSTS_CTL_FCYCLE_WRSR ;
369- break ;
370- case SPINOR_OP_RDSR :
371- val |= HSFSTS_CTL_FCYCLE_RDSR ;
372- break ;
373- default :
374- return - EINVAL ;
375- }
376-
377367 if (len > INTEL_SPI_FIFO_SZ )
378368 return - EINVAL ;
379369
380370 val |= (len - 1 ) << HSFSTS_CTL_FDBC_SHIFT ;
381371 val |= HSFSTS_CTL_FCERR | HSFSTS_CTL_FDONE ;
382372 val |= HSFSTS_CTL_FGO ;
373+ val |= iop -> replacement_op ;
383374 writel (val , ispi -> base + HSFSTS_CTL );
384375
385376 ret = intel_spi_wait_hw_busy (ispi );
@@ -483,7 +474,7 @@ static int intel_spi_read_reg(struct intel_spi *ispi, const struct spi_mem *mem,
483474 ret = intel_spi_sw_cycle (ispi , opcode , nbytes ,
484475 OPTYPE_READ_NO_ADDR );
485476 else
486- ret = intel_spi_hw_cycle (ispi , opcode , nbytes );
477+ ret = intel_spi_hw_cycle (ispi , iop , nbytes );
487478
488479 if (ret )
489480 return ret ;
@@ -548,7 +539,7 @@ static int intel_spi_write_reg(struct intel_spi *ispi, const struct spi_mem *mem
548539 if (ispi -> swseq_reg )
549540 return intel_spi_sw_cycle (ispi , opcode , nbytes ,
550541 OPTYPE_WRITE_NO_ADDR );
551- return intel_spi_hw_cycle (ispi , opcode , nbytes );
542+ return intel_spi_hw_cycle (ispi , iop , nbytes );
552543}
553544
554545static int intel_spi_read (struct intel_spi * ispi , const struct spi_mem * mem ,
@@ -912,18 +903,21 @@ static const struct spi_controller_mem_ops intel_spi_mem_ops = {
912903 */
913904#define INTEL_SPI_GENERIC_OPS \
914905 /* Status register operations */ \
915- INTEL_SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDID, 1), \
916- SPI_MEM_OP_NO_ADDR, \
917- INTEL_SPI_OP_DATA_IN(1), \
918- intel_spi_read_reg), \
919- INTEL_SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_RDSR, 1), \
920- SPI_MEM_OP_NO_ADDR, \
921- INTEL_SPI_OP_DATA_IN(1), \
922- intel_spi_read_reg), \
923- INTEL_SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_WRSR, 1), \
924- SPI_MEM_OP_NO_ADDR, \
925- INTEL_SPI_OP_DATA_OUT(1), \
926- intel_spi_write_reg), \
906+ INTEL_SPI_MEM_OP_REPL(SPI_MEM_OP_CMD(SPINOR_OP_RDID, 1), \
907+ SPI_MEM_OP_NO_ADDR, \
908+ INTEL_SPI_OP_DATA_IN(1), \
909+ intel_spi_read_reg, \
910+ HSFSTS_CTL_FCYCLE_RDID), \
911+ INTEL_SPI_MEM_OP_REPL(SPI_MEM_OP_CMD(SPINOR_OP_RDSR, 1), \
912+ SPI_MEM_OP_NO_ADDR, \
913+ INTEL_SPI_OP_DATA_IN(1), \
914+ intel_spi_read_reg, \
915+ HSFSTS_CTL_FCYCLE_RDSR), \
916+ INTEL_SPI_MEM_OP_REPL(SPI_MEM_OP_CMD(SPINOR_OP_WRSR, 1), \
917+ SPI_MEM_OP_NO_ADDR, \
918+ INTEL_SPI_OP_DATA_OUT(1), \
919+ intel_spi_write_reg, \
920+ HSFSTS_CTL_FCYCLE_WRSR), \
927921 /* Normal read */ \
928922 INTEL_SPI_MEM_OP (SPI_MEM_OP_CMD (SPINOR_OP_READ , 1 ), \
929923 INTEL_SPI_OP_ADDR (3 ), \
0 commit comments