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