ipq40xx: only include ath10k-board-qca4019 for the generic subtarget
[openwrt/staging/chunkeey.git] / target / linux / generic / files / drivers / net / phy / rtl8366_smi.c
1 /*
2 * Realtek RTL8366 SMI interface driver
3 *
4 * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
9 */
10
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/device.h>
14 #include <linux/delay.h>
15 #include <linux/gpio.h>
16 #include <linux/spinlock.h>
17 #include <linux/skbuff.h>
18 #include <linux/of.h>
19 #include <linux/of_platform.h>
20 #include <linux/of_gpio.h>
21 #include <linux/rtl8366.h>
22 #include <linux/version.h>
23 #include <linux/of_mdio.h>
24
25 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
26 #include <linux/debugfs.h>
27 #endif
28
29 #include "rtl8366_smi.h"
30
31 #define RTL8366_SMI_ACK_RETRY_COUNT 5
32
33 #define RTL8366_SMI_HW_STOP_DELAY 25 /* msecs */
34 #define RTL8366_SMI_HW_START_DELAY 100 /* msecs */
35
36 static inline void rtl8366_smi_clk_delay(struct rtl8366_smi *smi)
37 {
38 ndelay(smi->clk_delay);
39 }
40
41 static void rtl8366_smi_start(struct rtl8366_smi *smi)
42 {
43 unsigned int sda = smi->gpio_sda;
44 unsigned int sck = smi->gpio_sck;
45
46 /*
47 * Set GPIO pins to output mode, with initial state:
48 * SCK = 0, SDA = 1
49 */
50 gpio_direction_output(sck, 0);
51 gpio_direction_output(sda, 1);
52 rtl8366_smi_clk_delay(smi);
53
54 /* CLK 1: 0 -> 1, 1 -> 0 */
55 gpio_set_value(sck, 1);
56 rtl8366_smi_clk_delay(smi);
57 gpio_set_value(sck, 0);
58 rtl8366_smi_clk_delay(smi);
59
60 /* CLK 2: */
61 gpio_set_value(sck, 1);
62 rtl8366_smi_clk_delay(smi);
63 gpio_set_value(sda, 0);
64 rtl8366_smi_clk_delay(smi);
65 gpio_set_value(sck, 0);
66 rtl8366_smi_clk_delay(smi);
67 gpio_set_value(sda, 1);
68 }
69
70 static void rtl8366_smi_stop(struct rtl8366_smi *smi)
71 {
72 unsigned int sda = smi->gpio_sda;
73 unsigned int sck = smi->gpio_sck;
74
75 rtl8366_smi_clk_delay(smi);
76 gpio_set_value(sda, 0);
77 gpio_set_value(sck, 1);
78 rtl8366_smi_clk_delay(smi);
79 gpio_set_value(sda, 1);
80 rtl8366_smi_clk_delay(smi);
81 gpio_set_value(sck, 1);
82 rtl8366_smi_clk_delay(smi);
83 gpio_set_value(sck, 0);
84 rtl8366_smi_clk_delay(smi);
85 gpio_set_value(sck, 1);
86
87 /* add a click */
88 rtl8366_smi_clk_delay(smi);
89 gpio_set_value(sck, 0);
90 rtl8366_smi_clk_delay(smi);
91 gpio_set_value(sck, 1);
92
93 /* set GPIO pins to input mode */
94 gpio_direction_input(sda);
95 gpio_direction_input(sck);
96 }
97
98 static void rtl8366_smi_write_bits(struct rtl8366_smi *smi, u32 data, u32 len)
99 {
100 unsigned int sda = smi->gpio_sda;
101 unsigned int sck = smi->gpio_sck;
102
103 for (; len > 0; len--) {
104 rtl8366_smi_clk_delay(smi);
105
106 /* prepare data */
107 gpio_set_value(sda, !!(data & ( 1 << (len - 1))));
108 rtl8366_smi_clk_delay(smi);
109
110 /* clocking */
111 gpio_set_value(sck, 1);
112 rtl8366_smi_clk_delay(smi);
113 gpio_set_value(sck, 0);
114 }
115 }
116
117 static void rtl8366_smi_read_bits(struct rtl8366_smi *smi, u32 len, u32 *data)
118 {
119 unsigned int sda = smi->gpio_sda;
120 unsigned int sck = smi->gpio_sck;
121
122 gpio_direction_input(sda);
123
124 for (*data = 0; len > 0; len--) {
125 u32 u;
126
127 rtl8366_smi_clk_delay(smi);
128
129 /* clocking */
130 gpio_set_value(sck, 1);
131 rtl8366_smi_clk_delay(smi);
132 u = !!gpio_get_value(sda);
133 gpio_set_value(sck, 0);
134
135 *data |= (u << (len - 1));
136 }
137
138 gpio_direction_output(sda, 0);
139 }
140
141 static int rtl8366_smi_wait_for_ack(struct rtl8366_smi *smi)
142 {
143 int retry_cnt;
144
145 retry_cnt = 0;
146 do {
147 u32 ack;
148
149 rtl8366_smi_read_bits(smi, 1, &ack);
150 if (ack == 0)
151 break;
152
153 if (++retry_cnt > RTL8366_SMI_ACK_RETRY_COUNT) {
154 dev_err(smi->parent, "ACK timeout\n");
155 return -ETIMEDOUT;
156 }
157 } while (1);
158
159 return 0;
160 }
161
162 static int rtl8366_smi_write_byte(struct rtl8366_smi *smi, u8 data)
163 {
164 rtl8366_smi_write_bits(smi, data, 8);
165 return rtl8366_smi_wait_for_ack(smi);
166 }
167
168 static int rtl8366_smi_write_byte_noack(struct rtl8366_smi *smi, u8 data)
169 {
170 rtl8366_smi_write_bits(smi, data, 8);
171 return 0;
172 }
173
174 static int rtl8366_smi_read_byte0(struct rtl8366_smi *smi, u8 *data)
175 {
176 u32 t;
177
178 /* read data */
179 rtl8366_smi_read_bits(smi, 8, &t);
180 *data = (t & 0xff);
181
182 /* send an ACK */
183 rtl8366_smi_write_bits(smi, 0x00, 1);
184
185 return 0;
186 }
187
188 static int rtl8366_smi_read_byte1(struct rtl8366_smi *smi, u8 *data)
189 {
190 u32 t;
191
192 /* read data */
193 rtl8366_smi_read_bits(smi, 8, &t);
194 *data = (t & 0xff);
195
196 /* send an ACK */
197 rtl8366_smi_write_bits(smi, 0x01, 1);
198
199 return 0;
200 }
201
202 static int __rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data)
203 {
204 unsigned long flags;
205 u8 lo = 0;
206 u8 hi = 0;
207 int ret;
208
209 spin_lock_irqsave(&smi->lock, flags);
210
211 rtl8366_smi_start(smi);
212
213 /* send READ command */
214 ret = rtl8366_smi_write_byte(smi, smi->cmd_read);
215 if (ret)
216 goto out;
217
218 /* set ADDR[7:0] */
219 ret = rtl8366_smi_write_byte(smi, addr & 0xff);
220 if (ret)
221 goto out;
222
223 /* set ADDR[15:8] */
224 ret = rtl8366_smi_write_byte(smi, addr >> 8);
225 if (ret)
226 goto out;
227
228 /* read DATA[7:0] */
229 rtl8366_smi_read_byte0(smi, &lo);
230 /* read DATA[15:8] */
231 rtl8366_smi_read_byte1(smi, &hi);
232
233 *data = ((u32) lo) | (((u32) hi) << 8);
234
235 ret = 0;
236
237 out:
238 rtl8366_smi_stop(smi);
239 spin_unlock_irqrestore(&smi->lock, flags);
240
241 return ret;
242 }
243 /* Read/write via mdiobus */
244 #define MDC_MDIO_CTRL0_REG 31
245 #define MDC_MDIO_START_REG 29
246 #define MDC_MDIO_CTRL1_REG 21
247 #define MDC_MDIO_ADDRESS_REG 23
248 #define MDC_MDIO_DATA_WRITE_REG 24
249 #define MDC_MDIO_DATA_READ_REG 25
250
251 #define MDC_MDIO_START_OP 0xFFFF
252 #define MDC_MDIO_ADDR_OP 0x000E
253 #define MDC_MDIO_READ_OP 0x0001
254 #define MDC_MDIO_WRITE_OP 0x0003
255 #define MDC_REALTEK_PHY_ADDR 0x0
256
257 int __rtl8366_mdio_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data)
258 {
259 u32 phy_id = MDC_REALTEK_PHY_ADDR;
260 struct mii_bus *mbus = smi->ext_mbus;
261
262 BUG_ON(in_interrupt());
263
264 mutex_lock(&mbus->mdio_lock);
265 /* Write Start command to register 29 */
266 mbus->write(mbus, phy_id, MDC_MDIO_START_REG, MDC_MDIO_START_OP);
267
268 /* Write address control code to register 31 */
269 mbus->write(mbus, phy_id, MDC_MDIO_CTRL0_REG, MDC_MDIO_ADDR_OP);
270
271 /* Write Start command to register 29 */
272 mbus->write(mbus, phy_id, MDC_MDIO_START_REG, MDC_MDIO_START_OP);
273
274 /* Write address to register 23 */
275 mbus->write(mbus, phy_id, MDC_MDIO_ADDRESS_REG, addr);
276
277 /* Write Start command to register 29 */
278 mbus->write(mbus, phy_id, MDC_MDIO_START_REG, MDC_MDIO_START_OP);
279
280 /* Write read control code to register 21 */
281 mbus->write(mbus, phy_id, MDC_MDIO_CTRL1_REG, MDC_MDIO_READ_OP);
282
283 /* Write Start command to register 29 */
284 mbus->write(smi->ext_mbus, phy_id, MDC_MDIO_START_REG, MDC_MDIO_START_OP);
285
286 /* Read data from register 25 */
287 *data = mbus->read(mbus, phy_id, MDC_MDIO_DATA_READ_REG);
288
289 mutex_unlock(&mbus->mdio_lock);
290
291 return 0;
292 }
293
294 static int __rtl8366_mdio_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
295 {
296 u32 phy_id = MDC_REALTEK_PHY_ADDR;
297 struct mii_bus *mbus = smi->ext_mbus;
298
299 BUG_ON(in_interrupt());
300
301 mutex_lock(&mbus->mdio_lock);
302
303 /* Write Start command to register 29 */
304 mbus->write(mbus, phy_id, MDC_MDIO_START_REG, MDC_MDIO_START_OP);
305
306 /* Write address control code to register 31 */
307 mbus->write(mbus, phy_id, MDC_MDIO_CTRL0_REG, MDC_MDIO_ADDR_OP);
308
309 /* Write Start command to register 29 */
310 mbus->write(mbus, phy_id, MDC_MDIO_START_REG, MDC_MDIO_START_OP);
311
312 /* Write address to register 23 */
313 mbus->write(mbus, phy_id, MDC_MDIO_ADDRESS_REG, addr);
314
315 /* Write Start command to register 29 */
316 mbus->write(mbus, phy_id, MDC_MDIO_START_REG, MDC_MDIO_START_OP);
317
318 /* Write data to register 24 */
319 mbus->write(mbus, phy_id, MDC_MDIO_DATA_WRITE_REG, data);
320
321 /* Write Start command to register 29 */
322 mbus->write(mbus, phy_id, MDC_MDIO_START_REG, MDC_MDIO_START_OP);
323
324 /* Write data control code to register 21 */
325 mbus->write(mbus, phy_id, MDC_MDIO_CTRL1_REG, MDC_MDIO_WRITE_OP);
326
327 mutex_unlock(&mbus->mdio_lock);
328 return 0;
329 }
330
331 int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data)
332 {
333 if (smi->ext_mbus)
334 return __rtl8366_mdio_read_reg(smi, addr, data);
335 else
336 return __rtl8366_smi_read_reg(smi, addr, data);
337 }
338 EXPORT_SYMBOL_GPL(rtl8366_smi_read_reg);
339
340 static int __rtl8366_smi_write_reg(struct rtl8366_smi *smi,
341 u32 addr, u32 data, bool ack)
342 {
343 unsigned long flags;
344 int ret;
345
346 spin_lock_irqsave(&smi->lock, flags);
347
348 rtl8366_smi_start(smi);
349
350 /* send WRITE command */
351 ret = rtl8366_smi_write_byte(smi, smi->cmd_write);
352 if (ret)
353 goto out;
354
355 /* set ADDR[7:0] */
356 ret = rtl8366_smi_write_byte(smi, addr & 0xff);
357 if (ret)
358 goto out;
359
360 /* set ADDR[15:8] */
361 ret = rtl8366_smi_write_byte(smi, addr >> 8);
362 if (ret)
363 goto out;
364
365 /* write DATA[7:0] */
366 ret = rtl8366_smi_write_byte(smi, data & 0xff);
367 if (ret)
368 goto out;
369
370 /* write DATA[15:8] */
371 if (ack)
372 ret = rtl8366_smi_write_byte(smi, data >> 8);
373 else
374 ret = rtl8366_smi_write_byte_noack(smi, data >> 8);
375 if (ret)
376 goto out;
377
378 ret = 0;
379
380 out:
381 rtl8366_smi_stop(smi);
382 spin_unlock_irqrestore(&smi->lock, flags);
383
384 return ret;
385 }
386
387 int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
388 {
389 if (smi->ext_mbus)
390 return __rtl8366_mdio_write_reg(smi, addr, data);
391 else
392 return __rtl8366_smi_write_reg(smi, addr, data, true);
393 }
394 EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg);
395
396 int rtl8366_smi_write_reg_noack(struct rtl8366_smi *smi, u32 addr, u32 data)
397 {
398 return __rtl8366_smi_write_reg(smi, addr, data, false);
399 }
400 EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg_noack);
401
402 int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data)
403 {
404 u32 t;
405 int err;
406
407 err = rtl8366_smi_read_reg(smi, addr, &t);
408 if (err)
409 return err;
410
411 err = rtl8366_smi_write_reg(smi, addr, (t & ~mask) | data);
412 return err;
413
414 }
415 EXPORT_SYMBOL_GPL(rtl8366_smi_rmwr);
416
417 static int rtl8366_reset(struct rtl8366_smi *smi)
418 {
419 if (smi->hw_reset) {
420 smi->hw_reset(smi, true);
421 msleep(RTL8366_SMI_HW_STOP_DELAY);
422 smi->hw_reset(smi, false);
423 msleep(RTL8366_SMI_HW_START_DELAY);
424 return 0;
425 }
426
427 return smi->ops->reset_chip(smi);
428 }
429
430 static int rtl8366_mc_is_used(struct rtl8366_smi *smi, int mc_index, int *used)
431 {
432 int err;
433 int i;
434
435 *used = 0;
436 for (i = 0; i < smi->num_ports; i++) {
437 int index = 0;
438
439 err = smi->ops->get_mc_index(smi, i, &index);
440 if (err)
441 return err;
442
443 if (mc_index == index) {
444 *used = 1;
445 break;
446 }
447 }
448
449 return 0;
450 }
451
452 static int rtl8366_set_vlan(struct rtl8366_smi *smi, int vid, u32 member,
453 u32 untag, u32 fid)
454 {
455 struct rtl8366_vlan_4k vlan4k;
456 int err;
457 int i;
458
459 /* Update the 4K table */
460 err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
461 if (err)
462 return err;
463
464 vlan4k.member = member;
465 vlan4k.untag = untag;
466 vlan4k.fid = fid;
467 err = smi->ops->set_vlan_4k(smi, &vlan4k);
468 if (err)
469 return err;
470
471 /* Try to find an existing MC entry for this VID */
472 for (i = 0; i < smi->num_vlan_mc; i++) {
473 struct rtl8366_vlan_mc vlanmc;
474
475 err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
476 if (err)
477 return err;
478
479 if (vid == vlanmc.vid) {
480 /* update the MC entry */
481 vlanmc.member = member;
482 vlanmc.untag = untag;
483 vlanmc.fid = fid;
484
485 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
486 break;
487 }
488 }
489
490 return err;
491 }
492
493 static int rtl8366_get_pvid(struct rtl8366_smi *smi, int port, int *val)
494 {
495 struct rtl8366_vlan_mc vlanmc;
496 int err;
497 int index;
498
499 err = smi->ops->get_mc_index(smi, port, &index);
500 if (err)
501 return err;
502
503 err = smi->ops->get_vlan_mc(smi, index, &vlanmc);
504 if (err)
505 return err;
506
507 *val = vlanmc.vid;
508 return 0;
509 }
510
511 static int rtl8366_set_pvid(struct rtl8366_smi *smi, unsigned port,
512 unsigned vid)
513 {
514 struct rtl8366_vlan_mc vlanmc;
515 struct rtl8366_vlan_4k vlan4k;
516 int err;
517 int i;
518
519 /* Try to find an existing MC entry for this VID */
520 for (i = 0; i < smi->num_vlan_mc; i++) {
521 err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
522 if (err)
523 return err;
524
525 if (vid == vlanmc.vid) {
526 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
527 if (err)
528 return err;
529
530 err = smi->ops->set_mc_index(smi, port, i);
531 return err;
532 }
533 }
534
535 /* We have no MC entry for this VID, try to find an empty one */
536 for (i = 0; i < smi->num_vlan_mc; i++) {
537 err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
538 if (err)
539 return err;
540
541 if (vlanmc.vid == 0 && vlanmc.member == 0) {
542 /* Update the entry from the 4K table */
543 err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
544 if (err)
545 return err;
546
547 vlanmc.vid = vid;
548 vlanmc.member = vlan4k.member;
549 vlanmc.untag = vlan4k.untag;
550 vlanmc.fid = vlan4k.fid;
551 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
552 if (err)
553 return err;
554
555 err = smi->ops->set_mc_index(smi, port, i);
556 return err;
557 }
558 }
559
560 /* MC table is full, try to find an unused entry and replace it */
561 for (i = 0; i < smi->num_vlan_mc; i++) {
562 int used;
563
564 err = rtl8366_mc_is_used(smi, i, &used);
565 if (err)
566 return err;
567
568 if (!used) {
569 /* Update the entry from the 4K table */
570 err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
571 if (err)
572 return err;
573
574 vlanmc.vid = vid;
575 vlanmc.member = vlan4k.member;
576 vlanmc.untag = vlan4k.untag;
577 vlanmc.fid = vlan4k.fid;
578 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
579 if (err)
580 return err;
581
582 err = smi->ops->set_mc_index(smi, port, i);
583 return err;
584 }
585 }
586
587 dev_err(smi->parent,
588 "all VLAN member configurations are in use\n");
589
590 return -ENOSPC;
591 }
592
593 int rtl8366_enable_vlan(struct rtl8366_smi *smi, int enable)
594 {
595 int err;
596
597 err = smi->ops->enable_vlan(smi, enable);
598 if (err)
599 return err;
600
601 smi->vlan_enabled = enable;
602
603 if (!enable) {
604 smi->vlan4k_enabled = 0;
605 err = smi->ops->enable_vlan4k(smi, enable);
606 }
607
608 return err;
609 }
610 EXPORT_SYMBOL_GPL(rtl8366_enable_vlan);
611
612 static int rtl8366_enable_vlan4k(struct rtl8366_smi *smi, int enable)
613 {
614 int err;
615
616 if (enable) {
617 err = smi->ops->enable_vlan(smi, enable);
618 if (err)
619 return err;
620
621 smi->vlan_enabled = enable;
622 }
623
624 err = smi->ops->enable_vlan4k(smi, enable);
625 if (err)
626 return err;
627
628 smi->vlan4k_enabled = enable;
629 return 0;
630 }
631
632 int rtl8366_enable_all_ports(struct rtl8366_smi *smi, int enable)
633 {
634 int port;
635 int err;
636
637 for (port = 0; port < smi->num_ports; port++) {
638 err = smi->ops->enable_port(smi, port, enable);
639 if (err)
640 return err;
641 }
642
643 return 0;
644 }
645 EXPORT_SYMBOL_GPL(rtl8366_enable_all_ports);
646
647 int rtl8366_reset_vlan(struct rtl8366_smi *smi)
648 {
649 struct rtl8366_vlan_mc vlanmc;
650 int err;
651 int i;
652
653 rtl8366_enable_vlan(smi, 0);
654 rtl8366_enable_vlan4k(smi, 0);
655
656 /* clear VLAN member configurations */
657 vlanmc.vid = 0;
658 vlanmc.priority = 0;
659 vlanmc.member = 0;
660 vlanmc.untag = 0;
661 vlanmc.fid = 0;
662 for (i = 0; i < smi->num_vlan_mc; i++) {
663 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
664 if (err)
665 return err;
666 }
667
668 return 0;
669 }
670 EXPORT_SYMBOL_GPL(rtl8366_reset_vlan);
671
672 static int rtl8366_init_vlan(struct rtl8366_smi *smi)
673 {
674 int port;
675 int err;
676
677 err = rtl8366_reset_vlan(smi);
678 if (err)
679 return err;
680
681 for (port = 0; port < smi->num_ports; port++) {
682 u32 mask;
683
684 if (port == smi->cpu_port)
685 mask = (1 << smi->num_ports) - 1;
686 else
687 mask = (1 << port) | (1 << smi->cpu_port);
688
689 err = rtl8366_set_vlan(smi, (port + 1), mask, mask, 0);
690 if (err)
691 return err;
692
693 err = rtl8366_set_pvid(smi, port, (port + 1));
694 if (err)
695 return err;
696 }
697
698 return rtl8366_enable_vlan(smi, 1);
699 }
700
701 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
702 int rtl8366_debugfs_open(struct inode *inode, struct file *file)
703 {
704 file->private_data = inode->i_private;
705 return 0;
706 }
707 EXPORT_SYMBOL_GPL(rtl8366_debugfs_open);
708
709 static ssize_t rtl8366_read_debugfs_vlan_mc(struct file *file,
710 char __user *user_buf,
711 size_t count, loff_t *ppos)
712 {
713 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
714 int i, len = 0;
715 char *buf = smi->buf;
716
717 len += snprintf(buf + len, sizeof(smi->buf) - len,
718 "%2s %6s %4s %6s %6s %3s\n",
719 "id", "vid","prio", "member", "untag", "fid");
720
721 for (i = 0; i < smi->num_vlan_mc; ++i) {
722 struct rtl8366_vlan_mc vlanmc;
723
724 smi->ops->get_vlan_mc(smi, i, &vlanmc);
725
726 len += snprintf(buf + len, sizeof(smi->buf) - len,
727 "%2d %6d %4d 0x%04x 0x%04x %3d\n",
728 i, vlanmc.vid, vlanmc.priority,
729 vlanmc.member, vlanmc.untag, vlanmc.fid);
730 }
731
732 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
733 }
734
735 #define RTL8366_VLAN4K_PAGE_SIZE 64
736 #define RTL8366_VLAN4K_NUM_PAGES (4096 / RTL8366_VLAN4K_PAGE_SIZE)
737
738 static ssize_t rtl8366_read_debugfs_vlan_4k(struct file *file,
739 char __user *user_buf,
740 size_t count, loff_t *ppos)
741 {
742 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
743 int i, len = 0;
744 int offset;
745 char *buf = smi->buf;
746
747 if (smi->dbg_vlan_4k_page >= RTL8366_VLAN4K_NUM_PAGES) {
748 len += snprintf(buf + len, sizeof(smi->buf) - len,
749 "invalid page: %u\n", smi->dbg_vlan_4k_page);
750 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
751 }
752
753 len += snprintf(buf + len, sizeof(smi->buf) - len,
754 "%4s %6s %6s %3s\n",
755 "vid", "member", "untag", "fid");
756
757 offset = RTL8366_VLAN4K_PAGE_SIZE * smi->dbg_vlan_4k_page;
758 for (i = 0; i < RTL8366_VLAN4K_PAGE_SIZE; i++) {
759 struct rtl8366_vlan_4k vlan4k;
760
761 smi->ops->get_vlan_4k(smi, offset + i, &vlan4k);
762
763 len += snprintf(buf + len, sizeof(smi->buf) - len,
764 "%4d 0x%04x 0x%04x %3d\n",
765 vlan4k.vid, vlan4k.member,
766 vlan4k.untag, vlan4k.fid);
767 }
768
769 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
770 }
771
772 static ssize_t rtl8366_read_debugfs_pvid(struct file *file,
773 char __user *user_buf,
774 size_t count, loff_t *ppos)
775 {
776 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
777 char *buf = smi->buf;
778 int len = 0;
779 int i;
780
781 len += snprintf(buf + len, sizeof(smi->buf) - len, "%4s %4s\n",
782 "port", "pvid");
783
784 for (i = 0; i < smi->num_ports; i++) {
785 int pvid;
786 int err;
787
788 err = rtl8366_get_pvid(smi, i, &pvid);
789 if (err)
790 len += snprintf(buf + len, sizeof(smi->buf) - len,
791 "%4d error\n", i);
792 else
793 len += snprintf(buf + len, sizeof(smi->buf) - len,
794 "%4d %4d\n", i, pvid);
795 }
796
797 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
798 }
799
800 static ssize_t rtl8366_read_debugfs_reg(struct file *file,
801 char __user *user_buf,
802 size_t count, loff_t *ppos)
803 {
804 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
805 u32 t, reg = smi->dbg_reg;
806 int err, len = 0;
807 char *buf = smi->buf;
808
809 memset(buf, '\0', sizeof(smi->buf));
810
811 err = rtl8366_smi_read_reg(smi, reg, &t);
812 if (err) {
813 len += snprintf(buf, sizeof(smi->buf),
814 "Read failed (reg: 0x%04x)\n", reg);
815 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
816 }
817
818 len += snprintf(buf, sizeof(smi->buf), "reg = 0x%04x, val = 0x%04x\n",
819 reg, t);
820
821 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
822 }
823
824 static ssize_t rtl8366_write_debugfs_reg(struct file *file,
825 const char __user *user_buf,
826 size_t count, loff_t *ppos)
827 {
828 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
829 unsigned long data;
830 u32 reg = smi->dbg_reg;
831 int err;
832 size_t len;
833 char *buf = smi->buf;
834
835 len = min(count, sizeof(smi->buf) - 1);
836 if (copy_from_user(buf, user_buf, len)) {
837 dev_err(smi->parent, "copy from user failed\n");
838 return -EFAULT;
839 }
840
841 buf[len] = '\0';
842 if (len > 0 && buf[len - 1] == '\n')
843 buf[len - 1] = '\0';
844
845
846 if (kstrtoul(buf, 16, &data)) {
847 dev_err(smi->parent, "Invalid reg value %s\n", buf);
848 } else {
849 err = rtl8366_smi_write_reg(smi, reg, data);
850 if (err) {
851 dev_err(smi->parent,
852 "writing reg 0x%04x val 0x%04lx failed\n",
853 reg, data);
854 }
855 }
856
857 return count;
858 }
859
860 static ssize_t rtl8366_read_debugfs_mibs(struct file *file,
861 char __user *user_buf,
862 size_t count, loff_t *ppos)
863 {
864 struct rtl8366_smi *smi = file->private_data;
865 int i, j, len = 0;
866 char *buf = smi->buf;
867
868 len += snprintf(buf + len, sizeof(smi->buf) - len, "%-36s",
869 "Counter");
870
871 for (i = 0; i < smi->num_ports; i++) {
872 char port_buf[10];
873
874 snprintf(port_buf, sizeof(port_buf), "Port %d", i);
875 len += snprintf(buf + len, sizeof(smi->buf) - len, " %12s",
876 port_buf);
877 }
878 len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
879
880 for (i = 0; i < smi->num_mib_counters; i++) {
881 len += snprintf(buf + len, sizeof(smi->buf) - len, "%-36s ",
882 smi->mib_counters[i].name);
883 for (j = 0; j < smi->num_ports; j++) {
884 unsigned long long counter = 0;
885
886 if (!smi->ops->get_mib_counter(smi, i, j, &counter))
887 len += snprintf(buf + len,
888 sizeof(smi->buf) - len,
889 "%12llu ", counter);
890 else
891 len += snprintf(buf + len,
892 sizeof(smi->buf) - len,
893 "%12s ", "error");
894 }
895 len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
896 }
897
898 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
899 }
900
901 static const struct file_operations fops_rtl8366_regs = {
902 .read = rtl8366_read_debugfs_reg,
903 .write = rtl8366_write_debugfs_reg,
904 .open = rtl8366_debugfs_open,
905 .owner = THIS_MODULE
906 };
907
908 static const struct file_operations fops_rtl8366_vlan_mc = {
909 .read = rtl8366_read_debugfs_vlan_mc,
910 .open = rtl8366_debugfs_open,
911 .owner = THIS_MODULE
912 };
913
914 static const struct file_operations fops_rtl8366_vlan_4k = {
915 .read = rtl8366_read_debugfs_vlan_4k,
916 .open = rtl8366_debugfs_open,
917 .owner = THIS_MODULE
918 };
919
920 static const struct file_operations fops_rtl8366_pvid = {
921 .read = rtl8366_read_debugfs_pvid,
922 .open = rtl8366_debugfs_open,
923 .owner = THIS_MODULE
924 };
925
926 static const struct file_operations fops_rtl8366_mibs = {
927 .read = rtl8366_read_debugfs_mibs,
928 .open = rtl8366_debugfs_open,
929 .owner = THIS_MODULE
930 };
931
932 static void rtl8366_debugfs_init(struct rtl8366_smi *smi)
933 {
934 struct dentry *node;
935 struct dentry *root;
936
937 if (!smi->debugfs_root)
938 smi->debugfs_root = debugfs_create_dir(dev_name(smi->parent),
939 NULL);
940
941 if (!smi->debugfs_root) {
942 dev_err(smi->parent, "Unable to create debugfs dir\n");
943 return;
944 }
945 root = smi->debugfs_root;
946
947 node = debugfs_create_x16("reg", S_IRUGO | S_IWUSR, root,
948 &smi->dbg_reg);
949 if (!node) {
950 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
951 "reg");
952 return;
953 }
954
955 node = debugfs_create_file("val", S_IRUGO | S_IWUSR, root, smi,
956 &fops_rtl8366_regs);
957 if (!node) {
958 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
959 "val");
960 return;
961 }
962
963 node = debugfs_create_file("vlan_mc", S_IRUSR, root, smi,
964 &fops_rtl8366_vlan_mc);
965 if (!node) {
966 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
967 "vlan_mc");
968 return;
969 }
970
971 node = debugfs_create_u8("vlan_4k_page", S_IRUGO | S_IWUSR, root,
972 &smi->dbg_vlan_4k_page);
973 if (!node) {
974 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
975 "vlan_4k_page");
976 return;
977 }
978
979 node = debugfs_create_file("vlan_4k", S_IRUSR, root, smi,
980 &fops_rtl8366_vlan_4k);
981 if (!node) {
982 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
983 "vlan_4k");
984 return;
985 }
986
987 node = debugfs_create_file("pvid", S_IRUSR, root, smi,
988 &fops_rtl8366_pvid);
989 if (!node) {
990 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
991 "pvid");
992 return;
993 }
994
995 node = debugfs_create_file("mibs", S_IRUSR, smi->debugfs_root, smi,
996 &fops_rtl8366_mibs);
997 if (!node)
998 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
999 "mibs");
1000 }
1001
1002 static void rtl8366_debugfs_remove(struct rtl8366_smi *smi)
1003 {
1004 if (smi->debugfs_root) {
1005 debugfs_remove_recursive(smi->debugfs_root);
1006 smi->debugfs_root = NULL;
1007 }
1008 }
1009 #else
1010 static inline void rtl8366_debugfs_init(struct rtl8366_smi *smi) {}
1011 static inline void rtl8366_debugfs_remove(struct rtl8366_smi *smi) {}
1012 #endif /* CONFIG_RTL8366_SMI_DEBUG_FS */
1013
1014 static int rtl8366_smi_mii_init(struct rtl8366_smi *smi)
1015 {
1016 int ret;
1017
1018 #ifdef CONFIG_OF
1019 struct device_node *np = NULL;
1020
1021 np = of_get_child_by_name(smi->parent->of_node, "mdio-bus");
1022 #endif
1023
1024 smi->mii_bus = mdiobus_alloc();
1025 if (smi->mii_bus == NULL) {
1026 ret = -ENOMEM;
1027 goto err;
1028 }
1029
1030 smi->mii_bus->priv = (void *) smi;
1031 smi->mii_bus->name = dev_name(smi->parent);
1032 smi->mii_bus->read = smi->ops->mii_read;
1033 smi->mii_bus->write = smi->ops->mii_write;
1034 snprintf(smi->mii_bus->id, MII_BUS_ID_SIZE, "%s",
1035 dev_name(smi->parent));
1036 smi->mii_bus->parent = smi->parent;
1037 smi->mii_bus->phy_mask = ~(0x1f);
1038
1039 #ifdef CONFIG_OF
1040 if (np)
1041 ret = of_mdiobus_register(smi->mii_bus, np);
1042 else
1043 #endif
1044 ret = mdiobus_register(smi->mii_bus);
1045
1046 if (ret)
1047 goto err_free;
1048
1049 return 0;
1050
1051 err_free:
1052 mdiobus_free(smi->mii_bus);
1053 err:
1054 return ret;
1055 }
1056
1057 static void rtl8366_smi_mii_cleanup(struct rtl8366_smi *smi)
1058 {
1059 mdiobus_unregister(smi->mii_bus);
1060 mdiobus_free(smi->mii_bus);
1061 }
1062
1063 int rtl8366_sw_reset_switch(struct switch_dev *dev)
1064 {
1065 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1066 int err;
1067
1068 err = rtl8366_reset(smi);
1069 if (err)
1070 return err;
1071
1072 err = smi->ops->setup(smi);
1073 if (err)
1074 return err;
1075
1076 err = rtl8366_reset_vlan(smi);
1077 if (err)
1078 return err;
1079
1080 err = rtl8366_enable_vlan(smi, 1);
1081 if (err)
1082 return err;
1083
1084 return rtl8366_enable_all_ports(smi, 1);
1085 }
1086 EXPORT_SYMBOL_GPL(rtl8366_sw_reset_switch);
1087
1088 int rtl8366_sw_get_port_pvid(struct switch_dev *dev, int port, int *val)
1089 {
1090 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1091 return rtl8366_get_pvid(smi, port, val);
1092 }
1093 EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_pvid);
1094
1095 int rtl8366_sw_set_port_pvid(struct switch_dev *dev, int port, int val)
1096 {
1097 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1098 return rtl8366_set_pvid(smi, port, val);
1099 }
1100 EXPORT_SYMBOL_GPL(rtl8366_sw_set_port_pvid);
1101
1102 int rtl8366_sw_get_port_mib(struct switch_dev *dev,
1103 const struct switch_attr *attr,
1104 struct switch_val *val)
1105 {
1106 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1107 int i, len = 0;
1108 unsigned long long counter = 0;
1109 char *buf = smi->buf;
1110
1111 if (val->port_vlan >= smi->num_ports)
1112 return -EINVAL;
1113
1114 len += snprintf(buf + len, sizeof(smi->buf) - len,
1115 "Port %d MIB counters\n",
1116 val->port_vlan);
1117
1118 for (i = 0; i < smi->num_mib_counters; ++i) {
1119 len += snprintf(buf + len, sizeof(smi->buf) - len,
1120 "%-36s: ", smi->mib_counters[i].name);
1121 if (!smi->ops->get_mib_counter(smi, i, val->port_vlan,
1122 &counter))
1123 len += snprintf(buf + len, sizeof(smi->buf) - len,
1124 "%llu\n", counter);
1125 else
1126 len += snprintf(buf + len, sizeof(smi->buf) - len,
1127 "%s\n", "error");
1128 }
1129
1130 val->value.s = buf;
1131 val->len = len;
1132 return 0;
1133 }
1134 EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_mib);
1135
1136 int rtl8366_sw_get_port_stats(struct switch_dev *dev, int port,
1137 struct switch_port_stats *stats,
1138 int txb_id, int rxb_id)
1139 {
1140 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1141 unsigned long long counter = 0;
1142 int ret;
1143
1144 if (port >= smi->num_ports)
1145 return -EINVAL;
1146
1147 ret = smi->ops->get_mib_counter(smi, txb_id, port, &counter);
1148 if (ret)
1149 return ret;
1150
1151 stats->tx_bytes = counter;
1152
1153 ret = smi->ops->get_mib_counter(smi, rxb_id, port, &counter);
1154 if (ret)
1155 return ret;
1156
1157 stats->rx_bytes = counter;
1158
1159 return 0;
1160 }
1161 EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_stats);
1162
1163 int rtl8366_sw_get_vlan_info(struct switch_dev *dev,
1164 const struct switch_attr *attr,
1165 struct switch_val *val)
1166 {
1167 int i;
1168 u32 len = 0;
1169 struct rtl8366_vlan_4k vlan4k;
1170 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1171 char *buf = smi->buf;
1172 int err;
1173
1174 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1175 return -EINVAL;
1176
1177 memset(buf, '\0', sizeof(smi->buf));
1178
1179 err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
1180 if (err)
1181 return err;
1182
1183 len += snprintf(buf + len, sizeof(smi->buf) - len,
1184 "VLAN %d: Ports: '", vlan4k.vid);
1185
1186 for (i = 0; i < smi->num_ports; i++) {
1187 if (!(vlan4k.member & (1 << i)))
1188 continue;
1189
1190 len += snprintf(buf + len, sizeof(smi->buf) - len, "%d%s", i,
1191 (vlan4k.untag & (1 << i)) ? "" : "t");
1192 }
1193
1194 len += snprintf(buf + len, sizeof(smi->buf) - len,
1195 "', members=%04x, untag=%04x, fid=%u",
1196 vlan4k.member, vlan4k.untag, vlan4k.fid);
1197
1198 val->value.s = buf;
1199 val->len = len;
1200
1201 return 0;
1202 }
1203 EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_info);
1204
1205 int rtl8366_sw_get_vlan_ports(struct switch_dev *dev, struct switch_val *val)
1206 {
1207 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1208 struct switch_port *port;
1209 struct rtl8366_vlan_4k vlan4k;
1210 int i;
1211
1212 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1213 return -EINVAL;
1214
1215 smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
1216
1217 port = &val->value.ports[0];
1218 val->len = 0;
1219 for (i = 0; i < smi->num_ports; i++) {
1220 if (!(vlan4k.member & BIT(i)))
1221 continue;
1222
1223 port->id = i;
1224 port->flags = (vlan4k.untag & BIT(i)) ?
1225 0 : BIT(SWITCH_PORT_FLAG_TAGGED);
1226 val->len++;
1227 port++;
1228 }
1229 return 0;
1230 }
1231 EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_ports);
1232
1233 int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
1234 {
1235 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1236 struct switch_port *port;
1237 u32 member = 0;
1238 u32 untag = 0;
1239 int err;
1240 int i;
1241
1242 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1243 return -EINVAL;
1244
1245 port = &val->value.ports[0];
1246 for (i = 0; i < val->len; i++, port++) {
1247 int pvid = 0;
1248 member |= BIT(port->id);
1249
1250 if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED)))
1251 untag |= BIT(port->id);
1252
1253 /*
1254 * To ensure that we have a valid MC entry for this VLAN,
1255 * initialize the port VLAN ID here.
1256 */
1257 err = rtl8366_get_pvid(smi, port->id, &pvid);
1258 if (err < 0)
1259 return err;
1260 if (pvid == 0) {
1261 err = rtl8366_set_pvid(smi, port->id, val->port_vlan);
1262 if (err < 0)
1263 return err;
1264 }
1265 }
1266
1267 return rtl8366_set_vlan(smi, val->port_vlan, member, untag, 0);
1268 }
1269 EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_ports);
1270
1271 int rtl8366_sw_get_vlan_fid(struct switch_dev *dev,
1272 const struct switch_attr *attr,
1273 struct switch_val *val)
1274 {
1275 struct rtl8366_vlan_4k vlan4k;
1276 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1277 int err;
1278
1279 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1280 return -EINVAL;
1281
1282 err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
1283 if (err)
1284 return err;
1285
1286 val->value.i = vlan4k.fid;
1287
1288 return 0;
1289 }
1290 EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_fid);
1291
1292 int rtl8366_sw_set_vlan_fid(struct switch_dev *dev,
1293 const struct switch_attr *attr,
1294 struct switch_val *val)
1295 {
1296 struct rtl8366_vlan_4k vlan4k;
1297 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1298 int err;
1299
1300 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1301 return -EINVAL;
1302
1303 if (val->value.i < 0 || val->value.i > attr->max)
1304 return -EINVAL;
1305
1306 err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
1307 if (err)
1308 return err;
1309
1310 return rtl8366_set_vlan(smi, val->port_vlan,
1311 vlan4k.member,
1312 vlan4k.untag,
1313 val->value.i);
1314 }
1315 EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_fid);
1316
1317 int rtl8366_sw_get_vlan_enable(struct switch_dev *dev,
1318 const struct switch_attr *attr,
1319 struct switch_val *val)
1320 {
1321 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1322
1323 if (attr->ofs > 2)
1324 return -EINVAL;
1325
1326 if (attr->ofs == 1)
1327 val->value.i = smi->vlan_enabled;
1328 else
1329 val->value.i = smi->vlan4k_enabled;
1330
1331 return 0;
1332 }
1333 EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_enable);
1334
1335 int rtl8366_sw_set_vlan_enable(struct switch_dev *dev,
1336 const struct switch_attr *attr,
1337 struct switch_val *val)
1338 {
1339 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1340 int err;
1341
1342 if (attr->ofs > 2)
1343 return -EINVAL;
1344
1345 if (attr->ofs == 1)
1346 err = rtl8366_enable_vlan(smi, val->value.i);
1347 else
1348 err = rtl8366_enable_vlan4k(smi, val->value.i);
1349
1350 return err;
1351 }
1352 EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_enable);
1353
1354 struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent)
1355 {
1356 struct rtl8366_smi *smi;
1357
1358 BUG_ON(!parent);
1359
1360 smi = kzalloc(sizeof(*smi), GFP_KERNEL);
1361 if (!smi) {
1362 dev_err(parent, "no memory for private data\n");
1363 return NULL;
1364 }
1365
1366 smi->parent = parent;
1367 return smi;
1368 }
1369 EXPORT_SYMBOL_GPL(rtl8366_smi_alloc);
1370
1371 static int __rtl8366_smi_init(struct rtl8366_smi *smi, const char *name)
1372 {
1373 int err;
1374
1375 if (!smi->ext_mbus) {
1376 err = gpio_request(smi->gpio_sda, name);
1377 if (err) {
1378 printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n",
1379 smi->gpio_sda, err);
1380 goto err_out;
1381 }
1382
1383 err = gpio_request(smi->gpio_sck, name);
1384 if (err) {
1385 printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n",
1386 smi->gpio_sck, err);
1387 goto err_free_sda;
1388 }
1389 }
1390
1391 spin_lock_init(&smi->lock);
1392
1393 /* start the switch */
1394 if (smi->hw_reset) {
1395 smi->hw_reset(smi, false);
1396 msleep(RTL8366_SMI_HW_START_DELAY);
1397 }
1398
1399 return 0;
1400
1401 err_free_sda:
1402 gpio_free(smi->gpio_sda);
1403 err_out:
1404 return err;
1405 }
1406
1407 static void __rtl8366_smi_cleanup(struct rtl8366_smi *smi)
1408 {
1409 if (smi->hw_reset)
1410 smi->hw_reset(smi, true);
1411
1412 if (!smi->ext_mbus) {
1413 gpio_free(smi->gpio_sck);
1414 gpio_free(smi->gpio_sda);
1415 }
1416 }
1417
1418 enum rtl8366_type rtl8366_smi_detect(struct rtl8366_platform_data *pdata)
1419 {
1420 static struct rtl8366_smi smi;
1421 enum rtl8366_type type = RTL8366_TYPE_UNKNOWN;
1422 u32 reg = 0;
1423
1424 memset(&smi, 0, sizeof(smi));
1425 smi.gpio_sda = pdata->gpio_sda;
1426 smi.gpio_sck = pdata->gpio_sck;
1427 smi.clk_delay = 10;
1428 smi.cmd_read = 0xa9;
1429 smi.cmd_write = 0xa8;
1430
1431 if (__rtl8366_smi_init(&smi, "rtl8366"))
1432 goto out;
1433
1434 if (rtl8366_smi_read_reg(&smi, 0x5c, &reg))
1435 goto cleanup;
1436
1437 switch(reg) {
1438 case 0x6027:
1439 printk("Found an RTL8366S switch\n");
1440 type = RTL8366_TYPE_S;
1441 break;
1442 case 0x5937:
1443 printk("Found an RTL8366RB switch\n");
1444 type = RTL8366_TYPE_RB;
1445 break;
1446 default:
1447 printk("Found an Unknown RTL8366 switch (id=0x%04x)\n", reg);
1448 break;
1449 }
1450
1451 cleanup:
1452 __rtl8366_smi_cleanup(&smi);
1453 out:
1454 return type;
1455 }
1456
1457 int rtl8366_smi_init(struct rtl8366_smi *smi)
1458 {
1459 int err;
1460
1461 if (!smi->ops)
1462 return -EINVAL;
1463
1464 err = __rtl8366_smi_init(smi, dev_name(smi->parent));
1465 if (err)
1466 goto err_out;
1467
1468 if (!smi->ext_mbus)
1469 dev_info(smi->parent, "using GPIO pins %u (SDA) and %u (SCK)\n",
1470 smi->gpio_sda, smi->gpio_sck);
1471 else
1472 dev_info(smi->parent, "using MDIO bus '%s'\n", smi->ext_mbus->name);
1473
1474 err = smi->ops->detect(smi);
1475 if (err) {
1476 dev_err(smi->parent, "chip detection failed, err=%d\n", err);
1477 goto err_free_sck;
1478 }
1479
1480 err = rtl8366_reset(smi);
1481 if (err)
1482 goto err_free_sck;
1483
1484 err = smi->ops->setup(smi);
1485 if (err) {
1486 dev_err(smi->parent, "chip setup failed, err=%d\n", err);
1487 goto err_free_sck;
1488 }
1489
1490 err = rtl8366_init_vlan(smi);
1491 if (err) {
1492 dev_err(smi->parent, "VLAN initialization failed, err=%d\n",
1493 err);
1494 goto err_free_sck;
1495 }
1496
1497 err = rtl8366_enable_all_ports(smi, 1);
1498 if (err)
1499 goto err_free_sck;
1500
1501 err = rtl8366_smi_mii_init(smi);
1502 if (err)
1503 goto err_free_sck;
1504
1505 rtl8366_debugfs_init(smi);
1506
1507 return 0;
1508
1509 err_free_sck:
1510 __rtl8366_smi_cleanup(smi);
1511 err_out:
1512 return err;
1513 }
1514 EXPORT_SYMBOL_GPL(rtl8366_smi_init);
1515
1516 void rtl8366_smi_cleanup(struct rtl8366_smi *smi)
1517 {
1518 rtl8366_debugfs_remove(smi);
1519 rtl8366_smi_mii_cleanup(smi);
1520 __rtl8366_smi_cleanup(smi);
1521 }
1522 EXPORT_SYMBOL_GPL(rtl8366_smi_cleanup);
1523
1524 #ifdef CONFIG_OF
1525 static void rtl8366_smi_reset(struct rtl8366_smi *smi, bool active)
1526 {
1527 if (active)
1528 reset_control_assert(smi->reset);
1529 else
1530 reset_control_deassert(smi->reset);
1531 }
1532
1533 int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi)
1534 {
1535 int sck = of_get_named_gpio(pdev->dev.of_node, "gpio-sck", 0);
1536 int sda = of_get_named_gpio(pdev->dev.of_node, "gpio-sda", 0);
1537 struct device_node *np = pdev->dev.of_node;
1538 struct device_node *mdio_node;
1539
1540 mdio_node = of_parse_phandle(np, "mii-bus", 0);
1541 if (!mdio_node) {
1542 dev_err(&pdev->dev, "cannot find mdio node phandle");
1543 goto try_gpio;
1544 }
1545
1546 smi->ext_mbus = of_mdio_find_bus(mdio_node);
1547 if (!smi->ext_mbus) {
1548 dev_info(&pdev->dev,
1549 "cannot find mdio bus from bus handle (yet)");
1550 goto try_gpio;
1551 }
1552
1553 return 0;
1554
1555 try_gpio:
1556 if (!gpio_is_valid(sck) || !gpio_is_valid(sda)) {
1557 if (!mdio_node) {
1558 dev_err(&pdev->dev, "gpios missing in devictree\n");
1559 return -EINVAL;
1560 } else {
1561 return -EPROBE_DEFER;
1562 }
1563 }
1564
1565 smi->gpio_sda = sda;
1566 smi->gpio_sck = sck;
1567 smi->reset = devm_reset_control_get(&pdev->dev, "switch");
1568 if (!IS_ERR(smi->reset))
1569 smi->hw_reset = rtl8366_smi_reset;
1570
1571 return 0;
1572 }
1573 #else
1574 static inline int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi)
1575 {
1576 return -ENODEV;
1577 }
1578 #endif
1579
1580 int rtl8366_smi_probe_plat(struct platform_device *pdev, struct rtl8366_smi *smi)
1581 {
1582 struct rtl8366_platform_data *pdata = pdev->dev.platform_data;
1583
1584 if (!pdev->dev.platform_data) {
1585 dev_err(&pdev->dev, "no platform data specified\n");
1586 return -EINVAL;
1587 }
1588
1589 smi->gpio_sda = pdata->gpio_sda;
1590 smi->gpio_sck = pdata->gpio_sck;
1591 smi->hw_reset = pdata->hw_reset;
1592
1593 return 0;
1594 }
1595
1596
1597 struct rtl8366_smi *rtl8366_smi_probe(struct platform_device *pdev)
1598 {
1599 struct rtl8366_smi *smi;
1600 int err;
1601
1602 smi = rtl8366_smi_alloc(&pdev->dev);
1603 if (!smi)
1604 return NULL;
1605
1606 if (pdev->dev.of_node)
1607 err = rtl8366_smi_probe_of(pdev, smi);
1608 else
1609 err = rtl8366_smi_probe_plat(pdev, smi);
1610
1611 if (err)
1612 goto free_smi;
1613
1614 return smi;
1615
1616 free_smi:
1617 kfree(smi);
1618 return ERR_PTR(err);
1619 }
1620 EXPORT_SYMBOL_GPL(rtl8366_smi_probe);
1621
1622 MODULE_DESCRIPTION("Realtek RTL8366 SMI interface driver");
1623 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
1624 MODULE_LICENSE("GPL v2");