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