2 * CE4100's SPI device is more or less the same one as found on PXA
4 * Copyright (C) 2016, Intel Corporation
6 #include <linux/clk-provider.h>
7 #include <linux/module.h>
8 #include <linux/of_device.h>
10 #include <linux/platform_device.h>
11 #include <linux/spi/pxa2xx_spi.h>
13 #include <linux/dmaengine.h>
14 #include <linux/platform_data/dma-dw.h>
28 enum pxa_ssp_type type
;
31 unsigned long max_clk_rate
;
33 /* DMA channel request parameters */
34 bool (*dma_filter
)(struct dma_chan
*chan
, void *param
);
38 int (*setup
)(struct pci_dev
*pdev
, struct pxa_spi_info
*c
);
41 static struct dw_dma_slave byt_tx_param
= { .dst_id
= 0 };
42 static struct dw_dma_slave byt_rx_param
= { .src_id
= 1 };
44 static struct dw_dma_slave mrfld3_tx_param
= { .dst_id
= 15 };
45 static struct dw_dma_slave mrfld3_rx_param
= { .src_id
= 14 };
46 static struct dw_dma_slave mrfld5_tx_param
= { .dst_id
= 13 };
47 static struct dw_dma_slave mrfld5_rx_param
= { .src_id
= 12 };
48 static struct dw_dma_slave mrfld6_tx_param
= { .dst_id
= 11 };
49 static struct dw_dma_slave mrfld6_rx_param
= { .src_id
= 10 };
51 static struct dw_dma_slave bsw0_tx_param
= { .dst_id
= 0 };
52 static struct dw_dma_slave bsw0_rx_param
= { .src_id
= 1 };
53 static struct dw_dma_slave bsw1_tx_param
= { .dst_id
= 6 };
54 static struct dw_dma_slave bsw1_rx_param
= { .src_id
= 7 };
55 static struct dw_dma_slave bsw2_tx_param
= { .dst_id
= 8 };
56 static struct dw_dma_slave bsw2_rx_param
= { .src_id
= 9 };
58 static struct dw_dma_slave lpt_tx_param
= { .dst_id
= 0 };
59 static struct dw_dma_slave lpt_rx_param
= { .src_id
= 1 };
61 static bool lpss_dma_filter(struct dma_chan
*chan
, void *param
)
63 struct dw_dma_slave
*dws
= param
;
65 if (dws
->dma_dev
!= chan
->device
->dev
)
72 static int lpss_spi_setup(struct pci_dev
*dev
, struct pxa_spi_info
*c
)
74 struct pci_dev
*dma_dev
;
76 c
->num_chipselect
= 1;
77 c
->max_clk_rate
= 50000000;
79 dma_dev
= pci_get_slot(dev
->bus
, PCI_DEVFN(PCI_SLOT(dev
->devfn
), 0));
82 struct dw_dma_slave
*slave
= c
->tx_param
;
84 slave
->dma_dev
= &dma_dev
->dev
;
90 struct dw_dma_slave
*slave
= c
->rx_param
;
92 slave
->dma_dev
= &dma_dev
->dev
;
97 c
->dma_filter
= lpss_dma_filter
;
101 static int mrfld_spi_setup(struct pci_dev
*dev
, struct pxa_spi_info
*c
)
103 struct pci_dev
*dma_dev
= pci_get_slot(dev
->bus
, PCI_DEVFN(21, 0));
104 struct dw_dma_slave
*tx
, *rx
;
106 switch (PCI_FUNC(dev
->devfn
)) {
109 c
->num_chipselect
= 1;
110 c
->tx_param
= &mrfld3_tx_param
;
111 c
->rx_param
= &mrfld3_rx_param
;
115 c
->num_chipselect
= 4;
116 c
->tx_param
= &mrfld5_tx_param
;
117 c
->rx_param
= &mrfld5_rx_param
;
121 c
->num_chipselect
= 1;
122 c
->tx_param
= &mrfld6_tx_param
;
123 c
->rx_param
= &mrfld6_rx_param
;
130 tx
->dma_dev
= &dma_dev
->dev
;
133 rx
->dma_dev
= &dma_dev
->dev
;
135 c
->dma_filter
= lpss_dma_filter
;
139 static struct pxa_spi_info spi_info_configs
[] = {
143 .num_chipselect
= -1,
144 .max_clk_rate
= 3686400,
147 .type
= LPSS_BYT_SSP
,
149 .setup
= lpss_spi_setup
,
150 .tx_param
= &byt_tx_param
,
151 .rx_param
= &byt_rx_param
,
154 .type
= LPSS_BSW_SSP
,
156 .setup
= lpss_spi_setup
,
157 .tx_param
= &bsw0_tx_param
,
158 .rx_param
= &bsw0_rx_param
,
161 .type
= LPSS_BSW_SSP
,
163 .setup
= lpss_spi_setup
,
164 .tx_param
= &bsw1_tx_param
,
165 .rx_param
= &bsw1_rx_param
,
168 .type
= LPSS_BSW_SSP
,
170 .setup
= lpss_spi_setup
,
171 .tx_param
= &bsw2_tx_param
,
172 .rx_param
= &bsw2_rx_param
,
176 .max_clk_rate
= 25000000,
177 .setup
= mrfld_spi_setup
,
179 [PORT_QUARK_X1000
] = {
180 .type
= QUARK_X1000_SSP
,
183 .max_clk_rate
= 50000000,
186 .type
= LPSS_LPT_SSP
,
188 .setup
= lpss_spi_setup
,
189 .tx_param
= &lpt_tx_param
,
190 .rx_param
= &lpt_rx_param
,
194 static int pxa2xx_spi_pci_probe(struct pci_dev
*dev
,
195 const struct pci_device_id
*ent
)
197 struct platform_device_info pi
;
199 struct platform_device
*pdev
;
200 struct pxa2xx_spi_master spi_pdata
;
201 struct ssp_device
*ssp
;
202 struct pxa_spi_info
*c
;
205 ret
= pcim_enable_device(dev
);
209 ret
= pcim_iomap_regions(dev
, 1 << 0, "PXA2xx SPI");
213 c
= &spi_info_configs
[ent
->driver_data
];
215 ret
= c
->setup(dev
, c
);
220 memset(&spi_pdata
, 0, sizeof(spi_pdata
));
221 spi_pdata
.num_chipselect
= (c
->num_chipselect
> 0) ? c
->num_chipselect
: dev
->devfn
;
222 spi_pdata
.dma_filter
= c
->dma_filter
;
223 spi_pdata
.tx_param
= c
->tx_param
;
224 spi_pdata
.rx_param
= c
->rx_param
;
225 spi_pdata
.enable_dma
= c
->rx_param
&& c
->tx_param
;
227 ssp
= &spi_pdata
.ssp
;
228 ssp
->phys_base
= pci_resource_start(dev
, 0);
229 ssp
->mmio_base
= pcim_iomap_table(dev
)[0];
230 ssp
->port_id
= (c
->port_id
>= 0) ? c
->port_id
: dev
->devfn
;
235 ret
= pci_alloc_irq_vectors(dev
, 1, 1, PCI_IRQ_ALL_TYPES
);
238 ssp
->irq
= pci_irq_vector(dev
, 0);
240 snprintf(buf
, sizeof(buf
), "pxa2xx-spi.%d", ssp
->port_id
);
241 ssp
->clk
= clk_register_fixed_rate(&dev
->dev
, buf
, NULL
, 0,
243 if (IS_ERR(ssp
->clk
))
244 return PTR_ERR(ssp
->clk
);
246 memset(&pi
, 0, sizeof(pi
));
247 pi
.fwnode
= dev
->dev
.fwnode
;
248 pi
.parent
= &dev
->dev
;
249 pi
.name
= "pxa2xx-spi";
250 pi
.id
= ssp
->port_id
;
251 pi
.data
= &spi_pdata
;
252 pi
.size_data
= sizeof(spi_pdata
);
254 pdev
= platform_device_register_full(&pi
);
256 clk_unregister(ssp
->clk
);
257 return PTR_ERR(pdev
);
260 pci_set_drvdata(dev
, pdev
);
265 static void pxa2xx_spi_pci_remove(struct pci_dev
*dev
)
267 struct platform_device
*pdev
= pci_get_drvdata(dev
);
268 struct pxa2xx_spi_master
*spi_pdata
;
270 spi_pdata
= dev_get_platdata(&pdev
->dev
);
272 platform_device_unregister(pdev
);
273 clk_unregister(spi_pdata
->ssp
.clk
);
276 static const struct pci_device_id pxa2xx_spi_pci_devices
[] = {
277 { PCI_VDEVICE(INTEL
, 0x0935), PORT_QUARK_X1000
},
278 { PCI_VDEVICE(INTEL
, 0x0f0e), PORT_BYT
},
279 { PCI_VDEVICE(INTEL
, 0x1194), PORT_MRFLD
},
280 { PCI_VDEVICE(INTEL
, 0x228e), PORT_BSW0
},
281 { PCI_VDEVICE(INTEL
, 0x2290), PORT_BSW1
},
282 { PCI_VDEVICE(INTEL
, 0x22ac), PORT_BSW2
},
283 { PCI_VDEVICE(INTEL
, 0x2e6a), PORT_CE4100
},
284 { PCI_VDEVICE(INTEL
, 0x9ce6), PORT_LPT
},
287 MODULE_DEVICE_TABLE(pci
, pxa2xx_spi_pci_devices
);
289 static struct pci_driver pxa2xx_spi_pci_driver
= {
290 .name
= "pxa2xx_spi_pci",
291 .id_table
= pxa2xx_spi_pci_devices
,
292 .probe
= pxa2xx_spi_pci_probe
,
293 .remove
= pxa2xx_spi_pci_remove
,
296 module_pci_driver(pxa2xx_spi_pci_driver
);
298 MODULE_DESCRIPTION("CE4100/LPSS PCI-SPI glue code for PXA's driver");
299 MODULE_LICENSE("GPL v2");
300 MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy@linutronix.de>");