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-provider.h>
12 #include <linux/dmaengine.h>
13 #include <linux/platform_data/dma-dw.h>
25 enum pxa_ssp_type type
;
28 unsigned long max_clk_rate
;
30 /* DMA channel request parameters */
35 static struct dw_dma_slave byt_tx_param
= { .dst_id
= 0 };
36 static struct dw_dma_slave byt_rx_param
= { .src_id
= 1 };
38 static struct dw_dma_slave bsw0_tx_param
= { .dst_id
= 0 };
39 static struct dw_dma_slave bsw0_rx_param
= { .src_id
= 1 };
40 static struct dw_dma_slave bsw1_tx_param
= { .dst_id
= 6 };
41 static struct dw_dma_slave bsw1_rx_param
= { .src_id
= 7 };
42 static struct dw_dma_slave bsw2_tx_param
= { .dst_id
= 8 };
43 static struct dw_dma_slave bsw2_rx_param
= { .src_id
= 9 };
45 static bool lpss_dma_filter(struct dma_chan
*chan
, void *param
)
47 struct dw_dma_slave
*dws
= param
;
49 if (dws
->dma_dev
!= chan
->device
->dev
)
56 static struct pxa_spi_info spi_info_configs
[] = {
61 .max_clk_rate
= 3686400,
67 .max_clk_rate
= 50000000,
68 .tx_param
= &byt_tx_param
,
69 .rx_param
= &byt_rx_param
,
75 .max_clk_rate
= 50000000,
76 .tx_param
= &bsw0_tx_param
,
77 .rx_param
= &bsw0_rx_param
,
83 .max_clk_rate
= 50000000,
84 .tx_param
= &bsw1_tx_param
,
85 .rx_param
= &bsw1_rx_param
,
91 .max_clk_rate
= 50000000,
92 .tx_param
= &bsw2_tx_param
,
93 .rx_param
= &bsw2_rx_param
,
95 [PORT_QUARK_X1000
] = {
96 .type
= QUARK_X1000_SSP
,
99 .max_clk_rate
= 50000000,
103 static int pxa2xx_spi_pci_probe(struct pci_dev
*dev
,
104 const struct pci_device_id
*ent
)
106 struct platform_device_info pi
;
108 struct platform_device
*pdev
;
109 struct pxa2xx_spi_master spi_pdata
;
110 struct ssp_device
*ssp
;
111 struct pxa_spi_info
*c
;
113 struct pci_dev
*dma_dev
;
115 ret
= pcim_enable_device(dev
);
119 ret
= pcim_iomap_regions(dev
, 1 << 0, "PXA2xx SPI");
123 c
= &spi_info_configs
[ent
->driver_data
];
125 memset(&spi_pdata
, 0, sizeof(spi_pdata
));
126 spi_pdata
.num_chipselect
= (c
->num_chipselect
> 0) ?
127 c
->num_chipselect
: dev
->devfn
;
129 dma_dev
= pci_get_slot(dev
->bus
, PCI_DEVFN(PCI_SLOT(dev
->devfn
), 0));
132 struct dw_dma_slave
*slave
= c
->tx_param
;
134 slave
->dma_dev
= &dma_dev
->dev
;
135 slave
->src_master
= 1;
136 slave
->dst_master
= 0;
140 struct dw_dma_slave
*slave
= c
->rx_param
;
142 slave
->dma_dev
= &dma_dev
->dev
;
143 slave
->src_master
= 1;
144 slave
->dst_master
= 0;
147 spi_pdata
.dma_filter
= lpss_dma_filter
;
148 spi_pdata
.tx_param
= c
->tx_param
;
149 spi_pdata
.rx_param
= c
->rx_param
;
150 spi_pdata
.enable_dma
= c
->rx_param
&& c
->tx_param
;
152 ssp
= &spi_pdata
.ssp
;
153 ssp
->phys_base
= pci_resource_start(dev
, 0);
154 ssp
->mmio_base
= pcim_iomap_table(dev
)[0];
155 if (!ssp
->mmio_base
) {
156 dev_err(&dev
->dev
, "failed to ioremap() registers\n");
160 ssp
->port_id
= (c
->port_id
>= 0) ? c
->port_id
: dev
->devfn
;
163 snprintf(buf
, sizeof(buf
), "pxa2xx-spi.%d", ssp
->port_id
);
164 ssp
->clk
= clk_register_fixed_rate(&dev
->dev
, buf
, NULL
,
165 CLK_IS_ROOT
, c
->max_clk_rate
);
166 if (IS_ERR(ssp
->clk
))
167 return PTR_ERR(ssp
->clk
);
169 memset(&pi
, 0, sizeof(pi
));
170 pi
.parent
= &dev
->dev
;
171 pi
.name
= "pxa2xx-spi";
172 pi
.id
= ssp
->port_id
;
173 pi
.data
= &spi_pdata
;
174 pi
.size_data
= sizeof(spi_pdata
);
176 pdev
= platform_device_register_full(&pi
);
178 clk_unregister(ssp
->clk
);
179 return PTR_ERR(pdev
);
182 pci_set_drvdata(dev
, pdev
);
187 static void pxa2xx_spi_pci_remove(struct pci_dev
*dev
)
189 struct platform_device
*pdev
= pci_get_drvdata(dev
);
190 struct pxa2xx_spi_master
*spi_pdata
;
192 spi_pdata
= dev_get_platdata(&pdev
->dev
);
194 platform_device_unregister(pdev
);
195 clk_unregister(spi_pdata
->ssp
.clk
);
198 static const struct pci_device_id pxa2xx_spi_pci_devices
[] = {
199 { PCI_VDEVICE(INTEL
, 0x2e6a), PORT_CE4100
},
200 { PCI_VDEVICE(INTEL
, 0x0935), PORT_QUARK_X1000
},
201 { PCI_VDEVICE(INTEL
, 0x0f0e), PORT_BYT
},
202 { PCI_VDEVICE(INTEL
, 0x228e), PORT_BSW0
},
203 { PCI_VDEVICE(INTEL
, 0x2290), PORT_BSW1
},
204 { PCI_VDEVICE(INTEL
, 0x22ac), PORT_BSW2
},
207 MODULE_DEVICE_TABLE(pci
, pxa2xx_spi_pci_devices
);
209 static struct pci_driver pxa2xx_spi_pci_driver
= {
210 .name
= "pxa2xx_spi_pci",
211 .id_table
= pxa2xx_spi_pci_devices
,
212 .probe
= pxa2xx_spi_pci_probe
,
213 .remove
= pxa2xx_spi_pci_remove
,
216 module_pci_driver(pxa2xx_spi_pci_driver
);
218 MODULE_DESCRIPTION("CE4100/LPSS PCI-SPI glue code for PXA's driver");
219 MODULE_LICENSE("GPL v2");
220 MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy@linutronix.de>");