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