2019-05-30 02:57:49 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2011-11-03 22:22:15 +04:00
/*
* Copyright ( c ) 2009 - 2011 , Intel Corporation .
*/
# ifndef __INTEL_DRV_H__
# define __INTEL_DRV_H__
# include <linux/i2c.h>
# include <linux/i2c-algo-bit.h>
# include <drm/drm_crtc.h>
# include <drm/drm_crtc_helper.h>
2016-11-28 21:51:09 +03:00
# include <drm/drm_encoder.h>
2019-01-18 00:03:34 +03:00
# include <drm/drm_probe_helper.h>
2019-11-06 12:44:00 +03:00
# include <drm/drm_vblank.h>
2011-11-03 22:22:15 +04:00
# include <linux/gpio.h>
2013-06-30 23:39:00 +04:00
# include "gma_display.h"
2011-11-03 22:22:15 +04:00
/*
* Display related stuff
*/
/* maximum connectors per crtcs in the mode set */
# define INTELFB_CONN_LIMIT 4
2011-12-20 01:41:10 +04:00
/* Intel Pipe Clone Bit */
# define INTEL_HDMIB_CLONE_BIT 1
# define INTEL_HDMIC_CLONE_BIT 2
# define INTEL_HDMID_CLONE_BIT 3
# define INTEL_HDMIE_CLONE_BIT 4
# define INTEL_HDMIF_CLONE_BIT 5
# define INTEL_SDVO_NON_TV_CLONE_BIT 6
# define INTEL_SDVO_TV_CLONE_BIT 7
# define INTEL_SDVO_LVDS_CLONE_BIT 8
# define INTEL_ANALOG_CLONE_BIT 9
# define INTEL_TV_CLONE_BIT 10
# define INTEL_DP_B_CLONE_BIT 11
# define INTEL_DP_C_CLONE_BIT 12
# define INTEL_DP_D_CLONE_BIT 13
# define INTEL_LVDS_CLONE_BIT 14
# define INTEL_DVO_TMDS_CLONE_BIT 15
# define INTEL_DVO_LVDS_CLONE_BIT 16
# define INTEL_EDP_CLONE_BIT 17
2011-11-03 22:22:15 +04:00
/* these are outputs from the chip - integrated only
* external chips are via DVO or SDVO output */
# define INTEL_OUTPUT_UNUSED 0
# define INTEL_OUTPUT_ANALOG 1
# define INTEL_OUTPUT_DVO 2
# define INTEL_OUTPUT_SDVO 3
# define INTEL_OUTPUT_LVDS 4
# define INTEL_OUTPUT_TVOUT 5
# define INTEL_OUTPUT_HDMI 6
# define INTEL_OUTPUT_MIPI 7
# define INTEL_OUTPUT_MIPI2 8
2012-08-08 17:54:15 +04:00
# define INTEL_OUTPUT_DISPLAYPORT 9
# define INTEL_OUTPUT_EDP 10
2011-11-03 22:22:15 +04:00
2011-12-20 01:41:10 +04:00
# define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0)
# define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT)
static inline void
psb_intel_mode_set_pixel_multiplier ( struct drm_display_mode * mode ,
int multiplier )
{
mode - > clock * = multiplier ;
mode - > private_flags | = multiplier ;
}
static inline int
psb_intel_mode_get_pixel_multiplier ( const struct drm_display_mode * mode )
{
return ( mode - > private_flags & INTEL_MODE_PIXEL_MULTIPLIER_MASK )
> > INTEL_MODE_PIXEL_MULTIPLIER_SHIFT ;
}
2011-11-03 22:22:15 +04:00
/*
* Hold information useally put on the device driver privates here ,
* since it needs to be shared across multiple of devices drivers privates .
*/
struct psb_intel_mode_device {
/*
* Abstracted memory manager operations
*/
size_t ( * bo_offset ) ( struct drm_device * dev , void * bo ) ;
/*
* LVDS info
*/
int backlight_duty_cycle ; /* restore backlight to this value */
bool panel_wants_dither ;
struct drm_display_mode * panel_fixed_mode ;
struct drm_display_mode * panel_fixed_mode2 ;
struct drm_display_mode * vbt_mode ; /* if any */
uint32_t saveBLC_PWM_CTL ;
} ;
struct psb_intel_i2c_chan {
/* for getting at dev. private (mmio etc.) */
struct drm_device * drm_dev ;
u32 reg ; /* GPIO reg */
struct i2c_adapter adapter ;
struct i2c_algo_bit_data algo ;
u8 slave_addr ;
} ;
2013-07-22 19:45:26 +04:00
struct gma_encoder {
2011-12-20 01:39:53 +04:00
struct drm_encoder base ;
2011-11-03 22:22:15 +04:00
int type ;
2011-12-20 01:39:53 +04:00
bool needs_tv_clock ;
2013-07-22 19:45:26 +04:00
void ( * hot_plug ) ( struct gma_encoder * ) ;
2011-12-20 01:39:53 +04:00
int crtc_mask ;
int clone_mask ;
2012-08-08 17:53:48 +04:00
u32 ddi_select ; /* Channel info */
# define DDI0_SELECT 0x01
# define DDI1_SELECT 0x02
2012-08-08 17:54:41 +04:00
# define DP_MASK 0x8000
2012-08-08 17:53:48 +04:00
# define DDI_MASK 0x03
2011-12-20 01:39:53 +04:00
void * dev_priv ; /* For sdvo_priv, lvds_priv, etc... */
2011-12-20 01:41:22 +04:00
/* FIXME: Either make SDVO and LVDS store it's i2c here or give CDV it's
own set of output privates */
struct psb_intel_i2c_chan * i2c_bus ;
struct psb_intel_i2c_chan * ddc_bus ;
2011-12-20 01:39:53 +04:00
} ;
2011-11-03 22:22:15 +04:00
2013-07-22 19:05:25 +04:00
struct gma_connector {
2011-12-20 01:39:53 +04:00
struct drm_connector base ;
2013-07-22 19:45:26 +04:00
struct gma_encoder * encoder ;
2015-12-04 11:45:53 +03:00
void ( * save ) ( struct drm_connector * connector ) ;
void ( * restore ) ( struct drm_connector * connector ) ;
2011-11-03 22:22:15 +04:00
} ;
struct psb_intel_crtc_state {
uint32_t saveDSPCNTR ;
uint32_t savePIPECONF ;
uint32_t savePIPESRC ;
uint32_t saveDPLL ;
uint32_t saveFP0 ;
uint32_t saveFP1 ;
uint32_t saveHTOTAL ;
uint32_t saveHBLANK ;
uint32_t saveHSYNC ;
uint32_t saveVTOTAL ;
uint32_t saveVBLANK ;
uint32_t saveVSYNC ;
uint32_t saveDSPSTRIDE ;
uint32_t saveDSPSIZE ;
uint32_t saveDSPPOS ;
uint32_t saveDSPBASE ;
uint32_t savePalette [ 256 ] ;
} ;
2013-07-22 03:31:23 +04:00
struct gma_crtc {
2011-11-03 22:22:15 +04:00
struct drm_crtc base ;
int pipe ;
int plane ;
uint32_t cursor_addr ;
2012-05-21 18:27:30 +04:00
struct gtt_range * cursor_gt ;
2011-11-03 22:22:15 +04:00
u8 lut_adj [ 256 ] ;
struct psb_intel_framebuffer * fbdev_fb ;
/* a mode_set for fbdev users on this crtc */
struct drm_mode_set mode_set ;
/* GEM object that holds our cursor */
struct drm_gem_object * cursor_obj ;
struct drm_display_mode saved_mode ;
struct drm_display_mode saved_adjusted_mode ;
struct psb_intel_mode_device * mode_dev ;
/*crtc mode setting flags*/
u32 mode_flags ;
2012-04-25 17:36:48 +04:00
bool active ;
2011-11-03 22:22:15 +04:00
/* Saved Crtc HW states */
struct psb_intel_crtc_state * crtc_state ;
2013-06-30 23:39:00 +04:00
const struct gma_clock_funcs * clock_funcs ;
2019-11-06 12:44:00 +03:00
struct drm_pending_vblank_event * page_flip_event ;
2011-11-03 22:22:15 +04:00
} ;
2013-07-22 03:31:23 +04:00
# define to_gma_crtc(x) \
container_of ( x , struct gma_crtc , base )
2013-07-22 19:05:25 +04:00
# define to_gma_connector(x) \
container_of ( x , struct gma_connector , base )
2013-07-22 19:45:26 +04:00
# define to_gma_encoder(x) \
container_of ( x , struct gma_encoder , base )
2011-11-03 22:22:15 +04:00
# define to_psb_intel_framebuffer(x) \
container_of ( x , struct psb_intel_framebuffer , base )
struct psb_intel_i2c_chan * psb_intel_i2c_create ( struct drm_device * dev ,
const u32 reg , const char * name ) ;
void psb_intel_i2c_destroy ( struct psb_intel_i2c_chan * chan ) ;
2011-12-20 01:40:05 +04:00
int psb_intel_ddc_get_modes ( struct drm_connector * connector ,
struct i2c_adapter * adapter ) ;
extern bool psb_intel_ddc_probe ( struct i2c_adapter * adapter ) ;
2011-11-03 22:22:15 +04:00
extern void psb_intel_crtc_init ( struct drm_device * dev , int pipe ,
struct psb_intel_mode_device * mode_dev ) ;
extern void psb_intel_crt_init ( struct drm_device * dev ) ;
2011-12-20 01:41:10 +04:00
extern bool psb_intel_sdvo_init ( struct drm_device * dev , int output_device ) ;
2011-11-03 22:22:15 +04:00
extern void psb_intel_dvo_init ( struct drm_device * dev ) ;
extern void psb_intel_tv_init ( struct drm_device * dev ) ;
extern void psb_intel_lvds_init ( struct drm_device * dev ,
struct psb_intel_mode_device * mode_dev ) ;
extern void psb_intel_lvds_set_brightness ( struct drm_device * dev , int level ) ;
extern void oaktrail_lvds_init ( struct drm_device * dev ,
struct psb_intel_mode_device * mode_dev ) ;
extern void oaktrail_wait_for_INTR_PKT_SENT ( struct drm_device * dev ) ;
extern void oaktrail_dsi_init ( struct drm_device * dev ,
struct psb_intel_mode_device * mode_dev ) ;
2014-09-26 12:40:29 +04:00
extern void oaktrail_lvds_i2c_init ( struct drm_encoder * encoder ) ;
2011-11-03 22:22:15 +04:00
extern void mid_dsi_init ( struct drm_device * dev ,
struct psb_intel_mode_device * mode_dev , int dsi_num ) ;
2013-07-11 02:54:45 +04:00
extern struct drm_encoder * gma_best_encoder ( struct drm_connector * connector ) ;
2013-07-22 19:05:25 +04:00
extern void gma_connector_attach_encoder ( struct gma_connector * connector ,
2013-07-22 19:45:26 +04:00
struct gma_encoder * encoder ) ;
2013-07-11 02:54:45 +04:00
2013-07-22 19:45:26 +04:00
static inline struct gma_encoder * gma_attached_encoder (
2013-07-11 02:54:45 +04:00
struct drm_connector * connector )
{
2013-07-22 19:05:25 +04:00
return to_gma_connector ( connector ) - > encoder ;
2013-07-11 02:54:45 +04:00
}
2011-11-03 22:22:15 +04:00
extern struct drm_display_mode * psb_intel_crtc_mode_get ( struct drm_device * dev ,
struct drm_crtc * crtc ) ;
extern struct drm_crtc * psb_intel_get_crtc_from_pipe ( struct drm_device * dev ,
int pipe ) ;
extern struct drm_connector * psb_intel_sdvo_find ( struct drm_device * dev ,
int sdvoB ) ;
extern int psb_intel_sdvo_supports_hotplug ( struct drm_connector * connector ) ;
extern void psb_intel_sdvo_set_hotplug ( struct drm_connector * connector ,
int enable ) ;
extern int intelfb_probe ( struct drm_device * dev ) ;
extern int intelfb_remove ( struct drm_device * dev ,
struct drm_framebuffer * fb ) ;
extern bool psb_intel_lvds_mode_fixup ( struct drm_encoder * encoder ,
2012-07-17 19:56:50 +04:00
const struct drm_display_mode * mode ,
2011-11-03 22:22:15 +04:00
struct drm_display_mode * adjusted_mode ) ;
2018-04-24 16:14:57 +03:00
extern enum drm_mode_status psb_intel_lvds_mode_valid ( struct drm_connector * connector ,
2011-11-03 22:22:15 +04:00
struct drm_display_mode * mode ) ;
extern int psb_intel_lvds_set_property ( struct drm_connector * connector ,
struct drm_property * property ,
uint64_t value ) ;
extern void psb_intel_lvds_destroy ( struct drm_connector * connector ) ;
extern const struct drm_encoder_funcs psb_intel_lvds_enc_funcs ;
2011-12-20 01:40:58 +04:00
/* intel_gmbus.c */
extern void gma_intel_i2c_reset ( struct drm_device * dev ) ;
extern int gma_intel_setup_gmbus ( struct drm_device * dev ) ;
extern void gma_intel_gmbus_set_speed ( struct i2c_adapter * adapter , int speed ) ;
extern void gma_intel_gmbus_force_bit ( struct i2c_adapter * adapter , bool force_bit ) ;
extern void gma_intel_teardown_gmbus ( struct drm_device * dev ) ;
2011-11-03 22:22:15 +04:00
2012-08-08 17:55:03 +04:00
/* DP support */
extern void cdv_intel_dp_init ( struct drm_device * dev , struct psb_intel_mode_device * mode_dev , int output_reg ) ;
2012-08-24 07:53:49 +04:00
extern void cdv_intel_dp_set_m_n ( struct drm_crtc * crtc ,
2012-08-08 17:55:03 +04:00
struct drm_display_mode * mode ,
struct drm_display_mode * adjusted_mode ) ;
extern void psb_intel_attach_force_audio_property ( struct drm_connector * connector ) ;
extern void psb_intel_attach_broadcast_rgb_property ( struct drm_connector * connector ) ;
extern int cdv_sb_read ( struct drm_device * dev , u32 reg , u32 * val ) ;
extern int cdv_sb_write ( struct drm_device * dev , u32 reg , u32 val ) ;
extern void cdv_sb_reset ( struct drm_device * dev ) ;
extern void cdv_intel_attach_force_audio_property ( struct drm_connector * connector ) ;
extern void cdv_intel_attach_broadcast_rgb_property ( struct drm_connector * connector ) ;
2011-11-03 22:22:15 +04:00
# endif /* __INTEL_DRV_H__ */