spi: xilinx: Switch to use devm_spi_alloc_master()
[platform/kernel/linux-starfive.git] / drivers / spi / spi.c
index 83da886..c582ae4 100644 (file)
@@ -753,7 +753,7 @@ struct spi_device *spi_new_device(struct spi_controller *ctlr,
        proxy->max_speed_hz = chip->max_speed_hz;
        proxy->mode = chip->mode;
        proxy->irq = chip->irq;
-       strlcpy(proxy->modalias, chip->modalias, sizeof(proxy->modalias));
+       strscpy(proxy->modalias, chip->modalias, sizeof(proxy->modalias));
        proxy->dev.platform_data = (void *) chip->platform_data;
        proxy->controller_data = chip->controller_data;
        proxy->controller_state = NULL;
@@ -1435,7 +1435,8 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
        struct spi_statistics __percpu *statm = ctlr->pcpu_statistics;
        struct spi_statistics __percpu *stats = msg->spi->pcpu_statistics;
 
-       spi_set_cs(msg->spi, true, false);
+       xfer = list_first_entry(&msg->transfers, struct spi_transfer, transfer_list);
+       spi_set_cs(msg->spi, !xfer->cs_off, false);
 
        SPI_STATISTICS_INCREMENT_FIELD(statm, messages);
        SPI_STATISTICS_INCREMENT_FIELD(stats, messages);
@@ -1503,10 +1504,15 @@ fallback_pio:
                                         &msg->transfers)) {
                                keep_cs = true;
                        } else {
-                               spi_set_cs(msg->spi, false, false);
+                               if (!xfer->cs_off)
+                                       spi_set_cs(msg->spi, false, false);
                                _spi_transfer_cs_change_delay(msg, xfer);
-                               spi_set_cs(msg->spi, true, false);
+                               if (!list_next_entry(xfer, transfer_list)->cs_off)
+                                       spi_set_cs(msg->spi, true, false);
                        }
+               } else if (!list_is_last(&xfer->transfer_list, &msg->transfers) &&
+                          xfer->cs_off != list_next_entry(xfer, transfer_list)->cs_off) {
+                       spi_set_cs(msg->spi, xfer->cs_off, false);
                }
 
                msg->actual_length += xfer->len;
@@ -2330,7 +2336,7 @@ struct spi_device *spi_new_ancillary_device(struct spi_device *spi,
                goto err_out;
        }
 
-       strlcpy(ancillary->modalias, "dummy", sizeof(ancillary->modalias));
+       strscpy(ancillary->modalias, "dummy", sizeof(ancillary->modalias));
 
        /* Use provided chip-select for ancillary device */
        ancillary->chip_select = chip_select;
@@ -2726,7 +2732,7 @@ static ssize_t slave_store(struct device *dev, struct device_attribute *attr,
                if (!spi)
                        return -ENOMEM;
 
-               strlcpy(spi->modalias, name, sizeof(spi->modalias));
+               strscpy(spi->modalias, name, sizeof(spi->modalias));
 
                rc = spi_add_device(spi);
                if (rc) {