diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /drivers/net/can/sja1000 | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'drivers/net/can/sja1000')
-rw-r--r-- | drivers/net/can/sja1000/Kconfig | 42 | ||||
-rw-r--r-- | drivers/net/can/sja1000/Makefile | 3 | ||||
-rw-r--r-- | drivers/net/can/sja1000/ems_pci.c | 18 | ||||
-rw-r--r-- | drivers/net/can/sja1000/ems_pcmcia.c | 330 | ||||
-rw-r--r-- | drivers/net/can/sja1000/kvaser_pci.c | 21 | ||||
-rw-r--r-- | drivers/net/can/sja1000/peak_pci.c | 762 | ||||
-rw-r--r-- | drivers/net/can/sja1000/peak_pcmcia.c | 755 | ||||
-rw-r--r-- | drivers/net/can/sja1000/plx_pci.c | 72 | ||||
-rw-r--r-- | drivers/net/can/sja1000/sja1000.c | 75 | ||||
-rw-r--r-- | drivers/net/can/sja1000/sja1000.h | 3 | ||||
-rw-r--r-- | drivers/net/can/sja1000/sja1000_isa.c | 124 | ||||
-rw-r--r-- | drivers/net/can/sja1000/sja1000_of_platform.c | 30 | ||||
-rw-r--r-- | drivers/net/can/sja1000/sja1000_platform.c | 18 | ||||
-rw-r--r-- | drivers/net/can/sja1000/tscan1.c | 8 |
14 files changed, 168 insertions, 2093 deletions
diff --git a/drivers/net/can/sja1000/Kconfig b/drivers/net/can/sja1000/Kconfig index 92f73c708a3..6fdc031daaa 100644 --- a/drivers/net/can/sja1000/Kconfig +++ b/drivers/net/can/sja1000/Kconfig | |||
@@ -6,6 +6,7 @@ if CAN_SJA1000 | |||
6 | 6 | ||
7 | config CAN_SJA1000_ISA | 7 | config CAN_SJA1000_ISA |
8 | tristate "ISA Bus based legacy SJA1000 driver" | 8 | tristate "ISA Bus based legacy SJA1000 driver" |
9 | depends on ISA | ||
9 | ---help--- | 10 | ---help--- |
10 | This driver adds legacy support for SJA1000 chips connected to | 11 | This driver adds legacy support for SJA1000 chips connected to |
11 | the ISA bus using I/O port, memory mapped or indirect access. | 12 | the ISA bus using I/O port, memory mapped or indirect access. |
@@ -21,20 +22,13 @@ config CAN_SJA1000_PLATFORM | |||
21 | 22 | ||
22 | config CAN_SJA1000_OF_PLATFORM | 23 | config CAN_SJA1000_OF_PLATFORM |
23 | tristate "Generic OF Platform Bus based SJA1000 driver" | 24 | tristate "Generic OF Platform Bus based SJA1000 driver" |
24 | depends on OF | 25 | depends on PPC_OF |
25 | ---help--- | 26 | ---help--- |
26 | This driver adds support for the SJA1000 chips connected to | 27 | This driver adds support for the SJA1000 chips connected to |
27 | the OpenFirmware "platform bus" found on embedded systems with | 28 | the OpenFirmware "platform bus" found on embedded systems with |
28 | OpenFirmware bindings, e.g. if you have a PowerPC based system | 29 | OpenFirmware bindings, e.g. if you have a PowerPC based system |
29 | you may want to enable this option. | 30 | you may want to enable this option. |
30 | 31 | ||
31 | config CAN_EMS_PCMCIA | ||
32 | tristate "EMS CPC-CARD Card" | ||
33 | depends on PCMCIA | ||
34 | ---help--- | ||
35 | This driver is for the one or two channel CPC-CARD cards from | ||
36 | EMS Dr. Thomas Wuensche (http://www.ems-wuensche.de). | ||
37 | |||
38 | config CAN_EMS_PCI | 32 | config CAN_EMS_PCI |
39 | tristate "EMS CPC-PCI, CPC-PCIe and CPC-104P Card" | 33 | tristate "EMS CPC-PCI, CPC-PCIe and CPC-104P Card" |
40 | depends on PCI | 34 | depends on PCI |
@@ -43,39 +37,11 @@ config CAN_EMS_PCI | |||
43 | CPC-PCIe and CPC-104P cards from EMS Dr. Thomas Wuensche | 37 | CPC-PCIe and CPC-104P cards from EMS Dr. Thomas Wuensche |
44 | (http://www.ems-wuensche.de). | 38 | (http://www.ems-wuensche.de). |
45 | 39 | ||
46 | config CAN_PEAK_PCMCIA | ||
47 | tristate "PEAK PCAN-PC Card" | ||
48 | depends on PCMCIA | ||
49 | ---help--- | ||
50 | This driver is for the PCAN-PC Card PCMCIA adapter (1 or 2 channels) | ||
51 | from PEAK-System (http://www.peak-system.com). To compile this | ||
52 | driver as a module, choose M here: the module will be called | ||
53 | peak_pcmcia. | ||
54 | |||
55 | config CAN_PEAK_PCI | ||
56 | tristate "PEAK PCAN-PCI/PCIe/miniPCI Cards" | ||
57 | depends on PCI | ||
58 | ---help--- | ||
59 | This driver is for the PCAN-PCI/PCIe/miniPCI cards | ||
60 | (1, 2, 3 or 4 channels) from PEAK-System Technik | ||
61 | (http://www.peak-system.com). | ||
62 | |||
63 | config CAN_PEAK_PCIEC | ||
64 | bool "PEAK PCAN-ExpressCard Cards" | ||
65 | depends on CAN_PEAK_PCI | ||
66 | select I2C | ||
67 | select I2C_ALGOBIT | ||
68 | default y | ||
69 | ---help--- | ||
70 | Say Y here if you want to use a PCAN-ExpressCard from PEAK-System | ||
71 | Technik. This will also automatically select I2C and I2C_ALGO | ||
72 | configuration options. | ||
73 | |||
74 | config CAN_KVASER_PCI | 40 | config CAN_KVASER_PCI |
75 | tristate "Kvaser PCIcanx and Kvaser PCIcan PCI Cards" | 41 | tristate "Kvaser PCIcanx and Kvaser PCIcan PCI Cards" |
76 | depends on PCI | 42 | depends on PCI |
77 | ---help--- | 43 | ---help--- |
78 | This driver is for the PCIcanx and PCIcan cards (1, 2 or | 44 | This driver is for the the PCIcanx and PCIcan cards (1, 2 or |
79 | 4 channel) from Kvaser (http://www.kvaser.com). | 45 | 4 channel) from Kvaser (http://www.kvaser.com). |
80 | 46 | ||
81 | config CAN_PLX_PCI | 47 | config CAN_PLX_PCI |
@@ -92,8 +58,6 @@ config CAN_PLX_PCI | |||
92 | - esd CAN-PCIe/2000 | 58 | - esd CAN-PCIe/2000 |
93 | - Marathon CAN-bus-PCI card (http://www.marathon.ru/) | 59 | - Marathon CAN-bus-PCI card (http://www.marathon.ru/) |
94 | - TEWS TECHNOLOGIES TPMC810 card (http://www.tews.com/) | 60 | - TEWS TECHNOLOGIES TPMC810 card (http://www.tews.com/) |
95 | - IXXAT Automation PC-I 04/PCI card (http://www.ixxat.com/) | ||
96 | - Connect Tech Inc. CANpro/104-Plus Opto (CRG001) card (http://www.connecttech.com) | ||
97 | 61 | ||
98 | config CAN_TSCAN1 | 62 | config CAN_TSCAN1 |
99 | tristate "TS-CAN1 PC104 boards" | 63 | tristate "TS-CAN1 PC104 boards" |
diff --git a/drivers/net/can/sja1000/Makefile b/drivers/net/can/sja1000/Makefile index b3d05cbfec3..2c591eb321c 100644 --- a/drivers/net/can/sja1000/Makefile +++ b/drivers/net/can/sja1000/Makefile | |||
@@ -6,11 +6,8 @@ obj-$(CONFIG_CAN_SJA1000) += sja1000.o | |||
6 | obj-$(CONFIG_CAN_SJA1000_ISA) += sja1000_isa.o | 6 | obj-$(CONFIG_CAN_SJA1000_ISA) += sja1000_isa.o |
7 | obj-$(CONFIG_CAN_SJA1000_PLATFORM) += sja1000_platform.o | 7 | obj-$(CONFIG_CAN_SJA1000_PLATFORM) += sja1000_platform.o |
8 | obj-$(CONFIG_CAN_SJA1000_OF_PLATFORM) += sja1000_of_platform.o | 8 | obj-$(CONFIG_CAN_SJA1000_OF_PLATFORM) += sja1000_of_platform.o |
9 | obj-$(CONFIG_CAN_EMS_PCMCIA) += ems_pcmcia.o | ||
10 | obj-$(CONFIG_CAN_EMS_PCI) += ems_pci.o | 9 | obj-$(CONFIG_CAN_EMS_PCI) += ems_pci.o |
11 | obj-$(CONFIG_CAN_KVASER_PCI) += kvaser_pci.o | 10 | obj-$(CONFIG_CAN_KVASER_PCI) += kvaser_pci.o |
12 | obj-$(CONFIG_CAN_PEAK_PCMCIA) += peak_pcmcia.o | ||
13 | obj-$(CONFIG_CAN_PEAK_PCI) += peak_pci.o | ||
14 | obj-$(CONFIG_CAN_PLX_PCI) += plx_pci.o | 11 | obj-$(CONFIG_CAN_PLX_PCI) += plx_pci.o |
15 | obj-$(CONFIG_CAN_TSCAN1) += tscan1.o | 12 | obj-$(CONFIG_CAN_TSCAN1) += tscan1.o |
16 | 13 | ||
diff --git a/drivers/net/can/sja1000/ems_pci.c b/drivers/net/can/sja1000/ems_pci.c index 036a326836b..36f4f9780c3 100644 --- a/drivers/net/can/sja1000/ems_pci.c +++ b/drivers/net/can/sja1000/ems_pci.c | |||
@@ -220,8 +220,8 @@ static void ems_pci_card_reset(struct ems_pci_card *card) | |||
220 | * Probe PCI device for EMS CAN signature and register each available | 220 | * Probe PCI device for EMS CAN signature and register each available |
221 | * CAN channel to SJA1000 Socket-CAN subsystem. | 221 | * CAN channel to SJA1000 Socket-CAN subsystem. |
222 | */ | 222 | */ |
223 | static int ems_pci_add_card(struct pci_dev *pdev, | 223 | static int __devinit ems_pci_add_card(struct pci_dev *pdev, |
224 | const struct pci_device_id *ent) | 224 | const struct pci_device_id *ent) |
225 | { | 225 | { |
226 | struct sja1000_priv *priv; | 226 | struct sja1000_priv *priv; |
227 | struct net_device *dev; | 227 | struct net_device *dev; |
@@ -371,4 +371,16 @@ static struct pci_driver ems_pci_driver = { | |||
371 | .remove = ems_pci_del_card, | 371 | .remove = ems_pci_del_card, |
372 | }; | 372 | }; |
373 | 373 | ||
374 | module_pci_driver(ems_pci_driver); | 374 | static int __init ems_pci_init(void) |
375 | { | ||
376 | return pci_register_driver(&ems_pci_driver); | ||
377 | } | ||
378 | |||
379 | static void __exit ems_pci_exit(void) | ||
380 | { | ||
381 | pci_unregister_driver(&ems_pci_driver); | ||
382 | } | ||
383 | |||
384 | module_init(ems_pci_init); | ||
385 | module_exit(ems_pci_exit); | ||
386 | |||
diff --git a/drivers/net/can/sja1000/ems_pcmcia.c b/drivers/net/can/sja1000/ems_pcmcia.c deleted file mode 100644 index 5c2f3fbbf5a..00000000000 --- a/drivers/net/can/sja1000/ems_pcmcia.c +++ /dev/null | |||
@@ -1,330 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008 Sebastian Haas (initial chardev implementation) | ||
3 | * Copyright (C) 2010 Markus Plessing <plessing@ems-wuensche.com> | ||
4 | * Rework for mainline by Oliver Hartkopp <socketcan@hartkopp.net> | ||
5 | * | ||
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 | ||
9 | * | ||
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. | ||
14 | */ | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/netdevice.h> | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <pcmcia/cistpl.h> | ||
23 | #include <pcmcia/ds.h> | ||
24 | #include <linux/can.h> | ||
25 | #include <linux/can/dev.h> | ||
26 | #include "sja1000.h" | ||
27 | |||
28 | #define DRV_NAME "ems_pcmcia" | ||
29 | |||
30 | MODULE_AUTHOR("Markus Plessing <plessing@ems-wuensche.com>"); | ||
31 | MODULE_DESCRIPTION("Socket-CAN driver for EMS CPC-CARD cards"); | ||
32 | MODULE_SUPPORTED_DEVICE("EMS CPC-CARD CAN card"); | ||
33 | MODULE_LICENSE("GPL v2"); | ||
34 | |||
35 | #define EMS_PCMCIA_MAX_CHAN 2 | ||
36 | |||
37 | struct ems_pcmcia_card { | ||
38 | int channels; | ||
39 | struct pcmcia_device *pcmcia_dev; | ||
40 | struct net_device *net_dev[EMS_PCMCIA_MAX_CHAN]; | ||
41 | void __iomem *base_addr; | ||
42 | }; | ||
43 | |||
44 | #define EMS_PCMCIA_CAN_CLOCK (16000000 / 2) | ||
45 | |||
46 | /* | ||
47 | * The board configuration is probably following: | ||
48 | * RX1 is connected to ground. | ||
49 | * TX1 is not connected. | ||
50 | * CLKO is not connected. | ||
51 | * Setting the OCR register to 0xDA is a good idea. | ||
52 | * This means normal output mode , push-pull and the correct polarity. | ||
53 | */ | ||
54 | #define EMS_PCMCIA_OCR (OCR_TX0_PUSHPULL | OCR_TX1_PUSHPULL) | ||
55 | |||
56 | /* | ||
57 | * In the CDR register, you should set CBP to 1. | ||
58 | * You will probably also want to set the clock divider value to 7 | ||
59 | * (meaning direct oscillator output) because the second SJA1000 chip | ||
60 | * is driven by the first one CLKOUT output. | ||
61 | */ | ||
62 | #define EMS_PCMCIA_CDR (CDR_CBP | CDR_CLKOUT_MASK) | ||
63 | #define EMS_PCMCIA_MEM_SIZE 4096 /* Size of the remapped io-memory */ | ||
64 | #define EMS_PCMCIA_CAN_BASE_OFFSET 0x100 /* Offset where controllers starts */ | ||
65 | #define EMS_PCMCIA_CAN_CTRL_SIZE 0x80 /* Memory size for each controller */ | ||
66 | |||
67 | #define EMS_CMD_RESET 0x00 /* Perform a reset of the card */ | ||
68 | #define EMS_CMD_MAP 0x03 /* Map CAN controllers into card' memory */ | ||
69 | #define EMS_CMD_UMAP 0x02 /* Unmap CAN controllers from card' memory */ | ||
70 | |||
71 | static struct pcmcia_device_id ems_pcmcia_tbl[] = { | ||
72 | PCMCIA_DEVICE_PROD_ID123("EMS_T_W", "CPC-Card", "V2.0", 0xeab1ea23, | ||
73 | 0xa338573f, 0xe4575800), | ||
74 | PCMCIA_DEVICE_NULL, | ||
75 | }; | ||
76 | |||
77 | MODULE_DEVICE_TABLE(pcmcia, ems_pcmcia_tbl); | ||
78 | |||
79 | static u8 ems_pcmcia_read_reg(const struct sja1000_priv *priv, int port) | ||
80 | { | ||
81 | return readb(priv->reg_base + port); | ||
82 | } | ||
83 | |||
84 | static void ems_pcmcia_write_reg(const struct sja1000_priv *priv, int port, | ||
85 | u8 val) | ||
86 | { | ||
87 | writeb(val, priv->reg_base + port); | ||
88 | } | ||
89 | |||
90 | static irqreturn_t ems_pcmcia_interrupt(int irq, void *dev_id) | ||
91 | { | ||
92 | struct ems_pcmcia_card *card = dev_id; | ||
93 | struct net_device *dev; | ||
94 | irqreturn_t retval = IRQ_NONE; | ||
95 | int i, again; | ||
96 | |||
97 | /* Card not present */ | ||
98 | if (readw(card->base_addr) != 0xAA55) | ||
99 | return IRQ_HANDLED; | ||
100 | |||
101 | do { | ||
102 | again = 0; | ||
103 | |||
104 | /* Check interrupt for each channel */ | ||
105 | for (i = 0; i < card->channels; i++) { | ||
106 | dev = card->net_dev[i]; | ||
107 | if (!dev) | ||
108 | continue; | ||
109 | |||
110 | if (sja1000_interrupt(irq, dev) == IRQ_HANDLED) | ||
111 | again = 1; | ||
112 | } | ||
113 | /* At least one channel handled the interrupt */ | ||
114 | if (again) | ||
115 | retval = IRQ_HANDLED; | ||
116 | |||
117 | } while (again); | ||
118 | |||
119 | return retval; | ||
120 | } | ||
121 | |||
122 | /* | ||
123 | * Check if a CAN controller is present at the specified location | ||
124 | * by trying to set 'em into the PeliCAN mode | ||
125 | */ | ||
126 | static inline int ems_pcmcia_check_chan(struct sja1000_priv *priv) | ||
127 | { | ||
128 | /* Make sure SJA1000 is in reset mode */ | ||
129 | ems_pcmcia_write_reg(priv, REG_MOD, 1); | ||
130 | ems_pcmcia_write_reg(priv, REG_CDR, CDR_PELICAN); | ||
131 | |||
132 | /* read reset-values */ | ||
133 | if (ems_pcmcia_read_reg(priv, REG_CDR) == CDR_PELICAN) | ||
134 | return 1; | ||
135 | |||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | static void ems_pcmcia_del_card(struct pcmcia_device *pdev) | ||
140 | { | ||
141 | struct ems_pcmcia_card *card = pdev->priv; | ||
142 | struct net_device *dev; | ||
143 | int i; | ||
144 | |||
145 | free_irq(pdev->irq, card); | ||
146 | |||
147 | for (i = 0; i < card->channels; i++) { | ||
148 | dev = card->net_dev[i]; | ||
149 | if (!dev) | ||
150 | continue; | ||
151 | |||
152 | printk(KERN_INFO "%s: removing %s on channel #%d\n", | ||
153 | DRV_NAME, dev->name, i); | ||
154 | unregister_sja1000dev(dev); | ||
155 | free_sja1000dev(dev); | ||
156 | } | ||
157 | |||
158 | writeb(EMS_CMD_UMAP, card->base_addr); | ||
159 | iounmap(card->base_addr); | ||
160 | kfree(card); | ||
161 | |||
162 | pdev->priv = NULL; | ||
163 | } | ||
164 | |||
165 | /* | ||
166 | * Probe PCI device for EMS CAN signature and register each available | ||
167 | * CAN channel to SJA1000 Socket-CAN subsystem. | ||
168 | */ | ||
169 | static int ems_pcmcia_add_card(struct pcmcia_device *pdev, unsigned long base) | ||
170 | { | ||
171 | struct sja1000_priv *priv; | ||
172 | struct net_device *dev; | ||
173 | struct ems_pcmcia_card *card; | ||
174 | int err, i; | ||
175 | |||
176 | /* Allocating card structures to hold addresses, ... */ | ||
177 | card = kzalloc(sizeof(struct ems_pcmcia_card), GFP_KERNEL); | ||
178 | if (!card) | ||
179 | return -ENOMEM; | ||
180 | |||
181 | pdev->priv = card; | ||
182 | card->channels = 0; | ||
183 | |||
184 | card->base_addr = ioremap(base, EMS_PCMCIA_MEM_SIZE); | ||
185 | if (!card->base_addr) { | ||
186 | err = -ENOMEM; | ||
187 | goto failure_cleanup; | ||
188 | } | ||
189 | |||
190 | /* Check for unique EMS CAN signature */ | ||
191 | if (readw(card->base_addr) != 0xAA55) { | ||
192 | err = -ENODEV; | ||
193 | goto failure_cleanup; | ||
194 | } | ||
195 | |||
196 | /* Request board reset */ | ||
197 | writeb(EMS_CMD_RESET, card->base_addr); | ||
198 | |||
199 | /* Make sure CAN controllers are mapped into card's memory space */ | ||
200 | writeb(EMS_CMD_MAP, card->base_addr); | ||
201 | |||
202 | /* Detect available channels */ | ||
203 | for (i = 0; i < EMS_PCMCIA_MAX_CHAN; i++) { | ||
204 | dev = alloc_sja1000dev(0); | ||
205 | if (!dev) { | ||
206 | err = -ENOMEM; | ||
207 | goto failure_cleanup; | ||
208 | } | ||
209 | |||
210 | card->net_dev[i] = dev; | ||
211 | priv = netdev_priv(dev); | ||
212 | priv->priv = card; | ||
213 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
214 | |||
215 | priv->irq_flags = IRQF_SHARED; | ||
216 | dev->irq = pdev->irq; | ||
217 | priv->reg_base = card->base_addr + EMS_PCMCIA_CAN_BASE_OFFSET + | ||
218 | (i * EMS_PCMCIA_CAN_CTRL_SIZE); | ||
219 | |||
220 | /* Check if channel is present */ | ||
221 | if (ems_pcmcia_check_chan(priv)) { | ||
222 | priv->read_reg = ems_pcmcia_read_reg; | ||
223 | priv->write_reg = ems_pcmcia_write_reg; | ||
224 | priv->can.clock.freq = EMS_PCMCIA_CAN_CLOCK; | ||
225 | priv->ocr = EMS_PCMCIA_OCR; | ||
226 | priv->cdr = EMS_PCMCIA_CDR; | ||
227 | priv->flags |= SJA1000_CUSTOM_IRQ_HANDLER; | ||
228 | |||
229 | /* Register SJA1000 device */ | ||
230 | err = register_sja1000dev(dev); | ||
231 | if (err) { | ||
232 | free_sja1000dev(dev); | ||
233 | goto failure_cleanup; | ||
234 | } | ||
235 | |||
236 | card->channels++; | ||
237 | |||
238 | printk(KERN_INFO "%s: registered %s on channel " | ||
239 | "#%d at 0x%p, irq %d\n", DRV_NAME, dev->name, | ||
240 | i, priv->reg_base, dev->irq); | ||
241 | } else | ||
242 | free_sja1000dev(dev); | ||
243 | } | ||
244 | |||
245 | err = request_irq(dev->irq, &ems_pcmcia_interrupt, IRQF_SHARED, | ||
246 | DRV_NAME, card); | ||
247 | if (!err) | ||
248 | return 0; | ||
249 | |||
250 | failure_cleanup: | ||
251 | ems_pcmcia_del_card(pdev); | ||
252 | return err; | ||
253 | } | ||
254 | |||
255 | /* | ||
256 | * Setup PCMCIA socket and probe for EMS CPC-CARD | ||
257 | */ | ||
258 | static int ems_pcmcia_probe(struct pcmcia_device *dev) | ||
259 | { | ||
260 | int csval; | ||
261 | |||
262 | /* General socket configuration */ | ||
263 | dev->config_flags |= CONF_ENABLE_IRQ; | ||
264 | dev->config_index = 1; | ||
265 | dev->config_regs = PRESENT_OPTION; | ||
266 | |||
267 | /* The io structure describes IO port mapping */ | ||
268 | dev->resource[0]->end = 16; | ||
269 | dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; | ||
270 | dev->resource[1]->end = 16; | ||
271 | dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_16; | ||
272 | dev->io_lines = 5; | ||
273 | |||
274 | /* Allocate a memory window */ | ||
275 | dev->resource[2]->flags = | ||
276 | (WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE); | ||
277 | dev->resource[2]->start = dev->resource[2]->end = 0; | ||
278 | |||
279 | csval = pcmcia_request_window(dev, dev->resource[2], 0); | ||
280 | if (csval) { | ||
281 | dev_err(&dev->dev, "pcmcia_request_window failed (err=%d)\n", | ||
282 | csval); | ||
283 | return 0; | ||
284 | } | ||
285 | |||
286 | csval = pcmcia_map_mem_page(dev, dev->resource[2], dev->config_base); | ||
287 | if (csval) { | ||
288 | dev_err(&dev->dev, "pcmcia_map_mem_page failed (err=%d)\n", | ||
289 | csval); | ||
290 | return 0; | ||
291 | } | ||
292 | |||
293 | csval = pcmcia_enable_device(dev); | ||
294 | if (csval) { | ||
295 | dev_err(&dev->dev, "pcmcia_enable_device failed (err=%d)\n", | ||
296 | csval); | ||
297 | return 0; | ||
298 | } | ||
299 | |||
300 | ems_pcmcia_add_card(dev, dev->resource[2]->start); | ||
301 | return 0; | ||
302 | } | ||
303 | |||
304 | /* | ||
305 | * Release claimed resources | ||
306 | */ | ||
307 | static void ems_pcmcia_remove(struct pcmcia_device *dev) | ||
308 | { | ||
309 | ems_pcmcia_del_card(dev); | ||
310 | pcmcia_disable_device(dev); | ||
311 | } | ||
312 | |||
313 | static struct pcmcia_driver ems_pcmcia_driver = { | ||
314 | .name = DRV_NAME, | ||
315 | .probe = ems_pcmcia_probe, | ||
316 | .remove = ems_pcmcia_remove, | ||
317 | .id_table = ems_pcmcia_tbl, | ||
318 | }; | ||
319 | |||
320 | static int __init ems_pcmcia_init(void) | ||
321 | { | ||
322 | return pcmcia_register_driver(&ems_pcmcia_driver); | ||
323 | } | ||
324 | module_init(ems_pcmcia_init); | ||
325 | |||
326 | static void __exit ems_pcmcia_exit(void) | ||
327 | { | ||
328 | pcmcia_unregister_driver(&ems_pcmcia_driver); | ||
329 | } | ||
330 | module_exit(ems_pcmcia_exit); | ||
diff --git a/drivers/net/can/sja1000/kvaser_pci.c b/drivers/net/can/sja1000/kvaser_pci.c index 37b0381f532..ed004cebd31 100644 --- a/drivers/net/can/sja1000/kvaser_pci.c +++ b/drivers/net/can/sja1000/kvaser_pci.c | |||
@@ -290,8 +290,8 @@ failure: | |||
290 | return err; | 290 | return err; |
291 | } | 291 | } |
292 | 292 | ||
293 | static int kvaser_pci_init_one(struct pci_dev *pdev, | 293 | static int __devinit kvaser_pci_init_one(struct pci_dev *pdev, |
294 | const struct pci_device_id *ent) | 294 | const struct pci_device_id *ent) |
295 | { | 295 | { |
296 | int err; | 296 | int err; |
297 | struct net_device *master_dev = NULL; | 297 | struct net_device *master_dev = NULL; |
@@ -379,7 +379,7 @@ failure: | |||
379 | 379 | ||
380 | } | 380 | } |
381 | 381 | ||
382 | static void kvaser_pci_remove_one(struct pci_dev *pdev) | 382 | static void __devexit kvaser_pci_remove_one(struct pci_dev *pdev) |
383 | { | 383 | { |
384 | struct net_device *dev = pci_get_drvdata(pdev); | 384 | struct net_device *dev = pci_get_drvdata(pdev); |
385 | 385 | ||
@@ -394,7 +394,18 @@ static struct pci_driver kvaser_pci_driver = { | |||
394 | .name = DRV_NAME, | 394 | .name = DRV_NAME, |
395 | .id_table = kvaser_pci_tbl, | 395 | .id_table = kvaser_pci_tbl, |
396 | .probe = kvaser_pci_init_one, | 396 | .probe = kvaser_pci_init_one, |
397 | .remove = kvaser_pci_remove_one, | 397 | .remove = __devexit_p(kvaser_pci_remove_one), |
398 | }; | 398 | }; |
399 | 399 | ||
400 | module_pci_driver(kvaser_pci_driver); | 400 | static int __init kvaser_pci_init(void) |
401 | { | ||
402 | return pci_register_driver(&kvaser_pci_driver); | ||
403 | } | ||
404 | |||
405 | static void __exit kvaser_pci_exit(void) | ||
406 | { | ||
407 | pci_unregister_driver(&kvaser_pci_driver); | ||
408 | } | ||
409 | |||
410 | module_init(kvaser_pci_init); | ||
411 | module_exit(kvaser_pci_exit); | ||
diff --git a/drivers/net/can/sja1000/peak_pci.c b/drivers/net/can/sja1000/peak_pci.c deleted file mode 100644 index d84888f03d9..00000000000 --- a/drivers/net/can/sja1000/peak_pci.c +++ /dev/null | |||
@@ -1,762 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007, 2011 Wolfgang Grandegger <wg@grandegger.com> | ||
3 | * Copyright (C) 2012 Stephane Grosjean <s.grosjean@peak-system.com> | ||
4 | * | ||
5 | * Derived from the PCAN project file driver/src/pcan_pci.c: | ||
6 | * | ||
7 | * Copyright (C) 2001-2006 PEAK System-Technik GmbH | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the version 2 of the GNU General Public License | ||
11 | * as published by the Free Software Foundation | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/netdevice.h> | ||
23 | #include <linux/delay.h> | ||
24 | #include <linux/pci.h> | ||
25 | #include <linux/io.h> | ||
26 | #include <linux/i2c.h> | ||
27 | #include <linux/i2c-algo-bit.h> | ||
28 | #include <linux/can.h> | ||
29 | #include <linux/can/dev.h> | ||
30 | |||
31 | #include "sja1000.h" | ||
32 | |||
33 | MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>"); | ||
34 | MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCI family cards"); | ||
35 | MODULE_SUPPORTED_DEVICE("PEAK PCAN PCI/PCIe/PCIeC miniPCI CAN cards"); | ||
36 | MODULE_SUPPORTED_DEVICE("PEAK PCAN miniPCIe/cPCI PC/104+ PCI/104e CAN Cards"); | ||
37 | MODULE_LICENSE("GPL v2"); | ||
38 | |||
39 | #define DRV_NAME "peak_pci" | ||
40 | |||
41 | struct peak_pciec_card; | ||
42 | struct peak_pci_chan { | ||
43 | void __iomem *cfg_base; /* Common for all channels */ | ||
44 | struct net_device *prev_dev; /* Chain of network devices */ | ||
45 | u16 icr_mask; /* Interrupt mask for fast ack */ | ||
46 | struct peak_pciec_card *pciec_card; /* only for PCIeC LEDs */ | ||
47 | }; | ||
48 | |||
49 | #define PEAK_PCI_CAN_CLOCK (16000000 / 2) | ||
50 | |||
51 | #define PEAK_PCI_CDR (CDR_CBP | CDR_CLKOUT_MASK) | ||
52 | #define PEAK_PCI_OCR OCR_TX0_PUSHPULL | ||
53 | |||
54 | /* | ||
55 | * Important PITA registers | ||
56 | */ | ||
57 | #define PITA_ICR 0x00 /* Interrupt control register */ | ||
58 | #define PITA_GPIOICR 0x18 /* GPIO interface control register */ | ||
59 | #define PITA_MISC 0x1C /* Miscellaneous register */ | ||
60 | |||
61 | #define PEAK_PCI_CFG_SIZE 0x1000 /* Size of the config PCI bar */ | ||
62 | #define PEAK_PCI_CHAN_SIZE 0x0400 /* Size used by the channel */ | ||
63 | |||
64 | #define PEAK_PCI_VENDOR_ID 0x001C /* The PCI device and vendor IDs */ | ||
65 | #define PEAK_PCI_DEVICE_ID 0x0001 /* for PCI/PCIe slot cards */ | ||
66 | #define PEAK_PCIEC_DEVICE_ID 0x0002 /* for ExpressCard slot cards */ | ||
67 | #define PEAK_PCIE_DEVICE_ID 0x0003 /* for nextgen PCIe slot cards */ | ||
68 | #define PEAK_CPCI_DEVICE_ID 0x0004 /* for nextgen cPCI slot cards */ | ||
69 | #define PEAK_MPCI_DEVICE_ID 0x0005 /* for nextgen miniPCI slot cards */ | ||
70 | #define PEAK_PC_104P_DEVICE_ID 0x0006 /* PCAN-PC/104+ cards */ | ||
71 | #define PEAK_PCI_104E_DEVICE_ID 0x0007 /* PCAN-PCI/104 Express cards */ | ||
72 | #define PEAK_MPCIE_DEVICE_ID 0x0008 /* The miniPCIe slot cards */ | ||
73 | |||
74 | #define PEAK_PCI_CHAN_MAX 4 | ||
75 | |||
76 | static const u16 peak_pci_icr_masks[PEAK_PCI_CHAN_MAX] = { | ||
77 | 0x02, 0x01, 0x40, 0x80 | ||
78 | }; | ||
79 | |||
80 | static DEFINE_PCI_DEVICE_TABLE(peak_pci_tbl) = { | ||
81 | {PEAK_PCI_VENDOR_ID, PEAK_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
82 | {PEAK_PCI_VENDOR_ID, PEAK_PCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
83 | {PEAK_PCI_VENDOR_ID, PEAK_MPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
84 | {PEAK_PCI_VENDOR_ID, PEAK_MPCIE_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
85 | {PEAK_PCI_VENDOR_ID, PEAK_PC_104P_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
86 | {PEAK_PCI_VENDOR_ID, PEAK_PCI_104E_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
87 | {PEAK_PCI_VENDOR_ID, PEAK_CPCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
88 | #ifdef CONFIG_CAN_PEAK_PCIEC | ||
89 | {PEAK_PCI_VENDOR_ID, PEAK_PCIEC_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, | ||
90 | #endif | ||
91 | {0,} | ||
92 | }; | ||
93 | |||
94 | MODULE_DEVICE_TABLE(pci, peak_pci_tbl); | ||
95 | |||
96 | #ifdef CONFIG_CAN_PEAK_PCIEC | ||
97 | /* | ||
98 | * PCAN-ExpressCard needs I2C bit-banging configuration option. | ||
99 | */ | ||
100 | |||
101 | /* GPIOICR byte access offsets */ | ||
102 | #define PITA_GPOUT 0x18 /* GPx output value */ | ||
103 | #define PITA_GPIN 0x19 /* GPx input value */ | ||
104 | #define PITA_GPOEN 0x1A /* configure GPx as ouput pin */ | ||
105 | |||
106 | /* I2C GP bits */ | ||
107 | #define PITA_GPIN_SCL 0x01 /* Serial Clock Line */ | ||
108 | #define PITA_GPIN_SDA 0x04 /* Serial DAta line */ | ||
109 | |||
110 | #define PCA9553_1_SLAVEADDR (0xC4 >> 1) | ||
111 | |||
112 | /* PCA9553 LS0 fields values */ | ||
113 | enum { | ||
114 | PCA9553_LOW, | ||
115 | PCA9553_HIGHZ, | ||
116 | PCA9553_PWM0, | ||
117 | PCA9553_PWM1 | ||
118 | }; | ||
119 | |||
120 | /* LEDs control */ | ||
121 | #define PCA9553_ON PCA9553_LOW | ||
122 | #define PCA9553_OFF PCA9553_HIGHZ | ||
123 | #define PCA9553_SLOW PCA9553_PWM0 | ||
124 | #define PCA9553_FAST PCA9553_PWM1 | ||
125 | |||
126 | #define PCA9553_LED(c) (1 << (c)) | ||
127 | #define PCA9553_LED_STATE(s, c) ((s) << ((c) << 1)) | ||
128 | |||
129 | #define PCA9553_LED_ON(c) PCA9553_LED_STATE(PCA9553_ON, c) | ||
130 | #define PCA9553_LED_OFF(c) PCA9553_LED_STATE(PCA9553_OFF, c) | ||
131 | #define PCA9553_LED_SLOW(c) PCA9553_LED_STATE(PCA9553_SLOW, c) | ||
132 | #define PCA9553_LED_FAST(c) PCA9553_LED_STATE(PCA9553_FAST, c) | ||
133 | #define PCA9553_LED_MASK(c) PCA9553_LED_STATE(0x03, c) | ||
134 | |||
135 | #define PCA9553_LED_OFF_ALL (PCA9553_LED_OFF(0) | PCA9553_LED_OFF(1)) | ||
136 | |||
137 | #define PCA9553_LS0_INIT 0x40 /* initial value (!= from 0x00) */ | ||
138 | |||
139 | struct peak_pciec_chan { | ||
140 | struct net_device *netdev; | ||
141 | unsigned long prev_rx_bytes; | ||
142 | unsigned long prev_tx_bytes; | ||
143 | }; | ||
144 | |||
145 | struct peak_pciec_card { | ||
146 | void __iomem *cfg_base; /* Common for all channels */ | ||
147 | void __iomem *reg_base; /* first channel base address */ | ||
148 | u8 led_cache; /* leds state cache */ | ||
149 | |||
150 | /* PCIExpressCard i2c data */ | ||
151 | struct i2c_algo_bit_data i2c_bit; | ||
152 | struct i2c_adapter led_chip; | ||
153 | struct delayed_work led_work; /* led delayed work */ | ||
154 | int chan_count; | ||
155 | struct peak_pciec_chan channel[PEAK_PCI_CHAN_MAX]; | ||
156 | }; | ||
157 | |||
158 | /* "normal" pci register write callback is overloaded for leds control */ | ||
159 | static void peak_pci_write_reg(const struct sja1000_priv *priv, | ||
160 | int port, u8 val); | ||
161 | |||
162 | static inline void pita_set_scl_highz(struct peak_pciec_card *card) | ||
163 | { | ||
164 | u8 gp_outen = readb(card->cfg_base + PITA_GPOEN) & ~PITA_GPIN_SCL; | ||
165 | writeb(gp_outen, card->cfg_base + PITA_GPOEN); | ||
166 | } | ||
167 | |||
168 | static inline void pita_set_sda_highz(struct peak_pciec_card *card) | ||
169 | { | ||
170 | u8 gp_outen = readb(card->cfg_base + PITA_GPOEN) & ~PITA_GPIN_SDA; | ||
171 | writeb(gp_outen, card->cfg_base + PITA_GPOEN); | ||
172 | } | ||
173 | |||
174 | static void peak_pciec_init_pita_gpio(struct peak_pciec_card *card) | ||
175 | { | ||
176 | /* raise SCL & SDA GPIOs to high-Z */ | ||
177 | pita_set_scl_highz(card); | ||
178 | pita_set_sda_highz(card); | ||
179 | } | ||
180 | |||
181 | static void pita_setsda(void *data, int state) | ||
182 | { | ||
183 | struct peak_pciec_card *card = (struct peak_pciec_card *)data; | ||
184 | u8 gp_out, gp_outen; | ||
185 | |||
186 | /* set output sda always to 0 */ | ||
187 | gp_out = readb(card->cfg_base + PITA_GPOUT) & ~PITA_GPIN_SDA; | ||
188 | writeb(gp_out, card->cfg_base + PITA_GPOUT); | ||
189 | |||
190 | /* control output sda with GPOEN */ | ||
191 | gp_outen = readb(card->cfg_base + PITA_GPOEN); | ||
192 | if (state) | ||
193 | gp_outen &= ~PITA_GPIN_SDA; | ||
194 | else | ||
195 | gp_outen |= PITA_GPIN_SDA; | ||
196 | |||
197 | writeb(gp_outen, card->cfg_base + PITA_GPOEN); | ||
198 | } | ||
199 | |||
200 | static void pita_setscl(void *data, int state) | ||
201 | { | ||
202 | struct peak_pciec_card *card = (struct peak_pciec_card *)data; | ||
203 | u8 gp_out, gp_outen; | ||
204 | |||
205 | /* set output scl always to 0 */ | ||
206 | gp_out = readb(card->cfg_base + PITA_GPOUT) & ~PITA_GPIN_SCL; | ||
207 | writeb(gp_out, card->cfg_base + PITA_GPOUT); | ||
208 | |||
209 | /* control output scl with GPOEN */ | ||
210 | gp_outen = readb(card->cfg_base + PITA_GPOEN); | ||
211 | if (state) | ||
212 | gp_outen &= ~PITA_GPIN_SCL; | ||
213 | else | ||
214 | gp_outen |= PITA_GPIN_SCL; | ||
215 | |||
216 | writeb(gp_outen, card->cfg_base + PITA_GPOEN); | ||
217 | } | ||
218 | |||
219 | static int pita_getsda(void *data) | ||
220 | { | ||
221 | struct peak_pciec_card *card = (struct peak_pciec_card *)data; | ||
222 | |||
223 | /* set tristate */ | ||
224 | pita_set_sda_highz(card); | ||
225 | |||
226 | return (readb(card->cfg_base + PITA_GPIN) & PITA_GPIN_SDA) ? 1 : 0; | ||
227 | } | ||
228 | |||
229 | static int pita_getscl(void *data) | ||
230 | { | ||
231 | struct peak_pciec_card *card = (struct peak_pciec_card *)data; | ||
232 | |||
233 | /* set tristate */ | ||
234 | pita_set_scl_highz(card); | ||
235 | |||
236 | return (readb(card->cfg_base + PITA_GPIN) & PITA_GPIN_SCL) ? 1 : 0; | ||
237 | } | ||
238 | |||
239 | /* | ||
240 | * write commands to the LED chip though the I2C-bus of the PCAN-PCIeC | ||
241 | */ | ||
242 | static int peak_pciec_write_pca9553(struct peak_pciec_card *card, | ||
243 | u8 offset, u8 data) | ||
244 | { | ||
245 | u8 buffer[2] = { | ||
246 | offset, | ||
247 | data | ||
248 | }; | ||
249 | struct i2c_msg msg = { | ||
250 | .addr = PCA9553_1_SLAVEADDR, | ||
251 | .len = 2, | ||
252 | .buf = buffer, | ||
253 | }; | ||
254 | int ret; | ||
255 | |||
256 | /* cache led mask */ | ||
257 | if ((offset == 5) && (data == card->led_cache)) | ||
258 | return 0; | ||
259 | |||
260 | ret = i2c_transfer(&card->led_chip, &msg, 1); | ||
261 | if (ret < 0) | ||
262 | return ret; | ||
263 | |||
264 | if (offset == 5) | ||
265 | card->led_cache = data; | ||
266 | |||
267 | return 0; | ||
268 | } | ||
269 | |||
270 | /* | ||
271 | * delayed work callback used to control the LEDs | ||
272 | */ | ||
273 | static void peak_pciec_led_work(struct work_struct *work) | ||
274 | { | ||
275 | struct peak_pciec_card *card = | ||
276 | container_of(work, struct peak_pciec_card, led_work.work); | ||
277 | struct net_device *netdev; | ||
278 | u8 new_led = card->led_cache; | ||
279 | int i, up_count = 0; | ||
280 | |||
281 | /* first check what is to do */ | ||
282 | for (i = 0; i < card->chan_count; i++) { | ||
283 | /* default is: not configured */ | ||
284 | new_led &= ~PCA9553_LED_MASK(i); | ||
285 | new_led |= PCA9553_LED_ON(i); | ||
286 | |||
287 | netdev = card->channel[i].netdev; | ||
288 | if (!netdev || !(netdev->flags & IFF_UP)) | ||
289 | continue; | ||
290 | |||
291 | up_count++; | ||
292 | |||
293 | /* no activity (but configured) */ | ||
294 | new_led &= ~PCA9553_LED_MASK(i); | ||
295 | new_led |= PCA9553_LED_SLOW(i); | ||
296 | |||
297 | /* if bytes counters changed, set fast blinking led */ | ||
298 | if (netdev->stats.rx_bytes != card->channel[i].prev_rx_bytes) { | ||
299 | card->channel[i].prev_rx_bytes = netdev->stats.rx_bytes; | ||
300 | new_led &= ~PCA9553_LED_MASK(i); | ||
301 | new_led |= PCA9553_LED_FAST(i); | ||
302 | } | ||
303 | if (netdev->stats.tx_bytes != card->channel[i].prev_tx_bytes) { | ||
304 | card->channel[i].prev_tx_bytes = netdev->stats.tx_bytes; | ||
305 | new_led &= ~PCA9553_LED_MASK(i); | ||
306 | new_led |= PCA9553_LED_FAST(i); | ||
307 | } | ||
308 | } | ||
309 | |||
310 | /* check if LS0 settings changed, only update i2c if so */ | ||
311 | peak_pciec_write_pca9553(card, 5, new_led); | ||
312 | |||
313 | /* restart timer (except if no more configured channels) */ | ||
314 | if (up_count) | ||
315 | schedule_delayed_work(&card->led_work, HZ); | ||
316 | } | ||
317 | |||
318 | /* | ||
319 | * set LEDs blinking state | ||
320 | */ | ||
321 | static void peak_pciec_set_leds(struct peak_pciec_card *card, u8 led_mask, u8 s) | ||
322 | { | ||
323 | u8 new_led = card->led_cache; | ||
324 | int i; | ||
325 | |||
326 | /* first check what is to do */ | ||
327 | for (i = 0; i < card->chan_count; i++) | ||
328 | if (led_mask & PCA9553_LED(i)) { | ||
329 | new_led &= ~PCA9553_LED_MASK(i); | ||
330 | new_led |= PCA9553_LED_STATE(s, i); | ||
331 | } | ||
332 | |||
333 | /* check if LS0 settings changed, only update i2c if so */ | ||
334 | peak_pciec_write_pca9553(card, 5, new_led); | ||
335 | } | ||
336 | |||
337 | /* | ||
338 | * start one second delayed work to control LEDs | ||
339 | */ | ||
340 | static void peak_pciec_start_led_work(struct peak_pciec_card *card) | ||
341 | { | ||
342 | if (!delayed_work_pending(&card->led_work)) | ||
343 | schedule_delayed_work(&card->led_work, HZ); | ||
344 | } | ||
345 | |||
346 | /* | ||
347 | * stop LEDs delayed work | ||
348 | */ | ||
349 | static void peak_pciec_stop_led_work(struct peak_pciec_card *card) | ||
350 | { | ||
351 | cancel_delayed_work_sync(&card->led_work); | ||
352 | } | ||
353 | |||
354 | /* | ||
355 | * initialize the PCA9553 4-bit I2C-bus LED chip | ||
356 | */ | ||
357 | static int peak_pciec_init_leds(struct peak_pciec_card *card) | ||
358 | { | ||
359 | int err; | ||
360 | |||
361 | /* prescaler for frequency 0: "SLOW" = 1 Hz = "44" */ | ||
362 | err = peak_pciec_write_pca9553(card, 1, 44 / 1); | ||
363 | if (err) | ||
364 | return err; | ||
365 | |||
366 | /* duty cycle 0: 50% */ | ||
367 | err = peak_pciec_write_pca9553(card, 2, 0x80); | ||
368 | if (err) | ||
369 | return err; | ||
370 | |||
371 | /* prescaler for frequency 1: "FAST" = 5 Hz */ | ||
372 | err = peak_pciec_write_pca9553(card, 3, 44 / 5); | ||
373 | if (err) | ||
374 | return err; | ||
375 | |||
376 | /* duty cycle 1: 50% */ | ||
377 | err = peak_pciec_write_pca9553(card, 4, 0x80); | ||
378 | if (err) | ||
379 | return err; | ||
380 | |||
381 | /* switch LEDs to initial state */ | ||
382 | return peak_pciec_write_pca9553(card, 5, PCA9553_LS0_INIT); | ||
383 | } | ||
384 | |||
385 | /* | ||
386 | * restore LEDs state to off peak_pciec_leds_exit | ||
387 | */ | ||
388 | static void peak_pciec_leds_exit(struct peak_pciec_card *card) | ||
389 | { | ||
390 | /* switch LEDs to off */ | ||
391 | peak_pciec_write_pca9553(card, 5, PCA9553_LED_OFF_ALL); | ||
392 | } | ||
393 | |||
394 | /* | ||
395 | * normal write sja1000 register method overloaded to catch when controller | ||
396 | * is started or stopped, to control leds | ||
397 | */ | ||
398 | static void peak_pciec_write_reg(const struct sja1000_priv *priv, | ||
399 | int port, u8 val) | ||
400 | { | ||
401 | struct peak_pci_chan *chan = priv->priv; | ||
402 | struct peak_pciec_card *card = chan->pciec_card; | ||
403 | int c = (priv->reg_base - card->reg_base) / PEAK_PCI_CHAN_SIZE; | ||
404 | |||
405 | /* sja1000 register changes control the leds state */ | ||
406 | if (port == REG_MOD) | ||
407 | switch (val) { | ||
408 | case MOD_RM: | ||
409 | /* Reset Mode: set led on */ | ||
410 | peak_pciec_set_leds(card, PCA9553_LED(c), PCA9553_ON); | ||
411 | break; | ||
412 | case 0x00: | ||
413 | /* Normal Mode: led slow blinking and start led timer */ | ||
414 | peak_pciec_set_leds(card, PCA9553_LED(c), PCA9553_SLOW); | ||
415 | peak_pciec_start_led_work(card); | ||
416 | break; | ||
417 | default: | ||
418 | break; | ||
419 | } | ||
420 | |||
421 | /* call base function */ | ||
422 | peak_pci_write_reg(priv, port, val); | ||
423 | } | ||
424 | |||
425 | static struct i2c_algo_bit_data peak_pciec_i2c_bit_ops = { | ||
426 | .setsda = pita_setsda, | ||
427 | .setscl = pita_setscl, | ||
428 | .getsda = pita_getsda, | ||
429 | .getscl = pita_getscl, | ||
430 | .udelay = 10, | ||
431 | .timeout = HZ, | ||
432 | }; | ||
433 | |||
434 | static int peak_pciec_probe(struct pci_dev *pdev, struct net_device *dev) | ||
435 | { | ||
436 | struct sja1000_priv *priv = netdev_priv(dev); | ||
437 | struct peak_pci_chan *chan = priv->priv; | ||
438 | struct peak_pciec_card *card; | ||
439 | int err; | ||
440 | |||
441 | /* copy i2c object address from 1st channel */ | ||
442 | if (chan->prev_dev) { | ||
443 | struct sja1000_priv *prev_priv = netdev_priv(chan->prev_dev); | ||
444 | struct peak_pci_chan *prev_chan = prev_priv->priv; | ||
445 | |||
446 | card = prev_chan->pciec_card; | ||
447 | if (!card) | ||
448 | return -ENODEV; | ||
449 | |||
450 | /* channel is the first one: do the init part */ | ||
451 | } else { | ||
452 | /* create the bit banging I2C adapter structure */ | ||
453 | card = kzalloc(sizeof(struct peak_pciec_card), GFP_KERNEL); | ||
454 | if (!card) { | ||
455 | dev_err(&pdev->dev, | ||
456 | "failed allocating memory for i2c chip\n"); | ||
457 | return -ENOMEM; | ||
458 | } | ||
459 | |||
460 | card->cfg_base = chan->cfg_base; | ||
461 | card->reg_base = priv->reg_base; | ||
462 | |||
463 | card->led_chip.owner = THIS_MODULE; | ||
464 | card->led_chip.dev.parent = &pdev->dev; | ||
465 | card->led_chip.algo_data = &card->i2c_bit; | ||
466 | strncpy(card->led_chip.name, "peak_i2c", | ||
467 | sizeof(card->led_chip.name)); | ||
468 | |||
469 | card->i2c_bit = peak_pciec_i2c_bit_ops; | ||
470 | card->i2c_bit.udelay = 10; | ||
471 | card->i2c_bit.timeout = HZ; | ||
472 | card->i2c_bit.data = card; | ||
473 | |||
474 | peak_pciec_init_pita_gpio(card); | ||
475 | |||
476 | err = i2c_bit_add_bus(&card->led_chip); | ||
477 | if (err) { | ||
478 | dev_err(&pdev->dev, "i2c init failed\n"); | ||
479 | goto pciec_init_err_1; | ||
480 | } | ||
481 | |||
482 | err = peak_pciec_init_leds(card); | ||
483 | if (err) { | ||
484 | dev_err(&pdev->dev, "leds hardware init failed\n"); | ||
485 | goto pciec_init_err_2; | ||
486 | } | ||
487 | |||
488 | INIT_DELAYED_WORK(&card->led_work, peak_pciec_led_work); | ||
489 | /* PCAN-ExpressCard needs its own callback for leds */ | ||
490 | priv->write_reg = peak_pciec_write_reg; | ||
491 | } | ||
492 | |||
493 | chan->pciec_card = card; | ||
494 | card->channel[card->chan_count++].netdev = dev; | ||
495 | |||
496 | return 0; | ||
497 | |||
498 | pciec_init_err_2: | ||
499 | i2c_del_adapter(&card->led_chip); | ||
500 | |||
501 | pciec_init_err_1: | ||
502 | peak_pciec_init_pita_gpio(card); | ||
503 | kfree(card); | ||
504 | |||
505 | return err; | ||
506 | } | ||
507 | |||
508 | static void peak_pciec_remove(struct peak_pciec_card *card) | ||
509 | { | ||
510 | peak_pciec_stop_led_work(card); | ||
511 | peak_pciec_leds_exit(card); | ||
512 | i2c_del_adapter(&card->led_chip); | ||
513 | peak_pciec_init_pita_gpio(card); | ||
514 | kfree(card); | ||
515 | } | ||
516 | |||
517 | #else /* CONFIG_CAN_PEAK_PCIEC */ | ||
518 | |||
519 | /* | ||
520 | * Placebo functions when PCAN-ExpressCard support is not selected | ||
521 | */ | ||
522 | static inline int peak_pciec_probe(struct pci_dev *pdev, struct net_device *dev) | ||
523 | { | ||
524 | return -ENODEV; | ||
525 | } | ||
526 | |||
527 | static inline void peak_pciec_remove(struct peak_pciec_card *card) | ||
528 | { | ||
529 | } | ||
530 | #endif /* CONFIG_CAN_PEAK_PCIEC */ | ||
531 | |||
532 | static u8 peak_pci_read_reg(const struct sja1000_priv *priv, int port) | ||
533 | { | ||
534 | return readb(priv->reg_base + (port << 2)); | ||
535 | } | ||
536 | |||
537 | static void peak_pci_write_reg(const struct sja1000_priv *priv, | ||
538 | int port, u8 val) | ||
539 | { | ||
540 | writeb(val, priv->reg_base + (port << 2)); | ||
541 | } | ||
542 | |||
543 | static void peak_pci_post_irq(const struct sja1000_priv *priv) | ||
544 | { | ||
545 | struct peak_pci_chan *chan = priv->priv; | ||
546 | u16 icr; | ||
547 | |||
548 | /* Select and clear in PITA stored interrupt */ | ||
549 | icr = readw(chan->cfg_base + PITA_ICR); | ||
550 | if (icr & chan->icr_mask) | ||
551 | writew(chan->icr_mask, chan->cfg_base + PITA_ICR); | ||
552 | } | ||
553 | |||
554 | static int peak_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
555 | { | ||
556 | struct sja1000_priv *priv; | ||
557 | struct peak_pci_chan *chan; | ||
558 | struct net_device *dev; | ||
559 | void __iomem *cfg_base, *reg_base; | ||
560 | u16 sub_sys_id, icr; | ||
561 | int i, err, channels; | ||
562 | |||
563 | err = pci_enable_device(pdev); | ||
564 | if (err) | ||
565 | return err; | ||
566 | |||
567 | err = pci_request_regions(pdev, DRV_NAME); | ||
568 | if (err) | ||
569 | goto failure_disable_pci; | ||
570 | |||
571 | err = pci_read_config_word(pdev, 0x2e, &sub_sys_id); | ||
572 | if (err) | ||
573 | goto failure_release_regions; | ||
574 | |||
575 | dev_dbg(&pdev->dev, "probing device %04x:%04x:%04x\n", | ||
576 | pdev->vendor, pdev->device, sub_sys_id); | ||
577 | |||
578 | err = pci_write_config_word(pdev, 0x44, 0); | ||
579 | if (err) | ||
580 | goto failure_release_regions; | ||
581 | |||
582 | if (sub_sys_id >= 12) | ||
583 | channels = 4; | ||
584 | else if (sub_sys_id >= 10) | ||
585 | channels = 3; | ||
586 | else if (sub_sys_id >= 4) | ||
587 | channels = 2; | ||
588 | else | ||
589 | channels = 1; | ||
590 | |||
591 | cfg_base = pci_iomap(pdev, 0, PEAK_PCI_CFG_SIZE); | ||
592 | if (!cfg_base) { | ||
593 | dev_err(&pdev->dev, "failed to map PCI resource #0\n"); | ||
594 | err = -ENOMEM; | ||
595 | goto failure_release_regions; | ||
596 | } | ||
597 | |||
598 | reg_base = pci_iomap(pdev, 1, PEAK_PCI_CHAN_SIZE * channels); | ||
599 | if (!reg_base) { | ||
600 | dev_err(&pdev->dev, "failed to map PCI resource #1\n"); | ||
601 | err = -ENOMEM; | ||
602 | goto failure_unmap_cfg_base; | ||
603 | } | ||
604 | |||
605 | /* Set GPIO control register */ | ||
606 | writew(0x0005, cfg_base + PITA_GPIOICR + 2); | ||
607 | /* Enable all channels of this card */ | ||
608 | writeb(0x00, cfg_base + PITA_GPIOICR); | ||
609 | /* Toggle reset */ | ||
610 | writeb(0x05, cfg_base + PITA_MISC + 3); | ||
611 | mdelay(5); | ||
612 | /* Leave parport mux mode */ | ||
613 | writeb(0x04, cfg_base + PITA_MISC + 3); | ||
614 | |||
615 | icr = readw(cfg_base + PITA_ICR + 2); | ||
616 | |||
617 | for (i = 0; i < channels; i++) { | ||
618 | dev = alloc_sja1000dev(sizeof(struct peak_pci_chan)); | ||
619 | if (!dev) { | ||
620 | err = -ENOMEM; | ||
621 | goto failure_remove_channels; | ||
622 | } | ||
623 | |||
624 | priv = netdev_priv(dev); | ||
625 | chan = priv->priv; | ||
626 | |||
627 | chan->cfg_base = cfg_base; | ||
628 | priv->reg_base = reg_base + i * PEAK_PCI_CHAN_SIZE; | ||
629 | |||
630 | priv->read_reg = peak_pci_read_reg; | ||
631 | priv->write_reg = peak_pci_write_reg; | ||
632 | priv->post_irq = peak_pci_post_irq; | ||
633 | |||
634 | priv->can.clock.freq = PEAK_PCI_CAN_CLOCK; | ||
635 | priv->ocr = PEAK_PCI_OCR; | ||
636 | priv->cdr = PEAK_PCI_CDR; | ||
637 | /* Neither a slave nor a single device distributes the clock */ | ||
638 | if (channels == 1 || i > 0) | ||
639 | priv->cdr |= CDR_CLK_OFF; | ||
640 | |||
641 | /* Setup interrupt handling */ | ||
642 | priv->irq_flags = IRQF_SHARED; | ||
643 | dev->irq = pdev->irq; | ||
644 | |||
645 | chan->icr_mask = peak_pci_icr_masks[i]; | ||
646 | icr |= chan->icr_mask; | ||
647 | |||
648 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
649 | |||
650 | /* Create chain of SJA1000 devices */ | ||
651 | chan->prev_dev = pci_get_drvdata(pdev); | ||
652 | pci_set_drvdata(pdev, dev); | ||
653 | |||
654 | /* | ||
655 | * PCAN-ExpressCard needs some additional i2c init. | ||
656 | * This must be done *before* register_sja1000dev() but | ||
657 | * *after* devices linkage | ||
658 | */ | ||
659 | if (pdev->device == PEAK_PCIEC_DEVICE_ID) { | ||
660 | err = peak_pciec_probe(pdev, dev); | ||
661 | if (err) { | ||
662 | dev_err(&pdev->dev, | ||
663 | "failed to probe device (err %d)\n", | ||
664 | err); | ||
665 | goto failure_free_dev; | ||
666 | } | ||
667 | } | ||
668 | |||
669 | err = register_sja1000dev(dev); | ||
670 | if (err) { | ||
671 | dev_err(&pdev->dev, "failed to register device\n"); | ||
672 | goto failure_free_dev; | ||
673 | } | ||
674 | |||
675 | dev_info(&pdev->dev, | ||
676 | "%s at reg_base=0x%p cfg_base=0x%p irq=%d\n", | ||
677 | dev->name, priv->reg_base, chan->cfg_base, dev->irq); | ||
678 | } | ||
679 | |||
680 | /* Enable interrupts */ | ||
681 | writew(icr, cfg_base + PITA_ICR + 2); | ||
682 | |||
683 | return 0; | ||
684 | |||
685 | failure_free_dev: | ||
686 | pci_set_drvdata(pdev, chan->prev_dev); | ||
687 | free_sja1000dev(dev); | ||
688 | |||
689 | failure_remove_channels: | ||
690 | /* Disable interrupts */ | ||
691 | writew(0x0, cfg_base + PITA_ICR + 2); | ||
692 | |||
693 | chan = NULL; | ||
694 | for (dev = pci_get_drvdata(pdev); dev; dev = chan->prev_dev) { | ||
695 | unregister_sja1000dev(dev); | ||
696 | free_sja1000dev(dev); | ||
697 | priv = netdev_priv(dev); | ||
698 | chan = priv->priv; | ||
699 | } | ||
700 | |||
701 | /* free any PCIeC resources too */ | ||
702 | if (chan && chan->pciec_card) | ||
703 | peak_pciec_remove(chan->pciec_card); | ||
704 | |||
705 | pci_iounmap(pdev, reg_base); | ||
706 | |||
707 | failure_unmap_cfg_base: | ||
708 | pci_iounmap(pdev, cfg_base); | ||
709 | |||
710 | failure_release_regions: | ||
711 | pci_release_regions(pdev); | ||
712 | |||
713 | failure_disable_pci: | ||
714 | pci_disable_device(pdev); | ||
715 | |||
716 | return err; | ||
717 | } | ||
718 | |||
719 | static void peak_pci_remove(struct pci_dev *pdev) | ||
720 | { | ||
721 | struct net_device *dev = pci_get_drvdata(pdev); /* Last device */ | ||
722 | struct sja1000_priv *priv = netdev_priv(dev); | ||
723 | struct peak_pci_chan *chan = priv->priv; | ||
724 | void __iomem *cfg_base = chan->cfg_base; | ||
725 | void __iomem *reg_base = priv->reg_base; | ||
726 | |||
727 | /* Disable interrupts */ | ||
728 | writew(0x0, cfg_base + PITA_ICR + 2); | ||
729 | |||
730 | /* Loop over all registered devices */ | ||
731 | while (1) { | ||
732 | dev_info(&pdev->dev, "removing device %s\n", dev->name); | ||
733 | unregister_sja1000dev(dev); | ||
734 | free_sja1000dev(dev); | ||
735 | dev = chan->prev_dev; | ||
736 | |||
737 | if (!dev) { | ||
738 | /* do that only for first channel */ | ||
739 | if (chan->pciec_card) | ||
740 | peak_pciec_remove(chan->pciec_card); | ||
741 | break; | ||
742 | } | ||
743 | priv = netdev_priv(dev); | ||
744 | chan = priv->priv; | ||
745 | } | ||
746 | |||
747 | pci_iounmap(pdev, reg_base); | ||
748 | pci_iounmap(pdev, cfg_base); | ||
749 | pci_release_regions(pdev); | ||
750 | pci_disable_device(pdev); | ||
751 | |||
752 | pci_set_drvdata(pdev, NULL); | ||
753 | } | ||
754 | |||
755 | static struct pci_driver peak_pci_driver = { | ||
756 | .name = DRV_NAME, | ||
757 | .id_table = peak_pci_tbl, | ||
758 | .probe = peak_pci_probe, | ||
759 | .remove = peak_pci_remove, | ||
760 | }; | ||
761 | |||
762 | module_pci_driver(peak_pci_driver); | ||
diff --git a/drivers/net/can/sja1000/peak_pcmcia.c b/drivers/net/can/sja1000/peak_pcmcia.c deleted file mode 100644 index f1175142b0a..00000000000 --- a/drivers/net/can/sja1000/peak_pcmcia.c +++ /dev/null | |||
@@ -1,755 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010-2012 Stephane Grosjean <s.grosjean@peak-system.com> | ||
3 | * | ||
4 | * CAN driver for PEAK-System PCAN-PC Card | ||
5 | * Derived from the PCAN project file driver/src/pcan_pccard.c | ||
6 | * Copyright (C) 2006-2010 PEAK System-Technik GmbH | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the version 2 of the GNU General Public License | ||
10 | * as published by the Free Software Foundation | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | */ | ||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/interrupt.h> | ||
20 | #include <linux/netdevice.h> | ||
21 | #include <linux/delay.h> | ||
22 | #include <linux/timer.h> | ||
23 | #include <linux/io.h> | ||
24 | #include <pcmcia/cistpl.h> | ||
25 | #include <pcmcia/ds.h> | ||
26 | #include <linux/can.h> | ||
27 | #include <linux/can/dev.h> | ||
28 | #include "sja1000.h" | ||
29 | |||
30 | MODULE_AUTHOR("Stephane Grosjean <s.grosjean@peak-system.com>"); | ||
31 | MODULE_DESCRIPTION("CAN driver for PEAK-System PCAN-PC Cards"); | ||
32 | MODULE_LICENSE("GPL v2"); | ||
33 | MODULE_SUPPORTED_DEVICE("PEAK PCAN-PC Card"); | ||
34 | |||
35 | /* PEAK-System PCMCIA driver name */ | ||
36 | #define PCC_NAME "peak_pcmcia" | ||
37 | |||
38 | #define PCC_CHAN_MAX 2 | ||
39 | |||
40 | #define PCC_CAN_CLOCK (16000000 / 2) | ||
41 | |||
42 | #define PCC_MANF_ID 0x0377 | ||
43 | #define PCC_CARD_ID 0x0001 | ||
44 | |||
45 | #define PCC_CHAN_SIZE 0x20 | ||
46 | #define PCC_CHAN_OFF(c) ((c) * PCC_CHAN_SIZE) | ||
47 | #define PCC_COMN_OFF (PCC_CHAN_OFF(PCC_CHAN_MAX)) | ||
48 | #define PCC_COMN_SIZE 0x40 | ||
49 | |||
50 | /* common area registers */ | ||
51 | #define PCC_CCR 0x00 | ||
52 | #define PCC_CSR 0x02 | ||
53 | #define PCC_CPR 0x04 | ||
54 | #define PCC_SPI_DIR 0x06 | ||
55 | #define PCC_SPI_DOR 0x08 | ||
56 | #define PCC_SPI_ADR 0x0a | ||
57 | #define PCC_SPI_IR 0x0c | ||
58 | #define PCC_FW_MAJOR 0x10 | ||
59 | #define PCC_FW_MINOR 0x12 | ||
60 | |||
61 | /* CCR bits */ | ||
62 | #define PCC_CCR_CLK_16 0x00 | ||
63 | #define PCC_CCR_CLK_10 0x01 | ||
64 | #define PCC_CCR_CLK_21 0x02 | ||
65 | #define PCC_CCR_CLK_8 0x03 | ||
66 | #define PCC_CCR_CLK_MASK PCC_CCR_CLK_8 | ||
67 | |||
68 | #define PCC_CCR_RST_CHAN(c) (0x01 << ((c) + 2)) | ||
69 | #define PCC_CCR_RST_ALL (PCC_CCR_RST_CHAN(0) | PCC_CCR_RST_CHAN(1)) | ||
70 | #define PCC_CCR_RST_MASK PCC_CCR_RST_ALL | ||
71 | |||
72 | /* led selection bits */ | ||
73 | #define PCC_LED(c) (1 << (c)) | ||
74 | #define PCC_LED_ALL (PCC_LED(0) | PCC_LED(1)) | ||
75 | |||
76 | /* led state value */ | ||
77 | #define PCC_LED_ON 0x00 | ||
78 | #define PCC_LED_FAST 0x01 | ||
79 | #define PCC_LED_SLOW 0x02 | ||
80 | #define PCC_LED_OFF 0x03 | ||
81 | |||
82 | #define PCC_CCR_LED_CHAN(s, c) ((s) << (((c) + 2) << 1)) | ||
83 | |||
84 | #define PCC_CCR_LED_ON_CHAN(c) PCC_CCR_LED_CHAN(PCC_LED_ON, c) | ||
85 | #define PCC_CCR_LED_FAST_CHAN(c) PCC_CCR_LED_CHAN(PCC_LED_FAST, c) | ||
86 | #define PCC_CCR_LED_SLOW_CHAN(c) PCC_CCR_LED_CHAN(PCC_LED_SLOW, c) | ||
87 | #define PCC_CCR_LED_OFF_CHAN(c) PCC_CCR_LED_CHAN(PCC_LED_OFF, c) | ||
88 | #define PCC_CCR_LED_MASK_CHAN(c) PCC_CCR_LED_OFF_CHAN(c) | ||
89 | #define PCC_CCR_LED_OFF_ALL (PCC_CCR_LED_OFF_CHAN(0) | \ | ||
90 | PCC_CCR_LED_OFF_CHAN(1)) | ||
91 | #define PCC_CCR_LED_MASK PCC_CCR_LED_OFF_ALL | ||
92 | |||
93 | #define PCC_CCR_INIT (PCC_CCR_CLK_16 | PCC_CCR_RST_ALL | PCC_CCR_LED_OFF_ALL) | ||
94 | |||
95 | /* CSR bits */ | ||
96 | #define PCC_CSR_SPI_BUSY 0x04 | ||
97 | |||
98 | /* time waiting for SPI busy (prevent from infinite loop) */ | ||
99 | #define PCC_SPI_MAX_BUSY_WAIT_MS 3 | ||
100 | |||
101 | /* max count of reading the SPI status register waiting for a change */ | ||
102 | /* (prevent from infinite loop) */ | ||
103 | #define PCC_WRITE_MAX_LOOP 1000 | ||
104 | |||
105 | /* max nb of int handled by that isr in one shot (prevent from infinite loop) */ | ||
106 | #define PCC_ISR_MAX_LOOP 10 | ||
107 | |||
108 | /* EEPROM chip instruction set */ | ||
109 | /* note: EEPROM Read/Write instructions include A8 bit */ | ||
110 | #define PCC_EEP_WRITE(a) (0x02 | (((a) & 0x100) >> 5)) | ||
111 | #define PCC_EEP_READ(a) (0x03 | (((a) & 0x100) >> 5)) | ||
112 | #define PCC_EEP_WRDI 0x04 /* EEPROM Write Disable */ | ||
113 | #define PCC_EEP_RDSR 0x05 /* EEPROM Read Status Register */ | ||
114 | #define PCC_EEP_WREN 0x06 /* EEPROM Write Enable */ | ||
115 | |||
116 | /* EEPROM Status Register bits */ | ||
117 | #define PCC_EEP_SR_WEN 0x02 /* EEPROM SR Write Enable bit */ | ||
118 | #define PCC_EEP_SR_WIP 0x01 /* EEPROM SR Write In Progress bit */ | ||
119 | |||
120 | /* | ||
121 | * The board configuration is probably following: | ||
122 | * RX1 is connected to ground. | ||
123 | * TX1 is not connected. | ||
124 | * CLKO is not connected. | ||
125 | * Setting the OCR register to 0xDA is a good idea. | ||
126 | * This means normal output mode, push-pull and the correct polarity. | ||
127 | */ | ||
128 | #define PCC_OCR (OCR_TX0_PUSHPULL | OCR_TX1_PUSHPULL) | ||
129 | |||
130 | /* | ||
131 | * In the CDR register, you should set CBP to 1. | ||
132 | * You will probably also want to set the clock divider value to 7 | ||
133 | * (meaning direct oscillator output) because the second SJA1000 chip | ||
134 | * is driven by the first one CLKOUT output. | ||
135 | */ | ||
136 | #define PCC_CDR (CDR_CBP | CDR_CLKOUT_MASK) | ||
137 | |||
138 | struct pcan_channel { | ||
139 | struct net_device *netdev; | ||
140 | unsigned long prev_rx_bytes; | ||
141 | unsigned long prev_tx_bytes; | ||
142 | }; | ||
143 | |||
144 | /* PCAN-PC Card private structure */ | ||
145 | struct pcan_pccard { | ||
146 | struct pcmcia_device *pdev; | ||
147 | int chan_count; | ||
148 | struct pcan_channel channel[PCC_CHAN_MAX]; | ||
149 | u8 ccr; | ||
150 | u8 fw_major; | ||
151 | u8 fw_minor; | ||
152 | void __iomem *ioport_addr; | ||
153 | struct timer_list led_timer; | ||
154 | }; | ||
155 | |||
156 | static struct pcmcia_device_id pcan_table[] = { | ||
157 | PCMCIA_DEVICE_MANF_CARD(PCC_MANF_ID, PCC_CARD_ID), | ||
158 | PCMCIA_DEVICE_NULL, | ||
159 | }; | ||
160 | |||
161 | MODULE_DEVICE_TABLE(pcmcia, pcan_table); | ||
162 | |||
163 | static void pcan_set_leds(struct pcan_pccard *card, u8 mask, u8 state); | ||
164 | |||
165 | /* | ||
166 | * start timer which controls leds state | ||
167 | */ | ||
168 | static void pcan_start_led_timer(struct pcan_pccard *card) | ||
169 | { | ||
170 | if (!timer_pending(&card->led_timer)) | ||
171 | mod_timer(&card->led_timer, jiffies + HZ); | ||
172 | } | ||
173 | |||
174 | /* | ||
175 | * stop the timer which controls leds state | ||
176 | */ | ||
177 | static void pcan_stop_led_timer(struct pcan_pccard *card) | ||
178 | { | ||
179 | del_timer_sync(&card->led_timer); | ||
180 | } | ||
181 | |||
182 | /* | ||
183 | * read a sja1000 register | ||
184 | */ | ||
185 | static u8 pcan_read_canreg(const struct sja1000_priv *priv, int port) | ||
186 | { | ||
187 | return ioread8(priv->reg_base + port); | ||
188 | } | ||
189 | |||
190 | /* | ||
191 | * write a sja1000 register | ||
192 | */ | ||
193 | static void pcan_write_canreg(const struct sja1000_priv *priv, int port, u8 v) | ||
194 | { | ||
195 | struct pcan_pccard *card = priv->priv; | ||
196 | int c = (priv->reg_base - card->ioport_addr) / PCC_CHAN_SIZE; | ||
197 | |||
198 | /* sja1000 register changes control the leds state */ | ||
199 | if (port == REG_MOD) | ||
200 | switch (v) { | ||
201 | case MOD_RM: | ||
202 | /* Reset Mode: set led on */ | ||
203 | pcan_set_leds(card, PCC_LED(c), PCC_LED_ON); | ||
204 | break; | ||
205 | case 0x00: | ||
206 | /* Normal Mode: led slow blinking and start led timer */ | ||
207 | pcan_set_leds(card, PCC_LED(c), PCC_LED_SLOW); | ||
208 | pcan_start_led_timer(card); | ||
209 | break; | ||
210 | default: | ||
211 | break; | ||
212 | } | ||
213 | |||
214 | iowrite8(v, priv->reg_base + port); | ||
215 | } | ||
216 | |||
217 | /* | ||
218 | * read a register from the common area | ||
219 | */ | ||
220 | static u8 pcan_read_reg(struct pcan_pccard *card, int port) | ||
221 | { | ||
222 | return ioread8(card->ioport_addr + PCC_COMN_OFF + port); | ||
223 | } | ||
224 | |||
225 | /* | ||
226 | * write a register into the common area | ||
227 | */ | ||
228 | static void pcan_write_reg(struct pcan_pccard *card, int port, u8 v) | ||
229 | { | ||
230 | /* cache ccr value */ | ||
231 | if (port == PCC_CCR) { | ||
232 | if (card->ccr == v) | ||
233 | return; | ||
234 | card->ccr = v; | ||
235 | } | ||
236 | |||
237 | iowrite8(v, card->ioport_addr + PCC_COMN_OFF + port); | ||
238 | } | ||
239 | |||
240 | /* | ||
241 | * check whether the card is present by checking its fw version numbers | ||
242 | * against values read at probing time. | ||
243 | */ | ||
244 | static inline int pcan_pccard_present(struct pcan_pccard *card) | ||
245 | { | ||
246 | return ((pcan_read_reg(card, PCC_FW_MAJOR) == card->fw_major) && | ||
247 | (pcan_read_reg(card, PCC_FW_MINOR) == card->fw_minor)); | ||
248 | } | ||
249 | |||
250 | /* | ||
251 | * wait for SPI engine while it is busy | ||
252 | */ | ||
253 | static int pcan_wait_spi_busy(struct pcan_pccard *card) | ||
254 | { | ||
255 | unsigned long timeout = jiffies + | ||
256 | msecs_to_jiffies(PCC_SPI_MAX_BUSY_WAIT_MS) + 1; | ||
257 | |||
258 | /* be sure to read status at least once after sleeping */ | ||
259 | while (pcan_read_reg(card, PCC_CSR) & PCC_CSR_SPI_BUSY) { | ||
260 | if (time_after(jiffies, timeout)) | ||
261 | return -EBUSY; | ||
262 | schedule(); | ||
263 | } | ||
264 | |||
265 | return 0; | ||
266 | } | ||
267 | |||
268 | /* | ||
269 | * write data in device eeprom | ||
270 | */ | ||
271 | static int pcan_write_eeprom(struct pcan_pccard *card, u16 addr, u8 v) | ||
272 | { | ||
273 | u8 status; | ||
274 | int err, i; | ||
275 | |||
276 | /* write instruction enabling write */ | ||
277 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WREN); | ||
278 | err = pcan_wait_spi_busy(card); | ||
279 | if (err) | ||
280 | goto we_spi_err; | ||
281 | |||
282 | /* wait until write enabled */ | ||
283 | for (i = 0; i < PCC_WRITE_MAX_LOOP; i++) { | ||
284 | /* write instruction reading the status register */ | ||
285 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR); | ||
286 | err = pcan_wait_spi_busy(card); | ||
287 | if (err) | ||
288 | goto we_spi_err; | ||
289 | |||
290 | /* get status register value and check write enable bit */ | ||
291 | status = pcan_read_reg(card, PCC_SPI_DIR); | ||
292 | if (status & PCC_EEP_SR_WEN) | ||
293 | break; | ||
294 | } | ||
295 | |||
296 | if (i >= PCC_WRITE_MAX_LOOP) { | ||
297 | dev_err(&card->pdev->dev, | ||
298 | "stop waiting to be allowed to write in eeprom\n"); | ||
299 | return -EIO; | ||
300 | } | ||
301 | |||
302 | /* set address and data */ | ||
303 | pcan_write_reg(card, PCC_SPI_ADR, addr & 0xff); | ||
304 | pcan_write_reg(card, PCC_SPI_DOR, v); | ||
305 | |||
306 | /* | ||
307 | * write instruction with bit[3] set according to address value: | ||
308 | * if addr refers to upper half of the memory array: bit[3] = 1 | ||
309 | */ | ||
310 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRITE(addr)); | ||
311 | err = pcan_wait_spi_busy(card); | ||
312 | if (err) | ||
313 | goto we_spi_err; | ||
314 | |||
315 | /* wait while write in progress */ | ||
316 | for (i = 0; i < PCC_WRITE_MAX_LOOP; i++) { | ||
317 | /* write instruction reading the status register */ | ||
318 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_RDSR); | ||
319 | err = pcan_wait_spi_busy(card); | ||
320 | if (err) | ||
321 | goto we_spi_err; | ||
322 | |||
323 | /* get status register value and check write in progress bit */ | ||
324 | status = pcan_read_reg(card, PCC_SPI_DIR); | ||
325 | if (!(status & PCC_EEP_SR_WIP)) | ||
326 | break; | ||
327 | } | ||
328 | |||
329 | if (i >= PCC_WRITE_MAX_LOOP) { | ||
330 | dev_err(&card->pdev->dev, | ||
331 | "stop waiting for write in eeprom to complete\n"); | ||
332 | return -EIO; | ||
333 | } | ||
334 | |||
335 | /* write instruction disabling write */ | ||
336 | pcan_write_reg(card, PCC_SPI_IR, PCC_EEP_WRDI); | ||
337 | err = pcan_wait_spi_busy(card); | ||
338 | if (err) | ||
339 | goto we_spi_err; | ||
340 | |||
341 | return 0; | ||
342 | |||
343 | we_spi_err: | ||
344 | dev_err(&card->pdev->dev, | ||
345 | "stop waiting (spi engine always busy) err %d\n", err); | ||
346 | |||
347 | return err; | ||
348 | } | ||
349 | |||
350 | static void pcan_set_leds(struct pcan_pccard *card, u8 led_mask, u8 state) | ||
351 | { | ||
352 | u8 ccr = card->ccr; | ||
353 | int i; | ||
354 | |||
355 | for (i = 0; i < card->chan_count; i++) | ||
356 | if (led_mask & PCC_LED(i)) { | ||
357 | /* clear corresponding led bits in ccr */ | ||
358 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
359 | /* then set new bits */ | ||
360 | ccr |= PCC_CCR_LED_CHAN(state, i); | ||
361 | } | ||
362 | |||
363 | /* real write only if something has changed in ccr */ | ||
364 | pcan_write_reg(card, PCC_CCR, ccr); | ||
365 | } | ||
366 | |||
367 | /* | ||
368 | * enable/disable CAN connectors power | ||
369 | */ | ||
370 | static inline void pcan_set_can_power(struct pcan_pccard *card, int onoff) | ||
371 | { | ||
372 | int err; | ||
373 | |||
374 | err = pcan_write_eeprom(card, 0, !!onoff); | ||
375 | if (err) | ||
376 | dev_err(&card->pdev->dev, | ||
377 | "failed setting power %s to can connectors (err %d)\n", | ||
378 | (onoff) ? "on" : "off", err); | ||
379 | } | ||
380 | |||
381 | /* | ||
382 | * set leds state according to channel activity | ||
383 | */ | ||
384 | static void pcan_led_timer(unsigned long arg) | ||
385 | { | ||
386 | struct pcan_pccard *card = (struct pcan_pccard *)arg; | ||
387 | struct net_device *netdev; | ||
388 | int i, up_count = 0; | ||
389 | u8 ccr; | ||
390 | |||
391 | ccr = card->ccr; | ||
392 | for (i = 0; i < card->chan_count; i++) { | ||
393 | /* default is: not configured */ | ||
394 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
395 | ccr |= PCC_CCR_LED_ON_CHAN(i); | ||
396 | |||
397 | netdev = card->channel[i].netdev; | ||
398 | if (!netdev || !(netdev->flags & IFF_UP)) | ||
399 | continue; | ||
400 | |||
401 | up_count++; | ||
402 | |||
403 | /* no activity (but configured) */ | ||
404 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
405 | ccr |= PCC_CCR_LED_SLOW_CHAN(i); | ||
406 | |||
407 | /* if bytes counters changed, set fast blinking led */ | ||
408 | if (netdev->stats.rx_bytes != card->channel[i].prev_rx_bytes) { | ||
409 | card->channel[i].prev_rx_bytes = netdev->stats.rx_bytes; | ||
410 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
411 | ccr |= PCC_CCR_LED_FAST_CHAN(i); | ||
412 | } | ||
413 | if (netdev->stats.tx_bytes != card->channel[i].prev_tx_bytes) { | ||
414 | card->channel[i].prev_tx_bytes = netdev->stats.tx_bytes; | ||
415 | ccr &= ~PCC_CCR_LED_MASK_CHAN(i); | ||
416 | ccr |= PCC_CCR_LED_FAST_CHAN(i); | ||
417 | } | ||
418 | } | ||
419 | |||
420 | /* write the new leds state */ | ||
421 | pcan_write_reg(card, PCC_CCR, ccr); | ||
422 | |||
423 | /* restart timer (except if no more configured channels) */ | ||
424 | if (up_count) | ||
425 | mod_timer(&card->led_timer, jiffies + HZ); | ||
426 | } | ||
427 | |||
428 | /* | ||
429 | * interrupt service routine | ||
430 | */ | ||
431 | static irqreturn_t pcan_isr(int irq, void *dev_id) | ||
432 | { | ||
433 | struct pcan_pccard *card = dev_id; | ||
434 | int irq_handled; | ||
435 | |||
436 | /* prevent from infinite loop */ | ||
437 | for (irq_handled = 0; irq_handled < PCC_ISR_MAX_LOOP; irq_handled++) { | ||
438 | /* handle shared interrupt and next loop */ | ||
439 | int nothing_to_handle = 1; | ||
440 | int i; | ||
441 | |||
442 | /* check interrupt for each channel */ | ||
443 | for (i = 0; i < card->chan_count; i++) { | ||
444 | struct net_device *netdev; | ||
445 | |||
446 | /* | ||
447 | * check whether the card is present before calling | ||
448 | * sja1000_interrupt() to speed up hotplug detection | ||
449 | */ | ||
450 | if (!pcan_pccard_present(card)) { | ||
451 | /* card unplugged during isr */ | ||
452 | return IRQ_NONE; | ||
453 | } | ||
454 | |||
455 | /* | ||
456 | * should check whether all or SJA1000_MAX_IRQ | ||
457 | * interrupts have been handled: loop again to be sure. | ||
458 | */ | ||
459 | netdev = card->channel[i].netdev; | ||
460 | if (netdev && | ||
461 | sja1000_interrupt(irq, netdev) == IRQ_HANDLED) | ||
462 | nothing_to_handle = 0; | ||
463 | } | ||
464 | |||
465 | if (nothing_to_handle) | ||
466 | break; | ||
467 | } | ||
468 | |||
469 | return (irq_handled) ? IRQ_HANDLED : IRQ_NONE; | ||
470 | } | ||
471 | |||
472 | /* | ||
473 | * free all resources used by the channels and switch off leds and can power | ||
474 | */ | ||
475 | static void pcan_free_channels(struct pcan_pccard *card) | ||
476 | { | ||
477 | int i; | ||
478 | u8 led_mask = 0; | ||
479 | |||
480 | for (i = 0; i < card->chan_count; i++) { | ||
481 | struct net_device *netdev; | ||
482 | char name[IFNAMSIZ]; | ||
483 | |||
484 | led_mask |= PCC_LED(i); | ||
485 | |||
486 | netdev = card->channel[i].netdev; | ||
487 | if (!netdev) | ||
488 | continue; | ||
489 | |||
490 | strncpy(name, netdev->name, IFNAMSIZ); | ||
491 | |||
492 | unregister_sja1000dev(netdev); | ||
493 | |||
494 | free_sja1000dev(netdev); | ||
495 | |||
496 | dev_info(&card->pdev->dev, "%s removed\n", name); | ||
497 | } | ||
498 | |||
499 | /* do it only if device not removed */ | ||
500 | if (pcan_pccard_present(card)) { | ||
501 | pcan_set_leds(card, led_mask, PCC_LED_OFF); | ||
502 | pcan_set_can_power(card, 0); | ||
503 | } | ||
504 | } | ||
505 | |||
506 | /* | ||
507 | * check if a CAN controller is present at the specified location | ||
508 | */ | ||
509 | static inline int pcan_channel_present(struct sja1000_priv *priv) | ||
510 | { | ||
511 | /* make sure SJA1000 is in reset mode */ | ||
512 | pcan_write_canreg(priv, REG_MOD, 1); | ||
513 | pcan_write_canreg(priv, REG_CDR, CDR_PELICAN); | ||
514 | |||
515 | /* read reset-values */ | ||
516 | if (pcan_read_canreg(priv, REG_CDR) == CDR_PELICAN) | ||
517 | return 1; | ||
518 | |||
519 | return 0; | ||
520 | } | ||
521 | |||
522 | static int pcan_add_channels(struct pcan_pccard *card) | ||
523 | { | ||
524 | struct pcmcia_device *pdev = card->pdev; | ||
525 | int i, err = 0; | ||
526 | u8 ccr = PCC_CCR_INIT; | ||
527 | |||
528 | /* init common registers (reset channels and leds off) */ | ||
529 | card->ccr = ~ccr; | ||
530 | pcan_write_reg(card, PCC_CCR, ccr); | ||
531 | |||
532 | /* wait 2ms before unresetting channels */ | ||
533 | mdelay(2); | ||
534 | |||
535 | ccr &= ~PCC_CCR_RST_ALL; | ||
536 | pcan_write_reg(card, PCC_CCR, ccr); | ||
537 | |||
538 | /* create one network device per channel detected */ | ||
539 | for (i = 0; i < ARRAY_SIZE(card->channel); i++) { | ||
540 | struct net_device *netdev; | ||
541 | struct sja1000_priv *priv; | ||
542 | |||
543 | netdev = alloc_sja1000dev(0); | ||
544 | if (!netdev) { | ||
545 | err = -ENOMEM; | ||
546 | break; | ||
547 | } | ||
548 | |||
549 | /* update linkages */ | ||
550 | priv = netdev_priv(netdev); | ||
551 | priv->priv = card; | ||
552 | SET_NETDEV_DEV(netdev, &pdev->dev); | ||
553 | |||
554 | priv->irq_flags = IRQF_SHARED; | ||
555 | netdev->irq = pdev->irq; | ||
556 | priv->reg_base = card->ioport_addr + PCC_CHAN_OFF(i); | ||
557 | |||
558 | /* check if channel is present */ | ||
559 | if (!pcan_channel_present(priv)) { | ||
560 | dev_err(&pdev->dev, "channel %d not present\n", i); | ||
561 | free_sja1000dev(netdev); | ||
562 | continue; | ||
563 | } | ||
564 | |||
565 | priv->read_reg = pcan_read_canreg; | ||
566 | priv->write_reg = pcan_write_canreg; | ||
567 | priv->can.clock.freq = PCC_CAN_CLOCK; | ||
568 | priv->ocr = PCC_OCR; | ||
569 | priv->cdr = PCC_CDR; | ||
570 | |||
571 | /* Neither a slave device distributes the clock */ | ||
572 | if (i > 0) | ||
573 | priv->cdr |= CDR_CLK_OFF; | ||
574 | |||
575 | priv->flags |= SJA1000_CUSTOM_IRQ_HANDLER; | ||
576 | |||
577 | /* register SJA1000 device */ | ||
578 | err = register_sja1000dev(netdev); | ||
579 | if (err) { | ||
580 | free_sja1000dev(netdev); | ||
581 | continue; | ||
582 | } | ||
583 | |||
584 | card->channel[i].netdev = netdev; | ||
585 | card->chan_count++; | ||
586 | |||
587 | /* set corresponding led on in the new ccr */ | ||
588 | ccr &= ~PCC_CCR_LED_OFF_CHAN(i); | ||
589 | |||
590 | dev_info(&pdev->dev, | ||
591 | "%s on channel %d at 0x%p irq %d\n", | ||
592 | netdev->name, i, priv->reg_base, pdev->irq); | ||
593 | } | ||
594 | |||
595 | /* write new ccr (change leds state) */ | ||
596 | pcan_write_reg(card, PCC_CCR, ccr); | ||
597 | |||
598 | return err; | ||
599 | } | ||
600 | |||
601 | static int pcan_conf_check(struct pcmcia_device *pdev, void *priv_data) | ||
602 | { | ||
603 | pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; | ||
604 | pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; /* only */ | ||
605 | pdev->io_lines = 10; | ||
606 | |||
607 | /* This reserves IO space but doesn't actually enable it */ | ||
608 | return pcmcia_request_io(pdev); | ||
609 | } | ||
610 | |||
611 | /* | ||
612 | * free all resources used by the device | ||
613 | */ | ||
614 | static void pcan_free(struct pcmcia_device *pdev) | ||
615 | { | ||
616 | struct pcan_pccard *card = pdev->priv; | ||
617 | |||
618 | if (!card) | ||
619 | return; | ||
620 | |||
621 | free_irq(pdev->irq, card); | ||
622 | pcan_stop_led_timer(card); | ||
623 | |||
624 | pcan_free_channels(card); | ||
625 | |||
626 | ioport_unmap(card->ioport_addr); | ||
627 | |||
628 | kfree(card); | ||
629 | pdev->priv = NULL; | ||
630 | } | ||
631 | |||
632 | /* | ||
633 | * setup PCMCIA socket and probe for PEAK-System PC-CARD | ||
634 | */ | ||
635 | static int pcan_probe(struct pcmcia_device *pdev) | ||
636 | { | ||
637 | struct pcan_pccard *card; | ||
638 | int err; | ||
639 | |||
640 | pdev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; | ||
641 | |||
642 | err = pcmcia_loop_config(pdev, pcan_conf_check, NULL); | ||
643 | if (err) { | ||
644 | dev_err(&pdev->dev, "pcmcia_loop_config() error %d\n", err); | ||
645 | goto probe_err_1; | ||
646 | } | ||
647 | |||
648 | if (!pdev->irq) { | ||
649 | dev_err(&pdev->dev, "no irq assigned\n"); | ||
650 | err = -ENODEV; | ||
651 | goto probe_err_1; | ||
652 | } | ||
653 | |||
654 | err = pcmcia_enable_device(pdev); | ||
655 | if (err) { | ||
656 | dev_err(&pdev->dev, "pcmcia_enable_device failed err=%d\n", | ||
657 | err); | ||
658 | goto probe_err_1; | ||
659 | } | ||
660 | |||
661 | card = kzalloc(sizeof(struct pcan_pccard), GFP_KERNEL); | ||
662 | if (!card) { | ||
663 | dev_err(&pdev->dev, "couldn't allocate card memory\n"); | ||
664 | err = -ENOMEM; | ||
665 | goto probe_err_2; | ||
666 | } | ||
667 | |||
668 | card->pdev = pdev; | ||
669 | pdev->priv = card; | ||
670 | |||
671 | /* sja1000 api uses iomem */ | ||
672 | card->ioport_addr = ioport_map(pdev->resource[0]->start, | ||
673 | resource_size(pdev->resource[0])); | ||
674 | if (!card->ioport_addr) { | ||
675 | dev_err(&pdev->dev, "couldn't map io port into io memory\n"); | ||
676 | err = -ENOMEM; | ||
677 | goto probe_err_3; | ||
678 | } | ||
679 | card->fw_major = pcan_read_reg(card, PCC_FW_MAJOR); | ||
680 | card->fw_minor = pcan_read_reg(card, PCC_FW_MINOR); | ||
681 | |||
682 | /* display board name and firware version */ | ||
683 | dev_info(&pdev->dev, "PEAK-System pcmcia card %s fw %d.%d\n", | ||
684 | pdev->prod_id[1] ? pdev->prod_id[1] : "PCAN-PC Card", | ||
685 | card->fw_major, card->fw_minor); | ||
686 | |||
687 | /* detect available channels */ | ||
688 | pcan_add_channels(card); | ||
689 | if (!card->chan_count) { | ||
690 | err = -ENOMEM; | ||
691 | goto probe_err_4; | ||
692 | } | ||
693 | |||
694 | /* init the timer which controls the leds */ | ||
695 | init_timer(&card->led_timer); | ||
696 | card->led_timer.function = pcan_led_timer; | ||
697 | card->led_timer.data = (unsigned long)card; | ||
698 | |||
699 | /* request the given irq */ | ||
700 | err = request_irq(pdev->irq, &pcan_isr, IRQF_SHARED, PCC_NAME, card); | ||
701 | if (err) { | ||
702 | dev_err(&pdev->dev, "couldn't request irq%d\n", pdev->irq); | ||
703 | goto probe_err_5; | ||
704 | } | ||
705 | |||
706 | /* power on the connectors */ | ||
707 | pcan_set_can_power(card, 1); | ||
708 | |||
709 | return 0; | ||
710 | |||
711 | probe_err_5: | ||
712 | /* unregister can devices from network */ | ||
713 | pcan_free_channels(card); | ||
714 | |||
715 | probe_err_4: | ||
716 | ioport_unmap(card->ioport_addr); | ||
717 | |||
718 | probe_err_3: | ||
719 | kfree(card); | ||
720 | pdev->priv = NULL; | ||
721 | |||
722 | probe_err_2: | ||
723 | pcmcia_disable_device(pdev); | ||
724 | |||
725 | probe_err_1: | ||
726 | return err; | ||
727 | } | ||
728 | |||
729 | /* | ||
730 | * release claimed resources | ||
731 | */ | ||
732 | static void pcan_remove(struct pcmcia_device *pdev) | ||
733 | { | ||
734 | pcan_free(pdev); | ||
735 | pcmcia_disable_device(pdev); | ||
736 | } | ||
737 | |||
738 | static struct pcmcia_driver pcan_driver = { | ||
739 | .name = PCC_NAME, | ||
740 | .probe = pcan_probe, | ||
741 | .remove = pcan_remove, | ||
742 | .id_table = pcan_table, | ||
743 | }; | ||
744 | |||
745 | static int __init pcan_init(void) | ||
746 | { | ||
747 | return pcmcia_register_driver(&pcan_driver); | ||
748 | } | ||
749 | module_init(pcan_init); | ||
750 | |||
751 | static void __exit pcan_exit(void) | ||
752 | { | ||
753 | pcmcia_unregister_driver(&pcan_driver); | ||
754 | } | ||
755 | module_exit(pcan_exit); | ||
diff --git a/drivers/net/can/sja1000/plx_pci.c b/drivers/net/can/sja1000/plx_pci.c index 11d1062a944..c7f3d4ea116 100644 --- a/drivers/net/can/sja1000/plx_pci.c +++ b/drivers/net/can/sja1000/plx_pci.c | |||
@@ -43,9 +43,7 @@ MODULE_SUPPORTED_DEVICE("Adlink PCI-7841/cPCI-7841, " | |||
43 | "TEWS TECHNOLOGIES TPMC810, " | 43 | "TEWS TECHNOLOGIES TPMC810, " |
44 | "esd CAN-PCI/CPCI/PCI104/200, " | 44 | "esd CAN-PCI/CPCI/PCI104/200, " |
45 | "esd CAN-PCI/PMC/266, " | 45 | "esd CAN-PCI/PMC/266, " |
46 | "esd CAN-PCIe/2000, " | 46 | "esd CAN-PCIe/2000") |
47 | "Connect Tech Inc. CANpro/104-Plus Opto (CRG001), " | ||
48 | "IXXAT PC-I 04/PCI") | ||
49 | MODULE_LICENSE("GPL v2"); | 47 | MODULE_LICENSE("GPL v2"); |
50 | 48 | ||
51 | #define PLX_PCI_MAX_CHAN 2 | 49 | #define PLX_PCI_MAX_CHAN 2 |
@@ -123,18 +121,11 @@ struct plx_pci_card { | |||
123 | #define ESD_PCI_SUB_SYS_ID_PCIE2000 0x0200 | 121 | #define ESD_PCI_SUB_SYS_ID_PCIE2000 0x0200 |
124 | #define ESD_PCI_SUB_SYS_ID_PCI104200 0x0501 | 122 | #define ESD_PCI_SUB_SYS_ID_PCI104200 0x0501 |
125 | 123 | ||
126 | #define IXXAT_PCI_VENDOR_ID 0x10b5 | ||
127 | #define IXXAT_PCI_DEVICE_ID 0x9050 | ||
128 | #define IXXAT_PCI_SUB_SYS_ID 0x2540 | ||
129 | |||
130 | #define MARATHON_PCI_DEVICE_ID 0x2715 | 124 | #define MARATHON_PCI_DEVICE_ID 0x2715 |
131 | 125 | ||
132 | #define TEWS_PCI_VENDOR_ID 0x1498 | 126 | #define TEWS_PCI_VENDOR_ID 0x1498 |
133 | #define TEWS_PCI_DEVICE_ID_TMPC810 0x032A | 127 | #define TEWS_PCI_DEVICE_ID_TMPC810 0x032A |
134 | 128 | ||
135 | #define CTI_PCI_VENDOR_ID 0x12c4 | ||
136 | #define CTI_PCI_DEVICE_ID_CRG001 0x0900 | ||
137 | |||
138 | static void plx_pci_reset_common(struct pci_dev *pdev); | 129 | static void plx_pci_reset_common(struct pci_dev *pdev); |
139 | static void plx_pci_reset_marathon(struct pci_dev *pdev); | 130 | static void plx_pci_reset_marathon(struct pci_dev *pdev); |
140 | static void plx9056_pci_reset_common(struct pci_dev *pdev); | 131 | static void plx9056_pci_reset_common(struct pci_dev *pdev); |
@@ -162,7 +153,7 @@ struct plx_pci_card_info { | |||
162 | void (*reset_func)(struct pci_dev *pdev); | 153 | void (*reset_func)(struct pci_dev *pdev); |
163 | }; | 154 | }; |
164 | 155 | ||
165 | static struct plx_pci_card_info plx_pci_card_info_adlink = { | 156 | static struct plx_pci_card_info plx_pci_card_info_adlink __devinitdata = { |
166 | "Adlink PCI-7841/cPCI-7841", 2, | 157 | "Adlink PCI-7841/cPCI-7841", 2, |
167 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 158 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
168 | {1, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, | 159 | {1, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, |
@@ -170,7 +161,7 @@ static struct plx_pci_card_info plx_pci_card_info_adlink = { | |||
170 | /* based on PLX9052 */ | 161 | /* based on PLX9052 */ |
171 | }; | 162 | }; |
172 | 163 | ||
173 | static struct plx_pci_card_info plx_pci_card_info_adlink_se = { | 164 | static struct plx_pci_card_info plx_pci_card_info_adlink_se __devinitdata = { |
174 | "Adlink PCI-7841/cPCI-7841 SE", 2, | 165 | "Adlink PCI-7841/cPCI-7841 SE", 2, |
175 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 166 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
176 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, | 167 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x80, 0x80} }, |
@@ -178,7 +169,7 @@ static struct plx_pci_card_info plx_pci_card_info_adlink_se = { | |||
178 | /* based on PLX9052 */ | 169 | /* based on PLX9052 */ |
179 | }; | 170 | }; |
180 | 171 | ||
181 | static struct plx_pci_card_info plx_pci_card_info_esd200 = { | 172 | static struct plx_pci_card_info plx_pci_card_info_esd200 __devinitdata = { |
182 | "esd CAN-PCI/CPCI/PCI104/200", 2, | 173 | "esd CAN-PCI/CPCI/PCI104/200", 2, |
183 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 174 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
184 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, | 175 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, |
@@ -186,7 +177,7 @@ static struct plx_pci_card_info plx_pci_card_info_esd200 = { | |||
186 | /* based on PLX9030/9050 */ | 177 | /* based on PLX9030/9050 */ |
187 | }; | 178 | }; |
188 | 179 | ||
189 | static struct plx_pci_card_info plx_pci_card_info_esd266 = { | 180 | static struct plx_pci_card_info plx_pci_card_info_esd266 __devinitdata = { |
190 | "esd CAN-PCI/PMC/266", 2, | 181 | "esd CAN-PCI/PMC/266", 2, |
191 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 182 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
192 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, | 183 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, |
@@ -194,7 +185,7 @@ static struct plx_pci_card_info plx_pci_card_info_esd266 = { | |||
194 | /* based on PLX9056 */ | 185 | /* based on PLX9056 */ |
195 | }; | 186 | }; |
196 | 187 | ||
197 | static struct plx_pci_card_info plx_pci_card_info_esd2000 = { | 188 | static struct plx_pci_card_info plx_pci_card_info_esd2000 __devinitdata = { |
198 | "esd CAN-PCIe/2000", 2, | 189 | "esd CAN-PCIe/2000", 2, |
199 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 190 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
200 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, | 191 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x100, 0x80} }, |
@@ -202,15 +193,7 @@ static struct plx_pci_card_info plx_pci_card_info_esd2000 = { | |||
202 | /* based on PEX8311 */ | 193 | /* based on PEX8311 */ |
203 | }; | 194 | }; |
204 | 195 | ||
205 | static struct plx_pci_card_info plx_pci_card_info_ixxat = { | 196 | static struct plx_pci_card_info plx_pci_card_info_marathon __devinitdata = { |
206 | "IXXAT PC-I 04/PCI", 2, | ||
207 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | ||
208 | {0, 0x00, 0x00}, { {2, 0x00, 0x80}, {2, 0x200, 0x80} }, | ||
209 | &plx_pci_reset_common | ||
210 | /* based on PLX9050 */ | ||
211 | }; | ||
212 | |||
213 | static struct plx_pci_card_info plx_pci_card_info_marathon = { | ||
214 | "Marathon CAN-bus-PCI", 2, | 197 | "Marathon CAN-bus-PCI", 2, |
215 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 198 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
216 | {0, 0x00, 0x00}, { {2, 0x00, 0x00}, {4, 0x00, 0x00} }, | 199 | {0, 0x00, 0x00}, { {2, 0x00, 0x00}, {4, 0x00, 0x00} }, |
@@ -218,7 +201,7 @@ static struct plx_pci_card_info plx_pci_card_info_marathon = { | |||
218 | /* based on PLX9052 */ | 201 | /* based on PLX9052 */ |
219 | }; | 202 | }; |
220 | 203 | ||
221 | static struct plx_pci_card_info plx_pci_card_info_tews = { | 204 | static struct plx_pci_card_info plx_pci_card_info_tews __devinitdata = { |
222 | "TEWS TECHNOLOGIES TPMC810", 2, | 205 | "TEWS TECHNOLOGIES TPMC810", 2, |
223 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | 206 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, |
224 | {0, 0x00, 0x00}, { {2, 0x000, 0x80}, {2, 0x100, 0x80} }, | 207 | {0, 0x00, 0x00}, { {2, 0x000, 0x80}, {2, 0x100, 0x80} }, |
@@ -226,14 +209,6 @@ static struct plx_pci_card_info plx_pci_card_info_tews = { | |||
226 | /* based on PLX9030 */ | 209 | /* based on PLX9030 */ |
227 | }; | 210 | }; |
228 | 211 | ||
229 | static struct plx_pci_card_info plx_pci_card_info_cti = { | ||
230 | "Connect Tech Inc. CANpro/104-Plus Opto (CRG001)", 2, | ||
231 | PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR, | ||
232 | {0, 0x00, 0x00}, { {2, 0x000, 0x80}, {2, 0x100, 0x80} }, | ||
233 | &plx_pci_reset_common | ||
234 | /* based on PLX9030 */ | ||
235 | }; | ||
236 | |||
237 | static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = { | 212 | static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = { |
238 | { | 213 | { |
239 | /* Adlink PCI-7841/cPCI-7841 */ | 214 | /* Adlink PCI-7841/cPCI-7841 */ |
@@ -292,13 +267,6 @@ static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = { | |||
292 | (kernel_ulong_t)&plx_pci_card_info_esd2000 | 267 | (kernel_ulong_t)&plx_pci_card_info_esd2000 |
293 | }, | 268 | }, |
294 | { | 269 | { |
295 | /* IXXAT PC-I 04/PCI card */ | ||
296 | IXXAT_PCI_VENDOR_ID, IXXAT_PCI_DEVICE_ID, | ||
297 | PCI_ANY_ID, IXXAT_PCI_SUB_SYS_ID, | ||
298 | 0, 0, | ||
299 | (kernel_ulong_t)&plx_pci_card_info_ixxat | ||
300 | }, | ||
301 | { | ||
302 | /* Marathon CAN-bus-PCI card */ | 270 | /* Marathon CAN-bus-PCI card */ |
303 | PCI_VENDOR_ID_PLX, MARATHON_PCI_DEVICE_ID, | 271 | PCI_VENDOR_ID_PLX, MARATHON_PCI_DEVICE_ID, |
304 | PCI_ANY_ID, PCI_ANY_ID, | 272 | PCI_ANY_ID, PCI_ANY_ID, |
@@ -312,13 +280,6 @@ static DEFINE_PCI_DEVICE_TABLE(plx_pci_tbl) = { | |||
312 | 0, 0, | 280 | 0, 0, |
313 | (kernel_ulong_t)&plx_pci_card_info_tews | 281 | (kernel_ulong_t)&plx_pci_card_info_tews |
314 | }, | 282 | }, |
315 | { | ||
316 | /* Connect Tech Inc. CANpro/104-Plus Opto (CRG001) card */ | ||
317 | PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030, | ||
318 | CTI_PCI_VENDOR_ID, CTI_PCI_DEVICE_ID_CRG001, | ||
319 | 0, 0, | ||
320 | (kernel_ulong_t)&plx_pci_card_info_cti | ||
321 | }, | ||
322 | { 0,} | 283 | { 0,} |
323 | }; | 284 | }; |
324 | MODULE_DEVICE_TABLE(pci, plx_pci_tbl); | 285 | MODULE_DEVICE_TABLE(pci, plx_pci_tbl); |
@@ -484,8 +445,8 @@ static void plx_pci_del_card(struct pci_dev *pdev) | |||
484 | * Probe PLX90xx based device for the SJA1000 chips and register each | 445 | * Probe PLX90xx based device for the SJA1000 chips and register each |
485 | * available CAN channel to SJA1000 Socket-CAN subsystem. | 446 | * available CAN channel to SJA1000 Socket-CAN subsystem. |
486 | */ | 447 | */ |
487 | static int plx_pci_add_card(struct pci_dev *pdev, | 448 | static int __devinit plx_pci_add_card(struct pci_dev *pdev, |
488 | const struct pci_device_id *ent) | 449 | const struct pci_device_id *ent) |
489 | { | 450 | { |
490 | struct sja1000_priv *priv; | 451 | struct sja1000_priv *priv; |
491 | struct net_device *dev; | 452 | struct net_device *dev; |
@@ -628,4 +589,15 @@ static struct pci_driver plx_pci_driver = { | |||
628 | .remove = plx_pci_del_card, | 589 | .remove = plx_pci_del_card, |
629 | }; | 590 | }; |
630 | 591 | ||
631 | module_pci_driver(plx_pci_driver); | 592 | static int __init plx_pci_init(void) |
593 | { | ||
594 | return pci_register_driver(&plx_pci_driver); | ||
595 | } | ||
596 | |||
597 | static void __exit plx_pci_exit(void) | ||
598 | { | ||
599 | pci_unregister_driver(&plx_pci_driver); | ||
600 | } | ||
601 | |||
602 | module_init(plx_pci_init); | ||
603 | module_exit(plx_pci_exit); | ||
diff --git a/drivers/net/can/sja1000/sja1000.c b/drivers/net/can/sja1000/sja1000.c index 83ee11eca0e..f501bba1fc6 100644 --- a/drivers/net/can/sja1000/sja1000.c +++ b/drivers/net/can/sja1000/sja1000.c | |||
@@ -40,6 +40,8 @@ | |||
40 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | 40 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
41 | * DAMAGE. | 41 | * DAMAGE. |
42 | * | 42 | * |
43 | * Send feedback to <socketcan-users@lists.berlios.de> | ||
44 | * | ||
43 | */ | 45 | */ |
44 | 46 | ||
45 | #include <linux/module.h> | 47 | #include <linux/module.h> |
@@ -69,7 +71,7 @@ MODULE_AUTHOR("Oliver Hartkopp <oliver.hartkopp@volkswagen.de>"); | |||
69 | MODULE_LICENSE("Dual BSD/GPL"); | 71 | MODULE_LICENSE("Dual BSD/GPL"); |
70 | MODULE_DESCRIPTION(DRV_NAME "CAN netdevice driver"); | 72 | MODULE_DESCRIPTION(DRV_NAME "CAN netdevice driver"); |
71 | 73 | ||
72 | static const struct can_bittiming_const sja1000_bittiming_const = { | 74 | static struct can_bittiming_const sja1000_bittiming_const = { |
73 | .name = DRV_NAME, | 75 | .name = DRV_NAME, |
74 | .tseg1_min = 1, | 76 | .tseg1_min = 1, |
75 | .tseg1_max = 16, | 77 | .tseg1_max = 16, |
@@ -95,16 +97,11 @@ static void sja1000_write_cmdreg(struct sja1000_priv *priv, u8 val) | |||
95 | spin_unlock_irqrestore(&priv->cmdreg_lock, flags); | 97 | spin_unlock_irqrestore(&priv->cmdreg_lock, flags); |
96 | } | 98 | } |
97 | 99 | ||
98 | static int sja1000_is_absent(struct sja1000_priv *priv) | ||
99 | { | ||
100 | return (priv->read_reg(priv, REG_MOD) == 0xFF); | ||
101 | } | ||
102 | |||
103 | static int sja1000_probe_chip(struct net_device *dev) | 100 | static int sja1000_probe_chip(struct net_device *dev) |
104 | { | 101 | { |
105 | struct sja1000_priv *priv = netdev_priv(dev); | 102 | struct sja1000_priv *priv = netdev_priv(dev); |
106 | 103 | ||
107 | if (priv->reg_base && sja1000_is_absent(priv)) { | 104 | if (priv->reg_base && (priv->read_reg(priv, 0) == 0xFF)) { |
108 | printk(KERN_INFO "%s: probing @0x%lX failed\n", | 105 | printk(KERN_INFO "%s: probing @0x%lX failed\n", |
109 | DRV_NAME, dev->base_addr); | 106 | DRV_NAME, dev->base_addr); |
110 | return 0; | 107 | return 0; |
@@ -133,7 +130,7 @@ static void set_reset_mode(struct net_device *dev) | |||
133 | status = priv->read_reg(priv, REG_MOD); | 130 | status = priv->read_reg(priv, REG_MOD); |
134 | } | 131 | } |
135 | 132 | ||
136 | netdev_err(dev, "setting SJA1000 into reset mode failed!\n"); | 133 | dev_err(dev->dev.parent, "setting SJA1000 into reset mode failed!\n"); |
137 | } | 134 | } |
138 | 135 | ||
139 | static void set_normal_mode(struct net_device *dev) | 136 | static void set_normal_mode(struct net_device *dev) |
@@ -156,17 +153,12 @@ static void set_normal_mode(struct net_device *dev) | |||
156 | } | 153 | } |
157 | 154 | ||
158 | /* set chip to normal mode */ | 155 | /* set chip to normal mode */ |
159 | if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) | 156 | priv->write_reg(priv, REG_MOD, 0x00); |
160 | priv->write_reg(priv, REG_MOD, MOD_LOM); | ||
161 | else | ||
162 | priv->write_reg(priv, REG_MOD, 0x00); | ||
163 | |||
164 | udelay(10); | 157 | udelay(10); |
165 | |||
166 | status = priv->read_reg(priv, REG_MOD); | 158 | status = priv->read_reg(priv, REG_MOD); |
167 | } | 159 | } |
168 | 160 | ||
169 | netdev_err(dev, "setting SJA1000 into normal mode failed!\n"); | 161 | dev_err(dev->dev.parent, "setting SJA1000 into normal mode failed!\n"); |
170 | } | 162 | } |
171 | 163 | ||
172 | static void sja1000_start(struct net_device *dev) | 164 | static void sja1000_start(struct net_device *dev) |
@@ -188,6 +180,11 @@ static void sja1000_start(struct net_device *dev) | |||
188 | 180 | ||
189 | static int sja1000_set_mode(struct net_device *dev, enum can_mode mode) | 181 | static int sja1000_set_mode(struct net_device *dev, enum can_mode mode) |
190 | { | 182 | { |
183 | struct sja1000_priv *priv = netdev_priv(dev); | ||
184 | |||
185 | if (!priv->open_time) | ||
186 | return -EINVAL; | ||
187 | |||
191 | switch (mode) { | 188 | switch (mode) { |
192 | case CAN_MODE_START: | 189 | case CAN_MODE_START: |
193 | sja1000_start(dev); | 190 | sja1000_start(dev); |
@@ -214,7 +211,8 @@ static int sja1000_set_bittiming(struct net_device *dev) | |||
214 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) | 211 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) |
215 | btr1 |= 0x80; | 212 | btr1 |= 0x80; |
216 | 213 | ||
217 | netdev_info(dev, "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1); | 214 | dev_info(dev->dev.parent, |
215 | "setting BTR0=0x%02x BTR1=0x%02x\n", btr0, btr1); | ||
218 | 216 | ||
219 | priv->write_reg(priv, REG_BTR0, btr0); | 217 | priv->write_reg(priv, REG_BTR0, btr0); |
220 | priv->write_reg(priv, REG_BTR1, btr1); | 218 | priv->write_reg(priv, REG_BTR1, btr1); |
@@ -310,10 +308,7 @@ static netdev_tx_t sja1000_start_xmit(struct sk_buff *skb, | |||
310 | 308 | ||
311 | can_put_echo_skb(skb, dev, 0); | 309 | can_put_echo_skb(skb, dev, 0); |
312 | 310 | ||
313 | if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) | 311 | sja1000_write_cmdreg(priv, CMD_TR); |
314 | sja1000_write_cmdreg(priv, CMD_TR | CMD_AT); | ||
315 | else | ||
316 | sja1000_write_cmdreg(priv, CMD_TR); | ||
317 | 312 | ||
318 | return NETDEV_TX_OK; | 313 | return NETDEV_TX_OK; |
319 | } | 314 | } |
@@ -385,7 +380,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
385 | 380 | ||
386 | if (isrc & IRQ_DOI) { | 381 | if (isrc & IRQ_DOI) { |
387 | /* data overrun interrupt */ | 382 | /* data overrun interrupt */ |
388 | netdev_dbg(dev, "data overrun interrupt\n"); | 383 | dev_dbg(dev->dev.parent, "data overrun interrupt\n"); |
389 | cf->can_id |= CAN_ERR_CRTL; | 384 | cf->can_id |= CAN_ERR_CRTL; |
390 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; | 385 | cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; |
391 | stats->rx_over_errors++; | 386 | stats->rx_over_errors++; |
@@ -395,7 +390,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
395 | 390 | ||
396 | if (isrc & IRQ_EI) { | 391 | if (isrc & IRQ_EI) { |
397 | /* error warning interrupt */ | 392 | /* error warning interrupt */ |
398 | netdev_dbg(dev, "error warning interrupt\n"); | 393 | dev_dbg(dev->dev.parent, "error warning interrupt\n"); |
399 | 394 | ||
400 | if (status & SR_BS) { | 395 | if (status & SR_BS) { |
401 | state = CAN_STATE_BUS_OFF; | 396 | state = CAN_STATE_BUS_OFF; |
@@ -436,7 +431,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
436 | } | 431 | } |
437 | if (isrc & IRQ_EPI) { | 432 | if (isrc & IRQ_EPI) { |
438 | /* error passive interrupt */ | 433 | /* error passive interrupt */ |
439 | netdev_dbg(dev, "error passive interrupt\n"); | 434 | dev_dbg(dev->dev.parent, "error passive interrupt\n"); |
440 | if (status & SR_ES) | 435 | if (status & SR_ES) |
441 | state = CAN_STATE_ERROR_PASSIVE; | 436 | state = CAN_STATE_ERROR_PASSIVE; |
442 | else | 437 | else |
@@ -444,7 +439,7 @@ static int sja1000_err(struct net_device *dev, uint8_t isrc, uint8_t status) | |||
444 | } | 439 | } |
445 | if (isrc & IRQ_ALI) { | 440 | if (isrc & IRQ_ALI) { |
446 | /* arbitration lost interrupt */ | 441 | /* arbitration lost interrupt */ |
447 | netdev_dbg(dev, "arbitration lost interrupt\n"); | 442 | dev_dbg(dev->dev.parent, "arbitration lost interrupt\n"); |
448 | alc = priv->read_reg(priv, REG_ALC); | 443 | alc = priv->read_reg(priv, REG_ALC); |
449 | priv->can.can_stats.arbitration_lost++; | 444 | priv->can.can_stats.arbitration_lost++; |
450 | stats->tx_errors++; | 445 | stats->tx_errors++; |
@@ -500,26 +495,15 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) | |||
500 | while ((isrc = priv->read_reg(priv, REG_IR)) && (n < SJA1000_MAX_IRQ)) { | 495 | while ((isrc = priv->read_reg(priv, REG_IR)) && (n < SJA1000_MAX_IRQ)) { |
501 | n++; | 496 | n++; |
502 | status = priv->read_reg(priv, REG_SR); | 497 | status = priv->read_reg(priv, REG_SR); |
503 | /* check for absent controller due to hw unplug */ | ||
504 | if (status == 0xFF && sja1000_is_absent(priv)) | ||
505 | return IRQ_NONE; | ||
506 | 498 | ||
507 | if (isrc & IRQ_WUI) | 499 | if (isrc & IRQ_WUI) |
508 | netdev_warn(dev, "wakeup interrupt\n"); | 500 | dev_warn(dev->dev.parent, "wakeup interrupt\n"); |
509 | 501 | ||
510 | if (isrc & IRQ_TI) { | 502 | if (isrc & IRQ_TI) { |
511 | /* transmission buffer released */ | 503 | /* transmission complete interrupt */ |
512 | if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT && | 504 | stats->tx_bytes += priv->read_reg(priv, REG_FI) & 0xf; |
513 | !(status & SR_TCS)) { | 505 | stats->tx_packets++; |
514 | stats->tx_errors++; | 506 | can_get_echo_skb(dev, 0); |
515 | can_free_echo_skb(dev, 0); | ||
516 | } else { | ||
517 | /* transmission complete */ | ||
518 | stats->tx_bytes += | ||
519 | priv->read_reg(priv, REG_FI) & 0xf; | ||
520 | stats->tx_packets++; | ||
521 | can_get_echo_skb(dev, 0); | ||
522 | } | ||
523 | netif_wake_queue(dev); | 507 | netif_wake_queue(dev); |
524 | } | 508 | } |
525 | if (isrc & IRQ_RI) { | 509 | if (isrc & IRQ_RI) { |
@@ -527,9 +511,6 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) | |||
527 | while (status & SR_RBS) { | 511 | while (status & SR_RBS) { |
528 | sja1000_rx(dev); | 512 | sja1000_rx(dev); |
529 | status = priv->read_reg(priv, REG_SR); | 513 | status = priv->read_reg(priv, REG_SR); |
530 | /* check for absent controller */ | ||
531 | if (status == 0xFF && sja1000_is_absent(priv)) | ||
532 | return IRQ_NONE; | ||
533 | } | 514 | } |
534 | } | 515 | } |
535 | if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) { | 516 | if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI)) { |
@@ -543,7 +524,7 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) | |||
543 | priv->post_irq(priv); | 524 | priv->post_irq(priv); |
544 | 525 | ||
545 | if (n >= SJA1000_MAX_IRQ) | 526 | if (n >= SJA1000_MAX_IRQ) |
546 | netdev_dbg(dev, "%d messages handled in ISR", n); | 527 | dev_dbg(dev->dev.parent, "%d messages handled in ISR", n); |
547 | 528 | ||
548 | return (n) ? IRQ_HANDLED : IRQ_NONE; | 529 | return (n) ? IRQ_HANDLED : IRQ_NONE; |
549 | } | 530 | } |
@@ -574,6 +555,7 @@ static int sja1000_open(struct net_device *dev) | |||
574 | 555 | ||
575 | /* init and start chi */ | 556 | /* init and start chi */ |
576 | sja1000_start(dev); | 557 | sja1000_start(dev); |
558 | priv->open_time = jiffies; | ||
577 | 559 | ||
578 | netif_start_queue(dev); | 560 | netif_start_queue(dev); |
579 | 561 | ||
@@ -592,6 +574,8 @@ static int sja1000_close(struct net_device *dev) | |||
592 | 574 | ||
593 | close_candev(dev); | 575 | close_candev(dev); |
594 | 576 | ||
577 | priv->open_time = 0; | ||
578 | |||
595 | return 0; | 579 | return 0; |
596 | } | 580 | } |
597 | 581 | ||
@@ -613,8 +597,7 @@ struct net_device *alloc_sja1000dev(int sizeof_priv) | |||
613 | priv->can.do_set_mode = sja1000_set_mode; | 597 | priv->can.do_set_mode = sja1000_set_mode; |
614 | priv->can.do_get_berr_counter = sja1000_get_berr_counter; | 598 | priv->can.do_get_berr_counter = sja1000_get_berr_counter; |
615 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | | 599 | priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | |
616 | CAN_CTRLMODE_BERR_REPORTING | CAN_CTRLMODE_LISTENONLY | | 600 | CAN_CTRLMODE_BERR_REPORTING; |
617 | CAN_CTRLMODE_ONE_SHOT; | ||
618 | 601 | ||
619 | spin_lock_init(&priv->cmdreg_lock); | 602 | spin_lock_init(&priv->cmdreg_lock); |
620 | 603 | ||
diff --git a/drivers/net/can/sja1000/sja1000.h b/drivers/net/can/sja1000/sja1000.h index afa99847a51..78bd4ecac14 100644 --- a/drivers/net/can/sja1000/sja1000.h +++ b/drivers/net/can/sja1000/sja1000.h | |||
@@ -40,6 +40,8 @@ | |||
40 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | 40 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
41 | * DAMAGE. | 41 | * DAMAGE. |
42 | * | 42 | * |
43 | * Send feedback to <socketcan-users@lists.berlios.de> | ||
44 | * | ||
43 | */ | 45 | */ |
44 | 46 | ||
45 | #ifndef SJA1000_DEV_H | 47 | #ifndef SJA1000_DEV_H |
@@ -152,6 +154,7 @@ | |||
152 | */ | 154 | */ |
153 | struct sja1000_priv { | 155 | struct sja1000_priv { |
154 | struct can_priv can; /* must be the first member */ | 156 | struct can_priv can; /* must be the first member */ |
157 | int open_time; | ||
155 | struct sk_buff *echo_skb; | 158 | struct sk_buff *echo_skb; |
156 | 159 | ||
157 | /* the lower-layer is responsible for appropriate locking */ | 160 | /* the lower-layer is responsible for appropriate locking */ |
diff --git a/drivers/net/can/sja1000/sja1000_isa.c b/drivers/net/can/sja1000/sja1000_isa.c index 5c8da466148..496223e9e2f 100644 --- a/drivers/net/can/sja1000/sja1000_isa.c +++ b/drivers/net/can/sja1000/sja1000_isa.c | |||
@@ -17,7 +17,7 @@ | |||
17 | 17 | ||
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/platform_device.h> | 20 | #include <linux/isa.h> |
21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
22 | #include <linux/netdevice.h> | 22 | #include <linux/netdevice.h> |
23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
@@ -42,11 +42,11 @@ MODULE_LICENSE("GPL v2"); | |||
42 | 42 | ||
43 | static unsigned long port[MAXDEV]; | 43 | static unsigned long port[MAXDEV]; |
44 | static unsigned long mem[MAXDEV]; | 44 | static unsigned long mem[MAXDEV]; |
45 | static int irq[MAXDEV]; | 45 | static int __devinitdata irq[MAXDEV]; |
46 | static int clk[MAXDEV]; | 46 | static int __devinitdata clk[MAXDEV]; |
47 | static unsigned char cdr[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff}; | 47 | static char __devinitdata cdr[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1}; |
48 | static unsigned char ocr[MAXDEV] = {[0 ... (MAXDEV - 1)] = 0xff}; | 48 | static char __devinitdata ocr[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1}; |
49 | static int indirect[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1}; | 49 | static char __devinitdata indirect[MAXDEV] = {[0 ... (MAXDEV - 1)] = -1}; |
50 | 50 | ||
51 | module_param_array(port, ulong, NULL, S_IRUGO); | 51 | module_param_array(port, ulong, NULL, S_IRUGO); |
52 | MODULE_PARM_DESC(port, "I/O port number"); | 52 | MODULE_PARM_DESC(port, "I/O port number"); |
@@ -54,7 +54,7 @@ MODULE_PARM_DESC(port, "I/O port number"); | |||
54 | module_param_array(mem, ulong, NULL, S_IRUGO); | 54 | module_param_array(mem, ulong, NULL, S_IRUGO); |
55 | MODULE_PARM_DESC(mem, "I/O memory address"); | 55 | MODULE_PARM_DESC(mem, "I/O memory address"); |
56 | 56 | ||
57 | module_param_array(indirect, int, NULL, S_IRUGO); | 57 | module_param_array(indirect, byte, NULL, S_IRUGO); |
58 | MODULE_PARM_DESC(indirect, "Indirect access via address and data port"); | 58 | MODULE_PARM_DESC(indirect, "Indirect access via address and data port"); |
59 | 59 | ||
60 | module_param_array(irq, int, NULL, S_IRUGO); | 60 | module_param_array(irq, int, NULL, S_IRUGO); |
@@ -75,8 +75,6 @@ MODULE_PARM_DESC(ocr, "Output control register " | |||
75 | #define SJA1000_IOSIZE 0x20 | 75 | #define SJA1000_IOSIZE 0x20 |
76 | #define SJA1000_IOSIZE_INDIRECT 0x02 | 76 | #define SJA1000_IOSIZE_INDIRECT 0x02 |
77 | 77 | ||
78 | static struct platform_device *sja1000_isa_devs[MAXDEV]; | ||
79 | |||
80 | static u8 sja1000_isa_mem_read_reg(const struct sja1000_priv *priv, int reg) | 78 | static u8 sja1000_isa_mem_read_reg(const struct sja1000_priv *priv, int reg) |
81 | { | 79 | { |
82 | return readb(priv->reg_base + reg); | 80 | return readb(priv->reg_base + reg); |
@@ -117,18 +115,26 @@ static void sja1000_isa_port_write_reg_indirect(const struct sja1000_priv *priv, | |||
117 | outb(val, base + 1); | 115 | outb(val, base + 1); |
118 | } | 116 | } |
119 | 117 | ||
120 | static int sja1000_isa_probe(struct platform_device *pdev) | 118 | static int __devinit sja1000_isa_match(struct device *pdev, unsigned int idx) |
119 | { | ||
120 | if (port[idx] || mem[idx]) { | ||
121 | if (irq[idx]) | ||
122 | return 1; | ||
123 | } else if (idx) | ||
124 | return 0; | ||
125 | |||
126 | dev_err(pdev, "insufficient parameters supplied\n"); | ||
127 | return 0; | ||
128 | } | ||
129 | |||
130 | static int __devinit sja1000_isa_probe(struct device *pdev, unsigned int idx) | ||
121 | { | 131 | { |
122 | struct net_device *dev; | 132 | struct net_device *dev; |
123 | struct sja1000_priv *priv; | 133 | struct sja1000_priv *priv; |
124 | void __iomem *base = NULL; | 134 | void __iomem *base = NULL; |
125 | int iosize = SJA1000_IOSIZE; | 135 | int iosize = SJA1000_IOSIZE; |
126 | int idx = pdev->id; | ||
127 | int err; | 136 | int err; |
128 | 137 | ||
129 | dev_dbg(&pdev->dev, "probing idx=%d: port=%#lx, mem=%#lx, irq=%d\n", | ||
130 | idx, port[idx], mem[idx], irq[idx]); | ||
131 | |||
132 | if (mem[idx]) { | 138 | if (mem[idx]) { |
133 | if (!request_mem_region(mem[idx], iosize, DRV_NAME)) { | 139 | if (!request_mem_region(mem[idx], iosize, DRV_NAME)) { |
134 | err = -EBUSY; | 140 | err = -EBUSY; |
@@ -183,31 +189,31 @@ static int sja1000_isa_probe(struct platform_device *pdev) | |||
183 | else | 189 | else |
184 | priv->can.clock.freq = CLK_DEFAULT / 2; | 190 | priv->can.clock.freq = CLK_DEFAULT / 2; |
185 | 191 | ||
186 | if (ocr[idx] != 0xff) | 192 | if (ocr[idx] != -1) |
187 | priv->ocr = ocr[idx]; | 193 | priv->ocr = ocr[idx] & 0xff; |
188 | else if (ocr[0] != 0xff) | 194 | else if (ocr[0] != -1) |
189 | priv->ocr = ocr[0]; | 195 | priv->ocr = ocr[0] & 0xff; |
190 | else | 196 | else |
191 | priv->ocr = OCR_DEFAULT; | 197 | priv->ocr = OCR_DEFAULT; |
192 | 198 | ||
193 | if (cdr[idx] != 0xff) | 199 | if (cdr[idx] != -1) |
194 | priv->cdr = cdr[idx]; | 200 | priv->cdr = cdr[idx] & 0xff; |
195 | else if (cdr[0] != 0xff) | 201 | else if (cdr[0] != -1) |
196 | priv->cdr = cdr[0]; | 202 | priv->cdr = cdr[0] & 0xff; |
197 | else | 203 | else |
198 | priv->cdr = CDR_DEFAULT; | 204 | priv->cdr = CDR_DEFAULT; |
199 | 205 | ||
200 | dev_set_drvdata(&pdev->dev, dev); | 206 | dev_set_drvdata(pdev, dev); |
201 | SET_NETDEV_DEV(dev, &pdev->dev); | 207 | SET_NETDEV_DEV(dev, pdev); |
202 | 208 | ||
203 | err = register_sja1000dev(dev); | 209 | err = register_sja1000dev(dev); |
204 | if (err) { | 210 | if (err) { |
205 | dev_err(&pdev->dev, "registering %s failed (err=%d)\n", | 211 | dev_err(pdev, "registering %s failed (err=%d)\n", |
206 | DRV_NAME, err); | 212 | DRV_NAME, err); |
207 | goto exit_unmap; | 213 | goto exit_unmap; |
208 | } | 214 | } |
209 | 215 | ||
210 | dev_info(&pdev->dev, "%s device registered (reg_base=0x%p, irq=%d)\n", | 216 | dev_info(pdev, "%s device registered (reg_base=0x%p, irq=%d)\n", |
211 | DRV_NAME, priv->reg_base, dev->irq); | 217 | DRV_NAME, priv->reg_base, dev->irq); |
212 | return 0; | 218 | return 0; |
213 | 219 | ||
@@ -223,14 +229,13 @@ static int sja1000_isa_probe(struct platform_device *pdev) | |||
223 | return err; | 229 | return err; |
224 | } | 230 | } |
225 | 231 | ||
226 | static int sja1000_isa_remove(struct platform_device *pdev) | 232 | static int __devexit sja1000_isa_remove(struct device *pdev, unsigned int idx) |
227 | { | 233 | { |
228 | struct net_device *dev = dev_get_drvdata(&pdev->dev); | 234 | struct net_device *dev = dev_get_drvdata(pdev); |
229 | struct sja1000_priv *priv = netdev_priv(dev); | 235 | struct sja1000_priv *priv = netdev_priv(dev); |
230 | int idx = pdev->id; | ||
231 | 236 | ||
232 | unregister_sja1000dev(dev); | 237 | unregister_sja1000dev(dev); |
233 | dev_set_drvdata(&pdev->dev, NULL); | 238 | dev_set_drvdata(pdev, NULL); |
234 | 239 | ||
235 | if (mem[idx]) { | 240 | if (mem[idx]) { |
236 | iounmap(priv->reg_base); | 241 | iounmap(priv->reg_base); |
@@ -246,70 +251,29 @@ static int sja1000_isa_remove(struct platform_device *pdev) | |||
246 | return 0; | 251 | return 0; |
247 | } | 252 | } |
248 | 253 | ||
249 | static struct platform_driver sja1000_isa_driver = { | 254 | static struct isa_driver sja1000_isa_driver = { |
255 | .match = sja1000_isa_match, | ||
250 | .probe = sja1000_isa_probe, | 256 | .probe = sja1000_isa_probe, |
251 | .remove = sja1000_isa_remove, | 257 | .remove = __devexit_p(sja1000_isa_remove), |
252 | .driver = { | 258 | .driver = { |
253 | .name = DRV_NAME, | 259 | .name = DRV_NAME, |
254 | .owner = THIS_MODULE, | ||
255 | }, | 260 | }, |
256 | }; | 261 | }; |
257 | 262 | ||
258 | static int __init sja1000_isa_init(void) | 263 | static int __init sja1000_isa_init(void) |
259 | { | 264 | { |
260 | int idx, err; | 265 | int err = isa_register_driver(&sja1000_isa_driver, MAXDEV); |
261 | |||
262 | for (idx = 0; idx < MAXDEV; idx++) { | ||
263 | if ((port[idx] || mem[idx]) && irq[idx]) { | ||
264 | sja1000_isa_devs[idx] = | ||
265 | platform_device_alloc(DRV_NAME, idx); | ||
266 | if (!sja1000_isa_devs[idx]) { | ||
267 | err = -ENOMEM; | ||
268 | goto exit_free_devices; | ||
269 | } | ||
270 | err = platform_device_add(sja1000_isa_devs[idx]); | ||
271 | if (err) { | ||
272 | platform_device_put(sja1000_isa_devs[idx]); | ||
273 | goto exit_free_devices; | ||
274 | } | ||
275 | pr_debug("%s: platform device %d: port=%#lx, mem=%#lx, " | ||
276 | "irq=%d\n", | ||
277 | DRV_NAME, idx, port[idx], mem[idx], irq[idx]); | ||
278 | } else if (idx == 0 || port[idx] || mem[idx]) { | ||
279 | pr_err("%s: insufficient parameters supplied\n", | ||
280 | DRV_NAME); | ||
281 | err = -EINVAL; | ||
282 | goto exit_free_devices; | ||
283 | } | ||
284 | } | ||
285 | |||
286 | err = platform_driver_register(&sja1000_isa_driver); | ||
287 | if (err) | ||
288 | goto exit_free_devices; | ||
289 | |||
290 | pr_info("Legacy %s driver for max. %d devices registered\n", | ||
291 | DRV_NAME, MAXDEV); | ||
292 | |||
293 | return 0; | ||
294 | |||
295 | exit_free_devices: | ||
296 | while (--idx >= 0) { | ||
297 | if (sja1000_isa_devs[idx]) | ||
298 | platform_device_unregister(sja1000_isa_devs[idx]); | ||
299 | } | ||
300 | 266 | ||
267 | if (!err) | ||
268 | printk(KERN_INFO | ||
269 | "Legacy %s driver for max. %d devices registered\n", | ||
270 | DRV_NAME, MAXDEV); | ||
301 | return err; | 271 | return err; |
302 | } | 272 | } |
303 | 273 | ||
304 | static void __exit sja1000_isa_exit(void) | 274 | static void __exit sja1000_isa_exit(void) |
305 | { | 275 | { |
306 | int idx; | 276 | isa_unregister_driver(&sja1000_isa_driver); |
307 | |||
308 | platform_driver_unregister(&sja1000_isa_driver); | ||
309 | for (idx = 0; idx < MAXDEV; idx++) { | ||
310 | if (sja1000_isa_devs[idx]) | ||
311 | platform_device_unregister(sja1000_isa_devs[idx]); | ||
312 | } | ||
313 | } | 277 | } |
314 | 278 | ||
315 | module_init(sja1000_isa_init); | 279 | module_init(sja1000_isa_init); |
diff --git a/drivers/net/can/sja1000/sja1000_of_platform.c b/drivers/net/can/sja1000/sja1000_of_platform.c index 6433b81256c..cee6ba2b8b5 100644 --- a/drivers/net/can/sja1000/sja1000_of_platform.c +++ b/drivers/net/can/sja1000/sja1000_of_platform.c | |||
@@ -29,7 +29,7 @@ | |||
29 | * nxp,external-clock-frequency = <16000000>; | 29 | * nxp,external-clock-frequency = <16000000>; |
30 | * }; | 30 | * }; |
31 | * | 31 | * |
32 | * See "Documentation/devicetree/bindings/net/can/sja1000.txt" for further | 32 | * See "Documentation/powerpc/dts-bindings/can/sja1000.txt" for further |
33 | * information. | 33 | * information. |
34 | */ | 34 | */ |
35 | 35 | ||
@@ -42,8 +42,6 @@ | |||
42 | #include <linux/can/dev.h> | 42 | #include <linux/can/dev.h> |
43 | 43 | ||
44 | #include <linux/of_platform.h> | 44 | #include <linux/of_platform.h> |
45 | #include <linux/of_address.h> | ||
46 | #include <linux/of_irq.h> | ||
47 | #include <asm/prom.h> | 45 | #include <asm/prom.h> |
48 | 46 | ||
49 | #include "sja1000.h" | 47 | #include "sja1000.h" |
@@ -61,16 +59,16 @@ MODULE_LICENSE("GPL v2"); | |||
61 | 59 | ||
62 | static u8 sja1000_ofp_read_reg(const struct sja1000_priv *priv, int reg) | 60 | static u8 sja1000_ofp_read_reg(const struct sja1000_priv *priv, int reg) |
63 | { | 61 | { |
64 | return ioread8(priv->reg_base + reg); | 62 | return in_8(priv->reg_base + reg); |
65 | } | 63 | } |
66 | 64 | ||
67 | static void sja1000_ofp_write_reg(const struct sja1000_priv *priv, | 65 | static void sja1000_ofp_write_reg(const struct sja1000_priv *priv, |
68 | int reg, u8 val) | 66 | int reg, u8 val) |
69 | { | 67 | { |
70 | iowrite8(val, priv->reg_base + reg); | 68 | out_8(priv->reg_base + reg, val); |
71 | } | 69 | } |
72 | 70 | ||
73 | static int sja1000_ofp_remove(struct platform_device *ofdev) | 71 | static int __devexit sja1000_ofp_remove(struct platform_device *ofdev) |
74 | { | 72 | { |
75 | struct net_device *dev = dev_get_drvdata(&ofdev->dev); | 73 | struct net_device *dev = dev_get_drvdata(&ofdev->dev); |
76 | struct sja1000_priv *priv = netdev_priv(dev); | 74 | struct sja1000_priv *priv = netdev_priv(dev); |
@@ -90,7 +88,7 @@ static int sja1000_ofp_remove(struct platform_device *ofdev) | |||
90 | return 0; | 88 | return 0; |
91 | } | 89 | } |
92 | 90 | ||
93 | static int sja1000_ofp_probe(struct platform_device *ofdev) | 91 | static int __devinit sja1000_ofp_probe(struct platform_device *ofdev) |
94 | { | 92 | { |
95 | struct device_node *np = ofdev->dev.of_node; | 93 | struct device_node *np = ofdev->dev.of_node; |
96 | struct net_device *dev; | 94 | struct net_device *dev; |
@@ -121,7 +119,7 @@ static int sja1000_ofp_probe(struct platform_device *ofdev) | |||
121 | } | 119 | } |
122 | 120 | ||
123 | irq = irq_of_parse_and_map(np, 0); | 121 | irq = irq_of_parse_and_map(np, 0); |
124 | if (irq == 0) { | 122 | if (irq == NO_IRQ) { |
125 | dev_err(&ofdev->dev, "no irq found\n"); | 123 | dev_err(&ofdev->dev, "no irq found\n"); |
126 | err = -ENODEV; | 124 | err = -ENODEV; |
127 | goto exit_unmap_mem; | 125 | goto exit_unmap_mem; |
@@ -206,7 +204,7 @@ exit_release_mem: | |||
206 | return err; | 204 | return err; |
207 | } | 205 | } |
208 | 206 | ||
209 | static struct of_device_id sja1000_ofp_table[] = { | 207 | static struct of_device_id __devinitdata sja1000_ofp_table[] = { |
210 | {.compatible = "nxp,sja1000"}, | 208 | {.compatible = "nxp,sja1000"}, |
211 | {}, | 209 | {}, |
212 | }; | 210 | }; |
@@ -219,7 +217,17 @@ static struct platform_driver sja1000_ofp_driver = { | |||
219 | .of_match_table = sja1000_ofp_table, | 217 | .of_match_table = sja1000_ofp_table, |
220 | }, | 218 | }, |
221 | .probe = sja1000_ofp_probe, | 219 | .probe = sja1000_ofp_probe, |
222 | .remove = sja1000_ofp_remove, | 220 | .remove = __devexit_p(sja1000_ofp_remove), |
223 | }; | 221 | }; |
224 | 222 | ||
225 | module_platform_driver(sja1000_ofp_driver); | 223 | static int __init sja1000_ofp_init(void) |
224 | { | ||
225 | return platform_driver_register(&sja1000_ofp_driver); | ||
226 | } | ||
227 | module_init(sja1000_ofp_init); | ||
228 | |||
229 | static void __exit sja1000_ofp_exit(void) | ||
230 | { | ||
231 | return platform_driver_unregister(&sja1000_ofp_driver); | ||
232 | }; | ||
233 | module_exit(sja1000_ofp_exit); | ||
diff --git a/drivers/net/can/sja1000/sja1000_platform.c b/drivers/net/can/sja1000/sja1000_platform.c index 21619bb5b86..d9fadc489b3 100644 --- a/drivers/net/can/sja1000/sja1000_platform.c +++ b/drivers/net/can/sja1000/sja1000_platform.c | |||
@@ -34,7 +34,6 @@ | |||
34 | 34 | ||
35 | MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); | 35 | MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); |
36 | MODULE_DESCRIPTION("Socket-CAN driver for SJA1000 on the platform bus"); | 36 | MODULE_DESCRIPTION("Socket-CAN driver for SJA1000 on the platform bus"); |
37 | MODULE_ALIAS("platform:" DRV_NAME); | ||
38 | MODULE_LICENSE("GPL v2"); | 37 | MODULE_LICENSE("GPL v2"); |
39 | 38 | ||
40 | static u8 sp_read_reg8(const struct sja1000_priv *priv, int reg) | 39 | static u8 sp_read_reg8(const struct sja1000_priv *priv, int reg) |
@@ -110,9 +109,7 @@ static int sp_probe(struct platform_device *pdev) | |||
110 | priv = netdev_priv(dev); | 109 | priv = netdev_priv(dev); |
111 | 110 | ||
112 | dev->irq = res_irq->start; | 111 | dev->irq = res_irq->start; |
113 | priv->irq_flags = res_irq->flags & IRQF_TRIGGER_MASK; | 112 | priv->irq_flags = res_irq->flags & (IRQF_TRIGGER_MASK | IRQF_SHARED); |
114 | if (res_irq->flags & IORESOURCE_IRQ_SHAREABLE) | ||
115 | priv->irq_flags |= IRQF_SHARED; | ||
116 | priv->reg_base = addr; | 113 | priv->reg_base = addr; |
117 | /* The CAN clock frequency is half the oscillator clock frequency */ | 114 | /* The CAN clock frequency is half the oscillator clock frequency */ |
118 | priv->can.clock.freq = pdata->osc_freq / 2; | 115 | priv->can.clock.freq = pdata->osc_freq / 2; |
@@ -188,4 +185,15 @@ static struct platform_driver sp_driver = { | |||
188 | }, | 185 | }, |
189 | }; | 186 | }; |
190 | 187 | ||
191 | module_platform_driver(sp_driver); | 188 | static int __init sp_init(void) |
189 | { | ||
190 | return platform_driver_register(&sp_driver); | ||
191 | } | ||
192 | |||
193 | static void __exit sp_exit(void) | ||
194 | { | ||
195 | platform_driver_unregister(&sp_driver); | ||
196 | } | ||
197 | |||
198 | module_init(sp_init); | ||
199 | module_exit(sp_exit); | ||
diff --git a/drivers/net/can/sja1000/tscan1.c b/drivers/net/can/sja1000/tscan1.c index 76513dd780c..9756099a883 100644 --- a/drivers/net/can/sja1000/tscan1.c +++ b/drivers/net/can/sja1000/tscan1.c | |||
@@ -71,7 +71,7 @@ MODULE_LICENSE("GPL"); | |||
71 | #define TSCAN1_SJA1000_XTAL 16000000 | 71 | #define TSCAN1_SJA1000_XTAL 16000000 |
72 | 72 | ||
73 | /* SJA1000 IO base addresses */ | 73 | /* SJA1000 IO base addresses */ |
74 | static const unsigned short tscan1_sja1000_addresses[] = { | 74 | static const unsigned short tscan1_sja1000_addresses[] __devinitconst = { |
75 | 0x100, 0x120, 0x180, 0x1a0, 0x200, 0x240, 0x280, 0x320 | 75 | 0x100, 0x120, 0x180, 0x1a0, 0x200, 0x240, 0x280, 0x320 |
76 | }; | 76 | }; |
77 | 77 | ||
@@ -88,7 +88,7 @@ static void tscan1_write(const struct sja1000_priv *priv, int reg, u8 val) | |||
88 | } | 88 | } |
89 | 89 | ||
90 | /* Probe for a TS-CAN1 board with JP2:JP1 jumper setting ID */ | 90 | /* Probe for a TS-CAN1 board with JP2:JP1 jumper setting ID */ |
91 | static int tscan1_probe(struct device *dev, unsigned id) | 91 | static int __devinit tscan1_probe(struct device *dev, unsigned id) |
92 | { | 92 | { |
93 | struct net_device *netdev; | 93 | struct net_device *netdev; |
94 | struct sja1000_priv *priv; | 94 | struct sja1000_priv *priv; |
@@ -171,7 +171,7 @@ static int tscan1_probe(struct device *dev, unsigned id) | |||
171 | return -ENXIO; | 171 | return -ENXIO; |
172 | } | 172 | } |
173 | 173 | ||
174 | static int tscan1_remove(struct device *dev, unsigned id /*unused*/) | 174 | static int __devexit tscan1_remove(struct device *dev, unsigned id /*unused*/) |
175 | { | 175 | { |
176 | struct net_device *netdev; | 176 | struct net_device *netdev; |
177 | struct sja1000_priv *priv; | 177 | struct sja1000_priv *priv; |
@@ -197,7 +197,7 @@ static int tscan1_remove(struct device *dev, unsigned id /*unused*/) | |||
197 | 197 | ||
198 | static struct isa_driver tscan1_isa_driver = { | 198 | static struct isa_driver tscan1_isa_driver = { |
199 | .probe = tscan1_probe, | 199 | .probe = tscan1_probe, |
200 | .remove = tscan1_remove, | 200 | .remove = __devexit_p(tscan1_remove), |
201 | .driver = { | 201 | .driver = { |
202 | .name = "tscan1", | 202 | .name = "tscan1", |
203 | }, | 203 | }, |