OpenWrt – Blame information for rev 4
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | From c291443dc97dadcf0c6afd04688a7d9f79a221b5 Mon Sep 17 00:00:00 2001 |
2 | From: Daniel Schwierzeck <daniel.schwierzeck@gmail.com> |
||
3 | Date: Wed, 29 Aug 2012 22:08:16 +0200 |
||
4 | Subject: net: switchlib: add driver for Lantiq ADM6996I switch family |
||
5 | |||
6 | Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com> |
||
7 | |||
8 | --- a/drivers/net/switch/Makefile |
||
9 | +++ b/drivers/net/switch/Makefile |
||
10 | @@ -11,6 +11,7 @@ LIB := $(obj)libswitch.o |
||
11 | |||
12 | COBJS-$(CONFIG_SWITCH_MULTI) += switch.o |
||
13 | COBJS-$(CONFIG_SWITCH_PSB697X) += psb697x.o |
||
14 | +COBJS-$(CONFIG_SWITCH_ADM6996I) += adm6996i.o |
||
15 | |||
16 | COBJS := $(COBJS-y) |
||
17 | SRCS := $(COBJS:.o=.c) |
||
18 | --- /dev/null |
||
19 | +++ b/drivers/net/switch/adm6996i.c |
||
20 | @@ -0,0 +1,115 @@ |
||
21 | +/* |
||
22 | + * Copyright (C) 2011-2013 Daniel Schwierzeck, daniel.schwierzeck@gmail.com |
||
23 | + * |
||
24 | + * SPDX-License-Identifier: GPL-2.0+ |
||
25 | + */ |
||
26 | + |
||
27 | +#include <common.h> |
||
28 | +#include <malloc.h> |
||
29 | +#include <switch.h> |
||
30 | +#include <miiphy.h> |
||
31 | + |
||
32 | +#define ADM6996I_CHIPID0 0x1020 |
||
33 | +#define ADM6996I_CHIPID1 0x0007 |
||
34 | +#define ADM6996I_PORT_COUNT 6 |
||
35 | + |
||
36 | +#define ADM6996I_REG_P0BC 0x001 /* P0 Basic Control */ |
||
37 | +#define ADM6996I_REG_P1BC 0x003 /* P1 Basic Control */ |
||
38 | +#define ADM6996I_REG_P2BC 0x005 /* P2 Basic Control */ |
||
39 | +#define ADM6996I_REG_P3BC 0x007 /* P3 Basic Control */ |
||
40 | +#define ADM6996I_REG_P4BC 0x008 /* P4 Basic Control */ |
||
41 | +#define ADM6996I_REG_P5BC 0x009 /* P5 Basic Control */ |
||
42 | + |
||
43 | +#define ADM6996I_REG_P0EC 0x002 /* P0 Extended Control */ |
||
44 | +#define ADM6996I_REG_P1EC 0x002 /* P1 Extended Control */ |
||
45 | +#define ADM6996I_REG_P2EC 0x004 /* P2 Extended Control */ |
||
46 | +#define ADM6996I_REG_P3EC 0x004 /* P3 Extended Control */ |
||
47 | +#define ADM6996I_REG_P4EC 0x006 /* P4 Extended Control */ |
||
48 | +#define ADM6996I_REG_P5EC 0x006 /* P5 Extended Control */ |
||
49 | + |
||
50 | +#define ADM6996I_REG_SC4 0x012 /* System Control 4 */ |
||
51 | + |
||
52 | +#define ADM6996I_REG_CI0 0xA0 /* Chip Identifier 0 */ |
||
53 | +#define ADM6996I_REG_CI1 0xA1 /* Chip Identifier 1 */ |
||
54 | + |
||
55 | +#define ADM6996I_REG_PXBC_DEFAULT 0x040F |
||
56 | +#define ADM6996I_REG_PXBC_CROSS_EE (1 << 15) |
||
57 | +#define ADM6996I_REG_PXBC_PD (1 << 5) |
||
58 | + |
||
59 | +#define ADM6996I_REG_SC4_DEFAULT 0x3600 |
||
60 | +#define ADM6996I_REG_SC4_LED_ENABLE (1 << 1) |
||
61 | + |
||
62 | +#define ADM6996I_REG_CI0_PC_MASK 0xFFF0 |
||
63 | +#define ADM6996I_REG_CI0_VN_MASK 0xF |
||
64 | +#define ADM6996I_REG_CI1_PC_MASK 0xF |
||
65 | + |
||
66 | + |
||
67 | +static inline int adm6996i_mii_read(struct mii_dev *bus, u16 reg) |
||
68 | +{ |
||
69 | + int ret; |
||
70 | + |
||
71 | + ret = bus->read(bus, (reg >> 5) & 0x1f, MDIO_DEVAD_NONE, reg & 0x1f); |
||
72 | + |
||
73 | + return ret; |
||
74 | +} |
||
75 | + |
||
76 | +static inline int adm6996i_mii_write(struct mii_dev *bus, u16 reg, u16 val) |
||
77 | +{ |
||
78 | + int ret; |
||
79 | + |
||
80 | + ret = bus->write(bus, (reg >> 5) & 0x1f, MDIO_DEVAD_NONE, |
||
81 | + reg & 0x1f, val); |
||
82 | + |
||
83 | + return ret; |
||
84 | +} |
||
85 | + |
||
86 | +static int adm6996i_probe(struct switch_device *dev) |
||
87 | +{ |
||
88 | + struct mii_dev *bus = dev->bus; |
||
89 | + u16 ci0, ci1; |
||
90 | + |
||
91 | + ci0 = adm6996i_mii_read(bus, ADM6996I_REG_CI0); |
||
92 | + ci1 = adm6996i_mii_read(bus, ADM6996I_REG_CI1); |
||
93 | + |
||
94 | + ci0 &= ADM6996I_REG_CI0_PC_MASK; |
||
95 | + ci1 &= ADM6996I_REG_CI1_PC_MASK; |
||
96 | + |
||
97 | + if (ci0 == ADM6996I_CHIPID0 && ci1 == ADM6996I_CHIPID1) |
||
98 | + return 0; |
||
99 | + |
||
100 | + return 1; |
||
101 | +} |
||
102 | + |
||
103 | +static void adm6996i_setup(struct switch_device *dev) |
||
104 | +{ |
||
105 | + struct mii_dev *bus = dev->bus; |
||
106 | + u16 val; |
||
107 | + |
||
108 | + /* |
||
109 | + * Write default values (Port enable, 100 Mbps, Full Duplex, |
||
110 | + * Auto negotiation, Flow control) and enable crossover auto-detect |
||
111 | + */ |
||
112 | + val = ADM6996I_REG_PXBC_DEFAULT | ADM6996I_REG_PXBC_CROSS_EE; |
||
113 | + adm6996i_mii_write(bus, ADM6996I_REG_P0BC, val); |
||
114 | + adm6996i_mii_write(bus, ADM6996I_REG_P1BC, val); |
||
115 | + adm6996i_mii_write(bus, ADM6996I_REG_P2BC, val); |
||
116 | + adm6996i_mii_write(bus, ADM6996I_REG_P3BC, val); |
||
117 | + adm6996i_mii_write(bus, ADM6996I_REG_P4BC, val); |
||
118 | + adm6996i_mii_write(bus, ADM6996I_REG_P5BC, val); |
||
119 | + |
||
120 | + val = ADM6996I_REG_SC4_DEFAULT | ADM6996I_REG_SC4_LED_ENABLE; |
||
121 | + adm6996i_mii_write(bus, ADM6996I_REG_SC4, val); |
||
122 | +} |
||
123 | + |
||
124 | +static struct switch_driver adm6996i_drv = { |
||
125 | + .name = "adm6996i", |
||
126 | +}; |
||
127 | + |
||
128 | +void switch_adm6996i_init(void) |
||
129 | +{ |
||
130 | + /* For archs with manual relocation */ |
||
131 | + adm6996i_drv.probe = adm6996i_probe; |
||
132 | + adm6996i_drv.setup = adm6996i_setup; |
||
133 | + |
||
134 | + switch_driver_register(&adm6996i_drv); |
||
135 | +} |
||
136 | --- a/drivers/net/switch/switch.c |
||
137 | +++ b/drivers/net/switch/switch.c |
||
138 | @@ -20,6 +20,9 @@ void switch_init(void) |
||
139 | #if defined(CONFIG_SWITCH_PSB697X) |
||
140 | switch_psb697x_init(); |
||
141 | #endif |
||
142 | +#if defined(CONFIG_SWITCH_ADM6996I) |
||
143 | + switch_adm6996i_init(); |
||
144 | +#endif |
||
145 | |||
146 | board_switch_init(); |
||
147 | } |
||
148 | --- a/include/switch.h |
||
149 | +++ b/include/switch.h |
||
150 | @@ -98,6 +98,7 @@ static inline void switch_setup(struct s |
||
151 | |||
152 | /* Init functions for supported Switch drivers */ |
||
153 | extern void switch_psb697x_init(void); |
||
154 | +extern void switch_adm6996i_init(void); |
||
155 | |||
156 | #endif /* __SWITCH_H */ |
||
157 |