162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2012 Russell King 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#ifndef ARMADA_CRTC_H 662306a36Sopenharmony_ci#define ARMADA_CRTC_H 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <drm/drm_crtc.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistruct armada_gem_object; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct armada_regs { 1362306a36Sopenharmony_ci uint32_t offset; 1462306a36Sopenharmony_ci uint32_t mask; 1562306a36Sopenharmony_ci uint32_t val; 1662306a36Sopenharmony_ci}; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define armada_reg_queue_mod(_r, _i, _v, _m, _o) \ 1962306a36Sopenharmony_ci do { \ 2062306a36Sopenharmony_ci struct armada_regs *__reg = _r; \ 2162306a36Sopenharmony_ci __reg[_i].offset = _o; \ 2262306a36Sopenharmony_ci __reg[_i].mask = ~(_m); \ 2362306a36Sopenharmony_ci __reg[_i].val = _v; \ 2462306a36Sopenharmony_ci _i++; \ 2562306a36Sopenharmony_ci } while (0) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define armada_reg_queue_set(_r, _i, _v, _o) \ 2862306a36Sopenharmony_ci armada_reg_queue_mod(_r, _i, _v, ~0, _o) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define armada_reg_queue_end(_r, _i) \ 3162306a36Sopenharmony_ci armada_reg_queue_mod(_r, _i, 0, 0, ~0) 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistruct armada_crtc; 3462306a36Sopenharmony_cistruct armada_variant; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistruct armada_crtc { 3762306a36Sopenharmony_ci struct drm_crtc crtc; 3862306a36Sopenharmony_ci const struct armada_variant *variant; 3962306a36Sopenharmony_ci void *variant_data; 4062306a36Sopenharmony_ci unsigned num; 4162306a36Sopenharmony_ci void __iomem *base; 4262306a36Sopenharmony_ci struct clk *clk; 4362306a36Sopenharmony_ci struct { 4462306a36Sopenharmony_ci uint32_t spu_v_h_total; 4562306a36Sopenharmony_ci uint32_t spu_v_porch; 4662306a36Sopenharmony_ci uint32_t spu_adv_reg; 4762306a36Sopenharmony_ci } v[2]; 4862306a36Sopenharmony_ci bool interlaced; 4962306a36Sopenharmony_ci bool cursor_update; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci struct armada_gem_object *cursor_obj; 5262306a36Sopenharmony_ci int cursor_x; 5362306a36Sopenharmony_ci int cursor_y; 5462306a36Sopenharmony_ci uint32_t cursor_hw_pos; 5562306a36Sopenharmony_ci uint32_t cursor_hw_sz; 5662306a36Sopenharmony_ci uint32_t cursor_w; 5762306a36Sopenharmony_ci uint32_t cursor_h; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci uint32_t cfg_dumb_ctrl; 6062306a36Sopenharmony_ci uint32_t spu_iopad_ctrl; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci spinlock_t irq_lock; 6362306a36Sopenharmony_ci uint32_t irq_ena; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci bool update_pending; 6662306a36Sopenharmony_ci struct drm_pending_vblank_event *event; 6762306a36Sopenharmony_ci struct armada_regs atomic_regs[32]; 6862306a36Sopenharmony_ci struct armada_regs *regs; 6962306a36Sopenharmony_ci unsigned int regs_idx; 7062306a36Sopenharmony_ci}; 7162306a36Sopenharmony_ci#define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc) 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_civoid armada_drm_crtc_update_regs(struct armada_crtc *, struct armada_regs *); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistruct armada_clocking_params { 7662306a36Sopenharmony_ci unsigned long permillage_min; 7762306a36Sopenharmony_ci unsigned long permillage_max; 7862306a36Sopenharmony_ci u32 settable; 7962306a36Sopenharmony_ci u32 div_max; 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cistruct armada_clk_result { 8362306a36Sopenharmony_ci unsigned long desired_clk_hz; 8462306a36Sopenharmony_ci struct clk *clk; 8562306a36Sopenharmony_ci u32 div; 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ciint armada_crtc_select_clock(struct armada_crtc *dcrtc, 8962306a36Sopenharmony_ci struct armada_clk_result *res, 9062306a36Sopenharmony_ci const struct armada_clocking_params *params, 9162306a36Sopenharmony_ci struct clk *clks[], size_t num_clks, 9262306a36Sopenharmony_ci unsigned long desired_khz); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ciextern struct platform_driver armada_lcd_platform_driver; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci#endif 97