1f5f11907SLuiz Angelo Daros de Luca /* SPDX-License-Identifier: GPL-2.0+ */ 2f5f11907SLuiz Angelo Daros de Luca /* Realtek SMI interface driver defines 3f5f11907SLuiz Angelo Daros de Luca * 4f5f11907SLuiz Angelo Daros de Luca * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org> 5f5f11907SLuiz Angelo Daros de Luca * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> 6f5f11907SLuiz Angelo Daros de Luca */ 7f5f11907SLuiz Angelo Daros de Luca 87db45f8dSLuiz Angelo Daros de Luca #ifndef _REALTEK_H 97db45f8dSLuiz Angelo Daros de Luca #define _REALTEK_H 10f5f11907SLuiz Angelo Daros de Luca 11f5f11907SLuiz Angelo Daros de Luca #include <linux/phy.h> 12f5f11907SLuiz Angelo Daros de Luca #include <linux/platform_device.h> 13f5f11907SLuiz Angelo Daros de Luca #include <linux/gpio/consumer.h> 14f5f11907SLuiz Angelo Daros de Luca #include <net/dsa.h> 1556998aa6SLuiz Angelo Daros de Luca #include <linux/reset.h> 16f5f11907SLuiz Angelo Daros de Luca 1705f7b042SLuiz Angelo Daros de Luca #define REALTEK_HW_STOP_DELAY 25 /* msecs */ 1805f7b042SLuiz Angelo Daros de Luca #define REALTEK_HW_START_DELAY 100 /* msecs */ 1905f7b042SLuiz Angelo Daros de Luca 20*8aec5b10SRussell King (Oracle) struct phylink_mac_ops; 21f5f11907SLuiz Angelo Daros de Luca struct realtek_ops; 22f5f11907SLuiz Angelo Daros de Luca struct dentry; 23f5f11907SLuiz Angelo Daros de Luca struct inode; 24f5f11907SLuiz Angelo Daros de Luca struct file; 25f5f11907SLuiz Angelo Daros de Luca 26f5f11907SLuiz Angelo Daros de Luca struct rtl8366_mib_counter { 27f5f11907SLuiz Angelo Daros de Luca unsigned int base; 28f5f11907SLuiz Angelo Daros de Luca unsigned int offset; 29f5f11907SLuiz Angelo Daros de Luca unsigned int length; 30f5f11907SLuiz Angelo Daros de Luca const char *name; 31f5f11907SLuiz Angelo Daros de Luca }; 32f5f11907SLuiz Angelo Daros de Luca 33f5f11907SLuiz Angelo Daros de Luca /* 34f5f11907SLuiz Angelo Daros de Luca * struct rtl8366_vlan_mc - Virtual LAN member configuration 35f5f11907SLuiz Angelo Daros de Luca */ 36f5f11907SLuiz Angelo Daros de Luca struct rtl8366_vlan_mc { 37f5f11907SLuiz Angelo Daros de Luca u16 vid; 38f5f11907SLuiz Angelo Daros de Luca u16 untag; 39f5f11907SLuiz Angelo Daros de Luca u16 member; 40f5f11907SLuiz Angelo Daros de Luca u8 fid; 41f5f11907SLuiz Angelo Daros de Luca u8 priority; 42f5f11907SLuiz Angelo Daros de Luca }; 43f5f11907SLuiz Angelo Daros de Luca 44f5f11907SLuiz Angelo Daros de Luca struct rtl8366_vlan_4k { 45f5f11907SLuiz Angelo Daros de Luca u16 vid; 46f5f11907SLuiz Angelo Daros de Luca u16 untag; 47f5f11907SLuiz Angelo Daros de Luca u16 member; 48f5f11907SLuiz Angelo Daros de Luca u8 fid; 49f5f11907SLuiz Angelo Daros de Luca }; 50f5f11907SLuiz Angelo Daros de Luca 51f5f11907SLuiz Angelo Daros de Luca struct realtek_priv { 52f5f11907SLuiz Angelo Daros de Luca struct device *dev; 5356998aa6SLuiz Angelo Daros de Luca struct reset_control *reset_ctl; 54f5f11907SLuiz Angelo Daros de Luca struct gpio_desc *reset; 55f5f11907SLuiz Angelo Daros de Luca struct gpio_desc *mdc; 56f5f11907SLuiz Angelo Daros de Luca struct gpio_desc *mdio; 57f5f11907SLuiz Angelo Daros de Luca struct regmap *map; 58907e772fSAlvin Šipraga struct regmap *map_nolock; 59907e772fSAlvin Šipraga struct mutex map_lock; 606ca80638SFlorian Fainelli struct mii_bus *user_mii_bus; 61aac94001SLuiz Angelo Daros de Luca struct mii_bus *bus; 62aac94001SLuiz Angelo Daros de Luca int mdio_addr; 63f5f11907SLuiz Angelo Daros de Luca 644667a1dbSLuiz Angelo Daros de Luca const struct realtek_variant *variant; 654667a1dbSLuiz Angelo Daros de Luca 66f5f11907SLuiz Angelo Daros de Luca spinlock_t lock; /* Locks around command writes */ 679fc469b2SLuiz Angelo Daros de Luca struct dsa_switch ds; 68f5f11907SLuiz Angelo Daros de Luca struct irq_domain *irqdomain; 69f5f11907SLuiz Angelo Daros de Luca bool leds_disabled; 70f5f11907SLuiz Angelo Daros de Luca 71f5f11907SLuiz Angelo Daros de Luca unsigned int cpu_port; 72f5f11907SLuiz Angelo Daros de Luca unsigned int num_ports; 73f5f11907SLuiz Angelo Daros de Luca unsigned int num_vlan_mc; 74f5f11907SLuiz Angelo Daros de Luca unsigned int num_mib_counters; 75f5f11907SLuiz Angelo Daros de Luca struct rtl8366_mib_counter *mib_counters; 76f5f11907SLuiz Angelo Daros de Luca 77f5f11907SLuiz Angelo Daros de Luca const struct realtek_ops *ops; 78cd645dc5SLuiz Angelo Daros de Luca int (*write_reg_noack)(void *ctx, u32 addr, u32 data); 79f5f11907SLuiz Angelo Daros de Luca 80f5f11907SLuiz Angelo Daros de Luca int vlan_enabled; 81f5f11907SLuiz Angelo Daros de Luca int vlan4k_enabled; 82f5f11907SLuiz Angelo Daros de Luca 83f5f11907SLuiz Angelo Daros de Luca char buf[4096]; 84f5f11907SLuiz Angelo Daros de Luca void *chip_data; /* Per-chip extra variant data */ 85f5f11907SLuiz Angelo Daros de Luca }; 86f5f11907SLuiz Angelo Daros de Luca 87f5f11907SLuiz Angelo Daros de Luca /* 88f5f11907SLuiz Angelo Daros de Luca * struct realtek_ops - vtable for the per-SMI-chiptype operations 89f5f11907SLuiz Angelo Daros de Luca * @detect: detects the chiptype 90f5f11907SLuiz Angelo Daros de Luca */ 91f5f11907SLuiz Angelo Daros de Luca struct realtek_ops { 92f5f11907SLuiz Angelo Daros de Luca int (*detect)(struct realtek_priv *priv); 93f5f11907SLuiz Angelo Daros de Luca int (*reset_chip)(struct realtek_priv *priv); 94f5f11907SLuiz Angelo Daros de Luca int (*setup)(struct realtek_priv *priv); 95f5f11907SLuiz Angelo Daros de Luca int (*get_mib_counter)(struct realtek_priv *priv, 96f5f11907SLuiz Angelo Daros de Luca int port, 97f5f11907SLuiz Angelo Daros de Luca struct rtl8366_mib_counter *mib, 98f5f11907SLuiz Angelo Daros de Luca u64 *mibvalue); 99f5f11907SLuiz Angelo Daros de Luca int (*get_vlan_mc)(struct realtek_priv *priv, u32 index, 100f5f11907SLuiz Angelo Daros de Luca struct rtl8366_vlan_mc *vlanmc); 101f5f11907SLuiz Angelo Daros de Luca int (*set_vlan_mc)(struct realtek_priv *priv, u32 index, 102f5f11907SLuiz Angelo Daros de Luca const struct rtl8366_vlan_mc *vlanmc); 103f5f11907SLuiz Angelo Daros de Luca int (*get_vlan_4k)(struct realtek_priv *priv, u32 vid, 104f5f11907SLuiz Angelo Daros de Luca struct rtl8366_vlan_4k *vlan4k); 105f5f11907SLuiz Angelo Daros de Luca int (*set_vlan_4k)(struct realtek_priv *priv, 106f5f11907SLuiz Angelo Daros de Luca const struct rtl8366_vlan_4k *vlan4k); 107f5f11907SLuiz Angelo Daros de Luca int (*get_mc_index)(struct realtek_priv *priv, int port, int *val); 108f5f11907SLuiz Angelo Daros de Luca int (*set_mc_index)(struct realtek_priv *priv, int port, int index); 109f5f11907SLuiz Angelo Daros de Luca bool (*is_vlan_valid)(struct realtek_priv *priv, unsigned int vlan); 110f5f11907SLuiz Angelo Daros de Luca int (*enable_vlan)(struct realtek_priv *priv, bool enable); 111f5f11907SLuiz Angelo Daros de Luca int (*enable_vlan4k)(struct realtek_priv *priv, bool enable); 112f5f11907SLuiz Angelo Daros de Luca int (*enable_port)(struct realtek_priv *priv, int port, bool enable); 113f5f11907SLuiz Angelo Daros de Luca int (*phy_read)(struct realtek_priv *priv, int phy, int regnum); 114f5f11907SLuiz Angelo Daros de Luca int (*phy_write)(struct realtek_priv *priv, int phy, int regnum, 115f5f11907SLuiz Angelo Daros de Luca u16 val); 116f5f11907SLuiz Angelo Daros de Luca }; 117f5f11907SLuiz Angelo Daros de Luca 118f5f11907SLuiz Angelo Daros de Luca struct realtek_variant { 119bba140a5SLuiz Angelo Daros de Luca const struct dsa_switch_ops *ds_ops; 120f5f11907SLuiz Angelo Daros de Luca const struct realtek_ops *ops; 121*8aec5b10SRussell King (Oracle) const struct phylink_mac_ops *phylink_mac_ops; 122f5f11907SLuiz Angelo Daros de Luca unsigned int clk_delay; 123f5f11907SLuiz Angelo Daros de Luca u8 cmd_read; 124f5f11907SLuiz Angelo Daros de Luca u8 cmd_write; 125f5f11907SLuiz Angelo Daros de Luca size_t chip_data_sz; 126f5f11907SLuiz Angelo Daros de Luca }; 127f5f11907SLuiz Angelo Daros de Luca 128f5f11907SLuiz Angelo Daros de Luca /* RTL8366 library helpers */ 129f5f11907SLuiz Angelo Daros de Luca int rtl8366_mc_is_used(struct realtek_priv *priv, int mc_index, int *used); 130f5f11907SLuiz Angelo Daros de Luca int rtl8366_set_vlan(struct realtek_priv *priv, int vid, u32 member, 131f5f11907SLuiz Angelo Daros de Luca u32 untag, u32 fid); 132f5f11907SLuiz Angelo Daros de Luca int rtl8366_set_pvid(struct realtek_priv *priv, unsigned int port, 133f5f11907SLuiz Angelo Daros de Luca unsigned int vid); 134f5f11907SLuiz Angelo Daros de Luca int rtl8366_enable_vlan4k(struct realtek_priv *priv, bool enable); 135f5f11907SLuiz Angelo Daros de Luca int rtl8366_enable_vlan(struct realtek_priv *priv, bool enable); 136f5f11907SLuiz Angelo Daros de Luca int rtl8366_reset_vlan(struct realtek_priv *priv); 137f5f11907SLuiz Angelo Daros de Luca int rtl8366_vlan_add(struct dsa_switch *ds, int port, 138f5f11907SLuiz Angelo Daros de Luca const struct switchdev_obj_port_vlan *vlan, 139f5f11907SLuiz Angelo Daros de Luca struct netlink_ext_ack *extack); 140f5f11907SLuiz Angelo Daros de Luca int rtl8366_vlan_del(struct dsa_switch *ds, int port, 141f5f11907SLuiz Angelo Daros de Luca const struct switchdev_obj_port_vlan *vlan); 142f5f11907SLuiz Angelo Daros de Luca void rtl8366_get_strings(struct dsa_switch *ds, int port, u32 stringset, 143f5f11907SLuiz Angelo Daros de Luca uint8_t *data); 144f5f11907SLuiz Angelo Daros de Luca int rtl8366_get_sset_count(struct dsa_switch *ds, int port, int sset); 145f5f11907SLuiz Angelo Daros de Luca void rtl8366_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data); 146f5f11907SLuiz Angelo Daros de Luca 147f5f11907SLuiz Angelo Daros de Luca extern const struct realtek_variant rtl8366rb_variant; 148f5f11907SLuiz Angelo Daros de Luca extern const struct realtek_variant rtl8365mb_variant; 149f5f11907SLuiz Angelo Daros de Luca 1507db45f8dSLuiz Angelo Daros de Luca #endif /* _REALTEK_H */ 151