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 bsw0_tx_param
= { .dst_id
= 0 };
45 static struct dw_dma_slave bsw0_rx_param
= { .src_id
= 1 };
46 static struct dw_dma_slave bsw1_tx_param
= { .dst_id
= 6 };
47 static struct dw_dma_slave bsw1_rx_param
= { .src_id
= 7 };
48 static struct dw_dma_slave bsw2_tx_param
= { .dst_id
= 8 };
49 static struct dw_dma_slave bsw2_rx_param
= { .src_id
= 9 };
51 static struct dw_dma_slave lpt_tx_param
= { .dst_id
= 0 };
52 static struct dw_dma_slave lpt_rx_param
= { .src_id
= 1 };
54 static bool lpss_dma_filter(struct dma_chan
*chan
, void *param
)
56 struct dw_dma_slave
*dws
= param
;
58 if (dws
->dma_dev
!= chan
->device
->dev
)
65 static int lpss_spi_setup(struct pci_dev
*dev
, struct pxa_spi_info
*c
)
67 struct pci_dev
*dma_dev
;
69 c
->num_chipselect
= 1;
70 c
->max_clk_rate
= 50000000;
72 dma_dev
= pci_get_slot(dev
->bus
, PCI_DEVFN(PCI_SLOT(dev
->devfn
), 0));
75 struct dw_dma_slave
*slave
= c
->tx_param
;
77 slave
->dma_dev
= &dma_dev
->dev
;
83 struct dw_dma_slave
*slave
= c
->rx_param
;
85 slave
->dma_dev
= &dma_dev
->dev
;
90 c
->dma_filter
= lpss_dma_filter
;
94 static int mrfld_spi_setup(struct pci_dev
*dev
, struct pxa_spi_info
*c
)
96 switch (PCI_FUNC(dev
->devfn
)) {
99 c
->num_chipselect
= 1;
103 c
->num_chipselect
= 4;
107 c
->num_chipselect
= 1;
115 static struct pxa_spi_info spi_info_configs
[] = {
119 .num_chipselect
= -1,
120 .max_clk_rate
= 3686400,
123 .type
= LPSS_BYT_SSP
,
125 .setup
= lpss_spi_setup
,
126 .tx_param
= &byt_tx_param
,
127 .rx_param
= &byt_rx_param
,
130 .type
= LPSS_BSW_SSP
,
132 .setup
= lpss_spi_setup
,
133 .tx_param
= &bsw0_tx_param
,
134 .rx_param
= &bsw0_rx_param
,
137 .type
= LPSS_BSW_SSP
,
139 .setup
= lpss_spi_setup
,
140 .tx_param
= &bsw1_tx_param
,
141 .rx_param
= &bsw1_rx_param
,
144 .type
= LPSS_BSW_SSP
,
146 .setup
= lpss_spi_setup
,
147 .tx_param
= &bsw2_tx_param
,
148 .rx_param
= &bsw2_rx_param
,
152 .max_clk_rate
= 25000000,
153 .setup
= mrfld_spi_setup
,
155 [PORT_QUARK_X1000
] = {
156 .type
= QUARK_X1000_SSP
,
159 .max_clk_rate
= 50000000,
162 .type
= LPSS_LPT_SSP
,
164 .setup
= lpss_spi_setup
,
165 .tx_param
= &lpt_tx_param
,
166 .rx_param
= &lpt_rx_param
,
170 static int pxa2xx_spi_pci_probe(struct pci_dev
*dev
,
171 const struct pci_device_id
*ent
)
173 struct platform_device_info pi
;
175 struct platform_device
*pdev
;
176 struct pxa2xx_spi_master spi_pdata
;
177 struct ssp_device
*ssp
;
178 struct pxa_spi_info
*c
;
181 ret
= pcim_enable_device(dev
);
185 ret
= pcim_iomap_regions(dev
, 1 << 0, "PXA2xx SPI");
189 c
= &spi_info_configs
[ent
->driver_data
];
191 ret
= c
->setup(dev
, c
);
196 memset(&spi_pdata
, 0, sizeof(spi_pdata
));
197 spi_pdata
.num_chipselect
= (c
->num_chipselect
> 0) ? c
->num_chipselect
: dev
->devfn
;
198 spi_pdata
.dma_filter
= c
->dma_filter
;
199 spi_pdata
.tx_param
= c
->tx_param
;
200 spi_pdata
.rx_param
= c
->rx_param
;
201 spi_pdata
.enable_dma
= c
->rx_param
&& c
->tx_param
;
203 ssp
= &spi_pdata
.ssp
;
204 ssp
->phys_base
= pci_resource_start(dev
, 0);
205 ssp
->mmio_base
= pcim_iomap_table(dev
)[0];
207 ssp
->port_id
= (c
->port_id
>= 0) ? c
->port_id
: dev
->devfn
;
210 snprintf(buf
, sizeof(buf
), "pxa2xx-spi.%d", ssp
->port_id
);
211 ssp
->clk
= clk_register_fixed_rate(&dev
->dev
, buf
, NULL
, 0,
213 if (IS_ERR(ssp
->clk
))
214 return PTR_ERR(ssp
->clk
);
216 memset(&pi
, 0, sizeof(pi
));
217 pi
.fwnode
= dev
->dev
.fwnode
;
218 pi
.parent
= &dev
->dev
;
219 pi
.name
= "pxa2xx-spi";
220 pi
.id
= ssp
->port_id
;
221 pi
.data
= &spi_pdata
;
222 pi
.size_data
= sizeof(spi_pdata
);
224 pdev
= platform_device_register_full(&pi
);
226 clk_unregister(ssp
->clk
);
227 return PTR_ERR(pdev
);
230 pci_set_drvdata(dev
, pdev
);
235 static void pxa2xx_spi_pci_remove(struct pci_dev
*dev
)
237 struct platform_device
*pdev
= pci_get_drvdata(dev
);
238 struct pxa2xx_spi_master
*spi_pdata
;
240 spi_pdata
= dev_get_platdata(&pdev
->dev
);
242 platform_device_unregister(pdev
);
243 clk_unregister(spi_pdata
->ssp
.clk
);
246 static const struct pci_device_id pxa2xx_spi_pci_devices
[] = {
247 { PCI_VDEVICE(INTEL
, 0x0935), PORT_QUARK_X1000
},
248 { PCI_VDEVICE(INTEL
, 0x0f0e), PORT_BYT
},
249 { PCI_VDEVICE(INTEL
, 0x1194), PORT_MRFLD
},
250 { PCI_VDEVICE(INTEL
, 0x228e), PORT_BSW0
},
251 { PCI_VDEVICE(INTEL
, 0x2290), PORT_BSW1
},
252 { PCI_VDEVICE(INTEL
, 0x22ac), PORT_BSW2
},
253 { PCI_VDEVICE(INTEL
, 0x2e6a), PORT_CE4100
},
254 { PCI_VDEVICE(INTEL
, 0x9ce6), PORT_LPT
},
257 MODULE_DEVICE_TABLE(pci
, pxa2xx_spi_pci_devices
);
259 static struct pci_driver pxa2xx_spi_pci_driver
= {
260 .name
= "pxa2xx_spi_pci",
261 .id_table
= pxa2xx_spi_pci_devices
,
262 .probe
= pxa2xx_spi_pci_probe
,
263 .remove
= pxa2xx_spi_pci_remove
,
266 module_pci_driver(pxa2xx_spi_pci_driver
);
268 MODULE_DESCRIPTION("CE4100/LPSS PCI-SPI glue code for PXA's driver");
269 MODULE_LICENSE("GPL v2");
270 MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy@linutronix.de>");