1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * phy.h -- generic phy header file 4 * 5 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com 6 * 7 * Author: Kishon Vijay Abraham I <[email protected]> 8 */ 9 10 #ifndef __DRIVERS_PHY_H 11 #define __DRIVERS_PHY_H 12 13 #include <linux/err.h> 14 #include <linux/of.h> 15 #include <linux/device.h> 16 #include <linux/pm_runtime.h> 17 #include <linux/regulator/consumer.h> 18 19 #include <linux/phy/phy-dp.h> 20 #include <linux/phy/phy-lvds.h> 21 #include <linux/phy/phy-mipi-dphy.h> 22 23 struct phy; 24 25 enum phy_mode { 26 PHY_MODE_INVALID, 27 PHY_MODE_USB_HOST, 28 PHY_MODE_USB_HOST_LS, 29 PHY_MODE_USB_HOST_FS, 30 PHY_MODE_USB_HOST_HS, 31 PHY_MODE_USB_HOST_SS, 32 PHY_MODE_USB_DEVICE, 33 PHY_MODE_USB_DEVICE_LS, 34 PHY_MODE_USB_DEVICE_FS, 35 PHY_MODE_USB_DEVICE_HS, 36 PHY_MODE_USB_DEVICE_SS, 37 PHY_MODE_USB_OTG, 38 PHY_MODE_UFS_HS_A, 39 PHY_MODE_UFS_HS_B, 40 PHY_MODE_PCIE, 41 PHY_MODE_ETHERNET, 42 PHY_MODE_MIPI_DPHY, 43 PHY_MODE_SATA, 44 PHY_MODE_LVDS, 45 PHY_MODE_DP 46 }; 47 48 enum phy_media { 49 PHY_MEDIA_DEFAULT, 50 PHY_MEDIA_SR, 51 PHY_MEDIA_DAC, 52 }; 53 54 /** 55 * union phy_configure_opts - Opaque generic phy configuration 56 * 57 * @mipi_dphy: Configuration set applicable for phys supporting 58 * the MIPI_DPHY phy mode. 59 * @dp: Configuration set applicable for phys supporting 60 * the DisplayPort protocol. 61 * @lvds: Configuration set applicable for phys supporting 62 * the LVDS phy mode. 63 */ 64 union phy_configure_opts { 65 struct phy_configure_opts_mipi_dphy mipi_dphy; 66 struct phy_configure_opts_dp dp; 67 struct phy_configure_opts_lvds lvds; 68 }; 69 70 /** 71 * struct phy_ops - set of function pointers for performing phy operations 72 * @init: operation to be performed for initializing phy 73 * @exit: operation to be performed while exiting 74 * @power_on: powering on the phy 75 * @power_off: powering off the phy 76 * @set_mode: set the mode of the phy 77 * @set_media: set the media type of the phy (optional) 78 * @set_speed: set the speed of the phy (optional) 79 * @reset: resetting the phy 80 * @calibrate: calibrate the phy 81 * @release: ops to be performed while the consumer relinquishes the PHY 82 * @owner: the module owner containing the ops 83 */ 84 struct phy_ops { 85 int (*init)(struct phy *phy); 86 int (*exit)(struct phy *phy); 87 int (*power_on)(struct phy *phy); 88 int (*power_off)(struct phy *phy); 89 int (*set_mode)(struct phy *phy, enum phy_mode mode, int submode); 90 int (*set_media)(struct phy *phy, enum phy_media media); 91 int (*set_speed)(struct phy *phy, int speed); 92 93 /** 94 * @configure: 95 * 96 * Optional. 97 * 98 * Used to change the PHY parameters. phy_init() must have 99 * been called on the phy. 100 * 101 * Returns: 0 if successful, an negative error code otherwise 102 */ 103 int (*configure)(struct phy *phy, union phy_configure_opts *opts); 104 105 /** 106 * @validate: 107 * 108 * Optional. 109 * 110 * Used to check that the current set of parameters can be 111 * handled by the phy. Implementations are free to tune the 112 * parameters passed as arguments if needed by some 113 * implementation detail or constraints. It must not change 114 * any actual configuration of the PHY, so calling it as many 115 * times as deemed fit by the consumer must have no side 116 * effect. 117 * 118 * Returns: 0 if the configuration can be applied, an negative 119 * error code otherwise 120 */ 121 int (*validate)(struct phy *phy, enum phy_mode mode, int submode, 122 union phy_configure_opts *opts); 123 int (*reset)(struct phy *phy); 124 int (*calibrate)(struct phy *phy); 125 void (*release)(struct phy *phy); 126 struct module *owner; 127 }; 128 129 /** 130 * struct phy_attrs - represents phy attributes 131 * @bus_width: Data path width implemented by PHY 132 * @max_link_rate: Maximum link rate supported by PHY (units to be decided by producer and consumer) 133 * @mode: PHY mode 134 */ 135 struct phy_attrs { 136 u32 bus_width; 137 u32 max_link_rate; 138 enum phy_mode mode; 139 }; 140 141 /** 142 * struct phy - represents the phy device 143 * @dev: phy device 144 * @id: id of the phy device 145 * @ops: function pointers for performing phy operations 146 * @mutex: mutex to protect phy_ops 147 * @init_count: used to protect when the PHY is used by multiple consumers 148 * @power_count: used to protect when the PHY is used by multiple consumers 149 * @attrs: used to specify PHY specific attributes 150 * @pwr: power regulator associated with the phy 151 */ 152 struct phy { 153 struct device dev; 154 int id; 155 const struct phy_ops *ops; 156 struct mutex mutex; 157 int init_count; 158 int power_count; 159 struct phy_attrs attrs; 160 struct regulator *pwr; 161 }; 162 163 /** 164 * struct phy_provider - represents the phy provider 165 * @dev: phy provider device 166 * @children: can be used to override the default (dev->of_node) child node 167 * @owner: the module owner having of_xlate 168 * @list: to maintain a linked list of PHY providers 169 * @of_xlate: function pointer to obtain phy instance from phy pointer 170 */ 171 struct phy_provider { 172 struct device *dev; 173 struct device_node *children; 174 struct module *owner; 175 struct list_head list; 176 struct phy * (*of_xlate)(struct device *dev, 177 struct of_phandle_args *args); 178 }; 179 180 /** 181 * struct phy_lookup - PHY association in list of phys managed by the phy driver 182 * @node: list node 183 * @dev_id: the device of the association 184 * @con_id: connection ID string on device 185 * @phy: the phy of the association 186 */ 187 struct phy_lookup { 188 struct list_head node; 189 const char *dev_id; 190 const char *con_id; 191 struct phy *phy; 192 }; 193 194 #define to_phy(a) (container_of((a), struct phy, dev)) 195 196 #define of_phy_provider_register(dev, xlate) \ 197 __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) 198 199 #define devm_of_phy_provider_register(dev, xlate) \ 200 __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) 201 202 #define of_phy_provider_register_full(dev, children, xlate) \ 203 __of_phy_provider_register(dev, children, THIS_MODULE, xlate) 204 205 #define devm_of_phy_provider_register_full(dev, children, xlate) \ 206 __devm_of_phy_provider_register(dev, children, THIS_MODULE, xlate) 207 208 static inline void phy_set_drvdata(struct phy *phy, void *data) 209 { 210 dev_set_drvdata(&phy->dev, data); 211 } 212 213 static inline void *phy_get_drvdata(struct phy *phy) 214 { 215 return dev_get_drvdata(&phy->dev); 216 } 217 218 #if IS_ENABLED(CONFIG_GENERIC_PHY) 219 int phy_pm_runtime_get(struct phy *phy); 220 int phy_pm_runtime_get_sync(struct phy *phy); 221 int phy_pm_runtime_put(struct phy *phy); 222 int phy_pm_runtime_put_sync(struct phy *phy); 223 void phy_pm_runtime_allow(struct phy *phy); 224 void phy_pm_runtime_forbid(struct phy *phy); 225 int phy_init(struct phy *phy); 226 int phy_exit(struct phy *phy); 227 int phy_power_on(struct phy *phy); 228 int phy_power_off(struct phy *phy); 229 int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode); 230 #define phy_set_mode(phy, mode) \ 231 phy_set_mode_ext(phy, mode, 0) 232 int phy_set_media(struct phy *phy, enum phy_media media); 233 int phy_set_speed(struct phy *phy, int speed); 234 int phy_configure(struct phy *phy, union phy_configure_opts *opts); 235 int phy_validate(struct phy *phy, enum phy_mode mode, int submode, 236 union phy_configure_opts *opts); 237 238 static inline enum phy_mode phy_get_mode(struct phy *phy) 239 { 240 return phy->attrs.mode; 241 } 242 int phy_reset(struct phy *phy); 243 int phy_calibrate(struct phy *phy); 244 static inline int phy_get_bus_width(struct phy *phy) 245 { 246 return phy->attrs.bus_width; 247 } 248 static inline void phy_set_bus_width(struct phy *phy, int bus_width) 249 { 250 phy->attrs.bus_width = bus_width; 251 } 252 struct phy *phy_get(struct device *dev, const char *string); 253 struct phy *devm_phy_get(struct device *dev, const char *string); 254 struct phy *devm_phy_optional_get(struct device *dev, const char *string); 255 struct phy *devm_of_phy_get(struct device *dev, struct device_node *np, 256 const char *con_id); 257 struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np, 258 int index); 259 void of_phy_put(struct phy *phy); 260 void phy_put(struct device *dev, struct phy *phy); 261 void devm_phy_put(struct device *dev, struct phy *phy); 262 struct phy *of_phy_get(struct device_node *np, const char *con_id); 263 struct phy *of_phy_simple_xlate(struct device *dev, 264 struct of_phandle_args *args); 265 struct phy *phy_create(struct device *dev, struct device_node *node, 266 const struct phy_ops *ops); 267 struct phy *devm_phy_create(struct device *dev, struct device_node *node, 268 const struct phy_ops *ops); 269 void phy_destroy(struct phy *phy); 270 void devm_phy_destroy(struct device *dev, struct phy *phy); 271 struct phy_provider *__of_phy_provider_register(struct device *dev, 272 struct device_node *children, struct module *owner, 273 struct phy * (*of_xlate)(struct device *dev, 274 struct of_phandle_args *args)); 275 struct phy_provider *__devm_of_phy_provider_register(struct device *dev, 276 struct device_node *children, struct module *owner, 277 struct phy * (*of_xlate)(struct device *dev, 278 struct of_phandle_args *args)); 279 void of_phy_provider_unregister(struct phy_provider *phy_provider); 280 void devm_of_phy_provider_unregister(struct device *dev, 281 struct phy_provider *phy_provider); 282 int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id); 283 void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id); 284 #else 285 static inline int phy_pm_runtime_get(struct phy *phy) 286 { 287 if (!phy) 288 return 0; 289 return -ENOSYS; 290 } 291 292 static inline int phy_pm_runtime_get_sync(struct phy *phy) 293 { 294 if (!phy) 295 return 0; 296 return -ENOSYS; 297 } 298 299 static inline int phy_pm_runtime_put(struct phy *phy) 300 { 301 if (!phy) 302 return 0; 303 return -ENOSYS; 304 } 305 306 static inline int phy_pm_runtime_put_sync(struct phy *phy) 307 { 308 if (!phy) 309 return 0; 310 return -ENOSYS; 311 } 312 313 static inline void phy_pm_runtime_allow(struct phy *phy) 314 { 315 return; 316 } 317 318 static inline void phy_pm_runtime_forbid(struct phy *phy) 319 { 320 return; 321 } 322 323 static inline int phy_init(struct phy *phy) 324 { 325 if (!phy) 326 return 0; 327 return -ENOSYS; 328 } 329 330 static inline int phy_exit(struct phy *phy) 331 { 332 if (!phy) 333 return 0; 334 return -ENOSYS; 335 } 336 337 static inline int phy_power_on(struct phy *phy) 338 { 339 if (!phy) 340 return 0; 341 return -ENOSYS; 342 } 343 344 static inline int phy_power_off(struct phy *phy) 345 { 346 if (!phy) 347 return 0; 348 return -ENOSYS; 349 } 350 351 static inline int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, 352 int submode) 353 { 354 if (!phy) 355 return 0; 356 return -ENOSYS; 357 } 358 359 #define phy_set_mode(phy, mode) \ 360 phy_set_mode_ext(phy, mode, 0) 361 362 static inline int phy_set_media(struct phy *phy, enum phy_media media) 363 { 364 if (!phy) 365 return 0; 366 return -ENODEV; 367 } 368 369 static inline int phy_set_speed(struct phy *phy, int speed) 370 { 371 if (!phy) 372 return 0; 373 return -ENODEV; 374 } 375 376 static inline enum phy_mode phy_get_mode(struct phy *phy) 377 { 378 return PHY_MODE_INVALID; 379 } 380 381 static inline int phy_reset(struct phy *phy) 382 { 383 if (!phy) 384 return 0; 385 return -ENOSYS; 386 } 387 388 static inline int phy_calibrate(struct phy *phy) 389 { 390 if (!phy) 391 return 0; 392 return -ENOSYS; 393 } 394 395 static inline int phy_configure(struct phy *phy, 396 union phy_configure_opts *opts) 397 { 398 if (!phy) 399 return 0; 400 401 return -ENOSYS; 402 } 403 404 static inline int phy_validate(struct phy *phy, enum phy_mode mode, int submode, 405 union phy_configure_opts *opts) 406 { 407 if (!phy) 408 return 0; 409 410 return -ENOSYS; 411 } 412 413 static inline int phy_get_bus_width(struct phy *phy) 414 { 415 return -ENOSYS; 416 } 417 418 static inline void phy_set_bus_width(struct phy *phy, int bus_width) 419 { 420 return; 421 } 422 423 static inline struct phy *phy_get(struct device *dev, const char *string) 424 { 425 return ERR_PTR(-ENOSYS); 426 } 427 428 static inline struct phy *devm_phy_get(struct device *dev, const char *string) 429 { 430 return ERR_PTR(-ENOSYS); 431 } 432 433 static inline struct phy *devm_phy_optional_get(struct device *dev, 434 const char *string) 435 { 436 return NULL; 437 } 438 439 static inline struct phy *devm_of_phy_get(struct device *dev, 440 struct device_node *np, 441 const char *con_id) 442 { 443 return ERR_PTR(-ENOSYS); 444 } 445 446 static inline struct phy *devm_of_phy_get_by_index(struct device *dev, 447 struct device_node *np, 448 int index) 449 { 450 return ERR_PTR(-ENOSYS); 451 } 452 453 static inline void of_phy_put(struct phy *phy) 454 { 455 } 456 457 static inline void phy_put(struct device *dev, struct phy *phy) 458 { 459 } 460 461 static inline void devm_phy_put(struct device *dev, struct phy *phy) 462 { 463 } 464 465 static inline struct phy *of_phy_get(struct device_node *np, const char *con_id) 466 { 467 return ERR_PTR(-ENOSYS); 468 } 469 470 static inline struct phy *of_phy_simple_xlate(struct device *dev, 471 struct of_phandle_args *args) 472 { 473 return ERR_PTR(-ENOSYS); 474 } 475 476 static inline struct phy *phy_create(struct device *dev, 477 struct device_node *node, 478 const struct phy_ops *ops) 479 { 480 return ERR_PTR(-ENOSYS); 481 } 482 483 static inline struct phy *devm_phy_create(struct device *dev, 484 struct device_node *node, 485 const struct phy_ops *ops) 486 { 487 return ERR_PTR(-ENOSYS); 488 } 489 490 static inline void phy_destroy(struct phy *phy) 491 { 492 } 493 494 static inline void devm_phy_destroy(struct device *dev, struct phy *phy) 495 { 496 } 497 498 static inline struct phy_provider *__of_phy_provider_register( 499 struct device *dev, struct device_node *children, struct module *owner, 500 struct phy * (*of_xlate)(struct device *dev, 501 struct of_phandle_args *args)) 502 { 503 return ERR_PTR(-ENOSYS); 504 } 505 506 static inline struct phy_provider *__devm_of_phy_provider_register(struct device 507 *dev, struct device_node *children, struct module *owner, 508 struct phy * (*of_xlate)(struct device *dev, 509 struct of_phandle_args *args)) 510 { 511 return ERR_PTR(-ENOSYS); 512 } 513 514 static inline void of_phy_provider_unregister(struct phy_provider *phy_provider) 515 { 516 } 517 518 static inline void devm_of_phy_provider_unregister(struct device *dev, 519 struct phy_provider *phy_provider) 520 { 521 } 522 static inline int 523 phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id) 524 { 525 return 0; 526 } 527 static inline void phy_remove_lookup(struct phy *phy, const char *con_id, 528 const char *dev_id) { } 529 #endif 530 531 #endif /* __DRIVERS_PHY_H */ 532