blob: b868e458d0b5dc7929ac44f38ae5d140b9727d66 [file] [log] [blame]
Akinobu Mita630cf092016-04-15 00:11:32 +09001/*
Akinobu Mita35ef7d62016-04-27 05:43:48 +09002 * Ethernet driver for the WIZnet W5100/W5200/W5500 chip.
Akinobu Mita630cf092016-04-15 00:11:32 +09003 *
4 * Copyright (C) 2016 Akinobu Mita <akinobu.mita@gmail.com>
5 *
6 * Licensed under the GPL-2 or later.
Akinobu Mita0c165ff2016-04-15 00:11:33 +09007 *
8 * Datasheet:
9 * http://www.wiznet.co.kr/wp-content/uploads/wiznethome/Chip/W5100/Document/W5100_Datasheet_v1.2.6.pdf
10 * http://wiznethome.cafe24.com/wp-content/uploads/wiznethome/Chip/W5200/Documents/W5200_DS_V140E.pdf
Akinobu Mita35ef7d62016-04-27 05:43:48 +090011 * http://wizwiki.net/wiki/lib/exe/fetch.php?media=products:w5500:w5500_ds_v106e_141230.pdf
Akinobu Mita630cf092016-04-15 00:11:32 +090012 */
13
14#include <linux/kernel.h>
15#include <linux/module.h>
16#include <linux/delay.h>
17#include <linux/netdevice.h>
18#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;
417
418 switch (id->driver_data) {
419 case W5100:
420 ops = &w5100_spi_ops;
421 priv_size = 0;
422 break;
423 case W5200:
424 ops = &w5200_ops;
425 priv_size = sizeof(struct w5200_spi_priv);
426 break;
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900427 case W5500:
428 ops = &w5500_ops;
429 priv_size = sizeof(struct w5500_spi_priv);
430 break;
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900431 default:
432 return -EINVAL;
433 }
434
435 return w5100_probe(&spi->dev, ops, priv_size, NULL, spi->irq, -EINVAL);
Akinobu Mita630cf092016-04-15 00:11:32 +0900436}
437
438static int w5100_spi_remove(struct spi_device *spi)
439{
440 return w5100_remove(&spi->dev);
441}
442
443static const struct spi_device_id w5100_spi_ids[] = {
Akinobu Mita0c165ff2016-04-15 00:11:33 +0900444 { "w5100", W5100 },
445 { "w5200", W5200 },
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900446 { "w5500", W5500 },
Akinobu Mita630cf092016-04-15 00:11:32 +0900447 {}
448};
449MODULE_DEVICE_TABLE(spi, w5100_spi_ids);
450
451static struct spi_driver w5100_spi_driver = {
452 .driver = {
453 .name = "w5100",
454 .pm = &w5100_pm_ops,
455 },
456 .probe = w5100_spi_probe,
457 .remove = w5100_spi_remove,
458 .id_table = w5100_spi_ids,
459};
460module_spi_driver(w5100_spi_driver);
461
Akinobu Mita35ef7d62016-04-27 05:43:48 +0900462MODULE_DESCRIPTION("WIZnet W5100/W5200/W5500 Ethernet driver for SPI mode");
Akinobu Mita630cf092016-04-15 00:11:32 +0900463MODULE_AUTHOR("Akinobu Mita <akinobu.mita@gmail.com>");
464MODULE_LICENSE("GPL");