162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <linux/device.h>
362306a36Sopenharmony_ci#include <linux/mutex.h>
462306a36Sopenharmony_ci#include <linux/regmap.h>
562306a36Sopenharmony_ci#include <linux/workqueue.h>
662306a36Sopenharmony_ci#include <linux/u64_stats_sync.h>
762306a36Sopenharmony_ci#include <uapi/linux/if_link.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistruct xrs700x_info {
1062306a36Sopenharmony_ci	unsigned int id;
1162306a36Sopenharmony_ci	const char *name;
1262306a36Sopenharmony_ci	size_t num_ports;
1362306a36Sopenharmony_ci};
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciextern const struct xrs700x_info xrs7003e_info;
1662306a36Sopenharmony_ciextern const struct xrs700x_info xrs7003f_info;
1762306a36Sopenharmony_ciextern const struct xrs700x_info xrs7004e_info;
1862306a36Sopenharmony_ciextern const struct xrs700x_info xrs7004f_info;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct xrs700x_port {
2162306a36Sopenharmony_ci	struct mutex mib_mutex; /* protects mib_data */
2262306a36Sopenharmony_ci	u64 *mib_data;
2362306a36Sopenharmony_ci	struct rtnl_link_stats64 stats64;
2462306a36Sopenharmony_ci	struct u64_stats_sync syncp;
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct xrs700x {
2862306a36Sopenharmony_ci	struct dsa_switch *ds;
2962306a36Sopenharmony_ci	struct device *dev;
3062306a36Sopenharmony_ci	void *priv;
3162306a36Sopenharmony_ci	struct regmap *regmap;
3262306a36Sopenharmony_ci	struct regmap_field *ps_forward;
3362306a36Sopenharmony_ci	struct regmap_field *ps_management;
3462306a36Sopenharmony_ci	struct regmap_field *ps_sel_speed;
3562306a36Sopenharmony_ci	struct regmap_field *ps_cur_speed;
3662306a36Sopenharmony_ci	struct delayed_work mib_work;
3762306a36Sopenharmony_ci	struct xrs700x_port *ports;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct xrs700x *xrs700x_switch_alloc(struct device *base, void *devpriv);
4162306a36Sopenharmony_ciint xrs700x_switch_register(struct xrs700x *priv);
4262306a36Sopenharmony_civoid xrs700x_switch_remove(struct xrs700x *priv);
4362306a36Sopenharmony_civoid xrs700x_switch_shutdown(struct xrs700x *priv);
44