blob: 918b3e50850a793d7366effef5c8301c280ea50a [file] [log] [blame]
Thomas Gleixner80503b22019-05-24 12:04:09 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Akinobu Mita630cf092016-04-15 00:11:32 +09002/*
Akinobu Mita35ef7d62016-04-27 05:43:48 +09003 * Ethernet driver for the WIZnet W5100/W5200/W5500 chip.
Akinobu Mita630cf092016-04-15 00:11:32 +09004 *
5 * Copyright (C) 2016 Akinobu Mita <akinobu.mita@gmail.com>
6 *
Akinobu Mita0c165ff2016-04-15 00:11:33 +09007 * Datasheet:
8 * http://www.wiznet.co.kr/wp-content/uploads/wiznethome/Chip/W5100/Document/W5100_Datasheet_v1.2.6.pdf
9 * http://wiznethome.cafe24.com/wp-content/uploads/wiznethome/Chip/W5200/Documents/W5200_DS_V140E.pdf
Akinobu Mita35ef7d62016-04-27 05:43:48 +090010 * http://wizwiki.net/wiki/lib/exe/fetch.php?media=products:w5500:w5500_ds_v106e_141230.pdf
Akinobu Mita630cf092016-04-15 00:11:32 +090011 */
12
13#include <linux/kernel.h>
14#include <linux/module.h>
15#include <linux/delay.h>
16#include <linux/netdevice.h>
Akinobu Mitac3875ca2016-05-14 14:55:50 +090017#include <linux/of_net.h>
Akinobu Mita630cf092016-04-15 00:11:32 +090018#include <linux/spi/spi.h>
19
20#include "w5100.h"
21
22#define W5100_SPI_WRITE_OPCODE 0xf0
23#define W5100_SPI_READ_OPCODE 0x0f
24
Akinobu Mita35ef7d62016-04-27 05:43:48 +090025static int w5100_spi_read(struct net_device *ndev, u32 addr)
Akinobu Mita630cf092016-04-15 00:11:32 +090026{
27 struct spi_device *spi = to_spi_device(ndev->dev.parent);
28 u8 cmd[3] = { W5100_SPI_READ_OPCODE, addr >> 8, addr & 0xff };
29 u8 data;
30 int ret;
31
32 ret = spi_write_then_read(spi, cmd, sizeof(cmd), &data, 1);
33
34 return ret ? ret : data;
35}
36
Akinobu Mita35ef7d62016-04-27 05:43:48 +090037static int w5100_spi_write(struct net_device *ndev, u32 addr, u8 data)
Akinobu Mita630cf092016-04-15 00:11:32 +090038{
39 struct spi_device *spi = to_spi_device(ndev->dev.parent);
40 u8 cmd[4] = { W5100_SPI_WRITE_OPCODE, addr >> 8, addr & 0xff, data};
41
42 return spi_write_then_read(spi, cmd, sizeof(cmd), NULL, 0);
43}
44
Akinobu Mita35ef7d62016-04-27 05:43:48 +090045static int w5100_spi_read16(struct net_device *ndev, u32 addr)
Akinobu Mita630cf092016-04-15 00:11:32 +090046{
47 u16 data;
48 int ret;
49
50 ret = w5100_spi_read(ndev, addr);
51 if (ret < 0)
52 return ret;
53 data = ret << 8;
54 ret = w5100_spi_read(ndev, addr + 1);
55
56 return ret < 0 ? ret : data | ret;
57}
58
Akinobu Mita35ef7d62016-04-27 05:43:48 +090059static int w5100_spi_write16(struct net_device *ndev, u32 addr, u16 data)
Akinobu Mita630cf092016-04-15 00:11:32 +090060{
61 int ret;
62
63 ret = w5100_spi_write(ndev, addr, data >> 8);
64 if (ret)
65 return ret;
66
67 return w5100_spi_write(ndev, addr + 1, data & 0xff);
68}
69
Akinobu Mita35ef7d62016-04-27 05:43:48 +090070static int w5100_spi_readbulk(struct net_device *ndev, u32 addr, u8 *buf,
Akinobu Mita630cf092016-04-15 00:11:32 +090071 int len)
72{
73 int i;
74
75 for (i = 0; i < len; i++) {
76 int ret = w5100_spi_read(ndev, addr + i);
77
78 if (ret < 0)
79 return ret;
80 buf[i] = ret;
81 }
82
83 return 0;
84}
85
Akinobu Mita35ef7d62016-04-27 05:43:48 +090086static int w5100_spi_writebulk(struct net_device *ndev, u32 addr, const u8 *buf,
Akinobu Mita630cf092016-04-15 00:11:32 +090087 int len)
88{
89 int i;
90
91 for (i = 0; i < len; i++) {
92 int ret = w5100_spi_write(ndev, addr + i, buf[i]);
93
94 if (ret)
95 return ret;
96 }
97
98 return 0;
99}
100
101static const struct w5100_ops w5100_spi_ops = {
102 .may_sleep = true,
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900103 .chip_id = W5100,
Akinobu Mita630cf092016-04-15 00:11:32 +0900104 .read = w5100_spi_read,
105 .write = w5100_spi_write,
106 .read16 = w5100_spi_read16,
107 .write16 = w5100_spi_write16,
108 .readbulk = w5100_spi_readbulk,
109 .writebulk = w5100_spi_writebulk,
110};
111
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900112#define W5200_SPI_WRITE_OPCODE 0x80
113
114struct w5200_spi_priv {
115 /* Serialize access to cmd_buf */
116 struct mutex cmd_lock;
117
118 /* DMA (thus cache coherency maintenance) requires the
119 * transfer buffers to live in their own cache lines.
120 */
121 u8 cmd_buf[4] ____cacheline_aligned;
122};
123
124static struct w5200_spi_priv *w5200_spi_priv(struct net_device *ndev)
125{
126 return w5100_ops_priv(ndev);
127}
128
129static int w5200_spi_init(struct net_device *ndev)
130{
131 struct w5200_spi_priv *spi_priv = w5200_spi_priv(ndev);
132
133 mutex_init(&spi_priv->cmd_lock);
134
135 return 0;
136}
137
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900138static int w5200_spi_read(struct net_device *ndev, u32 addr)
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900139{
140 struct spi_device *spi = to_spi_device(ndev->dev.parent);
141 u8 cmd[4] = { addr >> 8, addr & 0xff, 0, 1 };
142 u8 data;
143 int ret;
144
145 ret = spi_write_then_read(spi, cmd, sizeof(cmd), &data, 1);
146
147 return ret ? ret : data;
148}
149
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900150static int w5200_spi_write(struct net_device *ndev, u32 addr, u8 data)
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900151{
152 struct spi_device *spi = to_spi_device(ndev->dev.parent);
153 u8 cmd[5] = { addr >> 8, addr & 0xff, W5200_SPI_WRITE_OPCODE, 1, data };
154
155 return spi_write_then_read(spi, cmd, sizeof(cmd), NULL, 0);
156}
157
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900158static int w5200_spi_read16(struct net_device *ndev, u32 addr)
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900159{
160 struct spi_device *spi = to_spi_device(ndev->dev.parent);
161 u8 cmd[4] = { addr >> 8, addr & 0xff, 0, 2 };
162 __be16 data;
163 int ret;
164
165 ret = spi_write_then_read(spi, cmd, sizeof(cmd), &data, sizeof(data));
166
167 return ret ? ret : be16_to_cpu(data);
168}
169
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900170static int w5200_spi_write16(struct net_device *ndev, u32 addr, u16 data)
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900171{
172 struct spi_device *spi = to_spi_device(ndev->dev.parent);
173 u8 cmd[6] = {
174 addr >> 8, addr & 0xff,
175 W5200_SPI_WRITE_OPCODE, 2,
176 data >> 8, data & 0xff
177 };
178
179 return spi_write_then_read(spi, cmd, sizeof(cmd), NULL, 0);
180}
181
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900182static int w5200_spi_readbulk(struct net_device *ndev, u32 addr, u8 *buf,
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900183 int len)
184{
185 struct spi_device *spi = to_spi_device(ndev->dev.parent);
186 struct w5200_spi_priv *spi_priv = w5200_spi_priv(ndev);
187 struct spi_transfer xfer[] = {
188 {
189 .tx_buf = spi_priv->cmd_buf,
190 .len = sizeof(spi_priv->cmd_buf),
191 },
192 {
193 .rx_buf = buf,
194 .len = len,
195 },
196 };
197 int ret;
198
199 mutex_lock(&spi_priv->cmd_lock);
200
201 spi_priv->cmd_buf[0] = addr >> 8;
202 spi_priv->cmd_buf[1] = addr;
203 spi_priv->cmd_buf[2] = len >> 8;
204 spi_priv->cmd_buf[3] = len;
205 ret = spi_sync_transfer(spi, xfer, ARRAY_SIZE(xfer));
206
207 mutex_unlock(&spi_priv->cmd_lock);
208
209 return ret;
210}
211
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900212static int w5200_spi_writebulk(struct net_device *ndev, u32 addr, const u8 *buf,
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900213 int len)
214{
215 struct spi_device *spi = to_spi_device(ndev->dev.parent);
216 struct w5200_spi_priv *spi_priv = w5200_spi_priv(ndev);
217 struct spi_transfer xfer[] = {
218 {
219 .tx_buf = spi_priv->cmd_buf,
220 .len = sizeof(spi_priv->cmd_buf),
221 },
222 {
223 .tx_buf = buf,
224 .len = len,
225 },
226 };
227 int ret;
228
229 mutex_lock(&spi_priv->cmd_lock);
230
231 spi_priv->cmd_buf[0] = addr >> 8;
232 spi_priv->cmd_buf[1] = addr;
233 spi_priv->cmd_buf[2] = W5200_SPI_WRITE_OPCODE | (len >> 8);
234 spi_priv->cmd_buf[3] = len;
235 ret = spi_sync_transfer(spi, xfer, ARRAY_SIZE(xfer));
236
237 mutex_unlock(&spi_priv->cmd_lock);
238
239 return ret;
240}
241
242static const struct w5100_ops w5200_ops = {
243 .may_sleep = true,
244 .chip_id = W5200,
245 .read = w5200_spi_read,
246 .write = w5200_spi_write,
247 .read16 = w5200_spi_read16,
248 .write16 = w5200_spi_write16,
249 .readbulk = w5200_spi_readbulk,
250 .writebulk = w5200_spi_writebulk,
251 .init = w5200_spi_init,
252};
253
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900254#define W5500_SPI_BLOCK_SELECT(addr) (((addr) >> 16) & 0x1f)
255#define W5500_SPI_READ_CONTROL(addr) (W5500_SPI_BLOCK_SELECT(addr) << 3)
256#define W5500_SPI_WRITE_CONTROL(addr) \
257 ((W5500_SPI_BLOCK_SELECT(addr) << 3) | BIT(2))
258
259struct w5500_spi_priv {
260 /* Serialize access to cmd_buf */
261 struct mutex cmd_lock;
262
263 /* DMA (thus cache coherency maintenance) requires the
264 * transfer buffers to live in their own cache lines.
265 */
266 u8 cmd_buf[3] ____cacheline_aligned;
267};
268
269static struct w5500_spi_priv *w5500_spi_priv(struct net_device *ndev)
270{
271 return w5100_ops_priv(ndev);
272}
273
274static int w5500_spi_init(struct net_device *ndev)
275{
276 struct w5500_spi_priv *spi_priv = w5500_spi_priv(ndev);
277
278 mutex_init(&spi_priv->cmd_lock);
279
280 return 0;
281}
282
283static int w5500_spi_read(struct net_device *ndev, u32 addr)
284{
285 struct spi_device *spi = to_spi_device(ndev->dev.parent);
286 u8 cmd[3] = {
287 addr >> 8,
288 addr,
289 W5500_SPI_READ_CONTROL(addr)
290 };
291 u8 data;
292 int ret;
293
294 ret = spi_write_then_read(spi, cmd, sizeof(cmd), &data, 1);
295
296 return ret ? ret : data;
297}
298
299static int w5500_spi_write(struct net_device *ndev, u32 addr, u8 data)
300{
301 struct spi_device *spi = to_spi_device(ndev->dev.parent);
302 u8 cmd[4] = {
303 addr >> 8,
304 addr,
305 W5500_SPI_WRITE_CONTROL(addr),
306 data
307 };
308
309 return spi_write_then_read(spi, cmd, sizeof(cmd), NULL, 0);
310}
311
312static int w5500_spi_read16(struct net_device *ndev, u32 addr)
313{
314 struct spi_device *spi = to_spi_device(ndev->dev.parent);
315 u8 cmd[3] = {
316 addr >> 8,
317 addr,
318 W5500_SPI_READ_CONTROL(addr)
319 };
320 __be16 data;
321 int ret;
322
323 ret = spi_write_then_read(spi, cmd, sizeof(cmd), &data, sizeof(data));
324
325 return ret ? ret : be16_to_cpu(data);
326}
327
328static int w5500_spi_write16(struct net_device *ndev, u32 addr, u16 data)
329{
330 struct spi_device *spi = to_spi_device(ndev->dev.parent);
331 u8 cmd[5] = {
332 addr >> 8,
333 addr,
334 W5500_SPI_WRITE_CONTROL(addr),
335 data >> 8,
336 data
337 };
338
339 return spi_write_then_read(spi, cmd, sizeof(cmd), NULL, 0);
340}
341
342static int w5500_spi_readbulk(struct net_device *ndev, u32 addr, u8 *buf,
343 int len)
344{
345 struct spi_device *spi = to_spi_device(ndev->dev.parent);
346 struct w5500_spi_priv *spi_priv = w5500_spi_priv(ndev);
347 struct spi_transfer xfer[] = {
348 {
349 .tx_buf = spi_priv->cmd_buf,
350 .len = sizeof(spi_priv->cmd_buf),
351 },
352 {
353 .rx_buf = buf,
354 .len = len,
355 },
356 };
357 int ret;
358
359 mutex_lock(&spi_priv->cmd_lock);
360
361 spi_priv->cmd_buf[0] = addr >> 8;
362 spi_priv->cmd_buf[1] = addr;
363 spi_priv->cmd_buf[2] = W5500_SPI_READ_CONTROL(addr);
364 ret = spi_sync_transfer(spi, xfer, ARRAY_SIZE(xfer));
365
366 mutex_unlock(&spi_priv->cmd_lock);
367
368 return ret;
369}
370
371static int w5500_spi_writebulk(struct net_device *ndev, u32 addr, const u8 *buf,
372 int len)
373{
374 struct spi_device *spi = to_spi_device(ndev->dev.parent);
375 struct w5500_spi_priv *spi_priv = w5500_spi_priv(ndev);
376 struct spi_transfer xfer[] = {
377 {
378 .tx_buf = spi_priv->cmd_buf,
379 .len = sizeof(spi_priv->cmd_buf),
380 },
381 {
382 .tx_buf = buf,
383 .len = len,
384 },
385 };
386 int ret;
387
388 mutex_lock(&spi_priv->cmd_lock);
389
390 spi_priv->cmd_buf[0] = addr >> 8;
391 spi_priv->cmd_buf[1] = addr;
392 spi_priv->cmd_buf[2] = W5500_SPI_WRITE_CONTROL(addr);
393 ret = spi_sync_transfer(spi, xfer, ARRAY_SIZE(xfer));
394
395 mutex_unlock(&spi_priv->cmd_lock);
396
397 return ret;
398}
399
400static const struct w5100_ops w5500_ops = {
401 .may_sleep = true,
402 .chip_id = W5500,
403 .read = w5500_spi_read,
404 .write = w5500_spi_write,
405 .read16 = w5500_spi_read16,
406 .write16 = w5500_spi_write16,
407 .readbulk = w5500_spi_readbulk,
408 .writebulk = w5500_spi_writebulk,
409 .init = w5500_spi_init,
410};
411
Akinobu Mita630cf092016-04-15 00:11:32 +0900412static int w5100_spi_probe(struct spi_device *spi)
413{
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900414 const struct spi_device_id *id = spi_get_device_id(spi);
415 const struct w5100_ops *ops;
416 int priv_size;
Akinobu Mitac3875ca2016-05-14 14:55:50 +0900417 const void *mac = of_get_mac_address(spi->dev.of_node);
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900418
419 switch (id->driver_data) {
420 case W5100:
421 ops = &w5100_spi_ops;
422 priv_size = 0;
423 break;
424 case W5200:
425 ops = &w5200_ops;
426 priv_size = sizeof(struct w5200_spi_priv);
427 break;
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900428 case W5500:
429 ops = &w5500_ops;
430 priv_size = sizeof(struct w5500_spi_priv);
431 break;
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900432 default:
433 return -EINVAL;
434 }
435
Akinobu Mitac3875ca2016-05-14 14:55:50 +0900436 return w5100_probe(&spi->dev, ops, priv_size, mac, spi->irq, -EINVAL);
Akinobu Mita630cf092016-04-15 00:11:32 +0900437}
438
439static int w5100_spi_remove(struct spi_device *spi)
440{
441 return w5100_remove(&spi->dev);
442}
443
444static const struct spi_device_id w5100_spi_ids[] = {
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900445 { "w5100", W5100 },
446 { "w5200", W5200 },
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900447 { "w5500", W5500 },
Akinobu Mita630cf092016-04-15 00:11:32 +0900448 {}
449};
450MODULE_DEVICE_TABLE(spi, w5100_spi_ids);
451
452static struct spi_driver w5100_spi_driver = {
453 .driver = {
454 .name = "w5100",
455 .pm = &w5100_pm_ops,
456 },
457 .probe = w5100_spi_probe,
458 .remove = w5100_spi_remove,
459 .id_table = w5100_spi_ids,
460};
461module_spi_driver(w5100_spi_driver);
462
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900463MODULE_DESCRIPTION("WIZnet W5100/W5200/W5500 Ethernet driver for SPI mode");
Akinobu Mita630cf092016-04-15 00:11:32 +0900464MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>");
465MODULE_LICENSE("GPL");