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