adv7533.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/of_graph.h>
  6. #include "adv7511.h"
  7. static const struct reg_sequence adv7533_fixed_registers[] = {
  8. { 0x16, 0x20 },
  9. { 0x9a, 0xe0 },
  10. { 0xba, 0x70 },
  11. { 0xde, 0x82 },
  12. { 0xe4, 0x40 },
  13. { 0xe5, 0x80 },
  14. };
  15. static const struct reg_sequence adv7533_cec_fixed_registers[] = {
  16. { 0x15, 0xd0 },
  17. { 0x17, 0xd0 },
  18. { 0x24, 0x20 },
  19. { 0x57, 0x11 },
  20. { 0x05, 0xc8 },
  21. };
  22. static void adv7511_dsi_config_timing_gen(struct adv7511 *adv)
  23. {
  24. struct mipi_dsi_device *dsi = adv->dsi;
  25. struct drm_display_mode *mode = &adv->curr_mode;
  26. unsigned int hsw, hfp, hbp, vsw, vfp, vbp;
  27. static const u8 clock_div_by_lanes[] = { 6, 4, 3 }; /* 2, 3, 4 lanes */
  28. hsw = mode->hsync_end - mode->hsync_start;
  29. hfp = mode->hsync_start - mode->hdisplay;
  30. hbp = mode->htotal - mode->hsync_end;
  31. vsw = mode->vsync_end - mode->vsync_start;
  32. vfp = mode->vsync_start - mode->vdisplay;
  33. vbp = mode->vtotal - mode->vsync_end;
  34. /* set pixel clock divider mode */
  35. regmap_write(adv->regmap_cec, 0x16,
  36. clock_div_by_lanes[dsi->lanes - 2] << 3);
  37. /* horizontal porch params */
  38. regmap_write(adv->regmap_cec, 0x28, mode->htotal >> 4);
  39. regmap_write(adv->regmap_cec, 0x29, (mode->htotal << 4) & 0xff);
  40. regmap_write(adv->regmap_cec, 0x2a, hsw >> 4);
  41. regmap_write(adv->regmap_cec, 0x2b, (hsw << 4) & 0xff);
  42. regmap_write(adv->regmap_cec, 0x2c, hfp >> 4);
  43. regmap_write(adv->regmap_cec, 0x2d, (hfp << 4) & 0xff);
  44. regmap_write(adv->regmap_cec, 0x2e, hbp >> 4);
  45. regmap_write(adv->regmap_cec, 0x2f, (hbp << 4) & 0xff);
  46. /* vertical porch params */
  47. regmap_write(adv->regmap_cec, 0x30, mode->vtotal >> 4);
  48. regmap_write(adv->regmap_cec, 0x31, (mode->vtotal << 4) & 0xff);
  49. regmap_write(adv->regmap_cec, 0x32, vsw >> 4);
  50. regmap_write(adv->regmap_cec, 0x33, (vsw << 4) & 0xff);
  51. regmap_write(adv->regmap_cec, 0x34, vfp >> 4);
  52. regmap_write(adv->regmap_cec, 0x35, (vfp << 4) & 0xff);
  53. regmap_write(adv->regmap_cec, 0x36, vbp >> 4);
  54. regmap_write(adv->regmap_cec, 0x37, (vbp << 4) & 0xff);
  55. }
  56. void adv7533_dsi_power_on(struct adv7511 *adv)
  57. {
  58. struct mipi_dsi_device *dsi = adv->dsi;
  59. if (adv->use_timing_gen)
  60. adv7511_dsi_config_timing_gen(adv);
  61. /* set number of dsi lanes */
  62. regmap_write(adv->regmap_cec, 0x1c, dsi->lanes << 4);
  63. if (adv->use_timing_gen) {
  64. /* reset internal timing generator */
  65. regmap_write(adv->regmap_cec, 0x27, 0xcb);
  66. regmap_write(adv->regmap_cec, 0x27, 0x8b);
  67. regmap_write(adv->regmap_cec, 0x27, 0xcb);
  68. } else {
  69. /* disable internal timing generator */
  70. regmap_write(adv->regmap_cec, 0x27, 0x0b);
  71. }
  72. /* enable hdmi */
  73. regmap_write(adv->regmap_cec, 0x03, 0x89);
  74. /* disable test mode */
  75. regmap_write(adv->regmap_cec, 0x55, 0x00);
  76. regmap_register_patch(adv->regmap_cec, adv7533_cec_fixed_registers,
  77. ARRAY_SIZE(adv7533_cec_fixed_registers));
  78. }
  79. void adv7533_dsi_power_off(struct adv7511 *adv)
  80. {
  81. /* disable hdmi */
  82. regmap_write(adv->regmap_cec, 0x03, 0x0b);
  83. /* disable internal timing generator */
  84. regmap_write(adv->regmap_cec, 0x27, 0x0b);
  85. }
  86. enum drm_mode_status adv7533_mode_valid(struct adv7511 *adv,
  87. const struct drm_display_mode *mode)
  88. {
  89. unsigned long max_lane_freq;
  90. struct mipi_dsi_device *dsi = adv->dsi;
  91. u8 bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
  92. /* Check max clock for either 7533 or 7535 */
  93. if (mode->clock > (adv->type == ADV7533 ? 80000 : 148500))
  94. return MODE_CLOCK_HIGH;
  95. /* Check max clock for each lane */
  96. max_lane_freq = (adv->type == ADV7533 ? 800000 : 891000);
  97. if (mode->clock * bpp > max_lane_freq * adv->num_dsi_lanes)
  98. return MODE_CLOCK_HIGH;
  99. return MODE_OK;
  100. }
  101. int adv7533_patch_registers(struct adv7511 *adv)
  102. {
  103. return regmap_register_patch(adv->regmap,
  104. adv7533_fixed_registers,
  105. ARRAY_SIZE(adv7533_fixed_registers));
  106. }
  107. int adv7533_patch_cec_registers(struct adv7511 *adv)
  108. {
  109. return regmap_register_patch(adv->regmap_cec,
  110. adv7533_cec_fixed_registers,
  111. ARRAY_SIZE(adv7533_cec_fixed_registers));
  112. }
  113. int adv7533_attach_dsi(struct adv7511 *adv)
  114. {
  115. struct device *dev = &adv->i2c_main->dev;
  116. struct mipi_dsi_host *host;
  117. struct mipi_dsi_device *dsi;
  118. int ret = 0;
  119. const struct mipi_dsi_device_info info = { .type = "adv7533",
  120. .channel = 0,
  121. .node = NULL,
  122. };
  123. host = of_find_mipi_dsi_host_by_node(adv->host_node);
  124. if (!host) {
  125. dev_err(dev, "failed to find dsi host\n");
  126. return -EPROBE_DEFER;
  127. }
  128. dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
  129. if (IS_ERR(dsi)) {
  130. dev_err(dev, "failed to create dsi device\n");
  131. return PTR_ERR(dsi);
  132. }
  133. adv->dsi = dsi;
  134. dsi->lanes = adv->num_dsi_lanes;
  135. dsi->format = MIPI_DSI_FMT_RGB888;
  136. dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
  137. MIPI_DSI_MODE_NO_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE;
  138. ret = devm_mipi_dsi_attach(dev, dsi);
  139. if (ret < 0) {
  140. dev_err(dev, "failed to attach dsi to host\n");
  141. return ret;
  142. }
  143. return 0;
  144. }
  145. int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
  146. {
  147. u32 num_lanes;
  148. of_property_read_u32(np, "adi,dsi-lanes", &num_lanes);
  149. if (num_lanes < 1 || num_lanes > 4)
  150. return -EINVAL;
  151. adv->num_dsi_lanes = num_lanes;
  152. adv->host_node = of_graph_get_remote_node(np, 0, 0);
  153. if (!adv->host_node)
  154. return -ENODEV;
  155. of_node_put(adv->host_node);
  156. adv->use_timing_gen = !of_property_read_bool(np,
  157. "adi,disable-timing-generator");
  158. /* TODO: Check if these need to be parsed by DT or not */
  159. adv->rgb = true;
  160. adv->embedded_sync = false;
  161. return 0;
  162. }