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