Loading...
Note: File does not exist in v6.8.
1/*
2 * Microchip KSZ series switch common definitions
3 *
4 * Copyright (C) 2017
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 __KSZ_PRIV_H
20#define __KSZ_PRIV_H
21
22#include <linux/kernel.h>
23#include <linux/mutex.h>
24#include <linux/phy.h>
25#include <linux/etherdevice.h>
26#include <net/dsa.h>
27
28#include "ksz_9477_reg.h"
29
30struct ksz_io_ops;
31
32struct vlan_table {
33 u32 table[3];
34};
35
36struct ksz_device {
37 struct dsa_switch *ds;
38 struct ksz_platform_data *pdata;
39 const char *name;
40
41 struct mutex reg_mutex; /* register access */
42 struct mutex stats_mutex; /* status access */
43 struct mutex alu_mutex; /* ALU access */
44 struct mutex vlan_mutex; /* vlan access */
45 const struct ksz_io_ops *ops;
46
47 struct device *dev;
48
49 void *priv;
50
51 /* chip specific data */
52 u32 chip_id;
53 int num_vlans;
54 int num_alus;
55 int num_statics;
56 int cpu_port; /* port connected to CPU */
57 int cpu_ports; /* port bitmap can be cpu port */
58 int port_cnt;
59
60 struct vlan_table *vlan_cache;
61
62 u64 mib_value[TOTAL_SWITCH_COUNTER_NUM];
63};
64
65struct ksz_io_ops {
66 int (*read8)(struct ksz_device *dev, u32 reg, u8 *value);
67 int (*read16)(struct ksz_device *dev, u32 reg, u16 *value);
68 int (*read24)(struct ksz_device *dev, u32 reg, u32 *value);
69 int (*read32)(struct ksz_device *dev, u32 reg, u32 *value);
70 int (*write8)(struct ksz_device *dev, u32 reg, u8 value);
71 int (*write16)(struct ksz_device *dev, u32 reg, u16 value);
72 int (*write24)(struct ksz_device *dev, u32 reg, u32 value);
73 int (*write32)(struct ksz_device *dev, u32 reg, u32 value);
74 int (*phy_read16)(struct ksz_device *dev, int addr, int reg,
75 u16 *value);
76 int (*phy_write16)(struct ksz_device *dev, int addr, int reg,
77 u16 value);
78};
79
80struct ksz_device *ksz_switch_alloc(struct device *base,
81 const struct ksz_io_ops *ops, void *priv);
82int ksz_switch_detect(struct ksz_device *dev);
83int ksz_switch_register(struct ksz_device *dev);
84void ksz_switch_remove(struct ksz_device *dev);
85
86static inline int ksz_read8(struct ksz_device *dev, u32 reg, u8 *val)
87{
88 int ret;
89
90 mutex_lock(&dev->reg_mutex);
91 ret = dev->ops->read8(dev, reg, val);
92 mutex_unlock(&dev->reg_mutex);
93
94 return ret;
95}
96
97static inline int ksz_read16(struct ksz_device *dev, u32 reg, u16 *val)
98{
99 int ret;
100
101 mutex_lock(&dev->reg_mutex);
102 ret = dev->ops->read16(dev, reg, val);
103 mutex_unlock(&dev->reg_mutex);
104
105 return ret;
106}
107
108static inline int ksz_read24(struct ksz_device *dev, u32 reg, u32 *val)
109{
110 int ret;
111
112 mutex_lock(&dev->reg_mutex);
113 ret = dev->ops->read24(dev, reg, val);
114 mutex_unlock(&dev->reg_mutex);
115
116 return ret;
117}
118
119static inline int ksz_read32(struct ksz_device *dev, u32 reg, u32 *val)
120{
121 int ret;
122
123 mutex_lock(&dev->reg_mutex);
124 ret = dev->ops->read32(dev, reg, val);
125 mutex_unlock(&dev->reg_mutex);
126
127 return ret;
128}
129
130static inline int ksz_write8(struct ksz_device *dev, u32 reg, u8 value)
131{
132 int ret;
133
134 mutex_lock(&dev->reg_mutex);
135 ret = dev->ops->write8(dev, reg, value);
136 mutex_unlock(&dev->reg_mutex);
137
138 return ret;
139}
140
141static inline int ksz_write16(struct ksz_device *dev, u32 reg, u16 value)
142{
143 int ret;
144
145 mutex_lock(&dev->reg_mutex);
146 ret = dev->ops->write16(dev, reg, value);
147 mutex_unlock(&dev->reg_mutex);
148
149 return ret;
150}
151
152static inline int ksz_write24(struct ksz_device *dev, u32 reg, u32 value)
153{
154 int ret;
155
156 mutex_lock(&dev->reg_mutex);
157 ret = dev->ops->write24(dev, reg, value);
158 mutex_unlock(&dev->reg_mutex);
159
160 return ret;
161}
162
163static inline int ksz_write32(struct ksz_device *dev, u32 reg, u32 value)
164{
165 int ret;
166
167 mutex_lock(&dev->reg_mutex);
168 ret = dev->ops->write32(dev, reg, value);
169 mutex_unlock(&dev->reg_mutex);
170
171 return ret;
172}
173
174static inline void ksz_pread8(struct ksz_device *dev, int port, int offset,
175 u8 *data)
176{
177 ksz_read8(dev, PORT_CTRL_ADDR(port, offset), data);
178}
179
180static inline void ksz_pread16(struct ksz_device *dev, int port, int offset,
181 u16 *data)
182{
183 ksz_read16(dev, PORT_CTRL_ADDR(port, offset), data);
184}
185
186static inline void ksz_pread32(struct ksz_device *dev, int port, int offset,
187 u32 *data)
188{
189 ksz_read32(dev, PORT_CTRL_ADDR(port, offset), data);
190}
191
192static inline void ksz_pwrite8(struct ksz_device *dev, int port, int offset,
193 u8 data)
194{
195 ksz_write8(dev, PORT_CTRL_ADDR(port, offset), data);
196}
197
198static inline void ksz_pwrite16(struct ksz_device *dev, int port, int offset,
199 u16 data)
200{
201 ksz_write16(dev, PORT_CTRL_ADDR(port, offset), data);
202}
203
204static inline void ksz_pwrite32(struct ksz_device *dev, int port, int offset,
205 u32 data)
206{
207 ksz_write32(dev, PORT_CTRL_ADDR(port, offset), data);
208}
209
210#endif