aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
authorDamien Riegel <damien.riegel@savoirfairelinux.com>2016-01-12 17:31:20 -0500
committerMarc Kleine-Budde <mkl@pengutronix.de>2016-02-20 08:56:00 -0500
commitdfb86c0d5a9d1c068954d776bf66e3d0b27beb68 (patch)
tree5fc6840884547349996a7b8bf50e4dbfe4b21029 /drivers/net/can
parent83c26850fc36014f5c13a1b2bf460bfa200af8c9 (diff)
can: sja1000: of: add compatibility with Technologic Systems version
Technologic Systems provides an IP compatible with the SJA1000, instantiated in an FPGA. Because of some bus widths issue, access to registers is made through a "window" that works like this: base + 0x0: address to read/write base + 0x2: 8-bit register value This commit adds a new compatible device, "technologic,sja1000", with read and write functions using the window mechanism. Signed-off-by: Damien Riegel <damien.riegel@savoirfairelinux.com> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can')
-rw-r--r--drivers/net/can/sja1000/sja1000_platform.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/can/sja1000/sja1000_platform.c b/drivers/net/can/sja1000/sja1000_platform.c
index 777d312f1779..dc9c6db96c3c 100644
--- a/drivers/net/can/sja1000/sja1000_platform.c
+++ b/drivers/net/can/sja1000/sja1000_platform.c
@@ -46,6 +46,10 @@ struct sja1000_of_data {
46 int (*init)(struct sja1000_priv *priv, struct device_node *of); 46 int (*init)(struct sja1000_priv *priv, struct device_node *of);
47}; 47};
48 48
49struct technologic_priv {
50 spinlock_t io_lock;
51};
52
49static u8 sp_read_reg8(const struct sja1000_priv *priv, int reg) 53static u8 sp_read_reg8(const struct sja1000_priv *priv, int reg)
50{ 54{
51 return ioread8(priv->reg_base + reg); 55 return ioread8(priv->reg_base + reg);
@@ -76,6 +80,43 @@ static void sp_write_reg32(const struct sja1000_priv *priv, int reg, u8 val)
76 iowrite8(val, priv->reg_base + reg * 4); 80 iowrite8(val, priv->reg_base + reg * 4);
77} 81}
78 82
83static u8 sp_technologic_read_reg16(const struct sja1000_priv *priv, int reg)
84{
85 struct technologic_priv *tp = priv->priv;
86 unsigned long flags;
87 u8 val;
88
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);
93
94 return val;
95}
96
97static void sp_technologic_write_reg16(const struct sja1000_priv *priv,
98 int reg, u8 val)
99{
100 struct technologic_priv *tp = priv->priv;
101 unsigned long flags;
102
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);
107}
108
109static int sp_technologic_init(struct sja1000_priv *priv, struct device_node *of)
110{
111 struct technologic_priv *tp = priv->priv;
112
113 priv->read_reg = sp_technologic_read_reg16;
114 priv->write_reg = sp_technologic_write_reg16;
115 spin_lock_init(&tp->io_lock);
116
117 return 0;
118}
119
79static void sp_populate(struct sja1000_priv *priv, 120static void sp_populate(struct sja1000_priv *priv,
80 struct sja1000_platform_data *pdata, 121 struct sja1000_platform_data *pdata,
81 unsigned long resource_mem_flags) 122 unsigned long resource_mem_flags)
@@ -160,8 +201,14 @@ static void sp_populate_of(struct sja1000_priv *priv, struct device_node *of)
160 priv->cdr |= CDR_CBP; /* default */ 201 priv->cdr |= CDR_CBP; /* default */
161} 202}
162 203
204static struct sja1000_of_data technologic_data = {
205 .priv_sz = sizeof(struct technologic_priv),
206 .init = sp_technologic_init,
207};
208
163static const struct of_device_id sp_of_table[] = { 209static const struct of_device_id sp_of_table[] = {
164 { .compatible = "nxp,sja1000", .data = NULL, }, 210 { .compatible = "nxp,sja1000", .data = NULL, },
211 { .compatible = "technologic,sja1000", .data = &technologic_data, },
165 { /* sentinel */ }, 212 { /* sentinel */ },
166}; 213};
167MODULE_DEVICE_TABLE(of, sp_of_table); 214MODULE_DEVICE_TABLE(of, sp_of_table);