1 /* 2 * phy.h -- generic phy header file 3 * 4 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com 5 * 6 * Author: Kishon Vijay Abraham I <[email protected]> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 */ 13 14 #ifndef __DRIVERS_PHY_H 15 #define __DRIVERS_PHY_H 16 17 #include <linux/err.h> 18 #include <linux/of.h> 19 #include <linux/device.h> 20 #include <linux/pm_runtime.h> 21 #include <linux/regulator/consumer.h> 22 23 struct phy; 24 25 /** 26 * struct phy_ops - set of function pointers for performing phy operations 27 * @init: operation to be performed for initializing phy 28 * @exit: operation to be performed while exiting 29 * @power_on: powering on the phy 30 * @power_off: powering off the phy 31 * @owner: the module owner containing the ops 32 */ 33 struct phy_ops { 34 int (*init)(struct phy *phy); 35 int (*exit)(struct phy *phy); 36 int (*power_on)(struct phy *phy); 37 int (*power_off)(struct phy *phy); 38 struct module *owner; 39 }; 40 41 /** 42 * struct phy_attrs - represents phy attributes 43 * @bus_width: Data path width implemented by PHY 44 */ 45 struct phy_attrs { 46 u32 bus_width; 47 }; 48 49 /** 50 * struct phy - represents the phy device 51 * @dev: phy device 52 * @id: id of the phy device 53 * @ops: function pointers for performing phy operations 54 * @init_data: list of PHY consumers (non-dt only) 55 * @mutex: mutex to protect phy_ops 56 * @init_count: used to protect when the PHY is used by multiple consumers 57 * @power_count: used to protect when the PHY is used by multiple consumers 58 * @phy_attrs: used to specify PHY specific attributes 59 */ 60 struct phy { 61 struct device dev; 62 int id; 63 const struct phy_ops *ops; 64 struct mutex mutex; 65 int init_count; 66 int power_count; 67 struct phy_attrs attrs; 68 struct regulator *pwr; 69 }; 70 71 /** 72 * struct phy_provider - represents the phy provider 73 * @dev: phy provider device 74 * @owner: the module owner having of_xlate 75 * @of_xlate: function pointer to obtain phy instance from phy pointer 76 * @list: to maintain a linked list of PHY providers 77 */ 78 struct phy_provider { 79 struct device *dev; 80 struct device_node *children; 81 struct module *owner; 82 struct list_head list; 83 struct phy * (*of_xlate)(struct device *dev, 84 struct of_phandle_args *args); 85 }; 86 87 struct phy_lookup { 88 struct list_head node; 89 const char *dev_id; 90 const char *con_id; 91 struct phy *phy; 92 }; 93 94 #define to_phy(a) (container_of((a), struct phy, dev)) 95 96 #define of_phy_provider_register(dev, xlate) \ 97 __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) 98 99 #define devm_of_phy_provider_register(dev, xlate) \ 100 __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) 101 102 #define of_phy_provider_register_full(dev, children, xlate) \ 103 __of_phy_provider_register(dev, children, THIS_MODULE, xlate) 104 105 #define devm_of_phy_provider_register_full(dev, children, xlate) \ 106 __devm_of_phy_provider_register(dev, children, THIS_MODULE, xlate) 107 108 static inline void phy_set_drvdata(struct phy *phy, void *data) 109 { 110 dev_set_drvdata(&phy->dev, data); 111 } 112 113 static inline void *phy_get_drvdata(struct phy *phy) 114 { 115 return dev_get_drvdata(&phy->dev); 116 } 117 118 #if IS_ENABLED(CONFIG_GENERIC_PHY) 119 int phy_pm_runtime_get(struct phy *phy); 120 int phy_pm_runtime_get_sync(struct phy *phy); 121 int phy_pm_runtime_put(struct phy *phy); 122 int phy_pm_runtime_put_sync(struct phy *phy); 123 void phy_pm_runtime_allow(struct phy *phy); 124 void phy_pm_runtime_forbid(struct phy *phy); 125 int phy_init(struct phy *phy); 126 int phy_exit(struct phy *phy); 127 int phy_power_on(struct phy *phy); 128 int phy_power_off(struct phy *phy); 129 static inline int phy_get_bus_width(struct phy *phy) 130 { 131 return phy->attrs.bus_width; 132 } 133 static inline void phy_set_bus_width(struct phy *phy, int bus_width) 134 { 135 phy->attrs.bus_width = bus_width; 136 } 137 struct phy *phy_get(struct device *dev, const char *string); 138 struct phy *phy_optional_get(struct device *dev, const char *string); 139 struct phy *devm_phy_get(struct device *dev, const char *string); 140 struct phy *devm_phy_optional_get(struct device *dev, const char *string); 141 struct phy *devm_of_phy_get(struct device *dev, struct device_node *np, 142 const char *con_id); 143 struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np, 144 int index); 145 void phy_put(struct phy *phy); 146 void devm_phy_put(struct device *dev, struct phy *phy); 147 struct phy *of_phy_get(struct device_node *np, const char *con_id); 148 struct phy *of_phy_simple_xlate(struct device *dev, 149 struct of_phandle_args *args); 150 struct phy *phy_create(struct device *dev, struct device_node *node, 151 const struct phy_ops *ops); 152 struct phy *devm_phy_create(struct device *dev, struct device_node *node, 153 const struct phy_ops *ops); 154 void phy_destroy(struct phy *phy); 155 void devm_phy_destroy(struct device *dev, struct phy *phy); 156 struct phy_provider *__of_phy_provider_register(struct device *dev, 157 struct device_node *children, struct module *owner, 158 struct phy * (*of_xlate)(struct device *dev, 159 struct of_phandle_args *args)); 160 struct phy_provider *__devm_of_phy_provider_register(struct device *dev, 161 struct device_node *children, struct module *owner, 162 struct phy * (*of_xlate)(struct device *dev, 163 struct of_phandle_args *args)); 164 void of_phy_provider_unregister(struct phy_provider *phy_provider); 165 void devm_of_phy_provider_unregister(struct device *dev, 166 struct phy_provider *phy_provider); 167 int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id); 168 void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id); 169 #else 170 static inline int phy_pm_runtime_get(struct phy *phy) 171 { 172 if (!phy) 173 return 0; 174 return -ENOSYS; 175 } 176 177 static inline int phy_pm_runtime_get_sync(struct phy *phy) 178 { 179 if (!phy) 180 return 0; 181 return -ENOSYS; 182 } 183 184 static inline int phy_pm_runtime_put(struct phy *phy) 185 { 186 if (!phy) 187 return 0; 188 return -ENOSYS; 189 } 190 191 static inline int phy_pm_runtime_put_sync(struct phy *phy) 192 { 193 if (!phy) 194 return 0; 195 return -ENOSYS; 196 } 197 198 static inline void phy_pm_runtime_allow(struct phy *phy) 199 { 200 return; 201 } 202 203 static inline void phy_pm_runtime_forbid(struct phy *phy) 204 { 205 return; 206 } 207 208 static inline int phy_init(struct phy *phy) 209 { 210 if (!phy) 211 return 0; 212 return -ENOSYS; 213 } 214 215 static inline int phy_exit(struct phy *phy) 216 { 217 if (!phy) 218 return 0; 219 return -ENOSYS; 220 } 221 222 static inline int phy_power_on(struct phy *phy) 223 { 224 if (!phy) 225 return 0; 226 return -ENOSYS; 227 } 228 229 static inline int phy_power_off(struct phy *phy) 230 { 231 if (!phy) 232 return 0; 233 return -ENOSYS; 234 } 235 236 static inline int phy_get_bus_width(struct phy *phy) 237 { 238 return -ENOSYS; 239 } 240 241 static inline void phy_set_bus_width(struct phy *phy, int bus_width) 242 { 243 return; 244 } 245 246 static inline struct phy *phy_get(struct device *dev, const char *string) 247 { 248 return ERR_PTR(-ENOSYS); 249 } 250 251 static inline struct phy *phy_optional_get(struct device *dev, 252 const char *string) 253 { 254 return ERR_PTR(-ENOSYS); 255 } 256 257 static inline struct phy *devm_phy_get(struct device *dev, const char *string) 258 { 259 return ERR_PTR(-ENOSYS); 260 } 261 262 static inline struct phy *devm_phy_optional_get(struct device *dev, 263 const char *string) 264 { 265 return ERR_PTR(-ENOSYS); 266 } 267 268 static inline struct phy *devm_of_phy_get(struct device *dev, 269 struct device_node *np, 270 const char *con_id) 271 { 272 return ERR_PTR(-ENOSYS); 273 } 274 275 static inline struct phy *devm_of_phy_get_by_index(struct device *dev, 276 struct device_node *np, 277 int index) 278 { 279 return ERR_PTR(-ENOSYS); 280 } 281 282 static inline void phy_put(struct phy *phy) 283 { 284 } 285 286 static inline void devm_phy_put(struct device *dev, struct phy *phy) 287 { 288 } 289 290 static inline struct phy *of_phy_get(struct device_node *np, const char *con_id) 291 { 292 return ERR_PTR(-ENOSYS); 293 } 294 295 static inline struct phy *of_phy_simple_xlate(struct device *dev, 296 struct of_phandle_args *args) 297 { 298 return ERR_PTR(-ENOSYS); 299 } 300 301 static inline struct phy *phy_create(struct device *dev, 302 struct device_node *node, 303 const struct phy_ops *ops) 304 { 305 return ERR_PTR(-ENOSYS); 306 } 307 308 static inline struct phy *devm_phy_create(struct device *dev, 309 struct device_node *node, 310 const struct phy_ops *ops) 311 { 312 return ERR_PTR(-ENOSYS); 313 } 314 315 static inline void phy_destroy(struct phy *phy) 316 { 317 } 318 319 static inline void devm_phy_destroy(struct device *dev, struct phy *phy) 320 { 321 } 322 323 static inline struct phy_provider *__of_phy_provider_register( 324 struct device *dev, struct device_node *children, struct module *owner, 325 struct phy * (*of_xlate)(struct device *dev, 326 struct of_phandle_args *args)) 327 { 328 return ERR_PTR(-ENOSYS); 329 } 330 331 static inline struct phy_provider *__devm_of_phy_provider_register(struct device 332 *dev, struct device_node *children, struct module *owner, 333 struct phy * (*of_xlate)(struct device *dev, 334 struct of_phandle_args *args)) 335 { 336 return ERR_PTR(-ENOSYS); 337 } 338 339 static inline void of_phy_provider_unregister(struct phy_provider *phy_provider) 340 { 341 } 342 343 static inline void devm_of_phy_provider_unregister(struct device *dev, 344 struct phy_provider *phy_provider) 345 { 346 } 347 static inline int 348 phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id) 349 { 350 return 0; 351 } 352 static inline void phy_remove_lookup(struct phy *phy, const char *con_id, 353 const char *dev_id) { } 354 #endif 355 356 #endif /* __DRIVERS_PHY_H */ 357