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 <kishon@ti.com> 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 126 /* notify phy connect status change */ 127 int (*connect)(struct phy *phy, int port); 128 int (*disconnect)(struct phy *phy, int port); 129 130 void (*release)(struct phy *phy); 131 struct module *owner; 132 }; 133 134 /** 135 * struct phy_attrs - represents phy attributes 136 * @bus_width: Data path width implemented by PHY 137 * @max_link_rate: Maximum link rate supported by PHY (units to be decided by producer and consumer) 138 * @mode: PHY mode 139 */ 140 struct phy_attrs { 141 u32 bus_width; 142 u32 max_link_rate; 143 enum phy_mode mode; 144 }; 145 146 /** 147 * struct phy - represents the phy device 148 * @dev: phy device 149 * @id: id of the phy device 150 * @ops: function pointers for performing phy operations 151 * @mutex: mutex to protect phy_ops 152 * @init_count: used to protect when the PHY is used by multiple consumers 153 * @power_count: used to protect when the PHY is used by multiple consumers 154 * @attrs: used to specify PHY specific attributes 155 * @pwr: power regulator associated with the phy 156 * @debugfs: debugfs directory 157 */ 158 struct phy { 159 struct device dev; 160 int id; 161 const struct phy_ops *ops; 162 struct mutex mutex; 163 int init_count; 164 int power_count; 165 struct phy_attrs attrs; 166 struct regulator *pwr; 167 struct dentry *debugfs; 168 }; 169 170 /** 171 * struct phy_provider - represents the phy provider 172 * @dev: phy provider device 173 * @children: can be used to override the default (dev->of_node) child node 174 * @owner: the module owner having of_xlate 175 * @list: to maintain a linked list of PHY providers 176 * @of_xlate: function pointer to obtain phy instance from phy pointer 177 */ 178 struct phy_provider { 179 struct device *dev; 180 struct device_node *children; 181 struct module *owner; 182 struct list_head list; 183 struct phy * (*of_xlate)(struct device *dev, 184 const struct of_phandle_args *args); 185 }; 186 187 /** 188 * struct phy_lookup - PHY association in list of phys managed by the phy driver 189 * @node: list node 190 * @dev_id: the device of the association 191 * @con_id: connection ID string on device 192 * @phy: the phy of the association 193 */ 194 struct phy_lookup { 195 struct list_head node; 196 const char *dev_id; 197 const char *con_id; 198 struct phy *phy; 199 }; 200 201 #define to_phy(a) (container_of((a), struct phy, dev)) 202 203 #define of_phy_provider_register(dev, xlate) \ 204 __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) 205 206 #define devm_of_phy_provider_register(dev, xlate) \ 207 __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) 208 209 #define of_phy_provider_register_full(dev, children, xlate) \ 210 __of_phy_provider_register(dev, children, THIS_MODULE, xlate) 211 212 #define devm_of_phy_provider_register_full(dev, children, xlate) \ 213 __devm_of_phy_provider_register(dev, children, THIS_MODULE, xlate) 214 phy_set_drvdata(struct phy * phy,void * data)215 static inline void phy_set_drvdata(struct phy *phy, void *data) 216 { 217 dev_set_drvdata(&phy->dev, data); 218 } 219 phy_get_drvdata(struct phy * phy)220 static inline void *phy_get_drvdata(struct phy *phy) 221 { 222 return dev_get_drvdata(&phy->dev); 223 } 224 225 #if IS_ENABLED(CONFIG_GENERIC_PHY) 226 int phy_pm_runtime_get(struct phy *phy); 227 int phy_pm_runtime_get_sync(struct phy *phy); 228 int phy_pm_runtime_put(struct phy *phy); 229 int phy_pm_runtime_put_sync(struct phy *phy); 230 void phy_pm_runtime_allow(struct phy *phy); 231 void phy_pm_runtime_forbid(struct phy *phy); 232 int phy_init(struct phy *phy); 233 int phy_exit(struct phy *phy); 234 int phy_power_on(struct phy *phy); 235 int phy_power_off(struct phy *phy); 236 int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode); 237 #define phy_set_mode(phy, mode) \ 238 phy_set_mode_ext(phy, mode, 0) 239 int phy_set_media(struct phy *phy, enum phy_media media); 240 int phy_set_speed(struct phy *phy, int speed); 241 int phy_configure(struct phy *phy, union phy_configure_opts *opts); 242 int phy_validate(struct phy *phy, enum phy_mode mode, int submode, 243 union phy_configure_opts *opts); 244 phy_get_mode(struct phy * phy)245 static inline enum phy_mode phy_get_mode(struct phy *phy) 246 { 247 return phy->attrs.mode; 248 } 249 int phy_reset(struct phy *phy); 250 int phy_calibrate(struct phy *phy); 251 int phy_notify_connect(struct phy *phy, int port); 252 int phy_notify_disconnect(struct phy *phy, int port); phy_get_bus_width(struct phy * phy)253 static inline int phy_get_bus_width(struct phy *phy) 254 { 255 return phy->attrs.bus_width; 256 } phy_set_bus_width(struct phy * phy,int bus_width)257 static inline void phy_set_bus_width(struct phy *phy, int bus_width) 258 { 259 phy->attrs.bus_width = bus_width; 260 } 261 struct phy *phy_get(struct device *dev, const char *string); 262 struct phy *devm_phy_get(struct device *dev, const char *string); 263 struct phy *devm_phy_optional_get(struct device *dev, const char *string); 264 struct phy *devm_of_phy_get(struct device *dev, struct device_node *np, 265 const char *con_id); 266 struct phy *devm_of_phy_optional_get(struct device *dev, struct device_node *np, 267 const char *con_id); 268 struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np, 269 int index); 270 void of_phy_put(struct phy *phy); 271 void phy_put(struct device *dev, struct phy *phy); 272 void devm_phy_put(struct device *dev, struct phy *phy); 273 struct phy *of_phy_get(struct device_node *np, const char *con_id); 274 struct phy *of_phy_simple_xlate(struct device *dev, 275 const struct of_phandle_args *args); 276 struct phy *phy_create(struct device *dev, struct device_node *node, 277 const struct phy_ops *ops); 278 struct phy *devm_phy_create(struct device *dev, struct device_node *node, 279 const struct phy_ops *ops); 280 void phy_destroy(struct phy *phy); 281 void devm_phy_destroy(struct device *dev, struct phy *phy); 282 struct phy_provider *__of_phy_provider_register(struct device *dev, 283 struct device_node *children, struct module *owner, 284 struct phy * (*of_xlate)(struct device *dev, 285 const struct of_phandle_args *args)); 286 struct phy_provider *__devm_of_phy_provider_register(struct device *dev, 287 struct device_node *children, struct module *owner, 288 struct phy * (*of_xlate)(struct device *dev, 289 const struct of_phandle_args *args)); 290 void of_phy_provider_unregister(struct phy_provider *phy_provider); 291 void devm_of_phy_provider_unregister(struct device *dev, 292 struct phy_provider *phy_provider); 293 int phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id); 294 void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id); 295 #else phy_pm_runtime_get(struct phy * phy)296 static inline int phy_pm_runtime_get(struct phy *phy) 297 { 298 if (!phy) 299 return 0; 300 return -ENOSYS; 301 } 302 phy_pm_runtime_get_sync(struct phy * phy)303 static inline int phy_pm_runtime_get_sync(struct phy *phy) 304 { 305 if (!phy) 306 return 0; 307 return -ENOSYS; 308 } 309 phy_pm_runtime_put(struct phy * phy)310 static inline int phy_pm_runtime_put(struct phy *phy) 311 { 312 if (!phy) 313 return 0; 314 return -ENOSYS; 315 } 316 phy_pm_runtime_put_sync(struct phy * phy)317 static inline int phy_pm_runtime_put_sync(struct phy *phy) 318 { 319 if (!phy) 320 return 0; 321 return -ENOSYS; 322 } 323 phy_pm_runtime_allow(struct phy * phy)324 static inline void phy_pm_runtime_allow(struct phy *phy) 325 { 326 return; 327 } 328 phy_pm_runtime_forbid(struct phy * phy)329 static inline void phy_pm_runtime_forbid(struct phy *phy) 330 { 331 return; 332 } 333 phy_init(struct phy * phy)334 static inline int phy_init(struct phy *phy) 335 { 336 if (!phy) 337 return 0; 338 return -ENOSYS; 339 } 340 phy_exit(struct phy * phy)341 static inline int phy_exit(struct phy *phy) 342 { 343 if (!phy) 344 return 0; 345 return -ENOSYS; 346 } 347 phy_power_on(struct phy * phy)348 static inline int phy_power_on(struct phy *phy) 349 { 350 if (!phy) 351 return 0; 352 return -ENOSYS; 353 } 354 phy_power_off(struct phy * phy)355 static inline int phy_power_off(struct phy *phy) 356 { 357 if (!phy) 358 return 0; 359 return -ENOSYS; 360 } 361 phy_set_mode_ext(struct phy * phy,enum phy_mode mode,int submode)362 static inline int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, 363 int submode) 364 { 365 if (!phy) 366 return 0; 367 return -ENOSYS; 368 } 369 370 #define phy_set_mode(phy, mode) \ 371 phy_set_mode_ext(phy, mode, 0) 372 phy_set_media(struct phy * phy,enum phy_media media)373 static inline int phy_set_media(struct phy *phy, enum phy_media media) 374 { 375 if (!phy) 376 return 0; 377 return -ENODEV; 378 } 379 phy_set_speed(struct phy * phy,int speed)380 static inline int phy_set_speed(struct phy *phy, int speed) 381 { 382 if (!phy) 383 return 0; 384 return -ENODEV; 385 } 386 phy_get_mode(struct phy * phy)387 static inline enum phy_mode phy_get_mode(struct phy *phy) 388 { 389 return PHY_MODE_INVALID; 390 } 391 phy_reset(struct phy * phy)392 static inline int phy_reset(struct phy *phy) 393 { 394 if (!phy) 395 return 0; 396 return -ENOSYS; 397 } 398 phy_calibrate(struct phy * phy)399 static inline int phy_calibrate(struct phy *phy) 400 { 401 if (!phy) 402 return 0; 403 return -ENOSYS; 404 } 405 phy_notify_connect(struct phy * phy,int index)406 static inline int phy_notify_connect(struct phy *phy, int index) 407 { 408 if (!phy) 409 return 0; 410 return -ENOSYS; 411 } 412 phy_notify_disconnect(struct phy * phy,int index)413 static inline int phy_notify_disconnect(struct phy *phy, int index) 414 { 415 if (!phy) 416 return 0; 417 return -ENOSYS; 418 } 419 phy_configure(struct phy * phy,union phy_configure_opts * opts)420 static inline int phy_configure(struct phy *phy, 421 union phy_configure_opts *opts) 422 { 423 if (!phy) 424 return 0; 425 426 return -ENOSYS; 427 } 428 phy_validate(struct phy * phy,enum phy_mode mode,int submode,union phy_configure_opts * opts)429 static inline int phy_validate(struct phy *phy, enum phy_mode mode, int submode, 430 union phy_configure_opts *opts) 431 { 432 if (!phy) 433 return 0; 434 435 return -ENOSYS; 436 } 437 phy_get_bus_width(struct phy * phy)438 static inline int phy_get_bus_width(struct phy *phy) 439 { 440 return -ENOSYS; 441 } 442 phy_set_bus_width(struct phy * phy,int bus_width)443 static inline void phy_set_bus_width(struct phy *phy, int bus_width) 444 { 445 return; 446 } 447 phy_get(struct device * dev,const char * string)448 static inline struct phy *phy_get(struct device *dev, const char *string) 449 { 450 return ERR_PTR(-ENOSYS); 451 } 452 devm_phy_get(struct device * dev,const char * string)453 static inline struct phy *devm_phy_get(struct device *dev, const char *string) 454 { 455 return ERR_PTR(-ENOSYS); 456 } 457 devm_phy_optional_get(struct device * dev,const char * string)458 static inline struct phy *devm_phy_optional_get(struct device *dev, 459 const char *string) 460 { 461 return NULL; 462 } 463 devm_of_phy_get(struct device * dev,struct device_node * np,const char * con_id)464 static inline struct phy *devm_of_phy_get(struct device *dev, 465 struct device_node *np, 466 const char *con_id) 467 { 468 return ERR_PTR(-ENOSYS); 469 } 470 devm_of_phy_optional_get(struct device * dev,struct device_node * np,const char * con_id)471 static inline struct phy *devm_of_phy_optional_get(struct device *dev, 472 struct device_node *np, 473 const char *con_id) 474 { 475 return NULL; 476 } 477 devm_of_phy_get_by_index(struct device * dev,struct device_node * np,int index)478 static inline struct phy *devm_of_phy_get_by_index(struct device *dev, 479 struct device_node *np, 480 int index) 481 { 482 return ERR_PTR(-ENOSYS); 483 } 484 of_phy_put(struct phy * phy)485 static inline void of_phy_put(struct phy *phy) 486 { 487 } 488 phy_put(struct device * dev,struct phy * phy)489 static inline void phy_put(struct device *dev, struct phy *phy) 490 { 491 } 492 devm_phy_put(struct device * dev,struct phy * phy)493 static inline void devm_phy_put(struct device *dev, struct phy *phy) 494 { 495 } 496 of_phy_get(struct device_node * np,const char * con_id)497 static inline struct phy *of_phy_get(struct device_node *np, const char *con_id) 498 { 499 return ERR_PTR(-ENOSYS); 500 } 501 of_phy_simple_xlate(struct device * dev,const struct of_phandle_args * args)502 static inline struct phy *of_phy_simple_xlate(struct device *dev, 503 const struct of_phandle_args *args) 504 { 505 return ERR_PTR(-ENOSYS); 506 } 507 phy_create(struct device * dev,struct device_node * node,const struct phy_ops * ops)508 static inline struct phy *phy_create(struct device *dev, 509 struct device_node *node, 510 const struct phy_ops *ops) 511 { 512 return ERR_PTR(-ENOSYS); 513 } 514 devm_phy_create(struct device * dev,struct device_node * node,const struct phy_ops * ops)515 static inline struct phy *devm_phy_create(struct device *dev, 516 struct device_node *node, 517 const struct phy_ops *ops) 518 { 519 return ERR_PTR(-ENOSYS); 520 } 521 phy_destroy(struct phy * phy)522 static inline void phy_destroy(struct phy *phy) 523 { 524 } 525 devm_phy_destroy(struct device * dev,struct phy * phy)526 static inline void devm_phy_destroy(struct device *dev, struct phy *phy) 527 { 528 } 529 __of_phy_provider_register(struct device * dev,struct device_node * children,struct module * owner,struct phy * (* of_xlate)(struct device * dev,const struct of_phandle_args * args))530 static inline struct phy_provider *__of_phy_provider_register( 531 struct device *dev, struct device_node *children, struct module *owner, 532 struct phy * (*of_xlate)(struct device *dev, 533 const struct of_phandle_args *args)) 534 { 535 return ERR_PTR(-ENOSYS); 536 } 537 __devm_of_phy_provider_register(struct device * dev,struct device_node * children,struct module * owner,struct phy * (* of_xlate)(struct device * dev,const struct of_phandle_args * args))538 static inline struct phy_provider *__devm_of_phy_provider_register(struct device 539 *dev, struct device_node *children, struct module *owner, 540 struct phy * (*of_xlate)(struct device *dev, 541 const struct of_phandle_args *args)) 542 { 543 return ERR_PTR(-ENOSYS); 544 } 545 of_phy_provider_unregister(struct phy_provider * phy_provider)546 static inline void of_phy_provider_unregister(struct phy_provider *phy_provider) 547 { 548 } 549 devm_of_phy_provider_unregister(struct device * dev,struct phy_provider * phy_provider)550 static inline void devm_of_phy_provider_unregister(struct device *dev, 551 struct phy_provider *phy_provider) 552 { 553 } 554 static inline int phy_create_lookup(struct phy * phy,const char * con_id,const char * dev_id)555 phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id) 556 { 557 return 0; 558 } phy_remove_lookup(struct phy * phy,const char * con_id,const char * dev_id)559 static inline void phy_remove_lookup(struct phy *phy, const char *con_id, 560 const char *dev_id) { } 561 #endif 562 563 #endif /* __DRIVERS_PHY_H */ 564