diff options
-rw-r--r-- | Documentation/driver-model/devres.txt | 3 | ||||
-rw-r--r-- | drivers/spi/spi-bcm2835.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi-bcm63xx.c | 6 | ||||
-rw-r--r-- | drivers/spi/spi-bfin-sport.c | 27 | ||||
-rw-r--r-- | drivers/spi/spi-bfin-v3.c | 3 | ||||
-rw-r--r-- | drivers/spi/spi-bfin5xx.c | 27 | ||||
-rw-r--r-- | drivers/spi/spi-clps711x.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi-ep93xx.c | 3 | ||||
-rw-r--r-- | drivers/spi/spi-mpc512x-psc.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi-mxs.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi-octeon.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi-omap-100k.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi-omap2-mcspi.c | 3 | ||||
-rw-r--r-- | drivers/spi/spi-orion.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi-pl022.c | 6 | ||||
-rw-r--r-- | drivers/spi/spi-pxa2xx.c | 5 | ||||
-rw-r--r-- | drivers/spi/spi-sh-hspi.c | 3 | ||||
-rw-r--r-- | drivers/spi/spi-tegra114.c | 3 | ||||
-rw-r--r-- | drivers/spi/spi-tegra20-sflash.c | 3 | ||||
-rw-r--r-- | drivers/spi/spi-tegra20-slink.c | 3 | ||||
-rw-r--r-- | drivers/spi/spi-ti-qspi.c | 12 | ||||
-rw-r--r-- | drivers/spi/spi-txx9.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi.c | 35 | ||||
-rw-r--r-- | include/linux/spi/spi.h | 2 |
24 files changed, 88 insertions, 88 deletions
diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index fcb34a5697ea..84ea8216cc7d 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt | |||
@@ -302,3 +302,6 @@ PHY | |||
302 | 302 | ||
303 | SLAVE DMA ENGINE | 303 | SLAVE DMA ENGINE |
304 | devm_acpi_dma_controller_register() | 304 | devm_acpi_dma_controller_register() |
305 | |||
306 | SPI | ||
307 | devm_spi_register_master() | ||
diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c index 52c81481c5c7..4c332143a310 100644 --- a/drivers/spi/spi-bcm2835.c +++ b/drivers/spi/spi-bcm2835.c | |||
@@ -358,7 +358,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev) | |||
358 | bcm2835_wr(bs, BCM2835_SPI_CS, | 358 | bcm2835_wr(bs, BCM2835_SPI_CS, |
359 | BCM2835_SPI_CS_CLEAR_RX | BCM2835_SPI_CS_CLEAR_TX); | 359 | BCM2835_SPI_CS_CLEAR_RX | BCM2835_SPI_CS_CLEAR_TX); |
360 | 360 | ||
361 | err = spi_register_master(master); | 361 | err = devm_spi_register_master(&pdev->dev, master); |
362 | if (err) { | 362 | if (err) { |
363 | dev_err(&pdev->dev, "could not register SPI master: %d\n", err); | 363 | dev_err(&pdev->dev, "could not register SPI master: %d\n", err); |
364 | goto out_free_irq; | 364 | goto out_free_irq; |
@@ -381,14 +381,12 @@ static int bcm2835_spi_remove(struct platform_device *pdev) | |||
381 | struct bcm2835_spi *bs = spi_master_get_devdata(master); | 381 | struct bcm2835_spi *bs = spi_master_get_devdata(master); |
382 | 382 | ||
383 | free_irq(bs->irq, master); | 383 | free_irq(bs->irq, master); |
384 | spi_unregister_master(master); | ||
385 | 384 | ||
386 | /* Clear FIFOs, and disable the HW block */ | 385 | /* Clear FIFOs, and disable the HW block */ |
387 | bcm2835_wr(bs, BCM2835_SPI_CS, | 386 | bcm2835_wr(bs, BCM2835_SPI_CS, |
388 | BCM2835_SPI_CS_CLEAR_RX | BCM2835_SPI_CS_CLEAR_TX); | 387 | BCM2835_SPI_CS_CLEAR_RX | BCM2835_SPI_CS_CLEAR_TX); |
389 | 388 | ||
390 | clk_disable_unprepare(bs->clk); | 389 | clk_disable_unprepare(bs->clk); |
391 | spi_master_put(master); | ||
392 | 390 | ||
393 | return 0; | 391 | return 0; |
394 | } | 392 | } |
diff --git a/drivers/spi/spi-bcm63xx.c b/drivers/spi/spi-bcm63xx.c index 536b0e363826..80d56b214eb5 100644 --- a/drivers/spi/spi-bcm63xx.c +++ b/drivers/spi/spi-bcm63xx.c | |||
@@ -412,7 +412,7 @@ static int bcm63xx_spi_probe(struct platform_device *pdev) | |||
412 | bcm_spi_writeb(bs, SPI_INTR_CLEAR_ALL, SPI_INT_STATUS); | 412 | bcm_spi_writeb(bs, SPI_INTR_CLEAR_ALL, SPI_INT_STATUS); |
413 | 413 | ||
414 | /* register and we are done */ | 414 | /* register and we are done */ |
415 | ret = spi_register_master(master); | 415 | ret = devm_spi_register_master(dev, master); |
416 | if (ret) { | 416 | if (ret) { |
417 | dev_err(dev, "spi register failed\n"); | 417 | dev_err(dev, "spi register failed\n"); |
418 | goto out_clk_disable; | 418 | goto out_clk_disable; |
@@ -438,8 +438,6 @@ static int bcm63xx_spi_remove(struct platform_device *pdev) | |||
438 | struct spi_master *master = spi_master_get(platform_get_drvdata(pdev)); | 438 | struct spi_master *master = spi_master_get(platform_get_drvdata(pdev)); |
439 | struct bcm63xx_spi *bs = spi_master_get_devdata(master); | 439 | struct bcm63xx_spi *bs = spi_master_get_devdata(master); |
440 | 440 | ||
441 | spi_unregister_master(master); | ||
442 | |||
443 | /* reset spi block */ | 441 | /* reset spi block */ |
444 | bcm_spi_writeb(bs, 0, SPI_INT_MASK); | 442 | bcm_spi_writeb(bs, 0, SPI_INT_MASK); |
445 | 443 | ||
@@ -447,8 +445,6 @@ static int bcm63xx_spi_remove(struct platform_device *pdev) | |||
447 | clk_disable_unprepare(bs->clk); | 445 | clk_disable_unprepare(bs->clk); |
448 | clk_put(bs->clk); | 446 | clk_put(bs->clk); |
449 | 447 | ||
450 | spi_master_put(master); | ||
451 | |||
452 | return 0; | 448 | return 0; |
453 | } | 449 | } |
454 | 450 | ||
diff --git a/drivers/spi/spi-bfin-sport.c b/drivers/spi/spi-bfin-sport.c index 7b2cda0747d5..38941e5920b5 100644 --- a/drivers/spi/spi-bfin-sport.c +++ b/drivers/spi/spi-bfin-sport.c | |||
@@ -879,11 +879,10 @@ static int bfin_sport_spi_remove(struct platform_device *pdev) | |||
879 | return 0; | 879 | return 0; |
880 | } | 880 | } |
881 | 881 | ||
882 | #ifdef CONFIG_PM | 882 | #ifdef CONFIG_PM_SLEEP |
883 | static int | 883 | static int bfin_sport_spi_suspend(struct device *dev) |
884 | bfin_sport_spi_suspend(struct platform_device *pdev, pm_message_t state) | ||
885 | { | 884 | { |
886 | struct bfin_sport_spi_master_data *drv_data = platform_get_drvdata(pdev); | 885 | struct bfin_sport_spi_master_data *drv_data = dev_get_drvdata(dev); |
887 | int status; | 886 | int status; |
888 | 887 | ||
889 | status = bfin_sport_spi_stop_queue(drv_data); | 888 | status = bfin_sport_spi_stop_queue(drv_data); |
@@ -896,10 +895,9 @@ bfin_sport_spi_suspend(struct platform_device *pdev, pm_message_t state) | |||
896 | return status; | 895 | return status; |
897 | } | 896 | } |
898 | 897 | ||
899 | static int | 898 | static int bfin_sport_spi_resume(struct device *dev) |
900 | bfin_sport_spi_resume(struct platform_device *pdev) | ||
901 | { | 899 | { |
902 | struct bfin_sport_spi_master_data *drv_data = platform_get_drvdata(pdev); | 900 | struct bfin_sport_spi_master_data *drv_data = dev_get_drvdata(dev); |
903 | int status; | 901 | int status; |
904 | 902 | ||
905 | /* Enable the SPI interface */ | 903 | /* Enable the SPI interface */ |
@@ -912,19 +910,22 @@ bfin_sport_spi_resume(struct platform_device *pdev) | |||
912 | 910 | ||
913 | return status; | 911 | return status; |
914 | } | 912 | } |
913 | |||
914 | static SIMPLE_DEV_PM_OPS(bfin_sport_spi_pm_ops, bfin_sport_spi_suspend, | ||
915 | bfin_sport_spi_resume); | ||
916 | |||
917 | #define BFIN_SPORT_SPI_PM_OPS (&bfin_sport_spi_pm_ops) | ||
915 | #else | 918 | #else |
916 | # define bfin_sport_spi_suspend NULL | 919 | #define BFIN_SPORT_SPI_PM_OPS NULL |
917 | # define bfin_sport_spi_resume NULL | ||
918 | #endif | 920 | #endif |
919 | 921 | ||
920 | static struct platform_driver bfin_sport_spi_driver = { | 922 | static struct platform_driver bfin_sport_spi_driver = { |
921 | .driver = { | 923 | .driver = { |
922 | .name = DRV_NAME, | 924 | .name = DRV_NAME, |
923 | .owner = THIS_MODULE, | 925 | .owner = THIS_MODULE, |
926 | .pm = BFIN_SPORT_SPI_PM_OPS, | ||
924 | }, | 927 | }, |
925 | .probe = bfin_sport_spi_probe, | 928 | .probe = bfin_sport_spi_probe, |
926 | .remove = bfin_sport_spi_remove, | 929 | .remove = bfin_sport_spi_remove, |
927 | .suspend = bfin_sport_spi_suspend, | ||
928 | .resume = bfin_sport_spi_resume, | ||
929 | }; | 930 | }; |
930 | module_platform_driver(bfin_sport_spi_driver); | 931 | module_platform_driver(bfin_sport_spi_driver); |
diff --git a/drivers/spi/spi-bfin-v3.c b/drivers/spi/spi-bfin-v3.c index f4bf81347d68..8f8598834b30 100644 --- a/drivers/spi/spi-bfin-v3.c +++ b/drivers/spi/spi-bfin-v3.c | |||
@@ -867,7 +867,7 @@ static int bfin_spi_probe(struct platform_device *pdev) | |||
867 | tasklet_init(&drv_data->pump_transfers, | 867 | tasklet_init(&drv_data->pump_transfers, |
868 | bfin_spi_pump_transfers, (unsigned long)drv_data); | 868 | bfin_spi_pump_transfers, (unsigned long)drv_data); |
869 | /* register with the SPI framework */ | 869 | /* register with the SPI framework */ |
870 | ret = spi_register_master(master); | 870 | ret = devm_spi_register_master(dev, master); |
871 | if (ret) { | 871 | if (ret) { |
872 | dev_err(dev, "can not register spi master\n"); | 872 | dev_err(dev, "can not register spi master\n"); |
873 | goto err_free_peripheral; | 873 | goto err_free_peripheral; |
@@ -898,7 +898,6 @@ static int bfin_spi_remove(struct platform_device *pdev) | |||
898 | free_dma(drv_data->rx_dma); | 898 | free_dma(drv_data->rx_dma); |
899 | free_dma(drv_data->tx_dma); | 899 | free_dma(drv_data->tx_dma); |
900 | 900 | ||
901 | spi_unregister_master(drv_data->master); | ||
902 | return 0; | 901 | return 0; |
903 | } | 902 | } |
904 | 903 | ||
diff --git a/drivers/spi/spi-bfin5xx.c b/drivers/spi/spi-bfin5xx.c index b70a2bd9324d..f0f195af75d4 100644 --- a/drivers/spi/spi-bfin5xx.c +++ b/drivers/spi/spi-bfin5xx.c | |||
@@ -1411,10 +1411,10 @@ static int bfin_spi_remove(struct platform_device *pdev) | |||
1411 | return 0; | 1411 | return 0; |
1412 | } | 1412 | } |
1413 | 1413 | ||
1414 | #ifdef CONFIG_PM | 1414 | #ifdef CONFIG_PM_SLEEP |
1415 | static int bfin_spi_suspend(struct platform_device *pdev, pm_message_t state) | 1415 | static int bfin_spi_suspend(struct device *dev) |
1416 | { | 1416 | { |
1417 | struct bfin_spi_master_data *drv_data = platform_get_drvdata(pdev); | 1417 | struct bfin_spi_master_data *drv_data = dev_get_drvdata(dev); |
1418 | int status = 0; | 1418 | int status = 0; |
1419 | 1419 | ||
1420 | status = bfin_spi_stop_queue(drv_data); | 1420 | status = bfin_spi_stop_queue(drv_data); |
@@ -1433,9 +1433,9 @@ static int bfin_spi_suspend(struct platform_device *pdev, pm_message_t state) | |||
1433 | return 0; | 1433 | return 0; |
1434 | } | 1434 | } |
1435 | 1435 | ||
1436 | static int bfin_spi_resume(struct platform_device *pdev) | 1436 | static int bfin_spi_resume(struct device *dev) |
1437 | { | 1437 | { |
1438 | struct bfin_spi_master_data *drv_data = platform_get_drvdata(pdev); | 1438 | struct bfin_spi_master_data *drv_data = dev_get_drvdata(dev); |
1439 | int status = 0; | 1439 | int status = 0; |
1440 | 1440 | ||
1441 | bfin_write(&drv_data->regs->ctl, drv_data->ctrl_reg); | 1441 | bfin_write(&drv_data->regs->ctl, drv_data->ctrl_reg); |
@@ -1444,31 +1444,34 @@ static int bfin_spi_resume(struct platform_device *pdev) | |||
1444 | /* Start the queue running */ | 1444 | /* Start the queue running */ |
1445 | status = bfin_spi_start_queue(drv_data); | 1445 | status = bfin_spi_start_queue(drv_data); |
1446 | if (status != 0) { | 1446 | if (status != 0) { |
1447 | dev_err(&pdev->dev, "problem starting queue (%d)\n", status); | 1447 | dev_err(dev, "problem starting queue (%d)\n", status); |
1448 | return status; | 1448 | return status; |
1449 | } | 1449 | } |
1450 | 1450 | ||
1451 | return 0; | 1451 | return 0; |
1452 | } | 1452 | } |
1453 | |||
1454 | static SIMPLE_DEV_PM_OPS(bfin_spi_pm_ops, bfin_spi_suspend, bfin_spi_resume); | ||
1455 | |||
1456 | #define BFIN_SPI_PM_OPS (&bfin_spi_pm_ops) | ||
1453 | #else | 1457 | #else |
1454 | #define bfin_spi_suspend NULL | 1458 | #define BFIN_SPI_PM_OPS NULL |
1455 | #define bfin_spi_resume NULL | 1459 | #endif |
1456 | #endif /* CONFIG_PM */ | ||
1457 | 1460 | ||
1458 | MODULE_ALIAS("platform:bfin-spi"); | 1461 | MODULE_ALIAS("platform:bfin-spi"); |
1459 | static struct platform_driver bfin_spi_driver = { | 1462 | static struct platform_driver bfin_spi_driver = { |
1460 | .driver = { | 1463 | .driver = { |
1461 | .name = DRV_NAME, | 1464 | .name = DRV_NAME, |
1462 | .owner = THIS_MODULE, | 1465 | .owner = THIS_MODULE, |
1466 | .pm = BFIN_SPI_PM_OPS, | ||
1463 | }, | 1467 | }, |
1464 | .suspend = bfin_spi_suspend, | 1468 | .probe = bfin_spi_probe, |
1465 | .resume = bfin_spi_resume, | ||
1466 | .remove = bfin_spi_remove, | 1469 | .remove = bfin_spi_remove, |
1467 | }; | 1470 | }; |
1468 | 1471 | ||
1469 | static int __init bfin_spi_init(void) | 1472 | static int __init bfin_spi_init(void) |
1470 | { | 1473 | { |
1471 | return platform_driver_probe(&bfin_spi_driver, bfin_spi_probe); | 1474 | return platform_driver_register(&bfin_spi_driver); |
1472 | } | 1475 | } |
1473 | subsys_initcall(bfin_spi_init); | 1476 | subsys_initcall(bfin_spi_init); |
1474 | 1477 | ||
diff --git a/drivers/spi/spi-clps711x.c b/drivers/spi/spi-clps711x.c index 6416798828e7..7f2fd33ad4d9 100644 --- a/drivers/spi/spi-clps711x.c +++ b/drivers/spi/spi-clps711x.c | |||
@@ -229,7 +229,7 @@ static int spi_clps711x_probe(struct platform_device *pdev) | |||
229 | goto clk_out; | 229 | goto clk_out; |
230 | } | 230 | } |
231 | 231 | ||
232 | ret = spi_register_master(master); | 232 | ret = devm_spi_register_master(&pdev->dev, master); |
233 | if (!ret) { | 233 | if (!ret) { |
234 | dev_info(&pdev->dev, | 234 | dev_info(&pdev->dev, |
235 | "SPI bus driver initialized. Master clock %u Hz\n", | 235 | "SPI bus driver initialized. Master clock %u Hz\n", |
@@ -260,8 +260,6 @@ static int spi_clps711x_remove(struct platform_device *pdev) | |||
260 | if (gpio_is_valid(hw->chipselect[i])) | 260 | if (gpio_is_valid(hw->chipselect[i])) |
261 | gpio_free(hw->chipselect[i]); | 261 | gpio_free(hw->chipselect[i]); |
262 | 262 | ||
263 | spi_unregister_master(master); | ||
264 | |||
265 | return 0; | 263 | return 0; |
266 | } | 264 | } |
267 | 265 | ||
diff --git a/drivers/spi/spi-ep93xx.c b/drivers/spi/spi-ep93xx.c index b57a341d3e1c..1bfaed6e4073 100644 --- a/drivers/spi/spi-ep93xx.c +++ b/drivers/spi/spi-ep93xx.c | |||
@@ -942,7 +942,7 @@ static int ep93xx_spi_probe(struct platform_device *pdev) | |||
942 | /* make sure that the hardware is disabled */ | 942 | /* make sure that the hardware is disabled */ |
943 | ep93xx_spi_write_u8(espi, SSPCR1, 0); | 943 | ep93xx_spi_write_u8(espi, SSPCR1, 0); |
944 | 944 | ||
945 | error = spi_register_master(master); | 945 | error = devm_spi_register_master(&pdev->dev, master); |
946 | if (error) { | 946 | if (error) { |
947 | dev_err(&pdev->dev, "failed to register SPI master\n"); | 947 | dev_err(&pdev->dev, "failed to register SPI master\n"); |
948 | goto fail_free_dma; | 948 | goto fail_free_dma; |
@@ -968,7 +968,6 @@ static int ep93xx_spi_remove(struct platform_device *pdev) | |||
968 | 968 | ||
969 | ep93xx_spi_release_dma(espi); | 969 | ep93xx_spi_release_dma(espi); |
970 | 970 | ||
971 | spi_unregister_master(master); | ||
972 | return 0; | 971 | return 0; |
973 | } | 972 | } |
974 | 973 | ||
diff --git a/drivers/spi/spi-mpc512x-psc.c b/drivers/spi/spi-mpc512x-psc.c index 6adf4e35816d..ee6e61cbf7f5 100644 --- a/drivers/spi/spi-mpc512x-psc.c +++ b/drivers/spi/spi-mpc512x-psc.c | |||
@@ -536,7 +536,7 @@ static int mpc512x_psc_spi_do_probe(struct device *dev, u32 regaddr, | |||
536 | if (ret < 0) | 536 | if (ret < 0) |
537 | goto free_clock; | 537 | goto free_clock; |
538 | 538 | ||
539 | ret = spi_register_master(master); | 539 | ret = devm_spi_register_master(dev, master); |
540 | if (ret < 0) | 540 | if (ret < 0) |
541 | goto free_clock; | 541 | goto free_clock; |
542 | 542 | ||
@@ -559,12 +559,10 @@ static int mpc512x_psc_spi_do_remove(struct device *dev) | |||
559 | struct spi_master *master = spi_master_get(dev_get_drvdata(dev)); | 559 | struct spi_master *master = spi_master_get(dev_get_drvdata(dev)); |
560 | struct mpc512x_psc_spi *mps = spi_master_get_devdata(master); | 560 | struct mpc512x_psc_spi *mps = spi_master_get_devdata(master); |
561 | 561 | ||
562 | spi_unregister_master(master); | ||
563 | clk_disable_unprepare(mps->clk_mclk); | 562 | clk_disable_unprepare(mps->clk_mclk); |
564 | free_irq(mps->irq, mps); | 563 | free_irq(mps->irq, mps); |
565 | if (mps->psc) | 564 | if (mps->psc) |
566 | iounmap(mps->psc); | 565 | iounmap(mps->psc); |
567 | spi_master_put(master); | ||
568 | 566 | ||
569 | return 0; | 567 | return 0; |
570 | } | 568 | } |
diff --git a/drivers/spi/spi-mxs.c b/drivers/spi/spi-mxs.c index de7b1141b90f..312c7f99c4a7 100644 --- a/drivers/spi/spi-mxs.c +++ b/drivers/spi/spi-mxs.c | |||
@@ -571,7 +571,7 @@ static int mxs_spi_probe(struct platform_device *pdev) | |||
571 | 571 | ||
572 | platform_set_drvdata(pdev, master); | 572 | platform_set_drvdata(pdev, master); |
573 | 573 | ||
574 | ret = spi_register_master(master); | 574 | ret = devm_spi_register_master(&pdev->dev, master); |
575 | if (ret) { | 575 | if (ret) { |
576 | dev_err(&pdev->dev, "Cannot register SPI master, %d\n", ret); | 576 | dev_err(&pdev->dev, "Cannot register SPI master, %d\n", ret); |
577 | goto out_disable_clk; | 577 | goto out_disable_clk; |
@@ -598,10 +598,8 @@ static int mxs_spi_remove(struct platform_device *pdev) | |||
598 | spi = spi_master_get_devdata(master); | 598 | spi = spi_master_get_devdata(master); |
599 | ssp = &spi->ssp; | 599 | ssp = &spi->ssp; |
600 | 600 | ||
601 | spi_unregister_master(master); | ||
602 | clk_disable_unprepare(ssp->clk); | 601 | clk_disable_unprepare(ssp->clk); |
603 | dma_release_channel(ssp->dmach); | 602 | dma_release_channel(ssp->dmach); |
604 | spi_master_put(master); | ||
605 | 603 | ||
606 | return 0; | 604 | return 0; |
607 | } | 605 | } |
diff --git a/drivers/spi/spi-octeon.c b/drivers/spi/spi-octeon.c index 5f28ddbe4f7e..67249a48b391 100644 --- a/drivers/spi/spi-octeon.c +++ b/drivers/spi/spi-octeon.c | |||
@@ -272,7 +272,7 @@ static int octeon_spi_probe(struct platform_device *pdev) | |||
272 | master->bits_per_word_mask = SPI_BPW_MASK(8); | 272 | master->bits_per_word_mask = SPI_BPW_MASK(8); |
273 | 273 | ||
274 | master->dev.of_node = pdev->dev.of_node; | 274 | master->dev.of_node = pdev->dev.of_node; |
275 | err = spi_register_master(master); | 275 | err = devm_spi_register_master(&pdev->dev, master); |
276 | if (err) { | 276 | if (err) { |
277 | dev_err(&pdev->dev, "register master failed: %d\n", err); | 277 | dev_err(&pdev->dev, "register master failed: %d\n", err); |
278 | goto fail; | 278 | goto fail; |
@@ -292,8 +292,6 @@ static int octeon_spi_remove(struct platform_device *pdev) | |||
292 | struct octeon_spi *p = spi_master_get_devdata(master); | 292 | struct octeon_spi *p = spi_master_get_devdata(master); |
293 | u64 register_base = p->register_base; | 293 | u64 register_base = p->register_base; |
294 | 294 | ||
295 | spi_unregister_master(master); | ||
296 | |||
297 | /* Clear the CSENA* and put everything in a known state. */ | 295 | /* Clear the CSENA* and put everything in a known state. */ |
298 | cvmx_write_csr(register_base + OCTEON_SPI_CFG, 0); | 296 | cvmx_write_csr(register_base + OCTEON_SPI_CFG, 0); |
299 | 297 | ||
diff --git a/drivers/spi/spi-omap-100k.c b/drivers/spi/spi-omap-100k.c index 69ecf05757dd..b6ed82beb01d 100644 --- a/drivers/spi/spi-omap-100k.c +++ b/drivers/spi/spi-omap-100k.c | |||
@@ -457,7 +457,7 @@ static int omap1_spi100k_probe(struct platform_device *pdev) | |||
457 | goto err; | 457 | goto err; |
458 | } | 458 | } |
459 | 459 | ||
460 | status = spi_register_master(master); | 460 | status = devm_spi_register_master(&pdev->dev, master); |
461 | if (status < 0) | 461 | if (status < 0) |
462 | goto err; | 462 | goto err; |
463 | 463 | ||
@@ -485,8 +485,6 @@ static int omap1_spi100k_remove(struct platform_device *pdev) | |||
485 | 485 | ||
486 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 486 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
487 | 487 | ||
488 | spi_unregister_master(master); | ||
489 | |||
490 | return 0; | 488 | return 0; |
491 | } | 489 | } |
492 | 490 | ||
diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c index c4e4868913c7..443df39840bc 100644 --- a/drivers/spi/spi-omap2-mcspi.c +++ b/drivers/spi/spi-omap2-mcspi.c | |||
@@ -1413,7 +1413,7 @@ static int omap2_mcspi_probe(struct platform_device *pdev) | |||
1413 | if (status < 0) | 1413 | if (status < 0) |
1414 | goto disable_pm; | 1414 | goto disable_pm; |
1415 | 1415 | ||
1416 | status = spi_register_master(master); | 1416 | status = devm_spi_register_master(&pdev->dev, master); |
1417 | if (status < 0) | 1417 | if (status < 0) |
1418 | goto disable_pm; | 1418 | goto disable_pm; |
1419 | 1419 | ||
@@ -1441,7 +1441,6 @@ static int omap2_mcspi_remove(struct platform_device *pdev) | |||
1441 | pm_runtime_put_sync(mcspi->dev); | 1441 | pm_runtime_put_sync(mcspi->dev); |
1442 | pm_runtime_disable(&pdev->dev); | 1442 | pm_runtime_disable(&pdev->dev); |
1443 | 1443 | ||
1444 | spi_unregister_master(master); | ||
1445 | kfree(dma_channels); | 1444 | kfree(dma_channels); |
1446 | 1445 | ||
1447 | return 0; | 1446 | return 0; |
diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c index 1d1d321d90c4..d96d67869d7b 100644 --- a/drivers/spi/spi-orion.c +++ b/drivers/spi/spi-orion.c | |||
@@ -457,7 +457,7 @@ static int orion_spi_probe(struct platform_device *pdev) | |||
457 | goto out_rel_clk; | 457 | goto out_rel_clk; |
458 | 458 | ||
459 | master->dev.of_node = pdev->dev.of_node; | 459 | master->dev.of_node = pdev->dev.of_node; |
460 | status = spi_register_master(master); | 460 | status = devm_spi_register_master(&pdev->dev, master); |
461 | if (status < 0) | 461 | if (status < 0) |
462 | goto out_rel_clk; | 462 | goto out_rel_clk; |
463 | 463 | ||
@@ -483,8 +483,6 @@ static int orion_spi_remove(struct platform_device *pdev) | |||
483 | clk_disable_unprepare(spi->clk); | 483 | clk_disable_unprepare(spi->clk); |
484 | clk_put(spi->clk); | 484 | clk_put(spi->clk); |
485 | 485 | ||
486 | spi_unregister_master(master); | ||
487 | |||
488 | return 0; | 486 | return 0; |
489 | } | 487 | } |
490 | 488 | ||
diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c index 9c511a954d21..5e3011094eb6 100644 --- a/drivers/spi/spi-pl022.c +++ b/drivers/spi/spi-pl022.c | |||
@@ -1619,7 +1619,6 @@ static int verify_controller_parameters(struct pl022 *pl022, | |||
1619 | dev_err(&pl022->adev->dev, | 1619 | dev_err(&pl022->adev->dev, |
1620 | "RX FIFO Trigger Level is configured incorrectly\n"); | 1620 | "RX FIFO Trigger Level is configured incorrectly\n"); |
1621 | return -EINVAL; | 1621 | return -EINVAL; |
1622 | break; | ||
1623 | } | 1622 | } |
1624 | switch (chip_info->tx_lev_trig) { | 1623 | switch (chip_info->tx_lev_trig) { |
1625 | case SSP_TX_1_OR_MORE_EMPTY_LOC: | 1624 | case SSP_TX_1_OR_MORE_EMPTY_LOC: |
@@ -1645,7 +1644,6 @@ static int verify_controller_parameters(struct pl022 *pl022, | |||
1645 | dev_err(&pl022->adev->dev, | 1644 | dev_err(&pl022->adev->dev, |
1646 | "TX FIFO Trigger Level is configured incorrectly\n"); | 1645 | "TX FIFO Trigger Level is configured incorrectly\n"); |
1647 | return -EINVAL; | 1646 | return -EINVAL; |
1648 | break; | ||
1649 | } | 1647 | } |
1650 | if (chip_info->iface == SSP_INTERFACE_NATIONAL_MICROWIRE) { | 1648 | if (chip_info->iface == SSP_INTERFACE_NATIONAL_MICROWIRE) { |
1651 | if ((chip_info->ctrl_len < SSP_BITS_4) | 1649 | if ((chip_info->ctrl_len < SSP_BITS_4) |
@@ -2227,7 +2225,7 @@ static int pl022_probe(struct amba_device *adev, const struct amba_id *id) | |||
2227 | 2225 | ||
2228 | /* Register with the SPI framework */ | 2226 | /* Register with the SPI framework */ |
2229 | amba_set_drvdata(adev, pl022); | 2227 | amba_set_drvdata(adev, pl022); |
2230 | status = spi_register_master(master); | 2228 | status = devm_spi_register_master(&adev->dev, master); |
2231 | if (status != 0) { | 2229 | if (status != 0) { |
2232 | dev_err(&adev->dev, | 2230 | dev_err(&adev->dev, |
2233 | "probe - problem registering spi master\n"); | 2231 | "probe - problem registering spi master\n"); |
@@ -2287,8 +2285,6 @@ pl022_remove(struct amba_device *adev) | |||
2287 | clk_unprepare(pl022->clk); | 2285 | clk_unprepare(pl022->clk); |
2288 | amba_release_regions(adev); | 2286 | amba_release_regions(adev); |
2289 | tasklet_disable(&pl022->pump_transfers); | 2287 | tasklet_disable(&pl022->pump_transfers); |
2290 | spi_unregister_master(pl022->master); | ||
2291 | amba_set_drvdata(adev, NULL); | ||
2292 | return 0; | 2288 | return 0; |
2293 | } | 2289 | } |
2294 | 2290 | ||
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index 64e1682c39b1..cb0e1f1137ad 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c | |||
@@ -1201,7 +1201,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev) | |||
1201 | 1201 | ||
1202 | /* Register with the SPI framework */ | 1202 | /* Register with the SPI framework */ |
1203 | platform_set_drvdata(pdev, drv_data); | 1203 | platform_set_drvdata(pdev, drv_data); |
1204 | status = spi_register_master(master); | 1204 | status = devm_spi_register_master(&pdev->dev, master); |
1205 | if (status != 0) { | 1205 | if (status != 0) { |
1206 | dev_err(&pdev->dev, "problem registering spi master\n"); | 1206 | dev_err(&pdev->dev, "problem registering spi master\n"); |
1207 | goto out_error_clock_enabled; | 1207 | goto out_error_clock_enabled; |
@@ -1253,9 +1253,6 @@ static int pxa2xx_spi_remove(struct platform_device *pdev) | |||
1253 | /* Release SSP */ | 1253 | /* Release SSP */ |
1254 | pxa_ssp_free(ssp); | 1254 | pxa_ssp_free(ssp); |
1255 | 1255 | ||
1256 | /* Disconnect from the SPI framework */ | ||
1257 | spi_unregister_master(drv_data->master); | ||
1258 | |||
1259 | return 0; | 1256 | return 0; |
1260 | } | 1257 | } |
1261 | 1258 | ||
diff --git a/drivers/spi/spi-sh-hspi.c b/drivers/spi/spi-sh-hspi.c index e488a90a98b8..7e749a22f51e 100644 --- a/drivers/spi/spi-sh-hspi.c +++ b/drivers/spi/spi-sh-hspi.c | |||
@@ -305,7 +305,7 @@ static int hspi_probe(struct platform_device *pdev) | |||
305 | master->mode_bits = SPI_CPOL | SPI_CPHA; | 305 | master->mode_bits = SPI_CPOL | SPI_CPHA; |
306 | master->auto_runtime_pm = true; | 306 | master->auto_runtime_pm = true; |
307 | master->transfer_one_message = hspi_transfer_one_message; | 307 | master->transfer_one_message = hspi_transfer_one_message; |
308 | ret = spi_register_master(master); | 308 | ret = devm_spi_register_master(&pdev->dev, master); |
309 | if (ret < 0) { | 309 | if (ret < 0) { |
310 | dev_err(&pdev->dev, "spi_register_master error.\n"); | 310 | dev_err(&pdev->dev, "spi_register_master error.\n"); |
311 | goto error1; | 311 | goto error1; |
@@ -328,7 +328,6 @@ static int hspi_remove(struct platform_device *pdev) | |||
328 | pm_runtime_disable(&pdev->dev); | 328 | pm_runtime_disable(&pdev->dev); |
329 | 329 | ||
330 | clk_put(hspi->clk); | 330 | clk_put(hspi->clk); |
331 | spi_unregister_master(hspi->master); | ||
332 | 331 | ||
333 | return 0; | 332 | return 0; |
334 | } | 333 | } |
diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c index 145dd435483b..bb3a19f2ed39 100644 --- a/drivers/spi/spi-tegra114.c +++ b/drivers/spi/spi-tegra114.c | |||
@@ -1115,7 +1115,7 @@ static int tegra_spi_probe(struct platform_device *pdev) | |||
1115 | pm_runtime_put(&pdev->dev); | 1115 | pm_runtime_put(&pdev->dev); |
1116 | 1116 | ||
1117 | master->dev.of_node = pdev->dev.of_node; | 1117 | master->dev.of_node = pdev->dev.of_node; |
1118 | ret = spi_register_master(master); | 1118 | ret = devm_spi_register_master(&pdev->dev, master); |
1119 | if (ret < 0) { | 1119 | if (ret < 0) { |
1120 | dev_err(&pdev->dev, "can not register to master err %d\n", ret); | 1120 | dev_err(&pdev->dev, "can not register to master err %d\n", ret); |
1121 | goto exit_pm_disable; | 1121 | goto exit_pm_disable; |
@@ -1142,7 +1142,6 @@ static int tegra_spi_remove(struct platform_device *pdev) | |||
1142 | struct tegra_spi_data *tspi = spi_master_get_devdata(master); | 1142 | struct tegra_spi_data *tspi = spi_master_get_devdata(master); |
1143 | 1143 | ||
1144 | free_irq(tspi->irq, tspi); | 1144 | free_irq(tspi->irq, tspi); |
1145 | spi_unregister_master(master); | ||
1146 | 1145 | ||
1147 | if (tspi->tx_dma_chan) | 1146 | if (tspi->tx_dma_chan) |
1148 | tegra_spi_deinit_dma_param(tspi, false); | 1147 | tegra_spi_deinit_dma_param(tspi, false); |
diff --git a/drivers/spi/spi-tegra20-sflash.c b/drivers/spi/spi-tegra20-sflash.c index 1d814dc6e000..a68d7797a8ec 100644 --- a/drivers/spi/spi-tegra20-sflash.c +++ b/drivers/spi/spi-tegra20-sflash.c | |||
@@ -529,7 +529,7 @@ static int tegra_sflash_probe(struct platform_device *pdev) | |||
529 | pm_runtime_put(&pdev->dev); | 529 | pm_runtime_put(&pdev->dev); |
530 | 530 | ||
531 | master->dev.of_node = pdev->dev.of_node; | 531 | master->dev.of_node = pdev->dev.of_node; |
532 | ret = spi_register_master(master); | 532 | ret = devm_spi_register_master(&pdev->dev, master); |
533 | if (ret < 0) { | 533 | if (ret < 0) { |
534 | dev_err(&pdev->dev, "can not register to master err %d\n", ret); | 534 | dev_err(&pdev->dev, "can not register to master err %d\n", ret); |
535 | goto exit_pm_disable; | 535 | goto exit_pm_disable; |
@@ -553,7 +553,6 @@ static int tegra_sflash_remove(struct platform_device *pdev) | |||
553 | struct tegra_sflash_data *tsd = spi_master_get_devdata(master); | 553 | struct tegra_sflash_data *tsd = spi_master_get_devdata(master); |
554 | 554 | ||
555 | free_irq(tsd->irq, tsd); | 555 | free_irq(tsd->irq, tsd); |
556 | spi_unregister_master(master); | ||
557 | 556 | ||
558 | pm_runtime_disable(&pdev->dev); | 557 | pm_runtime_disable(&pdev->dev); |
559 | if (!pm_runtime_status_suspended(&pdev->dev)) | 558 | if (!pm_runtime_status_suspended(&pdev->dev)) |
diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c index c70353672a23..829283e785d9 100644 --- a/drivers/spi/spi-tegra20-slink.c +++ b/drivers/spi/spi-tegra20-slink.c | |||
@@ -1164,7 +1164,7 @@ static int tegra_slink_probe(struct platform_device *pdev) | |||
1164 | pm_runtime_put(&pdev->dev); | 1164 | pm_runtime_put(&pdev->dev); |
1165 | 1165 | ||
1166 | master->dev.of_node = pdev->dev.of_node; | 1166 | master->dev.of_node = pdev->dev.of_node; |
1167 | ret = spi_register_master(master); | 1167 | ret = devm_spi_register_master(&pdev->dev, master); |
1168 | if (ret < 0) { | 1168 | if (ret < 0) { |
1169 | dev_err(&pdev->dev, "can not register to master err %d\n", ret); | 1169 | dev_err(&pdev->dev, "can not register to master err %d\n", ret); |
1170 | goto exit_pm_disable; | 1170 | goto exit_pm_disable; |
@@ -1191,7 +1191,6 @@ static int tegra_slink_remove(struct platform_device *pdev) | |||
1191 | struct tegra_slink_data *tspi = spi_master_get_devdata(master); | 1191 | struct tegra_slink_data *tspi = spi_master_get_devdata(master); |
1192 | 1192 | ||
1193 | free_irq(tspi->irq, tspi); | 1193 | free_irq(tspi->irq, tspi); |
1194 | spi_unregister_master(master); | ||
1195 | 1194 | ||
1196 | if (tspi->tx_dma_chan) | 1195 | if (tspi->tx_dma_chan) |
1197 | tegra_slink_deinit_dma_param(tspi, false); | 1196 | tegra_slink_deinit_dma_param(tspi, false); |
diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c index e12d962a289f..4e2109d9853d 100644 --- a/drivers/spi/spi-ti-qspi.c +++ b/drivers/spi/spi-ti-qspi.c | |||
@@ -532,7 +532,7 @@ static int ti_qspi_probe(struct platform_device *pdev) | |||
532 | if (!of_property_read_u32(np, "spi-max-frequency", &max_freq)) | 532 | if (!of_property_read_u32(np, "spi-max-frequency", &max_freq)) |
533 | qspi->spi_max_frequency = max_freq; | 533 | qspi->spi_max_frequency = max_freq; |
534 | 534 | ||
535 | ret = spi_register_master(master); | 535 | ret = devm_spi_register_master(&pdev->dev, master); |
536 | if (ret) | 536 | if (ret) |
537 | goto free_master; | 537 | goto free_master; |
538 | 538 | ||
@@ -543,22 +543,12 @@ free_master: | |||
543 | return ret; | 543 | return ret; |
544 | } | 544 | } |
545 | 545 | ||
546 | static int ti_qspi_remove(struct platform_device *pdev) | ||
547 | { | ||
548 | struct ti_qspi *qspi = platform_get_drvdata(pdev); | ||
549 | |||
550 | spi_unregister_master(qspi->master); | ||
551 | |||
552 | return 0; | ||
553 | } | ||
554 | |||
555 | static const struct dev_pm_ops ti_qspi_pm_ops = { | 546 | static const struct dev_pm_ops ti_qspi_pm_ops = { |
556 | .runtime_resume = ti_qspi_runtime_resume, | 547 | .runtime_resume = ti_qspi_runtime_resume, |
557 | }; | 548 | }; |
558 | 549 | ||
559 | static struct platform_driver ti_qspi_driver = { | 550 | static struct platform_driver ti_qspi_driver = { |
560 | .probe = ti_qspi_probe, | 551 | .probe = ti_qspi_probe, |
561 | .remove = ti_qspi_remove, | ||
562 | .driver = { | 552 | .driver = { |
563 | .name = "ti,dra7xxx-qspi", | 553 | .name = "ti,dra7xxx-qspi", |
564 | .owner = THIS_MODULE, | 554 | .owner = THIS_MODULE, |
diff --git a/drivers/spi/spi-txx9.c b/drivers/spi/spi-txx9.c index 7c6d15766c72..69eb88627d40 100644 --- a/drivers/spi/spi-txx9.c +++ b/drivers/spi/spi-txx9.c | |||
@@ -406,7 +406,7 @@ static int txx9spi_probe(struct platform_device *dev) | |||
406 | master->num_chipselect = (u16)UINT_MAX; /* any GPIO numbers */ | 406 | master->num_chipselect = (u16)UINT_MAX; /* any GPIO numbers */ |
407 | master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16); | 407 | master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16); |
408 | 408 | ||
409 | ret = spi_register_master(master); | 409 | ret = devm_spi_register_master(&dev->dev, master); |
410 | if (ret) | 410 | if (ret) |
411 | goto exit; | 411 | goto exit; |
412 | return 0; | 412 | return 0; |
@@ -428,11 +428,9 @@ static int txx9spi_remove(struct platform_device *dev) | |||
428 | struct spi_master *master = spi_master_get(platform_get_drvdata(dev)); | 428 | struct spi_master *master = spi_master_get(platform_get_drvdata(dev)); |
429 | struct txx9spi *c = spi_master_get_devdata(master); | 429 | struct txx9spi *c = spi_master_get_devdata(master); |
430 | 430 | ||
431 | spi_unregister_master(master); | ||
432 | destroy_workqueue(c->workqueue); | 431 | destroy_workqueue(c->workqueue); |
433 | clk_disable(c->clk); | 432 | clk_disable(c->clk); |
434 | clk_put(c->clk); | 433 | clk_put(c->clk); |
435 | spi_master_put(master); | ||
436 | return 0; | 434 | return 0; |
437 | } | 435 | } |
438 | 436 | ||
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index e57e9acd75cb..f7d792366b6a 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -1245,6 +1245,41 @@ done: | |||
1245 | } | 1245 | } |
1246 | EXPORT_SYMBOL_GPL(spi_register_master); | 1246 | EXPORT_SYMBOL_GPL(spi_register_master); |
1247 | 1247 | ||
1248 | static void devm_spi_unregister(struct device *dev, void *res) | ||
1249 | { | ||
1250 | spi_unregister_master(*(struct spi_master **)res); | ||
1251 | } | ||
1252 | |||
1253 | /** | ||
1254 | * dev_spi_register_master - register managed SPI master controller | ||
1255 | * @dev: device managing SPI master | ||
1256 | * @master: initialized master, originally from spi_alloc_master() | ||
1257 | * Context: can sleep | ||
1258 | * | ||
1259 | * Register a SPI device as with spi_register_master() which will | ||
1260 | * automatically be unregister | ||
1261 | */ | ||
1262 | int devm_spi_register_master(struct device *dev, struct spi_master *master) | ||
1263 | { | ||
1264 | struct spi_master **ptr; | ||
1265 | int ret; | ||
1266 | |||
1267 | ptr = devres_alloc(devm_spi_unregister, sizeof(*ptr), GFP_KERNEL); | ||
1268 | if (!ptr) | ||
1269 | return -ENOMEM; | ||
1270 | |||
1271 | ret = spi_register_master(master); | ||
1272 | if (ret != 0) { | ||
1273 | *ptr = master; | ||
1274 | devres_add(dev, ptr); | ||
1275 | } else { | ||
1276 | devres_free(ptr); | ||
1277 | } | ||
1278 | |||
1279 | return ret; | ||
1280 | } | ||
1281 | EXPORT_SYMBOL_GPL(devm_spi_register_master); | ||
1282 | |||
1248 | static int __unregister(struct device *dev, void *null) | 1283 | static int __unregister(struct device *dev, void *null) |
1249 | { | 1284 | { |
1250 | spi_unregister_device(to_spi_device(dev)); | 1285 | spi_unregister_device(to_spi_device(dev)); |
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 887116dbce2c..4d634d66ba0b 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
@@ -434,6 +434,8 @@ extern struct spi_master * | |||
434 | spi_alloc_master(struct device *host, unsigned size); | 434 | spi_alloc_master(struct device *host, unsigned size); |
435 | 435 | ||
436 | extern int spi_register_master(struct spi_master *master); | 436 | extern int spi_register_master(struct spi_master *master); |
437 | extern int devm_spi_register_master(struct device *dev, | ||
438 | struct spi_master *master); | ||
437 | extern void spi_unregister_master(struct spi_master *master); | 439 | extern void spi_unregister_master(struct spi_master *master); |
438 | 440 | ||
439 | extern struct spi_master *spi_busnum_to_master(u16 busnum); | 441 | extern struct spi_master *spi_busnum_to_master(u16 busnum); |