Message ID | 20221219144254.20883-4-wsadowski@marvell.com |
---|---|
State | New |
Headers | show |
Series | Support for Marvell modifications for Cadence XSPI | expand |
Hi Witold, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on broonie-spi/for-next] [also build test WARNING on linus/master v6.1 next-20221219] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Witold-Sadowski/Support-for-Marvell-modifications-for-Cadence-XSPI/20221219-224547 base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next patch link: https://lore.kernel.org/r/20221219144254.20883-4-wsadowski%40marvell.com patch subject: [PATCH 3/7] spi: cadence: Add polling mode support config: m68k-allmodconfig compiler: m68k-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/0607f814dcd1b5b46998036b3488badc995ce4cc git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Witold-Sadowski/Support-for-Marvell-modifications-for-Cadence-XSPI/20221219-224547 git checkout 0607f814dcd1b5b46998036b3488badc995ce4cc # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash drivers/spi/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/spi/spi-cadence-xspi.c:354:6: warning: no previous prototype for 'cdns_xspi_stig_ready' [-Wmissing-prototypes] 354 | bool cdns_xspi_stig_ready(struct cdns_xspi_dev *cdns_xspi) | ^~~~~~~~~~~~~~~~~~~~ >> drivers/spi/spi-cadence-xspi.c:365:6: warning: no previous prototype for 'cdns_xspi_sdma_ready' [-Wmissing-prototypes] 365 | bool cdns_xspi_sdma_ready(struct cdns_xspi_dev *cdns_xspi) | ^~~~~~~~~~~~~~~~~~~~ vim +/cdns_xspi_stig_ready +354 drivers/spi/spi-cadence-xspi.c 353 > 354 bool cdns_xspi_stig_ready(struct cdns_xspi_dev *cdns_xspi) 355 { 356 u32 ctrl_stat; 357 358 return readl_relaxed_poll_timeout 359 (cdns_xspi->iobase + CDNS_XSPI_CTRL_STATUS_REG, 360 ctrl_stat, 361 ((ctrl_stat & BIT(3)) == 0), 362 CDNS_XSPI_POLL_DELAY_US, CDNS_XSPI_POLL_TIMEOUT_US); 363 } 364 > 365 bool cdns_xspi_sdma_ready(struct cdns_xspi_dev *cdns_xspi) 366 { 367 u32 ctrl_stat; 368 369 return readl_relaxed_poll_timeout 370 (cdns_xspi->iobase + CDNS_XSPI_INTR_STATUS_REG, 371 ctrl_stat, 372 (ctrl_stat & CDNS_XSPI_SDMA_TRIGGER), 373 CDNS_XSPI_POLL_DELAY_US, CDNS_XSPI_POLL_TIMEOUT_US); 374 } 375
diff --git a/drivers/spi/spi-cadence-xspi.c b/drivers/spi/spi-cadence-xspi.c index 91db3c973167..25db0d55d5ef 100644 --- a/drivers/spi/spi-cadence-xspi.c +++ b/drivers/spi/spi-cadence-xspi.c @@ -190,6 +190,9 @@ ((op)->data.dir == SPI_MEM_DATA_IN) ? \ CDNS_XSPI_STIG_CMD_DIR_READ : CDNS_XSPI_STIG_CMD_DIR_WRITE)) +#define CDNS_XSPI_POLL_TIMEOUT_US 1000 +#define CDNS_XSPI_POLL_DELAY_US 10 + enum cdns_xspi_stig_instr_type { CDNS_XSPI_STIG_INSTR_TYPE_0, CDNS_XSPI_STIG_INSTR_TYPE_1, @@ -293,6 +296,9 @@ static void cdns_xspi_set_interrupts(struct cdns_xspi_dev *cdns_xspi, { u32 intr_enable; + if (!cdns_xspi->irq) + return; + intr_enable = readl(cdns_xspi->iobase + CDNS_XSPI_INTR_ENABLE_REG); if (enabled) intr_enable |= CDNS_XSPI_INTR_MASK; @@ -345,6 +351,28 @@ static void cdns_xspi_sdma_handle(struct cdns_xspi_dev *cdns_xspi) } } +bool cdns_xspi_stig_ready(struct cdns_xspi_dev *cdns_xspi) +{ + u32 ctrl_stat; + + return readl_relaxed_poll_timeout + (cdns_xspi->iobase + CDNS_XSPI_CTRL_STATUS_REG, + ctrl_stat, + ((ctrl_stat & BIT(3)) == 0), + CDNS_XSPI_POLL_DELAY_US, CDNS_XSPI_POLL_TIMEOUT_US); +} + +bool cdns_xspi_sdma_ready(struct cdns_xspi_dev *cdns_xspi) +{ + u32 ctrl_stat; + + return readl_relaxed_poll_timeout + (cdns_xspi->iobase + CDNS_XSPI_INTR_STATUS_REG, + ctrl_stat, + (ctrl_stat & CDNS_XSPI_SDMA_TRIGGER), + CDNS_XSPI_POLL_DELAY_US, CDNS_XSPI_POLL_TIMEOUT_US); +} + static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi, const struct spi_mem_op *op, bool data_phase) @@ -385,16 +413,26 @@ static int cdns_xspi_send_stig_command(struct cdns_xspi_dev *cdns_xspi, cdns_xspi_trigger_command(cdns_xspi, cmd_regs); - wait_for_completion(&cdns_xspi->sdma_complete); - if (cdns_xspi->sdma_error) { - cdns_xspi_set_interrupts(cdns_xspi, false); - return -EIO; + if (cdns_xspi->irq) { + wait_for_completion(&cdns_xspi->sdma_complete); + if (cdns_xspi->sdma_error) { + cdns_xspi_set_interrupts(cdns_xspi, false); + return -EIO; + } + } else { + if (cdns_xspi_sdma_ready(cdns_xspi)) + return -EIO; } cdns_xspi_sdma_handle(cdns_xspi); } - wait_for_completion(&cdns_xspi->cmd_complete); - cdns_xspi_set_interrupts(cdns_xspi, false); + if (cdns_xspi->irq) { + wait_for_completion(&cdns_xspi->cmd_complete); + cdns_xspi_set_interrupts(cdns_xspi, false); + } else { + if (cdns_xspi_stig_ready(cdns_xspi)) + return -EIO; + } cmd_status = cdns_xspi_check_command_status(cdns_xspi); if (cmd_status) @@ -580,13 +618,15 @@ static int cdns_xspi_probe(struct platform_device *pdev) cdns_xspi->irq = platform_get_irq(pdev, 0); if (cdns_xspi->irq < 0) - return -ENXIO; - - ret = devm_request_irq(dev, cdns_xspi->irq, cdns_xspi_irq_handler, - IRQF_SHARED, pdev->name, cdns_xspi); - if (ret) { - dev_err(dev, "Failed to request IRQ: %d\n", cdns_xspi->irq); - return ret; + cdns_xspi->irq = 0; + + if (cdns_xspi->irq) { + ret = devm_request_irq(dev, cdns_xspi->irq, cdns_xspi_irq_handler, + IRQF_SHARED, pdev->name, cdns_xspi); + if (ret) { + dev_err(dev, "Failed to request IRQ: %d\n", cdns_xspi->irq); + return ret; + } } cdns_xspi_print_phy_config(cdns_xspi);