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

Merge remote-tracking branches 'spi/topic/spidev', 'spi/topic/sunxi', 'spi/topic/ti-qspi', 'spi/topic/topcliff-pch' and 'spi/topic/txx9' into spi-next

+62 -33
+8
drivers/spi/spi-sun4i.c
··· 167 167 sun4i_spi_write(sspi, SUN4I_CTL_REG, reg); 168 168 } 169 169 170 + static size_t sun4i_spi_max_transfer_size(struct spi_device *spi) 171 + { 172 + return SUN4I_FIFO_DEPTH - 1; 173 + } 174 + 170 175 static int sun4i_spi_transfer_one(struct spi_master *master, 171 176 struct spi_device *spi, 172 177 struct spi_transfer *tfr) ··· 407 402 } 408 403 409 404 sspi->master = master; 405 + master->max_speed_hz = 100 * 1000 * 1000; 406 + master->min_speed_hz = 3 * 1000; 410 407 master->set_cs = sun4i_spi_set_cs; 411 408 master->transfer_one = sun4i_spi_transfer_one; 412 409 master->num_chipselect = 4; ··· 416 409 master->bits_per_word_mask = SPI_BPW_MASK(8); 417 410 master->dev.of_node = pdev->dev.of_node; 418 411 master->auto_runtime_pm = true; 412 + master->max_transfer_size = sun4i_spi_max_transfer_size; 419 413 420 414 sspi->hclk = devm_clk_get(&pdev->dev, "ahb"); 421 415 if (IS_ERR(sspi->hclk)) {
+7
drivers/spi/spi-sun6i.c
··· 153 153 sun6i_spi_write(sspi, SUN6I_TFR_CTL_REG, reg); 154 154 } 155 155 156 + static size_t sun6i_spi_max_transfer_size(struct spi_device *spi) 157 + { 158 + return SUN6I_FIFO_DEPTH - 1; 159 + } 156 160 157 161 static int sun6i_spi_transfer_one(struct spi_master *master, 158 162 struct spi_device *spi, ··· 398 394 } 399 395 400 396 sspi->master = master; 397 + master->max_speed_hz = 100 * 1000 * 1000; 398 + master->min_speed_hz = 3 * 1000; 401 399 master->set_cs = sun6i_spi_set_cs; 402 400 master->transfer_one = sun6i_spi_transfer_one; 403 401 master->num_chipselect = 4; ··· 407 401 master->bits_per_word_mask = SPI_BPW_MASK(8); 408 402 master->dev.of_node = pdev->dev.of_node; 409 403 master->auto_runtime_pm = true; 404 + master->max_transfer_size = sun6i_spi_max_transfer_size; 410 405 411 406 sspi->hclk = devm_clk_get(&pdev->dev, "ahb"); 412 407 if (IS_ERR(sspi->hclk)) {
+1 -1
drivers/spi/spi-ti-qspi.c
··· 141 141 u32 clk_ctrl_reg, clk_rate, clk_mask; 142 142 143 143 if (spi->master->busy) { 144 - dev_dbg(qspi->dev, "master busy doing other trasnfers\n"); 144 + dev_dbg(qspi->dev, "master busy doing other transfers\n"); 145 145 return -EBUSY; 146 146 } 147 147
+3 -23
drivers/spi/spi-topcliff-pch.c
··· 133 133 * @io_remap_addr: The remapped PCI base address 134 134 * @master: Pointer to the SPI master structure 135 135 * @work: Reference to work queue handler 136 - * @wk: Workqueue for carrying out execution of the 137 - * requests 138 136 * @wait: Wait queue for waking up upon receiving an 139 137 * interrupt. 140 138 * @transfer_complete: Status of SPI Transfer ··· 167 169 unsigned long io_base_addr; 168 170 struct spi_master *master; 169 171 struct work_struct work; 170 - struct workqueue_struct *wk; 171 172 wait_queue_head_t wait; 172 173 u8 transfer_complete; 173 174 u8 bcurrent_msg_processing; ··· 514 517 515 518 dev_dbg(&pspi->dev, "%s - Invoked list_add_tail\n", __func__); 516 519 517 - /* schedule work queue to run */ 518 - queue_work(data->wk, &data->work); 520 + schedule_work(&data->work); 519 521 dev_dbg(&pspi->dev, "%s - Invoked queue work\n", __func__); 520 522 521 523 retval = 0; ··· 670 674 *more messages) 671 675 */ 672 676 dev_dbg(&data->master->dev, "%s:Invoke queue_work\n", __func__); 673 - queue_work(data->wk, &data->work); 677 + schedule_work(&data->work); 674 678 } else if (data->board_dat->suspend_sts || 675 679 data->status == STATUS_EXITING) { 676 680 dev_dbg(&data->master->dev, ··· 1262 1266 { 1263 1267 dev_dbg(&board_dat->pdev->dev, "%s ENTRY\n", __func__); 1264 1268 1265 - /* free workqueue */ 1266 - if (data->wk != NULL) { 1267 - destroy_workqueue(data->wk); 1268 - data->wk = NULL; 1269 - dev_dbg(&board_dat->pdev->dev, 1270 - "%s destroy_workqueue invoked successfully\n", 1271 - __func__); 1272 - } 1269 + flush_work(&data->work); 1273 1270 } 1274 1271 1275 1272 static int pch_spi_get_resources(struct pch_spi_board_data *board_dat, ··· 1272 1283 1273 1284 dev_dbg(&board_dat->pdev->dev, "%s ENTRY\n", __func__); 1274 1285 1275 - /* create workqueue */ 1276 - data->wk = create_singlethread_workqueue(KBUILD_MODNAME); 1277 - if (!data->wk) { 1278 - dev_err(&board_dat->pdev->dev, 1279 - "%s create_singlet hread_workqueue failed\n", __func__); 1280 - retval = -EBUSY; 1281 - goto err_return; 1282 - } 1283 1286 1284 1287 /* reset PCH SPI h/w */ 1285 1288 pch_spi_reset(data->master); ··· 1280 1299 1281 1300 dev_dbg(&board_dat->pdev->dev, "%s data->irq_reg_sts=true\n", __func__); 1282 1301 1283 - err_return: 1284 1302 if (retval != 0) { 1285 1303 dev_err(&board_dat->pdev->dev, 1286 1304 "%s FAIL:invoking pch_spi_free_resources\n", __func__);
+2 -9
drivers/spi/spi-txx9.c
··· 72 72 73 73 74 74 struct txx9spi { 75 - struct workqueue_struct *workqueue; 76 75 struct work_struct work; 77 76 spinlock_t lock; /* protect 'queue' */ 78 77 struct list_head queue; ··· 314 315 315 316 spin_lock_irqsave(&c->lock, flags); 316 317 list_add_tail(&m->queue, &c->queue); 317 - queue_work(c->workqueue, &c->work); 318 + schedule_work(&c->work); 318 319 spin_unlock_irqrestore(&c->lock, flags); 319 320 320 321 return 0; ··· 373 374 if (ret) 374 375 goto exit; 375 376 376 - c->workqueue = create_singlethread_workqueue( 377 - dev_name(master->dev.parent)); 378 - if (!c->workqueue) 379 - goto exit_busy; 380 377 c->last_chipselect = -1; 381 378 382 379 dev_info(&dev->dev, "at %#llx, irq %d, %dMHz\n", ··· 395 400 exit_busy: 396 401 ret = -EBUSY; 397 402 exit: 398 - if (c->workqueue) 399 - destroy_workqueue(c->workqueue); 400 403 clk_disable(c->clk); 401 404 spi_master_put(master); 402 405 return ret; ··· 405 412 struct spi_master *master = platform_get_drvdata(dev); 406 413 struct txx9spi *c = spi_master_get_devdata(master); 407 414 408 - destroy_workqueue(c->workqueue); 415 + flush_work(&c->work); 409 416 clk_disable(c->clk); 410 417 return 0; 411 418 }
+41
drivers/spi/spidev.c
··· 29 29 #include <linux/compat.h> 30 30 #include <linux/of.h> 31 31 #include <linux/of_device.h> 32 + #include <linux/acpi.h> 32 33 33 34 #include <linux/spi/spi.h> 34 35 #include <linux/spi/spidev.h> ··· 701 700 MODULE_DEVICE_TABLE(of, spidev_dt_ids); 702 701 #endif 703 702 703 + #ifdef CONFIG_ACPI 704 + 705 + /* Dummy SPI devices not to be used in production systems */ 706 + #define SPIDEV_ACPI_DUMMY 1 707 + 708 + static const struct acpi_device_id spidev_acpi_ids[] = { 709 + /* 710 + * The ACPI SPT000* devices are only meant for development and 711 + * testing. Systems used in production should have a proper ACPI 712 + * description of the connected peripheral and they should also use 713 + * a proper driver instead of poking directly to the SPI bus. 714 + */ 715 + { "SPT0001", SPIDEV_ACPI_DUMMY }, 716 + { "SPT0002", SPIDEV_ACPI_DUMMY }, 717 + { "SPT0003", SPIDEV_ACPI_DUMMY }, 718 + {}, 719 + }; 720 + MODULE_DEVICE_TABLE(acpi, spidev_acpi_ids); 721 + 722 + static void spidev_probe_acpi(struct spi_device *spi) 723 + { 724 + const struct acpi_device_id *id; 725 + 726 + if (!has_acpi_companion(&spi->dev)) 727 + return; 728 + 729 + id = acpi_match_device(spidev_acpi_ids, &spi->dev); 730 + if (WARN_ON(!id)) 731 + return; 732 + 733 + if (id->driver_data == SPIDEV_ACPI_DUMMY) 734 + dev_warn(&spi->dev, "do not use this driver in production systems!\n"); 735 + } 736 + #else 737 + static inline void spidev_probe_acpi(struct spi_device *spi) {} 738 + #endif 739 + 704 740 /*-------------------------------------------------------------------------*/ 705 741 706 742 static int spidev_probe(struct spi_device *spi) ··· 756 718 WARN_ON(spi->dev.of_node && 757 719 !of_match_device(spidev_dt_ids, &spi->dev)); 758 720 } 721 + 722 + spidev_probe_acpi(spi); 759 723 760 724 /* Allocate driver data */ 761 725 spidev = kzalloc(sizeof(*spidev), GFP_KERNEL); ··· 829 789 .driver = { 830 790 .name = "spidev", 831 791 .of_match_table = of_match_ptr(spidev_dt_ids), 792 + .acpi_match_table = ACPI_PTR(spidev_acpi_ids), 832 793 }, 833 794 .probe = spidev_probe, 834 795 .remove = spidev_remove,