hibmc_drm_vdac.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /* Hisilicon Hibmc SoC drm driver
  2. *
  3. * Based on the bochs drm driver.
  4. *
  5. * Copyright (c) 2016 Huawei Limited.
  6. *
  7. * Author:
  8. * Rongrong Zou <zourongrong@huawei.com>
  9. * Rongrong Zou <zourongrong@gmail.com>
  10. * Jianhua Li <lijianhua@huawei.com>
  11. *
  12. * This program is free software; you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License as published by
  14. * the Free Software Foundation; either version 2 of the License, or
  15. * (at your option) any later version.
  16. *
  17. */
  18. #include <drm/drm_atomic_helper.h>
  19. #include <drm/drm_crtc_helper.h>
  20. #include "hibmc_drm_drv.h"
  21. #include "hibmc_drm_regs.h"
  22. static int hibmc_connector_get_modes(struct drm_connector *connector)
  23. {
  24. return drm_add_modes_noedid(connector, 800, 600);
  25. }
  26. static int hibmc_connector_mode_valid(struct drm_connector *connector,
  27. struct drm_display_mode *mode)
  28. {
  29. return MODE_OK;
  30. }
  31. static struct drm_encoder *
  32. hibmc_connector_best_encoder(struct drm_connector *connector)
  33. {
  34. return drm_encoder_find(connector->dev, connector->encoder_ids[0]);
  35. }
  36. static const struct drm_connector_helper_funcs
  37. hibmc_connector_helper_funcs = {
  38. .get_modes = hibmc_connector_get_modes,
  39. .mode_valid = hibmc_connector_mode_valid,
  40. .best_encoder = hibmc_connector_best_encoder,
  41. };
  42. static const struct drm_connector_funcs hibmc_connector_funcs = {
  43. .dpms = drm_atomic_helper_connector_dpms,
  44. .fill_modes = drm_helper_probe_single_connector_modes,
  45. .destroy = drm_connector_cleanup,
  46. .reset = drm_atomic_helper_connector_reset,
  47. .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
  48. .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
  49. };
  50. static struct drm_connector *
  51. hibmc_connector_init(struct hibmc_drm_private *priv)
  52. {
  53. struct drm_device *dev = priv->dev;
  54. struct drm_connector *connector;
  55. int ret;
  56. connector = devm_kzalloc(dev->dev, sizeof(*connector), GFP_KERNEL);
  57. if (!connector) {
  58. DRM_ERROR("failed to alloc memory when init connector\n");
  59. return ERR_PTR(-ENOMEM);
  60. }
  61. ret = drm_connector_init(dev, connector,
  62. &hibmc_connector_funcs,
  63. DRM_MODE_CONNECTOR_VGA);
  64. if (ret) {
  65. DRM_ERROR("failed to init connector: %d\n", ret);
  66. return ERR_PTR(ret);
  67. }
  68. drm_connector_helper_add(connector,
  69. &hibmc_connector_helper_funcs);
  70. return connector;
  71. }
  72. static void hibmc_encoder_mode_set(struct drm_encoder *encoder,
  73. struct drm_display_mode *mode,
  74. struct drm_display_mode *adj_mode)
  75. {
  76. u32 reg;
  77. struct drm_device *dev = encoder->dev;
  78. struct hibmc_drm_private *priv = dev->dev_private;
  79. reg = readl(priv->mmio + HIBMC_DISPLAY_CONTROL_HISILE);
  80. reg |= HIBMC_DISPLAY_CONTROL_FPVDDEN(1);
  81. reg |= HIBMC_DISPLAY_CONTROL_PANELDATE(1);
  82. reg |= HIBMC_DISPLAY_CONTROL_FPEN(1);
  83. reg |= HIBMC_DISPLAY_CONTROL_VBIASEN(1);
  84. writel(reg, priv->mmio + HIBMC_DISPLAY_CONTROL_HISILE);
  85. }
  86. static const struct drm_encoder_helper_funcs hibmc_encoder_helper_funcs = {
  87. .mode_set = hibmc_encoder_mode_set,
  88. };
  89. static const struct drm_encoder_funcs hibmc_encoder_funcs = {
  90. .destroy = drm_encoder_cleanup,
  91. };
  92. int hibmc_vdac_init(struct hibmc_drm_private *priv)
  93. {
  94. struct drm_device *dev = priv->dev;
  95. struct drm_encoder *encoder;
  96. struct drm_connector *connector;
  97. int ret;
  98. connector = hibmc_connector_init(priv);
  99. if (IS_ERR(connector)) {
  100. DRM_ERROR("failed to create connector: %ld\n",
  101. PTR_ERR(connector));
  102. return PTR_ERR(connector);
  103. }
  104. encoder = devm_kzalloc(dev->dev, sizeof(*encoder), GFP_KERNEL);
  105. if (!encoder) {
  106. DRM_ERROR("failed to alloc memory when init encoder\n");
  107. return -ENOMEM;
  108. }
  109. encoder->possible_crtcs = 0x1;
  110. ret = drm_encoder_init(dev, encoder, &hibmc_encoder_funcs,
  111. DRM_MODE_ENCODER_DAC, NULL);
  112. if (ret) {
  113. DRM_ERROR("failed to init encoder: %d\n", ret);
  114. return ret;
  115. }
  116. drm_encoder_helper_add(encoder, &hibmc_encoder_helper_funcs);
  117. drm_mode_connector_attach_encoder(connector, encoder);
  118. return 0;
  119. }