kernel_samsung_a53x/drivers/gpu/drm/samsung/panel/panel.h
2024-06-15 16:02:09 -03:00

1548 lines
36 KiB
C
Executable file

/* 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 "maptbl.h"
#include "util.h"
#include "panel_bl.h"
#ifdef CONFIG_PANEL_AID_DIMMING
#include "dimming.h"
#include "panel_dimming.h"
#endif
#ifdef CONFIG_EXYNOS_DECON_MDNIE_LITE
#include "mdnie.h"
#endif
#ifdef CONFIG_EXYNOS_DECON_LCD_COPR
#include "copr.h"
#endif
#include "panel_vrr.h"
#include "panel_modes.h"
#ifdef CONFIG_PANEL_NOTIFY
#include <linux/panel_notify.h>
#endif
#ifdef CONFIG_EXTEND_LIVE_CLOCK
#include "./aod/aod_drv.h"
#endif
#include "panel_obj.h"
enum {
MIPI_DSI_WR_UNKNOWN = 0,
MIPI_DSI_WR_GEN_CMD,
MIPI_DSI_WR_CMD_NO_WAKE,
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_MCD_PANEL_FACTORY
#define CONFIG_SUPPORT_PANEL_SWAP
#define CONFIG_SUPPORT_XTALK_MODE
#define CONFIG_SUPPORT_ISC_DEFECT
//#define CONFIG_SUPPORT_BRIGHTDOT_TEST
#define CONFIG_SELFMASK_FACTORY
#endif
#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_PANEL_ID_READ_REG_ADAEAF)
#define PANEL_ID_REG (0xAD)
#elif IS_ENABLED(CONFIG_PANEL_ID_READ_REG_DADBDC) || \
(!IS_ENABLED(CONFIG_PANEL_ID_READ_REG_04) && IS_ENABLED(CONFIG_EXYNOS_DECON_LCD_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 (3)
#define PANEL_RDDSM_LEN (3)
#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;
/*
* [command types]
* 1. delay
* 2. external pin control
* 3. packet write
*/
/* common cmdinfo */
struct cmdinfo {
u32 type;
char *name;
};
/* delay command */
struct delayinfo {
u32 type;
char *name;
u32 usec;
u32 nframe;
ktime_t s_time;
};
/* variable delay command */
struct variable_delayinfo {
u32 type;
char *name;
u32 usec;
ktime_t mark_time;
int (*func_delay)(struct panel_device *panel, ktime_t s_time, ktime_t mark_time);
int (*func_mark)(struct panel_device *panel, ktime_t s_time, ktime_t *mark_time);
struct cmdinfo mark;
};
struct timer_delay_begin_info {
u32 type;
char *name;
struct delayinfo *delay;
};
#define DLYINFO(_name_) (_name_)
#define TIMER_DLYINFO_BEGIN(_name_) PN_CONCAT(begin, _name_)
#define TIMER_DLYINFO(_name_) (_name_)
#define VARIABLE_DLYINFO(_name_) (_name_)
#define VARIABLE_DLYINFO_MARK(_name_) ((_name_).mark)
#define DEFINE_PANEL_UDELAY_NO_SLEEP(_name_, _usec_) \
struct delayinfo DLYINFO(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_DELAY_NO_SLEEP, \
.usec = (_usec_), \
}
#define DEFINE_PANEL_MDELAY_NO_SLEEP(_name_, _msec_) \
struct delayinfo DLYINFO(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_DELAY_NO_SLEEP, \
.usec = (_msec_) * 1000, \
}
#define DEFINE_PANEL_UDELAY(_name_, _usec_) \
struct delayinfo DLYINFO(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_DELAY, \
.usec = (_usec_), \
}
#define DEFINE_PANEL_MDELAY(_name_, _msec_) \
struct delayinfo DLYINFO(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_DELAY, \
.usec = (_msec_) * 1000, \
}
#define DEFINE_PANEL_FRAME_DELAY(_name_, _nframe_) \
struct delayinfo DLYINFO(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_FRAME_DELAY, \
.nframe = (_nframe_), \
}
#define DEFINE_PANEL_VSYNC_DELAY(_name_, _nvsync_) \
struct delayinfo DLYINFO(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_VSYNC_DELAY, \
.nframe = (_nvsync_), \
}
#define DEFINE_PANEL_VARIABLE_DELAY_MARK(_name_, _func_delay_, _func_mark_) \
struct variable_delayinfo DLYINFO(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_VARIABLE_DELAY, \
.usec = 0, \
.mark_time = (0ULL), \
.func_delay = (_func_delay_), \
.func_mark = (_func_mark_), \
.mark = { \
.type = CMD_TYPE_VARIABLE_DELAY_MARK, \
.name = #_name_, \
}, \
}
#define DEFINE_PANEL_VARIABLE_DELAY(_name_, _func_delay_) \
DEFINE_PANEL_VARIABLE_DELAY_MARK(_name_, _func_delay_, NULL)
#define DEFINE_PANEL_TIMER_BEGIN(_name_, _timer_delay_) \
struct timer_delay_begin_info TIMER_DLYINFO_BEGIN(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_TIMER_DELAY_BEGIN, \
.delay = (_timer_delay_), \
}
#define DEFINE_PANEL_TIMER_UDELAY(_name_, _usec_) \
struct delayinfo TIMER_DLYINFO(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_TIMER_DELAY, \
.usec = (_msec_), \
.s_time = (0ULL), \
}
#define DEFINE_PANEL_TIMER_MDELAY(_name_, _msec_) \
struct delayinfo TIMER_DLYINFO(_name_) = \
{ \
.name = #_name_, \
.type = CMD_TYPE_TIMER_DELAY, \
.usec = (_msec_) * 1000, \
.s_time = (0ULL), \
}
/* external pin control command */
struct pininfo {
u32 type;
char *name;
int pin;
int onoff;
};
/* packet command */
enum {
CMD_TYPE_NONE,
CMD_TYPE_DELAY,
CMD_TYPE_DELAY_NO_SLEEP,
CMD_TYPE_FRAME_DELAY,
CMD_TYPE_VSYNC_DELAY,
CMD_TYPE_TIMER_DELAY_BEGIN,
CMD_TYPE_TIMER_DELAY,
CMD_TYPE_VARIABLE_DELAY,
CMD_TYPE_VARIABLE_DELAY_MARK,
CMD_TYPE_PINCTL,
CMD_TYPE_TX_PKT_START,
CMD_PKT_TYPE_NONE = CMD_TYPE_TX_PKT_START,
DSI_PKT_TYPE_WR,
DSI_PKT_TYPE_WR_NO_WAKE,
DSI_PKT_TYPE_COMP,
DSI_PKT_TYPE_PPS,
/* Command to write ddi side ram */
DSI_PKT_TYPE_WR_SR,
/*write command to side ram with busy wait*/
DSI_PKT_TYPE_SR_FAST,
DSI_PKT_TYPE_WR_MEM,
CMD_TYPE_TX_PKT_END = DSI_PKT_TYPE_WR_MEM,
CMD_TYPE_RX_PKT_START,
SPI_PKT_TYPE_RD = CMD_TYPE_RX_PKT_START,
DSI_PKT_TYPE_RD_POC,
DSI_PKT_TYPE_RD,
CMD_TYPE_RX_PKT_END = DSI_PKT_TYPE_RD,
SPI_PKT_TYPE_WR,
SPI_PKT_TYPE_SETPARAM,
CMD_TYPE_I2C_START,
I2C_PKT_TYPE_WR = CMD_TYPE_I2C_START,
I2C_PKT_TYPE_RD,
CMD_TYPE_I2C_END = I2C_PKT_TYPE_RD,
CMD_TYPE_RES,
CMD_TYPE_SEQ,
CMD_TYPE_KEY,
CMD_TYPE_MAP,
CMD_TYPE_DMP,
CMD_TYPE_COND_IF,
CMD_TYPE_COND_EL,
CMD_TYPE_COND_FI,
CMD_TYPE_PCTRL,
CMD_TYPE_PROP,
MAX_CMD_TYPE,
};
#define IS_CMD_TYPE_TX_MEM_PKT(_type_) \
(DSI_PKT_TYPE_WR_SR <= (_type_) && (_type_) <= DSI_PKT_TYPE_WR_MEM)
#define IS_CMD_TYPE_TX_PKT(_type_) \
((CMD_TYPE_TX_PKT_START <= (_type_) && (_type_) <= CMD_TYPE_TX_PKT_END) ||\
(_type_) == CMD_TYPE_KEY)
#define IS_CMD_TYPE_RX_PKT(_type_) \
(CMD_TYPE_RX_PKT_START <= (_type_) && (_type_) <= CMD_TYPE_RX_PKT_END)
#define IS_CMD_TYPE_DELAY(_type_) \
((_type_) >= CMD_TYPE_DELAY && (_type_) <= CMD_TYPE_FRAME_DELAY)
#define IS_CMD_TYPE_TIMER_DELAY(_type_) \
((_type_) == CMD_TYPE_TIMER_DELAY_BEGIN || \
(_type_) == CMD_TYPE_TIMER_DELAY)
#define IS_CMD_TYPE_COND(_type_) \
((_type_) >= CMD_TYPE_COND_IF && (_type_) <= CMD_TYPE_COND_FI)
#define IS_CMD_TYPE_VARIABLE_DELAY(_type_) \
((_type_) == CMD_TYPE_VARIABLE_DELAY || (_type_) == CMD_TYPE_VARIABLE_DELAY_MARK)
enum {
RES_UNINITIALIZED,
RES_INITIALIZED,
MAX_RES_INIT_STATE
};
enum {
KEY_NONE,
KEY_DISABLE,
KEY_ENABLE,
};
enum cmd_level {
CMD_LEVEL_NONE,
CMD_LEVEL_1,
CMD_LEVEL_2,
CMD_LEVEL_3,
MAX_CMD_LEVEL,
};
/* key level command */
struct keyinfo {
u32 type;
char *name;
enum cmd_level level;
u32 en;
struct pktinfo *packet;
};
#define KEYINFO(_name_) PN_CONCAT(key, _name_)
#define KEYINFO_INIT(_name_, _lv_, _en_, _pkt_) \
{ \
.name = #_name_, \
.type = (CMD_TYPE_KEY), \
.level = (_lv_), \
.en = (_en_), \
.packet = (_pkt_), \
}
#define DEFINE_PANEL_KEY(_name_, _lv_, _en_, _pkt_) \
struct keyinfo KEYINFO(_name_) = KEYINFO_INIT(_name_, _lv_, _en_, _pkt_)
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), \
}
struct pkt_update_info {
u32 offset;
struct maptbl *maptbl;
u32 nr_maptbl;
int (*getidx)(struct pkt_update_info *pktui);
void *pdata;
};
enum {
PKT_OPTION_NONE = 0,
PKT_OPTION_CHECK_TX_DONE = (1 << 0),
PKT_OPTION_SR_ALIGN_4 = (1 << 1),
PKT_OPTION_SR_ALIGN_12 = (1 << 2),
PKT_OPTION_SR_ALIGN_16 = (1 << 3),
PKT_OPTION_SR_REG_6C = (1 << 4),
PKT_OPTION_SR_MAX_512 = (1 << 5),
PKT_OPTION_SR_MAX_1024 = (1 << 6),
PKT_OPTION_SR_MAX_2048 = (1 << 7),
};
struct pktinfo {
u32 type;
char *name;
u32 addr;
u8 *data;
u32 offset;
u32 dlen;
struct pkt_update_info *pktui;
u32 nr_pktui;
u32 option;
};
struct rdinfo {
u32 type;
char *name;
u32 addr;
u32 offset;
u32 len;
u8 *data;
};
struct res_update_info {
u32 offset;
struct rdinfo *rditbl;
};
struct resinfo {
u32 type;
char *name;
int state;
u8 *data;
u32 dlen;
struct res_update_info *resui;
u32 nr_resui;
};
struct dumpinfo {
u32 type;
char *name;
struct resinfo *res;
int (*callback)(struct dumpinfo *info);
};
struct condinfo {
u32 type;
char *name;
bool (*cond)(struct panel_device *panel);
};
struct condinfo_cont {
struct condinfo cond_if;
struct condinfo cond_el;
struct condinfo cond_fi;
};
struct pctrlinfo {
u32 type;
char *name;
char *pctrl_name;
};
struct propinfo {
u32 type;
char *name;
char *prop_name;
enum PANEL_OBJ_PROP_TYPE prop_type;
union {
unsigned int value;
char *str;
};
};
#define DUMPINFO_INIT(_name_, _res_, _callback_) \
{ \
.name = #_name_, \
.type = (CMD_TYPE_DMP), \
.res = (_res_), \
.callback = (_callback_), \
}
#define RESUI(_name_) PN_CONCAT(resui, _name_)
#define RESINFO(_name_) PN_CONCAT(res, _name_)
#define RESNAME(_name_) (_name_)
#define RDINFO(_name_) PN_CONCAT(rd, _name_)
#define RDINFO_INIT(_name_, _type_, _addr_, _offset_, _len_) \
{ \
.name = #_name_, \
.type = (_type_), \
.addr = (_addr_), \
.offset = (_offset_), \
.len = (_len_), \
}
#define DEFINE_RDINFO(_name_, _type_, _addr_, _offset_, _len_) \
struct rdinfo RDINFO(_name_) = RDINFO_INIT(_name_, _type_, _addr_, _offset_, _len_)
#define RESUI_INIT(_rditbl_, _offset_)\
{ \
.offset = (_offset_), \
.rditbl = (_rditbl_), \
}
#define DECLARE_RESUI(_name_) \
struct res_update_info RESUI(_name_)[]
#define DEFINE_RESUI(_name_, _rditbl_, _offset_) \
struct res_update_info RESUI(_name_)[] = \
{ \
RESUI_INIT(_rditbl_, _offset_), \
}
#define RESINFO_INIT(_name_, _arr_, _resui_) \
{ \
.name = #_name_, \
.type = (CMD_TYPE_RES), \
.state = (RES_UNINITIALIZED), \
.data = (_arr_), \
.dlen = ARRAY_SIZE((_arr_)), \
.resui = (_resui_), \
.nr_resui = (ARRAY_SIZE(_resui_)), \
}
#define DEFINE_RESOURCE(_name_, _arr_, _resui_) \
struct resinfo RESINFO(_name_) = RESINFO_INIT(_name_, _arr_, _resui_)
#define PKTUI(_name_) PN_CONCAT(pktui, _name_)
#define PKTINFO(_name_) PN_CONCAT(pkt, _name_)
#define DECLARE_PKTUI(_name_) \
struct pkt_update_info PKTUI(_name_)[]
#define DEFINE_PKTUI(_name_, _maptbl_, _update_offset_) \
struct pkt_update_info PKTUI(_name_)[] = \
{ \
{ \
.offset = (_update_offset_), \
.maptbl = (_maptbl_), \
.nr_maptbl = (1), \
.getidx = (NULL), \
}, \
}
#define PKTINFO_INIT(_name_, _type_, _arr_, _ofs_, _option_, _pktui_, _nr_pktui_) \
{ \
.name = (#_name_), \
.type = (_type_), \
.data = (_arr_), \
.offset = (_ofs_), \
.dlen = ARRAY_SIZE((_arr_)), \
.pktui = (_pktui_), \
.nr_pktui = (_nr_pktui_), \
.option = (_option_), \
}
#define DEFINE_PACKET(_name_, _type_, _arr_, _ofs_, _option_, _pktui_, _nr_pktui_) \
struct pktinfo PKTINFO(_name_) = PKTINFO_INIT(_name_, _type_, _arr_, _ofs_, _option_, _pktui_, _nr_pktui_)
#define DEFINE_VARIABLE_PACKET(_name_, _type_, _arr_, _ofs_) \
DEFINE_PACKET(_name_, _type_, _arr_, _ofs_, 0, PKTUI(_name_), ARRAY_SIZE(PKTUI(_name_)))
#define DEFINE_VARIABLE_PACKET_WITH_OPTION(_name_, _type_, _arr_, _ofs_, _option_) \
DEFINE_PACKET(_name_, _type_, _arr_, _ofs_, _option_, PKTUI(_name_), ARRAY_SIZE(PKTUI(_name_)))
#define DEFINE_STATIC_PACKET(_name_, _type_, _arr_, _ofs_) \
DEFINE_PACKET(_name_, _type_, _arr_, _ofs_, 0, (NULL), (0))
#define DEFINE_STATIC_PACKET_WITH_OPTION(_name_, _type_, _arr_, _ofs_, _option_) \
DEFINE_PACKET(_name_, _type_, _arr_, _ofs_, _option_, (NULL), (0))
#define PN_MAP_DATA_TABLE(_name_) PN_CONCAT(PN_CONCAT(__pn_name__, _name_), table)
#define PN_CMD_DATA_TABLE(_name_) PN_CONCAT(__PN_NAME__, _name_)
#define DEFINE_PN_STATIC_PACKET(_name_, _type_, _arr_) \
DEFINE_PACKET(PN_CONCAT(__pn_name__, _name_), _type_, \
PN_CONCAT(__PN_NAME__, _arr_), _ofs_, 0, NULL, 0)
#define CONDINFO_IF(_name_) ((PN_CONCAT(cond_info, _name_)).cond_if)
#define CONDINFO_EL(_name_) ((PN_CONCAT(cond_info, _name_)).cond_el)
#define CONDINFO_FI(_name_) ((PN_CONCAT(cond_info, _name_)).cond_fi)
#define DEFINE_COND(_name_, _func_) \
struct condinfo_cont PN_CONCAT(cond_info, _name_) = { \
.cond_if = { \
.name = (#_name_), \
.type = (CMD_TYPE_COND_IF), \
.cond = (void *) _func_, \
}, \
.cond_el = { \
.name = (#_name_), \
.type = (CMD_TYPE_COND_EL), \
.cond = NULL, \
}, \
.cond_fi = { \
.name = (#_name_), \
.type = (CMD_TYPE_COND_FI), \
.cond = NULL, \
}, \
}
#define DEFINE_PCTRL(_name_, _pctrl_name_) \
struct pctrlinfo PN_CONCAT(pctrl_info_, _name_) = { \
.type = (CMD_TYPE_PCTRL), \
.name = (#_name_), \
.pctrl_name = (_pctrl_name_), \
}
#define PCTRLINFO(_name_) PN_CONCAT(pctrl_info_, _name_)
#define DEFINE_SETPROP_VALUE(_name_, _prop_name_, _value_) \
struct propinfo PN_CONCAT(propinfo_, _name_) = { \
.type = (CMD_TYPE_PROP), \
.name = (#_name_), \
.prop_name = (_prop_name_), \
.prop_type = PANEL_OBJ_PROP_TYPE_VALUE, \
.value = (_value_), \
}
#define SETPROP(_name_) PN_CONCAT(propinfo_, _name_)
enum PANEL_SEQ {
PANEL_INIT_SEQ,
PANEL_EXIT_SEQ,
PANEL_BOOT_SEQ,
PANEL_RES_INIT_SEQ,
#ifdef CONFIG_SUPPORT_DIM_FLASH
PANEL_DIM_FLASH_RES_INIT_SEQ,
#endif
#ifdef CONFIG_SUPPORT_GM2_FLASH
PANEL_GM2_FLASH_RES_INIT_SEQ,
#endif
PANEL_MAP_INIT_SEQ,
PANEL_DISPLAY_ON_SEQ,
PANEL_DISPLAY_OFF_SEQ,
PANEL_ALPM_INIT_SEQ,
PANEL_ALPM_ENTER_SEQ,
PANEL_ALPM_SET_BL_SEQ = PANEL_ALPM_ENTER_SEQ,
PANEL_ALPM_DELAY_SEQ,
PANEL_ALPM_EXIT_SEQ,
PANEL_ALPM_EXIT_AFTER_SEQ,
PANEL_SET_BL_SEQ,
#ifdef CONFIG_SUPPORT_HMD
PANEL_HMD_ON_SEQ,
PANEL_HMD_OFF_SEQ,
PANEL_HMD_BL_SEQ,
#endif
PANEL_HBM_ON_SEQ,
PANEL_HBM_OFF_SEQ,
#if defined(CONFIG_PANEL_DISPLAY_MODE)
PANEL_DISPLAY_MODE_SEQ,
#endif
#ifdef CONFIG_SUPPORT_DSU
PANEL_DSU_SEQ,
#endif
PANEL_FPS_SEQ,
PANEL_BLACK_AND_FPS_SEQ,
PANEL_MCD_ON_SEQ,
PANEL_MCD_OFF_SEQ,
PANEL_MCD_RS_ON_SEQ,
PANEL_MCD_RS_OFF_SEQ,
PANEL_MCD_RS_READ_SEQ,
#ifdef CONFIG_SUPPORT_MST
PANEL_MST_ON_SEQ,
PANEL_MST_OFF_SEQ,
#endif
#ifdef CONFIG_SUPPORT_GRAM_CHECKSUM
PANEL_GCT_ENTER_SEQ,
PANEL_GCT_VDDM_SEQ,
PANEL_GCT_IMG_UPDATE_SEQ,
PANEL_GCT_IMG_0_UPDATE_SEQ,
PANEL_GCT_IMG_1_UPDATE_SEQ,
PANEL_GCT_EXIT_SEQ,
#endif
#if defined(CONFIG_SUPPORT_FAST_DISCHARGE)
PANEL_FD_SEQ,
#endif
#ifdef CONFIG_SUPPORT_GRAYSPOT_TEST
PANEL_GRAYSPOT_ON_SEQ,
PANEL_GRAYSPOT_OFF_SEQ,
#endif
#ifdef CONFIG_SUPPORT_TDMB_TUNE
PANEL_TDMB_TUNE_SEQ,
#endif
#ifdef CONFIG_SUPPORT_ISC_DEFECT
PANEL_CHECK_ISC_DEFECT_SEQ,
#endif
#ifdef CONFIG_SUPPORT_SPI_IF_SEL
PANEL_SPI_IF_ON_SEQ,
PANEL_SPI_IF_OFF_SEQ,
#endif
#ifdef CONFIG_SUPPORT_CCD_TEST
PANEL_CCD_TEST_SEQ,
#endif
#ifdef CONFIG_SUPPORT_DYNAMIC_HLPM
PANEL_DYNAMIC_HLPM_ON_SEQ,
PANEL_DYNAMIC_HLPM_OFF_SEQ,
#endif
#ifdef CONFIG_SUPPORT_ISC_TUNE_TEST
PANEL_ISC_THRESHOLD_SEQ,
PANEL_STM_TUNE_SEQ,
#endif
#ifdef CONFIG_SUPPORT_MAFPC
PANEL_MAFPC_ON_SEQ,
PANEL_MAFPC_OFF_SEQ,
PANEL_MAFPC_SCALE_FACTOR_SEQ,
PANEL_MAFPC_IMG_SEQ,
PANEL_MAFPC_CHECKSUM_SEQ,
#endif
PANEL_PARTIAL_DISP_ON_SEQ,
PANEL_PARTIAL_DISP_OFF_SEQ,
PANEL_DUMP_SEQ,
#ifdef CONFIG_SUPPORT_DDI_CMDLOG
PANEL_CMDLOG_DUMP_SEQ,
#endif
PANEL_CHECK_CONDITION_SEQ,
PANEL_DIA_ONOFF_SEQ,
#ifdef CONFIG_SUPPORT_MASK_LAYER
PANEL_MASK_LAYER_STOP_DIMMING_SEQ,
PANEL_MASK_LAYER_BEFORE_SEQ,
PANEL_MASK_LAYER_AFTER_SEQ,
PANEL_MASK_LAYER_ENTER_BR_SEQ,
PANEL_MASK_LAYER_EXIT_BR_SEQ,
PANEL_MASK_LAYER_EXIT_AFTER_SEQ,
#endif
#ifdef CONFIG_SUPPORT_BRIGHTDOT_TEST
PANEL_BRIGHTDOT_TEST_SEQ,
#endif
PANEL_FFC_SEQ, //sequence to set ddi's ffc operation
PANEL_OSC_SEQ, //sequence to chagne ddi's oscillator clock
#ifdef CONFIG_SUPPORT_SSR_TEST
PANEL_SSR_TEST_SEQ,
#endif
#ifdef CONFIG_SUPPORT_ECC_TEST
PANEL_ECC_TEST_SEQ,
#endif
PANEL_DECODER_TEST_SEQ,
#ifdef CONFIG_SUPPORT_PANEL_VCOM_TRIM_TEST
PANEL_VCOM_TRIM_TEST_SEQ,
#endif
PANEL_DUMMY_SEQ,
MAX_PANEL_SEQ,
};
/* structure of sequence table */
struct seqinfo {
u32 type;
char *name;
void **cmdtbl;
u32 size;
};
#define SEQINFO(_name_) (_name_)
#define SEQINFO_INIT(_name_, _cmdtbl_) \
{ \
.type = (CMD_TYPE_SEQ), \
.name = (_name_), \
.cmdtbl = (_cmdtbl_), \
.size = ARRAY_SIZE((_cmdtbl_)), \
}
#define DEFINE_SEQINFO(_name_, _cmdtbl_) \
struct seqinfo SEQINFO(_name_) = SEQINFO_INIT((#_name_), (_cmdtbl_))
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_SUPPORT_MASK_LAYER
enum {
MASK_LAYER_TRIGGER_BEFORE,
MASK_LAYER_TRIGGER_AFTER,
MASK_LAYER_TRIGGER_MAX,
};
enum {
MASK_LAYER_OFF,
MASK_LAYER_ON,
MASK_LAYER_MAX,
};
enum {
MASK_LAYER_HOOK_OFF,
MASK_LAYER_HOOK_ON,
MASK_LAYER_HOOK_MAX,
};
struct mask_layer_data {
u32 trigger_time;
u32 req_mask_layer;
};
#endif
#if defined(CONFIG_PANEL_DISPLAY_MODE)
struct common_panel_display_mode_bridge_ops {
/*
* check if to change bridge refresh rate is permitted.
* (e.g. actual brightness 98nit ~ 420nit)
*/
bool (*check_changeable)(struct panel_device *panel);
/*
* check if to jump to target refresh rate is permitted directly.
* (e.g. brightness, outdoor light level, copr or image updated)
*/
bool (*check_jumpmode)(struct panel_device *panel);
};
struct common_panel_display_mode_bridge {
struct common_panel_display_mode *mode;
int nframe_duration;
};
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;
struct common_panel_display_mode_bridge *bridges;
struct common_panel_display_mode_bridge_ops *bridge_ops;
};
#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;
};
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_SUPPORT_SSR_TEST
int (*ssr_test)(struct panel_device *panel, void *data, u32 size);
#endif
#ifdef CONFIG_SUPPORT_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);
#ifdef CONFIG_SUPPORT_PANEL_VCOM_TRIM_TEST
int (*vcom_trim_test)(struct panel_device *panel, void *data, u32 size);
#endif
};
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;
};
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_EXYNOS_DECON_LCD_COPR
struct panel_copr_data *copr_data;
#endif
#ifdef CONFIG_EXTEND_LIVE_CLOCK
struct aod_tune *aod_tune;
#endif
#ifdef CONFIG_SUPPORT_DDI_FLASH
struct panel_poc_data *poc_data;
#endif
#ifdef CONFIG_SUPPORT_POC_SPI
struct spi_data *spi_data;
struct spi_data **spi_data_tbl;
int nr_spi_data_tbl;
#endif
#ifdef CONFIG_MCD_PANEL_BLIC
struct blic_data **blic_data_tbl;
int nr_blic_data_tbl;
#endif
#ifdef CONFIG_PANEL_FREQ_HOP
struct freq_hop_elem *freq_hop_elems;
int nr_freq_hop_elems;
#endif
#ifdef CONFIG_SUPPORT_MAFPC
struct mafpc_info *mafpc_info;
#endif
#if defined(CONFIG_PANEL_DISPLAY_MODE)
struct common_panel_display_modes *common_panel_modes;
#endif
#ifdef CONFIG_MCD_PANEL_RCD
struct panel_rcd_data *rcd_data;
#endif
};
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 {
ACL_OPR_OFF,
ACL_OPR_03P,
ACL_OPR_06P,
ACL_OPR_08P,
ACL_OPR_12P,
ACL_OPR_15P,
ACL_OPR_MAX
};
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
#ifdef CONFIG_SUPPORT_GRAM_CHECKSUM
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,
};
enum {
VDDM_ORIG,
VDDM_LV,
VDDM_HV,
MAX_VDDM,
};
enum {
GRAM_TEST_OFF,
GRAM_TEST_ON,
GRAM_TEST_SKIPPED,
};
#endif
enum {
DECODER_TEST_OFF,
DECODER_TEST_ON,
DECODER_TEST_SKIPPED,
};
#ifdef CONFIG_SUPPORT_ISC_TUNE_TEST
enum stm_field_num {
STM_CTRL_EN = 0,
STM_MAX_OPT,
STM_DEFAULT_OPT,
STM_DIM_STEP,
STM_FRAME_PERIOD,
STM_MIN_SECT,
STM_PIXEL_PERIOD,
STM_LINE_PERIOD,
STM_MIN_MOVE,
STM_M_THRES,
STM_V_THRES,
STM_FIELD_MAX
};
#endif
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_PANEL_FREQ_HOP
struct device_node *freq_hop_node;
#endif
struct list_head head;
struct list_head id_mask_list;
const char *dqe_suffix;
};
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_panel_ddi;
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_SUPPORT_MST
u32 mst_on;
#endif
u32 hmd_on;
u32 hmd_brightness;
u32 lux;
#ifdef CONFIG_SUPPORT_XTALK_MODE
u32 xtalk_mode;
#endif
#ifdef CONFIG_SUPPORT_DDI_FLASH
u32 poc_op;
#endif
#ifdef CONFIG_SUPPORT_GRAM_CHECKSUM
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;
#ifdef CONFIG_SUPPORT_TDMB_TUNE
u32 tdmb_on;
u32 cur_tdmb_on;
#endif
u32 key[MAX_CMD_LEVEL];
u32 irc_mode;
#ifdef CONFIG_SUPPORT_DIM_FLASH
bool dim_flash_on;
u32 dim_flash_state; /* success or fail */
u32 cur_dim_type; /* AID DIMMING or DIM FLASH */
#endif
#ifdef CONFIG_SUPPORT_DYNAMIC_HLPM
u32 dynamic_hlpm;
#endif
#ifdef CONFIG_SUPPORT_ISC_TUNE_TEST
u8 isc_threshold;
u8 stm_field_info[STM_FIELD_MAX];
#endif
u32 panel_partial_disp;
u32 panel_mode;
#ifdef CONFIG_PANEL_VRR_BRIDGE
u32 target_panel_mode;
#endif
/* resolution */
bool 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;
#ifdef CONFIG_PANEL_VRR_BRIDGE
bool vrr_bridge_enable;
#endif
bool vrr_updated;
struct vrr_lfd_info vrr_lfd_info;
u32 dia_mode;
u32 ub_con_cnt;
u32 conn_det_enable;
#if defined(CONFIG_SUPPORT_FAST_DISCHARGE)
u32 enable_fd;
#endif
#ifdef CONFIG_SUPPORT_BRIGHTDOT_TEST
u32 brightdot_test_enable;
#endif
u32 dsi_freq;
u32 osc_freq;
};
struct panel_info {
const char *ldi_name;
unsigned char 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 maptbl *maptbl;
int nr_maptbl;
struct seqinfo *seqtbl;
int nr_seqtbl;
struct rdinfo *rditbl;
int nr_rditbl;
struct dumpinfo *dumpinfo;
int nr_dumpinfo;
struct resinfo *restbl;
int nr_restbl;
struct panel_dimming_info *panel_dim_info[MAX_PANEL_BL_SUBDEV];
int nr_panel_dim_info;
struct list_head panel_lut_info;
#ifdef CONFIG_MCD_PANEL_BLIC
struct blic_data **blic_data_tbl;
int nr_blic_data_tbl;
#endif
#if defined(CONFIG_PANEL_DISPLAY_MODE)
struct common_panel_display_modes *common_panel_modes;
#endif
#ifdef CONFIG_MCD_PANEL_RCD
struct panel_rcd_data *rcd_data;
#endif
const char *dqe_suffix;
};
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;
};
#define __PANEL_ATTR_RO(_name, _mode) __ATTR(_name, _mode, \
PN_CONCAT(_name, show), NULL)
#define __PANEL_ATTR_WO(_name, _mode) __ATTR(_name, _mode, \
NULL, PN_CONCAT(_name, store))
#define __PANEL_ATTR_RW(_name, _mode) __ATTR(_name, _mode, \
PN_CONCAT(_name, show), 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_SUPPORT_SSR_TEST
enum ssr_test_result {
PANEL_SSR_TEST_FAIL = 0,
PANEL_SSR_TEST_PASS = 1,
MAX_PANEL_SSR_TEST
};
#endif
#ifdef CONFIG_SUPPORT_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
};
#ifdef CONFIG_SUPPORT_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 *pnobj_type_to_string(u32 type);
void print_data(char *data, int size);
int register_common_panel(struct common_panel_info *info);
int deregister_common_panel(struct common_panel_info *info);
struct maptbl *find_panel_maptbl_by_index(struct panel_info *panel, int index);
struct maptbl *find_panel_maptbl_by_name(struct panel_info *panel_data, char *name);
struct common_panel_info *find_panel(struct panel_device *panel, u32 id);
struct device_node *find_panel_ddi_node(struct panel_device *panel, u32 id);
struct device_node *find_panel_modes_node(struct panel_device *panel, u32 id);
const char *get_panel_lut_dqe_suffix(struct panel_device *panel, u32 id);
#ifdef CONFIG_PANEL_FREQ_HOP
struct device_node *get_panel_lut_freq_hop_node(struct panel_device *panel, u32 id);
#endif
struct device_node *find_panel_power_ctrl_node(struct panel_device *panel, u32 id);
void print_panel_lut(struct panel_dt_lut *lut_info);
bool check_seqtbl_exist(struct panel_info *panel_data, u32 index);
struct seqinfo *find_panel_seqtbl(struct panel_info *panel_data, char *name);
struct seqinfo *find_index_seqtbl(struct panel_info *panel_data, u32 index);
struct pktinfo *find_packet(struct seqinfo *seqtbl, char *name);
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 excute_seqtbl_nolock(struct panel_device *panel, struct seqinfo *seqtbl, int index);
int panel_do_seqtbl(struct panel_device *panel, struct seqinfo *seqtbl);
int panel_do_seqtbl_by_index_nolock(struct panel_device *panel, int index);
int panel_do_seqtbl_by_index(struct panel_device *panel, int index);
struct resinfo *find_panel_resource(struct panel_info *panel, char *name);
bool panel_resource_initialized(struct panel_info *panel_data, char *name);
int rescpy(u8 *dst, struct resinfo *res, u32 offset, u32 len);
int rescpy_by_name(struct panel_info *panel, u8 *dst, char *name, u32 offset, u32 len);
int resource_clear(struct resinfo *res);
int resource_clear_by_name(struct panel_info *panel_data, char *name);
int resource_copy(u8 *dst, struct resinfo *res);
int resource_copy_by_name(struct panel_info *panel_data, u8 *dst, char *name);
int resource_copy_n_clear_by_name(struct panel_info *panel_data, u8 *dst, char *name);
int get_resource_size_by_name(struct panel_info *panel_data, char *name);
int get_panel_resource_size(struct resinfo *res);
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_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);
u16 calc_checksum_16bit(u8 *arr, int size);
void panel_update_packet_data(struct panel_device *panel, struct pktinfo *info);
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_PANEL_FREQ_HOP)
int panel_set_freq_hop(struct panel_device *panel, struct freq_hop_param *param);
#endif
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 find_sysfs_arg_by_name(struct sysfs_arg *arglist, int nr_arglist, char *s);
int parse_sysfs_arg(int nargs, enum sysfs_arg_type type,
char *s, struct sysfs_arg_out *out);
int panel_cmdq_get_size(struct panel_device *panel);
DECLARE_REDIRECT_MOCKABLE(panel_cmdq_flush, RETURNS(int), PARAMS(struct panel_device *));
struct panel_dt_lut *find_panel_lut(struct panel_device *panel, u32 id);
#ifdef CONFIG_EXYNOS_DECON_LCD_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
#define IS_PANEL_ACTIVE(_panel) check_panel_active(_panel, __func__)
#endif /* __PANEL_H__ */