xref: /openbmc/linux/drivers/net/dsa/sja1105/sja1105_tas.h (revision 86db36a347b4ea030ee3e6c73ce04e35e4732999)
1b790b554SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0 */
2b790b554SNishad Kamdar /* Copyright (c) 2019, Vladimir Oltean <olteanv@gmail.com>
3317ab5b8SVladimir Oltean  */
4317ab5b8SVladimir Oltean #ifndef _SJA1105_TAS_H
5317ab5b8SVladimir Oltean #define _SJA1105_TAS_H
6317ab5b8SVladimir Oltean 
7317ab5b8SVladimir Oltean #include <net/pkt_sched.h>
8317ab5b8SVladimir Oltean 
9317ab5b8SVladimir Oltean #if IS_ENABLED(CONFIG_NET_DSA_SJA1105_TAS)
10317ab5b8SVladimir Oltean 
11*86db36a3SVladimir Oltean enum sja1105_tas_state {
12*86db36a3SVladimir Oltean 	SJA1105_TAS_STATE_DISABLED,
13*86db36a3SVladimir Oltean 	SJA1105_TAS_STATE_ENABLED_NOT_RUNNING,
14*86db36a3SVladimir Oltean 	SJA1105_TAS_STATE_RUNNING,
15*86db36a3SVladimir Oltean };
16*86db36a3SVladimir Oltean 
17*86db36a3SVladimir Oltean enum sja1105_ptp_op {
18*86db36a3SVladimir Oltean 	SJA1105_PTP_NONE,
19*86db36a3SVladimir Oltean 	SJA1105_PTP_CLOCKSTEP,
20*86db36a3SVladimir Oltean 	SJA1105_PTP_ADJUSTFREQ,
21*86db36a3SVladimir Oltean };
22*86db36a3SVladimir Oltean 
23317ab5b8SVladimir Oltean struct sja1105_tas_data {
24317ab5b8SVladimir Oltean 	struct tc_taprio_qopt_offload *offload[SJA1105_NUM_PORTS];
25*86db36a3SVladimir Oltean 	enum sja1105_tas_state state;
26*86db36a3SVladimir Oltean 	enum sja1105_ptp_op last_op;
27*86db36a3SVladimir Oltean 	struct work_struct tas_work;
28*86db36a3SVladimir Oltean 	s64 earliest_base_time;
29*86db36a3SVladimir Oltean 	s64 oper_base_time;
30*86db36a3SVladimir Oltean 	u64 max_cycle_time;
31*86db36a3SVladimir Oltean 	bool enabled;
32317ab5b8SVladimir Oltean };
33317ab5b8SVladimir Oltean 
34317ab5b8SVladimir Oltean int sja1105_setup_tc_taprio(struct dsa_switch *ds, int port,
35317ab5b8SVladimir Oltean 			    struct tc_taprio_qopt_offload *admin);
36317ab5b8SVladimir Oltean 
37317ab5b8SVladimir Oltean void sja1105_tas_setup(struct dsa_switch *ds);
38317ab5b8SVladimir Oltean 
39317ab5b8SVladimir Oltean void sja1105_tas_teardown(struct dsa_switch *ds);
40317ab5b8SVladimir Oltean 
41*86db36a3SVladimir Oltean void sja1105_tas_clockstep(struct dsa_switch *ds);
42*86db36a3SVladimir Oltean 
43*86db36a3SVladimir Oltean void sja1105_tas_adjfreq(struct dsa_switch *ds);
44*86db36a3SVladimir Oltean 
45317ab5b8SVladimir Oltean #else
46317ab5b8SVladimir Oltean 
47317ab5b8SVladimir Oltean /* C doesn't allow empty structures, bah! */
48317ab5b8SVladimir Oltean struct sja1105_tas_data {
49317ab5b8SVladimir Oltean 	u8 dummy;
50317ab5b8SVladimir Oltean };
51317ab5b8SVladimir Oltean 
52317ab5b8SVladimir Oltean static inline int sja1105_setup_tc_taprio(struct dsa_switch *ds, int port,
53317ab5b8SVladimir Oltean 					  struct tc_taprio_qopt_offload *admin)
54317ab5b8SVladimir Oltean {
55317ab5b8SVladimir Oltean 	return -EOPNOTSUPP;
56317ab5b8SVladimir Oltean }
57317ab5b8SVladimir Oltean 
58317ab5b8SVladimir Oltean static inline void sja1105_tas_setup(struct dsa_switch *ds) { }
59317ab5b8SVladimir Oltean 
60317ab5b8SVladimir Oltean static inline void sja1105_tas_teardown(struct dsa_switch *ds) { }
61317ab5b8SVladimir Oltean 
62*86db36a3SVladimir Oltean static inline void sja1105_tas_clockstep(struct dsa_switch *ds) { }
63*86db36a3SVladimir Oltean 
64*86db36a3SVladimir Oltean static inline void sja1105_tas_adjfreq(struct dsa_switch *ds) { }
65*86db36a3SVladimir Oltean 
66317ab5b8SVladimir Oltean #endif /* IS_ENABLED(CONFIG_NET_DSA_SJA1105_TAS) */
67317ab5b8SVladimir Oltean 
68317ab5b8SVladimir Oltean #endif /* _SJA1105_TAS_H */
69