Merge tag 'spi-fix-v6.9-merge-window' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 22 Mar 2024 16:57:00 +0000 (09:57 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 22 Mar 2024 16:57:00 +0000 (09:57 -0700)
Pull spi fixes from Mark Brown:
 "A small collection of fixes that came in since the merge window. Most
  of it is relatively minor driver specific fixes, there's also fixes
  for error handling with SPI flash devices and a fix restoring delay
  control functionality for non-GPIO chip selects managed by the core"

* tag 'spi-fix-v6.9-merge-window' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
  spi: spi-mt65xx: Fix NULL pointer access in interrupt handler
  spi: docs: spidev: fix echo command format
  spi: spi-imx: fix off-by-one in mx51 CPU mode burst length
  spi: lm70llp: fix links in doc and comments
  spi: Fix error code checking in spi_mem_exec_op()
  spi: Restore delays for non-GPIO chip select
  spi: lpspi: Avoid potential use-after-free in probe()

Documentation/spi/spi-lm70llp.rst
Documentation/spi/spidev.rst
drivers/spi/spi-fsl-lpspi.c
drivers/spi/spi-imx.c
drivers/spi/spi-lm70llp.c
drivers/spi/spi-mem.c
drivers/spi/spi-mt65xx.c
drivers/spi/spi.c

index 2f20e5b405e66afba0ff50b233abf659884fe2a4..ff98ddc76a7478efbd9faccafb8e46f672952e8d 100644 (file)
@@ -6,7 +6,7 @@ Supported board/chip:
 
   * National Semiconductor LM70 LLP evaluation board
 
-    Datasheet: http://www.national.com/pf/LM/LM70.html
+    Datasheet: https://www.ti.com/lit/gpn/lm70
 
 Author:
         Kaiwan N Billimoria <kaiwan@designergraphix.com>
@@ -28,7 +28,7 @@ Hardware Interfacing
 The schematic for this particular board (the LM70EVAL-LLP) is
 available (on page 4) here:
 
-  http://www.national.com/appinfo/tempsensors/files/LM70LLPEVALmanual.pdf
+  https://download.datasheets.com/pdfs/documentation/nat/kit&board/lm70llpevalmanual.pdf
 
 The hardware interfacing on the LM70 LLP eval board is as follows:
 
index 369c657ba4358bd6164dc85ea0c5b7c5ebba0dad..e08b301ad24ac649293ad7c4b7b911dde80d877d 100644 (file)
@@ -61,7 +61,7 @@ the spidev driver failing to probe.
 
 Sysfs also supports userspace driven binding/unbinding of drivers to
 devices that do not bind automatically using one of the tables above.
-To make the spidev driver bind to such a device, use the following:
+To make the spidev driver bind to such a device, use the following::
 
     echo spidev > /sys/bus/spi/devices/spiB.C/driver_override
     echo spiB.C > /sys/bus/spi/drivers/spidev/bind
index 11991eb12636449be443a0f83915796105f7091f..079035db7dd8592aa62a21d5e88480028c5941bb 100644 (file)
@@ -830,11 +830,11 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
 
        is_target = of_property_read_bool((&pdev->dev)->of_node, "spi-slave");
        if (is_target)
-               controller = spi_alloc_target(&pdev->dev,
-                                             sizeof(struct fsl_lpspi_data));
+               controller = devm_spi_alloc_target(&pdev->dev,
+                                                  sizeof(struct fsl_lpspi_data));
        else
-               controller = spi_alloc_host(&pdev->dev,
-                                           sizeof(struct fsl_lpspi_data));
+               controller = devm_spi_alloc_host(&pdev->dev,
+                                                sizeof(struct fsl_lpspi_data));
 
        if (!controller)
                return -ENOMEM;
index 833a1bb7a91438e02c2d5a176e1afdaba4159552..c3e5cee18bea73b4afbd16e6272860a833985e2b 100644 (file)
@@ -668,8 +668,8 @@ static int mx51_ecspi_prepare_transfer(struct spi_imx_data *spi_imx,
                                ctrl |= (MX51_ECSPI_CTRL_MAX_BURST * BITS_PER_BYTE - 1)
                                                << MX51_ECSPI_CTRL_BL_OFFSET;
                        else
-                               ctrl |= spi_imx->count / DIV_ROUND_UP(spi_imx->bits_per_word,
-                                               BITS_PER_BYTE) * spi_imx->bits_per_word
+                               ctrl |= (spi_imx->count / DIV_ROUND_UP(spi_imx->bits_per_word,
+                                               BITS_PER_BYTE) * spi_imx->bits_per_word - 1)
                                                << MX51_ECSPI_CTRL_BL_OFFSET;
                }
        }
index f982bdebd02838a0494d1a6fdcf3f658fcd7dea4..3c0c24ed1f3dbe3de539fcd0297098b41a6efcf7 100644 (file)
  *
  * Datasheet and Schematic:
  * The LM70 is a temperature sensor chip from National Semiconductor; its
- * datasheet is available at http://www.national.com/pf/LM/LM70.html
+ * datasheet is available at https://www.ti.com/lit/gpn/lm70
  * The schematic for this particular board (the LM70EVAL-LLP) is
  * available (on page 4) here:
- *  http://www.national.com/appinfo/tempsensors/files/LM70LLPEVALmanual.pdf
+ *  https://download.datasheets.com/pdfs/documentation/nat/kit&board/lm70llpevalmanual.pdf
  *
  * Also see Documentation/spi/spi-lm70llp.rst.  The SPI<->parport code here is
  * (heavily) based on spi-butterfly by David Brownell.
index c9d6d42a88f55b4518881eb7cee6d2d8ec8657f7..17b8baf749e6aa2a6263b8b018361469032f7c56 100644 (file)
@@ -382,7 +382,7 @@ int spi_mem_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
                 * read path) and expect the core to use the regular SPI
                 * interface in other cases.
                 */
-               if (!ret || ret != -ENOTSUPP || ret != -EOPNOTSUPP) {
+               if (!ret || (ret != -ENOTSUPP && ret != -EOPNOTSUPP)) {
                        spi_mem_add_op_stats(ctlr->pcpu_statistics, op, ret);
                        spi_mem_add_op_stats(mem->spi->pcpu_statistics, op, ret);
 
index 8d4633b353eef662b224c966f7b9d9ba7527e076..e4cb22fe007523a3e07551fc86c126213330be16 100644 (file)
@@ -788,17 +788,19 @@ static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id)
                mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, len);
                mtk_spi_setup_packet(host);
 
-               cnt = mdata->xfer_len / 4;
-               iowrite32_rep(mdata->base + SPI_TX_DATA_REG,
-                               trans->tx_buf + mdata->num_xfered, cnt);
+               if (trans->tx_buf) {
+                       cnt = mdata->xfer_len / 4;
+                       iowrite32_rep(mdata->base + SPI_TX_DATA_REG,
+                                       trans->tx_buf + mdata->num_xfered, cnt);
 
-               remainder = mdata->xfer_len % 4;
-               if (remainder > 0) {
-                       reg_val = 0;
-                       memcpy(&reg_val,
-                               trans->tx_buf + (cnt * 4) + mdata->num_xfered,
-                               remainder);
-                       writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+                       remainder = mdata->xfer_len % 4;
+                       if (remainder > 0) {
+                               reg_val = 0;
+                               memcpy(&reg_val,
+                                       trans->tx_buf + (cnt * 4) + mdata->num_xfered,
+                                       remainder);
+                               writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+                       }
                }
 
                mtk_spi_enable_transfer(host);
index f18738ae95f8f9f76779921848470ee40783c130..ff75838c1b5dfa44fccca525c3a8a334051167fb 100644 (file)
@@ -1063,10 +1063,14 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force)
        if (spi->mode & SPI_CS_HIGH)
                enable = !enable;
 
-       if (spi_is_csgpiod(spi)) {
-               if (!spi->controller->set_cs_timing && !activate)
-                       spi_delay_exec(&spi->cs_hold, NULL);
+       /*
+        * Handle chip select delays for GPIO based CS or controllers without
+        * programmable chip select timing.
+        */
+       if ((spi_is_csgpiod(spi) || !spi->controller->set_cs_timing) && !activate)
+               spi_delay_exec(&spi->cs_hold, NULL);
 
+       if (spi_is_csgpiod(spi)) {
                if (!(spi->mode & SPI_NO_CS)) {
                        /*
                         * Historically ACPI has no means of the GPIO polarity and
@@ -1099,16 +1103,16 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force)
                if ((spi->controller->flags & SPI_CONTROLLER_GPIO_SS) &&
                    spi->controller->set_cs)
                        spi->controller->set_cs(spi, !enable);
-
-               if (!spi->controller->set_cs_timing) {
-                       if (activate)
-                               spi_delay_exec(&spi->cs_setup, NULL);
-                       else
-                               spi_delay_exec(&spi->cs_inactive, NULL);
-               }
        } else if (spi->controller->set_cs) {
                spi->controller->set_cs(spi, !enable);
        }
+
+       if (spi_is_csgpiod(spi) || !spi->controller->set_cs_timing) {
+               if (activate)
+                       spi_delay_exec(&spi->cs_setup, NULL);
+               else
+                       spi_delay_exec(&spi->cs_inactive, NULL);
+       }
 }
 
 #ifdef CONFIG_HAS_DMA