1 /* SPDX-License-Identifier: GPL-2.0
2  * Microchip switch driver common header
3  *
4  * Copyright (C) 2017-2018 Microchip Technology Inc.
5  */
6 
7 #ifndef __KSZ_COMMON_H
8 #define __KSZ_COMMON_H
9 
10 void ksz_update_port_member(struct ksz_device *dev, int port);
11 
12 /* Common DSA access functions */
13 
14 int ksz_phy_read16(struct dsa_switch *ds, int addr, int reg);
15 int ksz_phy_write16(struct dsa_switch *ds, int addr, int reg, u16 val);
16 int ksz_sset_count(struct dsa_switch *ds, int port, int sset);
17 int ksz_port_bridge_join(struct dsa_switch *ds, int port,
18 			 struct net_device *br);
19 void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
20 			   struct net_device *br);
21 void ksz_port_fast_age(struct dsa_switch *ds, int port);
22 int ksz_port_vlan_prepare(struct dsa_switch *ds, int port,
23 			  const struct switchdev_obj_port_vlan *vlan);
24 int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
25 		      void *data);
26 int ksz_port_mdb_prepare(struct dsa_switch *ds, int port,
27 			 const struct switchdev_obj_port_mdb *mdb);
28 void ksz_port_mdb_add(struct dsa_switch *ds, int port,
29 		      const struct switchdev_obj_port_mdb *mdb);
30 int ksz_port_mdb_del(struct dsa_switch *ds, int port,
31 		     const struct switchdev_obj_port_mdb *mdb);
32 int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy);
33 void ksz_disable_port(struct dsa_switch *ds, int port, struct phy_device *phy);
34 
35 /* Common register access functions */
36 
37 static inline int ksz_read8(struct ksz_device *dev, u32 reg, u8 *val)
38 {
39 	int ret;
40 
41 	mutex_lock(&dev->reg_mutex);
42 	ret = dev->ops->read8(dev, reg, val);
43 	mutex_unlock(&dev->reg_mutex);
44 
45 	return ret;
46 }
47 
48 static inline int ksz_read16(struct ksz_device *dev, u32 reg, u16 *val)
49 {
50 	int ret;
51 
52 	mutex_lock(&dev->reg_mutex);
53 	ret = dev->ops->read16(dev, reg, val);
54 	mutex_unlock(&dev->reg_mutex);
55 
56 	return ret;
57 }
58 
59 static inline int ksz_read24(struct ksz_device *dev, u32 reg, u32 *val)
60 {
61 	int ret;
62 
63 	mutex_lock(&dev->reg_mutex);
64 	ret = dev->ops->read24(dev, reg, val);
65 	mutex_unlock(&dev->reg_mutex);
66 
67 	return ret;
68 }
69 
70 static inline int ksz_read32(struct ksz_device *dev, u32 reg, u32 *val)
71 {
72 	int ret;
73 
74 	mutex_lock(&dev->reg_mutex);
75 	ret = dev->ops->read32(dev, reg, val);
76 	mutex_unlock(&dev->reg_mutex);
77 
78 	return ret;
79 }
80 
81 static inline int ksz_write8(struct ksz_device *dev, u32 reg, u8 value)
82 {
83 	int ret;
84 
85 	mutex_lock(&dev->reg_mutex);
86 	ret = dev->ops->write8(dev, reg, value);
87 	mutex_unlock(&dev->reg_mutex);
88 
89 	return ret;
90 }
91 
92 static inline int ksz_write16(struct ksz_device *dev, u32 reg, u16 value)
93 {
94 	int ret;
95 
96 	mutex_lock(&dev->reg_mutex);
97 	ret = dev->ops->write16(dev, reg, value);
98 	mutex_unlock(&dev->reg_mutex);
99 
100 	return ret;
101 }
102 
103 static inline int ksz_write24(struct ksz_device *dev, u32 reg, u32 value)
104 {
105 	int ret;
106 
107 	mutex_lock(&dev->reg_mutex);
108 	ret = dev->ops->write24(dev, reg, value);
109 	mutex_unlock(&dev->reg_mutex);
110 
111 	return ret;
112 }
113 
114 static inline int ksz_write32(struct ksz_device *dev, u32 reg, u32 value)
115 {
116 	int ret;
117 
118 	mutex_lock(&dev->reg_mutex);
119 	ret = dev->ops->write32(dev, reg, value);
120 	mutex_unlock(&dev->reg_mutex);
121 
122 	return ret;
123 }
124 
125 static inline int ksz_get(struct ksz_device *dev, u32 reg, void *data,
126 			  size_t len)
127 {
128 	int ret;
129 
130 	mutex_lock(&dev->reg_mutex);
131 	ret = dev->ops->get(dev, reg, data, len);
132 	mutex_unlock(&dev->reg_mutex);
133 
134 	return ret;
135 }
136 
137 static inline int ksz_set(struct ksz_device *dev, u32 reg, void *data,
138 			  size_t len)
139 {
140 	int ret;
141 
142 	mutex_lock(&dev->reg_mutex);
143 	ret = dev->ops->set(dev, reg, data, len);
144 	mutex_unlock(&dev->reg_mutex);
145 
146 	return ret;
147 }
148 
149 static inline void ksz_pread8(struct ksz_device *dev, int port, int offset,
150 			      u8 *data)
151 {
152 	ksz_read8(dev, dev->dev_ops->get_port_addr(port, offset), data);
153 }
154 
155 static inline void ksz_pread16(struct ksz_device *dev, int port, int offset,
156 			       u16 *data)
157 {
158 	ksz_read16(dev, dev->dev_ops->get_port_addr(port, offset), data);
159 }
160 
161 static inline void ksz_pread32(struct ksz_device *dev, int port, int offset,
162 			       u32 *data)
163 {
164 	ksz_read32(dev, dev->dev_ops->get_port_addr(port, offset), data);
165 }
166 
167 static inline void ksz_pwrite8(struct ksz_device *dev, int port, int offset,
168 			       u8 data)
169 {
170 	ksz_write8(dev, dev->dev_ops->get_port_addr(port, offset), data);
171 }
172 
173 static inline void ksz_pwrite16(struct ksz_device *dev, int port, int offset,
174 				u16 data)
175 {
176 	ksz_write16(dev, dev->dev_ops->get_port_addr(port, offset), data);
177 }
178 
179 static inline void ksz_pwrite32(struct ksz_device *dev, int port, int offset,
180 				u32 data)
181 {
182 	ksz_write32(dev, dev->dev_ops->get_port_addr(port, offset), data);
183 }
184 
185 static void ksz_cfg(struct ksz_device *dev, u32 addr, u8 bits, bool set)
186 {
187 	u8 data;
188 
189 	ksz_read8(dev, addr, &data);
190 	if (set)
191 		data |= bits;
192 	else
193 		data &= ~bits;
194 	ksz_write8(dev, addr, data);
195 }
196 
197 static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits,
198 			 bool set)
199 {
200 	u32 addr;
201 	u8 data;
202 
203 	addr = dev->dev_ops->get_port_addr(port, offset);
204 	ksz_read8(dev, addr, &data);
205 
206 	if (set)
207 		data |= bits;
208 	else
209 		data &= ~bits;
210 
211 	ksz_write8(dev, addr, data);
212 }
213 
214 #endif
215