xref: /openbmc/linux/drivers/net/dsa/microchip/ksz_common.h (revision 5f81d5455589df2f580e634c2e9da55b80e63c30)
1c2e86691STristram Ha /* SPDX-License-Identifier: GPL-2.0
2c2e86691STristram Ha  * Microchip switch driver common header
3c2e86691STristram Ha  *
47c6ff470STristram Ha  * Copyright (C) 2017-2019 Microchip Technology Inc.
5c2e86691STristram Ha  */
6c2e86691STristram Ha 
7c2e86691STristram Ha #ifndef __KSZ_COMMON_H
8c2e86691STristram Ha #define __KSZ_COMMON_H
9c2e86691STristram Ha 
10ee394feaSMarek Vasut #include <linux/regmap.h>
11ee394feaSMarek Vasut 
127049f9b5STristram Ha void ksz_port_cleanup(struct ksz_device *dev, int port);
13c2e86691STristram Ha void ksz_update_port_member(struct ksz_device *dev, int port);
147c6ff470STristram Ha void ksz_init_mib_timer(struct ksz_device *dev);
15c2e86691STristram Ha 
16c2e86691STristram Ha /* Common DSA access functions */
17c2e86691STristram Ha 
18c2e86691STristram Ha int ksz_phy_read16(struct dsa_switch *ds, int addr, int reg);
19c2e86691STristram Ha int ksz_phy_write16(struct dsa_switch *ds, int addr, int reg, u16 val);
20c30d894bSTristram Ha void ksz_adjust_link(struct dsa_switch *ds, int port,
21c30d894bSTristram Ha 		     struct phy_device *phydev);
22c2e86691STristram Ha int ksz_sset_count(struct dsa_switch *ds, int port, int sset);
237c6ff470STristram Ha void ksz_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *buf);
24c2e86691STristram Ha int ksz_port_bridge_join(struct dsa_switch *ds, int port,
25c2e86691STristram Ha 			 struct net_device *br);
26c2e86691STristram Ha void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
27c2e86691STristram Ha 			   struct net_device *br);
28c2e86691STristram Ha void ksz_port_fast_age(struct dsa_switch *ds, int port);
29c2e86691STristram Ha int ksz_port_vlan_prepare(struct dsa_switch *ds, int port,
30c2e86691STristram Ha 			  const struct switchdev_obj_port_vlan *vlan);
31c2e86691STristram Ha int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
32c2e86691STristram Ha 		      void *data);
33c2e86691STristram Ha int ksz_port_mdb_prepare(struct dsa_switch *ds, int port,
34c2e86691STristram Ha 			 const struct switchdev_obj_port_mdb *mdb);
35c2e86691STristram Ha void ksz_port_mdb_add(struct dsa_switch *ds, int port,
36c2e86691STristram Ha 		      const struct switchdev_obj_port_mdb *mdb);
37c2e86691STristram Ha int ksz_port_mdb_del(struct dsa_switch *ds, int port,
38c2e86691STristram Ha 		     const struct switchdev_obj_port_mdb *mdb);
39c2e86691STristram Ha int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy);
4075104db0SAndrew Lunn void ksz_disable_port(struct dsa_switch *ds, int port);
41c2e86691STristram Ha 
42c2e86691STristram Ha /* Common register access functions */
43c2e86691STristram Ha 
44c2e86691STristram Ha static inline int ksz_read8(struct ksz_device *dev, u32 reg, u8 *val)
45c2e86691STristram Ha {
46ee394feaSMarek Vasut 	unsigned int value;
47ee394feaSMarek Vasut 	int ret = regmap_read(dev->regmap[0], reg, &value);
48c2e86691STristram Ha 
49ee394feaSMarek Vasut 	*val = value;
50c2e86691STristram Ha 	return ret;
51c2e86691STristram Ha }
52c2e86691STristram Ha 
53c2e86691STristram Ha static inline int ksz_read16(struct ksz_device *dev, u32 reg, u16 *val)
54c2e86691STristram Ha {
55ee394feaSMarek Vasut 	unsigned int value;
56ee394feaSMarek Vasut 	int ret = regmap_read(dev->regmap[1], reg, &value);
57c2e86691STristram Ha 
58ee394feaSMarek Vasut 	*val = value;
59c2e86691STristram Ha 	return ret;
60c2e86691STristram Ha }
61c2e86691STristram Ha 
62c2e86691STristram Ha static inline int ksz_read32(struct ksz_device *dev, u32 reg, u32 *val)
63c2e86691STristram Ha {
64ee394feaSMarek Vasut 	unsigned int value;
65ee394feaSMarek Vasut 	int ret = regmap_read(dev->regmap[2], reg, &value);
66c2e86691STristram Ha 
67ee394feaSMarek Vasut 	*val = value;
68c2e86691STristram Ha 	return ret;
69c2e86691STristram Ha }
70c2e86691STristram Ha 
71c2e86691STristram Ha static inline int ksz_write8(struct ksz_device *dev, u32 reg, u8 value)
72c2e86691STristram Ha {
73ee394feaSMarek Vasut 	return regmap_write(dev->regmap[0], reg, value);
74c2e86691STristram Ha }
75c2e86691STristram Ha 
76c2e86691STristram Ha static inline int ksz_write16(struct ksz_device *dev, u32 reg, u16 value)
77c2e86691STristram Ha {
78ee394feaSMarek Vasut 	return regmap_write(dev->regmap[1], reg, value);
79c2e86691STristram Ha }
80c2e86691STristram Ha 
81c2e86691STristram Ha static inline int ksz_write32(struct ksz_device *dev, u32 reg, u32 value)
82c2e86691STristram Ha {
83ee394feaSMarek Vasut 	return regmap_write(dev->regmap[2], reg, value);
84c2e86691STristram Ha }
85c2e86691STristram Ha 
86c2e86691STristram Ha static inline void ksz_pread8(struct ksz_device *dev, int port, int offset,
87c2e86691STristram Ha 			      u8 *data)
88c2e86691STristram Ha {
89c2e86691STristram Ha 	ksz_read8(dev, dev->dev_ops->get_port_addr(port, offset), data);
90c2e86691STristram Ha }
91c2e86691STristram Ha 
92c2e86691STristram Ha static inline void ksz_pread16(struct ksz_device *dev, int port, int offset,
93c2e86691STristram Ha 			       u16 *data)
94c2e86691STristram Ha {
95c2e86691STristram Ha 	ksz_read16(dev, dev->dev_ops->get_port_addr(port, offset), data);
96c2e86691STristram Ha }
97c2e86691STristram Ha 
98c2e86691STristram Ha static inline void ksz_pread32(struct ksz_device *dev, int port, int offset,
99c2e86691STristram Ha 			       u32 *data)
100c2e86691STristram Ha {
101c2e86691STristram Ha 	ksz_read32(dev, dev->dev_ops->get_port_addr(port, offset), data);
102c2e86691STristram Ha }
103c2e86691STristram Ha 
104c2e86691STristram Ha static inline void ksz_pwrite8(struct ksz_device *dev, int port, int offset,
105c2e86691STristram Ha 			       u8 data)
106c2e86691STristram Ha {
107c2e86691STristram Ha 	ksz_write8(dev, dev->dev_ops->get_port_addr(port, offset), data);
108c2e86691STristram Ha }
109c2e86691STristram Ha 
110c2e86691STristram Ha static inline void ksz_pwrite16(struct ksz_device *dev, int port, int offset,
111c2e86691STristram Ha 				u16 data)
112c2e86691STristram Ha {
113c2e86691STristram Ha 	ksz_write16(dev, dev->dev_ops->get_port_addr(port, offset), data);
114c2e86691STristram Ha }
115c2e86691STristram Ha 
116c2e86691STristram Ha static inline void ksz_pwrite32(struct ksz_device *dev, int port, int offset,
117c2e86691STristram Ha 				u32 data)
118c2e86691STristram Ha {
119c2e86691STristram Ha 	ksz_write32(dev, dev->dev_ops->get_port_addr(port, offset), data);
120c2e86691STristram Ha }
121c2e86691STristram Ha 
122255b59adSMarek Vasut /* Regmap tables generation */
123255b59adSMarek Vasut #define KSZ_SPI_OP_RD		3
124255b59adSMarek Vasut #define KSZ_SPI_OP_WR		2
125255b59adSMarek Vasut 
126255b59adSMarek Vasut #define KSZ_SPI_OP_FLAG_MASK(opcode, swp, regbits, regpad)		\
127255b59adSMarek Vasut 	swab##swp((opcode) << ((regbits) + (regpad)))
128255b59adSMarek Vasut 
129255b59adSMarek Vasut #define KSZ_REGMAP_ENTRY(width, swp, regbits, regpad, regalign)		\
130255b59adSMarek Vasut 	{								\
131*5f81d545SGeorge McCollister 		.name = #width,						\
132255b59adSMarek Vasut 		.val_bits = (width),					\
133255b59adSMarek Vasut 		.reg_stride = (width) / 8,				\
134255b59adSMarek Vasut 		.reg_bits = (regbits) + (regalign),			\
135255b59adSMarek Vasut 		.pad_bits = (regpad),					\
136255b59adSMarek Vasut 		.max_register = BIT(regbits) - 1,			\
137255b59adSMarek Vasut 		.cache_type = REGCACHE_NONE,				\
138255b59adSMarek Vasut 		.read_flag_mask =					\
139255b59adSMarek Vasut 			KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_RD, swp,	\
140255b59adSMarek Vasut 					     regbits, regpad),		\
141255b59adSMarek Vasut 		.write_flag_mask =					\
142255b59adSMarek Vasut 			KSZ_SPI_OP_FLAG_MASK(KSZ_SPI_OP_WR, swp,	\
143255b59adSMarek Vasut 					     regbits, regpad),		\
144255b59adSMarek Vasut 		.reg_format_endian = REGMAP_ENDIAN_BIG,			\
145255b59adSMarek Vasut 		.val_format_endian = REGMAP_ENDIAN_BIG			\
146255b59adSMarek Vasut 	}
147255b59adSMarek Vasut 
148255b59adSMarek Vasut #define KSZ_REGMAP_TABLE(ksz, swp, regbits, regpad, regalign)		\
149255b59adSMarek Vasut 	static const struct regmap_config ksz##_regmap_config[] = {	\
150255b59adSMarek Vasut 		KSZ_REGMAP_ENTRY(8, swp, (regbits), (regpad), (regalign)), \
151255b59adSMarek Vasut 		KSZ_REGMAP_ENTRY(16, swp, (regbits), (regpad), (regalign)), \
152255b59adSMarek Vasut 		KSZ_REGMAP_ENTRY(32, swp, (regbits), (regpad), (regalign)), \
153255b59adSMarek Vasut 	}
154255b59adSMarek Vasut 
155c2e86691STristram Ha #endif
156