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