2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2012-08-15 13:59:49 +01:00
/*
* Copyright ( C ) 2012 Russell King
*/
# ifndef ARMADA_CRTC_H
# define ARMADA_CRTC_H
2019-01-17 22:03:34 +01:00
# include <drm/drm_crtc.h>
2012-08-15 13:59:49 +01:00
struct armada_gem_object ;
struct armada_regs {
uint32_t offset ;
uint32_t mask ;
uint32_t val ;
} ;
# define armada_reg_queue_mod(_r, _i, _v, _m, _o) \
do { \
struct armada_regs * __reg = _r ; \
__reg [ _i ] . offset = _o ; \
__reg [ _i ] . mask = ~ ( _m ) ; \
__reg [ _i ] . val = _v ; \
_i + + ; \
} while ( 0 )
# define armada_reg_queue_set(_r, _i, _v, _o) \
armada_reg_queue_mod ( _r , _i , _v , ~ 0 , _o )
# define armada_reg_queue_end(_r, _i) \
armada_reg_queue_mod ( _r , _i , 0 , 0 , ~ 0 )
2015-08-06 16:37:18 +01:00
struct armada_crtc ;
2014-04-22 15:24:03 +01:00
struct armada_variant ;
2012-08-15 13:59:49 +01:00
struct armada_crtc {
struct drm_crtc crtc ;
2014-04-22 15:24:03 +01:00
const struct armada_variant * variant ;
2018-07-14 11:15:35 +01:00
void * variant_data ;
2012-08-15 13:59:49 +01:00
unsigned num ;
void __iomem * base ;
struct clk * clk ;
struct {
uint32_t spu_v_h_total ;
uint32_t spu_v_porch ;
uint32_t spu_adv_reg ;
} v [ 2 ] ;
bool interlaced ;
2013-05-19 10:55:17 +01:00
bool cursor_update ;
2012-08-15 13:59:49 +01:00
2013-05-19 10:55:17 +01:00
struct armada_gem_object * cursor_obj ;
int cursor_x ;
int cursor_y ;
uint32_t cursor_hw_pos ;
uint32_t cursor_hw_sz ;
uint32_t cursor_w ;
uint32_t cursor_h ;
2012-08-15 13:59:49 +01:00
uint32_t cfg_dumb_ctrl ;
uint32_t spu_iopad_ctrl ;
spinlock_t irq_lock ;
uint32_t irq_ena ;
2018-07-30 11:52:34 +01:00
2018-07-30 11:53:06 +01:00
bool update_pending ;
2018-07-30 11:52:34 +01:00
struct drm_pending_vblank_event * event ;
2018-07-30 11:52:34 +01:00
struct armada_regs atomic_regs [ 32 ] ;
struct armada_regs * regs ;
unsigned int regs_idx ;
2012-08-15 13:59:49 +01:00
} ;
# define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc)
void armada_drm_crtc_update_regs ( struct armada_crtc * , struct armada_regs * ) ;
2018-07-14 11:15:35 +01:00
struct armada_clocking_params {
unsigned long permillage_min ;
unsigned long permillage_max ;
u32 settable ;
u32 div_max ;
} ;
struct armada_clk_result {
unsigned long desired_clk_hz ;
struct clk * clk ;
u32 div ;
} ;
int armada_crtc_select_clock ( struct armada_crtc * dcrtc ,
struct armada_clk_result * res ,
const struct armada_clocking_params * params ,
struct clk * clks [ ] , size_t num_clks ,
unsigned long desired_khz ) ;
2014-04-22 11:10:15 +01:00
extern struct platform_driver armada_lcd_platform_driver ;
2012-08-15 13:59:49 +01:00
# endif