1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2018 Texas Instruments Incorporated - https://www.ti.com/ 4*4882a593Smuzhiyun * Author: Tomi Valkeinen <tomi.valkeinen@ti.com> 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef __TIDSS_DISPC_H__ 8*4882a593Smuzhiyun #define __TIDSS_DISPC_H__ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include "tidss_drv.h" 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun struct dispc_device; 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun struct drm_crtc_state; 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun enum tidss_gamma_type { TIDSS_GAMMA_8BIT, TIDSS_GAMMA_10BIT }; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun struct tidss_vp_feat { 19*4882a593Smuzhiyun struct tidss_vp_color_feat { 20*4882a593Smuzhiyun u32 gamma_size; 21*4882a593Smuzhiyun enum tidss_gamma_type gamma_type; 22*4882a593Smuzhiyun bool has_ctm; 23*4882a593Smuzhiyun } color; 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct tidss_plane_feat { 27*4882a593Smuzhiyun struct tidss_plane_color_feat { 28*4882a593Smuzhiyun u32 encodings; 29*4882a593Smuzhiyun u32 ranges; 30*4882a593Smuzhiyun enum drm_color_encoding default_encoding; 31*4882a593Smuzhiyun enum drm_color_range default_range; 32*4882a593Smuzhiyun } color; 33*4882a593Smuzhiyun struct tidss_plane_blend_feat { 34*4882a593Smuzhiyun bool global_alpha; 35*4882a593Smuzhiyun } blend; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct dispc_features_scaling { 39*4882a593Smuzhiyun u32 in_width_max_5tap_rgb; 40*4882a593Smuzhiyun u32 in_width_max_3tap_rgb; 41*4882a593Smuzhiyun u32 in_width_max_5tap_yuv; 42*4882a593Smuzhiyun u32 in_width_max_3tap_yuv; 43*4882a593Smuzhiyun u32 upscale_limit; 44*4882a593Smuzhiyun u32 downscale_limit_5tap; 45*4882a593Smuzhiyun u32 downscale_limit_3tap; 46*4882a593Smuzhiyun u32 xinc_max; 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct dispc_errata { 50*4882a593Smuzhiyun bool i2000; /* DSS Does Not Support YUV Pixel Data Formats */ 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun enum dispc_vp_bus_type { 54*4882a593Smuzhiyun DISPC_VP_DPI, /* DPI output */ 55*4882a593Smuzhiyun DISPC_VP_OLDI, /* OLDI (LVDS) output */ 56*4882a593Smuzhiyun DISPC_VP_INTERNAL, /* SoC internal routing */ 57*4882a593Smuzhiyun DISPC_VP_MAX_BUS_TYPE, 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun enum dispc_dss_subrevision { 61*4882a593Smuzhiyun DISPC_K2G, 62*4882a593Smuzhiyun DISPC_AM65X, 63*4882a593Smuzhiyun DISPC_J721E, 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct dispc_features { 67*4882a593Smuzhiyun int min_pclk_khz; 68*4882a593Smuzhiyun int max_pclk_khz[DISPC_VP_MAX_BUS_TYPE]; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct dispc_features_scaling scaling; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun enum dispc_dss_subrevision subrev; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun const char *common; 75*4882a593Smuzhiyun const u16 *common_regs; 76*4882a593Smuzhiyun u32 num_vps; 77*4882a593Smuzhiyun const char *vp_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */ 78*4882a593Smuzhiyun const char *ovr_name[TIDSS_MAX_PORTS]; /* Should match dt reg names */ 79*4882a593Smuzhiyun const char *vpclk_name[TIDSS_MAX_PORTS]; /* Should match dt clk names */ 80*4882a593Smuzhiyun const enum dispc_vp_bus_type vp_bus_type[TIDSS_MAX_PORTS]; 81*4882a593Smuzhiyun struct tidss_vp_feat vp_feat; 82*4882a593Smuzhiyun u32 num_planes; 83*4882a593Smuzhiyun const char *vid_name[TIDSS_MAX_PLANES]; /* Should match dt reg names */ 84*4882a593Smuzhiyun bool vid_lite[TIDSS_MAX_PLANES]; 85*4882a593Smuzhiyun u32 vid_order[TIDSS_MAX_PLANES]; 86*4882a593Smuzhiyun }; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun extern const struct dispc_features dispc_k2g_feats; 89*4882a593Smuzhiyun extern const struct dispc_features dispc_am65x_feats; 90*4882a593Smuzhiyun extern const struct dispc_features dispc_j721e_feats; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun void dispc_set_irqenable(struct dispc_device *dispc, dispc_irq_t mask); 93*4882a593Smuzhiyun dispc_irq_t dispc_read_and_clear_irqstatus(struct dispc_device *dispc); 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun void dispc_ovr_set_plane(struct dispc_device *dispc, u32 hw_plane, 96*4882a593Smuzhiyun u32 hw_videoport, u32 x, u32 y, u32 layer); 97*4882a593Smuzhiyun void dispc_ovr_enable_layer(struct dispc_device *dispc, 98*4882a593Smuzhiyun u32 hw_videoport, u32 layer, bool enable); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun void dispc_vp_prepare(struct dispc_device *dispc, u32 hw_videoport, 101*4882a593Smuzhiyun const struct drm_crtc_state *state); 102*4882a593Smuzhiyun void dispc_vp_enable(struct dispc_device *dispc, u32 hw_videoport, 103*4882a593Smuzhiyun const struct drm_crtc_state *state); 104*4882a593Smuzhiyun void dispc_vp_disable(struct dispc_device *dispc, u32 hw_videoport); 105*4882a593Smuzhiyun void dispc_vp_unprepare(struct dispc_device *dispc, u32 hw_videoport); 106*4882a593Smuzhiyun bool dispc_vp_go_busy(struct dispc_device *dispc, u32 hw_videoport); 107*4882a593Smuzhiyun void dispc_vp_go(struct dispc_device *dispc, u32 hw_videoport); 108*4882a593Smuzhiyun int dispc_vp_bus_check(struct dispc_device *dispc, u32 hw_videoport, 109*4882a593Smuzhiyun const struct drm_crtc_state *state); 110*4882a593Smuzhiyun enum drm_mode_status dispc_vp_mode_valid(struct dispc_device *dispc, 111*4882a593Smuzhiyun u32 hw_videoport, 112*4882a593Smuzhiyun const struct drm_display_mode *mode); 113*4882a593Smuzhiyun int dispc_vp_enable_clk(struct dispc_device *dispc, u32 hw_videoport); 114*4882a593Smuzhiyun void dispc_vp_disable_clk(struct dispc_device *dispc, u32 hw_videoport); 115*4882a593Smuzhiyun int dispc_vp_set_clk_rate(struct dispc_device *dispc, u32 hw_videoport, 116*4882a593Smuzhiyun unsigned long rate); 117*4882a593Smuzhiyun void dispc_vp_setup(struct dispc_device *dispc, u32 hw_videoport, 118*4882a593Smuzhiyun const struct drm_crtc_state *state, bool newmodeset); 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun int dispc_runtime_suspend(struct dispc_device *dispc); 121*4882a593Smuzhiyun int dispc_runtime_resume(struct dispc_device *dispc); 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun int dispc_plane_check(struct dispc_device *dispc, u32 hw_plane, 124*4882a593Smuzhiyun const struct drm_plane_state *state, 125*4882a593Smuzhiyun u32 hw_videoport); 126*4882a593Smuzhiyun int dispc_plane_setup(struct dispc_device *dispc, u32 hw_plane, 127*4882a593Smuzhiyun const struct drm_plane_state *state, 128*4882a593Smuzhiyun u32 hw_videoport); 129*4882a593Smuzhiyun int dispc_plane_enable(struct dispc_device *dispc, u32 hw_plane, bool enable); 130*4882a593Smuzhiyun const u32 *dispc_plane_formats(struct dispc_device *dispc, unsigned int *len); 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun int dispc_init(struct tidss_device *tidss); 133*4882a593Smuzhiyun void dispc_remove(struct tidss_device *tidss); 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #endif 136