Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'spi-fix-v4.19-rc5' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Mark writes:
"spi: Fixes for v4.19

Quite a few fixes for the Renesas drivers in here, plus a fix for the
Tegra driver and some documentation fixes for the recently added
spi-mem code. The Tegra fix is relatively large but fairly
straightforward and mechanical, it runs on probe so it's been
reasonably well covered in -next testing."

* tag 'spi-fix-v4.19-rc5' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
spi: spi-mem: Move the DMA-able constraint doc to the kerneldoc header
spi: spi-mem: Add missing description for data.nbytes field
spi: rspi: Fix interrupted DMA transfers
spi: rspi: Fix invalid SPI use during system suspend
spi: sh-msiof: Fix handling of write value for SISTR register
spi: sh-msiof: Fix invalid SPI use during system suspend
spi: gpio: Fix copy-and-paste error
spi: tegra20-slink: explicitly enable/disable clock

+86 -18
+2 -2
drivers/spi/spi-gpio.c
··· 300 300 *mflags |= SPI_MASTER_NO_RX; 301 301 302 302 spi_gpio->sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW); 303 - if (IS_ERR(spi_gpio->mosi)) 304 - return PTR_ERR(spi_gpio->mosi); 303 + if (IS_ERR(spi_gpio->sck)) 304 + return PTR_ERR(spi_gpio->sck); 305 305 306 306 for (i = 0; i < num_chipselects; i++) { 307 307 spi_gpio->cs_gpios[i] = devm_gpiod_get_index(dev, "cs",
+30 -4
drivers/spi/spi-rspi.c
··· 598 598 599 599 ret = wait_event_interruptible_timeout(rspi->wait, 600 600 rspi->dma_callbacked, HZ); 601 - if (ret > 0 && rspi->dma_callbacked) 601 + if (ret > 0 && rspi->dma_callbacked) { 602 602 ret = 0; 603 - else if (!ret) { 604 - dev_err(&rspi->master->dev, "DMA timeout\n"); 605 - ret = -ETIMEDOUT; 603 + } else { 604 + if (!ret) { 605 + dev_err(&rspi->master->dev, "DMA timeout\n"); 606 + ret = -ETIMEDOUT; 607 + } 606 608 if (tx) 607 609 dmaengine_terminate_all(rspi->master->dma_tx); 608 610 if (rx) ··· 1352 1350 1353 1351 MODULE_DEVICE_TABLE(platform, spi_driver_ids); 1354 1352 1353 + #ifdef CONFIG_PM_SLEEP 1354 + static int rspi_suspend(struct device *dev) 1355 + { 1356 + struct platform_device *pdev = to_platform_device(dev); 1357 + struct rspi_data *rspi = platform_get_drvdata(pdev); 1358 + 1359 + return spi_master_suspend(rspi->master); 1360 + } 1361 + 1362 + static int rspi_resume(struct device *dev) 1363 + { 1364 + struct platform_device *pdev = to_platform_device(dev); 1365 + struct rspi_data *rspi = platform_get_drvdata(pdev); 1366 + 1367 + return spi_master_resume(rspi->master); 1368 + } 1369 + 1370 + static SIMPLE_DEV_PM_OPS(rspi_pm_ops, rspi_suspend, rspi_resume); 1371 + #define DEV_PM_OPS &rspi_pm_ops 1372 + #else 1373 + #define DEV_PM_OPS NULL 1374 + #endif /* CONFIG_PM_SLEEP */ 1375 + 1355 1376 static struct platform_driver rspi_driver = { 1356 1377 .probe = rspi_probe, 1357 1378 .remove = rspi_remove, 1358 1379 .id_table = spi_driver_ids, 1359 1380 .driver = { 1360 1381 .name = "renesas_spi", 1382 + .pm = DEV_PM_OPS, 1361 1383 .of_match_table = of_match_ptr(rspi_of_match), 1362 1384 }, 1363 1385 };
+27 -1
drivers/spi/spi-sh-msiof.c
··· 397 397 398 398 static void sh_msiof_reset_str(struct sh_msiof_spi_priv *p) 399 399 { 400 - sh_msiof_write(p, STR, sh_msiof_read(p, STR)); 400 + sh_msiof_write(p, STR, 401 + sh_msiof_read(p, STR) & ~(STR_TDREQ | STR_RDREQ)); 401 402 } 402 403 403 404 static void sh_msiof_spi_write_fifo_8(struct sh_msiof_spi_priv *p, ··· 1427 1426 }; 1428 1427 MODULE_DEVICE_TABLE(platform, spi_driver_ids); 1429 1428 1429 + #ifdef CONFIG_PM_SLEEP 1430 + static int sh_msiof_spi_suspend(struct device *dev) 1431 + { 1432 + struct platform_device *pdev = to_platform_device(dev); 1433 + struct sh_msiof_spi_priv *p = platform_get_drvdata(pdev); 1434 + 1435 + return spi_master_suspend(p->master); 1436 + } 1437 + 1438 + static int sh_msiof_spi_resume(struct device *dev) 1439 + { 1440 + struct platform_device *pdev = to_platform_device(dev); 1441 + struct sh_msiof_spi_priv *p = platform_get_drvdata(pdev); 1442 + 1443 + return spi_master_resume(p->master); 1444 + } 1445 + 1446 + static SIMPLE_DEV_PM_OPS(sh_msiof_spi_pm_ops, sh_msiof_spi_suspend, 1447 + sh_msiof_spi_resume); 1448 + #define DEV_PM_OPS &sh_msiof_spi_pm_ops 1449 + #else 1450 + #define DEV_PM_OPS NULL 1451 + #endif /* CONFIG_PM_SLEEP */ 1452 + 1430 1453 static struct platform_driver sh_msiof_spi_drv = { 1431 1454 .probe = sh_msiof_spi_probe, 1432 1455 .remove = sh_msiof_spi_remove, 1433 1456 .id_table = spi_driver_ids, 1434 1457 .driver = { 1435 1458 .name = "spi_sh_msiof", 1459 + .pm = DEV_PM_OPS, 1436 1460 .of_match_table = of_match_ptr(sh_msiof_match), 1437 1461 }, 1438 1462 };
+23 -8
drivers/spi/spi-tegra20-slink.c
··· 1063 1063 goto exit_free_master; 1064 1064 } 1065 1065 1066 + /* disabled clock may cause interrupt storm upon request */ 1067 + tspi->clk = devm_clk_get(&pdev->dev, NULL); 1068 + if (IS_ERR(tspi->clk)) { 1069 + ret = PTR_ERR(tspi->clk); 1070 + dev_err(&pdev->dev, "Can not get clock %d\n", ret); 1071 + goto exit_free_master; 1072 + } 1073 + ret = clk_prepare(tspi->clk); 1074 + if (ret < 0) { 1075 + dev_err(&pdev->dev, "Clock prepare failed %d\n", ret); 1076 + goto exit_free_master; 1077 + } 1078 + ret = clk_enable(tspi->clk); 1079 + if (ret < 0) { 1080 + dev_err(&pdev->dev, "Clock enable failed %d\n", ret); 1081 + goto exit_free_master; 1082 + } 1083 + 1066 1084 spi_irq = platform_get_irq(pdev, 0); 1067 1085 tspi->irq = spi_irq; 1068 1086 ret = request_threaded_irq(tspi->irq, tegra_slink_isr, ··· 1089 1071 if (ret < 0) { 1090 1072 dev_err(&pdev->dev, "Failed to register ISR for IRQ %d\n", 1091 1073 tspi->irq); 1092 - goto exit_free_master; 1093 - } 1094 - 1095 - tspi->clk = devm_clk_get(&pdev->dev, NULL); 1096 - if (IS_ERR(tspi->clk)) { 1097 - dev_err(&pdev->dev, "can not get clock\n"); 1098 - ret = PTR_ERR(tspi->clk); 1099 - goto exit_free_irq; 1074 + goto exit_clk_disable; 1100 1075 } 1101 1076 1102 1077 tspi->rst = devm_reset_control_get_exclusive(&pdev->dev, "spi"); ··· 1149 1138 tegra_slink_deinit_dma_param(tspi, true); 1150 1139 exit_free_irq: 1151 1140 free_irq(spi_irq, tspi); 1141 + exit_clk_disable: 1142 + clk_disable(tspi->clk); 1152 1143 exit_free_master: 1153 1144 spi_master_put(master); 1154 1145 return ret; ··· 1162 1149 struct tegra_slink_data *tspi = spi_master_get_devdata(master); 1163 1150 1164 1151 free_irq(tspi->irq, tspi); 1152 + 1153 + clk_disable(tspi->clk); 1165 1154 1166 1155 if (tspi->tx_dma_chan) 1167 1156 tegra_slink_deinit_dma_param(tspi, false);
+4 -3
include/linux/spi/spi-mem.h
··· 81 81 * @dummy.buswidth: number of IO lanes used to transmit the dummy bytes 82 82 * @data.buswidth: number of IO lanes used to send/receive the data 83 83 * @data.dir: direction of the transfer 84 - * @data.buf.in: input buffer 85 - * @data.buf.out: output buffer 84 + * @data.nbytes: number of data bytes to send/receive. Can be zero if the 85 + * operation does not involve transferring data 86 + * @data.buf.in: input buffer (must be DMA-able) 87 + * @data.buf.out: output buffer (must be DMA-able) 86 88 */ 87 89 struct spi_mem_op { 88 90 struct { ··· 107 105 u8 buswidth; 108 106 enum spi_mem_data_dir dir; 109 107 unsigned int nbytes; 110 - /* buf.{in,out} must be DMA-able. */ 111 108 union { 112 109 void *in; 113 110 const void *out;