imx-ldb-helper.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright 2019,2020,2022 NXP
  4. */
  5. #ifndef __IMX_LDB_HELPER__
  6. #define __IMX_LDB_HELPER__
  7. #include <linux/device.h>
  8. #include <linux/kernel.h>
  9. #include <linux/of.h>
  10. #include <linux/regmap.h>
  11. #include <drm/drm_atomic.h>
  12. #include <drm/drm_bridge.h>
  13. #include <drm/drm_device.h>
  14. #include <drm/drm_encoder.h>
  15. #include <drm/drm_modeset_helper_vtables.h>
  16. #define LDB_CH0_MODE_EN_TO_DI0 BIT(0)
  17. #define LDB_CH0_MODE_EN_TO_DI1 (3 << 0)
  18. #define LDB_CH0_MODE_EN_MASK (3 << 0)
  19. #define LDB_CH1_MODE_EN_TO_DI0 BIT(2)
  20. #define LDB_CH1_MODE_EN_TO_DI1 (3 << 2)
  21. #define LDB_CH1_MODE_EN_MASK (3 << 2)
  22. #define LDB_SPLIT_MODE_EN BIT(4)
  23. #define LDB_DATA_WIDTH_CH0_24 BIT(5)
  24. #define LDB_BIT_MAP_CH0_JEIDA BIT(6)
  25. #define LDB_DATA_WIDTH_CH1_24 BIT(7)
  26. #define LDB_BIT_MAP_CH1_JEIDA BIT(8)
  27. #define LDB_DI0_VS_POL_ACT_LOW BIT(9)
  28. #define LDB_DI1_VS_POL_ACT_LOW BIT(10)
  29. #define MAX_LDB_CHAN_NUM 2
  30. enum ldb_channel_link_type {
  31. LDB_CH_SINGLE_LINK,
  32. LDB_CH_DUAL_LINK_EVEN_ODD_PIXELS,
  33. LDB_CH_DUAL_LINK_ODD_EVEN_PIXELS,
  34. };
  35. struct ldb;
  36. struct ldb_channel {
  37. struct ldb *ldb;
  38. struct drm_bridge bridge;
  39. struct drm_bridge *next_bridge;
  40. struct device_node *np;
  41. u32 chno;
  42. bool is_available;
  43. u32 in_bus_format;
  44. u32 out_bus_format;
  45. enum ldb_channel_link_type link_type;
  46. };
  47. struct ldb {
  48. struct regmap *regmap;
  49. struct device *dev;
  50. struct ldb_channel *channel[MAX_LDB_CHAN_NUM];
  51. unsigned int ctrl_reg;
  52. u32 ldb_ctrl;
  53. unsigned int available_ch_cnt;
  54. };
  55. #define bridge_to_ldb_ch(b) container_of(b, struct ldb_channel, bridge)
  56. bool ldb_channel_is_single_link(struct ldb_channel *ldb_ch);
  57. bool ldb_channel_is_split_link(struct ldb_channel *ldb_ch);
  58. int ldb_bridge_atomic_check_helper(struct drm_bridge *bridge,
  59. struct drm_bridge_state *bridge_state,
  60. struct drm_crtc_state *crtc_state,
  61. struct drm_connector_state *conn_state);
  62. void ldb_bridge_mode_set_helper(struct drm_bridge *bridge,
  63. const struct drm_display_mode *mode,
  64. const struct drm_display_mode *adjusted_mode);
  65. void ldb_bridge_enable_helper(struct drm_bridge *bridge);
  66. void ldb_bridge_disable_helper(struct drm_bridge *bridge);
  67. int ldb_bridge_attach_helper(struct drm_bridge *bridge,
  68. enum drm_bridge_attach_flags flags);
  69. int ldb_init_helper(struct ldb *ldb);
  70. int ldb_find_next_bridge_helper(struct ldb *ldb);
  71. void ldb_add_bridge_helper(struct ldb *ldb,
  72. const struct drm_bridge_funcs *bridge_funcs);
  73. void ldb_remove_bridge_helper(struct ldb *ldb);
  74. #endif /* __IMX_LDB_HELPER__ */