dp_hpd.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/slab.h>
  6. #include <linux/device.h>
  7. #include <linux/delay.h>
  8. #include <linux/err.h>
  9. #include "dp_hpd.h"
  10. #include "dp_usbpd.h"
  11. #include "dp_gpio_hpd.h"
  12. #include "dp_lphw_hpd.h"
  13. #include "dp_debug.h"
  14. static void dp_hpd_host_init(struct dp_hpd *dp_hpd,
  15. struct dp_catalog_hpd *catalog)
  16. {
  17. if (!catalog) {
  18. DP_ERR("invalid input\n");
  19. return;
  20. }
  21. catalog->config_hpd(catalog, true);
  22. }
  23. static void dp_hpd_host_deinit(struct dp_hpd *dp_hpd,
  24. struct dp_catalog_hpd *catalog)
  25. {
  26. if (!catalog) {
  27. DP_ERR("invalid input\n");
  28. return;
  29. }
  30. catalog->config_hpd(catalog, false);
  31. }
  32. static void dp_hpd_isr(struct dp_hpd *dp_hpd)
  33. {
  34. }
  35. struct dp_hpd *dp_hpd_get(struct device *dev, struct dp_parser *parser,
  36. struct dp_catalog_hpd *catalog, struct dp_hpd_cb *cb)
  37. {
  38. struct dp_hpd *dp_hpd;
  39. if (parser->no_aux_switch && parser->lphw_hpd) {
  40. dp_hpd = dp_lphw_hpd_get(dev, parser, catalog, cb);
  41. if (IS_ERR(dp_hpd)) {
  42. DP_ERR("failed to get lphw hpd\n");
  43. return dp_hpd;
  44. }
  45. dp_hpd->type = DP_HPD_LPHW;
  46. } else if (parser->no_aux_switch) {
  47. dp_hpd = dp_gpio_hpd_get(dev, cb);
  48. if (IS_ERR(dp_hpd)) {
  49. DP_ERR("failed to get gpio hpd\n");
  50. return dp_hpd;
  51. }
  52. dp_hpd->type = DP_HPD_GPIO;
  53. } else {
  54. dp_hpd = dp_usbpd_get(dev, cb);
  55. if (IS_ERR(dp_hpd)) {
  56. DP_ERR("failed to get usbpd\n");
  57. return dp_hpd;
  58. }
  59. dp_hpd->type = DP_HPD_USBPD;
  60. }
  61. if (!dp_hpd->host_init)
  62. dp_hpd->host_init = dp_hpd_host_init;
  63. if (!dp_hpd->host_deinit)
  64. dp_hpd->host_deinit = dp_hpd_host_deinit;
  65. if (!dp_hpd->isr)
  66. dp_hpd->isr = dp_hpd_isr;
  67. return dp_hpd;
  68. }
  69. void dp_hpd_put(struct dp_hpd *dp_hpd)
  70. {
  71. if (!dp_hpd)
  72. return;
  73. switch (dp_hpd->type) {
  74. case DP_HPD_USBPD:
  75. dp_usbpd_put(dp_hpd);
  76. break;
  77. case DP_HPD_GPIO:
  78. dp_gpio_hpd_put(dp_hpd);
  79. break;
  80. case DP_HPD_LPHW:
  81. dp_lphw_hpd_put(dp_hpd);
  82. break;
  83. default:
  84. DP_ERR("unknown hpd type %d\n", dp_hpd->type);
  85. break;
  86. }
  87. }