diff options
-rw-r--r-- | drivers/spi/spi-dw-mmio.c | 74 | ||||
-rw-r--r-- | drivers/spi/spi-dw-pci.c | 40 | ||||
-rw-r--r-- | drivers/spi/spi-dw.c | 26 | ||||
-rw-r--r-- | drivers/spi/spi-dw.h | 5 |
4 files changed, 42 insertions, 103 deletions
diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c index 168c620947f4..9af56cdf1540 100644 --- a/drivers/spi/spi-dw-mmio.c +++ b/drivers/spi/spi-dw-mmio.c | |||
@@ -30,14 +30,13 @@ static int dw_spi_mmio_probe(struct platform_device *pdev) | |||
30 | { | 30 | { |
31 | struct dw_spi_mmio *dwsmmio; | 31 | struct dw_spi_mmio *dwsmmio; |
32 | struct dw_spi *dws; | 32 | struct dw_spi *dws; |
33 | struct resource *mem, *ioarea; | 33 | struct resource *mem; |
34 | int ret; | 34 | int ret; |
35 | 35 | ||
36 | dwsmmio = kzalloc(sizeof(struct dw_spi_mmio), GFP_KERNEL); | 36 | dwsmmio = devm_kzalloc(&pdev->dev, sizeof(struct dw_spi_mmio), |
37 | if (!dwsmmio) { | 37 | GFP_KERNEL); |
38 | ret = -ENOMEM; | 38 | if (!dwsmmio) |
39 | goto err_end; | 39 | return -ENOMEM; |
40 | } | ||
41 | 40 | ||
42 | dws = &dwsmmio->dws; | 41 | dws = &dwsmmio->dws; |
43 | 42 | ||
@@ -45,80 +44,51 @@ static int dw_spi_mmio_probe(struct platform_device *pdev) | |||
45 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 44 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
46 | if (!mem) { | 45 | if (!mem) { |
47 | dev_err(&pdev->dev, "no mem resource?\n"); | 46 | dev_err(&pdev->dev, "no mem resource?\n"); |
48 | ret = -EINVAL; | 47 | return -EINVAL; |
49 | goto err_kfree; | ||
50 | } | 48 | } |
51 | 49 | ||
52 | ioarea = request_mem_region(mem->start, resource_size(mem), | 50 | dws->regs = devm_ioremap_resource(&pdev->dev, mem); |
53 | pdev->name); | 51 | if (IS_ERR(dws->regs)) { |
54 | if (!ioarea) { | 52 | dev_err(&pdev->dev, "SPI region map failed\n"); |
55 | dev_err(&pdev->dev, "SPI region already claimed\n"); | 53 | return PTR_ERR(dws->regs); |
56 | ret = -EBUSY; | ||
57 | goto err_kfree; | ||
58 | } | ||
59 | |||
60 | dws->regs = ioremap_nocache(mem->start, resource_size(mem)); | ||
61 | if (!dws->regs) { | ||
62 | dev_err(&pdev->dev, "SPI region already mapped\n"); | ||
63 | ret = -ENOMEM; | ||
64 | goto err_release_reg; | ||
65 | } | 54 | } |
66 | 55 | ||
67 | dws->irq = platform_get_irq(pdev, 0); | 56 | dws->irq = platform_get_irq(pdev, 0); |
68 | if (dws->irq < 0) { | 57 | if (dws->irq < 0) { |
69 | dev_err(&pdev->dev, "no irq resource?\n"); | 58 | dev_err(&pdev->dev, "no irq resource?\n"); |
70 | ret = dws->irq; /* -ENXIO */ | 59 | return dws->irq; /* -ENXIO */ |
71 | goto err_unmap; | ||
72 | } | 60 | } |
73 | 61 | ||
74 | dwsmmio->clk = clk_get(&pdev->dev, NULL); | 62 | dwsmmio->clk = devm_clk_get(&pdev->dev, NULL); |
75 | if (IS_ERR(dwsmmio->clk)) { | 63 | if (IS_ERR(dwsmmio->clk)) |
76 | ret = PTR_ERR(dwsmmio->clk); | 64 | return PTR_ERR(dwsmmio->clk); |
77 | goto err_unmap; | 65 | ret = clk_prepare_enable(dwsmmio->clk); |
78 | } | 66 | if (ret) |
79 | clk_enable(dwsmmio->clk); | 67 | return ret; |
80 | 68 | ||
81 | dws->parent_dev = &pdev->dev; | ||
82 | dws->bus_num = 0; | 69 | dws->bus_num = 0; |
83 | dws->num_cs = 4; | 70 | dws->num_cs = 4; |
84 | dws->max_freq = clk_get_rate(dwsmmio->clk); | 71 | dws->max_freq = clk_get_rate(dwsmmio->clk); |
85 | 72 | ||
86 | ret = dw_spi_add_host(dws); | 73 | ret = dw_spi_add_host(&pdev->dev, dws); |
87 | if (ret) | 74 | if (ret) |
88 | goto err_clk; | 75 | goto out; |
89 | 76 | ||
90 | platform_set_drvdata(pdev, dwsmmio); | 77 | platform_set_drvdata(pdev, dwsmmio); |
91 | return 0; | 78 | return 0; |
92 | 79 | ||
93 | err_clk: | 80 | out: |
94 | clk_disable(dwsmmio->clk); | 81 | clk_disable_unprepare(dwsmmio->clk); |
95 | clk_put(dwsmmio->clk); | ||
96 | dwsmmio->clk = NULL; | ||
97 | err_unmap: | ||
98 | iounmap(dws->regs); | ||
99 | err_release_reg: | ||
100 | release_mem_region(mem->start, resource_size(mem)); | ||
101 | err_kfree: | ||
102 | kfree(dwsmmio); | ||
103 | err_end: | ||
104 | return ret; | 82 | return ret; |
105 | } | 83 | } |
106 | 84 | ||
107 | static int dw_spi_mmio_remove(struct platform_device *pdev) | 85 | static int dw_spi_mmio_remove(struct platform_device *pdev) |
108 | { | 86 | { |
109 | struct dw_spi_mmio *dwsmmio = platform_get_drvdata(pdev); | 87 | struct dw_spi_mmio *dwsmmio = platform_get_drvdata(pdev); |
110 | struct resource *mem; | ||
111 | |||
112 | clk_disable(dwsmmio->clk); | ||
113 | clk_put(dwsmmio->clk); | ||
114 | dwsmmio->clk = NULL; | ||
115 | 88 | ||
89 | clk_disable_unprepare(dwsmmio->clk); | ||
116 | dw_spi_remove_host(&dwsmmio->dws); | 90 | dw_spi_remove_host(&dwsmmio->dws); |
117 | iounmap(dwsmmio->dws.regs); | ||
118 | kfree(dwsmmio); | ||
119 | 91 | ||
120 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
121 | release_mem_region(mem->start, resource_size(mem)); | ||
122 | return 0; | 92 | return 0; |
123 | } | 93 | } |
124 | 94 | ||
diff --git a/drivers/spi/spi-dw-pci.c b/drivers/spi/spi-dw-pci.c index 66fa9955ea14..760dc0017a33 100644 --- a/drivers/spi/spi-dw-pci.c +++ b/drivers/spi/spi-dw-pci.c | |||
@@ -43,35 +43,24 @@ static int spi_pci_probe(struct pci_dev *pdev, | |||
43 | dev_info(&pdev->dev, "found PCI SPI controller(ID: %04x:%04x)\n", | 43 | dev_info(&pdev->dev, "found PCI SPI controller(ID: %04x:%04x)\n", |
44 | pdev->vendor, pdev->device); | 44 | pdev->vendor, pdev->device); |
45 | 45 | ||
46 | ret = pci_enable_device(pdev); | 46 | ret = pcim_enable_device(pdev); |
47 | if (ret) | 47 | if (ret) |
48 | return ret; | 48 | return ret; |
49 | 49 | ||
50 | dwpci = kzalloc(sizeof(struct dw_spi_pci), GFP_KERNEL); | 50 | dwpci = devm_kzalloc(&pdev-dev, sizeof(struct dw_spi_pci), GFP_KERNEL); |
51 | if (!dwpci) { | 51 | if (!dwpci) |
52 | ret = -ENOMEM; | 52 | return -ENOMEM; |
53 | goto err_disable; | ||
54 | } | ||
55 | 53 | ||
56 | dwpci->pdev = pdev; | 54 | dwpci->pdev = pdev; |
57 | dws = &dwpci->dws; | 55 | dws = &dwpci->dws; |
58 | 56 | ||
59 | /* Get basic io resource and map it */ | 57 | /* Get basic io resource and map it */ |
60 | dws->paddr = pci_resource_start(pdev, pci_bar); | 58 | dws->paddr = pci_resource_start(pdev, pci_bar); |
61 | dws->iolen = pci_resource_len(pdev, pci_bar); | ||
62 | 59 | ||
63 | ret = pci_request_region(pdev, pci_bar, dev_name(&pdev->dev)); | 60 | ret = pcim_iomap_regions(pdev, 1, dev_name(&pdev->dev)); |
64 | if (ret) | 61 | if (ret) |
65 | goto err_kfree; | 62 | return ret; |
66 | |||
67 | dws->regs = ioremap_nocache((unsigned long)dws->paddr, | ||
68 | pci_resource_len(pdev, pci_bar)); | ||
69 | if (!dws->regs) { | ||
70 | ret = -ENOMEM; | ||
71 | goto err_release_reg; | ||
72 | } | ||
73 | 63 | ||
74 | dws->parent_dev = &pdev->dev; | ||
75 | dws->bus_num = 0; | 64 | dws->bus_num = 0; |
76 | dws->num_cs = 4; | 65 | dws->num_cs = 4; |
77 | dws->irq = pdev->irq; | 66 | dws->irq = pdev->irq; |
@@ -83,26 +72,17 @@ static int spi_pci_probe(struct pci_dev *pdev, | |||
83 | if (pdev->device == 0x0800) { | 72 | if (pdev->device == 0x0800) { |
84 | ret = dw_spi_mid_init(dws); | 73 | ret = dw_spi_mid_init(dws); |
85 | if (ret) | 74 | if (ret) |
86 | goto err_unmap; | 75 | return ret; |
87 | } | 76 | } |
88 | 77 | ||
89 | ret = dw_spi_add_host(dws); | 78 | ret = dw_spi_add_host(&pdev->dev, dws); |
90 | if (ret) | 79 | if (ret) |
91 | goto err_unmap; | 80 | return ret; |
92 | 81 | ||
93 | /* PCI hook and SPI hook use the same drv data */ | 82 | /* PCI hook and SPI hook use the same drv data */ |
94 | pci_set_drvdata(pdev, dwpci); | 83 | pci_set_drvdata(pdev, dwpci); |
95 | return 0; | ||
96 | 84 | ||
97 | err_unmap: | 85 | return 0; |
98 | iounmap(dws->regs); | ||
99 | err_release_reg: | ||
100 | pci_release_region(pdev, pci_bar); | ||
101 | err_kfree: | ||
102 | kfree(dwpci); | ||
103 | err_disable: | ||
104 | pci_disable_device(pdev); | ||
105 | return ret; | ||
106 | } | 86 | } |
107 | 87 | ||
108 | static void spi_pci_remove(struct pci_dev *pdev) | 88 | static void spi_pci_remove(struct pci_dev *pdev) |
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index b897c4adb39d..bf98d63d92b3 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c | |||
@@ -427,7 +427,6 @@ static void pump_transfers(unsigned long data) | |||
427 | dws->tx_end = dws->tx + transfer->len; | 427 | dws->tx_end = dws->tx + transfer->len; |
428 | dws->rx = transfer->rx_buf; | 428 | dws->rx = transfer->rx_buf; |
429 | dws->rx_end = dws->rx + transfer->len; | 429 | dws->rx_end = dws->rx + transfer->len; |
430 | dws->cs_change = transfer->cs_change; | ||
431 | dws->len = dws->cur_transfer->len; | 430 | dws->len = dws->cur_transfer->len; |
432 | if (chip != dws->prev_chip) | 431 | if (chip != dws->prev_chip) |
433 | cs_change = 1; | 432 | cs_change = 1; |
@@ -620,9 +619,11 @@ static int dw_spi_setup(struct spi_device *spi) | |||
620 | /* Only alloc on first setup */ | 619 | /* Only alloc on first setup */ |
621 | chip = spi_get_ctldata(spi); | 620 | chip = spi_get_ctldata(spi); |
622 | if (!chip) { | 621 | if (!chip) { |
623 | chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL); | 622 | chip = devm_kzalloc(&spi->dev, sizeof(struct chip_data), |
623 | GFP_KERNEL); | ||
624 | if (!chip) | 624 | if (!chip) |
625 | return -ENOMEM; | 625 | return -ENOMEM; |
626 | spi_set_ctldata(spi, chip); | ||
626 | } | 627 | } |
627 | 628 | ||
628 | /* | 629 | /* |
@@ -667,7 +668,6 @@ static int dw_spi_setup(struct spi_device *spi) | |||
667 | | (spi->mode << SPI_MODE_OFFSET) | 668 | | (spi->mode << SPI_MODE_OFFSET) |
668 | | (chip->tmode << SPI_TMOD_OFFSET); | 669 | | (chip->tmode << SPI_TMOD_OFFSET); |
669 | 670 | ||
670 | spi_set_ctldata(spi, chip); | ||
671 | return 0; | 671 | return 0; |
672 | } | 672 | } |
673 | 673 | ||
@@ -776,18 +776,16 @@ static void spi_hw_init(struct dw_spi *dws) | |||
776 | } | 776 | } |
777 | } | 777 | } |
778 | 778 | ||
779 | int dw_spi_add_host(struct dw_spi *dws) | 779 | int dw_spi_add_host(struct device *dev, struct dw_spi *dws) |
780 | { | 780 | { |
781 | struct spi_master *master; | 781 | struct spi_master *master; |
782 | int ret; | 782 | int ret; |
783 | 783 | ||
784 | BUG_ON(dws == NULL); | 784 | BUG_ON(dws == NULL); |
785 | 785 | ||
786 | master = spi_alloc_master(dws->parent_dev, 0); | 786 | master = spi_alloc_master(dev, 0); |
787 | if (!master) { | 787 | if (!master) |
788 | ret = -ENOMEM; | 788 | return -ENOMEM; |
789 | goto exit; | ||
790 | } | ||
791 | 789 | ||
792 | dws->master = master; | 790 | dws->master = master; |
793 | dws->type = SSI_MOTO_SPI; | 791 | dws->type = SSI_MOTO_SPI; |
@@ -797,7 +795,7 @@ int dw_spi_add_host(struct dw_spi *dws) | |||
797 | snprintf(dws->name, sizeof(dws->name), "dw_spi%d", | 795 | snprintf(dws->name, sizeof(dws->name), "dw_spi%d", |
798 | dws->bus_num); | 796 | dws->bus_num); |
799 | 797 | ||
800 | ret = request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, | 798 | ret = devm_request_irq(dev, dws->irq, dw_spi_irq, IRQF_SHARED, |
801 | dws->name, dws); | 799 | dws->name, dws); |
802 | if (ret < 0) { | 800 | if (ret < 0) { |
803 | dev_err(&master->dev, "can not get IRQ\n"); | 801 | dev_err(&master->dev, "can not get IRQ\n"); |
@@ -836,7 +834,7 @@ int dw_spi_add_host(struct dw_spi *dws) | |||
836 | } | 834 | } |
837 | 835 | ||
838 | spi_master_set_devdata(master, dws); | 836 | spi_master_set_devdata(master, dws); |
839 | ret = spi_register_master(master); | 837 | ret = devm_spi_register_master(dev, master); |
840 | if (ret) { | 838 | if (ret) { |
841 | dev_err(&master->dev, "problem registering spi master\n"); | 839 | dev_err(&master->dev, "problem registering spi master\n"); |
842 | goto err_queue_alloc; | 840 | goto err_queue_alloc; |
@@ -851,10 +849,8 @@ err_queue_alloc: | |||
851 | dws->dma_ops->dma_exit(dws); | 849 | dws->dma_ops->dma_exit(dws); |
852 | err_diable_hw: | 850 | err_diable_hw: |
853 | spi_enable_chip(dws, 0); | 851 | spi_enable_chip(dws, 0); |
854 | free_irq(dws->irq, dws); | ||
855 | err_free_master: | 852 | err_free_master: |
856 | spi_master_put(master); | 853 | spi_master_put(master); |
857 | exit: | ||
858 | return ret; | 854 | return ret; |
859 | } | 855 | } |
860 | EXPORT_SYMBOL_GPL(dw_spi_add_host); | 856 | EXPORT_SYMBOL_GPL(dw_spi_add_host); |
@@ -878,10 +874,6 @@ void dw_spi_remove_host(struct dw_spi *dws) | |||
878 | spi_enable_chip(dws, 0); | 874 | spi_enable_chip(dws, 0); |
879 | /* Disable clk */ | 875 | /* Disable clk */ |
880 | spi_set_clk(dws, 0); | 876 | spi_set_clk(dws, 0); |
881 | free_irq(dws->irq, dws); | ||
882 | |||
883 | /* Disconnect from the SPI framework */ | ||
884 | spi_unregister_master(dws->master); | ||
885 | } | 877 | } |
886 | EXPORT_SYMBOL_GPL(dw_spi_remove_host); | 878 | EXPORT_SYMBOL_GPL(dw_spi_remove_host); |
887 | 879 | ||
diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h index 9c57c078031e..587643dae11e 100644 --- a/drivers/spi/spi-dw.h +++ b/drivers/spi/spi-dw.h | |||
@@ -92,13 +92,11 @@ struct dw_spi_dma_ops { | |||
92 | struct dw_spi { | 92 | struct dw_spi { |
93 | struct spi_master *master; | 93 | struct spi_master *master; |
94 | struct spi_device *cur_dev; | 94 | struct spi_device *cur_dev; |
95 | struct device *parent_dev; | ||
96 | enum dw_ssi_type type; | 95 | enum dw_ssi_type type; |
97 | char name[16]; | 96 | char name[16]; |
98 | 97 | ||
99 | void __iomem *regs; | 98 | void __iomem *regs; |
100 | unsigned long paddr; | 99 | unsigned long paddr; |
101 | u32 iolen; | ||
102 | int irq; | 100 | int irq; |
103 | u32 fifo_len; /* depth of the FIFO buffer */ | 101 | u32 fifo_len; /* depth of the FIFO buffer */ |
104 | u32 max_freq; /* max bus freq supported */ | 102 | u32 max_freq; /* max bus freq supported */ |
@@ -135,7 +133,6 @@ struct dw_spi { | |||
135 | u8 n_bytes; /* current is a 1/2 bytes op */ | 133 | u8 n_bytes; /* current is a 1/2 bytes op */ |
136 | u8 max_bits_per_word; /* maxim is 16b */ | 134 | u8 max_bits_per_word; /* maxim is 16b */ |
137 | u32 dma_width; | 135 | u32 dma_width; |
138 | int cs_change; | ||
139 | irqreturn_t (*transfer_handler)(struct dw_spi *dws); | 136 | irqreturn_t (*transfer_handler)(struct dw_spi *dws); |
140 | void (*cs_control)(u32 command); | 137 | void (*cs_control)(u32 command); |
141 | 138 | ||
@@ -231,7 +228,7 @@ struct dw_spi_chip { | |||
231 | void (*cs_control)(u32 command); | 228 | void (*cs_control)(u32 command); |
232 | }; | 229 | }; |
233 | 230 | ||
234 | extern int dw_spi_add_host(struct dw_spi *dws); | 231 | extern int dw_spi_add_host(struct device *dev, struct dw_spi *dws); |
235 | extern void dw_spi_remove_host(struct dw_spi *dws); | 232 | extern void dw_spi_remove_host(struct dw_spi *dws); |
236 | extern int dw_spi_suspend_host(struct dw_spi *dws); | 233 | extern int dw_spi_suspend_host(struct dw_spi *dws); |
237 | extern int dw_spi_resume_host(struct dw_spi *dws); | 234 | extern int dw_spi_resume_host(struct dw_spi *dws); |