video-bridge-uclass.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * Copyright (C) 2015 Google, Inc
  3. * Written by Simon Glass <sjg@chromium.org>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <dm.h>
  9. #include <errno.h>
  10. #include <video_bridge.h>
  11. int video_bridge_set_backlight(struct udevice *dev, int percent)
  12. {
  13. struct video_bridge_ops *ops = video_bridge_get_ops(dev);
  14. if (!ops->set_backlight)
  15. return -ENOSYS;
  16. return ops->set_backlight(dev, percent);
  17. }
  18. int video_bridge_attach(struct udevice *dev)
  19. {
  20. struct video_bridge_ops *ops = video_bridge_get_ops(dev);
  21. if (!ops->attach)
  22. return -ENOSYS;
  23. return ops->attach(dev);
  24. }
  25. int video_bridge_check_attached(struct udevice *dev)
  26. {
  27. struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev);
  28. struct video_bridge_ops *ops = video_bridge_get_ops(dev);
  29. int ret;
  30. if (!ops->check_attached) {
  31. ret = dm_gpio_get_value(&uc_priv->hotplug);
  32. return ret > 0 ? 0 : ret == 0 ? -ENOTCONN : ret;
  33. }
  34. return ops->check_attached(dev);
  35. }
  36. static int video_bridge_pre_probe(struct udevice *dev)
  37. {
  38. struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev);
  39. int ret;
  40. debug("%s\n", __func__);
  41. ret = gpio_request_by_name(dev, "sleep-gpios", 0,
  42. &uc_priv->sleep, GPIOD_IS_OUT);
  43. if (ret) {
  44. debug("%s: Could not decode sleep-gpios (%d)\n", __func__, ret);
  45. if (ret != -ENOENT)
  46. return ret;
  47. }
  48. /*
  49. * Drop this for now as we do not have driver model pinctrl support
  50. *
  51. * ret = dm_gpio_set_pull(&uc_priv->sleep, GPIO_PULL_NONE);
  52. * if (ret) {
  53. * debug("%s: Could not set sleep pull value\n", __func__);
  54. * return ret;
  55. * }
  56. */
  57. ret = gpio_request_by_name(dev, "reset-gpios", 0, &uc_priv->reset,
  58. GPIOD_IS_OUT);
  59. if (ret) {
  60. debug("%s: Could not decode reset-gpios (%d)\n", __func__, ret);
  61. if (ret != -ENOENT)
  62. return ret;
  63. }
  64. /*
  65. * Drop this for now as we do not have driver model pinctrl support
  66. *
  67. * ret = dm_gpio_set_pull(&uc_priv->reset, GPIO_PULL_NONE);
  68. * if (ret) {
  69. * debug("%s: Could not set reset pull value\n", __func__);
  70. * return ret;
  71. * }
  72. */
  73. ret = gpio_request_by_name(dev, "hotplug-gpios", 0, &uc_priv->hotplug,
  74. GPIOD_IS_IN);
  75. if (ret) {
  76. debug("%s: Could not decode hotplug (%d)\n", __func__, ret);
  77. if (ret != -ENOENT)
  78. return ret;
  79. }
  80. return 0;
  81. }
  82. int video_bridge_set_active(struct udevice *dev, bool active)
  83. {
  84. struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev);
  85. int ret;
  86. debug("%s: %d\n", __func__, active);
  87. ret = dm_gpio_set_value(&uc_priv->sleep, !active);
  88. if (ret)
  89. return ret;
  90. if (active) {
  91. ret = dm_gpio_set_value(&uc_priv->reset, true);
  92. if (ret)
  93. return ret;
  94. udelay(10);
  95. ret = dm_gpio_set_value(&uc_priv->reset, false);
  96. }
  97. return ret;
  98. }
  99. UCLASS_DRIVER(video_bridge) = {
  100. .id = UCLASS_VIDEO_BRIDGE,
  101. .name = "video_bridge",
  102. .per_device_auto_alloc_size = sizeof(struct video_bridge_priv),
  103. .pre_probe = video_bridge_pre_probe,
  104. };