1
0
mirror of https://github.com/physwizz/a155-U-u1.git synced 2025-10-07 10:09:34 +00:00
Files
physwizz 99537be4e2 first
2024-03-11 06:53:12 +11:00

1111 lines
28 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) Samsung Electronics Co., Ltd.
* Gwanghui Lee <gwanghui.lee@samsung.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __PANEL_H__
#define __PANEL_H__
#include <linux/lcd.h>
#include <linux/backlight.h>
#include <linux/spi/spi.h>
#include <linux/sysfs.h>
#include "panel_kunit.h"
#include "panel_obj.h"
#include "maptbl.h"
#include "util.h"
#include "panel_sequence.h"
#include "panel_property.h"
#include "panel_delay.h"
#include "panel_packet.h"
#include "panel_resource.h"
#include "panel_condition.h"
#include "panel_bl.h"
#include "panel_config.h"
#ifdef CONFIG_USDM_PANEL_DIMMING
#include "dimming.h"
#include "panel_dimming.h"
#endif
#ifdef CONFIG_USDM_MDNIE
#include "mdnie.h"
#endif
#ifdef CONFIG_USDM_PANEL_COPR
#include "copr.h"
#endif
#include "panel_vrr.h"
#include "panel_modes.h"
#ifdef CONFIG_USDM_PANEL_SELF_DISPLAY
#include "./aod/aod_drv.h"
#endif
#include "panel_obj.h"
#include "panel_dump.h"
#if defined(CONFIG_USDM_SDP_ADAPTIVE_MIPI)
#include "sdp_adaptive_mipi.h"
#elif defined(CONFIG_USDM_ADAPTIVE_MIPI)
#include "adaptive_mipi.h"
#endif
enum {
MIPI_DSI_WR_UNKNOWN = 0,
MIPI_DSI_WR_GEN_CMD,
MIPI_DSI_WR_DSC_CMD,
MIPI_DSI_WR_PPS_CMD,
MIPI_DSI_WR_GRAM_CMD,
MIPI_DSI_WR_SRAM_CMD,
MIPI_DSI_WR_SR_FAST_CMD,
MAX_MIPI_DSI_CMD_TYPE,
};
#define CONFIG_LCD_HBM_60_STEP
#define MIPI_DCS_WRITE_GRAM_START (0x2C)
#define MIPI_DCS_WRITE_GRAM_CONTINUE (0x3C)
#define MIPI_DCS_WRITE_SIDE_RAM_START (0x4C)
#define MIPI_DCS_WRITE_SIDE_RAM_CONTINUE (0x5C)
#define MIPI_DCS_WRITE_SPSRAM (0x6C)
#ifdef CONFIG_USDM_FACTORY
#define CONFIG_SUPPORT_PANEL_SWAP
#define CONFIG_SUPPORT_ISC_DEFECT
#endif
#define CONFIG_SUPPORT_XTALK_MODE
#define CONFIG_SUPPORT_GRAYSPOT_TEST
#define CONFIG_SUPPORT_SPI_IF_SEL
#define to_panel_device(_m_) container_of(_m_, struct panel_device, _m_)
/* DUMMY PANEL NAME */
#define __pn_name__ xx_xx
#define __PN_NAME__ XX_XX
#define PN_CONCAT(a, b) _PN_CONCAT(a, b)
#define _PN_CONCAT(a, b) a ## _ ## b
#if IS_ENABLED(CONFIG_USDM_PANEL_ID_READ_REG_ADAEAF)
#define PANEL_ID_REG (0xAD)
#elif IS_ENABLED(CONFIG_USDM_PANEL_ID_READ_REG_DADBDC) || \
(!IS_ENABLED(CONFIG_USDM_PANEL_ID_READ_REG_04) && IS_ENABLED(CONFIG_USDM_PANEL_TFT_COMMON))
#define PANEL_ID_REG (0xDA)
#else
#define PANEL_ID_REG (0x04)
#endif
#define PANEL_ID_LEN (3)
#define PANEL_OCTA_ID_LEN (20)
#define PANEL_POC_CHKSUM_LEN (5)
#define PANEL_POC_CTRL_LEN (4)
#define PANEL_CODE_LEN (5)
#define PANEL_COORD_LEN (4)
#define PANEL_DATE_LEN (7)
#define PANEL_RDDPM_LEN (1)
#define PANEL_RDDSM_LEN (1)
#define PANEL_VENDOR_LEN (3)
#define NORMAL_TEMPERATURE (25)
#define POWER_IS_ON(pwr) (pwr <= FB_BLANK_NORMAL)
#define UNDER_MINUS_15(temperature) (temperature <= -15)
#define UNDER_0(temperature) (temperature <= 0)
#define CAPS_IS_ON(level) (level >= 41)
#define PANEL_WAIT_VSYNC_TIMEOUT_MSEC (110)
struct mdnie_info;
/* external pin control command */
struct pininfo {
struct pnobj base;
int pin;
int onoff;
};
/* command type */
enum {
CMD_TYPE_NONE,
CMD_TYPE_PROP,
CMD_TYPE_FUNC,
CMD_TYPE_MAP,
/* delay */
CMD_TYPE_DELAY,
CMD_TYPE_TIMER_DELAY,
CMD_TYPE_TIMER_DELAY_BEGIN,
/* condition */
CMD_TYPE_COND_IF,
CMD_TYPE_COND_EL,
CMD_TYPE_COND_FI,
CMD_TYPE_PCTRL,
CMD_TYPE_RX_PACKET,
/* dependant command type */
CMD_TYPE_CFG,
CMD_TYPE_TX_PACKET,
CMD_TYPE_KEY,
CMD_TYPE_RES,
CMD_TYPE_DMP,
CMD_TYPE_SEQ,
MAX_CMD_TYPE,
};
#define IS_CMD_TYPE_MAP(_type_) ((_type_) == CMD_TYPE_MAP)
#define IS_CMD_TYPE_DUMP(_type_) ((_type_) == CMD_TYPE_DMP)
#define IS_CMD_TYPE_KEY(_type_) ((_type_) == CMD_TYPE_KEY)
#define IS_CMD_TYPE_RES(_type_) ((_type_) == CMD_TYPE_RES)
#define IS_CMD_TYPE_SEQ(_type_) ((_type_) == CMD_TYPE_SEQ)
#define IS_CMD_TYPE_TX_PKT(_type_) \
((_type_) == CMD_TYPE_TX_PACKET)
#define IS_CMD_TYPE_RX_PKT(_type_) \
((_type_) == CMD_TYPE_RX_PACKET)
#define IS_CMD_TYPE_DELAY(_type_) \
((_type_) == CMD_TYPE_DELAY)
#define IS_CMD_TYPE_TIMER_DELAY(_type_) \
((_type_) == CMD_TYPE_TIMER_DELAY || \
(_type_) == CMD_TYPE_TIMER_DELAY_BEGIN)
#define IS_CMD_TYPE_COND(_type_) \
((_type_) >= CMD_TYPE_COND_IF && (_type_) <= CMD_TYPE_COND_FI)
#define IS_CMD_TYPE_PWRCTRL(_type_) ((_type_) == CMD_TYPE_PCTRL)
#define IS_CMD_TYPE_PROP(_type_) ((_type_) == CMD_TYPE_PROP)
#define IS_CMD_TYPE_CFG(_type_) ((_type_) == CMD_TYPE_CFG)
#define IS_CMD_TYPE_FUNC(_type_) ((_type_) == CMD_TYPE_FUNC)
enum {
KEY_NONE,
KEY_DISABLE,
KEY_ENABLE,
MAX_KEY_TYPE,
};
enum cmd_level {
CMD_LEVEL_NONE,
CMD_LEVEL_1,
CMD_LEVEL_2,
CMD_LEVEL_3,
MAX_CMD_LEVEL,
};
/* key level command */
struct keyinfo {
struct pnobj base;
enum cmd_level level;
u32 en;
struct pktinfo *packet;
};
#define KEYINFO(_name_) PN_CONCAT(key, _name_)
#define KEYINFO_INIT(_keyname, _lv, _en, _pkt) \
{ .base = __PNOBJ_INITIALIZER(_keyname, CMD_TYPE_KEY) \
, .level = (_lv) \
, .en = (_en) \
, .packet = (_pkt) }
#define DEFINE_PANEL_KEY(_keyname, _lv, _en, _pkt) \
struct keyinfo KEYINFO(_keyname) = KEYINFO_INIT(_keyname, _lv, _en, _pkt)
static inline char *get_key_name(struct keyinfo *key)
{
return get_pnobj_name(&key->base);
}
enum cmd_mode {
CMD_MODE_NONE,
CMD_MODE_RO,
CMD_MODE_WO,
CMD_MODE_RW,
MAX_CMD_MODE,
};
struct ldi_reg_desc {
u8 addr;
char *name;
enum cmd_mode mode;
enum cmd_level level;
bool dirty;
};
struct freq_hop_param {
u32 dsi_freq;
u32 osc_freq;
};
#define MAX_LDI_REG (0x100)
#define LDI_REG_DESC(_addr_, _name_, _mode_, _level_) \
[(_addr_)] = { \
.addr = (_addr_), \
.name = (_name_), \
.mode = (_mode_), \
.level = (_level_), \
.dirty = (0), \
}
#define PANEL_NONE_SEQ ("panel_none_seq")
#define PANEL_INIT_SEQ ("panel_init_seq")
#define PANEL_EXIT_SEQ ("panel_exit_seq")
#define PANEL_BOOT_SEQ ("panel_boot_seq")
#define PANEL_RES_INIT_SEQ ("panel_res_init_seq")
#ifdef CONFIG_USDM_PANEL_DIM_FLASH
#define PANEL_DIM_FLASH_RES_INIT_SEQ ("panel_dim_flash_res_init_seq")
#endif
#ifdef CONFIG_USDM_PANEL_GM2_FLASH
#define PANEL_GM2_FLASH_RES_INIT_SEQ ("panel_gm2_flash_res_init_seq")
#endif
#define PANEL_MAP_INIT_SEQ ("panel_map_init_seq")
#define PANEL_DISPLAY_ON_SEQ ("panel_display_on_seq")
#define PANEL_DISPLAY_OFF_SEQ ("panel_display_off_seq")
#define PANEL_ALPM_INIT_SEQ ("panel_alpm_init_seq")
#define PANEL_ALPM_SET_BL_SEQ ("panel_alpm_set_bl_seq")
#define PANEL_ALPM_EXIT_SEQ ("panel_alpm_exit_seq")
#define PANEL_ALPM_EXIT_AFTER_SEQ ("panel_alpm_exit_after_seq")
#define PANEL_SET_BL_SEQ ("panel_set_bl_seq")
#ifdef CONFIG_USDM_PANEL_HMD
#define PANEL_HMD_ON_SEQ ("panel_hmd_on_seq")
#define PANEL_HMD_OFF_SEQ ("panel_hmd_off_seq")
#define PANEL_HMD_BL_SEQ ("panel_hmd_bl_seq")
#endif
#define PANEL_HBM_ON_SEQ ("panel_hbm_on_seq")
#define PANEL_HBM_OFF_SEQ ("panel_hbm_off_seq")
#if defined(CONFIG_USDM_PANEL_DISPLAY_MODE)
#define PANEL_DISPLAY_MODE_SEQ ("panel_display_mode_seq")
#endif
#define PANEL_FPS_SEQ ("panel_fps_seq")
#define PANEL_BLACK_AND_FPS_SEQ ("panel_black_and_fps_seq")
#define PANEL_MCD_ON_SEQ ("panel_mcd_on_seq")
#define PANEL_MCD_OFF_SEQ ("panel_mcd_off_seq")
#define PANEL_MCD_RS_ON_SEQ ("panel_mcd_rs_on_seq")
#define PANEL_MCD_RS_OFF_SEQ ("panel_mcd_rs_off_seq")
#define PANEL_MCD_RS_READ_SEQ ("panel_mcd_rs_read_seq")
#ifdef CONFIG_USDM_FACTORY_MST_TEST
#define PANEL_MST_ON_SEQ ("panel_mst_on_seq")
#define PANEL_MST_OFF_SEQ ("panel_mst_off_seq")
#endif
#ifdef CONFIG_USDM_FACTORY_GCT_TEST
#define PANEL_GCT_ENTER_SEQ ("panel_gct_enter_seq")
#define PANEL_GCT_VDDM_SEQ ("panel_gct_vddm_seq")
#define PANEL_GCT_IMG_UPDATE_SEQ ("panel_gct_img_update_seq")
#define PANEL_GCT_IMG_0_UPDATE_SEQ ("panel_gct_img_0_update_seq")
#define PANEL_GCT_IMG_1_UPDATE_SEQ ("panel_gct_img_1_update_seq")
#define PANEL_GCT_EXIT_SEQ ("panel_gct_exit_seq")
#endif
#if defined(CONFIG_USDM_FACTORY_FAST_DISCHARGE)
#define PANEL_FD_SEQ ("panel_fd_seq")
#endif
#ifdef CONFIG_SUPPORT_GRAYSPOT_TEST
#define PANEL_GRAYSPOT_ON_SEQ ("panel_grayspot_on_seq")
#define PANEL_GRAYSPOT_OFF_SEQ ("panel_grayspot_off_seq")
#endif
#ifdef CONFIG_SUPPORT_ISC_DEFECT
#define PANEL_CHECK_ISC_DEFECT_SEQ ("panel_check_isc_defect_seq")
#endif
#ifdef CONFIG_SUPPORT_SPI_IF_SEL
#define PANEL_SPI_IF_ON_SEQ ("panel_spi_if_on_seq")
#define PANEL_SPI_IF_OFF_SEQ ("panel_spi_if_off_seq")
#endif
#ifdef CONFIG_USDM_FACTORY_CCD_TEST
#define PANEL_CCD_TEST_SEQ ("panel_ccd_test_seq")
#endif
#define PANEL_FLASH_TEST_SEQ ("panel_flash_test_seq")
#ifdef CONFIG_USDM_PANEL_MAFPC
#define PANEL_MAFPC_ON_SEQ ("panel_mafpc_on_seq")
#define PANEL_MAFPC_OFF_SEQ ("panel_mafpc_off_seq")
#define PANEL_MAFPC_SCALE_FACTOR_SEQ ("panel_mafpc_scale_factor_seq")
#define PANEL_MAFPC_IMG_SEQ ("panel_mafpc_img_seq")
#define PANEL_MAFPC_CHECKSUM_SEQ ("panel_mafpc_checksum_seq")
#endif
#define PANEL_PARTIAL_DISP_ON_SEQ ("panel_partial_disp_on_seq")
#define PANEL_PARTIAL_DISP_OFF_SEQ ("panel_partial_disp_off_seq")
#define PANEL_DUMP_SEQ ("panel_dump_seq")
#ifdef CONFIG_USDM_DDI_CMDLOG
#define PANEL_CMDLOG_DUMP_SEQ ("panel_cmdlog_dump_seq")
#endif
#define PANEL_CHECK_CONDITION_SEQ ("panel_check_condition_seq")
#define PANEL_DIA_ONOFF_SEQ ("panel_dia_onoff_seq")
#ifdef CONFIG_USDM_PANEL_MASK_LAYER
#define PANEL_MASK_LAYER_STOP_DIMMING_SEQ ("panel_mask_layer_stop_dimming_seq")
#define PANEL_MASK_LAYER_ENTER_BR_SEQ ("panel_mask_layer_enter_br_seq")
#define PANEL_MASK_LAYER_EXIT_BR_SEQ ("panel_mask_layer_exit_br_seq")
#endif
#ifdef CONFIG_USDM_FACTORY_BRIGHTDOT_TEST
#define PANEL_BRIGHTDOT_TEST_SEQ ("panel_brightdot_test_seq")
#endif
#ifdef CONFIG_USDM_FACTORY_VGLHIGHDOT_TEST
#define PANEL_VGLHIGHDOT_TEST_SEQ ("panel_vglhighdot_test_seq")
#endif
#define PANEL_FFC_SEQ ("panel_ffc_seq")
#define PANEL_OSC_SEQ ("panel_osc_seq")
#ifdef CONFIG_USDM_FACTORY_SSR_TEST
#define PANEL_SSR_TEST_SEQ ("panel_ssr_test_seq")
#endif
#ifdef CONFIG_USDM_FACTORY_ECC_TEST
#define PANEL_ECC_TEST_SEQ ("panel_ecc_test_seq")
#endif
#define PANEL_DECODER_TEST_SEQ ("panel_decoder_test_seq")
#define PANEL_PCD_DUMP_SEQ ("panel_pcd_dump_seq")
#define PANEL_DUMMY_SEQ ("panel_dummy_seq")
#define PANEL_FMEM_TEST_WRITE_SEQ ("panel_fmem_test_write_seq")
#define PANEL_FMEM_TEST_READ_SEQ ("panel_fmem_test_read_seq")
#if defined(CONFIG_USDM_LPD_AUTO_BR)
#define PANEL_LPD_BR_SEQ ("panel_lpd_br_seq")
#define PANEL_LPD_HBM_BR_SEQ ("panel_lpd_hbm_br_seq")
#define PANEL_LPD_INIT_SEQ ("panel_lpd_init_seq")
#endif
#if defined(CONFIG_USDM_PANEL_VCOM_TRIM_TEST)
#define PANEL_VCOM_TRIM_TEST_SEQ ("panel_vcom_trim_test_seq")
#endif
/* structure of sequence table */
struct brt_map {
int brt;
int lum;
};
#define DDI_SUPPORT_WRITE_GPARA (1U << 0)
#define DDI_SUPPORT_READ_GPARA (1U << 1)
#define DDI_SUPPORT_POINT_GPARA (1U << 2)
#define DDI_SUPPORT_2BYTE_GPARA (1U << 3)
enum {
PN_COMP_TYPE_NONE,
PN_COMP_TYPE_MIC,
PN_COMP_TYPE_DSC,
MAX_PN_COMP_TYPE,
};
struct panel_dsc {
u32 slice_w;
u32 slice_h;
};
enum vrr_mode {
VRR_NORMAL_MODE,
VRR_HS_MODE,
MAX_VRR_MODE,
};
enum {
VRR_AID_2_CYCLE,
VRR_AID_4_CYCLE,
};
#define TE_SKIP_TO_DIV(_sw_skip, _hw_skip) \
((_sw_skip + 1) * (_hw_skip + 1))
struct panel_vrr {
u32 fps;
u32 base_fps;
u32 base_vactive;
u32 base_vfp;
u32 base_vbp;
int te_sel;
int te_v_st;
int te_v_ed;
u32 te_sw_skip_count;
u32 te_hw_skip_count;
u32 mode;
int aid_cycle;
};
struct panel_resol {
unsigned int w;
unsigned int h;
unsigned int comp_type;
union {
struct panel_dsc dsc;
} comp_param;
struct panel_vrr **available_vrr;
unsigned int nr_available_vrr;
};
struct panel_mres {
u32 nr_resol;
struct panel_resol *resol;
};
#ifdef CONFIG_USDM_PANEL_MASK_LAYER
enum {
MASK_LAYER_ON_BEFORE,
MASK_LAYER_ON_AFTER,
MASK_LAYER_OFF_BEFORE,
MASK_LAYER_OFF_AFTER,
MAX_MASK_LAYER,
};
enum {
MASK_LAYER_HOOK_OFF,
MASK_LAYER_HOOK_ON,
MAX_MASK_LAYER_HOOK,
};
struct mask_layer_data {
u32 req;
};
#endif
#if defined(CONFIG_USDM_PANEL_DISPLAY_MODE)
struct common_panel_display_mode {
char name[PANEL_DISPLAY_MODE_NAME_LEN];
struct panel_resol *resol;
struct panel_vrr *vrr;
};
struct common_panel_display_modes {
unsigned int num_modes;
struct common_panel_display_mode **modes;
};
#endif
struct ddi_properties {
u32 gpara;
bool support_partial_disp;
//D2: avoid abnormal screen issue
bool ssd_off_lpm_to_normal;
u32 cmd_fifo_size;
u32 img_fifo_size;
bool err_fg_recovery;
bool err_fg_powerdown;
bool support_vrr;
bool support_vrr_lfd;
u32 dft_dsi_freq; //hs clock speen interface to AP, unit: khz
u32 dft_osc_freq; //ddi's oscillator clock rate, unit: khz
bool init_seq_by_lpdt;
bool support_avoid_sandstorm;
bool evasion_disp_det;
};
struct ddi_ops {
int (*ddi_init)(struct panel_device *panel, void *data, u32 size);
int (*gamma_flash_checksum)(struct panel_device *panel, void *data, u32 size);
int (*mtp_gamma_check)(struct panel_device *panel, void *data, u32 size);
#ifdef CONFIG_USDM_FACTORY_SSR_TEST
int (*ssr_test)(struct panel_device *panel, void *data, u32 size);
#endif
#ifdef CONFIG_USDM_FACTORY_ECC_TEST
int (*ecc_test)(struct panel_device *panel, void *data, u32 size);
#endif
int (*decoder_test)(struct panel_device *panel, void *data, u32 size);
#if defined(CONFIG_USDM_PANEL_VCOM_TRIM_TEST)
int (*vcom_trim_test)(struct panel_device *panel, void *data, u32 size);
#endif
int (*get_cell_id)(struct panel_device *panel, void *data);
int (*get_octa_id)(struct panel_device *panel, void *data);
int (*get_manufacture_code)(struct panel_device *panel, void *data);
int (*get_manufacture_date)(struct panel_device *panel, void *data);
int (*get_temperature_range)(struct panel_device *panel, void *data);
};
struct rcd_region {
int x;
int y;
int w;
int h;
};
struct rcd_image {
char *name;
struct rcd_region image_rect;
u8 *image_data;
u32 image_data_len;
};
struct rcd_resol {
char *name;
int resol_x;
int resol_y;
struct rcd_image **images;
int nr_images;
struct rcd_region block_rect;
};
struct panel_rcd_data {
u32 version;
char *name;
struct rcd_resol **rcd_resol;
int nr_rcd_resol;
};
enum {
USDM_DRV_LEVEL_COMMON,
USDM_DRV_LEVEL_DDI,
USDM_DRV_LEVEL_MODEL,
MAX_USDM_DRV_LEVEL,
};
struct common_panel_info {
char *ldi_name;
char *name;
char *model;
char *vendor;
u32 id;
u32 rev;
struct ddi_properties ddi_props;
struct ddi_ops ddi_ops;
struct panel_mres mres;
struct panel_vrr **vrrtbl;
int nr_vrrtbl;
struct maptbl *maptbl;
int nr_maptbl;
struct seqinfo *seqtbl;
int nr_seqtbl;
struct rdinfo *rditbl;
int nr_rditbl;
struct resinfo *restbl;
int nr_restbl;
struct dumpinfo *dumpinfo;
int nr_dumpinfo;
struct mdnie_tune *mdnie_tune;
struct panel_dimming_info *panel_dim_info[MAX_PANEL_BL_SUBDEV];
#ifdef CONFIG_USDM_PANEL_COPR
struct panel_copr_data *copr_data;
#endif
#ifdef CONFIG_USDM_PANEL_SELF_DISPLAY
struct aod_tune *aod_tune;
#endif
#ifdef CONFIG_USDM_PANEL_DDI_FLASH
struct panel_poc_data *poc_data;
#endif
#ifdef CONFIG_USDM_POC_SPI
struct spi_data *spi_data;
struct spi_data **spi_data_tbl;
int nr_spi_data_tbl;
#endif
#ifdef CONFIG_USDM_PANEL_BLIC
struct blic_data **blic_data_tbl;
int nr_blic_data_tbl;
#endif
#ifdef CONFIG_USDM_PANEL_FREQ_HOP
struct freq_hop_elem *freq_hop_elems;
int nr_freq_hop_elems;
#endif
#if defined(CONFIG_USDM_ADAPTIVE_MIPI)
struct rf_band_element *rf_elements;
unsigned int rf_element_nr;
#endif
#ifdef CONFIG_USDM_PANEL_MAFPC
struct mafpc_info *mafpc_info;
#endif
#if defined(CONFIG_USDM_PANEL_DISPLAY_MODE)
struct common_panel_display_modes *common_panel_modes;
#endif
#ifdef CONFIG_USDM_PANEL_RCD
struct panel_rcd_data *rcd_data;
#endif
struct panel_prop_list *prop_lists[MAX_USDM_DRV_LEVEL];
unsigned int num_prop_lists[MAX_USDM_DRV_LEVEL];
const char *ezop_json;
};
enum {
OVER_ZERO,
UNDER_ZERO,
UNDER_MINUS_FIFTEEN,
DIM_OVER_ZERO,
DIM_UNDER_ZERO,
DIM_UNDER_MINUS_FIFTEEN,
TEMP_MAX,
};
enum {
POC_ONOFF_OFF,
POC_ONOFF_ON,
POC_ONOFF_MAX
};
enum {
ACL_PWRSAVE_OFF,
ACL_PWRSAVE_ON,
MAX_ACL_PWRSAVE,
};
enum {
SMOOTH_TRANS_OFF,
SMOOTH_TRANS_ON,
SMOOTH_TRANS_MAX,
};
enum {
NIGHT_DIM_OFF,
NIGHT_DIM_ON,
};
enum {
ALPM_OFF = 0,
ALPM_LOW_BR,
HLPM_LOW_BR,
ALPM_HIGH_BR,
HLPM_HIGH_BR,
};
enum {
PANEL_HBM_OFF,
PANEL_HBM_ON,
MAX_PANEL_HBM,
};
#ifdef CONFIG_SUPPORT_XTALK_MODE
enum {
XTALK_OFF,
XTALK_ON,
};
#endif
enum {
IRC_MODE_MODERATO,
IRC_MODE_FLAT_GAMMA,
MAX_IRC_MODE,
};
#ifdef CONFIG_USDM_FACTORY_GCT_TEST
enum {
GRAM_CHKSUM_OFF,
GRAM_CHKSUM_LV_TEST_1,
GRAM_CHKSUM_LV_TEST_2,
GRAM_CHKSUM_HV_TEST_1,
GRAM_CHKSUM_HV_TEST_2,
MAX_GRAM_CHKSUM,
};
enum {
GCT_PATTERN_NONE,
GCT_PATTERN_1,
GCT_PATTERN_2,
MAX_GCT_PATTERN,
};
#define PANEL_PROPERTY_GCT_PATTERN ("panel_gct_pattern")
enum {
VDDM_ORIG,
VDDM_LV,
VDDM_HV,
MAX_VDDM,
};
#define PANEL_PROPERTY_GCT_VDDM ("panel_gct_vddm")
enum {
GRAM_TEST_OFF,
GRAM_TEST_ON,
GRAM_TEST_SKIPPED,
};
#endif
enum {
DECODER_TEST_OFF,
DECODER_TEST_ON,
DECODER_TEST_SKIPPED,
};
enum {
MCD_RS_1_RIGHT,
MCD_RS_1_LEFT,
MCD_RS_2_RIGHT,
MCD_RS_2_LEFT,
MAX_MCD_RS,
};
enum {
DIM_TYPE_AID_DIMMING,
DIM_TYPE_DIM_FLASH,
MAX_DIM_TYPE,
};
#if defined(CONFIG_UML)
#define MAX_PANEL (128)
#else
#define MAX_PANEL (32)
#endif
#define MAX_PANEL_DDI (8)
#define MAX_PANEL_LUT (128)
enum {
PANEL_ID,
PANEL_MASK,
PANEL_INDEX,
PANEL_DDI_INDEX,
};
struct panel_id_mask {
int id;
int mask;
struct list_head head;
};
struct panel_dt_lut {
const char *name;
struct device_node *ap_vendor_setting_node;
struct device_node *panel_modes_node;
struct device_node *power_ctrl_node;
#ifdef CONFIG_USDM_PANEL_FREQ_HOP
struct device_node *freq_hop_node;
#endif
struct list_head head;
struct list_head id_mask_list;
const char *dqe_suffix;
#if defined(CONFIG_USDM_SDP_ADAPTIVE_MIPI) ||\
defined(CONFIG_USDM_ADAPTIVE_MIPI)
struct device_node *adap_mipi_node;
#endif
};
struct panel_lut {
u32 id;
u32 mask;
u32 index;
u32 ddi_index;
};
struct panel_lut_info {
const char *names[MAX_PANEL];
int nr_panel;
struct device_node *ap_vendor_setting_node[MAX_PANEL_DDI];
int nr_ap_vendor_setting;
struct device_node *panel_modes_node[MAX_PANEL_DDI];
int nr_panel_modes;
struct device_node *panel_power_ctrl[MAX_PANEL_DDI];
int nr_panel_power_ctrl;
struct panel_lut lut[MAX_PANEL_LUT];
int nr_lut;
};
struct panel_properties {
s32 temperature;
u32 siop_enable;
u32 adaptive_control;
u32 alpm_mode;
u32 cur_alpm_mode;
s32 lpm_brightness;
u32 lpm_opr;
u32 lpm_fps;
u32 cur_lpm_opr;
u32 mcd_on;
u32 mcd_resistance;
int mcd_rs_range[MAX_MCD_RS][2];
int mcd_rs_flash_range[MAX_MCD_RS][2];
#ifdef CONFIG_USDM_FACTORY_MST_TEST
u32 mst_on;
#endif
u32 hmd_on;
u32 hmd_brightness;
u32 lux;
#ifdef CONFIG_SUPPORT_XTALK_MODE
u32 xtalk_mode;
#endif
#ifdef CONFIG_USDM_PANEL_DDI_FLASH
u32 poc_op;
#endif
#ifdef CONFIG_USDM_FACTORY_GCT_TEST
u32 gct_on;
u32 gct_vddm;
u32 gct_pattern;
u8 gct_valid_chksum[4];
#endif
#ifdef CONFIG_SUPPORT_GRAYSPOT_TEST
u32 grayspot;
#endif
u32 poc_onoff;
u32 key[MAX_CMD_LEVEL];
u32 irc_mode;
#ifdef CONFIG_USDM_PANEL_DIM_FLASH
bool dim_flash_on;
u32 dim_flash_state; /* success or fail */
u32 cur_dim_type; /* AID DIMMING or DIM FLASH */
#endif
u32 panel_partial_disp;
u32 panel_mode;
/* resolution */
u32 mres_updated;
u32 old_mres_mode;
u32 mres_mode;
u32 xres;
u32 yres;
/* variable refresh rate */
u32 vrr_fps;
u32 vrr_mode;
u32 vrr_idx;
/* original variable refresh rate */
u32 vrr_origin_fps;
u32 vrr_origin_mode;
u32 vrr_origin_idx;
bool vrr_updated;
struct vrr_lfd_info vrr_lfd_info;
struct vrr_lfd_info prev_vrr_lfd_info;
u32 dia_mode;
u32 ub_con_cnt;
u32 conn_det_enable;
#if defined(CONFIG_USDM_FACTORY_FAST_DISCHARGE)
u32 enable_fd;
#endif
#ifdef CONFIG_USDM_FACTORY_BRIGHTDOT_TEST
u32 brightdot_test_enable;
#endif
#ifdef CONFIG_USDM_FACTORY_VGLHIGHDOT_TEST
u32 vglhighdot;
#endif
u32 dsi_freq;
u32 osc_freq;
u32 board_rev;
};
struct panel_info {
const char *ldi_name;
unsigned int id[PANEL_ID_LEN];
unsigned char vendor[PANEL_ID_LEN];
struct panel_properties props;
struct ddi_properties ddi_props;
struct ddi_ops ddi_ops;
struct panel_mres mres;
/* platform dependent data - ex> exynos : dsim_device */
void *pdata;
void *dim_info[MAX_PANEL_BL_SUBDEV];
void *dim_flash_info[MAX_PANEL_BL_SUBDEV];
struct panel_vrr **vrrtbl;
int nr_vrrtbl;
struct panel_dimming_info *panel_dim_info[MAX_PANEL_BL_SUBDEV];
int nr_panel_dim_info;
struct list_head panel_lut_info;
#if defined(CONFIG_USDM_PANEL_DISPLAY_MODE)
struct common_panel_display_modes *common_panel_modes;
#endif
#ifdef CONFIG_USDM_PANEL_RCD
struct panel_rcd_data *rcd_data;
#endif
const char *dqe_suffix;
const char *ezop_json;
};
struct attr_show_args {
const char *name;
char *buf;
size_t size;
};
struct attr_store_args {
const char *name;
const char *buf;
size_t size;
};
struct attr_exist_args {
const char *name;
};
enum panel_sysfs_attr_flag {
PA_USER = (BIT_MASK(1)), /* USER build */
PA_FACTORY = (BIT_MASK(2)), /* FACTORY build */
PA_DEBUG_ONLY = (BIT_MASK(3)), /* Not shown in case of ship build */
PA_DEFAULT = PA_USER | PA_FACTORY,
};
struct panel_device_attr {
struct device_attribute dev_attr;
ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);
u32 flags;
bool node_created;
};
#define __PANEL_ATTR_RO(_name, _mode, _flags) { \
.dev_attr = __ATTR(_name, _mode, \
PN_CONCAT(_name, show), NULL), \
.flags = _flags, \
}
#define __PANEL_ATTR_WO(_name, _mode, _flags) { \
.dev_attr = __ATTR(_name, _mode, \
NULL, sysfs_store_check_test_mode), \
.flags = _flags, \
.store = PN_CONCAT(_name, store) \
}
#define __PANEL_ATTR_RW(_name, _mode, _flags) { \
.dev_attr = __ATTR(_name, _mode, \
PN_CONCAT(_name, show), sysfs_store_check_test_mode), \
.flags = _flags, \
.store = PN_CONCAT(_name, store) \
}
enum sysfs_arg_type {
SYSFS_ARG_TYPE_NONE,
SYSFS_ARG_TYPE_S32,
SYSFS_ARG_TYPE_U32,
SYSFS_ARG_TYPE_STR,
MAX_SYSFS_ARG_TYPE,
};
#define MAX_SYSFS_ARG_NUM (6)
#define MAX_SYSFS_ARG_STR_LEN (32)
struct sysfs_arg {
const char *name;
unsigned int nargs;
enum sysfs_arg_type type;
};
struct sysfs_arg_out {
union {
s32 val_s32;
u32 val_u32;
char val_str[MAX_SYSFS_ARG_STR_LEN];
} d[MAX_SYSFS_ARG_NUM];
unsigned int nargs;
};
#ifdef CONFIG_USDM_FACTORY_SSR_TEST
enum ssr_test_result {
PANEL_SSR_TEST_FAIL = 0,
PANEL_SSR_TEST_PASS = 1,
MAX_PANEL_SSR_TEST
};
#endif
#ifdef CONFIG_USDM_FACTORY_ECC_TEST
enum ecc_test_result {
PANEL_ECC_TEST_FAIL = 0,
PANEL_ECC_TEST_PASS = 1,
MAX_PANEL_ECC_TEST
};
#endif
enum decoder_test_result {
PANEL_DECODER_TEST_FAIL = -1,
PANEL_DECODER_TEST_PASS = 1,
MAX_PANEL_DECODER_TEST
};
#if defined(CONFIG_USDM_PANEL_VCOM_TRIM_TEST)
enum vcom_trim_test_result {
PANEL_VCOM_TRIM_TEST_FAIL = 0,
PANEL_VCOM_TRIM_TEST_PASS = 1,
MAX_PANEL_VCOM_TRIM_TEST
};
#endif
static inline int search_table_u32(u32 *tbl, u32 sz_tbl, u32 value)
{
int i;
if (!tbl)
return -EINVAL;
for (i = 0; i < sz_tbl; i++)
if (tbl[i] == value)
return i;
return -1;
}
static inline int search_table(void *tbl, int itemsize, u32 sz_tbl, void *value)
{
int i;
if (!tbl)
return -EINVAL;
for (i = 0; i < sz_tbl; i++)
if (!memcmp(tbl + (i * itemsize),
value, itemsize))
return i;
return -1;
}
#define disp_div_round(n, m) ((((n) * 10 / (m)) + 5) / 10)
const char *cmd_type_to_string(u32 type);
int string_to_cmd_type(const char *str);
int register_common_panel(struct common_panel_info *info);
int deregister_common_panel(struct common_panel_info *info);
struct panel_dt_lut *find_panel_lut(struct panel_device *panel, u32 panel_id);
struct maptbl *find_panel_maptbl_by_substr(struct panel_device *panel, char *substr);
struct common_panel_info *find_panel(struct panel_device *panel, u32 id);
void print_panel_lut(struct panel_dt_lut *lut_info);
bool check_seqtbl_exist(struct panel_device *panel, char *seqname);
struct seqinfo *find_panel_seq_by_name(struct panel_device *panel, char *seqname);
struct pktinfo *find_packet_suffix(struct seqinfo *seqtbl, char *name);
struct panel_dimming_info *find_panel_dimming(struct panel_info *panel_data, char *name);
int execute_sequence_nolock(struct panel_device *panel, struct seqinfo *seq);
int panel_do_seqtbl(struct panel_device *panel, struct seqinfo *seqtbl);
int panel_do_seqtbl_by_name_nolock(struct panel_device *panel, char *seqname);
int panel_do_seqtbl_by_name(struct panel_device *panel, char *seqname);
struct resinfo *find_panel_resource(struct panel_device *panel, char *name);
bool is_panel_resource_initialized(struct panel_device *panel, char *name);
int panel_resource_clear(struct panel_device *panel, char *name);
int panel_resource_copy(struct panel_device *panel, u8 *dst, char *name);
int panel_resource_copy_and_clear(struct panel_device *panel, u8 *dst, char *name);
int get_panel_resource_size(struct panel_device *panel, char *name);
int panel_resource_update(struct panel_device *panel, struct resinfo *res);
int panel_resource_update_by_name(struct panel_device *panel, char *name);
int panel_do_init_maptbl(struct panel_device *panel, struct maptbl *maptbl);
struct dumpinfo *find_panel_dumpinfo(struct panel_device *panel, char *name);
struct resinfo *panel_get_dump_resource(struct panel_device *panel, char *name);
bool panel_is_dump_status_success(struct panel_device *panel, char *name);
int panel_init_dumpinfo(struct panel_device *panel, char *name);
int panel_dumpinfo_update(struct panel_device *panel, struct dumpinfo *info);
int panel_rx_nbytes(struct panel_device *panel, u32 type, u8 *buf, u8 addr, u32 pos, u32 len);
int panel_tx_nbytes(struct panel_device *panel, u32 type, u8 *buf, u8 addr, u32 pos, u32 len);
int panel_verify_tx_packet(struct panel_device *panel, u8 *src, u32 ofs, u8 len);
int panel_set_key(struct panel_device *panel, int level, bool on);
struct pktinfo *alloc_static_packet(char *name, u32 type, u8 *data, u32 dlen);
int check_panel_active(struct panel_device *panel, const char *caller);
int panel_dsi_wait_for_vsync(struct panel_device *panel, u32 timeout);
int panel_dsi_set_bypass(struct panel_device *panel, bool on);
int panel_dsi_get_bypass(struct panel_device *panel);
int panel_dsi_set_commit_retry(struct panel_device *panel, bool on);
int panel_dsi_print_dpu_event_log(struct panel_device *panel);
int panel_dsi_dump_dpu_register(struct panel_device *panel);
int panel_dsi_set_lpdt(struct panel_device *panel, bool on);
int panel_wake_lock(struct panel_device *panel, unsigned long timeout);
int panel_wake_unlock(struct panel_device *panel);
int panel_emergency_off(struct panel_device *panel);
#if defined(CONFIG_USDM_PANEL_FREQ_HOP) ||\
defined(CONFIG_USDM_SDP_ADAPTIVE_MIPI) ||\
defined(CONFIG_USDM_ADAPTIVE_MIPI)
int panel_set_freq_hop(struct panel_device *panel, struct freq_hop_param *param);
#endif
int panel_trigger_recovery(struct panel_device *panel);
int panel_parse_ap_vendor_node(struct panel_device *panel, struct device_node *node);
int panel_flush_image(struct panel_device *panel);
int read_panel_id(struct panel_device *panel, u8 *buf);
int panel_resource_prepare(struct panel_device *panel);
void print_panel_resource(struct panel_device *panel);
int panel_cmdq_get_size(struct panel_device *panel);
DECLARE_REDIRECT_MOCKABLE(panel_cmdq_flush, RETURNS(int), PARAMS(struct panel_device *));
#ifdef CONFIG_USDM_PANEL_SYSFS
int panel_sysfs_probe(struct panel_device *panel);
int panel_sysfs_remove(struct panel_device *panel);
ssize_t attr_store_for_each(struct class *cls, const char *name, const char *buf, size_t size);
ssize_t attr_show_for_each(struct class *cls, const char *name, char *buf);
ssize_t attr_exist_for_each(struct class *cls, const char *name);
#else
static inline int panel_sysfs_probe(struct panel_device *panel) { return 0; }
static inline int panel_sysfs_remove(struct panel_device *panel) { return 0; }
static inline ssize_t attr_store_for_each(struct class *cls, const char *name, const char *buf, size_t size) { return 0; }
static inline ssize_t attr_show_for_each(struct class *cls, const char *name, char *buf) { return 0; }
static inline ssize_t attr_exist_for_each(struct class *cls, const char *name) { return 0; }
#endif
ssize_t sysfs_store_check_test_mode(struct device *dev,
struct device_attribute *attr, const char *buf, size_t size);
#define IS_PANEL_ACTIVE(_panel) check_panel_active(_panel, __func__)
#endif /* __PANEL_H__ */