2 * CE4100's SPI device is more or less the same one as found on PXA
6 #include <linux/platform_device.h>
7 #include <linux/of_device.h>
8 #include <linux/module.h>
9 #include <linux/spi/pxa2xx_spi.h>
10 #include <linux/clk.h>
11 #include <linux/clk-provider.h>
13 #include <linux/dmaengine.h>
14 #include <linux/platform_data/dma-dw.h>
26 enum pxa_ssp_type type
;
29 unsigned long max_clk_rate
;
31 /* DMA channel request parameters */
36 static struct dw_dma_slave byt_tx_param
= { .dst_id
= 0 };
37 static struct dw_dma_slave byt_rx_param
= { .src_id
= 1 };
39 static struct dw_dma_slave bsw0_tx_param
= { .dst_id
= 0 };
40 static struct dw_dma_slave bsw0_rx_param
= { .src_id
= 1 };
41 static struct dw_dma_slave bsw1_tx_param
= { .dst_id
= 6 };
42 static struct dw_dma_slave bsw1_rx_param
= { .src_id
= 7 };
43 static struct dw_dma_slave bsw2_tx_param
= { .dst_id
= 8 };
44 static struct dw_dma_slave bsw2_rx_param
= { .src_id
= 9 };
46 static bool lpss_dma_filter(struct dma_chan
*chan
, void *param
)
48 struct dw_dma_slave
*dws
= param
;
50 if (dws
->dma_dev
!= chan
->device
->dev
)
57 static struct pxa_spi_info spi_info_configs
[] = {
62 .max_clk_rate
= 3686400,
68 .max_clk_rate
= 50000000,
69 .tx_param
= &byt_tx_param
,
70 .rx_param
= &byt_rx_param
,
76 .max_clk_rate
= 50000000,
77 .tx_param
= &bsw0_tx_param
,
78 .rx_param
= &bsw0_rx_param
,
84 .max_clk_rate
= 50000000,
85 .tx_param
= &bsw1_tx_param
,
86 .rx_param
= &bsw1_rx_param
,
92 .max_clk_rate
= 50000000,
93 .tx_param
= &bsw2_tx_param
,
94 .rx_param
= &bsw2_rx_param
,
96 [PORT_QUARK_X1000
] = {
97 .type
= QUARK_X1000_SSP
,
100 .max_clk_rate
= 50000000,
104 static int pxa2xx_spi_pci_probe(struct pci_dev
*dev
,
105 const struct pci_device_id
*ent
)
107 struct platform_device_info pi
;
109 struct platform_device
*pdev
;
110 struct pxa2xx_spi_master spi_pdata
;
111 struct ssp_device
*ssp
;
112 struct pxa_spi_info
*c
;
114 struct pci_dev
*dma_dev
;
116 ret
= pcim_enable_device(dev
);
120 ret
= pcim_iomap_regions(dev
, 1 << 0, "PXA2xx SPI");
124 c
= &spi_info_configs
[ent
->driver_data
];
126 memset(&spi_pdata
, 0, sizeof(spi_pdata
));
127 spi_pdata
.num_chipselect
= (c
->num_chipselect
> 0) ?
128 c
->num_chipselect
: dev
->devfn
;
130 dma_dev
= pci_get_slot(dev
->bus
, PCI_DEVFN(PCI_SLOT(dev
->devfn
), 0));
133 struct dw_dma_slave
*slave
= c
->tx_param
;
135 slave
->dma_dev
= &dma_dev
->dev
;
136 slave
->src_master
= 1;
137 slave
->dst_master
= 0;
141 struct dw_dma_slave
*slave
= c
->rx_param
;
143 slave
->dma_dev
= &dma_dev
->dev
;
144 slave
->src_master
= 1;
145 slave
->dst_master
= 0;
148 spi_pdata
.dma_filter
= lpss_dma_filter
;
149 spi_pdata
.tx_param
= c
->tx_param
;
150 spi_pdata
.rx_param
= c
->rx_param
;
151 spi_pdata
.enable_dma
= c
->rx_param
&& c
->tx_param
;
153 ssp
= &spi_pdata
.ssp
;
154 ssp
->phys_base
= pci_resource_start(dev
, 0);
155 ssp
->mmio_base
= pcim_iomap_table(dev
)[0];
156 if (!ssp
->mmio_base
) {
157 dev_err(&dev
->dev
, "failed to ioremap() registers\n");
161 ssp
->port_id
= (c
->port_id
>= 0) ? c
->port_id
: dev
->devfn
;
164 snprintf(buf
, sizeof(buf
), "pxa2xx-spi.%d", ssp
->port_id
);
165 ssp
->clk
= clk_register_fixed_rate(&dev
->dev
, buf
, NULL
,
166 CLK_IS_ROOT
, c
->max_clk_rate
);
167 if (IS_ERR(ssp
->clk
))
168 return PTR_ERR(ssp
->clk
);
170 memset(&pi
, 0, sizeof(pi
));
171 pi
.parent
= &dev
->dev
;
172 pi
.name
= "pxa2xx-spi";
173 pi
.id
= ssp
->port_id
;
174 pi
.data
= &spi_pdata
;
175 pi
.size_data
= sizeof(spi_pdata
);
177 pdev
= platform_device_register_full(&pi
);
179 clk_unregister(ssp
->clk
);
180 return PTR_ERR(pdev
);
183 pci_set_drvdata(dev
, pdev
);
188 static void pxa2xx_spi_pci_remove(struct pci_dev
*dev
)
190 struct platform_device
*pdev
= pci_get_drvdata(dev
);
191 struct pxa2xx_spi_master
*spi_pdata
;
193 spi_pdata
= dev_get_platdata(&pdev
->dev
);
195 platform_device_unregister(pdev
);
196 clk_unregister(spi_pdata
->ssp
.clk
);
199 static const struct pci_device_id pxa2xx_spi_pci_devices
[] = {
200 { PCI_VDEVICE(INTEL
, 0x2e6a), PORT_CE4100
},
201 { PCI_VDEVICE(INTEL
, 0x0935), PORT_QUARK_X1000
},
202 { PCI_VDEVICE(INTEL
, 0x0f0e), PORT_BYT
},
203 { PCI_VDEVICE(INTEL
, 0x228e), PORT_BSW0
},
204 { PCI_VDEVICE(INTEL
, 0x2290), PORT_BSW1
},
205 { PCI_VDEVICE(INTEL
, 0x22ac), PORT_BSW2
},
208 MODULE_DEVICE_TABLE(pci
, pxa2xx_spi_pci_devices
);
210 static struct pci_driver pxa2xx_spi_pci_driver
= {
211 .name
= "pxa2xx_spi_pci",
212 .id_table
= pxa2xx_spi_pci_devices
,
213 .probe
= pxa2xx_spi_pci_probe
,
214 .remove
= pxa2xx_spi_pci_remove
,
217 module_pci_driver(pxa2xx_spi_pci_driver
);
219 MODULE_DESCRIPTION("CE4100/LPSS PCI-SPI glue code for PXA's driver");
220 MODULE_LICENSE("GPL v2");
221 MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy@linutronix.de>");