kernel-brax3-ubuntu-touch/drivers/gpu/drm/panel/panel-boe-ft8725-dphy-vdo-120hz.c
erascape f319b992b1 kernel-5.15: Initial import brax3 UT kernel
* halium configs enabled

Signed-off-by: erascape <erascape@proton.me>
2025-09-23 15:17:10 +00:00

1303 lines
41 KiB
C
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#include <linux/backlight.h>
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_panel.h>
#include <drm/drm_modes.h>
#include <linux/delay.h>
#include <drm/drm_connector.h>
#include <drm/drm_device.h>
#include <linux/gpio/consumer.h>
#include <linux/regulator/consumer.h>
#include <video/mipi_display.h>
#include <video/of_videomode.h>
#include <video/videomode.h>
#include <linux/module.h>
#include <linux/of_platform.h>
#include <linux/of_graph.h>
#include <linux/platform_device.h>
#define CONFIG_MTK_PANEL_EXT
#if defined(CONFIG_MTK_PANEL_EXT)
#include "../mediatek/mediatek_v2/mtk_panel_ext.h"
#include "../mediatek/mediatek_v2/mtk_drm_graphics_base.h"
#endif
//drv Added the double-click wake up function-pzp-20240817-start
#if IS_ENABLED(CONFIG_PRIZE_COMMON_NODE)
#include "../../../input/touchscreen/focaltech_ft8725_spi/focaltech_common.h"
#endif
//drv Added the double-click wake up function-pzp-20240817-end
#if IS_ENABLED(CONFIG_PRIZE_HARDWARE_INFO)
#include "../../../misc/mediatek/prize/hardware_info/hardware_info.h"
extern struct hardware_info current_lcm_info;
#endif
extern int mtk_drm_esd_check_status(void);
extern void mtk_drm_esd_set_status(int status);
/*LCM_DEGREE default value*/
#define PROBE_FROM_DTS 0
struct focaltech_lcm {
struct device *dev;
struct drm_panel panel;
struct backlight_device *backlight;
struct gpio_desc *reset_gpio;
struct gpio_desc *amoled_vddi_en_gpio;
struct gpio_desc *amoled_vdd_en_gpio;
struct gpio_desc *amoled_vci_en_gpio;
bool prepared;
bool enabled;
unsigned int lcm_degree;
/* drv modify hbm function start */
bool hbm_en;
bool hbm_wait;
bool hbm_stat;
bool doze_en; //drv-Fixed the issue of entering aod and TP having touch-pengzhipeng-20230516
/* drv modify hbm function end */
int error;
};
struct focaltech_lcm *g_ctx;
#define focaltech_dcs_write_seq(ctx, seq...) \
({ \
const u8 d[] = { seq }; \
BUILD_BUG_ON_MSG(ARRAY_SIZE(d) > 64, \
"DCS sequence too big for stack"); \
focaltech_dcs_write(ctx, d, ARRAY_SIZE(d)); \
})
#define focaltech_dcs_write_seq_static(ctx, seq...) \
({ \
static const u8 d[] = { seq }; \
focaltech_dcs_write(ctx, d, ARRAY_SIZE(d)); \
})
static inline struct focaltech_lcm *panel_to_lcm(struct drm_panel *panel)
{
return container_of(panel, struct focaltech_lcm, panel);
}
#ifdef PANEL_SUPPORT_READBACK
static int focaltech_dcs_read(struct focaltech_lcm *ctx, u8 cmd, void *data, size_t len)
{
struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
ssize_t ret;
if (ctx->error < 0)
return 0;
ret = mipi_dsi_dcs_read(dsi, cmd, data, len);
if (ret < 0) {
dev_info(ctx->dev, "error %d reading dcs seq:(%#x)\n", ret,
cmd);
ctx->error = ret;
}
return ret;
}
static void focaltech_panel_get_data(struct focaltech_lcm *ctx)
{
u8 buffer[3] = { 0 };
static int ret;
pr_info("%s+\n", __func__);
ret = focaltech_dcs_read(ctx, 0x0A, buffer, 1);
pr_info("%s 0x%08x\n", __func__, buffer[0] | (buffer[1] << 8));
dev_info(ctx->dev, "return %d data(0x%08x) to dsi engine\n",
ret, buffer[0] | (buffer[1] << 8));
}
#endif
static void focaltech_dcs_write(struct focaltech_lcm *ctx, const void *data, size_t len)
{
struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
ssize_t ret;
char *addr;
if (ctx->error < 0)
return;
addr = (char *)data;
if (len > 1)
udelay(20);
if ((int)*addr < 0xB0)
ret = mipi_dsi_dcs_write_buffer(dsi, data, len);
else
ret = mipi_dsi_generic_write(dsi, data, len);
if (ret < 0) {
dev_info(ctx->dev, "error %zd writing seq: %ph\n", ret, data);
ctx->error = ret;
}
}
static void focaltech_panel_init(struct focaltech_lcm *ctx)
{
pr_info("%s+\n", __func__);
ctx->reset_gpio = devm_gpiod_get(ctx->dev, "reset", GPIOD_OUT_HIGH);
gpiod_set_value(ctx->reset_gpio, 1);
usleep_range(10000, 10001);
gpiod_set_value(ctx->reset_gpio, 0);
usleep_range(10000, 10001);
gpiod_set_value(ctx->reset_gpio, 1);
usleep_range(50000, 50001);
devm_gpiod_put(ctx->dev, ctx->reset_gpio);
focaltech_dcs_write_seq_static(ctx,0x00,0x00);
focaltech_dcs_write_seq_static(ctx,0xFF,0x87,0x25,0x01);
focaltech_dcs_write_seq_static(ctx,0x00,0x80);
focaltech_dcs_write_seq_static(ctx,0xFF,0x87,0x25);
focaltech_dcs_write_seq_static(ctx,0x00,0xA3);
focaltech_dcs_write_seq_static(ctx,0xB3,0x09,0x68,0x00,0x18); //1080x2408
//==============================================
//TCON
focaltech_dcs_write_seq_static(ctx,0x00, 0x80);
focaltech_dcs_write_seq_static(ctx,0xC0, 0x00 ,0x4A ,0x00 ,0x2F ,0x00 ,0x14);
focaltech_dcs_write_seq_static(ctx,0x00, 0x90);
focaltech_dcs_write_seq_static(ctx,0xC0, 0x00 ,0x4A ,0x00 ,0x2F ,0x00 ,0x14);
focaltech_dcs_write_seq_static(ctx,0x00, 0xA0);
focaltech_dcs_write_seq_static(ctx,0xC0, 0x00 ,0x97 ,0x00 ,0x2F ,0x00 ,0x14);
focaltech_dcs_write_seq_static(ctx,0x00, 0xB0);
focaltech_dcs_write_seq_static(ctx,0xC0, 0x00 ,0xCD ,0x00 ,0x2F ,0x14);
focaltech_dcs_write_seq_static(ctx,0x00, 0xC1);
focaltech_dcs_write_seq_static(ctx,0xC0, 0x00 ,0x94 ,0x00 ,0x81 ,0x00 ,0x63 ,0x00 ,0xC1);
focaltech_dcs_write_seq_static(ctx,0x00, 0x70);
focaltech_dcs_write_seq_static(ctx,0xC0, 0x00 ,0xB1 ,0x00 ,0x2F ,0x00 ,0x14);
focaltech_dcs_write_seq_static(ctx,0x00, 0xA3);
focaltech_dcs_write_seq_static(ctx,0xC1, 0x00, 0x67, 0x00 ,0x2F ,0x00 ,0x02);
focaltech_dcs_write_seq_static(ctx,0x00, 0xB7);
focaltech_dcs_write_seq_static(ctx,0xC1, 0x00 ,0x48);
focaltech_dcs_write_seq_static(ctx,0x00, 0x7B);
focaltech_dcs_write_seq_static(ctx,0xCE, 0xFF ,0xFF);
focaltech_dcs_write_seq_static(ctx,0x00, 0x80);
focaltech_dcs_write_seq_static(ctx,0xCE, 0x01, 0x81 ,0xFF ,0xFF ,0x00 ,0xC0 ,0x00 ,0xC8 ,0x00 ,0xBC ,0x00 ,0xC8 ,0x00 ,0xD0 ,0x00,0xD0);
focaltech_dcs_write_seq_static(ctx,0x00, 0x90);
focaltech_dcs_write_seq_static(ctx,0xCE, 0x00 ,0xB7 ,0x0F ,0x7D ,0x00 ,0xB7 ,0x80 ,0xFF ,0xFF ,0x00 ,0x0B ,0xB8 ,0x0F ,0x0F ,0x11);
focaltech_dcs_write_seq_static(ctx,0x00, 0xA0);
focaltech_dcs_write_seq_static(ctx,0xCE, 0x00 ,0x00 ,0x00);
focaltech_dcs_write_seq_static(ctx,0x00, 0xB0);
focaltech_dcs_write_seq_static(ctx,0xCE, 0x22 ,0x00 ,0x00);
focaltech_dcs_write_seq_static(ctx,0x00, 0xD1);
focaltech_dcs_write_seq_static(ctx,0xCE, 0x00 ,0x00 ,0x01 ,0x00 ,0x00 ,0x00 ,0x00);
focaltech_dcs_write_seq_static(ctx,0x00, 0xE1);
focaltech_dcs_write_seq_static(ctx,0xCE, 0x05 ,0x03 ,0xEF ,0x02 ,0xFB ,0x02 ,0xFB ,0x00 ,0x00 ,0x00 ,0x00);
focaltech_dcs_write_seq_static(ctx,0x00, 0xF1);
focaltech_dcs_write_seq_static(ctx,0xCE, 0x24 ,0x13 ,0x12 ,0x01 ,0x0C ,0x00 ,0xEC ,0x01 ,0x0C);
focaltech_dcs_write_seq_static(ctx,0x00, 0xB0);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x00 ,0x00 ,0xB6 ,0xBA);
focaltech_dcs_write_seq_static(ctx,0x00, 0xB5);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x05 ,0x05 ,0x66 ,0x6A);
focaltech_dcs_write_seq_static(ctx,0x00, 0xC0);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x09 ,0x09 ,0x63 ,0x67);
focaltech_dcs_write_seq_static(ctx,0x00, 0xC5);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x09 ,0x09 ,0x69 ,0x6D);
focaltech_dcs_write_seq_static(ctx,0x00, 0x60);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x00 ,0x00 ,0xCB ,0xCF ,0x05 ,0x05 ,0x43 ,0x47);
focaltech_dcs_write_seq_static(ctx,0x00, 0x70);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x00 ,0x00 ,0xB7 ,0xBB ,0x05 ,0x05 ,0x67 ,0x6B);
//Qsync Detect
focaltech_dcs_write_seq_static(ctx,0x00, 0xD1);
focaltech_dcs_write_seq_static(ctx,0xC1, 0x0B ,0x60 ,0x0F ,0xDC ,0x1B ,0x15 ,0x05 ,0xAF ,0x07 ,0xE5 ,0x0D ,0x81);
focaltech_dcs_write_seq_static(ctx,0x00, 0xE1);
focaltech_dcs_write_seq_static(ctx,0xC1, 0x0F ,0xDC);
focaltech_dcs_write_seq_static(ctx,0x00, 0xE4);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x09 ,0xFB ,0x09 ,0xFA ,0x09 ,0xFA ,0x09 ,0xFA ,0x09 ,0xFA ,0x09 ,0xFA);
//OSC
focaltech_dcs_write_seq_static(ctx,0x00, 0x80);
focaltech_dcs_write_seq_static(ctx,0xC1, 0x44 ,0x44);
focaltech_dcs_write_seq_static(ctx,0x00, 0x90);
focaltech_dcs_write_seq_static(ctx,0xC1, 0x03);
//Line rate for TP
focaltech_dcs_write_seq_static(ctx,0x00, 0xF5);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x00);
//TP Frame rate
focaltech_dcs_write_seq_static(ctx,0x00, 0xF6);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x78);
//TCON Frame rate
focaltech_dcs_write_seq_static(ctx,0x00, 0xF1);
focaltech_dcs_write_seq_static(ctx,0xCF, 0x78);
//Gram Vesa Line
focaltech_dcs_write_seq_static(ctx,0x00, 0x85);
focaltech_dcs_write_seq_static(ctx,0xB4, 0x7F);
// decrese vddi current
focaltech_dcs_write_seq_static(ctx,0x00, 0x93);
focaltech_dcs_write_seq_static(ctx,0xC1, 0x82);
//VDEC ICG
focaltech_dcs_write_seq_static(ctx,0x00, 0xCC);
focaltech_dcs_write_seq_static(ctx,0xC1, 0x18);
//Source Clk Select
focaltech_dcs_write_seq_static(ctx,0x00, 0x91);
focaltech_dcs_write_seq_static(ctx,0xC4, 0x08);
//VDD=1.275V LVDSVDD=1.25V VDD_TP=1.2V
focaltech_dcs_write_seq_static(ctx,0x00,0x80);
focaltech_dcs_write_seq_static(ctx,0xC5,0x87,0x59);
//4 power VDD=1.275V LVDSVDD=1.25V
focaltech_dcs_write_seq_static(ctx,0x00,0x9E);
focaltech_dcs_write_seq_static(ctx,0xC5,0x87);
focaltech_dcs_write_seq_static(ctx,0x00,0x88);
focaltech_dcs_write_seq_static(ctx,0xC4,0x08);
//========================================
//STV1 & STV2 Setting
focaltech_dcs_write_seq_static(ctx,0x00,0x80);
focaltech_dcs_write_seq_static(ctx,0xC2,0x83,0x01,0x05,0x8c,0x82,0x01,0x05,0x8c);
//CKV1-3 setting
focaltech_dcs_write_seq_static(ctx,0x00,0xA0);
focaltech_dcs_write_seq_static(ctx,0xC2,0x8A,0x07,0x00,0x05,0x8c,0x89,0x08,0x00,0x05,0x8c,0x88,0x09,0x00,0x05,0x8c);
//CKV4 setting
focaltech_dcs_write_seq_static(ctx,0x00,0xB0);
focaltech_dcs_write_seq_static(ctx,0xC2,0x87,0x0A,0x00,0x05,0x8c);
//CKV width setting
focaltech_dcs_write_seq_static(ctx,0x00,0xE0);
focaltech_dcs_write_seq_static(ctx,0xC2,0x33,0x33,0x00,0x00);
//Rst1 Setting
focaltech_dcs_write_seq_static(ctx,0x00,0xE8);
focaltech_dcs_write_seq_static(ctx,0xC2,0x12,0x00,0x0A,0x0A,0x03,0x88,0x00,0x00);
//GOFF setting
focaltech_dcs_write_seq_static(ctx,0x00,0xD0);
focaltech_dcs_write_seq_static(ctx,0xC3,0x35,0x0A,0x00,0x00,0x35,0x0A,0x00,0x00,0x35,0x0A,0x00,0x00,0x35,0x0A,0x00,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0xE0);
focaltech_dcs_write_seq_static(ctx,0xC3,0x35,0x0A,0x00,0x00,0x35,0x0A,0x00,0x00,0x35,0x0A,0x00,0x00,0x35,0x0A,0x00,0x00);
//power off enmode setting
focaltech_dcs_write_seq_static(ctx,0x00,0x80);
focaltech_dcs_write_seq_static(ctx,0xCB,0xCD,0xCD,0xCC,0x00,0xCD,0xCC,0x00,0xCD,0xCE,0xFE,0xCD,0x00,0xCC,0xCC,0x00,0x00);
//power on enmode setting
focaltech_dcs_write_seq_static(ctx,0x00,0x90);
focaltech_dcs_write_seq_static(ctx,0xCB,0x0C,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
//skip & powr on1 enmode setting
focaltech_dcs_write_seq_static(ctx,0x00,0xA0);
focaltech_dcs_write_seq_static(ctx,0xCB,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
//power off blank enmode setting
focaltech_dcs_write_seq_static(ctx,0x00,0xB0);
focaltech_dcs_write_seq_static(ctx,0xCB,0x50,0x41,0xA4,0x00);
//power on blank enmode setting
focaltech_dcs_write_seq_static(ctx,0x00,0xC0);
focaltech_dcs_write_seq_static(ctx,0xCB,0x50,0x41,0xA4,0x00);
//power on blank enmode setting
focaltech_dcs_write_seq_static(ctx,0x00,0xD5);
focaltech_dcs_write_seq_static(ctx,0xCB,0x83,0x00,0x83,0x83,0x00,0x83,0x83,0x00,0x83,0x83,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0xE0);
focaltech_dcs_write_seq_static(ctx,0xCB,0x83,0x83,0x00,0x83,0x83,0x00,0x83,0x83,0x00,0x83,0x83,0x00,0x83);
//panel mapping setting
//u2d_L
focaltech_dcs_write_seq_static(ctx,0x00,0x80);
focaltech_dcs_write_seq_static(ctx,0xCC,0x2C,0x29,0x26,0x26,0x23,0x23,0x18,0x17,0x16,0x1b,0x1a,0x19,0x24,0x07,0x06,0x09);
focaltech_dcs_write_seq_static(ctx,0x00,0x90);
focaltech_dcs_write_seq_static(ctx,0xCC,0x08,0x01,0x25,0x25,0x26,0x22,0x03,0x02);
//u2d_R
focaltech_dcs_write_seq_static(ctx,0x00,0x80);
focaltech_dcs_write_seq_static(ctx,0xCD,0x2C,0x29,0x26,0x26,0x23,0x23,0x18,0x17,0x16,0x1b,0x1a,0x19,0x24,0x07,0x06,0x09);
focaltech_dcs_write_seq_static(ctx,0x00,0x90);
focaltech_dcs_write_seq_static(ctx,0xCD,0x08,0x01,0x25,0x25,0x26,0x22,0x03,0x02);
//d2u_L
focaltech_dcs_write_seq_static(ctx,0x00,0xA0);
focaltech_dcs_write_seq_static(ctx,0xCC,0x2C,0x29,0x26,0x26,0x23,0x23,0x18,0x17,0x16,0x1b,0x1a,0x19,0x24,0x08,0x09,0x06);
focaltech_dcs_write_seq_static(ctx,0x00,0xB0);
focaltech_dcs_write_seq_static(ctx,0xCC,0x07,0x01,0x25,0x25,0x22,0x26,0x02,0x03);
//d2u_R
focaltech_dcs_write_seq_static(ctx,0x00,0xA0);
focaltech_dcs_write_seq_static(ctx,0xCD,0x2C,0x29,0x26,0x26,0x23,0x23,0x18,0x17,0x16,0x1b,0x1a,0x19,0x24,0x08,0x09,0x06);
focaltech_dcs_write_seq_static(ctx,0x00,0xB0);
focaltech_dcs_write_seq_static(ctx,0xCD,0x07,0x01,0x25,0x25,0x22,0x26,0x02,0x03);
//==============================================
//ckh
focaltech_dcs_write_seq_static(ctx,0x00,0x86);//Normal
focaltech_dcs_write_seq_static(ctx,0xC0,0x01,0x02,0x01,0x00,0x10,0x10,0x10,0x03);
focaltech_dcs_write_seq_static(ctx,0x00,0x96);//IDLE
focaltech_dcs_write_seq_static(ctx,0xC0,0x01,0x02,0x01,0x01,0x13,0x13,0x13,0x04);
focaltech_dcs_write_seq_static(ctx,0x00,0xA6);//LPF
focaltech_dcs_write_seq_static(ctx,0xC0,0x01,0x02,0x01,0x01,0x2A,0x2A,0x2A,0x04);
focaltech_dcs_write_seq_static(ctx,0x00,0xA3);//PER_DMY
focaltech_dcs_write_seq_static(ctx,0xCE,0x01,0x02,0x00,0x00,0x10,0x03);
focaltech_dcs_write_seq_static(ctx,0x00,0xB3);//POS_DMY
focaltech_dcs_write_seq_static(ctx,0xCE,0x01,0x02,0x00,0x00,0x10,0x03);
focaltech_dcs_write_seq_static(ctx,0x00,0x76);//FIFO
focaltech_dcs_write_seq_static(ctx,0xC0,0x01,0x02,0x01,0x01,0x2b,0x2b,0x2b,0x05);
//CKH_dummy
focaltech_dcs_write_seq_static(ctx,0x00,0x82);
focaltech_dcs_write_seq_static(ctx,0xa7,0x20,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0x8d);
focaltech_dcs_write_seq_static(ctx,0xa7,0x02);
focaltech_dcs_write_seq_static(ctx,0x00,0x8f);
focaltech_dcs_write_seq_static(ctx,0xa7,0x01);
//analog setting
//vgh=9V
focaltech_dcs_write_seq_static(ctx,0x00,0x93);
focaltech_dcs_write_seq_static(ctx,0xC5,0x23);
focaltech_dcs_write_seq_static(ctx,0x00,0x97);
focaltech_dcs_write_seq_static(ctx,0xC5,0x23);
//vgl=-9V
focaltech_dcs_write_seq_static(ctx,0x00,0x9A);
focaltech_dcs_write_seq_static(ctx,0xC5,0x23);
focaltech_dcs_write_seq_static(ctx,0x00,0x9C);
focaltech_dcs_write_seq_static(ctx,0xC5,0x23);
//vgho1=8V, vglo1=-8V
focaltech_dcs_write_seq_static(ctx,0x00,0xB6);
focaltech_dcs_write_seq_static(ctx,0xC5,0x19,0x19,0x19,0x19);
//GVDDP=5.2V, GVDDN=-4.8V
focaltech_dcs_write_seq_static(ctx,0x00,0x00);
focaltech_dcs_write_seq_static(ctx,0xD8,0x2F,0x27);
//VCOM=-0.2V
//focaltech_dcs_write_seq_static(ctx,0x00,0x00);
//focaltech_dcs_write_seq_static(ctx,0xD9,0x23,0x23,0x23,0x23);
//focaltech_dcs_write_seq_static(ctx,0x00,0x06);
//focaltech_dcs_write_seq_static(ctx,0xD9,0x23,0x23,0x23);
focaltech_dcs_write_seq_static(ctx,0x00,0x87);
focaltech_dcs_write_seq_static(ctx,0xC4,0x08,0x08);
//CKH Rotate
//0x03RGBBGR 0x10RGBRGB
focaltech_dcs_write_seq_static(ctx,0x00,0x80);
focaltech_dcs_write_seq_static(ctx,0xA7,0x03);
focaltech_dcs_write_seq_static(ctx,0x00,0xA0);
focaltech_dcs_write_seq_static(ctx,0xC3,0x00,0x01,0x23,0x45,0x21,0x03,0x45,0x00,0x00,0x00,0x21,0x03,0x45,0x01,0x23,0x45);
focaltech_dcs_write_seq_static(ctx,0x00,0xB1);
focaltech_dcs_write_seq_static(ctx,0xF5,0x1F);
//C0CB[7:4]=PONBLANK=1= 2 FRAME
//C0CB[3:0]=POFBLANK=1= 2 FRAME
focaltech_dcs_write_seq_static(ctx,0x00,0xCB);
focaltech_dcs_write_seq_static(ctx,0xC0,0x01);
focaltech_dcs_write_seq_static(ctx,0x00,0x88);
focaltech_dcs_write_seq_static(ctx,0xC4,0x08);
focaltech_dcs_write_seq_static(ctx,0x00,0x94);
focaltech_dcs_write_seq_static(ctx,0xE9,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0x9A);
focaltech_dcs_write_seq_static(ctx,0xC4,0x11);
focaltech_dcs_write_seq_static(ctx,0x00,0x95);
focaltech_dcs_write_seq_static(ctx,0xE9,0x10);
focaltech_dcs_write_seq_static(ctx,0x00,0x82);
focaltech_dcs_write_seq_static(ctx,0xF5,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0x93);
focaltech_dcs_write_seq_static(ctx,0xF5,0x00);
//AC MODE GIP toggle
focaltech_dcs_write_seq_static(ctx,0x00,0x99);
focaltech_dcs_write_seq_static(ctx,0xCF,0x50);
focaltech_dcs_write_seq_static(ctx,0x00,0x9C);
focaltech_dcs_write_seq_static(ctx,0xF5,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0x9E);
focaltech_dcs_write_seq_static(ctx,0xF5,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0xB0);
focaltech_dcs_write_seq_static(ctx,0xC5,0x10,0x4A,0x01,0x1F,0x4A,0x00);//fw q全驱 8725 其他客戶
focaltech_dcs_write_seq_static(ctx,0x00,0xA0);
focaltech_dcs_write_seq_static(ctx,0xB0,0x00,0x00,0x00,0x00,0x00,0x1D,0x01);
focaltech_dcs_write_seq_static(ctx,0x00,0x93);
focaltech_dcs_write_seq_static(ctx,0xE9,0xff,0xff,0xb0);
focaltech_dcs_write_seq_static(ctx,0x00,0x9B);
focaltech_dcs_write_seq_static(ctx,0xC4,0x08);
focaltech_dcs_write_seq_static(ctx,0x00,0x87);
focaltech_dcs_write_seq_static(ctx,0xF5,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0x80);
focaltech_dcs_write_seq_static(ctx,0xA4,0xC9);//20230628 SAP
focaltech_dcs_write_seq_static(ctx,0x00,0x87);
focaltech_dcs_write_seq_static(ctx,0xC5,0x08,0x08);//GAP
focaltech_dcs_write_seq_static(ctx,0x00,0xBE);
focaltech_dcs_write_seq_static(ctx,0xC5,0xC0,0xC0);
focaltech_dcs_write_seq_static(ctx,0x00,0xC0);
focaltech_dcs_write_seq_static(ctx,0xC5,0x0F);//mux2 timing 20230705
//mirror_x2=1
focaltech_dcs_write_seq_static(ctx,0x00,0xE8);
focaltech_dcs_write_seq_static(ctx,0xC0,0x40);
focaltech_dcs_write_seq_static(ctx,0x00,0x00);
focaltech_dcs_write_seq_static(ctx,0xE1,0x00,0x04,0x08,0x10,0x09,0x1B,0x23,0x2A,0x34,0xA2,0x3C,0x43,0x49,0x4E,0xE6,0x53,0x5B,0x62,0x69,0x6E,0x70,0x77,0x7F,0x87,0xA0,0x90,0x96,0x9C,0xA3,0x80,0xAB,0xB5,0xC2,0xCB,0x50,0xD6,0xE8,0xF6,0xFF,0xA8);
focaltech_dcs_write_seq_static(ctx,0x00,0x30);
focaltech_dcs_write_seq_static(ctx,0xE1,0x00,0x04,0x08,0x10,0x09,0x1B,0x23,0x2A,0x34,0xA2,0x3C,0x43,0x49,0x4E,0xE6,0x53,0x5B,0x62,0x69,0x6E,0x70,0x77,0x7F,0x87,0xA0,0x90,0x96,0x9C,0xA3,0x80,0xAB,0xB5,0xC2,0xCB,0x50,0xD6,0xE8,0xF6,0xFF,0xA8);
focaltech_dcs_write_seq_static(ctx,0x00,0x60);
focaltech_dcs_write_seq_static(ctx,0xE1,0x00,0x04,0x08,0x10,0x09,0x1B,0x23,0x2A,0x34,0xA2,0x3C,0x43,0x49,0x4E,0xE6,0x53,0x5B,0x62,0x69,0x6E,0x70,0x77,0x7F,0x87,0xA0,0x90,0x96,0x9C,0xA3,0x80,0xAB,0xB5,0xC2,0xCB,0x50,0xD6,0xE8,0xF6,0xFF,0xA8);
focaltech_dcs_write_seq_static(ctx,0x00,0x90);
focaltech_dcs_write_seq_static(ctx,0xE1,0x00,0x04,0x08,0x10,0x09,0x1B,0x23,0x2A,0x34,0xA2,0x3C,0x43,0x49,0x4E,0xE6,0x53,0x5B,0x62,0x69,0x6E,0x70,0x77,0x7F,0x87,0xA0,0x90,0x96,0x9C,0xA3,0x80,0xAB,0xB5,0xC2,0xCB,0x50,0xD6,0xE8,0xF6,0xFF,0xA8);
focaltech_dcs_write_seq_static(ctx,0x00,0xC0);
focaltech_dcs_write_seq_static(ctx,0xE1,0x00,0x04,0x08,0x10,0x09,0x1B,0x23,0x2A,0x34,0xA2,0x3C,0x43,0x49,0x4E,0xE6,0x53,0x5B,0x62,0x69,0x6E,0x70,0x77,0x7F,0x87,0xA0,0x90,0x96,0x9C,0xA3,0x80,0xAB,0xB5,0xC2,0xCB,0x50,0xD6,0xE8,0xF6,0xFF,0xA8);
focaltech_dcs_write_seq_static(ctx,0x00,0xF0);
focaltech_dcs_write_seq_static(ctx,0xE1,0x00,0x04,0x08,0x10,0x09,0x1B,0x23,0x2A,0x34,0xA2,0x3C,0x43,0x49,0x4E,0xE6,0x53);
focaltech_dcs_write_seq_static(ctx,0x00,0x00);
focaltech_dcs_write_seq_static(ctx,0xE2,0x5B,0x62,0x69,0x6E,0x70,0x77,0x7F,0x87,0xA0,0x90,0x96,0x9C,0xA3,0x80,0xAB,0xB5,0xC2,0xCB,0x50,0xD6,0xE8,0xF6,0xFF,0xA8);
focaltech_dcs_write_seq_static(ctx,0x00,0xE0);
focaltech_dcs_write_seq_static(ctx,0xCF,0x34);
//TP noise
focaltech_dcs_write_seq_static(ctx,0x00,0x92);//VGH clamp off
focaltech_dcs_write_seq_static(ctx,0xC5,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0xA0);//VGH pump stop with charge phase @TP term
focaltech_dcs_write_seq_static(ctx,0xC5,0x40);
focaltech_dcs_write_seq_static(ctx,0x00,0x98);//VGH pump stop with charge phase @TP term
focaltech_dcs_write_seq_static(ctx,0xC5,0x24);
focaltech_dcs_write_seq_static(ctx,0x00,0xA1);//VGL pump stop with pull phase @TP term
focaltech_dcs_write_seq_static(ctx,0xC5,0x40);
focaltech_dcs_write_seq_static(ctx,0x00,0x9D);//VGL pump line rate 1/4H
focaltech_dcs_write_seq_static(ctx,0xC5,0x24);
focaltech_dcs_write_seq_static(ctx,0x00,0x94);//VGH pump line rate 1/2H
focaltech_dcs_write_seq_static(ctx,0xC5,0x04);
//TP noise end
//SPI慢半拍
focaltech_dcs_write_seq_static(ctx,0x00,0x0E);
focaltech_dcs_write_seq_static(ctx,0xF3,0x80,0xFF);
//关RTN补偿
focaltech_dcs_write_seq_static(ctx,0x00,0xE0);
focaltech_dcs_write_seq_static(ctx,0xCE,0x00);
//CKH补偿off
focaltech_dcs_write_seq_static(ctx,0x00,0xFC);
focaltech_dcs_write_seq_static(ctx,0xC0,0x00,0x17);
//focaltech_dcs_write_seq_static(ctx,0x00,0x85);
//focaltech_dcs_write_seq_static(ctx,0xA7,0x00);
//ESD
focaltech_dcs_write_seq_static(ctx,0x00,0x80); //disable 21h
focaltech_dcs_write_seq_static(ctx,0xB3,0x22);
focaltech_dcs_write_seq_static(ctx,0x00,0xB0); //HS lock CMD1
focaltech_dcs_write_seq_static(ctx,0xB3,0x00);
focaltech_dcs_write_seq_static(ctx,0x00,0x83); //packet loss cover
focaltech_dcs_write_seq_static(ctx,0xB0,0x63);
//EQ
//focaltech_dcs_write_seq_static(ctx,0x00,0x80);
//focaltech_dcs_write_seq_static(ctx,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
//CHOP
focaltech_dcs_write_seq_static(ctx,0x00,0x81);
focaltech_dcs_write_seq_static(ctx,0xA4,0x23,0x23);
focaltech_dcs_write_seq_static(ctx,0x00,0x90);
focaltech_dcs_write_seq_static(ctx,0xE9,0x50);
//TP TREM LIMIT 24
focaltech_dcs_write_seq_static(ctx,0x00,0x82);
focaltech_dcs_write_seq_static(ctx,0xCE,0x17,0x17);
//OSC trim
//focaltech_dcs_write_seq_static(ctx,0x00,0x84);
//focaltech_dcs_write_seq_static(ctx,0xF4,0x42);
//LCD BUSY
//focaltech_dcs_write_seq_static(ctx,0x00,0x80);
//focaltech_dcs_write_seq_static(ctx,0xF6,0x69,0x10);
//focaltech_dcs_write_seq_static(ctx,0x00,0x80);
//focaltech_dcs_write_seq_static(ctx,0xF6,0x69,0x0B,0x80,0x80);
//focaltech_dcs_write_seq_static(ctx,0x00,0x82);
//focaltech_dcs_write_seq_static(ctx,0xCB,0x05);
//focaltech_dcs_write_seq_static(ctx,0x00,0x88);
//focaltech_dcs_write_seq_static(ctx,0xC2,0xC2,0x90,0x00,0x02,0x8B);
focaltech_dcs_write_seq_static(ctx,0x35,0x00);
//drv modify Slice Height 8 start
focaltech_dcs_write_seq_static(ctx,0x00,0xB0);
focaltech_dcs_write_seq_static(ctx,0xB4,0x00,0x08,0x02,0x00,0x00,0xbb,0x00,0x07,0x0d,0xb7,0x0c,0xb7,0x10,0xf0);
//drv modify Slice Height 8 end
//focaltech_dcs_write_seq_static(ctx,0x1C,0x02);
//CMD2 disable
//focaltech_dcs_write_seq_static(ctx,0x00,0x00);
//focaltech_dcs_write_seq_static(ctx,0xFF,0xFF,0xFF,0xFF);
//----------------------LCD initial code End----------------------//
focaltech_dcs_write_seq_static(ctx, 0x11,0x00);
msleep(120);
focaltech_dcs_write_seq_static(ctx, 0x29,0x00);
pr_info("%s-\n", __func__);
}
static int focaltech_disable(struct drm_panel *panel)
{
struct focaltech_lcm *ctx = panel_to_lcm(panel);
if (!ctx->enabled)
return 0;
if (ctx->backlight) {
ctx->backlight->props.power = FB_BLANK_POWERDOWN;
backlight_update_status(ctx->backlight);
}
ctx->enabled = false;
return 0;
}
//drv-Entering deep sleep to solve the problem of electricity leakage-pzp-20240701-start
/*void focaltech_deep_slepp(struct focaltech_lcm *ctx)
{
focaltech_dcs_write_seq_static(ctx, 0x00,0x00);
focaltech_dcs_write_seq_static(ctx, 0xFF,0x87,0x25,0x01);
focaltech_dcs_write_seq_static(ctx, 0x00,0x80);
focaltech_dcs_write_seq_static(ctx, 0xFF,0x87,0x25);
focaltech_dcs_write_seq_static(ctx, 0x00,0x00);
focaltech_dcs_write_seq_static(ctx, 0xF7,0x5A,0xA5,0x95,0x27);
}*/
//drv-Entering deep sleep to solve the problem of electricity leakage-pzp-20240701-end
static int focaltech_unprepare(struct drm_panel *panel)
{
struct focaltech_lcm *ctx = panel_to_lcm(panel);
pr_info("%s+\n", __func__);
if (!ctx->prepared)
return 0;
focaltech_dcs_write_seq_static(ctx, MIPI_DCS_SET_DISPLAY_OFF);
msleep(50);
focaltech_dcs_write_seq_static(ctx, MIPI_DCS_ENTER_SLEEP_MODE);
msleep(150);
//drv Added the double-click wake up function-pzp-20240817-start
#if IS_ENABLED(CONFIG_PRIZE_COMMON_NODE)
if(!fts_gesture_status())
{
#endif
//drv-Entering deep sleep to solve the problem of electricity leakage-pzp-20240701-start
//focaltech_deep_slepp(ctx);
//drv-Entering deep sleep to solve the problem of electricity leakage-pzp-20240701-end
ctx->reset_gpio = devm_gpiod_get(ctx->dev, "reset", GPIOD_OUT_HIGH);
gpiod_set_value(ctx->reset_gpio, 1);
devm_gpiod_put(ctx->dev, ctx->reset_gpio);
ctx->amoled_vddi_en_gpio = devm_gpiod_get(ctx->dev, "enp-en", GPIOD_OUT_HIGH);
gpiod_set_value(ctx->amoled_vddi_en_gpio, 0);
devm_gpiod_put(ctx->dev, ctx->amoled_vddi_en_gpio);
ctx->amoled_vdd_en_gpio = devm_gpiod_get(ctx->dev, "enn-en", GPIOD_OUT_HIGH);
gpiod_set_value(ctx->amoled_vdd_en_gpio, 0);
devm_gpiod_put(ctx->dev, ctx->amoled_vdd_en_gpio);
#if IS_ENABLED(CONFIG_PRIZE_COMMON_NODE)
}
#endif
//drv Added the double-click wake up function-pzp-20240817-end
ctx->hbm_en = false;
ctx->doze_en = false;//drv-Fixed the issue of entering aod and TP having touch-pengzhipeng-20230516
ctx->error = 0;
ctx->prepared = false;
pr_info("%s-\n", __func__);
return 0;
}
static int focaltech_prepare(struct drm_panel *panel)
{
struct focaltech_lcm *ctx = panel_to_lcm(panel);
int ret;
pr_info("%s+\n", __func__);
if (ctx->prepared)
return 0;
// lcd reset H -> L -> L
ctx->reset_gpio = devm_gpiod_get(ctx->dev, "reset", GPIOD_OUT_HIGH);
gpiod_set_value(ctx->reset_gpio, 0);
devm_gpiod_put(ctx->dev, ctx->reset_gpio);
usleep_range(5000, 5001);
// end
ctx->amoled_vddi_en_gpio = devm_gpiod_get(ctx->dev, "enp-en", GPIOD_OUT_HIGH);
gpiod_set_value(ctx->amoled_vddi_en_gpio, 1);
devm_gpiod_put(ctx->dev, ctx->amoled_vddi_en_gpio);
usleep_range(5000, 5001);
ctx->amoled_vdd_en_gpio = devm_gpiod_get(ctx->dev, "enn-en", GPIOD_OUT_HIGH);
gpiod_set_value(ctx->amoled_vdd_en_gpio, 1);
devm_gpiod_put(ctx->dev, ctx->amoled_vdd_en_gpio);
usleep_range(5000, 5001);
focaltech_panel_init(ctx);
ret = ctx->error;
if (ret < 0)
focaltech_unprepare(panel);
ctx->prepared = true;
#ifdef PANEL_SUPPORT_READBACK
focaltech_panel_get_data(ctx);
#endif
pr_info("%s-\n", __func__);
return ret;
}
static int focaltech_enable(struct drm_panel *panel)
{
struct focaltech_lcm *ctx = panel_to_lcm(panel);
if (ctx->enabled)
return 0;
if (ctx->backlight) {
ctx->backlight->props.power = FB_BLANK_UNBLANK;
backlight_update_status(ctx->backlight);
}
ctx->enabled = true;
return 0;
}
#define FRAME_WIDTH 1080
#define FRAME_HEIGHT 2408
//drv-Added the physical size of the screen-pzp-20240829-start
#define PHYSICAL_WIDTH 68430
#define PHYSICAL_HEIGHT 152570
//drv-Added the physical size of the screen-pzp-20240829-end
#define HFP (92)//drv Modify proch and clk to solve the underflow problem-pzp-20240701
#define HSA (20)
#define HBP (56)
#define HACT (1080)
#define VFP (2528)
#define VSA (4)
#define VBP (12)
#define VACT (2408)
#define VFP_90 (877)
#define VFP_120 (51)
#define PCLK_IN_KHZ_60HZ \
((HACT+HFP+HSA+HBP)*(VACT+VFP+VSA+VBP)*(60)/1000)
#define PCLK_IN_KHZ_90HZ \
((HACT+HFP+HSA+HBP)*(VACT+VFP_90+VSA+VBP)*(90)/1000)
#define PCLK_IN_KHZ_120HZ \
((HACT+HFP+HSA+HBP)*(VACT+VFP_120+VSA+VBP)*(120)/1000)
static const struct drm_display_mode switch_mode_120hz = {
.clock = PCLK_IN_KHZ_120HZ,
.hdisplay = HACT,
.hsync_start = HACT + HFP,
.hsync_end = HACT + HFP + HSA,
.htotal = HACT + HFP + HSA + HBP,
.vdisplay = VACT,
.vsync_start = VACT + VFP_120,
.vsync_end = VACT + VFP_120 + VSA,
.vtotal = VACT + VFP_120 + VSA + VBP,
};
static const struct drm_display_mode switch_mode_90hz = {
.clock = PCLK_IN_KHZ_90HZ,
.hdisplay = HACT,
.hsync_start = HACT + HFP,
.hsync_end = HACT + HFP + HSA,
.htotal = HACT + HFP + HSA + HBP,
.vdisplay = VACT,
.vsync_start = VACT + VFP_90,
.vsync_end = VACT + VFP_90 + VSA,
.vtotal = VACT + VFP_90 + VSA + VBP,
};
static const struct drm_display_mode switch_mode_60hz = {
.clock = PCLK_IN_KHZ_60HZ,
.hdisplay = HACT,
.hsync_start = HACT + HFP,
.hsync_end = HACT + HFP + HSA,
.htotal = HACT + HFP + HSA + HBP,
.vdisplay = VACT,
.vsync_start = VACT + VFP,
.vsync_end = VACT + VFP + VSA,
.vtotal = VACT + VFP + VSA + VBP,
};
static struct mtk_panel_params ext_params_120hz = {
//drv Modify proch and clk to solve the underflow problem-pzp-20240701-start
.pll_clk = 545,
.data_rate = 1090,
//drv Modify proch and clk to solve the underflow problem-pzp-20240701-end
.physical_width_um = PHYSICAL_WIDTH,
.physical_height_um = PHYSICAL_HEIGHT,
.cust_esd_check = 1,
.esd_check_enable = 1,
//drv Solve the problem of blurred screens and black screens when playing esd -20240830-start
.lcm_esd_check_table[0] = {
.cmd = 0x0A,
.count = 1,
.para_list[0] = 0x9c,
},
.lcm_esd_check_table[1] = {
.cmd = 0xAC,
.count = 1,
.para_list[0] = 0x00,
},
.lcm_esd_check_table[2] = {
.cmd = 0x05,
.count = 1,
.para_list[0] = 0x00,
},
//drv Solve the problem of blurred screens and black screens when playing esd -20240830-end
.ssc_enable = 0,
.output_mode = MTK_PANEL_DSC_SINGLE_PORT,
.dsc_params = {
.enable = 1,
.bdg_dsc_enable = 0,
.ver = 17,
.slice_mode = 1,
.rgb_swap = 0,
.dsc_cfg = 2088,
.rct_on = 1,
.bit_per_channel = 8,
.dsc_line_buf_depth = 9,
.bp_enable = 1,
.bit_per_pixel = 128,
.pic_height = 2408,
.pic_width = 1080,
.slice_height = 8,
.slice_width = 540,
.chunk_size = 540,
.xmit_delay = 512,
.dec_delay = 616,
.scale_value = 32,
.increment_interval = 187,
.decrement_interval = 7,
.line_bpg_offset = 12,
.nfl_bpg_offset = 3511,
.slice_bpg_offset = 3255,
.initial_offset = 6144,
.final_offset = 4336,
.flatness_minqp = 3,
.flatness_maxqp = 12,
.rc_model_size = 8192,
.rc_edge_factor = 6,
.rc_quant_incr_limit0 = 11,
.rc_quant_incr_limit1 = 11,
.rc_tgt_offset_hi = 3,
.rc_tgt_offset_lo = 3,
},
};
static struct mtk_panel_params ext_params_90hz = {
//drv Modify proch and clk to solve the underflow problem-pzp-20240701-start
.pll_clk = 545,
.data_rate = 1090,
//drv Modify proch and clk to solve the underflow problem-pzp-20240701-end
.physical_width_um = PHYSICAL_WIDTH,
.physical_height_um = PHYSICAL_HEIGHT,
.cust_esd_check = 1,
.esd_check_enable = 1,
//drv Solve the problem of blurred screens and black screens when playing esd -20240830-start
.lcm_esd_check_table[0] = {
.cmd = 0x0A,
.count = 1,
.para_list[0] = 0x9c,
},
.lcm_esd_check_table[1] = {
.cmd = 0xAC,
.count = 1,
.para_list[0] = 0x00,
},
.lcm_esd_check_table[2] = {
.cmd = 0x05,
.count = 1,
.para_list[0] = 0x00,
},
//drv Solve the problem of blurred screens and black screens when playing esd -20240830-end
.ssc_enable = 0,
.output_mode = MTK_PANEL_DSC_SINGLE_PORT,
.dsc_params = {
.enable = 1,
.bdg_dsc_enable = 0,
.ver = 17,
.slice_mode = 1,
.rgb_swap = 0,
.dsc_cfg = 2088,
.rct_on = 1,
.bit_per_channel = 8,
.dsc_line_buf_depth = 9,
.bp_enable = 1,
.bit_per_pixel = 128,
.pic_height = 2408,
.pic_width = 1080,
.slice_height = 8,
.slice_width = 540,
.chunk_size = 540,
.xmit_delay = 512,
.dec_delay = 616,
.scale_value = 32,
.increment_interval = 187,
.decrement_interval = 7,
.line_bpg_offset = 12,
.nfl_bpg_offset = 3511,
.slice_bpg_offset = 3255,
.initial_offset = 6144,
.final_offset = 4336,
.flatness_minqp = 3,
.flatness_maxqp = 12,
.rc_model_size = 8192,
.rc_edge_factor = 6,
.rc_quant_incr_limit0 = 11,
.rc_quant_incr_limit1 = 11,
.rc_tgt_offset_hi = 3,
.rc_tgt_offset_lo = 3,
},
};
static struct mtk_panel_params ext_params_60hz = {
//drv Modify proch and clk to solve the underflow problem-pzp-20240701-start
.pll_clk = 545,
.data_rate = 1090,
//drv Modify proch and clk to solve the underflow problem-pzp-20240701-end
.physical_width_um = PHYSICAL_WIDTH,
.physical_height_um = PHYSICAL_HEIGHT,
.cust_esd_check = 1,
.esd_check_enable = 1,
//drv Solve the problem of blurred screens and black screens when playing esd -20240830-start
.lcm_esd_check_table[0] = {
.cmd = 0x0A,
.count = 1,
.para_list[0] = 0x9c,
},
.lcm_esd_check_table[1] = {
.cmd = 0xAC,
.count = 1,
.para_list[0] = 0x00,
},
.lcm_esd_check_table[2] = {
.cmd = 0x05,
.count = 1,
.para_list[0] = 0x00,
},
//drv Solve the problem of blurred screens and black screens when playing esd -20240830-end
.ssc_enable = 0,
.output_mode = MTK_PANEL_DSC_SINGLE_PORT,
.dsc_params = {
.enable = 1,
.bdg_dsc_enable = 0,
.ver = 17,
.slice_mode = 1,
.rgb_swap = 0,
.dsc_cfg = 2088,
.rct_on = 1,
.bit_per_channel = 8,
.dsc_line_buf_depth = 9,
.bp_enable = 1,
.bit_per_pixel = 128,
.pic_height = 2408,
.pic_width = 1080,
.slice_height = 8,
.slice_width = 540,
.chunk_size = 540,
.xmit_delay = 512,
.dec_delay = 616,
.scale_value = 32,
.increment_interval = 187,
.decrement_interval = 7,
.line_bpg_offset = 12,
.nfl_bpg_offset = 3511,
.slice_bpg_offset = 3255,
.initial_offset = 6144,
.final_offset = 4336,
.flatness_minqp = 3,
.flatness_maxqp = 12,
.rc_model_size = 8192,
.rc_edge_factor = 6,
.rc_quant_incr_limit0 = 11,
.rc_quant_incr_limit1 = 11,
.rc_tgt_offset_hi = 3,
.rc_tgt_offset_lo = 3,
},
};
static int panel_ata_check(struct drm_panel *panel)
{
/* Customer test by own ATA tool */
return 1;
}
/* drv modify hbm function end */
struct drm_display_mode *get_mode_by_id_hfp(struct drm_connector *connector,
unsigned int mode)
{
struct drm_display_mode *m;
unsigned int i = 0;
list_for_each_entry(m, &connector->modes, head) {
if (i == mode)
return m;
i++;
}
return NULL;
}
static int panel_ext_reset(struct drm_panel *panel, int on)
{
struct focaltech_lcm *ctx = panel_to_lcm(panel);
ctx->reset_gpio =
devm_gpiod_get(ctx->dev, "reset", GPIOD_OUT_HIGH);
gpiod_set_value(ctx->reset_gpio, on);
devm_gpiod_put(ctx->dev, ctx->reset_gpio);
return 0;
}
static int mtk_panel_ext_param_set(struct drm_panel *panel,
struct drm_connector *connector, unsigned int mode)
{
struct mtk_panel_ext *ext = find_panel_ext(panel);
int ret = 0;
int dst_fps = 0;
struct drm_display_mode *m = get_mode_by_id_hfp(connector, mode);
dst_fps = m ? drm_mode_vrefresh(m) : -EINVAL;
pr_info("%s, dst_fps %d\n", __func__, dst_fps);
if (dst_fps == 60) {
//ext_params_60hz.skip_vblank = 0;
ext->params = &ext_params_60hz;
} else if (dst_fps == 90) {
ext->params = &ext_params_90hz;
} else if (dst_fps == 120) {
//ext_params_120hz.skip_vblank = 0;
ext->params = &ext_params_120hz;
} else {
pr_info("%s, dst_fps %d\n", __func__, dst_fps);
ret = 1;
}
return ret;
}
static struct mtk_panel_funcs ext_funcs = {
.reset = panel_ext_reset,
.ata_check = panel_ata_check,
.ext_param_set = mtk_panel_ext_param_set,
};
//#endif
static int focaltech_get_modes(struct drm_panel *panel,
struct drm_connector *connector)
{
struct drm_display_mode *mode;
struct drm_display_mode *mode_1;
struct drm_display_mode *mode_2;
mode = drm_mode_duplicate(connector->dev, &switch_mode_60hz);
if (!mode) {
dev_info(connector->dev->dev, "failed to add mode %ux%ux@%u\n",
switch_mode_60hz.hdisplay, switch_mode_60hz.vdisplay,
drm_mode_vrefresh(&switch_mode_60hz));
return -ENOMEM;
}
drm_mode_set_name(mode);
mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
drm_mode_probed_add(connector, mode);
mode_1 = drm_mode_duplicate(connector->dev, &switch_mode_90hz);
if (!mode_1) {
dev_info(connector->dev->dev, "failed to add mode_1 %ux%ux@%u\n",
switch_mode_90hz.hdisplay, switch_mode_90hz.vdisplay,
drm_mode_vrefresh(&switch_mode_90hz));
return -ENOMEM;
}
drm_mode_set_name(mode_1);
mode_1->type = DRM_MODE_TYPE_DRIVER;
drm_mode_probed_add(connector, mode_1);
mode_2 = drm_mode_duplicate(connector->dev, &switch_mode_120hz);
if (!mode_2) {
dev_info(connector->dev->dev, "failed to add mode_2 %ux%ux@%u\n",
switch_mode_120hz.hdisplay, switch_mode_120hz.vdisplay,
drm_mode_vrefresh(&switch_mode_120hz));
return -ENOMEM;
}
drm_mode_set_name(mode_2);
mode_2->type = DRM_MODE_TYPE_DRIVER;
drm_mode_probed_add(connector, mode_2);
connector->display_info.width_mm = 68;
connector->display_info.height_mm = 153;
return 1;
}
static const struct drm_panel_funcs focaltech_drm_funcs = {
.disable = focaltech_disable,
.unprepare = focaltech_unprepare,
.prepare = focaltech_prepare,
.enable = focaltech_enable,
.get_modes = focaltech_get_modes,
};
static int focaltech_probe(struct mipi_dsi_device *dsi)
{
struct device *dev = &dsi->dev;
struct device_node *dsi_node, *remote_node = NULL, *endpoint = NULL;
struct focaltech_lcm *ctx;
struct device_node *backlight;
unsigned int lcm_degree;
int ret;
int probe_ret;
pr_info("%s+ focaltech,rm692e0,cmd,120hz\n", __func__);
dsi_node = of_get_parent(dev->of_node);
if (dsi_node) {
endpoint = of_graph_get_next_endpoint(dsi_node, NULL);
if (endpoint) {
remote_node = of_graph_get_remote_port_parent(endpoint);
if (!remote_node) {
pr_info("No panel connected,skip probe lcm\n");
return -ENODEV;
}
pr_info("device node name:%s\n", remote_node->name);
}
}
if (remote_node != dev->of_node) {
pr_info("%s+ skip probe due to not current lcm\n", __func__);
return -ENODEV;
}
ctx = devm_kzalloc(dev, sizeof(struct focaltech_lcm), GFP_KERNEL);
if (!ctx)
return -ENOMEM;
mipi_dsi_set_drvdata(dsi, ctx);
ctx->dev = dev;
dsi->lanes = 4;
dsi->format = MIPI_DSI_FMT_RGB888;
//dsi->mode_flags = MIPI_DSI_MODE_LPM | MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_NO_EOT_PACKET;
dsi->mode_flags = MIPI_DSI_MODE_LPM | MIPI_DSI_CLOCK_NON_CONTINUOUS | MIPI_DSI_MODE_NO_EOT_PACKET | MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE;
backlight = of_parse_phandle(dev->of_node, "backlight", 0);
if (backlight) {
ctx->backlight = of_find_backlight_by_node(backlight);
of_node_put(backlight);
if (!ctx->backlight)
return -EPROBE_DEFER;
}
ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(ctx->reset_gpio)) {
dev_info(dev, "cannot get reset-gpios %ld\n",
PTR_ERR(ctx->reset_gpio));
return PTR_ERR(ctx->reset_gpio);
}
devm_gpiod_put(dev, ctx->reset_gpio);
ctx->amoled_vddi_en_gpio = devm_gpiod_get(dev, "enp-en", GPIOD_OUT_HIGH);
if (IS_ERR(ctx->amoled_vddi_en_gpio)) {
dev_info(dev, "cannot get amoled-vddi-en-gpios %ld\n",
PTR_ERR(ctx->amoled_vddi_en_gpio));
return PTR_ERR(ctx->amoled_vddi_en_gpio);
}
devm_gpiod_put(dev, ctx->amoled_vddi_en_gpio);
ctx->amoled_vdd_en_gpio = devm_gpiod_get(dev, "enn-en", GPIOD_OUT_HIGH);
if (IS_ERR(ctx->amoled_vdd_en_gpio)) {
dev_info(dev, "cannot get amoled-vdd-en-gpios %ld\n",
PTR_ERR(ctx->amoled_vdd_en_gpio));
return PTR_ERR(ctx->amoled_vdd_en_gpio);
}
devm_gpiod_put(dev, ctx->amoled_vdd_en_gpio);
ctx->prepared = true;
ctx->enabled = true;
drm_panel_init(&ctx->panel, dev, &focaltech_drm_funcs, DRM_MODE_CONNECTOR_DSI);
drm_panel_add(&ctx->panel);
ret = mipi_dsi_attach(dsi);
if (ret < 0)
drm_panel_remove(&ctx->panel);
#if defined(CONFIG_MTK_PANEL_EXT)
mtk_panel_tch_handle_reg(&ctx->panel);
ret = mtk_panel_ext_create(dev, &ext_params_60hz, &ext_funcs, &ctx->panel);
if (ret < 0)
return ret;
probe_ret = of_property_read_u32(dev->of_node, "lcm-degree", &lcm_degree);
if (probe_ret < 0)
lcm_degree = 0;
else
ext_params_60hz.lcm_degree = lcm_degree;
pr_info("lcm_degree: %d\n", ext_params_60hz.lcm_degree);
#endif
g_ctx = ctx;
g_ctx->doze_en = false;//drv-Fixed the issue of entering aod and TP having touch-pengzhipeng-20230516
pr_info("%s- focaltech,rm692e0,cmd,120hz\n", __func__);
/* drv modify hbm function start */
ctx->hbm_en = false;
ctx->hbm_stat = false;
/* drv modify hbm function end */
//drv add by shenwenbin for lcd hardware info 20231214 start
#if IS_ENABLED(CONFIG_PRIZE_HARDWARE_INFO)
strcpy(current_lcm_info.chip,"Focaltech-ft8725");
strcpy(current_lcm_info.vendor,"Focaltech");
sprintf(current_lcm_info.id,"0x%02x",0x01);
strcpy(current_lcm_info.more,"2408*1080");
#endif
//drv add by shenwenbin for lcd hardware info 20231214 end
return ret;
}
static int focaltech_remove(struct mipi_dsi_device *dsi)
{
struct focaltech_lcm *ctx = mipi_dsi_get_drvdata(dsi);
#if defined(CONFIG_MTK_PANEL_EXT)
struct mtk_panel_ctx *ext_ctx = find_panel_ctx(&ctx->panel);
#endif
if (ext_ctx == NULL)
return 0;
mipi_dsi_detach(dsi);
drm_panel_remove(&ctx->panel);
#if defined(CONFIG_MTK_PANEL_EXT)
mtk_panel_detach(ext_ctx);
mtk_panel_remove(ext_ctx);
#endif
return 0;
}
static const struct of_device_id focaltech_of_match[] = {
{
.compatible = "boe,ft8725,vdo,120Hz",
},
{}
};
MODULE_DEVICE_TABLE(of, focaltech_of_match);
static struct mipi_dsi_driver focaltech_driver = {
.probe = focaltech_probe,
.remove = focaltech_remove,
.driver = {
.name = "panel-boe-ft8725-dphy-vdo-120hz",
.owner = THIS_MODULE,
.of_match_table = focaltech_of_match,
},
};
module_mipi_dsi_driver(focaltech_driver);
MODULE_AUTHOR("MEDIATEK");
MODULE_DESCRIPTION("FT8725 AMOLED VDO LCD Panel Driver");
MODULE_LICENSE("GPL v2");