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