2 * Copyright (C) 2005 Sascha Hauer, Pengutronix
3 * Copyright (C) 2007 Wolfgang Grandegger <wg@grandegger.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the version 2 of the GNU General Public License
7 * as published by the Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/interrupt.h>
21 #include <linux/netdevice.h>
22 #include <linux/delay.h>
23 #include <linux/pci.h>
24 #include <linux/platform_device.h>
25 #include <linux/irq.h>
26 #include <linux/can/dev.h>
27 #include <linux/can/platform/sja1000.h>
30 #include <linux/of_device.h>
31 #include <linux/of_irq.h>
35 #define DRV_NAME "sja1000_platform"
36 #define SP_CAN_CLOCK (16000000 / 2)
38 MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
39 MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>");
40 MODULE_DESCRIPTION("Socket-CAN driver for SJA1000 on the platform bus");
41 MODULE_ALIAS("platform:" DRV_NAME
);
42 MODULE_LICENSE("GPL v2");
44 struct sja1000_of_data
{
46 int (*init
)(struct sja1000_priv
*priv
, struct device_node
*of
);
49 struct technologic_priv
{
53 static u8
sp_read_reg8(const struct sja1000_priv
*priv
, int reg
)
55 return ioread8(priv
->reg_base
+ reg
);
58 static void sp_write_reg8(const struct sja1000_priv
*priv
, int reg
, u8 val
)
60 iowrite8(val
, priv
->reg_base
+ reg
);
63 static u8
sp_read_reg16(const struct sja1000_priv
*priv
, int reg
)
65 return ioread8(priv
->reg_base
+ reg
* 2);
68 static void sp_write_reg16(const struct sja1000_priv
*priv
, int reg
, u8 val
)
70 iowrite8(val
, priv
->reg_base
+ reg
* 2);
73 static u8
sp_read_reg32(const struct sja1000_priv
*priv
, int reg
)
75 return ioread8(priv
->reg_base
+ reg
* 4);
78 static void sp_write_reg32(const struct sja1000_priv
*priv
, int reg
, u8 val
)
80 iowrite8(val
, priv
->reg_base
+ reg
* 4);
83 static u8
sp_technologic_read_reg16(const struct sja1000_priv
*priv
, int reg
)
85 struct technologic_priv
*tp
= priv
->priv
;
89 spin_lock_irqsave(&tp
->io_lock
, flags
);
90 iowrite16(reg
, priv
->reg_base
+ 0);
91 val
= ioread16(priv
->reg_base
+ 2);
92 spin_unlock_irqrestore(&tp
->io_lock
, flags
);
97 static void sp_technologic_write_reg16(const struct sja1000_priv
*priv
,
100 struct technologic_priv
*tp
= priv
->priv
;
103 spin_lock_irqsave(&tp
->io_lock
, flags
);
104 iowrite16(reg
, priv
->reg_base
+ 0);
105 iowrite16(val
, priv
->reg_base
+ 2);
106 spin_unlock_irqrestore(&tp
->io_lock
, flags
);
109 static int sp_technologic_init(struct sja1000_priv
*priv
, struct device_node
*of
)
111 struct technologic_priv
*tp
= priv
->priv
;
113 priv
->read_reg
= sp_technologic_read_reg16
;
114 priv
->write_reg
= sp_technologic_write_reg16
;
115 spin_lock_init(&tp
->io_lock
);
120 static void sp_populate(struct sja1000_priv
*priv
,
121 struct sja1000_platform_data
*pdata
,
122 unsigned long resource_mem_flags
)
124 /* The CAN clock frequency is half the oscillator clock frequency */
125 priv
->can
.clock
.freq
= pdata
->osc_freq
/ 2;
126 priv
->ocr
= pdata
->ocr
;
127 priv
->cdr
= pdata
->cdr
;
129 switch (resource_mem_flags
& IORESOURCE_MEM_TYPE_MASK
) {
130 case IORESOURCE_MEM_32BIT
:
131 priv
->read_reg
= sp_read_reg32
;
132 priv
->write_reg
= sp_write_reg32
;
134 case IORESOURCE_MEM_16BIT
:
135 priv
->read_reg
= sp_read_reg16
;
136 priv
->write_reg
= sp_write_reg16
;
138 case IORESOURCE_MEM_8BIT
:
140 priv
->read_reg
= sp_read_reg8
;
141 priv
->write_reg
= sp_write_reg8
;
146 static void sp_populate_of(struct sja1000_priv
*priv
, struct device_node
*of
)
151 err
= of_property_read_u32(of
, "reg-io-width", &prop
);
153 prop
= 1; /* 8 bit is default */
157 priv
->read_reg
= sp_read_reg32
;
158 priv
->write_reg
= sp_write_reg32
;
161 priv
->read_reg
= sp_read_reg16
;
162 priv
->write_reg
= sp_write_reg16
;
164 case 1: /* fallthrough */
166 priv
->read_reg
= sp_read_reg8
;
167 priv
->write_reg
= sp_write_reg8
;
170 err
= of_property_read_u32(of
, "nxp,external-clock-frequency", &prop
);
172 priv
->can
.clock
.freq
= prop
/ 2;
174 priv
->can
.clock
.freq
= SP_CAN_CLOCK
; /* default */
176 err
= of_property_read_u32(of
, "nxp,tx-output-mode", &prop
);
178 priv
->ocr
|= prop
& OCR_MODE_MASK
;
180 priv
->ocr
|= OCR_MODE_NORMAL
; /* default */
182 err
= of_property_read_u32(of
, "nxp,tx-output-config", &prop
);
184 priv
->ocr
|= (prop
<< OCR_TX_SHIFT
) & OCR_TX_MASK
;
186 priv
->ocr
|= OCR_TX0_PULLDOWN
; /* default */
188 err
= of_property_read_u32(of
, "nxp,clock-out-frequency", &prop
);
190 u32 divider
= priv
->can
.clock
.freq
* 2 / prop
;
193 priv
->cdr
|= divider
/ 2 - 1;
195 priv
->cdr
|= CDR_CLKOUT_MASK
;
197 priv
->cdr
|= CDR_CLK_OFF
; /* default */
200 if (!of_property_read_bool(of
, "nxp,no-comparator-bypass"))
201 priv
->cdr
|= CDR_CBP
; /* default */
204 static struct sja1000_of_data technologic_data
= {
205 .priv_sz
= sizeof(struct technologic_priv
),
206 .init
= sp_technologic_init
,
209 static const struct of_device_id sp_of_table
[] = {
210 { .compatible
= "nxp,sja1000", .data
= NULL
, },
211 { .compatible
= "technologic,sja1000", .data
= &technologic_data
, },
214 MODULE_DEVICE_TABLE(of
, sp_of_table
);
216 static int sp_probe(struct platform_device
*pdev
)
220 struct net_device
*dev
;
221 struct sja1000_priv
*priv
;
222 struct resource
*res_mem
, *res_irq
= NULL
;
223 struct sja1000_platform_data
*pdata
;
224 struct device_node
*of
= pdev
->dev
.of_node
;
225 const struct of_device_id
*of_id
;
226 const struct sja1000_of_data
*of_data
= NULL
;
229 pdata
= dev_get_platdata(&pdev
->dev
);
231 dev_err(&pdev
->dev
, "No platform data provided!\n");
235 res_mem
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
239 if (!devm_request_mem_region(&pdev
->dev
, res_mem
->start
,
240 resource_size(res_mem
), DRV_NAME
))
243 addr
= devm_ioremap_nocache(&pdev
->dev
, res_mem
->start
,
244 resource_size(res_mem
));
249 irq
= irq_of_parse_and_map(of
, 0);
251 res_irq
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
253 if (!irq
&& !res_irq
)
256 of_id
= of_match_device(sp_of_table
, &pdev
->dev
);
257 if (of_id
&& of_id
->data
) {
258 of_data
= of_id
->data
;
259 priv_sz
= of_data
->priv_sz
;
262 dev
= alloc_sja1000dev(priv_sz
);
265 priv
= netdev_priv(dev
);
268 irq
= res_irq
->start
;
269 priv
->irq_flags
= res_irq
->flags
& IRQF_TRIGGER_MASK
;
270 if (res_irq
->flags
& IORESOURCE_IRQ_SHAREABLE
)
271 priv
->irq_flags
|= IRQF_SHARED
;
273 priv
->irq_flags
= IRQF_SHARED
;
277 priv
->reg_base
= addr
;
280 sp_populate_of(priv
, of
);
282 if (of_data
&& of_data
->init
) {
283 err
= of_data
->init(priv
, of
);
288 sp_populate(priv
, pdata
, res_mem
->flags
);
291 platform_set_drvdata(pdev
, dev
);
292 SET_NETDEV_DEV(dev
, &pdev
->dev
);
294 err
= register_sja1000dev(dev
);
296 dev_err(&pdev
->dev
, "registering %s failed (err=%d)\n",
301 dev_info(&pdev
->dev
, "%s device registered (reg_base=%p, irq=%d)\n",
302 DRV_NAME
, priv
->reg_base
, dev
->irq
);
306 free_sja1000dev(dev
);
310 static int sp_remove(struct platform_device
*pdev
)
312 struct net_device
*dev
= platform_get_drvdata(pdev
);
314 unregister_sja1000dev(dev
);
315 free_sja1000dev(dev
);
320 static struct platform_driver sp_driver
= {
325 .of_match_table
= sp_of_table
,
329 module_platform_driver(sp_driver
);