162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/* Realtek SMI interface driver defines
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org>
562306a36Sopenharmony_ci * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _REALTEK_H
962306a36Sopenharmony_ci#define _REALTEK_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/phy.h>
1262306a36Sopenharmony_ci#include <linux/platform_device.h>
1362306a36Sopenharmony_ci#include <linux/gpio/consumer.h>
1462306a36Sopenharmony_ci#include <net/dsa.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define REALTEK_HW_STOP_DELAY		25	/* msecs */
1762306a36Sopenharmony_ci#define REALTEK_HW_START_DELAY		100	/* msecs */
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistruct realtek_ops;
2062306a36Sopenharmony_cistruct dentry;
2162306a36Sopenharmony_cistruct inode;
2262306a36Sopenharmony_cistruct file;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistruct rtl8366_mib_counter {
2562306a36Sopenharmony_ci	unsigned int	base;
2662306a36Sopenharmony_ci	unsigned int	offset;
2762306a36Sopenharmony_ci	unsigned int	length;
2862306a36Sopenharmony_ci	const char	*name;
2962306a36Sopenharmony_ci};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/*
3262306a36Sopenharmony_ci * struct rtl8366_vlan_mc - Virtual LAN member configuration
3362306a36Sopenharmony_ci */
3462306a36Sopenharmony_cistruct rtl8366_vlan_mc {
3562306a36Sopenharmony_ci	u16	vid;
3662306a36Sopenharmony_ci	u16	untag;
3762306a36Sopenharmony_ci	u16	member;
3862306a36Sopenharmony_ci	u8	fid;
3962306a36Sopenharmony_ci	u8	priority;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistruct rtl8366_vlan_4k {
4362306a36Sopenharmony_ci	u16	vid;
4462306a36Sopenharmony_ci	u16	untag;
4562306a36Sopenharmony_ci	u16	member;
4662306a36Sopenharmony_ci	u8	fid;
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct realtek_priv {
5062306a36Sopenharmony_ci	struct device		*dev;
5162306a36Sopenharmony_ci	struct gpio_desc	*reset;
5262306a36Sopenharmony_ci	struct gpio_desc	*mdc;
5362306a36Sopenharmony_ci	struct gpio_desc	*mdio;
5462306a36Sopenharmony_ci	struct regmap		*map;
5562306a36Sopenharmony_ci	struct regmap		*map_nolock;
5662306a36Sopenharmony_ci	struct mutex		map_lock;
5762306a36Sopenharmony_ci	struct mii_bus		*slave_mii_bus;
5862306a36Sopenharmony_ci	struct mii_bus		*bus;
5962306a36Sopenharmony_ci	int			mdio_addr;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	unsigned int		clk_delay;
6262306a36Sopenharmony_ci	u8			cmd_read;
6362306a36Sopenharmony_ci	u8			cmd_write;
6462306a36Sopenharmony_ci	spinlock_t		lock; /* Locks around command writes */
6562306a36Sopenharmony_ci	struct dsa_switch	*ds;
6662306a36Sopenharmony_ci	struct irq_domain	*irqdomain;
6762306a36Sopenharmony_ci	bool			leds_disabled;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	unsigned int		cpu_port;
7062306a36Sopenharmony_ci	unsigned int		num_ports;
7162306a36Sopenharmony_ci	unsigned int		num_vlan_mc;
7262306a36Sopenharmony_ci	unsigned int		num_mib_counters;
7362306a36Sopenharmony_ci	struct rtl8366_mib_counter *mib_counters;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	const struct realtek_ops *ops;
7662306a36Sopenharmony_ci	int			(*setup_interface)(struct dsa_switch *ds);
7762306a36Sopenharmony_ci	int			(*write_reg_noack)(void *ctx, u32 addr, u32 data);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	int			vlan_enabled;
8062306a36Sopenharmony_ci	int			vlan4k_enabled;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	char			buf[4096];
8362306a36Sopenharmony_ci	void			*chip_data; /* Per-chip extra variant data */
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci/*
8762306a36Sopenharmony_ci * struct realtek_ops - vtable for the per-SMI-chiptype operations
8862306a36Sopenharmony_ci * @detect: detects the chiptype
8962306a36Sopenharmony_ci */
9062306a36Sopenharmony_cistruct realtek_ops {
9162306a36Sopenharmony_ci	int	(*detect)(struct realtek_priv *priv);
9262306a36Sopenharmony_ci	int	(*reset_chip)(struct realtek_priv *priv);
9362306a36Sopenharmony_ci	int	(*setup)(struct realtek_priv *priv);
9462306a36Sopenharmony_ci	void	(*cleanup)(struct realtek_priv *priv);
9562306a36Sopenharmony_ci	int	(*get_mib_counter)(struct realtek_priv *priv,
9662306a36Sopenharmony_ci				   int port,
9762306a36Sopenharmony_ci				   struct rtl8366_mib_counter *mib,
9862306a36Sopenharmony_ci				   u64 *mibvalue);
9962306a36Sopenharmony_ci	int	(*get_vlan_mc)(struct realtek_priv *priv, u32 index,
10062306a36Sopenharmony_ci			       struct rtl8366_vlan_mc *vlanmc);
10162306a36Sopenharmony_ci	int	(*set_vlan_mc)(struct realtek_priv *priv, u32 index,
10262306a36Sopenharmony_ci			       const struct rtl8366_vlan_mc *vlanmc);
10362306a36Sopenharmony_ci	int	(*get_vlan_4k)(struct realtek_priv *priv, u32 vid,
10462306a36Sopenharmony_ci			       struct rtl8366_vlan_4k *vlan4k);
10562306a36Sopenharmony_ci	int	(*set_vlan_4k)(struct realtek_priv *priv,
10662306a36Sopenharmony_ci			       const struct rtl8366_vlan_4k *vlan4k);
10762306a36Sopenharmony_ci	int	(*get_mc_index)(struct realtek_priv *priv, int port, int *val);
10862306a36Sopenharmony_ci	int	(*set_mc_index)(struct realtek_priv *priv, int port, int index);
10962306a36Sopenharmony_ci	bool	(*is_vlan_valid)(struct realtek_priv *priv, unsigned int vlan);
11062306a36Sopenharmony_ci	int	(*enable_vlan)(struct realtek_priv *priv, bool enable);
11162306a36Sopenharmony_ci	int	(*enable_vlan4k)(struct realtek_priv *priv, bool enable);
11262306a36Sopenharmony_ci	int	(*enable_port)(struct realtek_priv *priv, int port, bool enable);
11362306a36Sopenharmony_ci	int	(*phy_read)(struct realtek_priv *priv, int phy, int regnum);
11462306a36Sopenharmony_ci	int	(*phy_write)(struct realtek_priv *priv, int phy, int regnum,
11562306a36Sopenharmony_ci			     u16 val);
11662306a36Sopenharmony_ci};
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_cistruct realtek_variant {
11962306a36Sopenharmony_ci	const struct dsa_switch_ops *ds_ops_smi;
12062306a36Sopenharmony_ci	const struct dsa_switch_ops *ds_ops_mdio;
12162306a36Sopenharmony_ci	const struct realtek_ops *ops;
12262306a36Sopenharmony_ci	unsigned int clk_delay;
12362306a36Sopenharmony_ci	u8 cmd_read;
12462306a36Sopenharmony_ci	u8 cmd_write;
12562306a36Sopenharmony_ci	size_t chip_data_sz;
12662306a36Sopenharmony_ci};
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci/* RTL8366 library helpers */
12962306a36Sopenharmony_ciint rtl8366_mc_is_used(struct realtek_priv *priv, int mc_index, int *used);
13062306a36Sopenharmony_ciint rtl8366_set_vlan(struct realtek_priv *priv, int vid, u32 member,
13162306a36Sopenharmony_ci		     u32 untag, u32 fid);
13262306a36Sopenharmony_ciint rtl8366_set_pvid(struct realtek_priv *priv, unsigned int port,
13362306a36Sopenharmony_ci		     unsigned int vid);
13462306a36Sopenharmony_ciint rtl8366_enable_vlan4k(struct realtek_priv *priv, bool enable);
13562306a36Sopenharmony_ciint rtl8366_enable_vlan(struct realtek_priv *priv, bool enable);
13662306a36Sopenharmony_ciint rtl8366_reset_vlan(struct realtek_priv *priv);
13762306a36Sopenharmony_ciint rtl8366_vlan_add(struct dsa_switch *ds, int port,
13862306a36Sopenharmony_ci		     const struct switchdev_obj_port_vlan *vlan,
13962306a36Sopenharmony_ci		     struct netlink_ext_ack *extack);
14062306a36Sopenharmony_ciint rtl8366_vlan_del(struct dsa_switch *ds, int port,
14162306a36Sopenharmony_ci		     const struct switchdev_obj_port_vlan *vlan);
14262306a36Sopenharmony_civoid rtl8366_get_strings(struct dsa_switch *ds, int port, u32 stringset,
14362306a36Sopenharmony_ci			 uint8_t *data);
14462306a36Sopenharmony_ciint rtl8366_get_sset_count(struct dsa_switch *ds, int port, int sset);
14562306a36Sopenharmony_civoid rtl8366_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data);
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ciextern const struct realtek_variant rtl8366rb_variant;
14862306a36Sopenharmony_ciextern const struct realtek_variant rtl8365mb_variant;
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#endif /*  _REALTEK_H */
151