2012-08-15 13:59:49 +01:00
/*
* Copyright ( C ) 2012 Russell King
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef ARMADA_CRTC_H
# define ARMADA_CRTC_H
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 ;
struct armada_plane ;
2014-04-22 15:24:03 +01:00
struct armada_variant ;
2012-08-15 13:59:49 +01:00
2015-08-06 16:37:18 +01:00
struct armada_plane_work {
void ( * fn ) ( struct armada_crtc * ,
struct armada_plane * ,
struct armada_plane_work * ) ;
} ;
2016-08-16 22:09:08 +01:00
struct armada_plane_state {
u32 src_hw ;
u32 dst_hw ;
u32 dst_yx ;
u32 ctrl0 ;
} ;
2015-07-15 18:11:24 +01:00
struct armada_plane {
struct drm_plane base ;
2015-07-15 18:11:25 +01:00
wait_queue_head_t frame_wait ;
2015-08-06 16:37:18 +01:00
struct armada_plane_work * work ;
2016-08-16 22:09:08 +01:00
struct armada_plane_state state ;
2015-07-15 18:11:24 +01:00
} ;
# define drm_to_armada_plane(p) container_of(p, struct armada_plane, base)
2015-07-15 18:11:25 +01:00
int armada_drm_plane_init ( struct armada_plane * plane ) ;
2015-08-06 16:37:18 +01:00
int armada_drm_plane_work_queue ( struct armada_crtc * dcrtc ,
struct armada_plane * plane , struct armada_plane_work * work ) ;
int armada_drm_plane_work_wait ( struct armada_plane * plane , long timeout ) ;
2015-08-07 09:33:05 +01:00
struct armada_plane_work * armada_drm_plane_work_cancel (
struct armada_crtc * dcrtc , struct armada_plane * plane ) ;
2016-08-16 22:09:11 +01:00
void armada_drm_plane_calc_addrs ( u32 * addrs , struct drm_framebuffer * fb ,
int x , int y ) ;
2015-07-15 18:11:25 +01:00
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 ;
2012-08-15 13:59:49 +01:00
unsigned num ;
void __iomem * base ;
struct clk * clk ;
2014-04-22 15:21:30 +01:00
struct clk * extclk [ 2 ] ;
2012-08-15 13:59:49 +01:00
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
uint8_t csc_yuv_mode ;
uint8_t csc_rgb_mode ;
struct drm_plane * plane ;
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
int dpms ;
uint32_t cfg_dumb_ctrl ;
uint32_t dumb_ctrl ;
uint32_t spu_iopad_ctrl ;
spinlock_t irq_lock ;
uint32_t irq_ena ;
} ;
# define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc)
void armada_drm_crtc_gamma_set ( struct drm_crtc * , u16 , u16 , u16 , int ) ;
void armada_drm_crtc_gamma_get ( struct drm_crtc * , u16 * , u16 * , u16 * , int ) ;
void armada_drm_crtc_update_regs ( struct armada_crtc * , struct armada_regs * ) ;
2015-07-15 18:11:25 +01:00
void armada_drm_crtc_plane_disable ( struct armada_crtc * dcrtc ,
struct drm_plane * plane ) ;
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