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 10ee394feaSMarek Vasut #include <linux/regmap.h> 11ee394feaSMarek 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 { 46ee394feaSMarek Vasut unsigned int value; 47ee394feaSMarek Vasut int ret = regmap_read(dev->regmap[0], reg, &value); 48c2e86691STristram Ha 49ee394feaSMarek 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 { 55ee394feaSMarek Vasut unsigned int value; 56ee394feaSMarek Vasut int ret = regmap_read(dev->regmap[1], reg, &value); 57c2e86691STristram Ha 58ee394feaSMarek 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 { 64ee394feaSMarek Vasut unsigned int value; 65ee394feaSMarek Vasut int ret = regmap_read(dev->regmap[2], reg, &value); 66c2e86691STristram Ha 67ee394feaSMarek 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 { 73ee394feaSMarek 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 { 78ee394feaSMarek 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 { 83ee394feaSMarek 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 122255b59adSMarek Vasut /* Regmap tables generation */ 123255b59adSMarek Vasut #define KSZ_SPI_OP_RD 3 124255b59adSMarek Vasut #define KSZ_SPI_OP_WR 2 125255b59adSMarek Vasut 126255b59adSMarek Vasut #define KSZ_SPI_OP_FLAG_MASK(opcode, swp, regbits, regpad) \ 127255b59adSMarek Vasut swab##swp((opcode) << ((regbits) + (regpad))) 128255b59adSMarek Vasut 129255b59adSMarek Vasut #define KSZ_REGMAP_ENTRY(width, swp, regbits, regpad, regalign) \ 130255b59adSMarek Vasut { \ 131*5f81d545SGeorge McCollister .name = #width, \ 132255b59adSMarek Vasut .val_bits = (width), \ 133255b59adSMarek Vasut .reg_stride = (width) / 8, \ 134255b59adSMarek Vasut .reg_bits = (regbits) + (regalign), \ 135255b59adSMarek Vasut .pad_bits = (regpad), \ 136255b59adSMarek Vasut .max_register = BIT(regbits) - 1, \ 137255b59adSMarek Vasut .cache_type = REGCACHE_NONE, \ 138255b59adSMarek Vasut .read_flag_mask = \ 139255b59adSMarek Vasut KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_RD, swp, \ 140255b59adSMarek Vasut regbits, regpad), \ 141255b59adSMarek Vasut .write_flag_mask = \ 142255b59adSMarek Vasut KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_WR, swp, \ 143255b59adSMarek Vasut regbits, regpad), \ 144255b59adSMarek Vasut .reg_format_endian = REGMAP_ENDIAN_BIG, \ 145255b59adSMarek Vasut .val_format_endian = REGMAP_ENDIAN_BIG \ 146255b59adSMarek Vasut } 147255b59adSMarek Vasut 148255b59adSMarek Vasut #define KSZ_REGMAP_TABLE(ksz, swp, regbits, regpad, regalign) \ 149255b59adSMarek Vasut static const struct regmap_config ksz##_regmap_config[] = { \ 150255b59adSMarek Vasut KSZ_REGMAP_ENTRY(8, swp, (regbits), (regpad), (regalign)), \ 151255b59adSMarek Vasut KSZ_REGMAP_ENTRY(16, swp, (regbits), (regpad), (regalign)), \ 152255b59adSMarek Vasut KSZ_REGMAP_ENTRY(32, swp, (regbits), (regpad), (regalign)), \ 153255b59adSMarek Vasut } 154255b59adSMarek Vasut 155c2e86691STristram Ha #endif 156