2013-06-19 15:54:11 +04:00
/*
* rcar_du_crtc . h - - R - Car Display Unit CRTCs
*
2016-11-11 20:07:39 +03:00
* Copyright ( C ) 2013 - 2015 Renesas Electronics Corporation
2013-06-19 15:54:11 +04:00
*
* Contact : Laurent Pinchart ( laurent . pinchart @ ideasonboard . com )
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
# ifndef __RCAR_DU_CRTC_H__
# define __RCAR_DU_CRTC_H__
# include <linux/mutex.h>
2017-07-29 02:31:33 +03:00
# include <linux/spinlock.h>
2015-02-18 14:21:56 +03:00
# include <linux/wait.h>
2013-06-19 15:54:11 +04:00
# include <drm/drmP.h>
# include <drm/drm_crtc.h>
2017-12-01 14:59:55 +03:00
# include <media/vsp1.h>
2013-06-16 23:01:02 +04:00
struct rcar_du_group ;
2015-09-07 17:14:58 +03:00
struct rcar_du_vsp ;
2013-06-19 15:54:11 +04:00
2015-04-29 01:11:57 +03:00
/**
* struct rcar_du_crtc - the CRTC , representing a DU superposition processor
* @ crtc : base DRM CRTC
* @ clock : the CRTC functional clock
* @ extclock : external pixel dot clock ( optional )
* @ mmio_offset : offset of the CRTC registers in the DU MMIO block
* @ index : CRTC software and hardware index
2017-06-27 13:18:38 +03:00
* @ initialized : whether the CRTC has been initialized and clocks enabled
2017-06-30 15:14:11 +03:00
* @ vblank_enable : whether vblank events are enabled on this CRTC
2015-04-29 01:11:57 +03:00
* @ event : event to post when the pending page flip completes
* @ flip_wait : wait queue used to signal page flip completion
2017-07-29 02:31:33 +03:00
* @ vblank_lock : protects vblank_wait and vblank_count
* @ vblank_wait : wait queue used to signal vertical blanking
* @ vblank_count : number of vertical blanking interrupts to wait for
2015-04-29 01:11:57 +03:00
* @ outputs : bitmask of the outputs ( enum rcar_du_output ) driven by this CRTC
* @ group : CRTC group this CRTC belongs to
2017-06-26 13:12:01 +03:00
* @ vsp : VSP feeding video to this CRTC
* @ vsp_pipe : index of the VSP pipeline feeding video to this CRTC
2015-04-29 01:11:57 +03:00
*/
2013-06-19 15:54:11 +04:00
struct rcar_du_crtc {
struct drm_crtc crtc ;
2013-06-14 16:15:01 +04:00
struct clk * clock ;
2014-12-09 01:24:49 +03:00
struct clk * extclock ;
2013-06-19 15:54:11 +04:00
unsigned int mmio_offset ;
unsigned int index ;
2017-06-27 13:18:38 +03:00
bool initialized ;
2013-06-19 15:54:11 +04:00
2017-06-30 15:14:11 +03:00
bool vblank_enable ;
2013-06-19 15:54:11 +04:00
struct drm_pending_vblank_event * event ;
2015-02-18 14:21:56 +03:00
wait_queue_head_t flip_wait ;
2017-07-29 02:31:33 +03:00
spinlock_t vblank_lock ;
wait_queue_head_t vblank_wait ;
unsigned int vblank_count ;
2013-06-19 15:54:11 +04:00
unsigned int outputs ;
2013-06-16 23:01:02 +04:00
struct rcar_du_group * group ;
2015-09-07 17:14:58 +03:00
struct rcar_du_vsp * vsp ;
2017-06-26 13:12:01 +03:00
unsigned int vsp_pipe ;
2018-08-08 18:26:30 +03:00
const char * const * sources ;
unsigned int sources_count ;
2013-06-19 15:54:11 +04:00
} ;
2013-06-17 15:48:27 +04:00
# define to_rcar_crtc(c) container_of(c, struct rcar_du_crtc, crtc)
2017-12-01 14:59:55 +03:00
/**
* struct rcar_du_crtc_state - Driver - specific CRTC state
* @ state : base DRM CRTC state
* @ crc : CRC computation configuration
*/
struct rcar_du_crtc_state {
struct drm_crtc_state state ;
struct vsp1_du_crc_config crc ;
} ;
# define to_rcar_crtc_state(s) container_of(s, struct rcar_du_crtc_state, state)
2014-09-17 03:07:52 +04:00
enum rcar_du_output {
RCAR_DU_OUTPUT_DPAD0 ,
RCAR_DU_OUTPUT_DPAD1 ,
RCAR_DU_OUTPUT_LVDS0 ,
RCAR_DU_OUTPUT_LVDS1 ,
2016-11-11 20:07:39 +03:00
RCAR_DU_OUTPUT_HDMI0 ,
RCAR_DU_OUTPUT_HDMI1 ,
2014-09-17 03:07:52 +04:00
RCAR_DU_OUTPUT_TCON ,
RCAR_DU_OUTPUT_MAX ,
} ;
2018-04-28 01:21:52 +03:00
int rcar_du_crtc_create ( struct rcar_du_group * rgrp , unsigned int swindex ,
unsigned int hwindex ) ;
2013-06-19 15:54:11 +04:00
void rcar_du_crtc_suspend ( struct rcar_du_crtc * rcrtc ) ;
void rcar_du_crtc_resume ( struct rcar_du_crtc * rcrtc ) ;
2013-06-17 05:13:11 +04:00
void rcar_du_crtc_route_output ( struct drm_crtc * crtc ,
enum rcar_du_output output ) ;
2017-03-04 05:01:19 +03:00
void rcar_du_crtc_finish_page_flip ( struct rcar_du_crtc * rcrtc ) ;
2013-06-19 15:54:11 +04:00
# endif /* __RCAR_DU_CRTC_H__ */