162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2016 Texas Instruments, Inc. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __OMAPFB_DSS_H 762306a36Sopenharmony_ci#define __OMAPFB_DSS_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/list.h> 1062306a36Sopenharmony_ci#include <linux/kobject.h> 1162306a36Sopenharmony_ci#include <linux/device.h> 1262306a36Sopenharmony_ci#include <linux/interrupt.h> 1362306a36Sopenharmony_ci#include <linux/platform_data/omapdss.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <video/videomode.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define DISPC_IRQ_FRAMEDONE (1 << 0) 1862306a36Sopenharmony_ci#define DISPC_IRQ_VSYNC (1 << 1) 1962306a36Sopenharmony_ci#define DISPC_IRQ_EVSYNC_EVEN (1 << 2) 2062306a36Sopenharmony_ci#define DISPC_IRQ_EVSYNC_ODD (1 << 3) 2162306a36Sopenharmony_ci#define DISPC_IRQ_ACBIAS_COUNT_STAT (1 << 4) 2262306a36Sopenharmony_ci#define DISPC_IRQ_PROG_LINE_NUM (1 << 5) 2362306a36Sopenharmony_ci#define DISPC_IRQ_GFX_FIFO_UNDERFLOW (1 << 6) 2462306a36Sopenharmony_ci#define DISPC_IRQ_GFX_END_WIN (1 << 7) 2562306a36Sopenharmony_ci#define DISPC_IRQ_PAL_GAMMA_MASK (1 << 8) 2662306a36Sopenharmony_ci#define DISPC_IRQ_OCP_ERR (1 << 9) 2762306a36Sopenharmony_ci#define DISPC_IRQ_VID1_FIFO_UNDERFLOW (1 << 10) 2862306a36Sopenharmony_ci#define DISPC_IRQ_VID1_END_WIN (1 << 11) 2962306a36Sopenharmony_ci#define DISPC_IRQ_VID2_FIFO_UNDERFLOW (1 << 12) 3062306a36Sopenharmony_ci#define DISPC_IRQ_VID2_END_WIN (1 << 13) 3162306a36Sopenharmony_ci#define DISPC_IRQ_SYNC_LOST (1 << 14) 3262306a36Sopenharmony_ci#define DISPC_IRQ_SYNC_LOST_DIGIT (1 << 15) 3362306a36Sopenharmony_ci#define DISPC_IRQ_WAKEUP (1 << 16) 3462306a36Sopenharmony_ci#define DISPC_IRQ_SYNC_LOST2 (1 << 17) 3562306a36Sopenharmony_ci#define DISPC_IRQ_VSYNC2 (1 << 18) 3662306a36Sopenharmony_ci#define DISPC_IRQ_VID3_END_WIN (1 << 19) 3762306a36Sopenharmony_ci#define DISPC_IRQ_VID3_FIFO_UNDERFLOW (1 << 20) 3862306a36Sopenharmony_ci#define DISPC_IRQ_ACBIAS_COUNT_STAT2 (1 << 21) 3962306a36Sopenharmony_ci#define DISPC_IRQ_FRAMEDONE2 (1 << 22) 4062306a36Sopenharmony_ci#define DISPC_IRQ_FRAMEDONEWB (1 << 23) 4162306a36Sopenharmony_ci#define DISPC_IRQ_FRAMEDONETV (1 << 24) 4262306a36Sopenharmony_ci#define DISPC_IRQ_WBBUFFEROVERFLOW (1 << 25) 4362306a36Sopenharmony_ci#define DISPC_IRQ_WBUNCOMPLETEERROR (1 << 26) 4462306a36Sopenharmony_ci#define DISPC_IRQ_SYNC_LOST3 (1 << 27) 4562306a36Sopenharmony_ci#define DISPC_IRQ_VSYNC3 (1 << 28) 4662306a36Sopenharmony_ci#define DISPC_IRQ_ACBIAS_COUNT_STAT3 (1 << 29) 4762306a36Sopenharmony_ci#define DISPC_IRQ_FRAMEDONE3 (1 << 30) 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct omap_dss_device; 5062306a36Sopenharmony_cistruct omap_overlay_manager; 5162306a36Sopenharmony_cistruct dss_lcd_mgr_config; 5262306a36Sopenharmony_cistruct snd_aes_iec958; 5362306a36Sopenharmony_cistruct snd_cea_861_aud_if; 5462306a36Sopenharmony_cistruct hdmi_avi_infoframe; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cienum omap_display_type { 5762306a36Sopenharmony_ci OMAP_DISPLAY_TYPE_NONE = 0, 5862306a36Sopenharmony_ci OMAP_DISPLAY_TYPE_DPI = 1 << 0, 5962306a36Sopenharmony_ci OMAP_DISPLAY_TYPE_DBI = 1 << 1, 6062306a36Sopenharmony_ci OMAP_DISPLAY_TYPE_SDI = 1 << 2, 6162306a36Sopenharmony_ci OMAP_DISPLAY_TYPE_DSI = 1 << 3, 6262306a36Sopenharmony_ci OMAP_DISPLAY_TYPE_VENC = 1 << 4, 6362306a36Sopenharmony_ci OMAP_DISPLAY_TYPE_HDMI = 1 << 5, 6462306a36Sopenharmony_ci OMAP_DISPLAY_TYPE_DVI = 1 << 6, 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cienum omap_plane { 6862306a36Sopenharmony_ci OMAP_DSS_GFX = 0, 6962306a36Sopenharmony_ci OMAP_DSS_VIDEO1 = 1, 7062306a36Sopenharmony_ci OMAP_DSS_VIDEO2 = 2, 7162306a36Sopenharmony_ci OMAP_DSS_VIDEO3 = 3, 7262306a36Sopenharmony_ci OMAP_DSS_WB = 4, 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cienum omap_channel { 7662306a36Sopenharmony_ci OMAP_DSS_CHANNEL_LCD = 0, 7762306a36Sopenharmony_ci OMAP_DSS_CHANNEL_DIGIT = 1, 7862306a36Sopenharmony_ci OMAP_DSS_CHANNEL_LCD2 = 2, 7962306a36Sopenharmony_ci OMAP_DSS_CHANNEL_LCD3 = 3, 8062306a36Sopenharmony_ci OMAP_DSS_CHANNEL_WB = 4, 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cienum omap_color_mode { 8462306a36Sopenharmony_ci OMAP_DSS_COLOR_CLUT1 = 1 << 0, /* BITMAP 1 */ 8562306a36Sopenharmony_ci OMAP_DSS_COLOR_CLUT2 = 1 << 1, /* BITMAP 2 */ 8662306a36Sopenharmony_ci OMAP_DSS_COLOR_CLUT4 = 1 << 2, /* BITMAP 4 */ 8762306a36Sopenharmony_ci OMAP_DSS_COLOR_CLUT8 = 1 << 3, /* BITMAP 8 */ 8862306a36Sopenharmony_ci OMAP_DSS_COLOR_RGB12U = 1 << 4, /* RGB12, 16-bit container */ 8962306a36Sopenharmony_ci OMAP_DSS_COLOR_ARGB16 = 1 << 5, /* ARGB16 */ 9062306a36Sopenharmony_ci OMAP_DSS_COLOR_RGB16 = 1 << 6, /* RGB16 */ 9162306a36Sopenharmony_ci OMAP_DSS_COLOR_RGB24U = 1 << 7, /* RGB24, 32-bit container */ 9262306a36Sopenharmony_ci OMAP_DSS_COLOR_RGB24P = 1 << 8, /* RGB24, 24-bit container */ 9362306a36Sopenharmony_ci OMAP_DSS_COLOR_YUV2 = 1 << 9, /* YUV2 4:2:2 co-sited */ 9462306a36Sopenharmony_ci OMAP_DSS_COLOR_UYVY = 1 << 10, /* UYVY 4:2:2 co-sited */ 9562306a36Sopenharmony_ci OMAP_DSS_COLOR_ARGB32 = 1 << 11, /* ARGB32 */ 9662306a36Sopenharmony_ci OMAP_DSS_COLOR_RGBA32 = 1 << 12, /* RGBA32 */ 9762306a36Sopenharmony_ci OMAP_DSS_COLOR_RGBX32 = 1 << 13, /* RGBx32 */ 9862306a36Sopenharmony_ci OMAP_DSS_COLOR_NV12 = 1 << 14, /* NV12 format: YUV 4:2:0 */ 9962306a36Sopenharmony_ci OMAP_DSS_COLOR_RGBA16 = 1 << 15, /* RGBA16 - 4444 */ 10062306a36Sopenharmony_ci OMAP_DSS_COLOR_RGBX16 = 1 << 16, /* RGBx16 - 4444 */ 10162306a36Sopenharmony_ci OMAP_DSS_COLOR_ARGB16_1555 = 1 << 17, /* ARGB16 - 1555 */ 10262306a36Sopenharmony_ci OMAP_DSS_COLOR_XRGB16_1555 = 1 << 18, /* xRGB16 - 1555 */ 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cienum omap_dss_load_mode { 10662306a36Sopenharmony_ci OMAP_DSS_LOAD_CLUT_AND_FRAME = 0, 10762306a36Sopenharmony_ci OMAP_DSS_LOAD_CLUT_ONLY = 1, 10862306a36Sopenharmony_ci OMAP_DSS_LOAD_FRAME_ONLY = 2, 10962306a36Sopenharmony_ci OMAP_DSS_LOAD_CLUT_ONCE_FRAME = 3, 11062306a36Sopenharmony_ci}; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_cienum omap_dss_trans_key_type { 11362306a36Sopenharmony_ci OMAP_DSS_COLOR_KEY_GFX_DST = 0, 11462306a36Sopenharmony_ci OMAP_DSS_COLOR_KEY_VID_SRC = 1, 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cienum omap_dss_signal_level { 11862306a36Sopenharmony_ci OMAPDSS_SIG_ACTIVE_LOW, 11962306a36Sopenharmony_ci OMAPDSS_SIG_ACTIVE_HIGH, 12062306a36Sopenharmony_ci}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cienum omap_dss_signal_edge { 12362306a36Sopenharmony_ci OMAPDSS_DRIVE_SIG_FALLING_EDGE, 12462306a36Sopenharmony_ci OMAPDSS_DRIVE_SIG_RISING_EDGE, 12562306a36Sopenharmony_ci}; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cienum omap_dss_venc_type { 12862306a36Sopenharmony_ci OMAP_DSS_VENC_TYPE_COMPOSITE, 12962306a36Sopenharmony_ci OMAP_DSS_VENC_TYPE_SVIDEO, 13062306a36Sopenharmony_ci}; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cienum omap_dss_dsi_pixel_format { 13362306a36Sopenharmony_ci OMAP_DSS_DSI_FMT_RGB888, 13462306a36Sopenharmony_ci OMAP_DSS_DSI_FMT_RGB666, 13562306a36Sopenharmony_ci OMAP_DSS_DSI_FMT_RGB666_PACKED, 13662306a36Sopenharmony_ci OMAP_DSS_DSI_FMT_RGB565, 13762306a36Sopenharmony_ci}; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cienum omap_dss_dsi_mode { 14062306a36Sopenharmony_ci OMAP_DSS_DSI_CMD_MODE = 0, 14162306a36Sopenharmony_ci OMAP_DSS_DSI_VIDEO_MODE, 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cienum omap_display_caps { 14562306a36Sopenharmony_ci OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE = 1 << 0, 14662306a36Sopenharmony_ci OMAP_DSS_DISPLAY_CAP_TEAR_ELIM = 1 << 1, 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cienum omap_dss_display_state { 15062306a36Sopenharmony_ci OMAP_DSS_DISPLAY_DISABLED = 0, 15162306a36Sopenharmony_ci OMAP_DSS_DISPLAY_ACTIVE, 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cienum omap_dss_rotation_type { 15562306a36Sopenharmony_ci OMAP_DSS_ROT_DMA = 1 << 0, 15662306a36Sopenharmony_ci OMAP_DSS_ROT_VRFB = 1 << 1, 15762306a36Sopenharmony_ci OMAP_DSS_ROT_TILER = 1 << 2, 15862306a36Sopenharmony_ci}; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci/* clockwise rotation angle */ 16162306a36Sopenharmony_cienum omap_dss_rotation_angle { 16262306a36Sopenharmony_ci OMAP_DSS_ROT_0 = 0, 16362306a36Sopenharmony_ci OMAP_DSS_ROT_90 = 1, 16462306a36Sopenharmony_ci OMAP_DSS_ROT_180 = 2, 16562306a36Sopenharmony_ci OMAP_DSS_ROT_270 = 3, 16662306a36Sopenharmony_ci}; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_cienum omap_overlay_caps { 16962306a36Sopenharmony_ci OMAP_DSS_OVL_CAP_SCALE = 1 << 0, 17062306a36Sopenharmony_ci OMAP_DSS_OVL_CAP_GLOBAL_ALPHA = 1 << 1, 17162306a36Sopenharmony_ci OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA = 1 << 2, 17262306a36Sopenharmony_ci OMAP_DSS_OVL_CAP_ZORDER = 1 << 3, 17362306a36Sopenharmony_ci OMAP_DSS_OVL_CAP_POS = 1 << 4, 17462306a36Sopenharmony_ci OMAP_DSS_OVL_CAP_REPLICATION = 1 << 5, 17562306a36Sopenharmony_ci}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cienum omap_dss_output_id { 17862306a36Sopenharmony_ci OMAP_DSS_OUTPUT_DPI = 1 << 0, 17962306a36Sopenharmony_ci OMAP_DSS_OUTPUT_DBI = 1 << 1, 18062306a36Sopenharmony_ci OMAP_DSS_OUTPUT_SDI = 1 << 2, 18162306a36Sopenharmony_ci OMAP_DSS_OUTPUT_DSI1 = 1 << 3, 18262306a36Sopenharmony_ci OMAP_DSS_OUTPUT_DSI2 = 1 << 4, 18362306a36Sopenharmony_ci OMAP_DSS_OUTPUT_VENC = 1 << 5, 18462306a36Sopenharmony_ci OMAP_DSS_OUTPUT_HDMI = 1 << 6, 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/* DSI */ 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cienum omap_dss_dsi_trans_mode { 19062306a36Sopenharmony_ci /* Sync Pulses: both sync start and end packets sent */ 19162306a36Sopenharmony_ci OMAP_DSS_DSI_PULSE_MODE, 19262306a36Sopenharmony_ci /* Sync Events: only sync start packets sent */ 19362306a36Sopenharmony_ci OMAP_DSS_DSI_EVENT_MODE, 19462306a36Sopenharmony_ci /* Burst: only sync start packets sent, pixels are time compressed */ 19562306a36Sopenharmony_ci OMAP_DSS_DSI_BURST_MODE, 19662306a36Sopenharmony_ci}; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_cistruct omap_dss_dsi_videomode_timings { 19962306a36Sopenharmony_ci unsigned long hsclk; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci unsigned ndl; 20262306a36Sopenharmony_ci unsigned bitspp; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci /* pixels */ 20562306a36Sopenharmony_ci u16 hact; 20662306a36Sopenharmony_ci /* lines */ 20762306a36Sopenharmony_ci u16 vact; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci /* DSI video mode blanking data */ 21062306a36Sopenharmony_ci /* Unit: byte clock cycles */ 21162306a36Sopenharmony_ci u16 hss; 21262306a36Sopenharmony_ci u16 hsa; 21362306a36Sopenharmony_ci u16 hse; 21462306a36Sopenharmony_ci u16 hfp; 21562306a36Sopenharmony_ci u16 hbp; 21662306a36Sopenharmony_ci /* Unit: line clocks */ 21762306a36Sopenharmony_ci u16 vsa; 21862306a36Sopenharmony_ci u16 vfp; 21962306a36Sopenharmony_ci u16 vbp; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci /* DSI blanking modes */ 22262306a36Sopenharmony_ci int blanking_mode; 22362306a36Sopenharmony_ci int hsa_blanking_mode; 22462306a36Sopenharmony_ci int hbp_blanking_mode; 22562306a36Sopenharmony_ci int hfp_blanking_mode; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci enum omap_dss_dsi_trans_mode trans_mode; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci bool ddr_clk_always_on; 23062306a36Sopenharmony_ci int window_sync; 23162306a36Sopenharmony_ci}; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistruct omap_dss_dsi_config { 23462306a36Sopenharmony_ci enum omap_dss_dsi_mode mode; 23562306a36Sopenharmony_ci enum omap_dss_dsi_pixel_format pixel_format; 23662306a36Sopenharmony_ci const struct omap_video_timings *timings; 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci unsigned long hs_clk_min, hs_clk_max; 23962306a36Sopenharmony_ci unsigned long lp_clk_min, lp_clk_max; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci bool ddr_clk_always_on; 24262306a36Sopenharmony_ci enum omap_dss_dsi_trans_mode trans_mode; 24362306a36Sopenharmony_ci}; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_cistruct omap_video_timings { 24662306a36Sopenharmony_ci /* Unit: pixels */ 24762306a36Sopenharmony_ci u16 x_res; 24862306a36Sopenharmony_ci /* Unit: pixels */ 24962306a36Sopenharmony_ci u16 y_res; 25062306a36Sopenharmony_ci /* Unit: Hz */ 25162306a36Sopenharmony_ci u32 pixelclock; 25262306a36Sopenharmony_ci /* Unit: pixel clocks */ 25362306a36Sopenharmony_ci u16 hsw; /* Horizontal synchronization pulse width */ 25462306a36Sopenharmony_ci /* Unit: pixel clocks */ 25562306a36Sopenharmony_ci u16 hfp; /* Horizontal front porch */ 25662306a36Sopenharmony_ci /* Unit: pixel clocks */ 25762306a36Sopenharmony_ci u16 hbp; /* Horizontal back porch */ 25862306a36Sopenharmony_ci /* Unit: line clocks */ 25962306a36Sopenharmony_ci u16 vsw; /* Vertical synchronization pulse width */ 26062306a36Sopenharmony_ci /* Unit: line clocks */ 26162306a36Sopenharmony_ci u16 vfp; /* Vertical front porch */ 26262306a36Sopenharmony_ci /* Unit: line clocks */ 26362306a36Sopenharmony_ci u16 vbp; /* Vertical back porch */ 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci /* Vsync logic level */ 26662306a36Sopenharmony_ci enum omap_dss_signal_level vsync_level; 26762306a36Sopenharmony_ci /* Hsync logic level */ 26862306a36Sopenharmony_ci enum omap_dss_signal_level hsync_level; 26962306a36Sopenharmony_ci /* Interlaced or Progressive timings */ 27062306a36Sopenharmony_ci bool interlace; 27162306a36Sopenharmony_ci /* Pixel clock edge to drive LCD data */ 27262306a36Sopenharmony_ci enum omap_dss_signal_edge data_pclk_edge; 27362306a36Sopenharmony_ci /* Data enable logic level */ 27462306a36Sopenharmony_ci enum omap_dss_signal_level de_level; 27562306a36Sopenharmony_ci /* Pixel clock edges to drive HSYNC and VSYNC signals */ 27662306a36Sopenharmony_ci enum omap_dss_signal_edge sync_pclk_edge; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci bool double_pixel; 27962306a36Sopenharmony_ci}; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci/* Hardcoded timings for tv modes. Venc only uses these to 28262306a36Sopenharmony_ci * identify the mode, and does not actually use the configs 28362306a36Sopenharmony_ci * itself. However, the configs should be something that 28462306a36Sopenharmony_ci * a normal monitor can also show */ 28562306a36Sopenharmony_ciextern const struct omap_video_timings omap_dss_pal_timings; 28662306a36Sopenharmony_ciextern const struct omap_video_timings omap_dss_ntsc_timings; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_cistruct omap_dss_cpr_coefs { 28962306a36Sopenharmony_ci s16 rr, rg, rb; 29062306a36Sopenharmony_ci s16 gr, gg, gb; 29162306a36Sopenharmony_ci s16 br, bg, bb; 29262306a36Sopenharmony_ci}; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_cistruct omap_overlay_info { 29562306a36Sopenharmony_ci dma_addr_t paddr; 29662306a36Sopenharmony_ci dma_addr_t p_uv_addr; /* for NV12 format */ 29762306a36Sopenharmony_ci u16 screen_width; 29862306a36Sopenharmony_ci u16 width; 29962306a36Sopenharmony_ci u16 height; 30062306a36Sopenharmony_ci enum omap_color_mode color_mode; 30162306a36Sopenharmony_ci u8 rotation; 30262306a36Sopenharmony_ci enum omap_dss_rotation_type rotation_type; 30362306a36Sopenharmony_ci bool mirror; 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci u16 pos_x; 30662306a36Sopenharmony_ci u16 pos_y; 30762306a36Sopenharmony_ci u16 out_width; /* if 0, out_width == width */ 30862306a36Sopenharmony_ci u16 out_height; /* if 0, out_height == height */ 30962306a36Sopenharmony_ci u8 global_alpha; 31062306a36Sopenharmony_ci u8 pre_mult_alpha; 31162306a36Sopenharmony_ci u8 zorder; 31262306a36Sopenharmony_ci}; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistruct omap_overlay { 31562306a36Sopenharmony_ci struct kobject kobj; 31662306a36Sopenharmony_ci struct list_head list; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci /* static fields */ 31962306a36Sopenharmony_ci const char *name; 32062306a36Sopenharmony_ci enum omap_plane id; 32162306a36Sopenharmony_ci enum omap_color_mode supported_modes; 32262306a36Sopenharmony_ci enum omap_overlay_caps caps; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci /* dynamic fields */ 32562306a36Sopenharmony_ci struct omap_overlay_manager *manager; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci /* 32862306a36Sopenharmony_ci * The following functions do not block: 32962306a36Sopenharmony_ci * 33062306a36Sopenharmony_ci * is_enabled 33162306a36Sopenharmony_ci * set_overlay_info 33262306a36Sopenharmony_ci * get_overlay_info 33362306a36Sopenharmony_ci * 33462306a36Sopenharmony_ci * The rest of the functions may block and cannot be called from 33562306a36Sopenharmony_ci * interrupt context 33662306a36Sopenharmony_ci */ 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci int (*enable)(struct omap_overlay *ovl); 33962306a36Sopenharmony_ci int (*disable)(struct omap_overlay *ovl); 34062306a36Sopenharmony_ci bool (*is_enabled)(struct omap_overlay *ovl); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci int (*set_manager)(struct omap_overlay *ovl, 34362306a36Sopenharmony_ci struct omap_overlay_manager *mgr); 34462306a36Sopenharmony_ci int (*unset_manager)(struct omap_overlay *ovl); 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci int (*set_overlay_info)(struct omap_overlay *ovl, 34762306a36Sopenharmony_ci struct omap_overlay_info *info); 34862306a36Sopenharmony_ci void (*get_overlay_info)(struct omap_overlay *ovl, 34962306a36Sopenharmony_ci struct omap_overlay_info *info); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci int (*wait_for_go)(struct omap_overlay *ovl); 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci struct omap_dss_device *(*get_device)(struct omap_overlay *ovl); 35462306a36Sopenharmony_ci}; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_cistruct omap_overlay_manager_info { 35762306a36Sopenharmony_ci u32 default_color; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci enum omap_dss_trans_key_type trans_key_type; 36062306a36Sopenharmony_ci u32 trans_key; 36162306a36Sopenharmony_ci bool trans_enabled; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci bool partial_alpha_enabled; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci bool cpr_enable; 36662306a36Sopenharmony_ci struct omap_dss_cpr_coefs cpr_coefs; 36762306a36Sopenharmony_ci}; 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistruct omap_overlay_manager { 37062306a36Sopenharmony_ci struct kobject kobj; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci /* static fields */ 37362306a36Sopenharmony_ci const char *name; 37462306a36Sopenharmony_ci enum omap_channel id; 37562306a36Sopenharmony_ci struct list_head overlays; 37662306a36Sopenharmony_ci enum omap_display_type supported_displays; 37762306a36Sopenharmony_ci enum omap_dss_output_id supported_outputs; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci /* dynamic fields */ 38062306a36Sopenharmony_ci struct omap_dss_device *output; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci /* 38362306a36Sopenharmony_ci * The following functions do not block: 38462306a36Sopenharmony_ci * 38562306a36Sopenharmony_ci * set_manager_info 38662306a36Sopenharmony_ci * get_manager_info 38762306a36Sopenharmony_ci * apply 38862306a36Sopenharmony_ci * 38962306a36Sopenharmony_ci * The rest of the functions may block and cannot be called from 39062306a36Sopenharmony_ci * interrupt context 39162306a36Sopenharmony_ci */ 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci int (*set_output)(struct omap_overlay_manager *mgr, 39462306a36Sopenharmony_ci struct omap_dss_device *output); 39562306a36Sopenharmony_ci int (*unset_output)(struct omap_overlay_manager *mgr); 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci int (*set_manager_info)(struct omap_overlay_manager *mgr, 39862306a36Sopenharmony_ci struct omap_overlay_manager_info *info); 39962306a36Sopenharmony_ci void (*get_manager_info)(struct omap_overlay_manager *mgr, 40062306a36Sopenharmony_ci struct omap_overlay_manager_info *info); 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci int (*apply)(struct omap_overlay_manager *mgr); 40362306a36Sopenharmony_ci int (*wait_for_go)(struct omap_overlay_manager *mgr); 40462306a36Sopenharmony_ci int (*wait_for_vsync)(struct omap_overlay_manager *mgr); 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci struct omap_dss_device *(*get_device)(struct omap_overlay_manager *mgr); 40762306a36Sopenharmony_ci}; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci/* 22 pins means 1 clk lane and 10 data lanes */ 41062306a36Sopenharmony_ci#define OMAP_DSS_MAX_DSI_PINS 22 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_cistruct omap_dsi_pin_config { 41362306a36Sopenharmony_ci int num_pins; 41462306a36Sopenharmony_ci /* 41562306a36Sopenharmony_ci * pin numbers in the following order: 41662306a36Sopenharmony_ci * clk+, clk- 41762306a36Sopenharmony_ci * data1+, data1- 41862306a36Sopenharmony_ci * data2+, data2- 41962306a36Sopenharmony_ci * ... 42062306a36Sopenharmony_ci */ 42162306a36Sopenharmony_ci int pins[OMAP_DSS_MAX_DSI_PINS]; 42262306a36Sopenharmony_ci}; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistruct omap_dss_writeback_info { 42562306a36Sopenharmony_ci u32 paddr; 42662306a36Sopenharmony_ci u32 p_uv_addr; 42762306a36Sopenharmony_ci u16 buf_width; 42862306a36Sopenharmony_ci u16 width; 42962306a36Sopenharmony_ci u16 height; 43062306a36Sopenharmony_ci enum omap_color_mode color_mode; 43162306a36Sopenharmony_ci u8 rotation; 43262306a36Sopenharmony_ci enum omap_dss_rotation_type rotation_type; 43362306a36Sopenharmony_ci bool mirror; 43462306a36Sopenharmony_ci u8 pre_mult_alpha; 43562306a36Sopenharmony_ci}; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_cistruct omapdss_dpi_ops { 43862306a36Sopenharmony_ci int (*connect)(struct omap_dss_device *dssdev, 43962306a36Sopenharmony_ci struct omap_dss_device *dst); 44062306a36Sopenharmony_ci void (*disconnect)(struct omap_dss_device *dssdev, 44162306a36Sopenharmony_ci struct omap_dss_device *dst); 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci int (*enable)(struct omap_dss_device *dssdev); 44462306a36Sopenharmony_ci void (*disable)(struct omap_dss_device *dssdev); 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci int (*check_timings)(struct omap_dss_device *dssdev, 44762306a36Sopenharmony_ci struct omap_video_timings *timings); 44862306a36Sopenharmony_ci void (*set_timings)(struct omap_dss_device *dssdev, 44962306a36Sopenharmony_ci struct omap_video_timings *timings); 45062306a36Sopenharmony_ci void (*get_timings)(struct omap_dss_device *dssdev, 45162306a36Sopenharmony_ci struct omap_video_timings *timings); 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ci void (*set_data_lines)(struct omap_dss_device *dssdev, int data_lines); 45462306a36Sopenharmony_ci}; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_cistruct omapdss_sdi_ops { 45762306a36Sopenharmony_ci int (*connect)(struct omap_dss_device *dssdev, 45862306a36Sopenharmony_ci struct omap_dss_device *dst); 45962306a36Sopenharmony_ci void (*disconnect)(struct omap_dss_device *dssdev, 46062306a36Sopenharmony_ci struct omap_dss_device *dst); 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci int (*enable)(struct omap_dss_device *dssdev); 46362306a36Sopenharmony_ci void (*disable)(struct omap_dss_device *dssdev); 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci int (*check_timings)(struct omap_dss_device *dssdev, 46662306a36Sopenharmony_ci struct omap_video_timings *timings); 46762306a36Sopenharmony_ci void (*set_timings)(struct omap_dss_device *dssdev, 46862306a36Sopenharmony_ci struct omap_video_timings *timings); 46962306a36Sopenharmony_ci void (*get_timings)(struct omap_dss_device *dssdev, 47062306a36Sopenharmony_ci struct omap_video_timings *timings); 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_ci void (*set_datapairs)(struct omap_dss_device *dssdev, int datapairs); 47362306a36Sopenharmony_ci}; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cistruct omapdss_dvi_ops { 47662306a36Sopenharmony_ci int (*connect)(struct omap_dss_device *dssdev, 47762306a36Sopenharmony_ci struct omap_dss_device *dst); 47862306a36Sopenharmony_ci void (*disconnect)(struct omap_dss_device *dssdev, 47962306a36Sopenharmony_ci struct omap_dss_device *dst); 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci int (*enable)(struct omap_dss_device *dssdev); 48262306a36Sopenharmony_ci void (*disable)(struct omap_dss_device *dssdev); 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci int (*check_timings)(struct omap_dss_device *dssdev, 48562306a36Sopenharmony_ci struct omap_video_timings *timings); 48662306a36Sopenharmony_ci void (*set_timings)(struct omap_dss_device *dssdev, 48762306a36Sopenharmony_ci struct omap_video_timings *timings); 48862306a36Sopenharmony_ci void (*get_timings)(struct omap_dss_device *dssdev, 48962306a36Sopenharmony_ci struct omap_video_timings *timings); 49062306a36Sopenharmony_ci}; 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_cistruct omapdss_atv_ops { 49362306a36Sopenharmony_ci int (*connect)(struct omap_dss_device *dssdev, 49462306a36Sopenharmony_ci struct omap_dss_device *dst); 49562306a36Sopenharmony_ci void (*disconnect)(struct omap_dss_device *dssdev, 49662306a36Sopenharmony_ci struct omap_dss_device *dst); 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci int (*enable)(struct omap_dss_device *dssdev); 49962306a36Sopenharmony_ci void (*disable)(struct omap_dss_device *dssdev); 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci int (*check_timings)(struct omap_dss_device *dssdev, 50262306a36Sopenharmony_ci struct omap_video_timings *timings); 50362306a36Sopenharmony_ci void (*set_timings)(struct omap_dss_device *dssdev, 50462306a36Sopenharmony_ci struct omap_video_timings *timings); 50562306a36Sopenharmony_ci void (*get_timings)(struct omap_dss_device *dssdev, 50662306a36Sopenharmony_ci struct omap_video_timings *timings); 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci void (*set_type)(struct omap_dss_device *dssdev, 50962306a36Sopenharmony_ci enum omap_dss_venc_type type); 51062306a36Sopenharmony_ci void (*invert_vid_out_polarity)(struct omap_dss_device *dssdev, 51162306a36Sopenharmony_ci bool invert_polarity); 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci int (*set_wss)(struct omap_dss_device *dssdev, u32 wss); 51462306a36Sopenharmony_ci u32 (*get_wss)(struct omap_dss_device *dssdev); 51562306a36Sopenharmony_ci}; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistruct omapdss_hdmi_ops { 51862306a36Sopenharmony_ci int (*connect)(struct omap_dss_device *dssdev, 51962306a36Sopenharmony_ci struct omap_dss_device *dst); 52062306a36Sopenharmony_ci void (*disconnect)(struct omap_dss_device *dssdev, 52162306a36Sopenharmony_ci struct omap_dss_device *dst); 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci int (*enable)(struct omap_dss_device *dssdev); 52462306a36Sopenharmony_ci void (*disable)(struct omap_dss_device *dssdev); 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ci int (*check_timings)(struct omap_dss_device *dssdev, 52762306a36Sopenharmony_ci struct omap_video_timings *timings); 52862306a36Sopenharmony_ci void (*set_timings)(struct omap_dss_device *dssdev, 52962306a36Sopenharmony_ci struct omap_video_timings *timings); 53062306a36Sopenharmony_ci void (*get_timings)(struct omap_dss_device *dssdev, 53162306a36Sopenharmony_ci struct omap_video_timings *timings); 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len); 53462306a36Sopenharmony_ci bool (*detect)(struct omap_dss_device *dssdev); 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci int (*set_hdmi_mode)(struct omap_dss_device *dssdev, bool hdmi_mode); 53762306a36Sopenharmony_ci int (*set_infoframe)(struct omap_dss_device *dssdev, 53862306a36Sopenharmony_ci const struct hdmi_avi_infoframe *avi); 53962306a36Sopenharmony_ci}; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_cistruct omapdss_dsi_ops { 54262306a36Sopenharmony_ci int (*connect)(struct omap_dss_device *dssdev, 54362306a36Sopenharmony_ci struct omap_dss_device *dst); 54462306a36Sopenharmony_ci void (*disconnect)(struct omap_dss_device *dssdev, 54562306a36Sopenharmony_ci struct omap_dss_device *dst); 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci int (*enable)(struct omap_dss_device *dssdev); 54862306a36Sopenharmony_ci void (*disable)(struct omap_dss_device *dssdev, bool disconnect_lanes, 54962306a36Sopenharmony_ci bool enter_ulps); 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci /* bus configuration */ 55262306a36Sopenharmony_ci int (*set_config)(struct omap_dss_device *dssdev, 55362306a36Sopenharmony_ci const struct omap_dss_dsi_config *cfg); 55462306a36Sopenharmony_ci int (*configure_pins)(struct omap_dss_device *dssdev, 55562306a36Sopenharmony_ci const struct omap_dsi_pin_config *pin_cfg); 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci void (*enable_hs)(struct omap_dss_device *dssdev, int channel, 55862306a36Sopenharmony_ci bool enable); 55962306a36Sopenharmony_ci int (*enable_te)(struct omap_dss_device *dssdev, bool enable); 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci int (*update)(struct omap_dss_device *dssdev, int channel, 56262306a36Sopenharmony_ci void (*callback)(int, void *), void *data); 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci void (*bus_lock)(struct omap_dss_device *dssdev); 56562306a36Sopenharmony_ci void (*bus_unlock)(struct omap_dss_device *dssdev); 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci int (*enable_video_output)(struct omap_dss_device *dssdev, int channel); 56862306a36Sopenharmony_ci void (*disable_video_output)(struct omap_dss_device *dssdev, 56962306a36Sopenharmony_ci int channel); 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci int (*request_vc)(struct omap_dss_device *dssdev, int *channel); 57262306a36Sopenharmony_ci int (*set_vc_id)(struct omap_dss_device *dssdev, int channel, 57362306a36Sopenharmony_ci int vc_id); 57462306a36Sopenharmony_ci void (*release_vc)(struct omap_dss_device *dssdev, int channel); 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci /* data transfer */ 57762306a36Sopenharmony_ci int (*dcs_write)(struct omap_dss_device *dssdev, int channel, 57862306a36Sopenharmony_ci u8 *data, int len); 57962306a36Sopenharmony_ci int (*dcs_write_nosync)(struct omap_dss_device *dssdev, int channel, 58062306a36Sopenharmony_ci u8 *data, int len); 58162306a36Sopenharmony_ci int (*dcs_read)(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd, 58262306a36Sopenharmony_ci u8 *data, int len); 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_ci int (*gen_write)(struct omap_dss_device *dssdev, int channel, 58562306a36Sopenharmony_ci u8 *data, int len); 58662306a36Sopenharmony_ci int (*gen_write_nosync)(struct omap_dss_device *dssdev, int channel, 58762306a36Sopenharmony_ci u8 *data, int len); 58862306a36Sopenharmony_ci int (*gen_read)(struct omap_dss_device *dssdev, int channel, 58962306a36Sopenharmony_ci u8 *reqdata, int reqlen, 59062306a36Sopenharmony_ci u8 *data, int len); 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci int (*bta_sync)(struct omap_dss_device *dssdev, int channel); 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci int (*set_max_rx_packet_size)(struct omap_dss_device *dssdev, 59562306a36Sopenharmony_ci int channel, u16 plen); 59662306a36Sopenharmony_ci}; 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_cistruct omap_dss_device { 59962306a36Sopenharmony_ci struct kobject kobj; 60062306a36Sopenharmony_ci struct device *dev; 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_ci struct module *owner; 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_ci struct list_head panel_list; 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci /* alias in the form of "display%d" */ 60762306a36Sopenharmony_ci char alias[16]; 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ci enum omap_display_type type; 61062306a36Sopenharmony_ci enum omap_display_type output_type; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ci union { 61362306a36Sopenharmony_ci struct { 61462306a36Sopenharmony_ci u8 data_lines; 61562306a36Sopenharmony_ci } dpi; 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci struct { 61862306a36Sopenharmony_ci u8 datapairs; 61962306a36Sopenharmony_ci } sdi; 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ci struct { 62262306a36Sopenharmony_ci int module; 62362306a36Sopenharmony_ci } dsi; 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci struct { 62662306a36Sopenharmony_ci enum omap_dss_venc_type type; 62762306a36Sopenharmony_ci bool invert_polarity; 62862306a36Sopenharmony_ci } venc; 62962306a36Sopenharmony_ci } phy; 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci struct { 63262306a36Sopenharmony_ci struct omap_video_timings timings; 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci enum omap_dss_dsi_pixel_format dsi_pix_fmt; 63562306a36Sopenharmony_ci enum omap_dss_dsi_mode dsi_mode; 63662306a36Sopenharmony_ci } panel; 63762306a36Sopenharmony_ci 63862306a36Sopenharmony_ci struct { 63962306a36Sopenharmony_ci u8 pixel_size; 64062306a36Sopenharmony_ci } ctrl; 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci const char *name; 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_ci /* used to match device to driver */ 64562306a36Sopenharmony_ci const char *driver_name; 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci void *data; 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_ci struct omap_dss_driver *driver; 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci union { 65262306a36Sopenharmony_ci const struct omapdss_dpi_ops *dpi; 65362306a36Sopenharmony_ci const struct omapdss_sdi_ops *sdi; 65462306a36Sopenharmony_ci const struct omapdss_dvi_ops *dvi; 65562306a36Sopenharmony_ci const struct omapdss_hdmi_ops *hdmi; 65662306a36Sopenharmony_ci const struct omapdss_atv_ops *atv; 65762306a36Sopenharmony_ci const struct omapdss_dsi_ops *dsi; 65862306a36Sopenharmony_ci } ops; 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_ci /* helper variable for driver suspend/resume */ 66162306a36Sopenharmony_ci bool activate_after_resume; 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_ci enum omap_display_caps caps; 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci struct omap_dss_device *src; 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci enum omap_dss_display_state state; 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ci /* OMAP DSS output specific fields */ 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci struct list_head list; 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_ci /* DISPC channel for this output */ 67462306a36Sopenharmony_ci enum omap_channel dispc_channel; 67562306a36Sopenharmony_ci bool dispc_channel_connected; 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci /* output instance */ 67862306a36Sopenharmony_ci enum omap_dss_output_id id; 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci /* the port number in the DT node */ 68162306a36Sopenharmony_ci int port_num; 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci /* dynamic fields */ 68462306a36Sopenharmony_ci struct omap_overlay_manager *manager; 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ci struct omap_dss_device *dst; 68762306a36Sopenharmony_ci}; 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_cistruct omap_dss_driver { 69062306a36Sopenharmony_ci int (*probe)(struct omap_dss_device *); 69162306a36Sopenharmony_ci void (*remove)(struct omap_dss_device *); 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci int (*connect)(struct omap_dss_device *dssdev); 69462306a36Sopenharmony_ci void (*disconnect)(struct omap_dss_device *dssdev); 69562306a36Sopenharmony_ci 69662306a36Sopenharmony_ci int (*enable)(struct omap_dss_device *display); 69762306a36Sopenharmony_ci void (*disable)(struct omap_dss_device *display); 69862306a36Sopenharmony_ci int (*run_test)(struct omap_dss_device *display, int test); 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_ci int (*update)(struct omap_dss_device *dssdev, 70162306a36Sopenharmony_ci u16 x, u16 y, u16 w, u16 h); 70262306a36Sopenharmony_ci int (*sync)(struct omap_dss_device *dssdev); 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_ci int (*enable_te)(struct omap_dss_device *dssdev, bool enable); 70562306a36Sopenharmony_ci int (*get_te)(struct omap_dss_device *dssdev); 70662306a36Sopenharmony_ci 70762306a36Sopenharmony_ci u8 (*get_rotate)(struct omap_dss_device *dssdev); 70862306a36Sopenharmony_ci int (*set_rotate)(struct omap_dss_device *dssdev, u8 rotate); 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_ci bool (*get_mirror)(struct omap_dss_device *dssdev); 71162306a36Sopenharmony_ci int (*set_mirror)(struct omap_dss_device *dssdev, bool enable); 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_ci int (*memory_read)(struct omap_dss_device *dssdev, 71462306a36Sopenharmony_ci void *buf, size_t size, 71562306a36Sopenharmony_ci u16 x, u16 y, u16 w, u16 h); 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci void (*get_resolution)(struct omap_dss_device *dssdev, 71862306a36Sopenharmony_ci u16 *xres, u16 *yres); 71962306a36Sopenharmony_ci void (*get_dimensions)(struct omap_dss_device *dssdev, 72062306a36Sopenharmony_ci u32 *width, u32 *height); 72162306a36Sopenharmony_ci int (*get_recommended_bpp)(struct omap_dss_device *dssdev); 72262306a36Sopenharmony_ci 72362306a36Sopenharmony_ci int (*check_timings)(struct omap_dss_device *dssdev, 72462306a36Sopenharmony_ci struct omap_video_timings *timings); 72562306a36Sopenharmony_ci void (*set_timings)(struct omap_dss_device *dssdev, 72662306a36Sopenharmony_ci struct omap_video_timings *timings); 72762306a36Sopenharmony_ci void (*get_timings)(struct omap_dss_device *dssdev, 72862306a36Sopenharmony_ci struct omap_video_timings *timings); 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_ci int (*set_wss)(struct omap_dss_device *dssdev, u32 wss); 73162306a36Sopenharmony_ci u32 (*get_wss)(struct omap_dss_device *dssdev); 73262306a36Sopenharmony_ci 73362306a36Sopenharmony_ci int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len); 73462306a36Sopenharmony_ci bool (*detect)(struct omap_dss_device *dssdev); 73562306a36Sopenharmony_ci 73662306a36Sopenharmony_ci int (*set_hdmi_mode)(struct omap_dss_device *dssdev, bool hdmi_mode); 73762306a36Sopenharmony_ci int (*set_hdmi_infoframe)(struct omap_dss_device *dssdev, 73862306a36Sopenharmony_ci const struct hdmi_avi_infoframe *avi); 73962306a36Sopenharmony_ci}; 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_ci#define for_each_dss_dev(d) while ((d = omap_dss_get_next_device(d)) != NULL) 74262306a36Sopenharmony_ci 74362306a36Sopenharmony_citypedef void (*omap_dispc_isr_t) (void *arg, u32 mask); 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_FB_OMAP2) 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_cienum omapdss_version omapdss_get_version(void); 74862306a36Sopenharmony_cibool omapdss_is_initialized(void); 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_ciint omap_dss_register_driver(struct omap_dss_driver *); 75162306a36Sopenharmony_civoid omap_dss_unregister_driver(struct omap_dss_driver *); 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ciint omapdss_register_display(struct omap_dss_device *dssdev); 75462306a36Sopenharmony_civoid omapdss_unregister_display(struct omap_dss_device *dssdev); 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_cistruct omap_dss_device *omap_dss_get_device(struct omap_dss_device *dssdev); 75762306a36Sopenharmony_civoid omap_dss_put_device(struct omap_dss_device *dssdev); 75862306a36Sopenharmony_cistruct omap_dss_device *omap_dss_get_next_device(struct omap_dss_device *from); 75962306a36Sopenharmony_cistruct omap_dss_device *omap_dss_find_device(void *data, 76062306a36Sopenharmony_ci int (*match)(struct omap_dss_device *dssdev, void *data)); 76162306a36Sopenharmony_ciconst char *omapdss_get_default_display_name(void); 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_civoid videomode_to_omap_video_timings(const struct videomode *vm, 76462306a36Sopenharmony_ci struct omap_video_timings *ovt); 76562306a36Sopenharmony_civoid omap_video_timings_to_videomode(const struct omap_video_timings *ovt, 76662306a36Sopenharmony_ci struct videomode *vm); 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ciint dss_feat_get_num_mgrs(void); 76962306a36Sopenharmony_ciint dss_feat_get_num_ovls(void); 77062306a36Sopenharmony_cienum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane); 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci 77462306a36Sopenharmony_ciint omap_dss_get_num_overlay_managers(void); 77562306a36Sopenharmony_cistruct omap_overlay_manager *omap_dss_get_overlay_manager(int num); 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_ciint omap_dss_get_num_overlays(void); 77862306a36Sopenharmony_cistruct omap_overlay *omap_dss_get_overlay(int num); 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_ciint omapdss_register_output(struct omap_dss_device *output); 78162306a36Sopenharmony_civoid omapdss_unregister_output(struct omap_dss_device *output); 78262306a36Sopenharmony_cistruct omap_dss_device *omap_dss_get_output(enum omap_dss_output_id id); 78362306a36Sopenharmony_cistruct omap_dss_device *omap_dss_find_output(const char *name); 78462306a36Sopenharmony_cistruct omap_dss_device *omap_dss_find_output_by_port_node(struct device_node *port); 78562306a36Sopenharmony_ciint omapdss_output_set_device(struct omap_dss_device *out, 78662306a36Sopenharmony_ci struct omap_dss_device *dssdev); 78762306a36Sopenharmony_ciint omapdss_output_unset_device(struct omap_dss_device *out); 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_cistruct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device *dssdev); 79062306a36Sopenharmony_cistruct omap_overlay_manager *omapdss_find_mgr_from_display(struct omap_dss_device *dssdev); 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_civoid omapdss_default_get_resolution(struct omap_dss_device *dssdev, 79362306a36Sopenharmony_ci u16 *xres, u16 *yres); 79462306a36Sopenharmony_ciint omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev); 79562306a36Sopenharmony_civoid omapdss_default_get_timings(struct omap_dss_device *dssdev, 79662306a36Sopenharmony_ci struct omap_video_timings *timings); 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ciint omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask); 79962306a36Sopenharmony_ciint omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask); 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ciint omapdss_compat_init(void); 80262306a36Sopenharmony_civoid omapdss_compat_uninit(void); 80362306a36Sopenharmony_ci 80462306a36Sopenharmony_cistatic inline bool omapdss_device_is_connected(struct omap_dss_device *dssdev) 80562306a36Sopenharmony_ci{ 80662306a36Sopenharmony_ci return dssdev->src; 80762306a36Sopenharmony_ci} 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_cistatic inline bool omapdss_device_is_enabled(struct omap_dss_device *dssdev) 81062306a36Sopenharmony_ci{ 81162306a36Sopenharmony_ci return dssdev->state == OMAP_DSS_DISPLAY_ACTIVE; 81262306a36Sopenharmony_ci} 81362306a36Sopenharmony_ci 81462306a36Sopenharmony_cistruct device_node * 81562306a36Sopenharmony_ciomapdss_of_get_next_port(const struct device_node *parent, 81662306a36Sopenharmony_ci struct device_node *prev); 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_cistruct device_node * 81962306a36Sopenharmony_ciomapdss_of_get_next_endpoint(const struct device_node *parent, 82062306a36Sopenharmony_ci struct device_node *prev); 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_cistruct device_node * 82362306a36Sopenharmony_ciomapdss_of_get_first_endpoint(const struct device_node *parent); 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_cistruct omap_dss_device * 82662306a36Sopenharmony_ciomapdss_of_find_source_for_first_ep(struct device_node *node); 82762306a36Sopenharmony_ci#else 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_cistatic inline enum omapdss_version omapdss_get_version(void) 83062306a36Sopenharmony_ci{ return OMAPDSS_VER_UNKNOWN; }; 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_cistatic inline bool omapdss_is_initialized(void) 83362306a36Sopenharmony_ci{ return false; }; 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_cistatic inline int omap_dispc_register_isr(omap_dispc_isr_t isr, 83662306a36Sopenharmony_ci void *arg, u32 mask) 83762306a36Sopenharmony_ci{ return 0; }; 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_cistatic inline int omap_dispc_unregister_isr(omap_dispc_isr_t isr, 84062306a36Sopenharmony_ci void *arg, u32 mask) 84162306a36Sopenharmony_ci{ return 0; }; 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_cistatic inline struct omap_dss_device 84462306a36Sopenharmony_ci*omap_dss_get_device(struct omap_dss_device *dssdev) 84562306a36Sopenharmony_ci{ return NULL; }; 84662306a36Sopenharmony_ci 84762306a36Sopenharmony_cistatic inline struct omap_dss_device 84862306a36Sopenharmony_ci*omap_dss_get_next_device(struct omap_dss_device *from) 84962306a36Sopenharmony_ci{return NULL; }; 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_cistatic inline void omap_dss_put_device(struct omap_dss_device *dssdev) {}; 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_cistatic inline int omapdss_compat_init(void) 85462306a36Sopenharmony_ci{ return 0; }; 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_cistatic inline void omapdss_compat_uninit(void) {}; 85762306a36Sopenharmony_ci 85862306a36Sopenharmony_cistatic inline int omap_dss_get_num_overlay_managers(void) 85962306a36Sopenharmony_ci{ return 0; }; 86062306a36Sopenharmony_ci 86162306a36Sopenharmony_cistatic inline struct omap_overlay_manager *omap_dss_get_overlay_manager(int num) 86262306a36Sopenharmony_ci{ return NULL; }; 86362306a36Sopenharmony_ci 86462306a36Sopenharmony_cistatic inline int omap_dss_get_num_overlays(void) 86562306a36Sopenharmony_ci{ return 0; }; 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_cistatic inline struct omap_overlay *omap_dss_get_overlay(int num) 86862306a36Sopenharmony_ci{ return NULL; }; 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ci 87162306a36Sopenharmony_ci#endif /* FB_OMAP2 */ 87262306a36Sopenharmony_ci 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci#endif /* __OMAPFB_DSS_H */ 875