1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * CE4100's SPI device is more or less the same one as found on PXA 4 * 5 * Copyright (C) 2016, Intel Corporation 6 */ 7 #include <linux/clk-provider.h> 8 #include <linux/module.h> 9 #include <linux/pci.h> 10 #include <linux/platform_device.h> 11 #include <linux/spi/pxa2xx_spi.h> 12 13 #include <linux/dmaengine.h> 14 #include <linux/platform_data/dma-dw.h> 15 16 enum { 17 PORT_QUARK_X1000, 18 PORT_BYT, 19 PORT_MRFLD, 20 PORT_BSW0, 21 PORT_BSW1, 22 PORT_BSW2, 23 PORT_CE4100, 24 PORT_LPT, 25 }; 26 27 struct pxa_spi_info { 28 enum pxa_ssp_type type; 29 int port_id; 30 int num_chipselect; 31 unsigned long max_clk_rate; 32 33 /* DMA channel request parameters */ 34 bool (*dma_filter)(struct dma_chan *chan, void *param); 35 void *tx_param; 36 void *rx_param; 37 38 int dma_burst_size; 39 40 int (*setup)(struct pci_dev *pdev, struct pxa_spi_info *c); 41 }; 42 43 static struct dw_dma_slave byt_tx_param = { .dst_id = 0 }; 44 static struct dw_dma_slave byt_rx_param = { .src_id = 1 }; 45 46 static struct dw_dma_slave mrfld3_tx_param = { .dst_id = 15 }; 47 static struct dw_dma_slave mrfld3_rx_param = { .src_id = 14 }; 48 static struct dw_dma_slave mrfld5_tx_param = { .dst_id = 13 }; 49 static struct dw_dma_slave mrfld5_rx_param = { .src_id = 12 }; 50 static struct dw_dma_slave mrfld6_tx_param = { .dst_id = 11 }; 51 static struct dw_dma_slave mrfld6_rx_param = { .src_id = 10 }; 52 53 static struct dw_dma_slave bsw0_tx_param = { .dst_id = 0 }; 54 static struct dw_dma_slave bsw0_rx_param = { .src_id = 1 }; 55 static struct dw_dma_slave bsw1_tx_param = { .dst_id = 6 }; 56 static struct dw_dma_slave bsw1_rx_param = { .src_id = 7 }; 57 static struct dw_dma_slave bsw2_tx_param = { .dst_id = 8 }; 58 static struct dw_dma_slave bsw2_rx_param = { .src_id = 9 }; 59 60 static struct dw_dma_slave lpt_tx_param = { .dst_id = 0 }; 61 static struct dw_dma_slave lpt_rx_param = { .src_id = 1 }; 62 63 static bool lpss_dma_filter(struct dma_chan *chan, void *param) 64 { 65 struct dw_dma_slave *dws = param; 66 67 if (dws->dma_dev != chan->device->dev) 68 return false; 69 70 chan->private = dws; 71 return true; 72 } 73 74 static int lpss_spi_setup(struct pci_dev *dev, struct pxa_spi_info *c) 75 { 76 struct pci_dev *dma_dev; 77 78 c->num_chipselect = 1; 79 c->max_clk_rate = 50000000; 80 81 dma_dev = pci_get_slot(dev->bus, PCI_DEVFN(PCI_SLOT(dev->devfn), 0)); 82 83 if (c->tx_param) { 84 struct dw_dma_slave *slave = c->tx_param; 85 86 slave->dma_dev = &dma_dev->dev; 87 slave->m_master = 0; 88 slave->p_master = 1; 89 } 90 91 if (c->rx_param) { 92 struct dw_dma_slave *slave = c->rx_param; 93 94 slave->dma_dev = &dma_dev->dev; 95 slave->m_master = 0; 96 slave->p_master = 1; 97 } 98 99 c->dma_filter = lpss_dma_filter; 100 return 0; 101 } 102 103 static int mrfld_spi_setup(struct pci_dev *dev, struct pxa_spi_info *c) 104 { 105 struct pci_dev *dma_dev = pci_get_slot(dev->bus, PCI_DEVFN(21, 0)); 106 struct dw_dma_slave *tx, *rx; 107 108 switch (PCI_FUNC(dev->devfn)) { 109 case 0: 110 c->port_id = 3; 111 c->num_chipselect = 1; 112 c->tx_param = &mrfld3_tx_param; 113 c->rx_param = &mrfld3_rx_param; 114 break; 115 case 1: 116 c->port_id = 5; 117 c->num_chipselect = 4; 118 c->tx_param = &mrfld5_tx_param; 119 c->rx_param = &mrfld5_rx_param; 120 break; 121 case 2: 122 c->port_id = 6; 123 c->num_chipselect = 1; 124 c->tx_param = &mrfld6_tx_param; 125 c->rx_param = &mrfld6_rx_param; 126 break; 127 default: 128 return -ENODEV; 129 } 130 131 tx = c->tx_param; 132 tx->dma_dev = &dma_dev->dev; 133 134 rx = c->rx_param; 135 rx->dma_dev = &dma_dev->dev; 136 137 c->dma_filter = lpss_dma_filter; 138 c->dma_burst_size = 8; 139 return 0; 140 } 141 142 static struct pxa_spi_info spi_info_configs[] = { 143 [PORT_CE4100] = { 144 .type = PXA25x_SSP, 145 .port_id = -1, 146 .num_chipselect = -1, 147 .max_clk_rate = 3686400, 148 }, 149 [PORT_BYT] = { 150 .type = LPSS_BYT_SSP, 151 .port_id = 0, 152 .setup = lpss_spi_setup, 153 .tx_param = &byt_tx_param, 154 .rx_param = &byt_rx_param, 155 }, 156 [PORT_BSW0] = { 157 .type = LPSS_BSW_SSP, 158 .port_id = 0, 159 .setup = lpss_spi_setup, 160 .tx_param = &bsw0_tx_param, 161 .rx_param = &bsw0_rx_param, 162 }, 163 [PORT_BSW1] = { 164 .type = LPSS_BSW_SSP, 165 .port_id = 1, 166 .setup = lpss_spi_setup, 167 .tx_param = &bsw1_tx_param, 168 .rx_param = &bsw1_rx_param, 169 }, 170 [PORT_BSW2] = { 171 .type = LPSS_BSW_SSP, 172 .port_id = 2, 173 .setup = lpss_spi_setup, 174 .tx_param = &bsw2_tx_param, 175 .rx_param = &bsw2_rx_param, 176 }, 177 [PORT_MRFLD] = { 178 .type = PXA27x_SSP, 179 .max_clk_rate = 25000000, 180 .setup = mrfld_spi_setup, 181 }, 182 [PORT_QUARK_X1000] = { 183 .type = QUARK_X1000_SSP, 184 .port_id = -1, 185 .num_chipselect = 1, 186 .max_clk_rate = 50000000, 187 }, 188 [PORT_LPT] = { 189 .type = LPSS_LPT_SSP, 190 .port_id = 0, 191 .setup = lpss_spi_setup, 192 .tx_param = &lpt_tx_param, 193 .rx_param = &lpt_rx_param, 194 }, 195 }; 196 197 static int pxa2xx_spi_pci_probe(struct pci_dev *dev, 198 const struct pci_device_id *ent) 199 { 200 struct platform_device_info pi; 201 int ret; 202 struct platform_device *pdev; 203 struct pxa2xx_spi_controller spi_pdata; 204 struct ssp_device *ssp; 205 struct pxa_spi_info *c; 206 char buf[40]; 207 208 ret = pcim_enable_device(dev); 209 if (ret) 210 return ret; 211 212 ret = pcim_iomap_regions(dev, 1 << 0, "PXA2xx SPI"); 213 if (ret) 214 return ret; 215 216 c = &spi_info_configs[ent->driver_data]; 217 if (c->setup) { 218 ret = c->setup(dev, c); 219 if (ret) 220 return ret; 221 } 222 223 memset(&spi_pdata, 0, sizeof(spi_pdata)); 224 spi_pdata.num_chipselect = (c->num_chipselect > 0) ? c->num_chipselect : dev->devfn; 225 spi_pdata.dma_filter = c->dma_filter; 226 spi_pdata.tx_param = c->tx_param; 227 spi_pdata.rx_param = c->rx_param; 228 spi_pdata.enable_dma = c->rx_param && c->tx_param; 229 spi_pdata.dma_burst_size = c->dma_burst_size ? c->dma_burst_size : 1; 230 231 ssp = &spi_pdata.ssp; 232 ssp->phys_base = pci_resource_start(dev, 0); 233 ssp->mmio_base = pcim_iomap_table(dev)[0]; 234 ssp->port_id = (c->port_id >= 0) ? c->port_id : dev->devfn; 235 ssp->type = c->type; 236 237 pci_set_master(dev); 238 239 ret = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES); 240 if (ret < 0) 241 return ret; 242 ssp->irq = pci_irq_vector(dev, 0); 243 244 snprintf(buf, sizeof(buf), "pxa2xx-spi.%d", ssp->port_id); 245 ssp->clk = clk_register_fixed_rate(&dev->dev, buf , NULL, 0, 246 c->max_clk_rate); 247 if (IS_ERR(ssp->clk)) 248 return PTR_ERR(ssp->clk); 249 250 memset(&pi, 0, sizeof(pi)); 251 pi.fwnode = dev->dev.fwnode; 252 pi.parent = &dev->dev; 253 pi.name = "pxa2xx-spi"; 254 pi.id = ssp->port_id; 255 pi.data = &spi_pdata; 256 pi.size_data = sizeof(spi_pdata); 257 258 pdev = platform_device_register_full(&pi); 259 if (IS_ERR(pdev)) { 260 clk_unregister(ssp->clk); 261 return PTR_ERR(pdev); 262 } 263 264 pci_set_drvdata(dev, pdev); 265 266 return 0; 267 } 268 269 static void pxa2xx_spi_pci_remove(struct pci_dev *dev) 270 { 271 struct platform_device *pdev = pci_get_drvdata(dev); 272 struct pxa2xx_spi_controller *spi_pdata; 273 274 spi_pdata = dev_get_platdata(&pdev->dev); 275 276 platform_device_unregister(pdev); 277 clk_unregister(spi_pdata->ssp.clk); 278 } 279 280 static const struct pci_device_id pxa2xx_spi_pci_devices[] = { 281 { PCI_VDEVICE(INTEL, 0x0935), PORT_QUARK_X1000 }, 282 { PCI_VDEVICE(INTEL, 0x0f0e), PORT_BYT }, 283 { PCI_VDEVICE(INTEL, 0x1194), PORT_MRFLD }, 284 { PCI_VDEVICE(INTEL, 0x228e), PORT_BSW0 }, 285 { PCI_VDEVICE(INTEL, 0x2290), PORT_BSW1 }, 286 { PCI_VDEVICE(INTEL, 0x22ac), PORT_BSW2 }, 287 { PCI_VDEVICE(INTEL, 0x2e6a), PORT_CE4100 }, 288 { PCI_VDEVICE(INTEL, 0x9ce6), PORT_LPT }, 289 { }, 290 }; 291 MODULE_DEVICE_TABLE(pci, pxa2xx_spi_pci_devices); 292 293 static struct pci_driver pxa2xx_spi_pci_driver = { 294 .name = "pxa2xx_spi_pci", 295 .id_table = pxa2xx_spi_pci_devices, 296 .probe = pxa2xx_spi_pci_probe, 297 .remove = pxa2xx_spi_pci_remove, 298 }; 299 300 module_pci_driver(pxa2xx_spi_pci_driver); 301 302 MODULE_DESCRIPTION("CE4100/LPSS PCI-SPI glue code for PXA's driver"); 303 MODULE_LICENSE("GPL v2"); 304 MODULE_AUTHOR("Sebastian Andrzej Siewior <bigeasy@linutronix.de>"); 305