kernel: b53: add initial support for switches in BCM5301X
[librecmc/librecmc.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         BCM63XX_DEVICE_ID = 0x6300,
50         BCM53010_DEVICE_ID = 0x53010,
51         BCM53011_DEVICE_ID = 0x53011,
52         BCM53012_DEVICE_ID = 0x53012,
53         BCM53018_DEVICE_ID = 0x53018,
54         BCM53019_DEVICE_ID = 0x53019,
55 };
56
57 #define B53_N_PORTS     9
58 #define B53_N_PORTS_25  6
59
60 struct b53_vlan {
61         unsigned int    members:B53_N_PORTS;
62         unsigned int    untag:B53_N_PORTS;
63 };
64
65 struct b53_port {
66         unsigned int    pvid:12;
67 };
68
69 struct b53_device {
70         struct switch_dev sw_dev;
71         struct b53_platform_data *pdata;
72
73         struct mutex reg_mutex;
74         const struct b53_io_ops *ops;
75
76         /* chip specific data */
77         u32 chip_id;
78         u8 core_rev;
79         u8 vta_regs[3];
80         u8 duplex_reg;
81         u8 jumbo_pm_reg;
82         u8 jumbo_size_reg;
83         int reset_gpio;
84
85         /* used ports mask */
86         u16 enabled_ports;
87
88         /* connect specific data */
89         u8 current_page;
90         struct device *dev;
91         void *priv;
92
93         /* run time configuration */
94         unsigned enable_vlan:1;
95         unsigned enable_jumbo:1;
96         unsigned allow_vid_4095:1;
97
98         struct b53_port *ports;
99         struct b53_vlan *vlans;
100
101         char *buf;
102 };
103
104 #define b53_for_each_port(dev, i) \
105         for (i = 0; i < B53_N_PORTS; i++) \
106                 if (dev->enabled_ports & BIT(i))
107
108
109
110 static inline int is5325(struct b53_device *dev)
111 {
112         return dev->chip_id == BCM5325_DEVICE_ID;
113 }
114
115 static inline int is5365(struct b53_device *dev)
116 {
117 #ifdef CONFIG_BCM47XX
118         return dev->chip_id == BCM5365_DEVICE_ID;
119 #else
120         return 0;
121 #endif
122 }
123
124 static inline int is5397_98(struct b53_device *dev)
125 {
126         return dev->chip_id == BCM5397_DEVICE_ID ||
127                 dev->chip_id == BCM5398_DEVICE_ID;
128 }
129
130 static inline int is539x(struct b53_device *dev)
131 {
132         return dev->chip_id == BCM5395_DEVICE_ID ||
133                 dev->chip_id == BCM5397_DEVICE_ID ||
134                 dev->chip_id == BCM5398_DEVICE_ID;
135 }
136
137 static inline int is531x5(struct b53_device *dev)
138 {
139         return dev->chip_id == BCM53115_DEVICE_ID ||
140                 dev->chip_id == BCM53125_DEVICE_ID;
141 }
142
143 static inline int is63xx(struct b53_device *dev)
144 {
145 #ifdef CONFIG_BCM63XX
146         return dev->chip_id == BCM63XX_DEVICE_ID;
147 #else
148         return 0;
149 #endif
150 }
151         
152 static inline int is5301x(struct b53_device *dev)
153 {
154         return dev->chip_id == BCM53010_DEVICE_ID ||
155                 dev->chip_id == BCM53011_DEVICE_ID ||
156                 dev->chip_id == BCM53012_DEVICE_ID ||
157                 dev->chip_id == BCM53018_DEVICE_ID ||
158                 dev->chip_id == BCM53019_DEVICE_ID;
159 }
160
161 #define B53_CPU_PORT_25 5
162 #define B53_CPU_PORT    8
163
164 static inline int is_cpu_port(struct b53_device *dev, int port)
165 {
166         return dev->sw_dev.cpu_port == port;
167 }
168
169 static inline struct b53_device *sw_to_b53(struct switch_dev *sw)
170 {
171         return container_of(sw, struct b53_device, sw_dev);
172 }
173
174 struct b53_device *b53_switch_alloc(struct device *base, struct b53_io_ops *ops,
175                                     void *priv);
176
177 int b53_switch_detect(struct b53_device *dev);
178
179 int b53_switch_register(struct b53_device *dev);
180
181 static inline void b53_switch_remove(struct b53_device *dev)
182 {
183         unregister_switch(&dev->sw_dev);
184 }
185
186 static inline int b53_read8(struct b53_device *dev, u8 page, u8 reg, u8 *val)
187 {
188         int ret;
189
190         mutex_lock(&dev->reg_mutex);
191         ret = dev->ops->read8(dev, page, reg, val);
192         mutex_unlock(&dev->reg_mutex);
193
194         return ret;
195 }
196
197 static inline int b53_read16(struct b53_device *dev, u8 page, u8 reg, u16 *val)
198 {
199         int ret;
200
201         mutex_lock(&dev->reg_mutex);
202         ret = dev->ops->read16(dev, page, reg, val);
203         mutex_unlock(&dev->reg_mutex);
204
205         return ret;
206 }
207
208 static inline int b53_read32(struct b53_device *dev, u8 page, u8 reg, u32 *val)
209 {
210         int ret;
211
212         mutex_lock(&dev->reg_mutex);
213         ret = dev->ops->read32(dev, page, reg, val);
214         mutex_unlock(&dev->reg_mutex);
215
216         return ret;
217 }
218
219 static inline int b53_read48(struct b53_device *dev, u8 page, u8 reg, u64 *val)
220 {
221         int ret;
222
223         mutex_lock(&dev->reg_mutex);
224         ret = dev->ops->read48(dev, page, reg, val);
225         mutex_unlock(&dev->reg_mutex);
226
227         return ret;
228 }
229
230 static inline int b53_read64(struct b53_device *dev, u8 page, u8 reg, u64 *val)
231 {
232         int ret;
233
234         mutex_lock(&dev->reg_mutex);
235         ret = dev->ops->read64(dev, page, reg, val);
236         mutex_unlock(&dev->reg_mutex);
237
238         return ret;
239 }
240
241 static inline int b53_write8(struct b53_device *dev, u8 page, u8 reg, u8 value)
242 {
243         int ret;
244
245         mutex_lock(&dev->reg_mutex);
246         ret = dev->ops->write8(dev, page, reg, value);
247         mutex_unlock(&dev->reg_mutex);
248
249         return ret;
250 }
251
252 static inline int b53_write16(struct b53_device *dev, u8 page, u8 reg,
253                               u16 value)
254 {
255         int ret;
256
257         mutex_lock(&dev->reg_mutex);
258         ret = dev->ops->write16(dev, page, reg, value);
259         mutex_unlock(&dev->reg_mutex);
260
261         return ret;
262 }
263
264 static inline int b53_write32(struct b53_device *dev, u8 page, u8 reg,
265                               u32 value)
266 {
267         int ret;
268
269         mutex_lock(&dev->reg_mutex);
270         ret = dev->ops->write32(dev, page, reg, value);
271         mutex_unlock(&dev->reg_mutex);
272
273         return ret;
274 }
275
276 static inline int b53_write48(struct b53_device *dev, u8 page, u8 reg,
277                               u64 value)
278 {
279         int ret;
280
281         mutex_lock(&dev->reg_mutex);
282         ret = dev->ops->write48(dev, page, reg, value);
283         mutex_unlock(&dev->reg_mutex);
284
285         return ret;
286 }
287
288 static inline int b53_write64(struct b53_device *dev, u8 page, u8 reg,
289                                u64 value)
290 {
291         int ret;
292
293         mutex_lock(&dev->reg_mutex);
294         ret = dev->ops->write64(dev, page, reg, value);
295         mutex_unlock(&dev->reg_mutex);
296
297         return ret;
298 }
299
300 #ifdef CONFIG_BCM47XX
301
302 #include <bcm47xx_nvram.h>
303 #include <bcm47xx_board.h>
304 static inline int b53_switch_get_reset_gpio(struct b53_device *dev)
305 {
306         enum bcm47xx_board board = bcm47xx_board_get();
307
308         switch (board) {
309         case BCM47XX_BOARD_LINKSYS_WRT310NV1:
310                 return 8;
311         default:
312                 return bcm47xx_nvram_gpio_pin("robo_reset");
313         }
314 }
315 #else
316 static inline int b53_switch_get_reset_gpio(struct b53_device *dev)
317 {
318         return -ENOENT;
319 }
320 #endif
321 #endif