Skip to content

Commit fe29393

Browse files
committed
Merge tag 'spi-fix-v6.12-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
Pull spi fixes from Mark Brown: "Some driver specific fixes that came in during the merge window. Lorenzo Bianconi did some extra testing on the recently added arioha driver and found some issues, Alexander Dahl fixed some issues with signal delays in the Atmel QSPI driver and Jinjie Ruan has been fixing some nits with runtime PM cleanup" * tag 'spi-fix-v6.12-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: atmel-quadspi: Avoid overwriting delay register settings spi: airoha: remove read cache in airoha_snand_dirmap_read() spi: spi-fsl-lpspi: Undo runtime PM changes at driver exit time spi: atmel-quadspi: Undo runtime PM changes at driver exit time spi: airoha: fix airoha_snand_{write,read}_data data_len estimation spi: airoha: fix dirmap_{read,write} operations
2 parents b2149f9 + 329ca3e commit fe29393

File tree

3 files changed

+26
-33
lines changed

3 files changed

+26
-33
lines changed

drivers/spi/atmel-quadspi.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -375,9 +375,9 @@ static int atmel_qspi_set_cfg(struct atmel_qspi *aq,
375375
* If the QSPI controller is set in regular SPI mode, set it in
376376
* Serial Memory Mode (SMM).
377377
*/
378-
if (aq->mr != QSPI_MR_SMM) {
379-
atmel_qspi_write(QSPI_MR_SMM, aq, QSPI_MR);
380-
aq->mr = QSPI_MR_SMM;
378+
if (!(aq->mr & QSPI_MR_SMM)) {
379+
aq->mr |= QSPI_MR_SMM;
380+
atmel_qspi_write(aq->scr, aq, QSPI_MR);
381381
}
382382

383383
/* Clear pending interrupts */
@@ -501,7 +501,8 @@ static int atmel_qspi_setup(struct spi_device *spi)
501501
if (ret < 0)
502502
return ret;
503503

504-
aq->scr = QSPI_SCR_SCBR(scbr);
504+
aq->scr &= ~QSPI_SCR_SCBR_MASK;
505+
aq->scr |= QSPI_SCR_SCBR(scbr);
505506
atmel_qspi_write(aq->scr, aq, QSPI_SCR);
506507

507508
pm_runtime_mark_last_busy(ctrl->dev.parent);
@@ -534,6 +535,7 @@ static int atmel_qspi_set_cs_timing(struct spi_device *spi)
534535
if (ret < 0)
535536
return ret;
536537

538+
aq->scr &= ~QSPI_SCR_DLYBS_MASK;
537539
aq->scr |= QSPI_SCR_DLYBS(cs_setup);
538540
atmel_qspi_write(aq->scr, aq, QSPI_SCR);
539541

@@ -549,8 +551,8 @@ static void atmel_qspi_init(struct atmel_qspi *aq)
549551
atmel_qspi_write(QSPI_CR_SWRST, aq, QSPI_CR);
550552

551553
/* Set the QSPI controller by default in Serial Memory Mode */
552-
atmel_qspi_write(QSPI_MR_SMM, aq, QSPI_MR);
553-
aq->mr = QSPI_MR_SMM;
554+
aq->mr |= QSPI_MR_SMM;
555+
atmel_qspi_write(aq->mr, aq, QSPI_MR);
554556

555557
/* Enable the QSPI controller */
556558
atmel_qspi_write(QSPI_CR_QSPIEN, aq, QSPI_CR);
@@ -721,6 +723,7 @@ static void atmel_qspi_remove(struct platform_device *pdev)
721723
clk_unprepare(aq->pclk);
722724

723725
pm_runtime_disable(&pdev->dev);
726+
pm_runtime_dont_use_autosuspend(&pdev->dev);
724727
pm_runtime_put_noidle(&pdev->dev);
725728
}
726729

drivers/spi/spi-airoha-snfi.c

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,6 @@ struct airoha_snand_dev {
211211

212212
u8 *txrx_buf;
213213
dma_addr_t dma_addr;
214-
215-
u64 cur_page_num;
216-
bool data_need_update;
217214
};
218215

219216
struct airoha_snand_ctrl {
@@ -405,7 +402,7 @@ static int airoha_snand_write_data(struct airoha_snand_ctrl *as_ctrl, u8 cmd,
405402
for (i = 0; i < len; i += data_len) {
406403
int err;
407404

408-
data_len = min(len, SPI_MAX_TRANSFER_SIZE);
405+
data_len = min(len - i, SPI_MAX_TRANSFER_SIZE);
409406
err = airoha_snand_set_fifo_op(as_ctrl, cmd, data_len);
410407
if (err)
411408
return err;
@@ -427,7 +424,7 @@ static int airoha_snand_read_data(struct airoha_snand_ctrl *as_ctrl, u8 *data,
427424
for (i = 0; i < len; i += data_len) {
428425
int err;
429426

430-
data_len = min(len, SPI_MAX_TRANSFER_SIZE);
427+
data_len = min(len - i, SPI_MAX_TRANSFER_SIZE);
431428
err = airoha_snand_set_fifo_op(as_ctrl, 0xc, data_len);
432429
if (err)
433430
return err;
@@ -644,11 +641,6 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
644641
u32 val, rd_mode;
645642
int err;
646643

647-
if (!as_dev->data_need_update)
648-
return len;
649-
650-
as_dev->data_need_update = false;
651-
652644
switch (op->cmd.opcode) {
653645
case SPI_NAND_OP_READ_FROM_CACHE_DUAL:
654646
rd_mode = 1;
@@ -739,8 +731,13 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
739731
if (err)
740732
return err;
741733

742-
err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_STA_CTL1,
743-
SPI_NFI_READ_FROM_CACHE_DONE);
734+
/*
735+
* SPI_NFI_READ_FROM_CACHE_DONE bit must be written at the end
736+
* of dirmap_read operation even if it is already set.
737+
*/
738+
err = regmap_write_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_STA_CTL1,
739+
SPI_NFI_READ_FROM_CACHE_DONE,
740+
SPI_NFI_READ_FROM_CACHE_DONE);
744741
if (err)
745742
return err;
746743

@@ -870,8 +867,13 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
870867
if (err)
871868
return err;
872869

873-
err = regmap_set_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_STA_CTL1,
874-
SPI_NFI_LOAD_TO_CACHE_DONE);
870+
/*
871+
* SPI_NFI_LOAD_TO_CACHE_DONE bit must be written at the end
872+
* of dirmap_write operation even if it is already set.
873+
*/
874+
err = regmap_write_bits(as_ctrl->regmap_nfi, REG_SPI_NFI_SNF_STA_CTL1,
875+
SPI_NFI_LOAD_TO_CACHE_DONE,
876+
SPI_NFI_LOAD_TO_CACHE_DONE);
875877
if (err)
876878
return err;
877879

@@ -885,23 +887,11 @@ static ssize_t airoha_snand_dirmap_write(struct spi_mem_dirmap_desc *desc,
885887
static int airoha_snand_exec_op(struct spi_mem *mem,
886888
const struct spi_mem_op *op)
887889
{
888-
struct airoha_snand_dev *as_dev = spi_get_ctldata(mem->spi);
889890
u8 data[8], cmd, opcode = op->cmd.opcode;
890891
struct airoha_snand_ctrl *as_ctrl;
891892
int i, err;
892893

893894
as_ctrl = spi_controller_get_devdata(mem->spi->controller);
894-
if (opcode == SPI_NAND_OP_PROGRAM_EXECUTE &&
895-
op->addr.val == as_dev->cur_page_num) {
896-
as_dev->data_need_update = true;
897-
} else if (opcode == SPI_NAND_OP_PAGE_READ) {
898-
if (!as_dev->data_need_update &&
899-
op->addr.val == as_dev->cur_page_num)
900-
return 0;
901-
902-
as_dev->data_need_update = true;
903-
as_dev->cur_page_num = op->addr.val;
904-
}
905895

906896
/* switch to manual mode */
907897
err = airoha_snand_set_mode(as_ctrl, SPI_MODE_MANUAL);
@@ -986,7 +976,6 @@ static int airoha_snand_setup(struct spi_device *spi)
986976
if (dma_mapping_error(as_ctrl->dev, as_dev->dma_addr))
987977
return -ENOMEM;
988978

989-
as_dev->data_need_update = true;
990979
spi_set_ctldata(spi, as_dev);
991980

992981
return 0;

drivers/spi/spi-fsl-lpspi.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,7 @@ static void fsl_lpspi_remove(struct platform_device *pdev)
986986

987987
fsl_lpspi_dma_exit(controller);
988988

989+
pm_runtime_dont_use_autosuspend(fsl_lpspi->dev);
989990
pm_runtime_disable(fsl_lpspi->dev);
990991
}
991992

0 commit comments

Comments
 (0)