1 /* SPDX-License-Identifier: GPL-2.0
2 * Microchip switch driver common header
4 * Copyright (C) 2017-2019 Microchip Technology Inc.
10 void ksz_port_cleanup(struct ksz_device *dev, int port);
11 void ksz_update_port_member(struct ksz_device *dev, int port);
12 void ksz_init_mib_timer(struct ksz_device *dev);
14 /* Common DSA access functions */
16 int ksz_phy_read16(struct dsa_switch *ds, int addr, int reg);
17 int ksz_phy_write16(struct dsa_switch *ds, int addr, int reg, u16 val);
18 void ksz_adjust_link(struct dsa_switch *ds, int port,
19 struct phy_device *phydev);
20 int ksz_sset_count(struct dsa_switch *ds, int port, int sset);
21 void ksz_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *buf);
22 int ksz_port_bridge_join(struct dsa_switch *ds, int port,
23 struct net_device *br);
24 void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
25 struct net_device *br);
26 void ksz_port_fast_age(struct dsa_switch *ds, int port);
27 int ksz_port_vlan_prepare(struct dsa_switch *ds, int port,
28 const struct switchdev_obj_port_vlan *vlan);
29 int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
31 int ksz_port_mdb_prepare(struct dsa_switch *ds, int port,
32 const struct switchdev_obj_port_mdb *mdb);
33 void ksz_port_mdb_add(struct dsa_switch *ds, int port,
34 const struct switchdev_obj_port_mdb *mdb);
35 int ksz_port_mdb_del(struct dsa_switch *ds, int port,
36 const struct switchdev_obj_port_mdb *mdb);
37 int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy);
38 void ksz_disable_port(struct dsa_switch *ds, int port);
40 /* Common register access functions */
42 static inline int ksz_read8(struct ksz_device *dev, u32 reg, u8 *val)
46 mutex_lock(&dev->reg_mutex);
47 ret = dev->ops->read8(dev, reg, val);
48 mutex_unlock(&dev->reg_mutex);
53 static inline int ksz_read16(struct ksz_device *dev, u32 reg, u16 *val)
57 mutex_lock(&dev->reg_mutex);
58 ret = dev->ops->read16(dev, reg, val);
59 mutex_unlock(&dev->reg_mutex);
64 static inline int ksz_read32(struct ksz_device *dev, u32 reg, u32 *val)
68 mutex_lock(&dev->reg_mutex);
69 ret = dev->ops->read32(dev, reg, val);
70 mutex_unlock(&dev->reg_mutex);
75 static inline int ksz_write8(struct ksz_device *dev, u32 reg, u8 value)
79 mutex_lock(&dev->reg_mutex);
80 ret = dev->ops->write8(dev, reg, value);
81 mutex_unlock(&dev->reg_mutex);
86 static inline int ksz_write16(struct ksz_device *dev, u32 reg, u16 value)
90 mutex_lock(&dev->reg_mutex);
91 ret = dev->ops->write16(dev, reg, value);
92 mutex_unlock(&dev->reg_mutex);
97 static inline int ksz_write32(struct ksz_device *dev, u32 reg, u32 value)
101 mutex_lock(&dev->reg_mutex);
102 ret = dev->ops->write32(dev, reg, value);
103 mutex_unlock(&dev->reg_mutex);
108 static inline void ksz_pread8(struct ksz_device *dev, int port, int offset,
111 ksz_read8(dev, dev->dev_ops->get_port_addr(port, offset), data);
114 static inline void ksz_pread16(struct ksz_device *dev, int port, int offset,
117 ksz_read16(dev, dev->dev_ops->get_port_addr(port, offset), data);
120 static inline void ksz_pread32(struct ksz_device *dev, int port, int offset,
123 ksz_read32(dev, dev->dev_ops->get_port_addr(port, offset), data);
126 static inline void ksz_pwrite8(struct ksz_device *dev, int port, int offset,
129 ksz_write8(dev, dev->dev_ops->get_port_addr(port, offset), data);
132 static inline void ksz_pwrite16(struct ksz_device *dev, int port, int offset,
135 ksz_write16(dev, dev->dev_ops->get_port_addr(port, offset), data);
138 static inline void ksz_pwrite32(struct ksz_device *dev, int port, int offset,
141 ksz_write32(dev, dev->dev_ops->get_port_addr(port, offset), data);
144 static void ksz_cfg(struct ksz_device *dev, u32 addr, u8 bits, bool set)
148 ksz_read8(dev, addr, &data);
153 ksz_write8(dev, addr, data);
156 static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits,
162 addr = dev->dev_ops->get_port_addr(port, offset);
163 ksz_read8(dev, addr, &data);
170 ksz_write8(dev, addr, data);
173 struct ksz_poll_ctx {
174 struct ksz_device *dev;
179 static inline u32 ksz_pread32_poll(struct ksz_poll_ctx *ctx)
183 ksz_pread32(ctx->dev, ctx->port, ctx->offset, &data);