Linux Audio

Check our new training course

Loading...
v6.8
  1/* SPDX-License-Identifier: GPL-2.0+
  2 * Microchip Sparx5 SerDes driver
  3 *
  4 * Copyright (c) 2020 Microchip Technology Inc.
  5 */
  6
  7#ifndef _SPARX5_SERDES_H_
  8#define _SPARX5_SERDES_H_
  9
 10#include "sparx5_serdes_regs.h"
 11
 12#define SPX5_SERDES_MAX       33
 13
 14enum sparx5_serdes_type {
 15	SPX5_SDT_6G  = 6,
 16	SPX5_SDT_10G = 10,
 17	SPX5_SDT_25G = 25,
 18};
 19
 20enum sparx5_serdes_mode {
 21	SPX5_SD_MODE_NONE,
 22	SPX5_SD_MODE_2G5,
 23	SPX5_SD_MODE_QSGMII,
 24	SPX5_SD_MODE_100FX,
 25	SPX5_SD_MODE_1000BASEX,
 26	SPX5_SD_MODE_SFI,
 27};
 28
 29struct sparx5_serdes_private {
 30	struct device *dev;
 31	void __iomem *regs[NUM_TARGETS];
 32	struct phy *phys[SPX5_SERDES_MAX];
 33	unsigned long coreclock;
 
 
 
 
 
 
 
 34};
 35
 36struct sparx5_serdes_macro {
 37	struct sparx5_serdes_private *priv;
 38	u32 sidx;
 39	u32 stpidx;
 40	enum sparx5_serdes_type serdestype;
 41	enum sparx5_serdes_mode serdesmode;
 42	phy_interface_t portmode;
 43	int speed;
 44	enum phy_media media;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 45};
 46
 47/* Read, Write and modify registers content.
 48 * The register definition macros start at the id
 49 */
 50static inline void __iomem *sdx5_addr(void __iomem *base[],
 51				      int id, int tinst, int tcnt,
 52				      int gbase, int ginst,
 53				      int gcnt, int gwidth,
 54				      int raddr, int rinst,
 55				      int rcnt, int rwidth)
 56{
 57	WARN_ON((tinst) >= tcnt);
 58	WARN_ON((ginst) >= gcnt);
 59	WARN_ON((rinst) >= rcnt);
 60	return base[id + (tinst)] +
 61		gbase + ((ginst) * gwidth) +
 62		raddr + ((rinst) * rwidth);
 63}
 64
 65static inline void __iomem *sdx5_inst_baseaddr(void __iomem *base,
 66					       int gbase, int ginst,
 67					       int gcnt, int gwidth,
 68					       int raddr, int rinst,
 69					       int rcnt, int rwidth)
 70{
 71	WARN_ON((ginst) >= gcnt);
 72	WARN_ON((rinst) >= rcnt);
 73	return base +
 74		gbase + ((ginst) * gwidth) +
 75		raddr + ((rinst) * rwidth);
 76}
 77
 78static inline void sdx5_rmw(u32 val, u32 mask, struct sparx5_serdes_private *priv,
 79			    int id, int tinst, int tcnt,
 80			    int gbase, int ginst, int gcnt, int gwidth,
 81			    int raddr, int rinst, int rcnt, int rwidth)
 82{
 83	u32 nval;
 84	void __iomem *addr =
 85		sdx5_addr(priv->regs, id, tinst, tcnt,
 86			  gbase, ginst, gcnt, gwidth,
 87			  raddr, rinst, rcnt, rwidth);
 88	nval = readl(addr);
 89	nval = (nval & ~mask) | (val & mask);
 90	writel(nval, addr);
 91}
 92
 93static inline void sdx5_inst_rmw(u32 val, u32 mask, void __iomem *iomem,
 94				 int id, int tinst, int tcnt,
 95				 int gbase, int ginst, int gcnt, int gwidth,
 96				 int raddr, int rinst, int rcnt, int rwidth)
 97{
 98	u32 nval;
 99	void __iomem *addr =
100		sdx5_inst_baseaddr(iomem,
101				   gbase, ginst, gcnt, gwidth,
102				   raddr, rinst, rcnt, rwidth);
103	nval = readl(addr);
104	nval = (nval & ~mask) | (val & mask);
105	writel(nval, addr);
106}
107
108static inline void sdx5_rmw_addr(u32 val, u32 mask, void __iomem *addr)
109{
110	u32 nval;
111
112	nval = readl(addr);
113	nval = (nval & ~mask) | (val & mask);
114	writel(nval, addr);
115}
116
117static inline void __iomem *sdx5_inst_get(struct sparx5_serdes_private *priv,
118					  int id, int tinst)
119{
120	return priv->regs[id + tinst];
121}
122
123static inline void __iomem *sdx5_inst_addr(void __iomem *iomem,
124					   int id, int tinst, int tcnt,
125					   int gbase,
126					   int ginst, int gcnt, int gwidth,
127					   int raddr,
128					   int rinst, int rcnt, int rwidth)
129{
130	return sdx5_inst_baseaddr(iomem, gbase, ginst, gcnt, gwidth,
131				  raddr, rinst, rcnt, rwidth);
132}
133
134
135#endif /* _SPARX5_SERDES_REGS_H_ */
v6.13.7
  1/* SPDX-License-Identifier: GPL-2.0+
  2 * Microchip Sparx5 SerDes driver
  3 *
  4 * Copyright (c) 2020 Microchip Technology Inc.
  5 */
  6
  7#ifndef _SPARX5_SERDES_H_
  8#define _SPARX5_SERDES_H_
  9
 10#include "sparx5_serdes_regs.h"
 11
 12#define SPX5_SERDES_MAX       33
 13
 14enum sparx5_serdes_type {
 15	SPX5_SDT_6G  = 6,
 16	SPX5_SDT_10G = 10,
 17	SPX5_SDT_25G = 25,
 18};
 19
 20enum sparx5_serdes_mode {
 21	SPX5_SD_MODE_NONE,
 22	SPX5_SD_MODE_2G5,
 23	SPX5_SD_MODE_QSGMII,
 24	SPX5_SD_MODE_100FX,
 25	SPX5_SD_MODE_1000BASEX,
 26	SPX5_SD_MODE_SFI,
 27};
 28
 29enum sparx5_10g28cmu_mode {
 30	SPX5_SD10G28_CMU_MAIN = 0,
 31	SPX5_SD10G28_CMU_AUX1 = 1,
 32	SPX5_SD10G28_CMU_AUX2 = 3,
 33	SPX5_SD10G28_CMU_NONE = 4,
 34	SPX5_SD10G28_CMU_MAX,
 35};
 36
 37enum sparx5_target {
 38	SPX5_TARGET_SPARX5,
 39	SPX5_TARGET_LAN969X,
 40
 41};
 42
 43struct sparx5_serdes_macro {
 44	struct sparx5_serdes_private *priv;
 45	u32 sidx;
 46	u32 stpidx;
 47	enum sparx5_serdes_type serdestype;
 48	enum sparx5_serdes_mode serdesmode;
 49	phy_interface_t portmode;
 50	int speed;
 51	enum phy_media media;
 52};
 53
 54struct sparx5_serdes_consts {
 55	int sd_max;
 56	int cmu_max;
 57};
 58
 59struct sparx5_serdes_ops {
 60	void (*serdes_type_set)(struct sparx5_serdes_macro *macro, int sidx);
 61	int (*serdes_cmu_get)(enum sparx5_10g28cmu_mode mode, int sd_index);
 62};
 63
 64struct sparx5_serdes_match_data {
 65	enum sparx5_target type;
 66	const struct sparx5_serdes_consts consts;
 67	const struct sparx5_serdes_ops ops;
 68	const struct sparx5_serdes_io_resource *iomap;
 69	int iomap_size;
 70	const unsigned int *tsize;
 71};
 72
 73struct sparx5_serdes_private {
 74	struct device *dev;
 75	void __iomem *regs[NUM_TARGETS];
 76	struct phy *phys[SPX5_SERDES_MAX];
 77	unsigned long coreclock;
 78	const struct sparx5_serdes_match_data *data;
 79};
 80
 81/* Read, Write and modify registers content.
 82 * The register definition macros start at the id
 83 */
 84static inline void __iomem *sdx5_addr(void __iomem *base[],
 85				      int id, int tinst, int tcnt,
 86				      int gbase, int ginst,
 87				      int gcnt, int gwidth,
 88				      int raddr, int rinst,
 89				      int rcnt, int rwidth)
 90{
 91	WARN_ON((tinst) >= tcnt);
 92	WARN_ON((ginst) >= gcnt);
 93	WARN_ON((rinst) >= rcnt);
 94	return base[id + (tinst)] +
 95		gbase + ((ginst) * gwidth) +
 96		raddr + ((rinst) * rwidth);
 97}
 98
 99static inline void __iomem *sdx5_inst_baseaddr(void __iomem *base,
100					       int gbase, int ginst,
101					       int gcnt, int gwidth,
102					       int raddr, int rinst,
103					       int rcnt, int rwidth)
104{
105	WARN_ON((ginst) >= gcnt);
106	WARN_ON((rinst) >= rcnt);
107	return base +
108		gbase + ((ginst) * gwidth) +
109		raddr + ((rinst) * rwidth);
110}
111
112static inline void sdx5_rmw(u32 val, u32 mask, struct sparx5_serdes_private *priv,
113			    int id, int tinst, int tcnt,
114			    int gbase, int ginst, int gcnt, int gwidth,
115			    int raddr, int rinst, int rcnt, int rwidth)
116{
117	u32 nval;
118	void __iomem *addr =
119		sdx5_addr(priv->regs, id, tinst, tcnt,
120			  gbase, ginst, gcnt, gwidth,
121			  raddr, rinst, rcnt, rwidth);
122	nval = readl(addr);
123	nval = (nval & ~mask) | (val & mask);
124	writel(nval, addr);
125}
126
127static inline void sdx5_inst_rmw(u32 val, u32 mask, void __iomem *iomem,
128				 int id, int tinst, int tcnt,
129				 int gbase, int ginst, int gcnt, int gwidth,
130				 int raddr, int rinst, int rcnt, int rwidth)
131{
132	u32 nval;
133	void __iomem *addr =
134		sdx5_inst_baseaddr(iomem,
135				   gbase, ginst, gcnt, gwidth,
136				   raddr, rinst, rcnt, rwidth);
137	nval = readl(addr);
138	nval = (nval & ~mask) | (val & mask);
139	writel(nval, addr);
140}
141
142static inline void sdx5_rmw_addr(u32 val, u32 mask, void __iomem *addr)
143{
144	u32 nval;
145
146	nval = readl(addr);
147	nval = (nval & ~mask) | (val & mask);
148	writel(nval, addr);
149}
150
151static inline void __iomem *sdx5_inst_get(struct sparx5_serdes_private *priv,
152					  int id, int tinst)
153{
154	return priv->regs[id + tinst];
155}
156
157static inline void __iomem *sdx5_inst_addr(void __iomem *iomem,
158					   int id, int tinst, int tcnt,
159					   int gbase,
160					   int ginst, int gcnt, int gwidth,
161					   int raddr,
162					   int rinst, int rcnt, int rwidth)
163{
164	return sdx5_inst_baseaddr(iomem, gbase, ginst, gcnt, gwidth,
165				  raddr, rinst, rcnt, rwidth);
166}
167
168
169#endif /* _SPARX5_SERDES_REGS_H_ */