aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQipan Li <Qipan.Li@csr.com>2015-05-03 06:30:12 -0400
committerMark Brown <broonie@kernel.org>2015-05-06 14:47:49 -0400
commit96bf40194fdda941ce579be199a9427feee5dffa (patch)
treedb594c20026ab3daa3cd61829f5dd768894d9bb2
parentf08654a2b582b4e48e8a4a3d2c5c98832adc4387 (diff)
spi: sirf: request and free cs gpio in setup and cleanup callbacks
move spi controller's gpio request work out from probe() to spi device register stage, so after spi device register spi controller can deactive device's gpio chipselect. old code can't do it because gpio request has not be done until device register is finised in spi_bitbang_start. and add cleanup function to free CS gpio. Signed-off-by: Qipan Li <Qipan.Li@csr.com> Signed-off-by: Barry Song <Baohua.Song@csr.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--drivers/spi/spi-sirf.c55
1 files changed, 37 insertions, 18 deletions
diff --git a/drivers/spi/spi-sirf.c b/drivers/spi/spi-sirf.c
index a50ee9b644ae..a69ccb75f7d7 100644
--- a/drivers/spi/spi-sirf.c
+++ b/drivers/spi/spi-sirf.c
@@ -631,14 +631,47 @@ spi_sirfsoc_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
631static int spi_sirfsoc_setup(struct spi_device *spi) 631static int spi_sirfsoc_setup(struct spi_device *spi)
632{ 632{
633 struct sirfsoc_spi *sspi; 633 struct sirfsoc_spi *sspi;
634 int ret = 0;
634 635
635 sspi = spi_master_get_devdata(spi->master); 636 sspi = spi_master_get_devdata(spi->master);
636 637
637 if (spi->cs_gpio == -ENOENT) 638 if (spi->cs_gpio == -ENOENT)
638 sspi->hw_cs = true; 639 sspi->hw_cs = true;
639 else 640 else {
640 sspi->hw_cs = false; 641 sspi->hw_cs = false;
641 return spi_sirfsoc_setup_transfer(spi, NULL); 642 if (!spi_get_ctldata(spi)) {
643 void *cs = kmalloc(sizeof(int), GFP_KERNEL);
644 if (!cs) {
645 ret = -ENOMEM;
646 goto exit;
647 }
648 ret = gpio_is_valid(spi->cs_gpio);
649 if (!ret) {
650 dev_err(&spi->dev, "no valid gpio\n");
651 ret = -ENOENT;
652 goto exit;
653 }
654 ret = gpio_request(spi->cs_gpio, DRIVER_NAME);
655 if (ret) {
656 dev_err(&spi->dev, "failed to request gpio\n");
657 goto exit;
658 }
659 spi_set_ctldata(spi, cs);
660 }
661 }
662 writel(readl(sspi->base + SIRFSOC_SPI_CTRL) | SIRFSOC_SPI_CS_IO_MODE,
663 sspi->base + SIRFSOC_SPI_CTRL);
664 spi_sirfsoc_chipselect(spi, BITBANG_CS_INACTIVE);
665exit:
666 return ret;
667}
668
669static void spi_sirfsoc_cleanup(struct spi_device *spi)
670{
671 if (spi_get_ctldata(spi)) {
672 gpio_free(spi->cs_gpio);
673 kfree(spi_get_ctldata(spi));
674 }
642} 675}
643 676
644static int spi_sirfsoc_probe(struct platform_device *pdev) 677static int spi_sirfsoc_probe(struct platform_device *pdev)
@@ -647,7 +680,7 @@ static int spi_sirfsoc_probe(struct platform_device *pdev)
647 struct spi_master *master; 680 struct spi_master *master;
648 struct resource *mem_res; 681 struct resource *mem_res;
649 int irq; 682 int irq;
650 int i, ret; 683 int ret;
651 684
652 ret = device_reset(&pdev->dev); 685 ret = device_reset(&pdev->dev);
653 if (ret) { 686 if (ret) {
@@ -685,6 +718,7 @@ static int spi_sirfsoc_probe(struct platform_device *pdev)
685 sspi->bitbang.setup_transfer = spi_sirfsoc_setup_transfer; 718 sspi->bitbang.setup_transfer = spi_sirfsoc_setup_transfer;
686 sspi->bitbang.txrx_bufs = spi_sirfsoc_transfer; 719 sspi->bitbang.txrx_bufs = spi_sirfsoc_transfer;
687 sspi->bitbang.master->setup = spi_sirfsoc_setup; 720 sspi->bitbang.master->setup = spi_sirfsoc_setup;
721 sspi->bitbang.master->cleanup = spi_sirfsoc_cleanup;
688 master->bus_num = pdev->id; 722 master->bus_num = pdev->id;
689 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST | SPI_CS_HIGH; 723 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST | SPI_CS_HIGH;
690 master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(12) | 724 master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(12) |
@@ -733,21 +767,6 @@ static int spi_sirfsoc_probe(struct platform_device *pdev)
733 ret = spi_bitbang_start(&sspi->bitbang); 767 ret = spi_bitbang_start(&sspi->bitbang);
734 if (ret) 768 if (ret)
735 goto free_dummypage; 769 goto free_dummypage;
736 for (i = 0; master->cs_gpios && i < master->num_chipselect; i++) {
737 if (master->cs_gpios[i] == -ENOENT)
738 continue;
739 if (!gpio_is_valid(master->cs_gpios[i])) {
740 dev_err(&pdev->dev, "no valid gpio\n");
741 ret = -EINVAL;
742 goto free_dummypage;
743 }
744 ret = devm_gpio_request(&pdev->dev,
745 master->cs_gpios[i], DRIVER_NAME);
746 if (ret) {
747 dev_err(&pdev->dev, "failed to request gpio\n");
748 goto free_dummypage;
749 }
750 }
751 dev_info(&pdev->dev, "registerred, bus number = %d\n", master->bus_num); 770 dev_info(&pdev->dev, "registerred, bus number = %d\n", master->bus_num);
752 771
753 return 0; 772 return 0;