// SPDX-License-Identifier: GPL-2.0
/*
* Driver for panels based on Himax HX83102 controller, such as:
*
* - Starry 10.51" WUXGA MIPI-DSI panel
*
* Based on drivers/gpu/drm/panel/panel-himax-hx8394.c
*/
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/regulator/consumer.h>
#include <drm/drm_connector.h>
#include <drm/drm_crtc.h>
#include <drm/drm_mipi_dsi.h>
#include <drm/drm_panel.h>
#include <video/mipi_display.h>
/* Manufacturer specific DSI commands */
#define HX83102_SETPOWER 0 xb1
#define HX83102_SETDISP 0 xb2
#define HX83102_SETCYC 0 xb4
#define HX83102_UNKNOWN_B6 0 xb6
#define HX83102_UNKNOWN_B8 0 xb8
#define HX83102_SETEXTC 0 xb9
#define HX83102_SETMIPI 0 xba
#define HX83102_SETVDC 0 xbc
#define HX83102_SETBANK 0 xbd
#define HX83102_UNKNOWN_BE 0 xbe
#define HX83102_SETPTBA 0 xbf
#define HX83102_SETSTBA 0 xc0
#define HX83102_SETTCON 0 xc7
#define HX83102_SETRAMDMY 0 xc8
#define HX83102_SETPWM 0 xc9
#define HX83102_SETCLOCK 0 xcb
#define HX83102_SETPANEL 0 xcc
#define HX83102_SETCASCADE 0 xd0
#define HX83102_SETPCTRL 0 xd1
#define HX83102_UNKNOWN_D2 0 xd2
#define HX83102_SETGIP0 0 xd3
#define HX83102_SETGIP1 0 xd5
#define HX83102_SETGIP2 0 xd6
#define HX83102_SETGIP3 0 xd8
#define HX83102_UNKNOWN_D9 0 xd9
#define HX83102_SETGMA 0 xe0
#define HX83102_UNKNOWN_E1 0 xe1
#define HX83102_SETTP1 0 xe7
#define HX83102_SETSPCCMD 0 xe9
struct hx83102 {
struct drm_panel base;
struct mipi_dsi_device *dsi;
const struct hx83102_panel_desc *desc;
enum drm_panel_orientation orientation;
struct regulator *pp1800;
struct regulator *avee;
struct regulator *avdd;
struct gpio_desc *enable_gpio;
};
struct hx83102_panel_desc {
const struct drm_display_mode *modes;
/**
* @width_mm: width of the panel's active display area
* @height_mm: height of the panel's active display area
*/
struct {
unsigned int width_mm;
unsigned int height_mm;
} size;
int (*init)(struct hx83102 *ctx);
};
static inline struct hx83102 *panel_to_hx83102(struct drm_panel *panel)
{
return container_of(panel, struct hx83102, base);
}
static void hx83102_enable_extended_cmds(struct mipi_dsi_multi_context *dsi_ctx, bool enable)
{
if (enable)
mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX83102_SETEXTC, 0 x83, 0 x10, 0 x21, 0 x55, 0 x00);
else
mipi_dsi_dcs_write_seq_multi(dsi_ctx, HX83102_SETEXTC, 0 x00, 0 x00, 0 x00);
}
static int starry_himax83102_j02_init(struct hx83102 *ctx)
{
struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
hx83102_enable_extended_cmds(&dsi_ctx, true );
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x2c, 0 xb5, 0 xb5, 0 x31, 0 xf1,
0 x31, 0 xd7, 0 x2f, 0 x36, 0 x36, 0 x36, 0 x36, 0 x1a, 0 x8b, 0 x11,
0 x65, 0 x00, 0 x88, 0 xfa, 0 xff, 0 xff, 0 x8f, 0 xff, 0 x08, 0 x74,
0 x33);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETDISP, 0 x00, 0 x47, 0 xb0, 0 x80, 0 x00,
0 x12, 0 x72, 0 x3c, 0 xa3, 0 x03, 0 x03, 0 x00, 0 x00, 0 x88, 0 xf5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x76, 0 x76, 0 x76, 0 x76, 0 x76,
0 x76, 0 x63, 0 x5c, 0 x63, 0 x5c, 0 x01, 0 x9e);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcd);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x84);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETVDC, 0 x1b, 0 x04);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_BE, 0 x20);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPTBA, 0 xfc, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSTBA, 0 x36, 0 x36, 0 x22, 0 x11, 0 x22,
0 xa0, 0 x61, 0 x08, 0 xf5, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcc);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTCON, 0 x80);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETRAMDMY, 0 x97);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPWM, 0 x00, 0 x1e, 0 x13, 0 x88, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x08, 0 x13, 0 x07, 0 x00, 0 x0f, 0 x33);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPANEL, 0 x02);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCASCADE, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPCTRL, 0 x37, 0 x06, 0 x00, 0 x02, 0 x04, 0 x0c,
0 xff);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D2, 0 x1f, 0 x11, 0 x1f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x06, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x08, 0 x00, 0 x08, 0 x37, 0 x47, 0 x34, 0 x3b, 0 x12, 0 x12, 0 x03, 0 x03,
0 x32, 0 x10, 0 x10, 0 x00, 0 x10, 0 x32, 0 x10, 0 x08, 0 x00, 0 x08, 0 x32,
0 x17, 0 x94, 0 x07, 0 x94, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP1, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18,
0 x18, 0 x18, 0 x18, 0 x18, 0 x19, 0 x19, 0 x40, 0 x40, 0 x1a, 0 x1a, 0 x1b,
0 x1b, 0 x00, 0 x01, 0 x02, 0 x03, 0 x04, 0 x05, 0 x06, 0 x07, 0 x20, 0 x21,
0 x28, 0 x29, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18,
0 x18, 0 x18, 0 x18, 0 x18, 0 x18);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP2, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18,
0 x18, 0 x18, 0 x18, 0 x18, 0 x40, 0 x40, 0 x19, 0 x19, 0 x1a, 0 x1a, 0 x1b,
0 x1b, 0 x07, 0 x06, 0 x05, 0 x04, 0 x03, 0 x02, 0 x01, 0 x00, 0 x29, 0 x28,
0 x21, 0 x20, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18,
0 x18, 0 x18, 0 x18, 0 x18, 0 x18);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xaa, 0 xba, 0 xea, 0 xaa, 0 xaa, 0 xa0,
0 xaa, 0 xba, 0 xea, 0 xaa, 0 xaa, 0 xa0, 0 xaa, 0 xba, 0 xea, 0 xaa, 0 xaa,
0 xa0, 0 xaa, 0 xba, 0 xea, 0 xaa, 0 xaa, 0 xa0, 0 xaa, 0 xba, 0 xea, 0 xaa,
0 xaa, 0 xa0, 0 xaa, 0 xba, 0 xea, 0 xaa, 0 xaa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGMA, 0 x00, 0 x09, 0 x14, 0 x1e, 0 x26, 0 x48,
0 x61, 0 x67, 0 x6c, 0 x67, 0 x7d, 0 x7f, 0 x80, 0 x8b, 0 x87, 0 x8f, 0 x98,
0 xab, 0 xab, 0 x55, 0 x5c, 0 x68, 0 x73, 0 x00, 0 x09, 0 x14, 0 x1e, 0 x26,
0 x48, 0 x61, 0 x67, 0 x6c, 0 x67, 0 x7d, 0 x7f, 0 x80, 0 x8b, 0 x87, 0 x8f,
0 x98, 0 xab, 0 xab, 0 x55, 0 x5c, 0 x68, 0 x73);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x0e, 0 x10, 0 x10, 0 x21, 0 x2b, 0 x9a,
0 x02, 0 x54, 0 x9a, 0 x14, 0 x14, 0 x00, 0 x00, 0 x00, 0 x00, 0 x12, 0 x05,
0 x02, 0 x02, 0 x10);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x01, 0 xbf, 0 x11);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x86);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D2, 0 x3c, 0 xfa);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x00, 0 x00, 0 x44, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x80, 0 x0c, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x02, 0 x00, 0 x28, 0 x01, 0 x7e, 0 x0f,
0 x7e, 0 x10, 0 xa0, 0 x00, 0 x00, 0 x20, 0 x40, 0 x50, 0 x40);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x02);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xff, 0 xff, 0 xbf, 0 xfe, 0 xaa, 0 xa0,
0 xff, 0 xff, 0 xbf, 0 xfe, 0 xaa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 xfe, 0 x04, 0 xfe, 0 x04, 0 xfe, 0 x04,
0 x03, 0 x03, 0 x03, 0 x26, 0 x00, 0 x26, 0 x81, 0 x02, 0 x40, 0 x00, 0 x20,
0 x9e, 0 x04, 0 x03, 0 x02, 0 x01, 0 x00, 0 x00, 0 x00, 0 x00, 0 x01, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x03, 0 xff, 0 xf8);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x00, 0 x2a, 0 xaa, 0 xa8, 0 x00, 0 x00,
0 x00, 0 x2a, 0 xaa, 0 xa8, 0 x00, 0 x00, 0 x00, 0 x3f, 0 xff, 0 xfc, 0 x00,
0 x00, 0 x00, 0 x3f, 0 xff, 0 xfc, 0 x00, 0 x00, 0 x00, 0 x2a, 0 xaa, 0 xa8,
0 x00, 0 x00, 0 x00, 0 x2a, 0 xaa, 0 xa8, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x96);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x4f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
return dsi_ctx.accum_err;
};
static int boe_nv110wum_init(struct hx83102 *ctx)
{
struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
msleep(60 );
hx83102_enable_extended_cmds(&dsi_ctx, true );
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x2c, 0 xaf, 0 xaf, 0 x2b, 0 xeb, 0 x42,
0 xe1, 0 x4d, 0 x36, 0 x36, 0 x36, 0 x36, 0 x1a, 0 x8b, 0 x11, 0 x65, 0 x00,
0 x88, 0 xfa, 0 xff, 0 xff, 0 x8f, 0 xff, 0 x08, 0 x9a, 0 x33);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETDISP, 0 x00, 0 x47, 0 xb0, 0 x80, 0 x00, 0 x12,
0 x71, 0 x3c, 0 xa3, 0 x11, 0 x00, 0 x00, 0 x00, 0 x88, 0 xf5, 0 x22, 0 x8f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x49, 0 x49, 0 x32, 0 x32, 0 x14, 0 x32,
0 x84, 0 x6e, 0 x84, 0 x6e, 0 x01, 0 x9c);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcd);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x84);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETVDC, 0 x1b, 0 x04);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_BE, 0 x20);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPTBA, 0 xfc, 0 x84);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSTBA, 0 x36, 0 x36, 0 x22, 0 x00, 0 x00, 0 xa0,
0 x61, 0 x08, 0 xf5, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcc);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTCON, 0 x80);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETRAMDMY, 0 x97);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPWM, 0 x00, 0 x1e, 0 x30, 0 xd4, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x08, 0 x13, 0 x07, 0 x00, 0 x0f, 0 x34);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPANEL, 0 x02, 0 x03, 0 x44);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCASCADE, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPCTRL, 0 x37, 0 x06, 0 x00, 0 x02, 0 x04, 0 x0c, 0 xff);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D2, 0 x1f, 0 x11, 0 x1f, 0 x11);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x06, 0 x00, 0 x00, 0 x00, 0 x00, 0 x04,
0 x08, 0 x04, 0 x08, 0 x37, 0 x37, 0 x64, 0 x4b, 0 x11, 0 x11, 0 x03, 0 x03, 0 x32,
0 x10, 0 x0e, 0 x00, 0 x0e, 0 x32, 0 x10, 0 x0a, 0 x00, 0 x0a, 0 x32, 0 x17, 0 x98,
0 x07, 0 x98, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP1, 0 x18, 0 x18, 0 x18, 0 x18, 0 x1e, 0 x1e,
0 x1e, 0 x1e, 0 x1f, 0 x1f, 0 x1f, 0 x1f, 0 x24, 0 x24, 0 x24, 0 x24, 0 x07, 0 x06,
0 x07, 0 x06, 0 x05, 0 x04, 0 x05, 0 x04, 0 x03, 0 x02, 0 x03, 0 x02, 0 x01, 0 x00,
0 x01, 0 x00, 0 x21, 0 x20, 0 x21, 0 x20, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18,
0 x18, 0 x18);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xaf, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0,
0 xaf, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGMA, 0 x00, 0 x05, 0 x0d, 0 x14, 0 x1b, 0 x2c,
0 x44, 0 x49, 0 x51, 0 x4c, 0 x67, 0 x6c, 0 x71, 0 x80, 0 x7d, 0 x84, 0 x8d, 0 xa0,
0 xa0, 0 x4f, 0 x58, 0 x64, 0 x73, 0 x00, 0 x05, 0 x0d, 0 x14, 0 x1b, 0 x2c, 0 x44,
0 x49, 0 x51, 0 x4c, 0 x67, 0 x6c, 0 x71, 0 x80, 0 x7d, 0 x84, 0 x8d, 0 xa0, 0 xa0,
0 x4f, 0 x58, 0 x64, 0 x73);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x07, 0 x10, 0 x10, 0 x1a, 0 x26, 0 x9e,
0 x00, 0 x53, 0 x9b, 0 x14, 0 x14);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_E1, 0 x11, 0 x00, 0 x00, 0 x89, 0 x30, 0 x80,
0 x07, 0 x80, 0 x02, 0 x58, 0 x00, 0 x14, 0 x02, 0 x58, 0 x02, 0 x58, 0 x02, 0 x00,
0 x02, 0 x2c, 0 x00, 0 x20, 0 x02, 0 x02, 0 x00, 0 x08, 0 x00, 0 x0c, 0 x05, 0 x0e,
0 x04, 0 x94, 0 x18, 0 x00, 0 x10, 0 xf0, 0 x03, 0 x0c, 0 x20, 0 x00, 0 x06, 0 x0b,
0 x0b, 0 x33, 0 x0e);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xff, 0 xff, 0 xff, 0 xff, 0 xfa, 0 xa0,
0 xff, 0 xff, 0 xff, 0 xff, 0 xfa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x01, 0 xbf, 0 x11);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x86);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D2, 0 x96);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc9);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x84);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xd1);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_E1, 0 xf6, 0 x2b, 0 x34, 0 x2b, 0 x74, 0 x3b,
0 x74, 0 x6b, 0 x74);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x02, 0 x00, 0 x2b, 0 x01, 0 x7e, 0 x0f,
0 x7e, 0 x10, 0 xa0, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x02);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x02, 0 x00, 0 xbb, 0 x11);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xff, 0 xaf, 0 xff, 0 xff, 0 xfa, 0 xa0,
0 xff, 0 xaf, 0 xff, 0 xff, 0 xfa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 xfe, 0 x01, 0 xfe, 0 x01, 0 xfe, 0 x01,
0 x00, 0 x00, 0 x00, 0 x23, 0 x00, 0 x23, 0 x81, 0 x02, 0 x40, 0 x00, 0 x20, 0 x65,
0 x02, 0 x01, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x01, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xaa, 0 xaf, 0 xaa, 0 xaa, 0 xa0, 0 x00,
0 xaa, 0 xaf, 0 xaa, 0 xaa, 0 xa0, 0 x00, 0 xaa, 0 xaf, 0 xaa, 0 xaa, 0 xa0, 0 x00,
0 xaa, 0 xaf, 0 xaa, 0 xaa, 0 xa0, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x03, 0 xff, 0 xf8);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_E1, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x96);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x4f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
hx83102_enable_extended_cmds(&dsi_ctx, false );
mipi_dsi_msleep(&dsi_ctx, 50 );
return dsi_ctx.accum_err;
};
static int csot_pna957qt1_1_init(struct hx83102 *ctx)
{
struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
msleep(60 );
hx83102_enable_extended_cmds(&dsi_ctx, true );
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D9, 0 xd2);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x2c, 0 xb3, 0 xb3, 0 x31, 0 xf1, 0 x33,
0 xe0, 0 x54, 0 x36, 0 x36, 0 x3a, 0 x3a, 0 x32, 0 x8b, 0 x11, 0 xe5,
0 x98);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xd9);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x8b, 0 x33);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETDISP, 0 x00, 0 x47, 0 xb0, 0 x80, 0 x00, 0 x2c,
0 x80, 0 x3c, 0 x9f, 0 x22, 0 x20, 0 x00, 0 x00, 0 x98, 0 x51);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x41, 0 x41, 0 x41, 0 x41, 0 x64, 0 x64,
0 x40, 0 x84, 0 x64, 0 x84, 0 x01, 0 x9d, 0 x01, 0 x02, 0 x01, 0 x00,
0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETVDC, 0 x1b, 0 x04);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_BE, 0 x20);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPTBA, 0 xfc, 0 xc4, 0 x80, 0 x9c, 0 x36, 0 x00,
0 x0d, 0 x04);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSTBA, 0 x32, 0 x32, 0 x22, 0 x11, 0 x22, 0 xa0,
0 x31, 0 x08, 0 xf5, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcc);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTCON, 0 x80);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETRAMDMY, 0 x97);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPWM, 0 x00, 0 x1e, 0 x13, 0 x88, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x08, 0 x13, 0 x07, 0 x00, 0 x0f,
0 x36);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPANEL, 0 x02, 0 x03, 0 x44);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPCTRL, 0 x07, 0 x06, 0 x00, 0 x02, 0 x04, 0 x2c,
0 xff);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x06, 0 x00, 0 x00, 0 x00, 0 x40, 0 x04,
0 x08, 0 x04, 0 x08, 0 x37, 0 x07, 0 x44, 0 x37, 0 x2b, 0 x2b, 0 x03,
0 x03, 0 x32, 0 x10, 0 x22, 0 x00, 0 x25, 0 x32, 0 x10, 0 x29, 0 x00,
0 x29, 0 x32, 0 x10, 0 x08, 0 x00, 0 x08, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP1, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18,
0 x18, 0 x18, 0 x18, 0 x18, 0 x07, 0 x06, 0 x07, 0 x06, 0 x05, 0 x04,
0 x05, 0 x04, 0 x03, 0 x02, 0 x03, 0 x02, 0 x01, 0 x00, 0 x01, 0 x00,
0 x18, 0 x18, 0 x25, 0 x24, 0 x25, 0 x24, 0 x1f, 0 x1f, 0 x1f, 0 x1f,
0 x1e, 0 x1e, 0 x1e, 0 x1e, 0 x20, 0 x20, 0 x20, 0 x20);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0,
0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGMA, 0 x0a, 0 x0e, 0 x1a, 0 x21, 0 x28, 0 x46,
0 x5c, 0 x61, 0 x63, 0 x5e, 0 x78, 0 x7d, 0 x80, 0 x8e, 0 x89, 0 x90,
0 x98, 0 xaa, 0 xa8, 0 x52, 0 x59, 0 x60, 0 x6f, 0 x06, 0 x0a, 0 x16,
0 x1d, 0 x24, 0 x46, 0 x5c, 0 x61, 0 x6b, 0 x66, 0 x7c, 0 x7d, 0 x80,
0 x8e, 0 x89, 0 x90, 0 x98, 0 xaa, 0 xa8, 0 x52, 0 x59, 0 x60, 0 x6f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 xe0, 0 x10, 0 x10, 0 x0d, 0 x1e, 0 x9d,
0 x02, 0 x52, 0 x9d, 0 x14, 0 x14);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x01, 0 x7f, 0 x11, 0 xfd);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x4f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x86);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D2, 0 x64);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0,
0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0, 0 x05, 0 x15, 0 x55, 0 x45,
0 x55, 0 x50, 0 x05, 0 x15, 0 x55, 0 x45, 0 x55, 0 x50);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x02, 0 x00, 0 x24, 0 x01, 0 x7e, 0 x0f,
0 x7c, 0 x10, 0 xa0, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x02);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x03, 0 x07, 0 x00, 0 x10, 0 x7b);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x0f, 0 x3f, 0 xff, 0 xcf, 0 xff, 0 xf0,
0 x0f, 0 x3f, 0 xff, 0 xcf, 0 xff, 0 xf0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 xfe, 0 x01, 0 xfe, 0 x01, 0 xfe, 0 x01,
0 x00, 0 x00, 0 x00, 0 x23, 0 x00, 0 x23, 0 x81, 0 x02, 0 x40, 0 x00,
0 x20, 0 x9d, 0 x02, 0 x01, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x01, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETDISP, 0 x66, 0 x81);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x03, 0 xff, 0 xf8);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0,
0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0, 0 x0f, 0 x2a, 0 xaa, 0 x8a,
0 xaa, 0 xf0, 0 x0f, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xf0, 0 x0a, 0 x2a,
0 xaa, 0 x8a, 0 xaa, 0 xa0, 0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
hx83102_enable_extended_cmds(&dsi_ctx, false );
mipi_dsi_msleep(&dsi_ctx, 60 );
return dsi_ctx.accum_err;
};
static int ivo_t109nw41_init(struct hx83102 *ctx)
{
struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
msleep(60 );
hx83102_enable_extended_cmds(&dsi_ctx, true );
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x2c, 0 xed, 0 xed, 0 x27, 0 xe7, 0 x52,
0 xf5, 0 x39, 0 x36, 0 x36, 0 x36, 0 x36, 0 x32, 0 x8b, 0 x11, 0 x65, 0 x00, 0 x88,
0 xfa, 0 xff, 0 xff, 0 x8f, 0 xff, 0 x08, 0 xd6, 0 x33);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETDISP, 0 x00, 0 x47, 0 xb0, 0 x80, 0 x00, 0 x12,
0 x71, 0 x3c, 0 xa3, 0 x22, 0 x20, 0 x00, 0 x00, 0 x88, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x35, 0 x35, 0 x43, 0 x43, 0 x35, 0 x35,
0 x30, 0 x7a, 0 x30, 0 x7a, 0 x01, 0 x9d);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcd);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x84);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETVDC, 0 x1b, 0 x04);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_BE, 0 x20);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPTBA, 0 xfc, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSTBA, 0 x34, 0 x34, 0 x22, 0 x11, 0 x22, 0 xa0,
0 x31, 0 x08, 0 xf5, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcc);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTCON, 0 x80);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xd3);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTCON, 0 x22);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETRAMDMY, 0 x97);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPWM, 0 x00, 0 x1e, 0 x13, 0 x88, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x08, 0 x13, 0 x07, 0 x00, 0 x0f, 0 x34);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPANEL, 0 x02, 0 x03, 0 x44);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCASCADE, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPCTRL, 0 x07, 0 x06, 0 x00, 0 x02, 0 x04, 0 x2c,
0 xff);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x06, 0 x00, 0 x00, 0 x00, 0 x00, 0 x08,
0 x08, 0 x08, 0 x08, 0 x37, 0 x07, 0 x64, 0 x7c, 0 x11, 0 x11, 0 x03, 0 x03, 0 x32,
0 x10, 0 x0e, 0 x00, 0 x0e, 0 x32, 0 x17, 0 x97, 0 x07, 0 x97, 0 x32, 0 x00, 0 x02,
0 x00, 0 x02, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP1, 0 x25, 0 x24, 0 x25, 0 x24, 0 x18, 0 x18,
0 x18, 0 x18, 0 x07, 0 x06, 0 x07, 0 x06, 0 x05, 0 x04, 0 x05, 0 x04, 0 x03, 0 x02,
0 x03, 0 x02, 0 x01, 0 x00, 0 x01, 0 x00, 0 x1e, 0 x1e, 0 x1e, 0 x1e, 0 x1f, 0 x1f,
0 x1f, 0 x1f, 0 x21, 0 x20, 0 x21, 0 x20, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18,
0 x18, 0 x18);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0,
0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGMA, 0 x00, 0 x07, 0 x10, 0 x17, 0 x1c, 0 x33,
0 x48, 0 x50, 0 x57, 0 x50, 0 x68, 0 x6e, 0 x71, 0 x7f, 0 x81, 0 x8a, 0 x8e, 0 x9b,
0 x9c, 0 x4d, 0 x56, 0 x5d, 0 x73, 0 x00, 0 x07, 0 x10, 0 x17, 0 x1c, 0 x33, 0 x48,
0 x50, 0 x57, 0 x50, 0 x68, 0 x6e, 0 x71, 0 x7f, 0 x81, 0 x8a, 0 x8e, 0 x9b, 0 x9c,
0 x4d, 0 x56, 0 x5d, 0 x73);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x07, 0 x10, 0 x10, 0 x1a, 0 x26, 0 x9e,
0 x00, 0 x4f, 0 xa0, 0 x14, 0 x14, 0 x00, 0 x00, 0 x00, 0 x00, 0 x12, 0 x0a, 0 x02,
0 x02, 0 x00, 0 x33, 0 x02, 0 x04, 0 x18, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x01, 0 x7f, 0 x11, 0 xfd);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x86);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x00, 0 x00, 0 x04, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0,
0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x02, 0 x00, 0 x2b, 0 x01, 0 x7e, 0 x0f,
0 x7e, 0 x10, 0 xa0, 0 x00, 0 x00, 0 x77, 0 x00, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x02);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPTBA, 0 xf2);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x03, 0 x07, 0 x00, 0 x10, 0 x79);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xff, 0 xff, 0 xff, 0 xff, 0 xfa, 0 xa0,
0 xff, 0 xff, 0 xff, 0 xff, 0 xfa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 xfe, 0 x01, 0 xfe, 0 x01, 0 xfe, 0 x01,
0 x00, 0 x00, 0 x00, 0 x23, 0 x00, 0 x23, 0 x81, 0 x02, 0 x40, 0 x00, 0 x20, 0 x6e,
0 x02, 0 x01, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0,
0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0, 0 xff, 0 xff, 0 xff, 0 xff, 0 xfa, 0 xa0,
0 xff, 0 xff, 0 xff, 0 xff, 0 xfa, 0 xa0, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0,
0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x03, 0 xff, 0 xf8);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_E1, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D2, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff, 0 xff);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x96);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x4f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
hx83102_enable_extended_cmds(&dsi_ctx, false );
mipi_dsi_msleep(&dsi_ctx, 60 );
return dsi_ctx.accum_err;
};
static int kingdisplay_kd110n11_51ie_init(struct hx83102 *ctx)
{
struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
msleep(50 );
hx83102_enable_extended_cmds(&dsi_ctx, true );
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D9, 0 xd1);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x2c, 0 xb3, 0 xb3, 0 x31, 0 xf1,
0 x33, 0 xe0, 0 x54, 0 x36, 0 x36, 0 x3a, 0 x3a, 0 x32, 0 x8b,
0 x11, 0 xe5, 0 x98);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xd9);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x8b, 0 x33);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETDISP, 0 x00, 0 x47, 0 xb0, 0 x80, 0 x00, 0 x2c,
0 x80, 0 x3c, 0 x9f, 0 x22, 0 x20, 0 x00, 0 x00, 0 x98, 0 x51);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x64, 0 x64, 0 x64, 0 x64, 0 x64, 0 x64,
0 x40, 0 x84, 0 x64, 0 x84, 0 x01, 0 x9d, 0 x01, 0 x02, 0 x01, 0 x00,
0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETVDC, 0 x1b, 0 x04);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_BE, 0 x20);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPTBA, 0 xfc, 0 xc4, 0 x80, 0 x9c, 0 x36, 0 x00,
0 x0d, 0 x04);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSTBA, 0 x32, 0 x32, 0 x22, 0 x11, 0 x22, 0 xa0,
0 x31, 0 x08, 0 xf5, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcc);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTCON, 0 x80);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETRAMDMY, 0 x97);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPWM, 0 x00, 0 x1e, 0 x13, 0 x88, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x08, 0 x13, 0 x07, 0 x00,
0 x0f, 0 x36);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPANEL, 0 x02, 0 x03, 0 x44);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPCTRL, 0 x07, 0 x06, 0 x00, 0 x02,
0 x04, 0 x2c, 0 xff);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x06, 0 x00, 0 x00, 0 x00, 0 x40, 0 x04,
0 x08, 0 x04, 0 x08, 0 x37, 0 x07, 0 x44, 0 x37, 0 x2b, 0 x2b, 0 x03,
0 x03, 0 x32, 0 x10, 0 x22, 0 x00, 0 x25, 0 x32, 0 x10, 0 x29, 0 x00,
0 x29, 0 x32, 0 x10, 0 x08, 0 x00, 0 x08, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP1, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18,
0 x18, 0 x18, 0 x18, 0 x18, 0 x07, 0 x06, 0 x07, 0 x06, 0 x05, 0 x04,
0 x05, 0 x04, 0 x03, 0 x02, 0 x03, 0 x02, 0 x01, 0 x00, 0 x01, 0 x00,
0 x18, 0 x18, 0 x25, 0 x24, 0 x25, 0 x24, 0 x1f, 0 x1f, 0 x1f, 0 x1f,
0 x1e, 0 x1e, 0 x1e, 0 x1e, 0 x20, 0 x20, 0 x20, 0 x20);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0,
0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 xe0, 0 x10, 0 x10, 0 x0d, 0 x1e, 0 x9d,
0 x02, 0 x52, 0 x9d, 0 x14, 0 x14);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x01, 0 x7f, 0 x11, 0 xfd);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x4f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x86);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D2, 0 x64);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0,
0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0, 0 x05, 0 x15, 0 x55, 0 x45,
0 x55, 0 x50, 0 x05, 0 x15, 0 x55, 0 x45, 0 x55, 0 x50);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x02, 0 x00, 0 x24, 0 x01, 0 x7e, 0 x0f,
0 x7c, 0 x10, 0 xa0, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x02);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x03, 0 x07, 0 x00, 0 x10, 0 x7b);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x0f, 0 x3f, 0 xff, 0 xcf, 0 xff, 0 xf0,
0 x0f, 0 x3f, 0 xff, 0 xcf, 0 xff, 0 xf0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 xfe, 0 x01, 0 xfe, 0 x01, 0 xfe, 0 x01,
0 x00, 0 x00, 0 x00, 0 x23, 0 x00, 0 x23, 0 x81, 0 x02, 0 x40, 0 x00,
0 x20, 0 x9d, 0 x02, 0 x01, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x01, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETDISP, 0 x66, 0 x81);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x03, 0 xff, 0 xf8);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0,
0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0, 0 x0f, 0 x2a, 0 xaa, 0 x8a,
0 xaa, 0 xf0, 0 x0f, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xf0, 0 x0a, 0 x2a,
0 xaa, 0 x8a, 0 xaa, 0 xa0, 0 x0a, 0 x2a, 0 xaa, 0 x8a, 0 xaa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
hx83102_enable_extended_cmds(&dsi_ctx, false );
return dsi_ctx.accum_err;
}
static int starry_2082109qfh040022_50e_init(struct hx83102 *ctx)
{
struct mipi_dsi_multi_context dsi_ctx = { .dsi = ctx->dsi };
msleep(50 );
hx83102_enable_extended_cmds(&dsi_ctx, true );
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D9, 0 xd1);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x2c, 0 xb5, 0 xb5, 0 x31, 0 xf1, 0 x33,
0 xc3, 0 x57, 0 x36, 0 x36, 0 x36, 0 x36, 0 x1a, 0 x8b, 0 x11, 0 x65,
0 x00, 0 x88, 0 xfa, 0 xff, 0 xff, 0 x8f, 0 xff, 0 x08, 0 x3c, 0 x33);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETDISP, 0 x00, 0 x47, 0 xb0, 0 x80, 0 x00, 0 x22,
0 x70, 0 x3c, 0 xa1, 0 x22, 0 x00, 0 x00, 0 x00, 0 x88, 0 xf4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x14, 0 x16, 0 x14, 0 x50, 0 x14, 0 x50,
0 x0d, 0 x6a, 0 x0d, 0 x6a, 0 x01, 0 x9e);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_B6, 0 x34, 0 x34, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_B8, 0 x40);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcd);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x84);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETVDC, 0 x1b, 0 x04);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_BE, 0 x20);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPTBA, 0 xfc, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSTBA, 0 x38, 0 x38, 0 x22, 0 x11, 0 x33, 0 xa0,
0 x61, 0 x08, 0 xf5, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcc);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTCON, 0 x80);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETRAMDMY, 0 x97);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPWM, 0 x00, 0 x1e, 0 x30, 0 xd4, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x08, 0 x13, 0 x07, 0 x00, 0 x0f,
0 x16);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPANEL, 0 x02, 0 x03, 0 x44);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCASCADE, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPCTRL, 0 x37, 0 x06, 0 x00, 0 x02, 0 x04,
0 x2c, 0 xff);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x06, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x3b, 0 x03, 0 x73, 0 x3b, 0 x21, 0 x21, 0 x03,
0 x03, 0 x98, 0 x10, 0 x1d, 0 x00, 0 x1d, 0 x32, 0 x17, 0 xa1, 0 x07,
0 xa1, 0 x43, 0 x17, 0 xa6, 0 x07, 0 xa6, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP1, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18, 0 x18,
0 x40, 0 x40, 0 x18, 0 x18, 0 x18, 0 x18, 0 x2a, 0 x2b, 0 x1f, 0 x1f,
0 x1e, 0 x1e, 0 x24, 0 x25, 0 x26, 0 x27, 0 x28, 0 x29, 0 x2a, 0 x2b,
0 x00, 0 x01, 0 x02, 0 x03, 0 x04, 0 x05, 0 x06, 0 x07, 0 x08, 0 x09,
0 x0a, 0 x0b, 0 x20, 0 x21, 0 x18, 0 x18, 0 x18, 0 x18);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x02, 0 xaa, 0 xea, 0 xaa, 0 xaa, 0 x00,
0 x02, 0 xaa, 0 xea, 0 xaa, 0 xaa, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x07, 0 x10, 0 x10, 0 x2a, 0 x32, 0 x9f,
0 x01, 0 x5a, 0 x91, 0 x14, 0 x14, 0 x00, 0 x00, 0 x00, 0 x00, 0 x12,
0 x05, 0 x02, 0 x02, 0 x10, 0 x33, 0 x02, 0 x04, 0 x18, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPOWER, 0 x01, 0 x7f, 0 x11, 0 xfd);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x86);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D2, 0 x3d);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x00, 0 x00, 0 x00, 0 x80, 0 x80, 0 x0c,
0 xa1);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 x03, 0 xff, 0 xff, 0 xff, 0 xff, 0 x00,
0 x03, 0 xff, 0 xff, 0 xff, 0 xff, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 x02, 0 x00, 0 x2d, 0 x01, 0 x7f, 0 x0f,
0 x7c, 0 x10, 0 xa0, 0 x00, 0 x00, 0 x77, 0 x00, 0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x02);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETPTBA, 0 xf2);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCLOCK, 0 x02, 0 x00, 0 x00, 0 x10, 0 x58);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_D2, 0 x0a, 0 x0a, 0 x05, 0 x03, 0 x0a,
0 x0a, 0 x01, 0 x03, 0 x01, 0 x01, 0 x05, 0 x0e);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcc);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP0, 0 x03, 0 x1f, 0 xe0, 0 x11, 0 x70);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xab, 0 xff, 0 xff, 0 xff, 0 xff, 0 xa0,
0 xab, 0 xff, 0 xff, 0 xff, 0 xff, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETTP1, 0 xfe, 0 x01, 0 xfe, 0 x01, 0 xfe, 0 x01,
0 x00, 0 x00, 0 x00, 0 x03, 0 x00, 0 x03, 0 x81, 0 x02, 0 x40, 0 x00,
0 x20, 0 x9e, 0 x02, 0 x01, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x03);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc6);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETCYC, 0 x03, 0 xff, 0 xf8);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETGIP3, 0 xaa, 0 xab, 0 xea, 0 xaa, 0 xaa, 0 xa0,
0 xaa, 0 xab, 0 xea, 0 xaa, 0 xaa, 0 xa0, 0 xaa, 0 xbf, 0 xff, 0 xff,
0 xfe, 0 xa0, 0 xaa, 0 xbf, 0 xff, 0 xff, 0 xfe, 0 xa0, 0 xaa, 0 xaa,
0 xaa, 0 xaa, 0 xaa, 0 xa0, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xaa, 0 xa0);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_UNKNOWN_E1, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc4);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x96);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x01);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xc5);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x4f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x02);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 xcc);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETMIPI, 0 x84);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETSPCCMD, 0 x3f);
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, HX83102_SETBANK, 0 x00);
hx83102_enable_extended_cmds(&dsi_ctx, false );
mipi_dsi_msleep(&dsi_ctx, 110 );
return dsi_ctx.accum_err;
}
static const struct drm_display_mode starry_mode = {
.clock = 162680 ,
.hdisplay = 1200 ,
.hsync_start = 1200 + 60 ,
.hsync_end = 1200 + 60 + 20 ,
.htotal = 1200 + 60 + 20 + 40 ,
.vdisplay = 1920 ,
.vsync_start = 1920 + 116 ,
.vsync_end = 1920 + 116 + 8 ,
.vtotal = 1920 + 116 + 8 + 12 ,
.type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
};
static const struct hx83102_panel_desc starry_desc = {
.modes = &starry_mode,
.size = {
.width_mm = 141 ,
.height_mm = 226 ,
},
.init = starry_himax83102_j02_init,
};
static const struct drm_display_mode boe_tv110wum_default_mode = {
.clock = 167700 ,
.hdisplay = 1200 ,
.hsync_start = 1200 + 75 ,
.hsync_end = 1200 + 75 + 20 ,
.htotal = 1200 + 75 + 20 + 65 ,
.vdisplay = 1920 ,
.vsync_start = 1920 + 115 ,
.vsync_end = 1920 + 115 + 8 ,
.vtotal = 1920 + 115 + 8 + 12 ,
.type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
};
static const struct hx83102_panel_desc boe_nv110wum_desc = {
.modes = &boe_tv110wum_default_mode,
.size = {
.width_mm = 147 ,
.height_mm = 235 ,
},
.init = boe_nv110wum_init,
};
static const struct drm_display_mode csot_pna957qt1_1_default_mode = {
.clock = 177958 ,
.hdisplay = 1200 ,
.hsync_start = 1200 + 124 ,
.hsync_end = 1200 + 124 + 80 ,
.htotal = 1200 + 124 + 80 + 40 ,
.vdisplay = 1920 ,
.vsync_start = 1920 + 88 ,
.vsync_end = 1920 + 88 + 8 ,
.vtotal = 1920 + 88 + 8 + 38 ,
.type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
};
static const struct hx83102_panel_desc csot_pna957qt1_1_desc = {
.modes = &csot_pna957qt1_1_default_mode,
.size = {
.width_mm = 147 ,
.height_mm = 235 ,
},
.init = csot_pna957qt1_1_init,
};
static const struct drm_display_mode ivo_t109nw41_default_mode = {
.clock = 167700 ,
.hdisplay = 1200 ,
.hsync_start = 1200 + 75 ,
.hsync_end = 1200 + 75 + 20 ,
.htotal = 1200 + 75 + 20 + 65 ,
.vdisplay = 1920 ,
.vsync_start = 1920 + 115 ,
.vsync_end = 1920 + 115 + 8 ,
.vtotal = 1920 + 115 + 8 + 12 ,
.type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
};
static const struct hx83102_panel_desc ivo_t109nw41_desc = {
.modes = &ivo_t109nw41_default_mode,
.size = {
.width_mm = 147 ,
.height_mm = 235 ,
},
.init = ivo_t109nw41_init,
};
static const struct drm_display_mode kingdisplay_kd110n11_51ie_default_mode = {
.clock = 182750 ,
.hdisplay = 1200 ,
.hsync_start = 1200 + 124 ,
.hsync_end = 1200 + 124 + 80 ,
.htotal = 1200 + 124 + 80 + 80 ,
.vdisplay = 1920 ,
.vsync_start = 1920 + 88 ,
.vsync_end = 1920 + 88 + 8 ,
.vtotal = 1920 + 88 + 8 + 38 ,
.type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
};
static const struct hx83102_panel_desc kingdisplay_kd110n11_51ie_desc = {
.modes = &kingdisplay_kd110n11_51ie_default_mode,
.size = {
.width_mm = 147 ,
.height_mm = 235 ,
},
.init = kingdisplay_kd110n11_51ie_init,
};
static const struct drm_display_mode starry_2082109qfh040022_50e_default_mode = {
.clock = 192050 ,
.hdisplay = 1200 ,
.hsync_start = 1200 + 160 ,
.hsync_end = 1200 + 160 + 66 ,
.htotal = 1200 + 160 + 66 + 120 ,
.vdisplay = 1920 ,
.vsync_start = 1920 + 115 ,
.vsync_end = 1920 + 115 + 8 ,
.vtotal = 1920 + 115 + 8 + 28 ,
.type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
};
static const struct hx83102_panel_desc starry_2082109qfh040022_50e_desc = {
.modes = &starry_2082109qfh040022_50e_default_mode,
.size = {
.width_mm = 147 ,
.height_mm = 235 ,
},
.init = starry_2082109qfh040022_50e_init,
};
static int hx83102_enable(struct drm_panel *panel)
{
msleep(130 );
return 0 ;
}
static int hx83102_disable(struct drm_panel *panel)
{
struct hx83102 *ctx = panel_to_hx83102(panel);
struct mipi_dsi_device *dsi = ctx->dsi;
struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
mipi_dsi_msleep(&dsi_ctx, 150 );
return dsi_ctx.accum_err;
}
static int hx83102_unprepare(struct drm_panel *panel)
{
struct hx83102 *ctx = panel_to_hx83102(panel);
gpiod_set_value(ctx->enable_gpio, 0 );
usleep_range(1000 , 2000 );
regulator_disable(ctx->avee);
regulator_disable(ctx->avdd);
usleep_range(5000 , 7000 );
regulator_disable(ctx->pp1800);
return 0 ;
}
static int hx83102_prepare(struct drm_panel *panel)
{
struct hx83102 *ctx = panel_to_hx83102(panel);
struct mipi_dsi_device *dsi = ctx->dsi;
struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi };
gpiod_set_value(ctx->enable_gpio, 0 );
usleep_range(1000 , 1500 );
dsi_ctx.accum_err = regulator_enable(ctx->pp1800);
if (dsi_ctx.accum_err)
return dsi_ctx.accum_err;
usleep_range(3000 , 5000 );
dsi_ctx.accum_err = regulator_enable(ctx->avdd);
if (dsi_ctx.accum_err)
goto poweroff1v8;
dsi_ctx.accum_err = regulator_enable(ctx->avee);
if (dsi_ctx.accum_err)
goto poweroffavdd;
usleep_range(10000 , 11000 );
mipi_dsi_dcs_nop_multi(&dsi_ctx);
if (dsi_ctx.accum_err)
goto poweroff;
usleep_range(1000 , 2000 );
gpiod_set_value(ctx->enable_gpio, 1 );
usleep_range(1000 , 2000 );
gpiod_set_value(ctx->enable_gpio, 0 );
usleep_range(1000 , 2000 );
gpiod_set_value(ctx->enable_gpio, 1 );
usleep_range(6000 , 10000 );
dsi_ctx.accum_err = ctx->desc->init(ctx);
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
mipi_dsi_msleep(&dsi_ctx, 120 );
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
if (dsi_ctx.accum_err)
goto poweroff;
return 0 ;
poweroff:
gpiod_set_value(ctx->enable_gpio, 0 );
regulator_disable(ctx->avee);
poweroffavdd:
regulator_disable(ctx->avdd);
poweroff1v8:
usleep_range(5000 , 7000 );
regulator_disable(ctx->pp1800);
return dsi_ctx.accum_err;
}
static int hx83102_get_modes(struct drm_panel *panel,
struct drm_connector *connector)
{
struct hx83102 *ctx = panel_to_hx83102(panel);
const struct drm_display_mode *m = ctx->desc->modes;
struct drm_display_mode *mode;
mode = drm_mode_duplicate(connector->dev, m);
if (!mode)
return -ENOMEM;
mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
drm_mode_set_name(mode);
drm_mode_probed_add(connector, mode);
connector->display_info.width_mm = ctx->desc->size.width_mm;
connector->display_info.height_mm = ctx->desc->size.height_mm;
connector->display_info.bpc = 8 ;
return 1 ;
}
static enum drm_panel_orientation hx83102_get_orientation(struct drm_panel *panel)
{
struct hx83102 *ctx = panel_to_hx83102(panel);
return ctx->orientation;
}
static const struct drm_panel_funcs hx83102_drm_funcs = {
.disable = hx83102_disable,
.unprepare = hx83102_unprepare,
.prepare = hx83102_prepare,
.enable = hx83102_enable,
.get_modes = hx83102_get_modes,
.get_orientation = hx83102_get_orientation,
};
static int hx83102_panel_add(struct hx83102 *ctx)
{
struct device *dev = &ctx->dsi->dev;
int err;
ctx->avdd = devm_regulator_get(dev, "avdd" );
if (IS_ERR(ctx->avdd))
return PTR_ERR(ctx->avdd);
ctx->avee = devm_regulator_get(dev, "avee" );
if (IS_ERR(ctx->avee))
return PTR_ERR(ctx->avee);
ctx->pp1800 = devm_regulator_get(dev, "pp1800" );
if (IS_ERR(ctx->pp1800))
return PTR_ERR(ctx->pp1800);
ctx->enable_gpio = devm_gpiod_get(dev, "enable" , GPIOD_OUT_LOW);
if (IS_ERR(ctx->enable_gpio))
return dev_err_probe(dev, PTR_ERR(ctx->enable_gpio), "Cannot get enable GPIO\n" );
ctx->base.prepare_prev_first = true ;
err = of_drm_get_panel_orientation(dev->of_node, &ctx->orientation);
if (err < 0 )
return dev_err_probe(dev, err, "failed to get orientation\n" );
err = drm_panel_of_backlight(&ctx->base);
if (err)
return err;
ctx->base.funcs = &hx83102_drm_funcs;
ctx->base.dev = &ctx->dsi->dev;
drm_panel_add(&ctx->base);
return 0 ;
}
static int hx83102_probe(struct mipi_dsi_device *dsi)
{
struct hx83102 *ctx;
int ret;
const struct hx83102_panel_desc *desc;
ctx = devm_drm_panel_alloc(&dsi->dev, __typeof(*ctx), base,
&hx83102_drm_funcs, DRM_MODE_CONNECTOR_DSI);
if (IS_ERR(ctx))
return PTR_ERR(ctx);
desc = of_device_get_match_data(&dsi->dev);
dsi->lanes = 4 ;
dsi->format = MIPI_DSI_FMT_RGB888;
dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
MIPI_DSI_MODE_LPM;
ctx->desc = desc;
ctx->dsi = dsi;
ret = hx83102_panel_add(ctx);
if (ret < 0 )
return ret;
mipi_dsi_set_drvdata(dsi, ctx);
ret = mipi_dsi_attach(dsi);
if (ret)
drm_panel_remove(&ctx->base);
return ret;
}
static void hx83102_remove(struct mipi_dsi_device *dsi)
{
struct hx83102 *ctx = mipi_dsi_get_drvdata(dsi);
int ret;
ret = mipi_dsi_detach(dsi);
if (ret < 0 )
dev_err(&dsi->dev, "failed to detach from DSI host: %d\n" , ret);
if (ctx->base.dev)
drm_panel_remove(&ctx->base);
}
static const struct of_device_id hx83102_of_match[] = {
{ .compatible = "boe,nv110wum-l60" ,
.data = &boe_nv110wum_desc
},
{ .compatible = "csot,pna957qt1-1" ,
.data = &csot_pna957qt1_1_desc
},
{ .compatible = "ivo,t109nw41" ,
.data = &ivo_t109nw41_desc
},
{ .compatible = "kingdisplay,kd110n11-51ie" ,
.data = &kingdisplay_kd110n11_51ie_desc
},
{ .compatible = "starry,2082109qfh040022-50e" ,
.data = &starry_2082109qfh040022_50e_desc
},
{ .compatible = "starry,himax83102-j02" ,
.data = &starry_desc
},
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, hx83102_of_match);
static struct mipi_dsi_driver hx83102_driver = {
.probe = hx83102_probe,
.remove = hx83102_remove,
.driver = {
.name = "panel-himax-hx83102" ,
.of_match_table = hx83102_of_match,
},
};
module_mipi_dsi_driver(hx83102_driver);
MODULE_AUTHOR("Cong Yang <yangcong5@huaqin.corp-partner.google.com>" );
MODULE_DESCRIPTION("DRM driver for Himax HX83102 based MIPI DSI panels" );
MODULE_LICENSE("GPL" );
Messung V0.5 in Prozent C=95 H=97 G=95
¤ Dauer der Verarbeitung: 0.40 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland