2013-06-19 13:54:11 +02:00
/*
* rcar_du_crtc . h - - R - Car Display Unit CRTCs
*
2016-11-11 18:07:39 +01:00
* Copyright ( C ) 2013 - 2015 Renesas Electronics Corporation
2013-06-19 13:54:11 +02: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 13:21:56 +02:00
# include <linux/wait.h>
2013-06-19 13:54:11 +02:00
# include <drm/drmP.h>
# include <drm/drm_crtc.h>
2013-06-16 21:01:02 +02:00
struct rcar_du_group ;
2015-09-07 17:14:58 +03:00
struct rcar_du_vsp ;
2013-06-19 13:54:11 +02: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
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 13:54:11 +02:00
struct rcar_du_crtc {
struct drm_crtc crtc ;
2013-06-14 14:15:01 +02:00
struct clk * clock ;
2014-12-09 00:24:49 +02:00
struct clk * extclock ;
2013-06-19 13:54:11 +02:00
unsigned int mmio_offset ;
unsigned int index ;
2017-06-27 13:18:38 +03:00
bool initialized ;
2013-06-19 13:54:11 +02:00
struct drm_pending_vblank_event * event ;
2015-02-18 13:21:56 +02: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 13:54:11 +02:00
unsigned int outputs ;
2013-06-16 21:01:02 +02: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 ;
2013-06-19 13:54:11 +02:00
} ;
2013-06-17 13:48:27 +02:00
# define to_rcar_crtc(c) container_of(c, struct rcar_du_crtc, crtc)
2014-09-17 02:07:52 +03:00
enum rcar_du_output {
RCAR_DU_OUTPUT_DPAD0 ,
RCAR_DU_OUTPUT_DPAD1 ,
RCAR_DU_OUTPUT_LVDS0 ,
RCAR_DU_OUTPUT_LVDS1 ,
2016-11-11 18:07:39 +01:00
RCAR_DU_OUTPUT_HDMI0 ,
RCAR_DU_OUTPUT_HDMI1 ,
2014-09-17 02:07:52 +03:00
RCAR_DU_OUTPUT_TCON ,
RCAR_DU_OUTPUT_MAX ,
} ;
2013-06-16 21:01:02 +02:00
int rcar_du_crtc_create ( struct rcar_du_group * rgrp , unsigned int index ) ;
2013-06-19 13:54:11 +02:00
void rcar_du_crtc_suspend ( struct rcar_du_crtc * rcrtc ) ;
void rcar_du_crtc_resume ( struct rcar_du_crtc * rcrtc ) ;
2013-06-17 03:13:11 +02:00
void rcar_du_crtc_route_output ( struct drm_crtc * crtc ,
enum rcar_du_output output ) ;
2017-03-04 02:01:19 +00:00
void rcar_du_crtc_finish_page_flip ( struct rcar_du_crtc * rcrtc ) ;
2013-06-19 13:54:11 +02:00
# endif /* __RCAR_DU_CRTC_H__ */