2012-08-15 16:59:49 +04: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 18:37:18 +03:00
struct armada_crtc ;
struct armada_plane ;
2014-04-22 18:24:03 +04:00
struct armada_variant ;
2012-08-15 16:59:49 +04:00
2015-08-06 18:37:18 +03:00
struct armada_plane_work {
void ( * fn ) ( struct armada_crtc * ,
struct armada_plane * ,
struct armada_plane_work * ) ;
} ;
2015-07-15 20:11:24 +03:00
struct armada_plane {
struct drm_plane base ;
2015-07-15 20:11:25 +03:00
wait_queue_head_t frame_wait ;
2015-08-06 18:37:18 +03:00
struct armada_plane_work * work ;
2015-07-15 20:11:24 +03:00
} ;
# define drm_to_armada_plane(p) container_of(p, struct armada_plane, base)
2015-07-15 20:11:25 +03:00
int armada_drm_plane_init ( struct armada_plane * plane ) ;
2015-08-06 18:37:18 +03: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 11:33:05 +03:00
struct armada_plane_work * armada_drm_plane_work_cancel (
struct armada_crtc * dcrtc , struct armada_plane * plane ) ;
2015-07-15 20:11:25 +03:00
2012-08-15 16:59:49 +04:00
struct armada_crtc {
struct drm_crtc crtc ;
2014-04-22 18:24:03 +04:00
const struct armada_variant * variant ;
2012-08-15 16:59:49 +04:00
unsigned num ;
void __iomem * base ;
struct clk * clk ;
2014-04-22 18:21:30 +04:00
struct clk * extclk [ 2 ] ;
2012-08-15 16:59:49 +04: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 13:55:17 +04:00
bool cursor_update ;
2012-08-15 16:59:49 +04:00
uint8_t csc_yuv_mode ;
uint8_t csc_rgb_mode ;
struct drm_plane * plane ;
2013-05-19 13:55:17 +04: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 16:59:49 +04: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_disable_irq ( struct armada_crtc * , u32 ) ;
void armada_drm_crtc_enable_irq ( struct armada_crtc * , u32 ) ;
void armada_drm_crtc_update_regs ( struct armada_crtc * , struct armada_regs * ) ;
2015-07-15 20:11:25 +03:00
void armada_drm_crtc_plane_disable ( struct armada_crtc * dcrtc ,
struct drm_plane * plane ) ;
2014-04-22 14:10:15 +04:00
extern struct platform_driver armada_lcd_platform_driver ;
2012-08-15 16:59:49 +04:00
# endif