add chaos_calmer branch
[15.05/openwrt.git] / target / linux / generic / files / drivers / net / phy / b53 / b53_priv.h
1 /*
2  * B53 common definitions
3  *
4  * Copyright (C) 2011-2013 Jonas Gorski <jogo@openwrt.org>
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18
19 #ifndef __B53_PRIV_H
20 #define __B53_PRIV_H
21
22 #include <linux/kernel.h>
23 #include <linux/mutex.h>
24 #include <linux/switch.h>
25
26 struct b53_device;
27
28 struct b53_io_ops {
29         int (*read8)(struct b53_device *dev, u8 page, u8 reg, u8 *value);
30         int (*read16)(struct b53_device *dev, u8 page, u8 reg, u16 *value);
31         int (*read32)(struct b53_device *dev, u8 page, u8 reg, u32 *value);
32         int (*read48)(struct b53_device *dev, u8 page, u8 reg, u64 *value);
33         int (*read64)(struct b53_device *dev, u8 page, u8 reg, u64 *value);
34         int (*write8)(struct b53_device *dev, u8 page, u8 reg, u8 value);
35         int (*write16)(struct b53_device *dev, u8 page, u8 reg, u16 value);
36         int (*write32)(struct b53_device *dev, u8 page, u8 reg, u32 value);
37         int (*write48)(struct b53_device *dev, u8 page, u8 reg, u64 value);
38         int (*write64)(struct b53_device *dev, u8 page, u8 reg, u64 value);
39 };
40
41 enum {
42         BCM5325_DEVICE_ID = 0x25,
43         BCM5365_DEVICE_ID = 0x65,
44         BCM5395_DEVICE_ID = 0x95,
45         BCM5397_DEVICE_ID = 0x97,
46         BCM5398_DEVICE_ID = 0x98,
47         BCM53115_DEVICE_ID = 0x53115,
48         BCM53125_DEVICE_ID = 0x53125,
49         BCM53128_DEVICE_ID = 0x53128,
50         BCM63XX_DEVICE_ID = 0x6300,
51         BCM53010_DEVICE_ID = 0x53010,
52         BCM53011_DEVICE_ID = 0x53011,
53         BCM53012_DEVICE_ID = 0x53012,
54         BCM53018_DEVICE_ID = 0x53018,
55         BCM53019_DEVICE_ID = 0x53019,
56 };
57
58 #define B53_N_PORTS     9
59 #define B53_N_PORTS_25  6
60
61 struct b53_vlan {
62         unsigned int    members:B53_N_PORTS;
63         unsigned int    untag:B53_N_PORTS;
64 };
65
66 struct b53_port {
67         unsigned int    pvid:12;
68 };
69
70 struct b53_device {
71         struct switch_dev sw_dev;
72         struct b53_platform_data *pdata;
73
74         struct mutex reg_mutex;
75         const struct b53_io_ops *ops;
76
77         /* chip specific data */
78         u32 chip_id;
79         u8 core_rev;
80         u8 vta_regs[3];
81         u8 duplex_reg;
82         u8 jumbo_pm_reg;
83         u8 jumbo_size_reg;
84         int reset_gpio;
85
86         /* used ports mask */
87         u16 enabled_ports;
88
89         /* connect specific data */
90         u8 current_page;
91         struct device *dev;
92         void *priv;
93
94         /* run time configuration */
95         unsigned enable_vlan:1;
96         unsigned enable_jumbo:1;
97         unsigned allow_vid_4095:1;
98
99         struct b53_port *ports;
100         struct b53_vlan *vlans;
101
102         char *buf;
103 };
104
105 #define b53_for_each_port(dev, i) \
106         for (i = 0; i < B53_N_PORTS; i++) \
107                 if (dev->enabled_ports & BIT(i))
108
109
110
111 static inline int is5325(struct b53_device *dev)
112 {
113         return dev->chip_id == BCM5325_DEVICE_ID;
114 }
115
116 static inline int is5365(struct b53_device *dev)
117 {
118 #ifdef CONFIG_BCM47XX
119         return dev->chip_id == BCM5365_DEVICE_ID;
120 #else
121         return 0;
122 #endif
123 }
124
125 static inline int is5397_98(struct b53_device *dev)
126 {
127         return dev->chip_id == BCM5397_DEVICE_ID ||
128                 dev->chip_id == BCM5398_DEVICE_ID;
129 }
130
131 static inline int is539x(struct b53_device *dev)
132 {
133         return dev->chip_id == BCM5395_DEVICE_ID ||
134                 dev->chip_id == BCM5397_DEVICE_ID ||
135                 dev->chip_id == BCM5398_DEVICE_ID;
136 }
137
138 static inline int is531x5(struct b53_device *dev)
139 {
140         return dev->chip_id == BCM53115_DEVICE_ID ||
141                 dev->chip_id == BCM53125_DEVICE_ID ||
142                 dev->chip_id == BCM53128_DEVICE_ID;
143 }
144
145 static inline int is63xx(struct b53_device *dev)
146 {
147 #ifdef CONFIG_BCM63XX
148         return dev->chip_id == BCM63XX_DEVICE_ID;
149 #else
150         return 0;
151 #endif
152 }
153
154 static inline int is5301x(struct b53_device *dev)
155 {
156         return dev->chip_id == BCM53010_DEVICE_ID ||
157                 dev->chip_id == BCM53011_DEVICE_ID ||
158                 dev->chip_id == BCM53012_DEVICE_ID ||
159                 dev->chip_id == BCM53018_DEVICE_ID ||
160                 dev->chip_id == BCM53019_DEVICE_ID;
161 }
162
163 #define B53_CPU_PORT_25 5
164 #define B53_CPU_PORT    8
165
166 static inline int is_cpu_port(struct b53_device *dev, int port)
167 {
168         return dev->sw_dev.cpu_port == port;
169 }
170
171 static inline struct b53_device *sw_to_b53(struct switch_dev *sw)
172 {
173         return container_of(sw, struct b53_device, sw_dev);
174 }
175
176 struct b53_device *b53_switch_alloc(struct device *base, struct b53_io_ops *ops,
177                                     void *priv);
178
179 int b53_switch_detect(struct b53_device *dev);
180
181 int b53_switch_register(struct b53_device *dev);
182
183 static inline void b53_switch_remove(struct b53_device *dev)
184 {
185         unregister_switch(&dev->sw_dev);
186 }
187
188 static inline int b53_read8(struct b53_device *dev, u8 page, u8 reg, u8 *val)
189 {
190         int ret;
191
192         mutex_lock(&dev->reg_mutex);
193         ret = dev->ops->read8(dev, page, reg, val);
194         mutex_unlock(&dev->reg_mutex);
195
196         return ret;
197 }
198
199 static inline int b53_read16(struct b53_device *dev, u8 page, u8 reg, u16 *val)
200 {
201         int ret;
202
203         mutex_lock(&dev->reg_mutex);
204         ret = dev->ops->read16(dev, page, reg, val);
205         mutex_unlock(&dev->reg_mutex);
206
207         return ret;
208 }
209
210 static inline int b53_read32(struct b53_device *dev, u8 page, u8 reg, u32 *val)
211 {
212         int ret;
213
214         mutex_lock(&dev->reg_mutex);
215         ret = dev->ops->read32(dev, page, reg, val);
216         mutex_unlock(&dev->reg_mutex);
217
218         return ret;
219 }
220
221 static inline int b53_read48(struct b53_device *dev, u8 page, u8 reg, u64 *val)
222 {
223         int ret;
224
225         mutex_lock(&dev->reg_mutex);
226         ret = dev->ops->read48(dev, page, reg, val);
227         mutex_unlock(&dev->reg_mutex);
228
229         return ret;
230 }
231
232 static inline int b53_read64(struct b53_device *dev, u8 page, u8 reg, u64 *val)
233 {
234         int ret;
235
236         mutex_lock(&dev->reg_mutex);
237         ret = dev->ops->read64(dev, page, reg, val);
238         mutex_unlock(&dev->reg_mutex);
239
240         return ret;
241 }
242
243 static inline int b53_write8(struct b53_device *dev, u8 page, u8 reg, u8 value)
244 {
245         int ret;
246
247         mutex_lock(&dev->reg_mutex);
248         ret = dev->ops->write8(dev, page, reg, value);
249         mutex_unlock(&dev->reg_mutex);
250
251         return ret;
252 }
253
254 static inline int b53_write16(struct b53_device *dev, u8 page, u8 reg,
255                               u16 value)
256 {
257         int ret;
258
259         mutex_lock(&dev->reg_mutex);
260         ret = dev->ops->write16(dev, page, reg, value);
261         mutex_unlock(&dev->reg_mutex);
262
263         return ret;
264 }
265
266 static inline int b53_write32(struct b53_device *dev, u8 page, u8 reg,
267                               u32 value)
268 {
269         int ret;
270
271         mutex_lock(&dev->reg_mutex);
272         ret = dev->ops->write32(dev, page, reg, value);
273         mutex_unlock(&dev->reg_mutex);
274
275         return ret;
276 }
277
278 static inline int b53_write48(struct b53_device *dev, u8 page, u8 reg,
279                               u64 value)
280 {
281         int ret;
282
283         mutex_lock(&dev->reg_mutex);
284         ret = dev->ops->write48(dev, page, reg, value);
285         mutex_unlock(&dev->reg_mutex);
286
287         return ret;
288 }
289
290 static inline int b53_write64(struct b53_device *dev, u8 page, u8 reg,
291                                u64 value)
292 {
293         int ret;
294
295         mutex_lock(&dev->reg_mutex);
296         ret = dev->ops->write64(dev, page, reg, value);
297         mutex_unlock(&dev->reg_mutex);
298
299         return ret;
300 }
301
302 #ifdef CONFIG_BCM47XX
303
304 #include <bcm47xx_nvram.h>
305 #include <bcm47xx_board.h>
306 static inline int b53_switch_get_reset_gpio(struct b53_device *dev)
307 {
308         enum bcm47xx_board board = bcm47xx_board_get();
309
310         switch (board) {
311         case BCM47XX_BOARD_LINKSYS_WRT300NV11:
312         case BCM47XX_BOARD_LINKSYS_WRT310NV1:
313                 return 8;
314         default:
315                 return bcm47xx_nvram_gpio_pin("robo_reset");
316         }
317 }
318 #else
319 static inline int b53_switch_get_reset_gpio(struct b53_device *dev)
320 {
321         return -ENOENT;
322 }
323 #endif
324 #endif