Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3// Copyright (c) 2022 Pengutronix, Oleksij Rempel <kernel@pengutronix.de>
4 */
5#ifndef _LINUX_PSE_CONTROLLER_H
6#define _LINUX_PSE_CONTROLLER_H
7
8#include <linux/ethtool.h>
9#include <linux/list.h>
10#include <uapi/linux/ethtool.h>
11
12struct phy_device;
13struct pse_controller_dev;
14
15/**
16 * struct pse_control_config - PSE control/channel configuration.
17 *
18 * @podl_admin_control: set PoDL PSE admin control as described in
19 * IEEE 802.3-2018 30.15.1.2.1 acPoDLPSEAdminControl
20 * @c33_admin_control: set PSE admin control as described in
21 * IEEE 802.3-2022 30.9.1.2.1 acPSEAdminControl
22 */
23struct pse_control_config {
24 enum ethtool_podl_pse_admin_state podl_admin_control;
25 enum ethtool_c33_pse_admin_state c33_admin_control;
26};
27
28/**
29 * struct pse_control_status - PSE control/channel status.
30 *
31 * @podl_admin_state: operational state of the PoDL PSE
32 * functions. IEEE 802.3-2018 30.15.1.1.2 aPoDLPSEAdminState
33 * @podl_pw_status: power detection status of the PoDL PSE.
34 * IEEE 802.3-2018 30.15.1.1.3 aPoDLPSEPowerDetectionStatus:
35 * @c33_admin_state: operational state of the PSE
36 * functions. IEEE 802.3-2022 30.9.1.1.2 aPSEAdminState
37 * @c33_pw_status: power detection status of the PSE.
38 * IEEE 802.3-2022 30.9.1.1.5 aPSEPowerDetectionStatus:
39 */
40struct pse_control_status {
41 enum ethtool_podl_pse_admin_state podl_admin_state;
42 enum ethtool_podl_pse_pw_d_status podl_pw_status;
43 enum ethtool_c33_pse_admin_state c33_admin_state;
44 enum ethtool_c33_pse_pw_d_status c33_pw_status;
45};
46
47/**
48 * struct pse_controller_ops - PSE controller driver callbacks
49 *
50 * @ethtool_get_status: get PSE control status for ethtool interface
51 * @setup_pi_matrix: setup PI matrix of the PSE controller
52 * @pi_is_enabled: Return 1 if the PSE PI is enabled, 0 if not.
53 * May also return negative errno.
54 * @pi_enable: Configure the PSE PI as enabled.
55 * @pi_disable: Configure the PSE PI as disabled.
56 */
57struct pse_controller_ops {
58 int (*ethtool_get_status)(struct pse_controller_dev *pcdev,
59 unsigned long id, struct netlink_ext_ack *extack,
60 struct pse_control_status *status);
61 int (*setup_pi_matrix)(struct pse_controller_dev *pcdev);
62 int (*pi_is_enabled)(struct pse_controller_dev *pcdev, int id);
63 int (*pi_enable)(struct pse_controller_dev *pcdev, int id);
64 int (*pi_disable)(struct pse_controller_dev *pcdev, int id);
65};
66
67struct module;
68struct device_node;
69struct of_phandle_args;
70struct pse_control;
71
72/* PSE PI pairset pinout can either be Alternative A or Alternative B */
73enum pse_pi_pairset_pinout {
74 ALTERNATIVE_A,
75 ALTERNATIVE_B,
76};
77
78/**
79 * struct pse_pi_pairset - PSE PI pairset entity describing the pinout
80 * alternative ant its phandle
81 *
82 * @pinout: description of the pinout alternative
83 * @np: device node pointer describing the pairset phandle
84 */
85struct pse_pi_pairset {
86 enum pse_pi_pairset_pinout pinout;
87 struct device_node *np;
88};
89
90/**
91 * struct pse_pi - PSE PI (Power Interface) entity as described in
92 * IEEE 802.3-2022 145.2.4
93 *
94 * @pairset: table of the PSE PI pinout alternative for the two pairset
95 * @np: device node pointer of the PSE PI node
96 * @rdev: regulator represented by the PSE PI
97 * @admin_state_enabled: PI enabled state
98 */
99struct pse_pi {
100 struct pse_pi_pairset pairset[2];
101 struct device_node *np;
102 struct regulator_dev *rdev;
103 bool admin_state_enabled;
104};
105
106/**
107 * struct pse_controller_dev - PSE controller entity that might
108 * provide multiple PSE controls
109 * @ops: a pointer to device specific struct pse_controller_ops
110 * @owner: kernel module of the PSE controller driver
111 * @list: internal list of PSE controller devices
112 * @pse_control_head: head of internal list of requested PSE controls
113 * @dev: corresponding driver model device struct
114 * @of_pse_n_cells: number of cells in PSE line specifiers
115 * @nr_lines: number of PSE controls in this controller device
116 * @lock: Mutex for serialization access to the PSE controller
117 * @types: types of the PSE controller
118 * @pi: table of PSE PIs described in this controller device
119 * @no_of_pse_pi: flag set if the pse_pis devicetree node is not used
120 */
121struct pse_controller_dev {
122 const struct pse_controller_ops *ops;
123 struct module *owner;
124 struct list_head list;
125 struct list_head pse_control_head;
126 struct device *dev;
127 int of_pse_n_cells;
128 unsigned int nr_lines;
129 struct mutex lock;
130 enum ethtool_pse_types types;
131 struct pse_pi *pi;
132 bool no_of_pse_pi;
133};
134
135#if IS_ENABLED(CONFIG_PSE_CONTROLLER)
136int pse_controller_register(struct pse_controller_dev *pcdev);
137void pse_controller_unregister(struct pse_controller_dev *pcdev);
138struct device;
139int devm_pse_controller_register(struct device *dev,
140 struct pse_controller_dev *pcdev);
141
142struct pse_control *of_pse_control_get(struct device_node *node);
143void pse_control_put(struct pse_control *psec);
144
145int pse_ethtool_get_status(struct pse_control *psec,
146 struct netlink_ext_ack *extack,
147 struct pse_control_status *status);
148int pse_ethtool_set_config(struct pse_control *psec,
149 struct netlink_ext_ack *extack,
150 const struct pse_control_config *config);
151
152bool pse_has_podl(struct pse_control *psec);
153bool pse_has_c33(struct pse_control *psec);
154
155#else
156
157static inline struct pse_control *of_pse_control_get(struct device_node *node)
158{
159 return ERR_PTR(-ENOENT);
160}
161
162static inline void pse_control_put(struct pse_control *psec)
163{
164}
165
166static inline int pse_ethtool_get_status(struct pse_control *psec,
167 struct netlink_ext_ack *extack,
168 struct pse_control_status *status)
169{
170 return -EOPNOTSUPP;
171}
172
173static inline int pse_ethtool_set_config(struct pse_control *psec,
174 struct netlink_ext_ack *extack,
175 const struct pse_control_config *config)
176{
177 return -EOPNOTSUPP;
178}
179
180static inline bool pse_has_podl(struct pse_control *psec)
181{
182 return false;
183}
184
185static inline bool pse_has_c33(struct pse_control *psec)
186{
187 return false;
188}
189
190#endif
191
192#endif