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

552 lines
13 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 __MDNIE_H__
#define __MDNIE_H__
#include "panel.h"
#include "dpui.h"
typedef u8 mdnie_t;
#define MDNIE_DEV_NAME ("mdnie")
#define MAX_MDNIE_DEV_NAME_SIZE (32)
#define MDNIE_SYSFS_PREFIX "/sdcard/mdnie/"
#define IS_MDNIE_ENABLED(_mdnie_) (!!(_mdnie_)->props.enable)
#define IS_DMB(idx) (idx == DMB_NORMAL_MODE)
#define IS_SCENARIO(idx) (idx < SCENARIO_MAX && !(idx > VIDEO_NORMAL_MODE && idx < CAMERA_MODE))
#define IS_ACCESSIBILITY(idx) (idx && idx < ACCESSIBILITY_MAX)
#define IS_HBM(idx) (idx && idx < HBM_MAX)
#define IS_HMD(idx) (idx && idx < HMD_MDNIE_MAX)
#define SCENARIO_IS_VALID(idx) (IS_DMB(idx) || IS_SCENARIO(idx))
#define IS_NIGHT_MODE_ON(idx) (idx == NIGHT_MODE_ON)
#define IS_COLOR_LENS_ON(idx) (idx == COLOR_LENS_ON)
#define IS_HDR(idx) (idx >= HDR_ON && idx < HDR_MAX)
#define IS_LIGHT_NOTIFICATION(idx) (idx >= LIGHT_NOTIFICATION_ON && idx < LIGHT_NOTIFICATION_MAX)
#define COLOR_OFFSET_FUNC(x, y, num, den, con) \
(((s64)y * 1024LL) + ((((s64)x * 1024LL) * ((s64)num)) / ((s64)den)) + ((s64)con * 1024LL))
#define RECOGNIZE_REGION(compV, compH) \
((((compV) > 0) ? (0 + (((compH) > 0) ? 0 : 1)) : (2 + (((compH) < 0) ? 0 : 1))))
#define MAPTBL_IDX_SCENARIO(_idx_) (MDNIE_SCENARIO_MAPTBL_START + (_idx_))
#define MAPTBL_IDX_ACCESSIBILITY(_idx_) (MDNIE_ACCESSIBILITY_MAPTBL_START + (_idx_) - 1)
#define IS_BYPASS_MODE(_mdnie_) (((_mdnie_)->props.bypass >= BYPASS_ON) && ((_mdnie_)->props.bypass < BYPASS_MAX))
#define IS_ACCESSIBILITY_MODE(_mdnie_) (((_mdnie_)->props.accessibility > ACCESSIBILITY_OFF) && ((_mdnie_)->props.accessibility < ACCESSIBILITY_MAX))
#define IS_LIGHT_NOTIFICATION_MODE(_mdnie_) (((_mdnie_)->props.light_notification >= LIGHT_NOTIFICATION_ON) && ((_mdnie_)->props.light_notification < LIGHT_NOTIFICATION_MAX))
#define IS_HDR_MODE(_mdnie_) (((_mdnie_)->props.hdr >= HDR_ON) && ((_mdnie_)->props.hdr < HDR_MAX))
#define IS_HMD_MODE(_mdnie_) (((_mdnie_)->props.hmd >= HMD_MDNIE_ON) && ((_mdnie_)->props.hmd < HMD_MDNIE_MAX))
#define IS_NIGHT_MODE(_mdnie_) (((_mdnie_)->props.night >= NIGHT_MODE_ON) && ((_mdnie_)->props.night < NIGHT_MODE_MAX))
#define IS_COLOR_LENS_MODE(_mdnie_) (((_mdnie_)->props.color_lens >= COLOR_LENS_ON) && ((_mdnie_)->props.color_lens < COLOR_LENS_MAX))
#define IS_HBM_MODE(_mdnie_) (((_mdnie_)->props.hbm >= HBM_ON) && ((_mdnie_)->props.hbm < HBM_MAX))
#define IS_DMB_MODE(_mdnie_) ((_mdnie_)->props.scenario == DMB_NORMAL_MODE)
#define IS_SCENARIO_MODE(_mdnie_) (((_mdnie_)->props.scenario >= UI_MODE && (_mdnie_)->props.scenario <= VIDEO_NORMAL_MODE) || \
((_mdnie_)->props.scenario >= CAMERA_MODE && (_mdnie_)->props.scenario < SCENARIO_MAX))
#define IS_LDU_MODE(_mdnie_) (((_mdnie_)->props.ldu > LDU_MODE_OFF) && ((_mdnie_)->props.ldu < MAX_LDU_MODE))
#define MAX_MDNIE_SCR_LEN (24)
#define MAX_COLOR (3)
#define GET_MSB_8BIT(x) ((x >> 8) & (BIT(8) - 1))
#define GET_LSB_8BIT(x) ((x >> 0) & (BIT(8) - 1))
#define MIN_WRGB_OFS (-40)
#define MAX_WRGB_OFS (0)
#define IS_VALID_WRGB_OFS(_ofs_) (((int)(_ofs_) <= MAX_WRGB_OFS) && ((int)(_ofs_) >= (MIN_WRGB_OFS)))
#define MIN_WCRD_X (2930)
#define MAX_WCRD_X (3060)
#define MIN_WCRD_Y (3050)
#define MAX_WCRD_Y (3260)
#ifdef CONFIG_SUPPORT_AFC
#define MAX_AFC_ROI_LEN (12)
#endif
enum {
MDNIE_OFF_MODE,
MDNIE_BYPASS_MODE,
MDNIE_ACCESSIBILITY_MODE,
MDNIE_LIGHT_NOTIFICATION_MODE,
MDNIE_COLOR_LENS_MODE,
MDNIE_HDR_MODE,
MDNIE_HMD_MODE,
MDNIE_NIGHT_MODE,
MDNIE_HBM_MODE,
MDNIE_DMB_MODE,
MDNIE_SCENARIO_MODE,
MAX_MDNIE_MODE,
};
enum SCENARIO_MODE {
DYNAMIC,
STANDARD,
NATURAL,
MOVIE,
AUTO,
MODE_MAX
};
enum SCENARIO {
UI_MODE,
VIDEO_NORMAL_MODE,
CAMERA_MODE = 4,
NAVI_MODE,
GALLERY_MODE,
VT_MODE,
BROWSER_MODE,
EBOOK_MODE,
EMAIL_MODE,
GAME_LOW_MODE,
GAME_MID_MODE,
GAME_HIGH_MODE,
VIDEO_ENHANCER,
VIDEO_ENHANCER_THIRD,
HMD_8_MODE,
HMD_16_MODE,
SCENARIO_MAX,
DMB_NORMAL_MODE = 20,
DMB_MODE_MAX
};
enum BYPASS {
BYPASS_OFF = 0,
BYPASS_ON,
BYPASS_MAX
};
enum ACCESSIBILITY {
ACCESSIBILITY_OFF,
NEGATIVE,
COLOR_BLIND,
SCREEN_CURTAIN,
GRAYSCALE,
GRAYSCALE_NEGATIVE,
COLOR_BLIND_HBM,
ACCESSIBILITY_MAX
};
enum HBM {
HBM_OFF,
HBM_ON,
HBM_MAX
};
enum HMD_MODE {
HMD_MDNIE_OFF,
HMD_MDNIE_ON,
HMD_3000K = HMD_MDNIE_ON,
HMD_4000K,
HMD_5000K,
HMD_6500K,
HMD_7500K,
HMD_MDNIE_MAX
};
enum NIGHT_MODE {
NIGHT_MODE_OFF,
NIGHT_MODE_ON,
NIGHT_MODE_MAX
};
enum NIGHT_LEVEL {
NIGHT_LEVEL_6500K,
NIGHT_LEVEL_6100K,
NIGHT_LEVEL_5700K,
NIGHT_LEVEL_5300K,
NIGHT_LEVEL_4900K,
NIGHT_LEVEL_4500K,
NIGHT_LEVEL_4100K,
NIGHT_LEVEL_3700K,
NIGHT_LEVEL_3300K,
NIGHT_LEVEL_2900K,
NIGHT_LEVEL_2500K,
NIGHT_LEVEL_7000K,
MAX_NIGHT_LEVEL,
};
enum COLOR_LENS {
COLOR_LENS_OFF,
COLOR_LENS_ON,
COLOR_LENS_MAX
};
enum COLOR_LENS_COLOR {
COLOR_LENS_COLOR_BLUE,
COLOR_LENS_COLOR_AZURE,
COLOR_LENS_COLOR_CYAN,
COLOR_LENS_COLOR_SPRING_GREEN,
COLOR_LENS_COLOR_GREEN,
COLOR_LENS_COLOR_CHARTREUSE_GREEN,
COLOR_LENS_COLOR_YELLOW,
COLOR_LENS_COLOR_ORANGE,
COLOR_LENS_COLOR_RED,
COLOR_LENS_COLOR_ROSE,
COLOR_LENS_COLOR_MAGENTA,
COLOR_LENS_COLOR_VIOLET,
COLOR_LENS_COLOR_MAX
};
enum COLOR_LENS_LEVEL {
COLOR_LENS_LEVEL_20P,
COLOR_LENS_LEVEL_25P,
COLOR_LENS_LEVEL_30P,
COLOR_LENS_LEVEL_35P,
COLOR_LENS_LEVEL_40P,
COLOR_LENS_LEVEL_45P,
COLOR_LENS_LEVEL_50P,
COLOR_LENS_LEVEL_55P,
COLOR_LENS_LEVEL_60P,
COLOR_LENS_LEVEL_MAX,
};
enum HDR {
HDR_OFF,
HDR_ON,
HDR_1 = HDR_ON,
HDR_2,
HDR_3,
HDR_MAX
};
enum LIGHT_NOTIFICATION {
LIGHT_NOTIFICATION_OFF = 0,
LIGHT_NOTIFICATION_ON,
LIGHT_NOTIFICATION_MAX
};
enum {
CCRD_PT_NONE,
CCRD_PT_1,
CCRD_PT_2,
CCRD_PT_3,
CCRD_PT_4,
CCRD_PT_5,
CCRD_PT_6,
CCRD_PT_7,
CCRD_PT_8,
CCRD_PT_9,
MAX_CCRD_PT,
};
enum LDU_MODE {
LDU_MODE_OFF,
LDU_MODE_1,
LDU_MODE_2,
LDU_MODE_3,
LDU_MODE_4,
LDU_MODE_5,
MAX_LDU_MODE,
};
enum SCR_WHITE_MODE {
SCR_WHITE_MODE_NONE,
SCR_WHITE_MODE_COLOR_COORDINATE,
SCR_WHITE_MODE_ADJUST_LDU,
SCR_WHITE_MODE_SENSOR_RGB,
MAX_SCR_WHITE_MODE,
};
enum TRANS_MODE {
TRANS_OFF,
TRANS_ON,
MAX_TRANS_MODE,
};
enum MDNIE_MAPTBL {
/* SCENARIO */
MDNIE_SCENARIO_MAPTBL_START,
MDNIE_UI_MAPTBL = MDNIE_SCENARIO_MAPTBL_START,
MDNIE_VIDEO_MAPTBL,
MDNIE_CAMERA_MAPTBL = 4,
MDNIE_NAVI_MAPTBL,
MDNIE_GALLERY_MAPTBL,
MDNIE_VT_MAPTBL,
MDNIE_BROWSER_MAPTBL,
MDNIE_EBOOK_MAPTBL,
MDNIE_EMAIL_MAPTBL,
MDNIE_GAME_LOW_MAPTBL,
MDNIE_GAME_MID_MAPTBL,
MDNIE_GAME_HIGH_MAPTBL,
MDNIE_VIDEO_ENHANCER_MAPTBL,
MDNIE_VIDEO_ENHANCER_THIRD_MAPTBL,
MDNIE_HMD_8_MAPTBL,
MDNIE_HMD_16_MAPTBL,
#if defined(CONFIG_TDMB)
MDNIE_DMB_MAPTBL,
MDNIE_SCENARIO_MAPTBL_END = MDNIE_DMB_MAPTBL,
#else
MDNIE_SCENARIO_MAPTBL_END = MDNIE_HMD_16_MAPTBL,
#endif
/* ACCESSIBILITY */
MDNIE_ACCESSIBILITY_MAPTBL_START,
MDNIE_NEGATIVE_MAPTBL = MDNIE_ACCESSIBILITY_MAPTBL_START,
MDNIE_COLOR_BLIND_MAPTBL,
MDNIE_SCREEN_CURTAIN_MAPTBL,
MDNIE_GRAYSCALE_MAPTBL,
MDNIE_GRAYSCALE_NEGATIVE_MAPTBL,
MDNIE_COLOR_BLIND_HBM_MAPTBL,
MDNIE_ACCESSIBILITY_MAPTBL_END = MDNIE_COLOR_BLIND_HBM_MAPTBL,
/* BYPASS */
MDNIE_BYPASS_MAPTBL,
/* HBM */
MDNIE_HBM_MAPTBL,
/* HMD */
MDNIE_HMD_MAPTBL,
/* HDR */
MDNIE_HDR_MAPTBL,
/* NIGHT */
MDNIE_NIGHT_MAPTBL,
/* LIGHT_NOTIFICATION */
MDNIE_LIGHT_NOTIFICATION_MAPTBL,
/* COLOR LENS */
MDNIE_COLOR_LENS_MAPTBL,
MAX_MDNIE_MAPTBL,
};
#ifdef CONFIG_SUPPORT_AFC
enum AFC_MAPTBL {
AFC_ON_MAPTBL,
MAX_AFC_MAPTBL,
};
#endif
enum MDNIE_SEQ {
MDNIE_SET_SEQ,
#ifdef CONFIG_SUPPORT_AFC
MDNIE_AFC_OFF_SEQ,
MDNIE_AFC_ON_SEQ,
#endif
/* if necessary, add new seq */
MAX_MDNIE_SEQ,
};
enum {
MDNIE_SCR_WHITE_NONE_MAPTBL,
MDNIE_COLOR_COORDINATE_MAPTBL,
MDNIE_ADJUST_LDU_MAPTBL,
MDNIE_SENSOR_RGB_MAPTBL,
MAX_SCR_WHITE_MAPTBL,
};
enum {
MDNIE_ETC_NONE_MAPTBL,
MDNIE_ETC_TRANS_MAPTBL,
MDNIE_ETC_NIGHT_MAPTBL,
MDNIE_ETC_COLOR_LENS_MAPTBL,
MAX_MDNIE_ETC_MAPTBL,
};
enum {
WCRD_TYPE_ADAPTIVE,
WCRD_TYPE_D65,
MAX_WCRD_TYPE,
};
enum {
H_LINE,
V_LINE,
MAX_CAL_LINE,
};
enum {
RGB_00,
RGB_01,
RGB_10,
RGB_11,
MAX_RGB_PT,
};
enum {
QUAD_1,
QUAD_2,
QUAD_3,
QUAD_4,
MAX_QUAD,
};
struct cal_center {
int x;
int y;
int thres;
};
struct cal_line {
int num;
int den;
int con;
};
struct cal_coef {
int a, b, c, d;
int e, f, g, h;
};
struct mdnie_tune {
struct seqinfo *seqtbl;
u32 nr_seqtbl;
struct maptbl *maptbl;
u32 nr_maptbl;
struct maptbl *scr_white_maptbl;
u32 nr_scr_white_maptbl;
struct maptbl *etc_maptbl;
u32 nr_etc_maptbl;
#ifdef CONFIG_SUPPORT_AFC
struct maptbl *afc_maptbl;
u32 nr_afc_maptbl;
#endif
struct cal_center center;
struct cal_line line[MAX_CAL_LINE];
struct cal_coef coef[MAX_QUAD];
u32 cal_x_center;
u32 cal_y_center;
u32 cal_boundary_center;
u8 vtx[MAX_WCRD_TYPE][MAX_CCRD_PT][MAX_COLOR];
u32 num_ldu_mode;
u32 num_night_level;
u32 num_color_lens_color;
u32 num_color_lens_level;
u32 hbm_ce_lux;
};
struct mdnie_properties {
u32 enable;
enum SCENARIO scenario;
enum SCENARIO_MODE mode;
enum BYPASS bypass;
enum HBM hbm;
enum HMD_MODE hmd;
enum NIGHT_MODE night;
enum COLOR_LENS color_lens;
enum COLOR_LENS_COLOR color_lens_color;
enum COLOR_LENS_LEVEL color_lens_level;
enum HDR hdr;
enum LIGHT_NOTIFICATION light_notification;
enum ACCESSIBILITY accessibility;
enum LDU_MODE ldu;
enum SCR_WHITE_MODE scr_white_mode;
enum TRANS_MODE trans_mode;
int night_level;
/* for color adjustment */
u8 scr[MAX_MDNIE_SCR_LEN];
u32 sz_scr;
int wcrd_x, wcrd_y;
/* default whiteRGB : color coordinated wrgb */
u8 coord_wrgb[MAX_WCRD_TYPE][MAX_COLOR];
/* sensor whiteRGB */
u8 ssr_wrgb[MAX_COLOR];
/* current whiteRGB */
u8 cur_wrgb[MAX_COLOR];
/* default whiteRGB : color coordinated wrgb */
u8 def_wrgb[MAX_COLOR];
s8 def_wrgb_ofs[MAX_COLOR];
#ifdef CONFIG_SUPPORT_AFC
u8 afc_roi[MAX_AFC_ROI_LEN];
bool afc_on;
#endif
u32 num_ldu_mode;
u32 num_night_level;
u32 num_color_lens_color;
u32 num_color_lens_level;
struct cal_line line[MAX_CAL_LINE];
struct cal_coef coef[MAX_QUAD];
u32 cal_x_center;
u32 cal_y_center;
u32 cal_boundary_center;
u8 vtx[MAX_WCRD_TYPE][MAX_CCRD_PT][MAX_COLOR];
u32 hbm_ce_lux;
/* support */
unsigned support_ldu:1;
unsigned support_trans:1;
/* dirty flag */
unsigned tuning:1; /* tuning file loaded */
unsigned update_color_adj:1; /* color adjustement updated */
unsigned update_scenario:1; /* scenario updated */
unsigned update_color_coord:1; /* color coordinate updated */
unsigned update_ldu:1; /* adjust ldu updated */
unsigned update_sensorRGB:1; /* sensorRGB scr white updated */
/* mdnie tuning */
#ifdef CONFIG_EXYNOS_DECON_LCD_TUNING
char tfilepath[128]; /* tuning file path */
#endif
};
struct mdnie_info {
struct device *dev;
struct class *class;
char name[MAX_MDNIE_DEV_NAME_SIZE];
struct mutex lock;
struct mdnie_properties props;
struct notifier_block fb_notif;
#ifdef CONFIG_DISPLAY_USE_INFO
struct notifier_block dpui_notif;
#endif
struct maptbl *maptbl;
u32 nr_maptbl;
struct maptbl *scr_white_maptbl;
u32 nr_scr_white_maptbl;
struct maptbl *etc_maptbl;
u32 nr_etc_maptbl;
#ifdef CONFIG_SUPPORT_AFC
struct maptbl *afc_maptbl;
u32 nr_afc_maptbl;
#endif
struct seqinfo *seqtbl;
u32 nr_seqtbl;
u32 nr_reg;
};
#ifdef CONFIG_EXYNOS_DECON_MDNIE_LITE
extern int mdnie_init(struct mdnie_info *mdnie);
extern int mdnie_exit(struct mdnie_info *mdnie);
extern int mdnie_probe(struct mdnie_info *mdnie, struct mdnie_tune *mdnie_tune);
extern int mdnie_remove(struct mdnie_info *mdnie);
extern int mdnie_enable(struct mdnie_info *mdnie);
extern int mdnie_disable(struct mdnie_info *mdnie);
extern int mdnie_set_def_wrgb(struct mdnie_info *mdnie,
unsigned char r, unsigned char g, unsigned char b);
extern int mdnie_set_cur_wrgb(struct mdnie_info *mdnie,
unsigned char r, unsigned char g, unsigned char b);
extern int mdnie_cur_wrgb_to_byte_array(struct mdnie_info *mdnie,
unsigned char *dst, unsigned int stride);
extern int panel_mdnie_update(struct panel_device *panel);
extern int mdnie_update_wrgb(struct mdnie_info *mdnie,
unsigned char r, unsigned char g, unsigned char b);
#else
static inline int mdnie_init(struct mdnie_info *mdnie) { return 0; }
static inline int mdnie_probe(struct mdnie_info *mdnie, struct mdnie_tune *mdnie_tune) { return 0; }
static inline int mdnie_remove(struct mdnie_info *mdnie) { return 0; }
static inline int mdnie_enable(struct mdnie_info *mdnie) { return 0; }
static inline int mdnie_disable(struct mdnie_info *mdnie) { return 0; }
static inline int panel_mdnie_update(struct panel_device *panel) { return 0; }
static inline int mdnie_set_def_wrgb(struct mdnie_info *mdnie,
unsigned char r, unsigned char g, unsigned char b) { return 0; }
static inline int mdnie_set_cur_wrgb(struct mdnie_info *mdnie,
unsigned char r, unsigned char g, unsigned char b) { return 0; }
static inline int mdnie_cur_wrgb_to_byte_array(struct mdnie_info *mdnie,
unsigned char *dst, unsigned int stride) { return 0; }
static inline int mdnie_update_wrgb(struct mdnie_info *mdnie,
unsigned char r, unsigned char g, unsigned char b) { return 0; }
#endif
extern struct maptbl *mdnie_find_maptbl(struct mdnie_info *);
extern struct maptbl *mdnie_find_etc_maptbl(struct mdnie_info *mdnie, int index);
extern int mdnie_get_maptbl_index(struct mdnie_info *mdnie);
#endif /* __MDNIE_H__ */