xref: /openbmc/linux/drivers/net/dsa/microchip/ksz_common.h (revision ee394fea6f0671fc2bb7e63161129a5d73d8d6e1)
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 
10*ee394feaSMarek Vasut #include <linux/regmap.h>
11*ee394feaSMarek Vasut 
127049f9b5STristram Ha void ksz_port_cleanup(struct ksz_device *dev, int port);
13c2e86691STristram Ha void ksz_update_port_member(struct ksz_device *dev, int port);
147c6ff470STristram Ha void ksz_init_mib_timer(struct ksz_device *dev);
15c2e86691STristram Ha 
16c2e86691STristram Ha /* Common DSA access functions */
17c2e86691STristram Ha 
18c2e86691STristram Ha int ksz_phy_read16(struct dsa_switch *ds, int addr, int reg);
19c2e86691STristram Ha int ksz_phy_write16(struct dsa_switch *ds, int addr, int reg, u16 val);
20c30d894bSTristram Ha void ksz_adjust_link(struct dsa_switch *ds, int port,
21c30d894bSTristram Ha 		     struct phy_device *phydev);
22c2e86691STristram Ha int ksz_sset_count(struct dsa_switch *ds, int port, int sset);
237c6ff470STristram Ha void ksz_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *buf);
24c2e86691STristram Ha int ksz_port_bridge_join(struct dsa_switch *ds, int port,
25c2e86691STristram Ha 			 struct net_device *br);
26c2e86691STristram Ha void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
27c2e86691STristram Ha 			   struct net_device *br);
28c2e86691STristram Ha void ksz_port_fast_age(struct dsa_switch *ds, int port);
29c2e86691STristram Ha int ksz_port_vlan_prepare(struct dsa_switch *ds, int port,
30c2e86691STristram Ha 			  const struct switchdev_obj_port_vlan *vlan);
31c2e86691STristram Ha int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
32c2e86691STristram Ha 		      void *data);
33c2e86691STristram Ha int ksz_port_mdb_prepare(struct dsa_switch *ds, int port,
34c2e86691STristram Ha 			 const struct switchdev_obj_port_mdb *mdb);
35c2e86691STristram Ha void ksz_port_mdb_add(struct dsa_switch *ds, int port,
36c2e86691STristram Ha 		      const struct switchdev_obj_port_mdb *mdb);
37c2e86691STristram Ha int ksz_port_mdb_del(struct dsa_switch *ds, int port,
38c2e86691STristram Ha 		     const struct switchdev_obj_port_mdb *mdb);
39c2e86691STristram Ha int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy);
4075104db0SAndrew Lunn void ksz_disable_port(struct dsa_switch *ds, int port);
41c2e86691STristram Ha 
42c2e86691STristram Ha /* Common register access functions */
43c2e86691STristram Ha 
44c2e86691STristram Ha static inline int ksz_read8(struct ksz_device *dev, u32 reg, u8 *val)
45c2e86691STristram Ha {
46*ee394feaSMarek Vasut 	unsigned int value;
47*ee394feaSMarek Vasut 	int ret = regmap_read(dev->regmap[0], reg, &value);
48c2e86691STristram Ha 
49*ee394feaSMarek Vasut 	*val = value;
50c2e86691STristram Ha 	return ret;
51c2e86691STristram Ha }
52c2e86691STristram Ha 
53c2e86691STristram Ha static inline int ksz_read16(struct ksz_device *dev, u32 reg, u16 *val)
54c2e86691STristram Ha {
55*ee394feaSMarek Vasut 	unsigned int value;
56*ee394feaSMarek Vasut 	int ret = regmap_read(dev->regmap[1], reg, &value);
57c2e86691STristram Ha 
58*ee394feaSMarek Vasut 	*val = value;
59c2e86691STristram Ha 	return ret;
60c2e86691STristram Ha }
61c2e86691STristram Ha 
62c2e86691STristram Ha static inline int ksz_read32(struct ksz_device *dev, u32 reg, u32 *val)
63c2e86691STristram Ha {
64*ee394feaSMarek Vasut 	unsigned int value;
65*ee394feaSMarek Vasut 	int ret = regmap_read(dev->regmap[2], reg, &value);
66c2e86691STristram Ha 
67*ee394feaSMarek Vasut 	*val = value;
68c2e86691STristram Ha 	return ret;
69c2e86691STristram Ha }
70c2e86691STristram Ha 
71c2e86691STristram Ha static inline int ksz_write8(struct ksz_device *dev, u32 reg, u8 value)
72c2e86691STristram Ha {
73*ee394feaSMarek Vasut 	return regmap_write(dev->regmap[0], reg, value);
74c2e86691STristram Ha }
75c2e86691STristram Ha 
76c2e86691STristram Ha static inline int ksz_write16(struct ksz_device *dev, u32 reg, u16 value)
77c2e86691STristram Ha {
78*ee394feaSMarek Vasut 	return regmap_write(dev->regmap[1], reg, value);
79c2e86691STristram Ha }
80c2e86691STristram Ha 
81c2e86691STristram Ha static inline int ksz_write32(struct ksz_device *dev, u32 reg, u32 value)
82c2e86691STristram Ha {
83*ee394feaSMarek Vasut 	return regmap_write(dev->regmap[2], reg, value);
84c2e86691STristram Ha }
85c2e86691STristram Ha 
86c2e86691STristram Ha static inline void ksz_pread8(struct ksz_device *dev, int port, int offset,
87c2e86691STristram Ha 			      u8 *data)
88c2e86691STristram Ha {
89c2e86691STristram Ha 	ksz_read8(dev, dev->dev_ops->get_port_addr(port, offset), data);
90c2e86691STristram Ha }
91c2e86691STristram Ha 
92c2e86691STristram Ha static inline void ksz_pread16(struct ksz_device *dev, int port, int offset,
93c2e86691STristram Ha 			       u16 *data)
94c2e86691STristram Ha {
95c2e86691STristram Ha 	ksz_read16(dev, dev->dev_ops->get_port_addr(port, offset), data);
96c2e86691STristram Ha }
97c2e86691STristram Ha 
98c2e86691STristram Ha static inline void ksz_pread32(struct ksz_device *dev, int port, int offset,
99c2e86691STristram Ha 			       u32 *data)
100c2e86691STristram Ha {
101c2e86691STristram Ha 	ksz_read32(dev, dev->dev_ops->get_port_addr(port, offset), data);
102c2e86691STristram Ha }
103c2e86691STristram Ha 
104c2e86691STristram Ha static inline void ksz_pwrite8(struct ksz_device *dev, int port, int offset,
105c2e86691STristram Ha 			       u8 data)
106c2e86691STristram Ha {
107c2e86691STristram Ha 	ksz_write8(dev, dev->dev_ops->get_port_addr(port, offset), data);
108c2e86691STristram Ha }
109c2e86691STristram Ha 
110c2e86691STristram Ha static inline void ksz_pwrite16(struct ksz_device *dev, int port, int offset,
111c2e86691STristram Ha 				u16 data)
112c2e86691STristram Ha {
113c2e86691STristram Ha 	ksz_write16(dev, dev->dev_ops->get_port_addr(port, offset), data);
114c2e86691STristram Ha }
115c2e86691STristram Ha 
116c2e86691STristram Ha static inline void ksz_pwrite32(struct ksz_device *dev, int port, int offset,
117c2e86691STristram Ha 				u32 data)
118c2e86691STristram Ha {
119c2e86691STristram Ha 	ksz_write32(dev, dev->dev_ops->get_port_addr(port, offset), data);
120c2e86691STristram Ha }
121c2e86691STristram Ha 
1227c6ff470STristram Ha struct ksz_poll_ctx {
1237c6ff470STristram Ha 	struct ksz_device *dev;
1247c6ff470STristram Ha 	int port;
1257c6ff470STristram Ha 	int offset;
1267c6ff470STristram Ha };
1277c6ff470STristram Ha 
1287c6ff470STristram Ha static inline u32 ksz_pread32_poll(struct ksz_poll_ctx *ctx)
1297c6ff470STristram Ha {
1307c6ff470STristram Ha 	u32 data;
1317c6ff470STristram Ha 
1327c6ff470STristram Ha 	ksz_pread32(ctx->dev, ctx->port, ctx->offset, &data);
1337c6ff470STristram Ha 	return data;
1347c6ff470STristram Ha }
1357c6ff470STristram Ha 
136c2e86691STristram Ha #endif
137