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