1 // SPDX-License-Identifier: GPL-2.0-only 1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 2 /* 3 // Copyright (c) 2022 Pengutronix, Oleksij Rem 3 // Copyright (c) 2022 Pengutronix, Oleksij Rempel <kernel@pengutronix.de> 4 */ 4 */ 5 #ifndef _LINUX_PSE_CONTROLLER_H 5 #ifndef _LINUX_PSE_CONTROLLER_H 6 #define _LINUX_PSE_CONTROLLER_H 6 #define _LINUX_PSE_CONTROLLER_H 7 7 8 #include <linux/ethtool.h> 8 #include <linux/ethtool.h> 9 #include <linux/list.h> 9 #include <linux/list.h> 10 #include <uapi/linux/ethtool.h> 10 #include <uapi/linux/ethtool.h> 11 11 12 /* Maximum current in uA according to IEEE 802 << 13 #define MAX_PI_CURRENT 1920000 << 14 << 15 struct phy_device; 12 struct phy_device; 16 struct pse_controller_dev; 13 struct pse_controller_dev; 17 14 18 /** 15 /** 19 * struct pse_control_config - PSE control/cha 16 * struct pse_control_config - PSE control/channel configuration. 20 * 17 * 21 * @podl_admin_control: set PoDL PSE admin con !! 18 * @admin_cotrol: set PoDL PSE admin control as described in 22 * IEEE 802.3-2018 30.15.1.2.1 acPoDLPSEA 19 * IEEE 802.3-2018 30.15.1.2.1 acPoDLPSEAdminControl 23 * @c33_admin_control: set PSE admin control a << 24 * IEEE 802.3-2022 30.9.1.2.1 acPSEAdminC << 25 */ 20 */ 26 struct pse_control_config { 21 struct pse_control_config { 27 enum ethtool_podl_pse_admin_state podl !! 22 enum ethtool_podl_pse_admin_state admin_cotrol; 28 enum ethtool_c33_pse_admin_state c33_a << 29 }; 23 }; 30 24 31 /** 25 /** 32 * struct pse_control_status - PSE control/cha 26 * struct pse_control_status - PSE control/channel status. 33 * 27 * 34 * @podl_admin_state: operational state of the 28 * @podl_admin_state: operational state of the PoDL PSE 35 * functions. IEEE 802.3-2018 30.15.1.1.2 29 * functions. IEEE 802.3-2018 30.15.1.1.2 aPoDLPSEAdminState 36 * @podl_pw_status: power detection status of 30 * @podl_pw_status: power detection status of the PoDL PSE. 37 * IEEE 802.3-2018 30.15.1.1.3 aPoDLPSEPo 31 * IEEE 802.3-2018 30.15.1.1.3 aPoDLPSEPowerDetectionStatus: 38 * @c33_admin_state: operational state of the << 39 * functions. IEEE 802.3-2022 30.9.1.1.2 << 40 * @c33_pw_status: power detection status of t << 41 * IEEE 802.3-2022 30.9.1.1.5 aPSEPowerDe << 42 * @c33_pw_class: detected class of a powered << 43 * IEEE 802.3-2022 30.9.1.1.8 aPSEPowerCl << 44 * @c33_actual_pw: power currently delivered b << 45 * IEEE 802.3-2022 30.9.1.1.23 aPSEActual << 46 * @c33_ext_state_info: extended state informa << 47 * @c33_avail_pw_limit: available power limit << 48 * IEEE 802.3-2022 145.2.5.4 pse_avail_pw << 49 * @c33_pw_limit_ranges: supported power limit << 50 * is in charge of the memory allocation. << 51 * @c33_pw_limit_nb_ranges: number of supporte << 52 * ranges << 53 */ 32 */ 54 struct pse_control_status { 33 struct pse_control_status { 55 enum ethtool_podl_pse_admin_state podl 34 enum ethtool_podl_pse_admin_state podl_admin_state; 56 enum ethtool_podl_pse_pw_d_status podl 35 enum ethtool_podl_pse_pw_d_status podl_pw_status; 57 enum ethtool_c33_pse_admin_state c33_a << 58 enum ethtool_c33_pse_pw_d_status c33_p << 59 u32 c33_pw_class; << 60 u32 c33_actual_pw; << 61 struct ethtool_c33_pse_ext_state_info << 62 u32 c33_avail_pw_limit; << 63 struct ethtool_c33_pse_pw_limit_range << 64 u32 c33_pw_limit_nb_ranges; << 65 }; 36 }; 66 37 67 /** 38 /** 68 * struct pse_controller_ops - PSE controller 39 * struct pse_controller_ops - PSE controller driver callbacks 69 * 40 * 70 * @ethtool_get_status: get PSE control status 41 * @ethtool_get_status: get PSE control status for ethtool interface 71 * @setup_pi_matrix: setup PI matrix of the PS !! 42 * @ethtool_set_config: set PSE control configuration over ethtool interface 72 * @pi_is_enabled: Return 1 if the PSE PI is e << 73 * May also return negative er << 74 * @pi_enable: Configure the PSE PI as enabled << 75 * @pi_disable: Configure the PSE PI as disabl << 76 * @pi_get_voltage: Return voltage similarly t << 77 * callback. << 78 * @pi_get_current_limit: Get the configured c << 79 * get_current_limit re << 80 * @pi_set_current_limit: Configure the curren << 81 * set_current_limit re << 82 * Should not return an << 83 * current value set. << 84 */ 43 */ 85 struct pse_controller_ops { 44 struct pse_controller_ops { 86 int (*ethtool_get_status)(struct pse_c 45 int (*ethtool_get_status)(struct pse_controller_dev *pcdev, 87 unsigned long id, struct netli 46 unsigned long id, struct netlink_ext_ack *extack, 88 struct pse_control_status *sta 47 struct pse_control_status *status); 89 int (*setup_pi_matrix)(struct pse_cont !! 48 int (*ethtool_set_config)(struct pse_controller_dev *pcdev, 90 int (*pi_is_enabled)(struct pse_contro !! 49 unsigned long id, struct netlink_ext_ack *extack, 91 int (*pi_enable)(struct pse_controller !! 50 const struct pse_control_config *config); 92 int (*pi_disable)(struct pse_controlle << 93 int (*pi_get_voltage)(struct pse_contr << 94 int (*pi_get_current_limit)(struct pse << 95 int id); << 96 int (*pi_set_current_limit)(struct pse << 97 int id, in << 98 }; 51 }; 99 52 100 struct module; 53 struct module; 101 struct device_node; 54 struct device_node; 102 struct of_phandle_args; 55 struct of_phandle_args; 103 struct pse_control; 56 struct pse_control; 104 57 105 /* PSE PI pairset pinout can either be Alterna << 106 enum pse_pi_pairset_pinout { << 107 ALTERNATIVE_A, << 108 ALTERNATIVE_B, << 109 }; << 110 << 111 /** << 112 * struct pse_pi_pairset - PSE PI pairset enti << 113 * alternative ant its << 114 * << 115 * @pinout: description of the pinout alternat << 116 * @np: device node pointer describing the pai << 117 */ << 118 struct pse_pi_pairset { << 119 enum pse_pi_pairset_pinout pinout; << 120 struct device_node *np; << 121 }; << 122 << 123 /** << 124 * struct pse_pi - PSE PI (Power Interface) en << 125 * IEEE 802.3-2022 145.2.4 << 126 * << 127 * @pairset: table of the PSE PI pinout altern << 128 * @np: device node pointer of the PSE PI node << 129 * @rdev: regulator represented by the PSE PI << 130 * @admin_state_enabled: PI enabled state << 131 */ << 132 struct pse_pi { << 133 struct pse_pi_pairset pairset[2]; << 134 struct device_node *np; << 135 struct regulator_dev *rdev; << 136 bool admin_state_enabled; << 137 }; << 138 << 139 /** 58 /** 140 * struct pse_controller_dev - PSE controller 59 * struct pse_controller_dev - PSE controller entity that might 141 * provide multipl 60 * provide multiple PSE controls 142 * @ops: a pointer to device specific struct p 61 * @ops: a pointer to device specific struct pse_controller_ops 143 * @owner: kernel module of the PSE controller 62 * @owner: kernel module of the PSE controller driver 144 * @list: internal list of PSE controller devi 63 * @list: internal list of PSE controller devices 145 * @pse_control_head: head of internal list of 64 * @pse_control_head: head of internal list of requested PSE controls 146 * @dev: corresponding driver model device str 65 * @dev: corresponding driver model device struct 147 * @of_pse_n_cells: number of cells in PSE lin 66 * @of_pse_n_cells: number of cells in PSE line specifiers >> 67 * @of_xlate: translation function to translate from specifier as found in the >> 68 * device tree to id as given to the PSE control ops 148 * @nr_lines: number of PSE controls in this c 69 * @nr_lines: number of PSE controls in this controller device 149 * @lock: Mutex for serialization access to th 70 * @lock: Mutex for serialization access to the PSE controller 150 * @types: types of the PSE controller << 151 * @pi: table of PSE PIs described in this con << 152 * @no_of_pse_pi: flag set if the pse_pis devi << 153 */ 71 */ 154 struct pse_controller_dev { 72 struct pse_controller_dev { 155 const struct pse_controller_ops *ops; 73 const struct pse_controller_ops *ops; 156 struct module *owner; 74 struct module *owner; 157 struct list_head list; 75 struct list_head list; 158 struct list_head pse_control_head; 76 struct list_head pse_control_head; 159 struct device *dev; 77 struct device *dev; 160 int of_pse_n_cells; 78 int of_pse_n_cells; >> 79 int (*of_xlate)(struct pse_controller_dev *pcdev, >> 80 const struct of_phandle_args *pse_spec); 161 unsigned int nr_lines; 81 unsigned int nr_lines; 162 struct mutex lock; 82 struct mutex lock; 163 enum ethtool_pse_types types; << 164 struct pse_pi *pi; << 165 bool no_of_pse_pi; << 166 }; 83 }; 167 84 168 #if IS_ENABLED(CONFIG_PSE_CONTROLLER) 85 #if IS_ENABLED(CONFIG_PSE_CONTROLLER) 169 int pse_controller_register(struct pse_control 86 int pse_controller_register(struct pse_controller_dev *pcdev); 170 void pse_controller_unregister(struct pse_cont 87 void pse_controller_unregister(struct pse_controller_dev *pcdev); 171 struct device; 88 struct device; 172 int devm_pse_controller_register(struct device 89 int devm_pse_controller_register(struct device *dev, 173 struct pse_co 90 struct pse_controller_dev *pcdev); 174 91 175 struct pse_control *of_pse_control_get(struct 92 struct pse_control *of_pse_control_get(struct device_node *node); 176 void pse_control_put(struct pse_control *psec) 93 void pse_control_put(struct pse_control *psec); 177 94 178 int pse_ethtool_get_status(struct pse_control 95 int pse_ethtool_get_status(struct pse_control *psec, 179 struct netlink_ext_ 96 struct netlink_ext_ack *extack, 180 struct pse_control_ 97 struct pse_control_status *status); 181 int pse_ethtool_set_config(struct pse_control 98 int pse_ethtool_set_config(struct pse_control *psec, 182 struct netlink_ext_ 99 struct netlink_ext_ack *extack, 183 const struct pse_co 100 const struct pse_control_config *config); 184 int pse_ethtool_set_pw_limit(struct pse_contro << 185 struct netlink_ex << 186 const unsigned in << 187 int pse_ethtool_get_pw_limit(struct pse_contro << 188 struct netlink_ex << 189 << 190 bool pse_has_podl(struct pse_control *psec); << 191 bool pse_has_c33(struct pse_control *psec); << 192 101 193 #else 102 #else 194 103 195 static inline struct pse_control *of_pse_contr 104 static inline struct pse_control *of_pse_control_get(struct device_node *node) 196 { 105 { 197 return ERR_PTR(-ENOENT); 106 return ERR_PTR(-ENOENT); 198 } 107 } 199 108 200 static inline void pse_control_put(struct pse_ 109 static inline void pse_control_put(struct pse_control *psec) 201 { 110 { 202 } 111 } 203 112 204 static inline int pse_ethtool_get_status(struc 113 static inline int pse_ethtool_get_status(struct pse_control *psec, 205 struc 114 struct netlink_ext_ack *extack, 206 struc 115 struct pse_control_status *status) 207 { 116 { 208 return -EOPNOTSUPP; !! 117 return -ENOTSUPP; 209 } 118 } 210 119 211 static inline int pse_ethtool_set_config(struc 120 static inline int pse_ethtool_set_config(struct pse_control *psec, 212 struc 121 struct netlink_ext_ack *extack, 213 const 122 const struct pse_control_config *config) 214 { 123 { 215 return -EOPNOTSUPP; !! 124 return -ENOTSUPP; 216 } << 217 << 218 static inline int pse_ethtool_set_pw_limit(str << 219 str << 220 con << 221 { << 222 return -EOPNOTSUPP; << 223 } << 224 << 225 static inline int pse_ethtool_get_pw_limit(str << 226 str << 227 { << 228 return -EOPNOTSUPP; << 229 } << 230 << 231 static inline bool pse_has_podl(struct pse_con << 232 { << 233 return false; << 234 } << 235 << 236 static inline bool pse_has_c33(struct pse_cont << 237 { << 238 return false; << 239 } 125 } 240 126 241 #endif 127 #endif 242 128 243 #endif 129 #endif 244 130
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.