GNU Linux-libre 4.14.253-gnu1
[releases.git] / drivers / spi / spi-pxa2xx-pci.c
1 /*
2  * CE4100's SPI device is more or less the same one as found on PXA
3  *
4  * Copyright (C) 2016, Intel Corporation
5  */
6 #include <linux/clk-provider.h>
7 #include <linux/module.h>
8 #include <linux/of_device.h>
9 #include <linux/pci.h>
10 #include <linux/platform_device.h>
11 #include <linux/spi/pxa2xx_spi.h>
12
13 #include <linux/dmaengine.h>
14 #include <linux/platform_data/dma-dw.h>
15
16 enum {
17         PORT_QUARK_X1000,
18         PORT_BYT,
19         PORT_MRFLD,
20         PORT_BSW0,
21         PORT_BSW1,
22         PORT_BSW2,
23         PORT_CE4100,
24         PORT_LPT0,
25         PORT_LPT1,
26 };
27
28 struct pxa_spi_info {
29         enum pxa_ssp_type type;
30         int port_id;
31         int num_chipselect;
32         unsigned long max_clk_rate;
33
34         /* DMA channel request parameters */
35         bool (*dma_filter)(struct dma_chan *chan, void *param);
36         void *tx_param;
37         void *rx_param;
38
39         int (*setup)(struct pci_dev *pdev, struct pxa_spi_info *c);
40 };
41
42 static struct dw_dma_slave byt_tx_param = { .dst_id = 0 };
43 static struct dw_dma_slave byt_rx_param = { .src_id = 1 };
44
45 static struct dw_dma_slave mrfld3_tx_param = { .dst_id = 15 };
46 static struct dw_dma_slave mrfld3_rx_param = { .src_id = 14 };
47 static struct dw_dma_slave mrfld5_tx_param = { .dst_id = 13 };
48 static struct dw_dma_slave mrfld5_rx_param = { .src_id = 12 };
49 static struct dw_dma_slave mrfld6_tx_param = { .dst_id = 11 };
50 static struct dw_dma_slave mrfld6_rx_param = { .src_id = 10 };
51
52 static struct dw_dma_slave bsw0_tx_param = { .dst_id = 0 };
53 static struct dw_dma_slave bsw0_rx_param = { .src_id = 1 };
54 static struct dw_dma_slave bsw1_tx_param = { .dst_id = 6 };
55 static struct dw_dma_slave bsw1_rx_param = { .src_id = 7 };
56 static struct dw_dma_slave bsw2_tx_param = { .dst_id = 8 };
57 static struct dw_dma_slave bsw2_rx_param = { .src_id = 9 };
58
59 static struct dw_dma_slave lpt1_tx_param = { .dst_id = 0 };
60 static struct dw_dma_slave lpt1_rx_param = { .src_id = 1 };
61 static struct dw_dma_slave lpt0_tx_param = { .dst_id = 2 };
62 static struct dw_dma_slave lpt0_rx_param = { .src_id = 3 };
63
64 static bool lpss_dma_filter(struct dma_chan *chan, void *param)
65 {
66         struct dw_dma_slave *dws = param;
67
68         if (dws->dma_dev != chan->device->dev)
69                 return false;
70
71         chan->private = dws;
72         return true;
73 }
74
75 static int lpss_spi_setup(struct pci_dev *dev, struct pxa_spi_info *c)
76 {
77         struct pci_dev *dma_dev;
78
79         c->num_chipselect = 1;
80         c->max_clk_rate = 50000000;
81
82         dma_dev = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn), 0));
83
84         if (c->tx_param) {
85                 struct dw_dma_slave *slave = c->tx_param;
86
87                 slave->dma_dev = &dma_dev->dev;
88                 slave->m_master = 0;
89                 slave->p_master = 1;
90         }
91
92         if (c->rx_param) {
93                 struct dw_dma_slave *slave = c->rx_param;
94
95                 slave->dma_dev = &dma_dev->dev;
96                 slave->m_master = 0;
97                 slave->p_master = 1;
98         }
99
100         c->dma_filter = lpss_dma_filter;
101         return 0;
102 }
103
104 static int mrfld_spi_setup(struct pci_dev *dev, struct pxa_spi_info *c)
105 {
106         struct pci_dev *dma_dev = pci_get_slot(dev->bus, PCI_DEVFN(21, 0));
107         struct dw_dma_slave *tx, *rx;
108
109         switch (PCI_FUNC(dev->devfn)) {
110         case 0:
111                 c->port_id = 3;
112                 c->num_chipselect = 1;
113                 c->tx_param = &mrfld3_tx_param;
114                 c->rx_param = &mrfld3_rx_param;
115                 break;
116         case 1:
117                 c->port_id = 5;
118                 c->num_chipselect = 4;
119                 c->tx_param = &mrfld5_tx_param;
120                 c->rx_param = &mrfld5_rx_param;
121                 break;
122         case 2:
123                 c->port_id = 6;
124                 c->num_chipselect = 1;
125                 c->tx_param = &mrfld6_tx_param;
126                 c->rx_param = &mrfld6_rx_param;
127                 break;
128         default:
129                 return -ENODEV;
130         }
131
132         tx = c->tx_param;
133         tx->dma_dev = &dma_dev->dev;
134
135         rx = c->rx_param;
136         rx->dma_dev = &dma_dev->dev;
137
138         c->dma_filter = lpss_dma_filter;
139         return 0;
140 }
141
142 static struct pxa_spi_info spi_info_configs[] = {
143         [PORT_CE4100] = {
144                 .type = PXA25x_SSP,
145                 .port_id =  -1,
146                 .num_chipselect = -1,
147                 .max_clk_rate = 3686400,
148         },
149         [PORT_BYT] = {
150                 .type = LPSS_BYT_SSP,
151                 .port_id = 0,
152                 .setup = lpss_spi_setup,
153                 .tx_param = &byt_tx_param,
154                 .rx_param = &byt_rx_param,
155         },
156         [PORT_BSW0] = {
157                 .type = LPSS_BSW_SSP,
158                 .port_id = 0,
159                 .setup = lpss_spi_setup,
160                 .tx_param = &bsw0_tx_param,
161                 .rx_param = &bsw0_rx_param,
162         },
163         [PORT_BSW1] = {
164                 .type = LPSS_BSW_SSP,
165                 .port_id = 1,
166                 .setup = lpss_spi_setup,
167                 .tx_param = &bsw1_tx_param,
168                 .rx_param = &bsw1_rx_param,
169         },
170         [PORT_BSW2] = {
171                 .type = LPSS_BSW_SSP,
172                 .port_id = 2,
173                 .setup = lpss_spi_setup,
174                 .tx_param = &bsw2_tx_param,
175                 .rx_param = &bsw2_rx_param,
176         },
177         [PORT_MRFLD] = {
178                 .type = PXA27x_SSP,
179                 .max_clk_rate = 25000000,
180                 .setup = mrfld_spi_setup,
181         },
182         [PORT_QUARK_X1000] = {
183                 .type = QUARK_X1000_SSP,
184                 .port_id = -1,
185                 .num_chipselect = 1,
186                 .max_clk_rate = 50000000,
187         },
188         [PORT_LPT0] = {
189                 .type = LPSS_LPT_SSP,
190                 .port_id = 0,
191                 .setup = lpss_spi_setup,
192                 .tx_param = &lpt0_tx_param,
193                 .rx_param = &lpt0_rx_param,
194         },
195         [PORT_LPT1] = {
196                 .type = LPSS_LPT_SSP,
197                 .port_id = 1,
198                 .setup = lpss_spi_setup,
199                 .tx_param = &lpt1_tx_param,
200                 .rx_param = &lpt1_rx_param,
201         },
202 };
203
204 static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
205                 const struct pci_device_id *ent)
206 {
207         struct platform_device_info pi;
208         int ret;
209         struct platform_device *pdev;
210         struct pxa2xx_spi_master spi_pdata;
211         struct ssp_device *ssp;
212         struct pxa_spi_info *c;
213         char buf[40];
214
215         ret = pcim_enable_device(dev);
216         if (ret)
217                 return ret;
218
219         ret = pcim_iomap_regions(dev, 1 << 0, "PXA2xx SPI");
220         if (ret)
221                 return ret;
222
223         c = &spi_info_configs[ent->driver_data];
224         if (c->setup) {
225                 ret = c->setup(dev, c);
226                 if (ret)
227                         return ret;
228         }
229
230         memset(&spi_pdata, 0, sizeof(spi_pdata));
231         spi_pdata.num_chipselect = (c->num_chipselect > 0) ? c->num_chipselect : dev->devfn;
232         spi_pdata.dma_filter = c->dma_filter;
233         spi_pdata.tx_param = c->tx_param;
234         spi_pdata.rx_param = c->rx_param;
235         spi_pdata.enable_dma = c->rx_param && c->tx_param;
236
237         ssp = &spi_pdata.ssp;
238         ssp->phys_base = pci_resource_start(dev, 0);
239         ssp->mmio_base = pcim_iomap_table(dev)[0];
240         ssp->port_id = (c->port_id >= 0) ? c->port_id : dev->devfn;
241         ssp->type = c->type;
242
243         pci_set_master(dev);
244
245         ret = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES);
246         if (ret < 0)
247                 return ret;
248         ssp->irq = pci_irq_vector(dev, 0);
249
250         snprintf(buf, sizeof(buf), "pxa2xx-spi.%d", ssp->port_id);
251         ssp->clk = clk_register_fixed_rate(&dev->dev, buf , NULL, 0,
252                                            c->max_clk_rate);
253          if (IS_ERR(ssp->clk))
254                 return PTR_ERR(ssp->clk);
255
256         memset(&pi, 0, sizeof(pi));
257         pi.fwnode = dev->dev.fwnode;
258         pi.parent = &dev->dev;
259         pi.name = "pxa2xx-spi";
260         pi.id = ssp->port_id;
261         pi.data = &spi_pdata;
262         pi.size_data = sizeof(spi_pdata);
263
264         pdev = platform_device_register_full(&pi);
265         if (IS_ERR(pdev)) {
266                 clk_unregister(ssp->clk);
267                 return PTR_ERR(pdev);
268         }
269
270         pci_set_drvdata(dev, pdev);
271
272         return 0;
273 }
274
275 static void pxa2xx_spi_pci_remove(struct pci_dev *dev)
276 {
277         struct platform_device *pdev = pci_get_drvdata(dev);
278         struct pxa2xx_spi_master *spi_pdata;
279
280         spi_pdata = dev_get_platdata(&pdev->dev);
281
282         platform_device_unregister(pdev);
283         clk_unregister(spi_pdata->ssp.clk);
284 }
285
286 static const struct pci_device_id pxa2xx_spi_pci_devices[] = {
287         { PCI_VDEVICE(INTEL, 0x0935), PORT_QUARK_X1000 },
288         { PCI_VDEVICE(INTEL, 0x0f0e), PORT_BYT },
289         { PCI_VDEVICE(INTEL, 0x1194), PORT_MRFLD },
290         { PCI_VDEVICE(INTEL, 0x228e), PORT_BSW0 },
291         { PCI_VDEVICE(INTEL, 0x2290), PORT_BSW1 },
292         { PCI_VDEVICE(INTEL, 0x22ac), PORT_BSW2 },
293         { PCI_VDEVICE(INTEL, 0x2e6a), PORT_CE4100 },
294         { PCI_VDEVICE(INTEL, 0x9ce5), PORT_LPT0 },
295         { PCI_VDEVICE(INTEL, 0x9ce6), PORT_LPT1 },
296         { }
297 };
298 MODULE_DEVICE_TABLE(pci, pxa2xx_spi_pci_devices);
299
300 static struct pci_driver pxa2xx_spi_pci_driver = {
301         .name           = "pxa2xx_spi_pci",
302         .id_table       = pxa2xx_spi_pci_devices,
303         .probe          = pxa2xx_spi_pci_probe,
304         .remove         = pxa2xx_spi_pci_remove,
305 };
306
307 module_pci_driver(pxa2xx_spi_pci_driver);
308
309 MODULE_DESCRIPTION("CE4100/LPSS PCI-SPI glue code for PXA's driver");
310 MODULE_LICENSE("GPL v2");
311 MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy@linutronix.de>");