aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-pxa2xx-pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-pxa2xx-pci.c')
-rw-r--r--drivers/spi/spi-pxa2xx-pci.c76
1 files changed, 61 insertions, 15 deletions
diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c
index 3f006d3ed2a8..c1865c92ccb9 100644
--- a/drivers/spi/spi-pxa2xx-pci.c
+++ b/drivers/spi/spi-pxa2xx-pci.c
@@ -8,7 +8,43 @@
8#include <linux/module.h> 8#include <linux/module.h>
9#include <linux/spi/pxa2xx_spi.h> 9#include <linux/spi/pxa2xx_spi.h>
10 10
11static int ce4100_spi_probe(struct pci_dev *dev, 11enum {
12 PORT_CE4100,
13 PORT_BYT,
14};
15
16struct pxa_spi_info {
17 enum pxa_ssp_type type;
18 int port_id;
19 int num_chipselect;
20 int tx_slave_id;
21 int tx_chan_id;
22 int rx_slave_id;
23 int rx_chan_id;
24};
25
26static struct pxa_spi_info spi_info_configs[] = {
27 [PORT_CE4100] = {
28 .type = PXA25x_SSP,
29 .port_id = -1,
30 .num_chipselect = -1,
31 .tx_slave_id = -1,
32 .tx_chan_id = -1,
33 .rx_slave_id = -1,
34 .rx_chan_id = -1,
35 },
36 [PORT_BYT] = {
37 .type = LPSS_SSP,
38 .port_id = 0,
39 .num_chipselect = 1,
40 .tx_slave_id = 0,
41 .tx_chan_id = 0,
42 .rx_slave_id = 1,
43 .rx_chan_id = 1,
44 },
45};
46
47static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
12 const struct pci_device_id *ent) 48 const struct pci_device_id *ent)
13{ 49{
14 struct platform_device_info pi; 50 struct platform_device_info pi;
@@ -16,6 +52,7 @@ static int ce4100_spi_probe(struct pci_dev *dev,
16 struct platform_device *pdev; 52 struct platform_device *pdev;
17 struct pxa2xx_spi_master spi_pdata; 53 struct pxa2xx_spi_master spi_pdata;
18 struct ssp_device *ssp; 54 struct ssp_device *ssp;
55 struct pxa_spi_info *c;
19 56
20 ret = pcim_enable_device(dev); 57 ret = pcim_enable_device(dev);
21 if (ret) 58 if (ret)
@@ -25,8 +62,16 @@ static int ce4100_spi_probe(struct pci_dev *dev,
25 if (ret) 62 if (ret)
26 return ret; 63 return ret;
27 64
65 c = &spi_info_configs[ent->driver_data];
66
28 memset(&spi_pdata, 0, sizeof(spi_pdata)); 67 memset(&spi_pdata, 0, sizeof(spi_pdata));
29 spi_pdata.num_chipselect = dev->devfn; 68 spi_pdata.num_chipselect = (c->num_chipselect > 0) ?
69 c->num_chipselect : dev->devfn;
70 spi_pdata.tx_slave_id = c->tx_slave_id;
71 spi_pdata.tx_chan_id = c->tx_chan_id;
72 spi_pdata.rx_slave_id = c->rx_slave_id;
73 spi_pdata.rx_chan_id = c->rx_chan_id;
74 spi_pdata.enable_dma = c->rx_slave_id >= 0 && c->tx_slave_id >= 0;
30 75
31 ssp = &spi_pdata.ssp; 76 ssp = &spi_pdata.ssp;
32 ssp->phys_base = pci_resource_start(dev, 0); 77 ssp->phys_base = pci_resource_start(dev, 0);
@@ -36,8 +81,8 @@ static int ce4100_spi_probe(struct pci_dev *dev,
36 return -EIO; 81 return -EIO;
37 } 82 }
38 ssp->irq = dev->irq; 83 ssp->irq = dev->irq;
39 ssp->port_id = dev->devfn; 84 ssp->port_id = (c->port_id >= 0) ? c->port_id : dev->devfn;
40 ssp->type = PXA25x_SSP; 85 ssp->type = c->type;
41 86
42 memset(&pi, 0, sizeof(pi)); 87 memset(&pi, 0, sizeof(pi));
43 pi.parent = &dev->dev; 88 pi.parent = &dev->dev;
@@ -55,28 +100,29 @@ static int ce4100_spi_probe(struct pci_dev *dev,
55 return 0; 100 return 0;
56} 101}
57 102
58static void ce4100_spi_remove(struct pci_dev *dev) 103static void pxa2xx_spi_pci_remove(struct pci_dev *dev)
59{ 104{
60 struct platform_device *pdev = pci_get_drvdata(dev); 105 struct platform_device *pdev = pci_get_drvdata(dev);
61 106
62 platform_device_unregister(pdev); 107 platform_device_unregister(pdev);
63} 108}
64 109
65static const struct pci_device_id ce4100_spi_devices[] = { 110static const struct pci_device_id pxa2xx_spi_pci_devices[] = {
66 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2e6a) }, 111 { PCI_VDEVICE(INTEL, 0x2e6a), PORT_CE4100 },
112 { PCI_VDEVICE(INTEL, 0x0f0e), PORT_BYT },
67 { }, 113 { },
68}; 114};
69MODULE_DEVICE_TABLE(pci, ce4100_spi_devices); 115MODULE_DEVICE_TABLE(pci, pxa2xx_spi_pci_devices);
70 116
71static struct pci_driver ce4100_spi_driver = { 117static struct pci_driver pxa2xx_spi_pci_driver = {
72 .name = "ce4100_spi", 118 .name = "pxa2xx_spi_pci",
73 .id_table = ce4100_spi_devices, 119 .id_table = pxa2xx_spi_pci_devices,
74 .probe = ce4100_spi_probe, 120 .probe = pxa2xx_spi_pci_probe,
75 .remove = ce4100_spi_remove, 121 .remove = pxa2xx_spi_pci_remove,
76}; 122};
77 123
78module_pci_driver(ce4100_spi_driver); 124module_pci_driver(pxa2xx_spi_pci_driver);
79 125
80MODULE_DESCRIPTION("CE4100 PCI-SPI glue code for PXA's driver"); 126MODULE_DESCRIPTION("CE4100/LPSS PCI-SPI glue code for PXA's driver");
81MODULE_LICENSE("GPL v2"); 127MODULE_LICENSE("GPL v2");
82MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy@linutronix.de>"); 128MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy@linutronix.de>");