Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1/*
  2 * Microchip KSZ series switch common definitions
  3 *
  4 * Copyright (C) 2017
  5 *
  6 * Permission to use, copy, modify, and/or distribute this software for any
  7 * purpose with or without fee is hereby granted, provided that the above
  8 * copyright notice and this permission notice appear in all copies.
  9 *
 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 17 */
 18
 19#ifndef __KSZ_PRIV_H
 20#define __KSZ_PRIV_H
 21
 22#include <linux/kernel.h>
 23#include <linux/mutex.h>
 24#include <linux/phy.h>
 25#include <linux/etherdevice.h>
 26#include <net/dsa.h>
 27
 28#include "ksz_9477_reg.h"
 29
 30struct ksz_io_ops;
 31
 32struct vlan_table {
 33	u32 table[3];
 34};
 35
 36struct ksz_device {
 37	struct dsa_switch *ds;
 38	struct ksz_platform_data *pdata;
 39	const char *name;
 40
 41	struct mutex reg_mutex;		/* register access */
 42	struct mutex stats_mutex;	/* status access */
 43	struct mutex alu_mutex;		/* ALU access */
 44	struct mutex vlan_mutex;	/* vlan access */
 45	const struct ksz_io_ops *ops;
 46
 47	struct device *dev;
 48
 49	void *priv;
 50
 51	/* chip specific data */
 52	u32 chip_id;
 53	int num_vlans;
 54	int num_alus;
 55	int num_statics;
 56	int cpu_port;			/* port connected to CPU */
 57	int cpu_ports;			/* port bitmap can be cpu port */
 58	int port_cnt;
 59
 60	struct vlan_table *vlan_cache;
 61
 62	u64 mib_value[TOTAL_SWITCH_COUNTER_NUM];
 63};
 64
 65struct ksz_io_ops {
 66	int (*read8)(struct ksz_device *dev, u32 reg, u8 *value);
 67	int (*read16)(struct ksz_device *dev, u32 reg, u16 *value);
 68	int (*read24)(struct ksz_device *dev, u32 reg, u32 *value);
 69	int (*read32)(struct ksz_device *dev, u32 reg, u32 *value);
 70	int (*write8)(struct ksz_device *dev, u32 reg, u8 value);
 71	int (*write16)(struct ksz_device *dev, u32 reg, u16 value);
 72	int (*write24)(struct ksz_device *dev, u32 reg, u32 value);
 73	int (*write32)(struct ksz_device *dev, u32 reg, u32 value);
 74	int (*phy_read16)(struct ksz_device *dev, int addr, int reg,
 75			  u16 *value);
 76	int (*phy_write16)(struct ksz_device *dev, int addr, int reg,
 77			   u16 value);
 78};
 79
 80struct ksz_device *ksz_switch_alloc(struct device *base,
 81				    const struct ksz_io_ops *ops, void *priv);
 82int ksz_switch_detect(struct ksz_device *dev);
 83int ksz_switch_register(struct ksz_device *dev);
 84void ksz_switch_remove(struct ksz_device *dev);
 85
 86static inline int ksz_read8(struct ksz_device *dev, u32 reg, u8 *val)
 87{
 88	int ret;
 89
 90	mutex_lock(&dev->reg_mutex);
 91	ret = dev->ops->read8(dev, reg, val);
 92	mutex_unlock(&dev->reg_mutex);
 93
 94	return ret;
 95}
 96
 97static inline int ksz_read16(struct ksz_device *dev, u32 reg, u16 *val)
 98{
 99	int ret;
100
101	mutex_lock(&dev->reg_mutex);
102	ret = dev->ops->read16(dev, reg, val);
103	mutex_unlock(&dev->reg_mutex);
104
105	return ret;
106}
107
108static inline int ksz_read24(struct ksz_device *dev, u32 reg, u32 *val)
109{
110	int ret;
111
112	mutex_lock(&dev->reg_mutex);
113	ret = dev->ops->read24(dev, reg, val);
114	mutex_unlock(&dev->reg_mutex);
115
116	return ret;
117}
118
119static inline int ksz_read32(struct ksz_device *dev, u32 reg, u32 *val)
120{
121	int ret;
122
123	mutex_lock(&dev->reg_mutex);
124	ret = dev->ops->read32(dev, reg, val);
125	mutex_unlock(&dev->reg_mutex);
126
127	return ret;
128}
129
130static inline int ksz_write8(struct ksz_device *dev, u32 reg, u8 value)
131{
132	int ret;
133
134	mutex_lock(&dev->reg_mutex);
135	ret = dev->ops->write8(dev, reg, value);
136	mutex_unlock(&dev->reg_mutex);
137
138	return ret;
139}
140
141static inline int ksz_write16(struct ksz_device *dev, u32 reg, u16 value)
142{
143	int ret;
144
145	mutex_lock(&dev->reg_mutex);
146	ret = dev->ops->write16(dev, reg, value);
147	mutex_unlock(&dev->reg_mutex);
148
149	return ret;
150}
151
152static inline int ksz_write24(struct ksz_device *dev, u32 reg, u32 value)
153{
154	int ret;
155
156	mutex_lock(&dev->reg_mutex);
157	ret = dev->ops->write24(dev, reg, value);
158	mutex_unlock(&dev->reg_mutex);
159
160	return ret;
161}
162
163static inline int ksz_write32(struct ksz_device *dev, u32 reg, u32 value)
164{
165	int ret;
166
167	mutex_lock(&dev->reg_mutex);
168	ret = dev->ops->write32(dev, reg, value);
169	mutex_unlock(&dev->reg_mutex);
170
171	return ret;
172}
173
174static inline void ksz_pread8(struct ksz_device *dev, int port, int offset,
175			      u8 *data)
176{
177	ksz_read8(dev, PORT_CTRL_ADDR(port, offset), data);
178}
179
180static inline void ksz_pread16(struct ksz_device *dev, int port, int offset,
181			       u16 *data)
182{
183	ksz_read16(dev, PORT_CTRL_ADDR(port, offset), data);
184}
185
186static inline void ksz_pread32(struct ksz_device *dev, int port, int offset,
187			       u32 *data)
188{
189	ksz_read32(dev, PORT_CTRL_ADDR(port, offset), data);
190}
191
192static inline void ksz_pwrite8(struct ksz_device *dev, int port, int offset,
193			       u8 data)
194{
195	ksz_write8(dev, PORT_CTRL_ADDR(port, offset), data);
196}
197
198static inline void ksz_pwrite16(struct ksz_device *dev, int port, int offset,
199				u16 data)
200{
201	ksz_write16(dev, PORT_CTRL_ADDR(port, offset), data);
202}
203
204static inline void ksz_pwrite32(struct ksz_device *dev, int port, int offset,
205				u32 data)
206{
207	ksz_write32(dev, PORT_CTRL_ADDR(port, offset), data);
208}
209
210#endif