1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */ 2*4882a593Smuzhiyun /* Realtek SMI interface driver defines 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org> 5*4882a593Smuzhiyun * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _REALTEK_SMI_H 9*4882a593Smuzhiyun #define _REALTEK_SMI_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/phy.h> 12*4882a593Smuzhiyun #include <linux/platform_device.h> 13*4882a593Smuzhiyun #include <linux/gpio/consumer.h> 14*4882a593Smuzhiyun #include <net/dsa.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun struct realtek_smi_ops; 17*4882a593Smuzhiyun struct dentry; 18*4882a593Smuzhiyun struct inode; 19*4882a593Smuzhiyun struct file; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct rtl8366_mib_counter { 22*4882a593Smuzhiyun unsigned int base; 23*4882a593Smuzhiyun unsigned int offset; 24*4882a593Smuzhiyun unsigned int length; 25*4882a593Smuzhiyun const char *name; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /** 29*4882a593Smuzhiyun * struct rtl8366_vlan_mc - Virtual LAN member configuration 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun struct rtl8366_vlan_mc { 32*4882a593Smuzhiyun u16 vid; 33*4882a593Smuzhiyun u16 untag; 34*4882a593Smuzhiyun u16 member; 35*4882a593Smuzhiyun u8 fid; 36*4882a593Smuzhiyun u8 priority; 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun struct rtl8366_vlan_4k { 40*4882a593Smuzhiyun u16 vid; 41*4882a593Smuzhiyun u16 untag; 42*4882a593Smuzhiyun u16 member; 43*4882a593Smuzhiyun u8 fid; 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun struct realtek_smi { 47*4882a593Smuzhiyun struct device *dev; 48*4882a593Smuzhiyun struct gpio_desc *reset; 49*4882a593Smuzhiyun struct gpio_desc *mdc; 50*4882a593Smuzhiyun struct gpio_desc *mdio; 51*4882a593Smuzhiyun struct regmap *map; 52*4882a593Smuzhiyun struct mii_bus *slave_mii_bus; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun unsigned int clk_delay; 55*4882a593Smuzhiyun u8 cmd_read; 56*4882a593Smuzhiyun u8 cmd_write; 57*4882a593Smuzhiyun spinlock_t lock; /* Locks around command writes */ 58*4882a593Smuzhiyun struct dsa_switch *ds; 59*4882a593Smuzhiyun struct irq_domain *irqdomain; 60*4882a593Smuzhiyun bool leds_disabled; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun unsigned int cpu_port; 63*4882a593Smuzhiyun unsigned int num_ports; 64*4882a593Smuzhiyun unsigned int num_vlan_mc; 65*4882a593Smuzhiyun unsigned int num_mib_counters; 66*4882a593Smuzhiyun struct rtl8366_mib_counter *mib_counters; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun const struct realtek_smi_ops *ops; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun int vlan_enabled; 71*4882a593Smuzhiyun int vlan4k_enabled; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun char buf[4096]; 74*4882a593Smuzhiyun void *chip_data; /* Per-chip extra variant data */ 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /** 78*4882a593Smuzhiyun * struct realtek_smi_ops - vtable for the per-SMI-chiptype operations 79*4882a593Smuzhiyun * @detect: detects the chiptype 80*4882a593Smuzhiyun */ 81*4882a593Smuzhiyun struct realtek_smi_ops { 82*4882a593Smuzhiyun int (*detect)(struct realtek_smi *smi); 83*4882a593Smuzhiyun int (*reset_chip)(struct realtek_smi *smi); 84*4882a593Smuzhiyun int (*setup)(struct realtek_smi *smi); 85*4882a593Smuzhiyun void (*cleanup)(struct realtek_smi *smi); 86*4882a593Smuzhiyun int (*get_mib_counter)(struct realtek_smi *smi, 87*4882a593Smuzhiyun int port, 88*4882a593Smuzhiyun struct rtl8366_mib_counter *mib, 89*4882a593Smuzhiyun u64 *mibvalue); 90*4882a593Smuzhiyun int (*get_vlan_mc)(struct realtek_smi *smi, u32 index, 91*4882a593Smuzhiyun struct rtl8366_vlan_mc *vlanmc); 92*4882a593Smuzhiyun int (*set_vlan_mc)(struct realtek_smi *smi, u32 index, 93*4882a593Smuzhiyun const struct rtl8366_vlan_mc *vlanmc); 94*4882a593Smuzhiyun int (*get_vlan_4k)(struct realtek_smi *smi, u32 vid, 95*4882a593Smuzhiyun struct rtl8366_vlan_4k *vlan4k); 96*4882a593Smuzhiyun int (*set_vlan_4k)(struct realtek_smi *smi, 97*4882a593Smuzhiyun const struct rtl8366_vlan_4k *vlan4k); 98*4882a593Smuzhiyun int (*get_mc_index)(struct realtek_smi *smi, int port, int *val); 99*4882a593Smuzhiyun int (*set_mc_index)(struct realtek_smi *smi, int port, int index); 100*4882a593Smuzhiyun bool (*is_vlan_valid)(struct realtek_smi *smi, unsigned int vlan); 101*4882a593Smuzhiyun int (*enable_vlan)(struct realtek_smi *smi, bool enable); 102*4882a593Smuzhiyun int (*enable_vlan4k)(struct realtek_smi *smi, bool enable); 103*4882a593Smuzhiyun int (*enable_port)(struct realtek_smi *smi, int port, bool enable); 104*4882a593Smuzhiyun int (*phy_read)(struct realtek_smi *smi, int phy, int regnum); 105*4882a593Smuzhiyun int (*phy_write)(struct realtek_smi *smi, int phy, int regnum, 106*4882a593Smuzhiyun u16 val); 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun struct realtek_smi_variant { 110*4882a593Smuzhiyun const struct dsa_switch_ops *ds_ops; 111*4882a593Smuzhiyun const struct realtek_smi_ops *ops; 112*4882a593Smuzhiyun unsigned int clk_delay; 113*4882a593Smuzhiyun u8 cmd_read; 114*4882a593Smuzhiyun u8 cmd_write; 115*4882a593Smuzhiyun size_t chip_data_sz; 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* SMI core calls */ 119*4882a593Smuzhiyun int realtek_smi_write_reg_noack(struct realtek_smi *smi, u32 addr, 120*4882a593Smuzhiyun u32 data); 121*4882a593Smuzhiyun int realtek_smi_setup_mdio(struct realtek_smi *smi); 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* RTL8366 library helpers */ 124*4882a593Smuzhiyun int rtl8366_mc_is_used(struct realtek_smi *smi, int mc_index, int *used); 125*4882a593Smuzhiyun int rtl8366_set_vlan(struct realtek_smi *smi, int vid, u32 member, 126*4882a593Smuzhiyun u32 untag, u32 fid); 127*4882a593Smuzhiyun int rtl8366_set_pvid(struct realtek_smi *smi, unsigned int port, 128*4882a593Smuzhiyun unsigned int vid); 129*4882a593Smuzhiyun int rtl8366_enable_vlan4k(struct realtek_smi *smi, bool enable); 130*4882a593Smuzhiyun int rtl8366_enable_vlan(struct realtek_smi *smi, bool enable); 131*4882a593Smuzhiyun int rtl8366_reset_vlan(struct realtek_smi *smi); 132*4882a593Smuzhiyun int rtl8366_init_vlan(struct realtek_smi *smi); 133*4882a593Smuzhiyun int rtl8366_vlan_filtering(struct dsa_switch *ds, int port, 134*4882a593Smuzhiyun bool vlan_filtering, 135*4882a593Smuzhiyun struct switchdev_trans *trans); 136*4882a593Smuzhiyun int rtl8366_vlan_prepare(struct dsa_switch *ds, int port, 137*4882a593Smuzhiyun const struct switchdev_obj_port_vlan *vlan); 138*4882a593Smuzhiyun void rtl8366_vlan_add(struct dsa_switch *ds, int port, 139*4882a593Smuzhiyun const struct switchdev_obj_port_vlan *vlan); 140*4882a593Smuzhiyun int rtl8366_vlan_del(struct dsa_switch *ds, int port, 141*4882a593Smuzhiyun const struct switchdev_obj_port_vlan *vlan); 142*4882a593Smuzhiyun void rtl8366_get_strings(struct dsa_switch *ds, int port, u32 stringset, 143*4882a593Smuzhiyun uint8_t *data); 144*4882a593Smuzhiyun int rtl8366_get_sset_count(struct dsa_switch *ds, int port, int sset); 145*4882a593Smuzhiyun void rtl8366_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data); 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun extern const struct realtek_smi_variant rtl8366rb_variant; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun #endif /* _REALTEK_SMI_H */ 150