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