armada_crtc.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2012 Russell King
  4. */
  5. #ifndef ARMADA_CRTC_H
  6. #define ARMADA_CRTC_H
  7. #include <drm/drm_crtc.h>
  8. struct armada_gem_object;
  9. struct armada_regs {
  10. uint32_t offset;
  11. uint32_t mask;
  12. uint32_t val;
  13. };
  14. #define armada_reg_queue_mod(_r, _i, _v, _m, _o) \
  15. do { \
  16. struct armada_regs *__reg = _r; \
  17. __reg[_i].offset = _o; \
  18. __reg[_i].mask = ~(_m); \
  19. __reg[_i].val = _v; \
  20. _i++; \
  21. } while (0)
  22. #define armada_reg_queue_set(_r, _i, _v, _o) \
  23. armada_reg_queue_mod(_r, _i, _v, ~0, _o)
  24. #define armada_reg_queue_end(_r, _i) \
  25. armada_reg_queue_mod(_r, _i, 0, 0, ~0)
  26. struct armada_crtc;
  27. struct armada_variant;
  28. struct armada_crtc {
  29. struct drm_crtc crtc;
  30. const struct armada_variant *variant;
  31. void *variant_data;
  32. unsigned num;
  33. void __iomem *base;
  34. struct clk *clk;
  35. struct {
  36. uint32_t spu_v_h_total;
  37. uint32_t spu_v_porch;
  38. uint32_t spu_adv_reg;
  39. } v[2];
  40. bool interlaced;
  41. bool cursor_update;
  42. struct armada_gem_object *cursor_obj;
  43. int cursor_x;
  44. int cursor_y;
  45. uint32_t cursor_hw_pos;
  46. uint32_t cursor_hw_sz;
  47. uint32_t cursor_w;
  48. uint32_t cursor_h;
  49. uint32_t cfg_dumb_ctrl;
  50. uint32_t spu_iopad_ctrl;
  51. spinlock_t irq_lock;
  52. uint32_t irq_ena;
  53. bool update_pending;
  54. struct drm_pending_vblank_event *event;
  55. struct armada_regs atomic_regs[32];
  56. struct armada_regs *regs;
  57. unsigned int regs_idx;
  58. };
  59. #define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc)
  60. void armada_drm_crtc_update_regs(struct armada_crtc *, struct armada_regs *);
  61. struct armada_clocking_params {
  62. unsigned long permillage_min;
  63. unsigned long permillage_max;
  64. u32 settable;
  65. u32 div_max;
  66. };
  67. struct armada_clk_result {
  68. unsigned long desired_clk_hz;
  69. struct clk *clk;
  70. u32 div;
  71. };
  72. int armada_crtc_select_clock(struct armada_crtc *dcrtc,
  73. struct armada_clk_result *res,
  74. const struct armada_clocking_params *params,
  75. struct clk *clks[], size_t num_clks,
  76. unsigned long desired_khz);
  77. extern struct platform_driver armada_lcd_platform_driver;
  78. #endif