196f60e37SRussell King /* SPDX-License-Identifier: GPL-2.0-only */ 296f60e37SRussell King /* 396f60e37SRussell King * Copyright (C) 2012 Russell King 496f60e37SRussell King */ 596f60e37SRussell King #ifndef ARMADA_CRTC_H 696f60e37SRussell King #define ARMADA_CRTC_H 796f60e37SRussell King 896f60e37SRussell King #include <drm/drm_crtc.h> 996f60e37SRussell King 1096f60e37SRussell King struct armada_gem_object; 11fcd70cd3SDaniel Vetter 12fcd70cd3SDaniel Vetter struct armada_regs { 1396f60e37SRussell King uint32_t offset; 1496f60e37SRussell King uint32_t mask; 1596f60e37SRussell King uint32_t val; 1696f60e37SRussell King }; 1796f60e37SRussell King 1896f60e37SRussell King #define armada_reg_queue_mod(_r, _i, _v, _m, _o) \ 1996f60e37SRussell King do { \ 2096f60e37SRussell King struct armada_regs *__reg = _r; \ 2196f60e37SRussell King __reg[_i].offset = _o; \ 2296f60e37SRussell King __reg[_i].mask = ~(_m); \ 2396f60e37SRussell King __reg[_i].val = _v; \ 2496f60e37SRussell King _i++; \ 2596f60e37SRussell King } while (0) 2696f60e37SRussell King 2796f60e37SRussell King #define armada_reg_queue_set(_r, _i, _v, _o) \ 2896f60e37SRussell King armada_reg_queue_mod(_r, _i, _v, ~0, _o) 2996f60e37SRussell King 3096f60e37SRussell King #define armada_reg_queue_end(_r, _i) \ 3196f60e37SRussell King armada_reg_queue_mod(_r, _i, 0, 0, ~0) 3296f60e37SRussell King 3396f60e37SRussell King struct armada_crtc; 3496f60e37SRussell King struct armada_variant; 3596f60e37SRussell King 364b5dda82SRussell King struct armada_crtc { 3742e62ba7SRussell King struct drm_crtc crtc; 3896f60e37SRussell King const struct armada_variant *variant; 3996f60e37SRussell King void *variant_data; 4096f60e37SRussell King unsigned num; 4142e62ba7SRussell King void __iomem *base; 421ba246f2SRussell King struct clk *clk; 4396f60e37SRussell King struct { 4496f60e37SRussell King uint32_t spu_v_h_total; 4596f60e37SRussell King uint32_t spu_v_porch; 4696f60e37SRussell King uint32_t spu_adv_reg; 4796f60e37SRussell King } v[2]; 4896f60e37SRussell King bool interlaced; 4996f60e37SRussell King bool cursor_update; 5096f60e37SRussell King 5196f60e37SRussell King struct armada_gem_object *cursor_obj; 52662af0d8SRussell King int cursor_x; 5396f60e37SRussell King int cursor_y; 54662af0d8SRussell King uint32_t cursor_hw_pos; 55662af0d8SRussell King uint32_t cursor_hw_sz; 56662af0d8SRussell King uint32_t cursor_w; 57662af0d8SRussell King uint32_t cursor_h; 58662af0d8SRussell King 59662af0d8SRussell King uint32_t cfg_dumb_ctrl; 60662af0d8SRussell King uint32_t spu_iopad_ctrl; 61662af0d8SRussell King 6296f60e37SRussell King spinlock_t irq_lock; 6396f60e37SRussell King uint32_t irq_ena; 6496f60e37SRussell King 6596f60e37SRussell King bool update_pending; 6696f60e37SRussell King struct drm_pending_vblank_event *event; 67c36045e1SRussell King struct armada_regs atomic_regs[32]; 683cb13ac9SRussell King struct armada_regs *regs; 69dbb4ca8aSRussell King unsigned int regs_idx; 70c36045e1SRussell King }; 71c36045e1SRussell King #define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc) 72c36045e1SRussell King 7396f60e37SRussell King void armada_drm_crtc_update_regs(struct armada_crtc *, struct armada_regs *); 7496f60e37SRussell King 7596f60e37SRussell King struct armada_clocking_params { 7696f60e37SRussell King unsigned long permillage_min; 7796f60e37SRussell King unsigned long permillage_max; 781ba246f2SRussell King u32 settable; 791ba246f2SRussell King u32 div_max; 801ba246f2SRussell King }; 811ba246f2SRussell King 821ba246f2SRussell King struct armada_clk_result { 831ba246f2SRussell King unsigned long desired_clk_hz; 841ba246f2SRussell King struct clk *clk; 851ba246f2SRussell King u32 div; 861ba246f2SRussell King }; 871ba246f2SRussell King 881ba246f2SRussell King int armada_crtc_select_clock(struct armada_crtc *dcrtc, 891ba246f2SRussell King struct armada_clk_result *res, 901ba246f2SRussell King const struct armada_clocking_params *params, 911ba246f2SRussell King struct clk *clks[], size_t num_clks, 921ba246f2SRussell King unsigned long desired_khz); 931ba246f2SRussell King 941ba246f2SRussell King extern struct platform_driver armada_lcd_platform_driver; 951ba246f2SRussell King 961ba246f2SRussell King #endif 97d8c96083SRussell King