2 * Copyright (C) 2007 Wolfgang Grandegger <wg@grandegger.com>
3 * Copyright (C) 2008 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
4 * Copyright (C) 2009 Matthias Fuchs <matthias.fuchs@esd.eu>, esd gmbh
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the version 2 of the GNU General Public License
8 * as published by the Free Software Foundation
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software Foundation,
17 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 #include <linux/kernel.h>
21 #include <linux/module.h>
22 #include <linux/interrupt.h>
23 #include <linux/netdevice.h>
24 #include <linux/delay.h>
25 #include <linux/pci.h>
26 #include <linux/pci_ids.h>
27 #include <linux/can.h>
28 #include <linux/can/dev.h>
29 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
37 #define DRV_NAME "esd_pci"
39 MODULE_AUTHOR("Matthias Fuchs <matthias.fuchs@esd.eu");
40 MODULE_DESCRIPTION("Socket-CAN driver for esd PCI/PMC/CPCI/PCIe/PCI104 " \
42 MODULE_SUPPORTED_DEVICE("esd CAN-PCI/200, CAN-PCI/266, CAN-PMC266, " \
43 "CAN-PCIe/2000, CAN-CPCI/200, CAN-PCI104");
44 MODULE_LICENSE("GPL v2");
46 /* Maximum number of interfaces supported on one card. */
47 #define ESD_PCI_MAX_CAN 2
50 struct pci_dev *pci_dev;
51 struct net_device *dev[ESD_PCI_MAX_CAN];
52 void __iomem *conf_addr;
53 void __iomem *base_addr;
56 #define ESD_PCI_CAN_CLOCK (16000000 / 2)
58 #define ESD_PCI_OCR (OCR_TX0_PUSHPULL | OCR_TX1_PUSHPULL)
61 #define CHANNEL_OFFSET 0x100
63 #define INTCSR_OFFSET 0x4c /* Offset in PLX9050 conf registers */
64 #define INTCSR_LINTI1 (1 << 0)
65 #define INTCSR_PCI (1 << 6)
67 #define INTCSR9056_OFFSET 0x68 /* Offset in PLX9056 conf registers */
68 #define INTCSR9056_LINTI (1 << 11)
69 #define INTCSR9056_PCI (1 << 8)
71 #ifndef PCI_DEVICE_ID_PLX_9056
72 # define PCI_DEVICE_ID_PLX_9056 0x9056
75 /* PCI subsystem IDs of esd's SJA1000 based CAN cards */
77 /* CAN-PCI/200: PCI, 33MHz only, bridge: PLX9050 */
78 #define ESD_PCI_SUB_SYS_ID_PCI200 0x0004
80 /* CAN-PCI/266: PCI, 33/66MHz, bridge: PLX9056 */
81 #define ESD_PCI_SUB_SYS_ID_PCI266 0x0009
83 /* CAN-PMC/266: PMC module, 33/66MHz, bridge: PLX9056 */
84 #define ESD_PCI_SUB_SYS_ID_PMC266 0x000e
86 /* CAN-CPCI/200: Compact PCI, 33MHz only, bridge: PLX9030 */
87 #define ESD_PCI_SUB_SYS_ID_CPCI200 0x010b
89 /* CAN-PCIE/2000: PCI Express 1x, bridge: PEX8311 = PEX8111 + PLX9056 */
90 #define ESD_PCI_SUB_SYS_ID_PCIE2000 0x0200
92 /* CAN-PCI/104: PCI104 module, 33MHz only, bridge: PLX9030 */
93 #define ESD_PCI_SUB_SYS_ID_PCI104200 0x0501
95 static struct pci_device_id esd_pci_tbl[] = {
96 {PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
97 PCI_VENDOR_ID_ESDGMBH, ESD_PCI_SUB_SYS_ID_PCI200},
98 {PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9056,
99 PCI_VENDOR_ID_ESDGMBH, ESD_PCI_SUB_SYS_ID_PCI266},
100 {PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9056,
101 PCI_VENDOR_ID_ESDGMBH, ESD_PCI_SUB_SYS_ID_PMC266},
102 {PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
103 PCI_VENDOR_ID_ESDGMBH, ESD_PCI_SUB_SYS_ID_CPCI200},
104 {PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9056,
105 PCI_VENDOR_ID_ESDGMBH, ESD_PCI_SUB_SYS_ID_PCIE2000},
106 {PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
107 PCI_VENDOR_ID_ESDGMBH, ESD_PCI_SUB_SYS_ID_PCI104200},
111 #define ESD_PCI_BASE_SIZE 0x200
113 MODULE_DEVICE_TABLE(pci, esd_pci_tbl);
115 static u8 esd_pci_read_reg(struct net_device *ndev, int port)
117 return readb((void __iomem *)(ndev->base_addr + port));
120 static void esd_pci_write_reg(struct net_device *ndev, int port, u8 val)
122 writeb(val, (void __iomem *)(ndev->base_addr + port));
125 static void esd_pci_del_chan(struct pci_dev *pdev, struct net_device *ndev)
127 dev_info(&pdev->dev, "Removing device %s\n", ndev->name);
129 unregister_sja1000dev(ndev);
131 free_sja1000dev(ndev);
134 static struct net_device * __devinit esd_pci_add_chan(struct pci_dev *pdev,
135 void __iomem *base_addr)
137 struct net_device *ndev;
138 struct sja1000_priv *priv;
141 ndev = alloc_sja1000dev(0);
143 return ERR_PTR(-ENOMEM);
145 priv = netdev_priv(ndev);
147 ndev->base_addr = (unsigned long)base_addr;
149 priv->read_reg = esd_pci_read_reg;
150 priv->write_reg = esd_pci_write_reg;
152 priv->can.bittiming.clock = ESD_PCI_CAN_CLOCK;
154 priv->ocr = ESD_PCI_OCR;
155 priv->cdr = ESD_PCI_CDR;
157 /* Set and enable PCI interrupts */
158 ndev->irq = pdev->irq;
160 dev_dbg(&pdev->dev, "base_addr=%#lx irq=%d\n",
161 ndev->base_addr, ndev->irq);
163 SET_NETDEV_DEV(ndev, &pdev->dev);
165 err = register_sja1000dev(ndev);
167 dev_err(&pdev->dev, "Failed to register (err=%d)\n", err);
174 free_sja1000dev(ndev);
178 static int __devinit esd_pci_init_one(struct pci_dev *pdev,
179 const struct pci_device_id *ent)
181 struct esd_pci *board;
183 void __iomem *base_addr;
184 void __iomem *conf_addr;
187 "Initializing device %04x:%04x %04x:%04x\n",
188 pdev->vendor, pdev->device,
189 pdev->subsystem_vendor, pdev->subsystem_device);
191 board = kzalloc(sizeof(*board), GFP_KERNEL);
195 err = pci_enable_device(pdev);
199 err = pci_request_regions(pdev, DRV_NAME);
203 conf_addr = pci_iomap(pdev, 0, ESD_PCI_BASE_SIZE);
204 if (conf_addr == NULL) {
206 goto failure_release_pci;
209 board->conf_addr = conf_addr;
211 base_addr = pci_iomap(pdev, 2, ESD_PCI_BASE_SIZE);
212 if (base_addr == NULL) {
214 goto failure_iounmap_conf;
217 board->base_addr = base_addr;
219 board->dev[0] = esd_pci_add_chan(pdev, base_addr);
220 if (IS_ERR(board->dev[0]))
221 goto failure_iounmap_base;
223 /* Check if second channel is available */
224 writeb(MOD_RM, base_addr + CHANNEL_OFFSET + REG_MOD);
225 writeb(CDR_CBP, base_addr + CHANNEL_OFFSET + REG_CDR);
226 writeb(MOD_RM, base_addr + CHANNEL_OFFSET + REG_MOD);
227 if (readb(base_addr + CHANNEL_OFFSET + REG_MOD) == 0x21) {
228 writeb(MOD_SM | MOD_AFM | MOD_STM | MOD_LOM | MOD_RM,
229 base_addr + CHANNEL_OFFSET + REG_MOD);
230 if (readb(base_addr + CHANNEL_OFFSET + REG_MOD) == 0x3f) {
231 writeb(MOD_RM, base_addr + CHANNEL_OFFSET + REG_MOD);
233 esd_pci_add_chan(pdev,
234 base_addr + CHANNEL_OFFSET);
235 if (IS_ERR(board->dev[1]))
236 goto failure_unreg_dev0;
238 writeb(MOD_RM, base_addr + CHANNEL_OFFSET + REG_MOD);
240 writeb(MOD_RM, base_addr + CHANNEL_OFFSET + REG_MOD);
242 if ((pdev->device == PCI_DEVICE_ID_PLX_9050) ||
243 (pdev->device == PCI_DEVICE_ID_PLX_9030)) {
244 /* Enable interrupts in PLX9050 */
245 writel(INTCSR_LINTI1 | INTCSR_PCI,
246 board->conf_addr + INTCSR_OFFSET);
248 /* Enable interrupts in PLX9056*/
249 writel(INTCSR9056_LINTI | INTCSR9056_PCI,
250 board->conf_addr + INTCSR9056_OFFSET);
253 pci_set_drvdata(pdev, board);
258 esd_pci_del_chan(pdev, board->dev[0]);
260 failure_iounmap_base:
261 pci_iounmap(pdev, board->base_addr);
263 failure_iounmap_conf:
264 pci_iounmap(pdev, board->conf_addr);
267 pci_release_regions(pdev);
275 static void __devexit esd_pci_remove_one(struct pci_dev *pdev)
277 struct esd_pci *board = pci_get_drvdata(pdev);
280 if ((pdev->device == PCI_DEVICE_ID_PLX_9050) ||
281 (pdev->device == PCI_DEVICE_ID_PLX_9030)) {
282 /* Disable interrupts in PLX9050*/
283 writel(0, board->conf_addr + INTCSR_OFFSET);
285 /* Disable interrupts in PLX9056*/
286 writel(0, board->conf_addr + INTCSR9056_OFFSET);
289 for (i = 0; i < ESD_PCI_MAX_CAN; i++) {
292 esd_pci_del_chan(pdev, board->dev[i]);
295 pci_iounmap(pdev, board->base_addr);
296 pci_iounmap(pdev, board->conf_addr);
298 pci_release_regions(pdev);
299 pci_disable_device(pdev);
300 pci_set_drvdata(pdev, NULL);
305 static struct pci_driver esd_pci_driver = {
307 .id_table = esd_pci_tbl,
308 .probe = esd_pci_init_one,
309 .remove = __devexit_p(esd_pci_remove_one),
312 static int __init esd_pci_init(void)
314 return pci_register_driver(&esd_pci_driver);
317 static void __exit esd_pci_exit(void)
319 pci_unregister_driver(&esd_pci_driver);
322 module_init(esd_pci_init);
323 module_exit(esd_pci_exit);