162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * MIPI-DSI based s6e8aa0 AMOLED LCD 5.3 inch panel driver.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2013 Samsung Electronics Co., Ltd
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Inki Dae, <inki.dae@samsung.com>
862306a36Sopenharmony_ci * Donghwa Lee, <dh09.lee@samsung.com>
962306a36Sopenharmony_ci * Joongmock Shin <jmock.shin@samsung.com>
1062306a36Sopenharmony_ci * Eunchul Kim <chulspro.kim@samsung.com>
1162306a36Sopenharmony_ci * Tomasz Figa <t.figa@samsung.com>
1262306a36Sopenharmony_ci * Andrzej Hajda <a.hajda@samsung.com>
1362306a36Sopenharmony_ci*/
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/delay.h>
1662306a36Sopenharmony_ci#include <linux/gpio/consumer.h>
1762306a36Sopenharmony_ci#include <linux/module.h>
1862306a36Sopenharmony_ci#include <linux/of.h>
1962306a36Sopenharmony_ci#include <linux/regulator/consumer.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#include <video/mipi_display.h>
2262306a36Sopenharmony_ci#include <video/of_videomode.h>
2362306a36Sopenharmony_ci#include <video/videomode.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#include <drm/drm_mipi_dsi.h>
2662306a36Sopenharmony_ci#include <drm/drm_modes.h>
2762306a36Sopenharmony_ci#include <drm/drm_panel.h>
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define LDI_MTP_LENGTH			24
3062306a36Sopenharmony_ci#define GAMMA_LEVEL_NUM			25
3162306a36Sopenharmony_ci#define GAMMA_TABLE_LEN			26
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci#define PANELCTL_SS_MASK		(1 << 5)
3462306a36Sopenharmony_ci#define PANELCTL_SS_1_800		(0 << 5)
3562306a36Sopenharmony_ci#define PANELCTL_SS_800_1		(1 << 5)
3662306a36Sopenharmony_ci#define PANELCTL_GTCON_MASK		(7 << 2)
3762306a36Sopenharmony_ci#define PANELCTL_GTCON_110		(6 << 2)
3862306a36Sopenharmony_ci#define PANELCTL_GTCON_111		(7 << 2)
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define PANELCTL_CLK1_CON_MASK		(7 << 3)
4162306a36Sopenharmony_ci#define PANELCTL_CLK1_000		(0 << 3)
4262306a36Sopenharmony_ci#define PANELCTL_CLK1_001		(1 << 3)
4362306a36Sopenharmony_ci#define PANELCTL_CLK2_CON_MASK		(7 << 0)
4462306a36Sopenharmony_ci#define PANELCTL_CLK2_000		(0 << 0)
4562306a36Sopenharmony_ci#define PANELCTL_CLK2_001		(1 << 0)
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define PANELCTL_INT1_CON_MASK		(7 << 3)
4862306a36Sopenharmony_ci#define PANELCTL_INT1_000		(0 << 3)
4962306a36Sopenharmony_ci#define PANELCTL_INT1_001		(1 << 3)
5062306a36Sopenharmony_ci#define PANELCTL_INT2_CON_MASK		(7 << 0)
5162306a36Sopenharmony_ci#define PANELCTL_INT2_000		(0 << 0)
5262306a36Sopenharmony_ci#define PANELCTL_INT2_001		(1 << 0)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define PANELCTL_BICTL_CON_MASK		(7 << 3)
5562306a36Sopenharmony_ci#define PANELCTL_BICTL_000		(0 << 3)
5662306a36Sopenharmony_ci#define PANELCTL_BICTL_001		(1 << 3)
5762306a36Sopenharmony_ci#define PANELCTL_BICTLB_CON_MASK	(7 << 0)
5862306a36Sopenharmony_ci#define PANELCTL_BICTLB_000		(0 << 0)
5962306a36Sopenharmony_ci#define PANELCTL_BICTLB_001		(1 << 0)
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define PANELCTL_EM_CLK1_CON_MASK	(7 << 3)
6262306a36Sopenharmony_ci#define PANELCTL_EM_CLK1_110		(6 << 3)
6362306a36Sopenharmony_ci#define PANELCTL_EM_CLK1_111		(7 << 3)
6462306a36Sopenharmony_ci#define PANELCTL_EM_CLK1B_CON_MASK	(7 << 0)
6562306a36Sopenharmony_ci#define PANELCTL_EM_CLK1B_110		(6 << 0)
6662306a36Sopenharmony_ci#define PANELCTL_EM_CLK1B_111		(7 << 0)
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#define PANELCTL_EM_CLK2_CON_MASK	(7 << 3)
6962306a36Sopenharmony_ci#define PANELCTL_EM_CLK2_110		(6 << 3)
7062306a36Sopenharmony_ci#define PANELCTL_EM_CLK2_111		(7 << 3)
7162306a36Sopenharmony_ci#define PANELCTL_EM_CLK2B_CON_MASK	(7 << 0)
7262306a36Sopenharmony_ci#define PANELCTL_EM_CLK2B_110		(6 << 0)
7362306a36Sopenharmony_ci#define PANELCTL_EM_CLK2B_111		(7 << 0)
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#define PANELCTL_EM_INT1_CON_MASK	(7 << 3)
7662306a36Sopenharmony_ci#define PANELCTL_EM_INT1_000		(0 << 3)
7762306a36Sopenharmony_ci#define PANELCTL_EM_INT1_001		(1 << 3)
7862306a36Sopenharmony_ci#define PANELCTL_EM_INT2_CON_MASK	(7 << 0)
7962306a36Sopenharmony_ci#define PANELCTL_EM_INT2_000		(0 << 0)
8062306a36Sopenharmony_ci#define PANELCTL_EM_INT2_001		(1 << 0)
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#define AID_DISABLE			(0x4)
8362306a36Sopenharmony_ci#define AID_1				(0x5)
8462306a36Sopenharmony_ci#define AID_2				(0x6)
8562306a36Sopenharmony_ci#define AID_3				(0x7)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_citypedef u8 s6e8aa0_gamma_table[GAMMA_TABLE_LEN];
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cistruct s6e8aa0_variant {
9062306a36Sopenharmony_ci	u8 version;
9162306a36Sopenharmony_ci	const s6e8aa0_gamma_table *gamma_tables;
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistruct s6e8aa0 {
9562306a36Sopenharmony_ci	struct device *dev;
9662306a36Sopenharmony_ci	struct drm_panel panel;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	struct regulator_bulk_data supplies[2];
9962306a36Sopenharmony_ci	struct gpio_desc *reset_gpio;
10062306a36Sopenharmony_ci	u32 power_on_delay;
10162306a36Sopenharmony_ci	u32 reset_delay;
10262306a36Sopenharmony_ci	u32 init_delay;
10362306a36Sopenharmony_ci	bool flip_horizontal;
10462306a36Sopenharmony_ci	bool flip_vertical;
10562306a36Sopenharmony_ci	struct videomode vm;
10662306a36Sopenharmony_ci	u32 width_mm;
10762306a36Sopenharmony_ci	u32 height_mm;
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	u8 version;
11062306a36Sopenharmony_ci	u8 id;
11162306a36Sopenharmony_ci	const struct s6e8aa0_variant *variant;
11262306a36Sopenharmony_ci	int brightness;
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	/* This field is tested by functions directly accessing DSI bus before
11562306a36Sopenharmony_ci	 * transfer, transfer is skipped if it is set. In case of transfer
11662306a36Sopenharmony_ci	 * failure or unexpected response the field is set to error value.
11762306a36Sopenharmony_ci	 * Such construct allows to eliminate many checks in higher level
11862306a36Sopenharmony_ci	 * functions.
11962306a36Sopenharmony_ci	 */
12062306a36Sopenharmony_ci	int error;
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistatic inline struct s6e8aa0 *panel_to_s6e8aa0(struct drm_panel *panel)
12462306a36Sopenharmony_ci{
12562306a36Sopenharmony_ci	return container_of(panel, struct s6e8aa0, panel);
12662306a36Sopenharmony_ci}
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cistatic int s6e8aa0_clear_error(struct s6e8aa0 *ctx)
12962306a36Sopenharmony_ci{
13062306a36Sopenharmony_ci	int ret = ctx->error;
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	ctx->error = 0;
13362306a36Sopenharmony_ci	return ret;
13462306a36Sopenharmony_ci}
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cistatic void s6e8aa0_dcs_write(struct s6e8aa0 *ctx, const void *data, size_t len)
13762306a36Sopenharmony_ci{
13862306a36Sopenharmony_ci	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
13962306a36Sopenharmony_ci	ssize_t ret;
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	if (ctx->error < 0)
14262306a36Sopenharmony_ci		return;
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	ret = mipi_dsi_dcs_write_buffer(dsi, data, len);
14562306a36Sopenharmony_ci	if (ret < 0) {
14662306a36Sopenharmony_ci		dev_err(ctx->dev, "error %zd writing dcs seq: %*ph\n", ret,
14762306a36Sopenharmony_ci			(int)len, data);
14862306a36Sopenharmony_ci		ctx->error = ret;
14962306a36Sopenharmony_ci	}
15062306a36Sopenharmony_ci}
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_cistatic int s6e8aa0_dcs_read(struct s6e8aa0 *ctx, u8 cmd, void *data, size_t len)
15362306a36Sopenharmony_ci{
15462306a36Sopenharmony_ci	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
15562306a36Sopenharmony_ci	int ret;
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	if (ctx->error < 0)
15862306a36Sopenharmony_ci		return ctx->error;
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	ret = mipi_dsi_dcs_read(dsi, cmd, data, len);
16162306a36Sopenharmony_ci	if (ret < 0) {
16262306a36Sopenharmony_ci		dev_err(ctx->dev, "error %d reading dcs seq(%#x)\n", ret, cmd);
16362306a36Sopenharmony_ci		ctx->error = ret;
16462306a36Sopenharmony_ci	}
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	return ret;
16762306a36Sopenharmony_ci}
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci#define s6e8aa0_dcs_write_seq(ctx, seq...) \
17062306a36Sopenharmony_ci({\
17162306a36Sopenharmony_ci	const u8 d[] = { seq };\
17262306a36Sopenharmony_ci	BUILD_BUG_ON_MSG(ARRAY_SIZE(d) > 64, "DCS sequence too big for stack");\
17362306a36Sopenharmony_ci	s6e8aa0_dcs_write(ctx, d, ARRAY_SIZE(d));\
17462306a36Sopenharmony_ci})
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci#define s6e8aa0_dcs_write_seq_static(ctx, seq...) \
17762306a36Sopenharmony_ci({\
17862306a36Sopenharmony_ci	static const u8 d[] = { seq };\
17962306a36Sopenharmony_ci	s6e8aa0_dcs_write(ctx, d, ARRAY_SIZE(d));\
18062306a36Sopenharmony_ci})
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_cistatic void s6e8aa0_apply_level_1_key(struct s6e8aa0 *ctx)
18362306a36Sopenharmony_ci{
18462306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq_static(ctx, 0xf0, 0x5a, 0x5a);
18562306a36Sopenharmony_ci}
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_cistatic void s6e8aa0_panel_cond_set_v142(struct s6e8aa0 *ctx)
18862306a36Sopenharmony_ci{
18962306a36Sopenharmony_ci	static const u8 aids[] = {
19062306a36Sopenharmony_ci		0x04, 0x04, 0x04, 0x04, 0x04, 0x60, 0x80, 0xA0
19162306a36Sopenharmony_ci	};
19262306a36Sopenharmony_ci	u8 aid = aids[ctx->id >> 5];
19362306a36Sopenharmony_ci	u8 cfg = 0x3d;
19462306a36Sopenharmony_ci	u8 clk_con = 0xc8;
19562306a36Sopenharmony_ci	u8 int_con = 0x08;
19662306a36Sopenharmony_ci	u8 bictl_con = 0x48;
19762306a36Sopenharmony_ci	u8 em_clk1_con = 0xff;
19862306a36Sopenharmony_ci	u8 em_clk2_con = 0xff;
19962306a36Sopenharmony_ci	u8 em_int_con = 0xc8;
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	if (ctx->flip_vertical) {
20262306a36Sopenharmony_ci		/* GTCON */
20362306a36Sopenharmony_ci		cfg &= ~(PANELCTL_GTCON_MASK);
20462306a36Sopenharmony_ci		cfg |= (PANELCTL_GTCON_110);
20562306a36Sopenharmony_ci	}
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	if (ctx->flip_horizontal) {
20862306a36Sopenharmony_ci		/* SS */
20962306a36Sopenharmony_ci		cfg &= ~(PANELCTL_SS_MASK);
21062306a36Sopenharmony_ci		cfg |= (PANELCTL_SS_1_800);
21162306a36Sopenharmony_ci	}
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	if (ctx->flip_horizontal || ctx->flip_vertical) {
21462306a36Sopenharmony_ci		/* CLK1,2_CON */
21562306a36Sopenharmony_ci		clk_con &= ~(PANELCTL_CLK1_CON_MASK |
21662306a36Sopenharmony_ci			PANELCTL_CLK2_CON_MASK);
21762306a36Sopenharmony_ci		clk_con |= (PANELCTL_CLK1_000 | PANELCTL_CLK2_001);
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci		/* INT1,2_CON */
22062306a36Sopenharmony_ci		int_con &= ~(PANELCTL_INT1_CON_MASK |
22162306a36Sopenharmony_ci			PANELCTL_INT2_CON_MASK);
22262306a36Sopenharmony_ci		int_con |= (PANELCTL_INT1_000 | PANELCTL_INT2_001);
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci		/* BICTL,B_CON */
22562306a36Sopenharmony_ci		bictl_con &= ~(PANELCTL_BICTL_CON_MASK |
22662306a36Sopenharmony_ci			PANELCTL_BICTLB_CON_MASK);
22762306a36Sopenharmony_ci		bictl_con |= (PANELCTL_BICTL_000 |
22862306a36Sopenharmony_ci			PANELCTL_BICTLB_001);
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci		/* EM_CLK1,1B_CON */
23162306a36Sopenharmony_ci		em_clk1_con &= ~(PANELCTL_EM_CLK1_CON_MASK |
23262306a36Sopenharmony_ci			PANELCTL_EM_CLK1B_CON_MASK);
23362306a36Sopenharmony_ci		em_clk1_con |= (PANELCTL_EM_CLK1_110 |
23462306a36Sopenharmony_ci			PANELCTL_EM_CLK1B_110);
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci		/* EM_CLK2,2B_CON */
23762306a36Sopenharmony_ci		em_clk2_con &= ~(PANELCTL_EM_CLK2_CON_MASK |
23862306a36Sopenharmony_ci			PANELCTL_EM_CLK2B_CON_MASK);
23962306a36Sopenharmony_ci		em_clk2_con |= (PANELCTL_EM_CLK2_110 |
24062306a36Sopenharmony_ci			PANELCTL_EM_CLK2B_110);
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci		/* EM_INT1,2_CON */
24362306a36Sopenharmony_ci		em_int_con &= ~(PANELCTL_EM_INT1_CON_MASK |
24462306a36Sopenharmony_ci			PANELCTL_EM_INT2_CON_MASK);
24562306a36Sopenharmony_ci		em_int_con |= (PANELCTL_EM_INT1_000 |
24662306a36Sopenharmony_ci			PANELCTL_EM_INT2_001);
24762306a36Sopenharmony_ci	}
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq(ctx,
25062306a36Sopenharmony_ci		0xf8, cfg, 0x35, 0x00, 0x00, 0x00, 0x93, 0x00,
25162306a36Sopenharmony_ci		0x3c, 0x78, 0x08, 0x27, 0x7d, 0x3f, 0x00, 0x00,
25262306a36Sopenharmony_ci		0x00, 0x20, aid, 0x08, 0x6e, 0x00, 0x00, 0x00,
25362306a36Sopenharmony_ci		0x02, 0x07, 0x07, 0x23, 0x23, 0xc0, clk_con, int_con,
25462306a36Sopenharmony_ci		bictl_con, 0xc1, 0x00, 0xc1, em_clk1_con, em_clk2_con,
25562306a36Sopenharmony_ci		em_int_con);
25662306a36Sopenharmony_ci}
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_cistatic void s6e8aa0_panel_cond_set(struct s6e8aa0 *ctx)
25962306a36Sopenharmony_ci{
26062306a36Sopenharmony_ci	if (ctx->version < 142)
26162306a36Sopenharmony_ci		s6e8aa0_dcs_write_seq_static(ctx,
26262306a36Sopenharmony_ci			0xf8, 0x19, 0x35, 0x00, 0x00, 0x00, 0x94, 0x00,
26362306a36Sopenharmony_ci			0x3c, 0x78, 0x10, 0x27, 0x08, 0x6e, 0x00, 0x00,
26462306a36Sopenharmony_ci			0x00, 0x00, 0x04, 0x08, 0x6e, 0x00, 0x00, 0x00,
26562306a36Sopenharmony_ci			0x00, 0x07, 0x07, 0x23, 0x6e, 0xc0, 0xc1, 0x01,
26662306a36Sopenharmony_ci			0x81, 0xc1, 0x00, 0xc3, 0xf6, 0xf6, 0xc1
26762306a36Sopenharmony_ci		);
26862306a36Sopenharmony_ci	else
26962306a36Sopenharmony_ci		s6e8aa0_panel_cond_set_v142(ctx);
27062306a36Sopenharmony_ci}
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cistatic void s6e8aa0_display_condition_set(struct s6e8aa0 *ctx)
27362306a36Sopenharmony_ci{
27462306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq_static(ctx, 0xf2, 0x80, 0x03, 0x0d);
27562306a36Sopenharmony_ci}
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cistatic void s6e8aa0_etc_source_control(struct s6e8aa0 *ctx)
27862306a36Sopenharmony_ci{
27962306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq_static(ctx, 0xf6, 0x00, 0x02, 0x00);
28062306a36Sopenharmony_ci}
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistatic void s6e8aa0_etc_pentile_control(struct s6e8aa0 *ctx)
28362306a36Sopenharmony_ci{
28462306a36Sopenharmony_ci	static const u8 pent32[] = {
28562306a36Sopenharmony_ci		0xb6, 0x0c, 0x02, 0x03, 0x32, 0xc0, 0x44, 0x44, 0xc0, 0x00
28662306a36Sopenharmony_ci	};
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	static const u8 pent142[] = {
28962306a36Sopenharmony_ci		0xb6, 0x0c, 0x02, 0x03, 0x32, 0xff, 0x44, 0x44, 0xc0, 0x00
29062306a36Sopenharmony_ci	};
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	if (ctx->version < 142)
29362306a36Sopenharmony_ci		s6e8aa0_dcs_write(ctx, pent32, ARRAY_SIZE(pent32));
29462306a36Sopenharmony_ci	else
29562306a36Sopenharmony_ci		s6e8aa0_dcs_write(ctx, pent142, ARRAY_SIZE(pent142));
29662306a36Sopenharmony_ci}
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cistatic void s6e8aa0_etc_power_control(struct s6e8aa0 *ctx)
29962306a36Sopenharmony_ci{
30062306a36Sopenharmony_ci	static const u8 pwr142[] = {
30162306a36Sopenharmony_ci		0xf4, 0xcf, 0x0a, 0x12, 0x10, 0x1e, 0x33, 0x02
30262306a36Sopenharmony_ci	};
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	static const u8 pwr32[] = {
30562306a36Sopenharmony_ci		0xf4, 0xcf, 0x0a, 0x15, 0x10, 0x19, 0x33, 0x02
30662306a36Sopenharmony_ci	};
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	if (ctx->version < 142)
30962306a36Sopenharmony_ci		s6e8aa0_dcs_write(ctx, pwr32, ARRAY_SIZE(pwr32));
31062306a36Sopenharmony_ci	else
31162306a36Sopenharmony_ci		s6e8aa0_dcs_write(ctx, pwr142, ARRAY_SIZE(pwr142));
31262306a36Sopenharmony_ci}
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_cistatic void s6e8aa0_etc_elvss_control(struct s6e8aa0 *ctx)
31562306a36Sopenharmony_ci{
31662306a36Sopenharmony_ci	u8 id = ctx->id ? 0 : 0x95;
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq(ctx, 0xb1, 0x04, id);
31962306a36Sopenharmony_ci}
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_cistatic void s6e8aa0_elvss_nvm_set_v142(struct s6e8aa0 *ctx)
32262306a36Sopenharmony_ci{
32362306a36Sopenharmony_ci	u8 br;
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	switch (ctx->brightness) {
32662306a36Sopenharmony_ci	case 0 ... 6: /* 30cd ~ 100cd */
32762306a36Sopenharmony_ci		br = 0xdf;
32862306a36Sopenharmony_ci		break;
32962306a36Sopenharmony_ci	case 7 ... 11: /* 120cd ~ 150cd */
33062306a36Sopenharmony_ci		br = 0xdd;
33162306a36Sopenharmony_ci		break;
33262306a36Sopenharmony_ci	case 12 ... 15: /* 180cd ~ 210cd */
33362306a36Sopenharmony_ci	default:
33462306a36Sopenharmony_ci		br = 0xd9;
33562306a36Sopenharmony_ci		break;
33662306a36Sopenharmony_ci	case 16 ... 24: /* 240cd ~ 300cd */
33762306a36Sopenharmony_ci		br = 0xd0;
33862306a36Sopenharmony_ci		break;
33962306a36Sopenharmony_ci	}
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq(ctx, 0xd9, 0x14, 0x40, 0x0c, 0xcb, 0xce, 0x6e,
34262306a36Sopenharmony_ci		0xc4, 0x0f, 0x40, 0x41, br, 0x00, 0x60, 0x19);
34362306a36Sopenharmony_ci}
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_cistatic void s6e8aa0_elvss_nvm_set(struct s6e8aa0 *ctx)
34662306a36Sopenharmony_ci{
34762306a36Sopenharmony_ci	if (ctx->version < 142)
34862306a36Sopenharmony_ci		s6e8aa0_dcs_write_seq_static(ctx,
34962306a36Sopenharmony_ci			0xd9, 0x14, 0x40, 0x0c, 0xcb, 0xce, 0x6e, 0xc4, 0x07,
35062306a36Sopenharmony_ci			0x40, 0x41, 0xc1, 0x00, 0x60, 0x19);
35162306a36Sopenharmony_ci	else
35262306a36Sopenharmony_ci		s6e8aa0_elvss_nvm_set_v142(ctx);
35362306a36Sopenharmony_ci};
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_cistatic void s6e8aa0_apply_level_2_key(struct s6e8aa0 *ctx)
35662306a36Sopenharmony_ci{
35762306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq_static(ctx, 0xfc, 0x5a, 0x5a);
35862306a36Sopenharmony_ci}
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_cistatic const s6e8aa0_gamma_table s6e8aa0_gamma_tables_v142[GAMMA_LEVEL_NUM] = {
36162306a36Sopenharmony_ci	{
36262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0x62, 0x55, 0x55,
36362306a36Sopenharmony_ci		0xaf, 0xb1, 0xb1, 0xbd, 0xce, 0xb7, 0x9a, 0xb1,
36462306a36Sopenharmony_ci		0x90, 0xb2, 0xc4, 0xae, 0x00, 0x60, 0x00, 0x40,
36562306a36Sopenharmony_ci		0x00, 0x70,
36662306a36Sopenharmony_ci	}, {
36762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0x74, 0x68, 0x69,
36862306a36Sopenharmony_ci		0xb8, 0xc1, 0xb7, 0xbd, 0xcd, 0xb8, 0x93, 0xab,
36962306a36Sopenharmony_ci		0x88, 0xb4, 0xc4, 0xb1, 0x00, 0x6b, 0x00, 0x4d,
37062306a36Sopenharmony_ci		0x00, 0x7d,
37162306a36Sopenharmony_ci	}, {
37262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0x95, 0x8a, 0x89,
37362306a36Sopenharmony_ci		0xb4, 0xc6, 0xb2, 0xc5, 0xd2, 0xbf, 0x90, 0xa8,
37462306a36Sopenharmony_ci		0x85, 0xb5, 0xc4, 0xb3, 0x00, 0x7b, 0x00, 0x5d,
37562306a36Sopenharmony_ci		0x00, 0x8f,
37662306a36Sopenharmony_ci	}, {
37762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0x9f, 0x98, 0x92,
37862306a36Sopenharmony_ci		0xb3, 0xc4, 0xb0, 0xbc, 0xcc, 0xb4, 0x91, 0xa6,
37962306a36Sopenharmony_ci		0x87, 0xb5, 0xc5, 0xb4, 0x00, 0x87, 0x00, 0x6a,
38062306a36Sopenharmony_ci		0x00, 0x9e,
38162306a36Sopenharmony_ci	}, {
38262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0x99, 0x93, 0x8b,
38362306a36Sopenharmony_ci		0xb2, 0xc2, 0xb0, 0xbd, 0xce, 0xb4, 0x90, 0xa6,
38462306a36Sopenharmony_ci		0x87, 0xb3, 0xc3, 0xb2, 0x00, 0x8d, 0x00, 0x70,
38562306a36Sopenharmony_ci		0x00, 0xa4,
38662306a36Sopenharmony_ci	}, {
38762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa7, 0xa5, 0x99,
38862306a36Sopenharmony_ci		0xb2, 0xc2, 0xb0, 0xbb, 0xcd, 0xb1, 0x93, 0xa7,
38962306a36Sopenharmony_ci		0x8a, 0xb2, 0xc1, 0xb0, 0x00, 0x92, 0x00, 0x75,
39062306a36Sopenharmony_ci		0x00, 0xaa,
39162306a36Sopenharmony_ci	}, {
39262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa0, 0xa0, 0x93,
39362306a36Sopenharmony_ci		0xb6, 0xc4, 0xb4, 0xb5, 0xc8, 0xaa, 0x94, 0xa9,
39462306a36Sopenharmony_ci		0x8c, 0xb2, 0xc0, 0xb0, 0x00, 0x97, 0x00, 0x7a,
39562306a36Sopenharmony_ci		0x00, 0xaf,
39662306a36Sopenharmony_ci	}, {
39762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa3, 0xa7, 0x96,
39862306a36Sopenharmony_ci		0xb3, 0xc2, 0xb0, 0xba, 0xcb, 0xb0, 0x94, 0xa8,
39962306a36Sopenharmony_ci		0x8c, 0xb0, 0xbf, 0xaf, 0x00, 0x9f, 0x00, 0x83,
40062306a36Sopenharmony_ci		0x00, 0xb9,
40162306a36Sopenharmony_ci	}, {
40262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0x9d, 0xa2, 0x90,
40362306a36Sopenharmony_ci		0xb6, 0xc5, 0xb3, 0xb8, 0xc9, 0xae, 0x94, 0xa8,
40462306a36Sopenharmony_ci		0x8d, 0xaf, 0xbd, 0xad, 0x00, 0xa4, 0x00, 0x88,
40562306a36Sopenharmony_ci		0x00, 0xbf,
40662306a36Sopenharmony_ci	}, {
40762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa6, 0xac, 0x97,
40862306a36Sopenharmony_ci		0xb4, 0xc4, 0xb1, 0xbb, 0xcb, 0xb2, 0x93, 0xa7,
40962306a36Sopenharmony_ci		0x8d, 0xae, 0xbc, 0xad, 0x00, 0xa7, 0x00, 0x8c,
41062306a36Sopenharmony_ci		0x00, 0xc3,
41162306a36Sopenharmony_ci	}, {
41262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa2, 0xa9, 0x93,
41362306a36Sopenharmony_ci		0xb6, 0xc5, 0xb2, 0xba, 0xc9, 0xb0, 0x93, 0xa7,
41462306a36Sopenharmony_ci		0x8d, 0xae, 0xbb, 0xac, 0x00, 0xab, 0x00, 0x90,
41562306a36Sopenharmony_ci		0x00, 0xc8,
41662306a36Sopenharmony_ci	}, {
41762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0x9e, 0xa6, 0x8f,
41862306a36Sopenharmony_ci		0xb7, 0xc6, 0xb3, 0xb8, 0xc8, 0xb0, 0x93, 0xa6,
41962306a36Sopenharmony_ci		0x8c, 0xae, 0xbb, 0xad, 0x00, 0xae, 0x00, 0x93,
42062306a36Sopenharmony_ci		0x00, 0xcc,
42162306a36Sopenharmony_ci	}, {
42262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xab, 0xb4, 0x9c,
42362306a36Sopenharmony_ci		0xb3, 0xc3, 0xaf, 0xb7, 0xc7, 0xaf, 0x93, 0xa6,
42462306a36Sopenharmony_ci		0x8c, 0xaf, 0xbc, 0xad, 0x00, 0xb1, 0x00, 0x97,
42562306a36Sopenharmony_ci		0x00, 0xcf,
42662306a36Sopenharmony_ci	}, {
42762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa6, 0xb1, 0x98,
42862306a36Sopenharmony_ci		0xb1, 0xc2, 0xab, 0xba, 0xc9, 0xb2, 0x93, 0xa6,
42962306a36Sopenharmony_ci		0x8d, 0xae, 0xba, 0xab, 0x00, 0xb5, 0x00, 0x9b,
43062306a36Sopenharmony_ci		0x00, 0xd4,
43162306a36Sopenharmony_ci	}, {
43262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa3, 0xae, 0x94,
43362306a36Sopenharmony_ci		0xb2, 0xc3, 0xac, 0xbb, 0xca, 0xb4, 0x91, 0xa4,
43462306a36Sopenharmony_ci		0x8a, 0xae, 0xba, 0xac, 0x00, 0xb8, 0x00, 0x9e,
43562306a36Sopenharmony_ci		0x00, 0xd8,
43662306a36Sopenharmony_ci	}, {
43762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xab, 0xb7, 0x9c,
43862306a36Sopenharmony_ci		0xae, 0xc0, 0xa9, 0xba, 0xc9, 0xb3, 0x92, 0xa5,
43962306a36Sopenharmony_ci		0x8b, 0xad, 0xb9, 0xab, 0x00, 0xbb, 0x00, 0xa1,
44062306a36Sopenharmony_ci		0x00, 0xdc,
44162306a36Sopenharmony_ci	}, {
44262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa7, 0xb4, 0x97,
44362306a36Sopenharmony_ci		0xb0, 0xc1, 0xaa, 0xb9, 0xc8, 0xb2, 0x92, 0xa5,
44462306a36Sopenharmony_ci		0x8c, 0xae, 0xb9, 0xab, 0x00, 0xbe, 0x00, 0xa4,
44562306a36Sopenharmony_ci		0x00, 0xdf,
44662306a36Sopenharmony_ci	}, {
44762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa3, 0xb0, 0x94,
44862306a36Sopenharmony_ci		0xb0, 0xc2, 0xab, 0xbb, 0xc9, 0xb3, 0x91, 0xa4,
44962306a36Sopenharmony_ci		0x8b, 0xad, 0xb8, 0xaa, 0x00, 0xc1, 0x00, 0xa8,
45062306a36Sopenharmony_ci		0x00, 0xe2,
45162306a36Sopenharmony_ci	}, {
45262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa3, 0xb0, 0x94,
45362306a36Sopenharmony_ci		0xae, 0xbf, 0xa8, 0xb9, 0xc8, 0xb3, 0x92, 0xa4,
45462306a36Sopenharmony_ci		0x8b, 0xad, 0xb7, 0xa9, 0x00, 0xc4, 0x00, 0xab,
45562306a36Sopenharmony_ci		0x00, 0xe6,
45662306a36Sopenharmony_ci	}, {
45762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa7, 0xb6, 0x98,
45862306a36Sopenharmony_ci		0xaf, 0xc0, 0xa8, 0xb8, 0xc7, 0xb2, 0x93, 0xa5,
45962306a36Sopenharmony_ci		0x8d, 0xad, 0xb7, 0xa9, 0x00, 0xc7, 0x00, 0xae,
46062306a36Sopenharmony_ci		0x00, 0xe9,
46162306a36Sopenharmony_ci	}, {
46262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa4, 0xb3, 0x95,
46362306a36Sopenharmony_ci		0xaf, 0xc1, 0xa9, 0xb9, 0xc8, 0xb3, 0x92, 0xa4,
46462306a36Sopenharmony_ci		0x8b, 0xad, 0xb7, 0xaa, 0x00, 0xc9, 0x00, 0xb0,
46562306a36Sopenharmony_ci		0x00, 0xec,
46662306a36Sopenharmony_ci	}, {
46762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa4, 0xb3, 0x95,
46862306a36Sopenharmony_ci		0xac, 0xbe, 0xa6, 0xbb, 0xc9, 0xb4, 0x90, 0xa3,
46962306a36Sopenharmony_ci		0x8a, 0xad, 0xb7, 0xa9, 0x00, 0xcc, 0x00, 0xb4,
47062306a36Sopenharmony_ci		0x00, 0xf0,
47162306a36Sopenharmony_ci	}, {
47262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa0, 0xb0, 0x91,
47362306a36Sopenharmony_ci		0xae, 0xc0, 0xa6, 0xba, 0xc8, 0xb4, 0x91, 0xa4,
47462306a36Sopenharmony_ci		0x8b, 0xad, 0xb7, 0xa9, 0x00, 0xcf, 0x00, 0xb7,
47562306a36Sopenharmony_ci		0x00, 0xf3,
47662306a36Sopenharmony_ci	}, {
47762306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa7, 0xb8, 0x98,
47862306a36Sopenharmony_ci		0xab, 0xbd, 0xa4, 0xbb, 0xc9, 0xb5, 0x91, 0xa3,
47962306a36Sopenharmony_ci		0x8b, 0xac, 0xb6, 0xa8, 0x00, 0xd1, 0x00, 0xb9,
48062306a36Sopenharmony_ci		0x00, 0xf6,
48162306a36Sopenharmony_ci	}, {
48262306a36Sopenharmony_ci		0xfa, 0x01, 0x71, 0x31, 0x7b, 0xa4, 0xb5, 0x95,
48362306a36Sopenharmony_ci		0xa9, 0xbc, 0xa1, 0xbb, 0xc9, 0xb5, 0x91, 0xa3,
48462306a36Sopenharmony_ci		0x8a, 0xad, 0xb6, 0xa8, 0x00, 0xd6, 0x00, 0xbf,
48562306a36Sopenharmony_ci		0x00, 0xfc,
48662306a36Sopenharmony_ci	},
48762306a36Sopenharmony_ci};
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_cistatic const s6e8aa0_gamma_table s6e8aa0_gamma_tables_v96[GAMMA_LEVEL_NUM] = {
49062306a36Sopenharmony_ci	{
49162306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0xff,
49262306a36Sopenharmony_ci		0xdf, 0x1f, 0xd7, 0xdc, 0xb7, 0xe1, 0xc0, 0xaf,
49362306a36Sopenharmony_ci		0xc4, 0xd2, 0xd0, 0xcf, 0x00, 0x4d, 0x00, 0x40,
49462306a36Sopenharmony_ci		0x00, 0x5f,
49562306a36Sopenharmony_ci	}, {
49662306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0xff,
49762306a36Sopenharmony_ci		0xd5, 0x35, 0xcf, 0xdc, 0xc1, 0xe1, 0xbf, 0xb3,
49862306a36Sopenharmony_ci		0xc1, 0xd2, 0xd1, 0xce,	0x00, 0x53, 0x00, 0x46,
49962306a36Sopenharmony_ci		0x00, 0x67,
50062306a36Sopenharmony_ci	}, {
50162306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0xff,
50262306a36Sopenharmony_ci		0xd2, 0x64, 0xcf, 0xdb, 0xc6, 0xe1, 0xbd, 0xb3,
50362306a36Sopenharmony_ci		0xbd, 0xd2, 0xd2, 0xce,	0x00, 0x59, 0x00, 0x4b,
50462306a36Sopenharmony_ci		0x00, 0x6e,
50562306a36Sopenharmony_ci	}, {
50662306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0xff,
50762306a36Sopenharmony_ci		0xd0, 0x7c, 0xcf, 0xdb, 0xc9, 0xe0, 0xbc, 0xb4,
50862306a36Sopenharmony_ci		0xbb, 0xcf, 0xd1, 0xcc, 0x00, 0x5f, 0x00, 0x50,
50962306a36Sopenharmony_ci		0x00, 0x75,
51062306a36Sopenharmony_ci	}, {
51162306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0xff,
51262306a36Sopenharmony_ci		0xd0, 0x8e, 0xd1, 0xdb, 0xcc, 0xdf, 0xbb, 0xb6,
51362306a36Sopenharmony_ci		0xb9, 0xd0, 0xd1, 0xcd,	0x00, 0x63, 0x00, 0x54,
51462306a36Sopenharmony_ci		0x00, 0x7a,
51562306a36Sopenharmony_ci	}, {
51662306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0xff,
51762306a36Sopenharmony_ci		0xd1, 0x9e, 0xd5, 0xda, 0xcd, 0xdd, 0xbb, 0xb7,
51862306a36Sopenharmony_ci		0xb9, 0xce, 0xce, 0xc9,	0x00, 0x68, 0x00, 0x59,
51962306a36Sopenharmony_ci		0x00, 0x81,
52062306a36Sopenharmony_ci	}, {
52162306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0xff,
52262306a36Sopenharmony_ci		0xd0, 0xa5, 0xd6, 0xda, 0xcf, 0xdd, 0xbb, 0xb7,
52362306a36Sopenharmony_ci		0xb8, 0xcc, 0xcd, 0xc7,	0x00, 0x6c, 0x00, 0x5c,
52462306a36Sopenharmony_ci		0x00, 0x86,
52562306a36Sopenharmony_ci	}, {
52662306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x1f, 0xfe,
52762306a36Sopenharmony_ci		0xd0, 0xae, 0xd7, 0xd9, 0xd0, 0xdb, 0xb9, 0xb6,
52862306a36Sopenharmony_ci		0xb5, 0xca, 0xcc, 0xc5,	0x00, 0x74, 0x00, 0x63,
52962306a36Sopenharmony_ci		0x00, 0x90,
53062306a36Sopenharmony_ci	}, {
53162306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x1f, 0xf9,
53262306a36Sopenharmony_ci		0xcf, 0xb0, 0xd6, 0xd9, 0xd1, 0xdb, 0xb9, 0xb6,
53362306a36Sopenharmony_ci		0xb4, 0xca, 0xcb, 0xc5,	0x00, 0x77, 0x00, 0x66,
53462306a36Sopenharmony_ci		0x00, 0x94,
53562306a36Sopenharmony_ci	}, {
53662306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xff, 0x1f, 0xf7,
53762306a36Sopenharmony_ci		0xcf, 0xb3, 0xd7, 0xd8, 0xd1, 0xd9, 0xb7, 0xb6,
53862306a36Sopenharmony_ci		0xb3, 0xc9, 0xca, 0xc3,	0x00, 0x7b, 0x00, 0x69,
53962306a36Sopenharmony_ci		0x00, 0x99,
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci	}, {
54262306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xfd, 0x2f, 0xf7,
54362306a36Sopenharmony_ci		0xdf, 0xb5, 0xd6, 0xd8, 0xd1, 0xd8, 0xb6, 0xb5,
54462306a36Sopenharmony_ci		0xb2, 0xca, 0xcb, 0xc4,	0x00, 0x7e, 0x00, 0x6c,
54562306a36Sopenharmony_ci		0x00, 0x9d,
54662306a36Sopenharmony_ci	}, {
54762306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xfa, 0x2f, 0xf5,
54862306a36Sopenharmony_ci		0xce, 0xb6, 0xd5, 0xd7, 0xd2, 0xd8, 0xb6, 0xb4,
54962306a36Sopenharmony_ci		0xb0, 0xc7, 0xc9, 0xc1,	0x00, 0x84, 0x00, 0x71,
55062306a36Sopenharmony_ci		0x00, 0xa5,
55162306a36Sopenharmony_ci	}, {
55262306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xf7, 0x2f, 0xf2,
55362306a36Sopenharmony_ci		0xce, 0xb9, 0xd5, 0xd8, 0xd2, 0xd8, 0xb4, 0xb4,
55462306a36Sopenharmony_ci		0xaf, 0xc7, 0xc9, 0xc1,	0x00, 0x87, 0x00, 0x73,
55562306a36Sopenharmony_ci		0x00, 0xa8,
55662306a36Sopenharmony_ci	}, {
55762306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xf5, 0x2f, 0xf0,
55862306a36Sopenharmony_ci		0xdf, 0xba, 0xd5, 0xd7, 0xd2, 0xd7, 0xb4, 0xb4,
55962306a36Sopenharmony_ci		0xaf, 0xc5, 0xc7, 0xbf,	0x00, 0x8a, 0x00, 0x76,
56062306a36Sopenharmony_ci		0x00, 0xac,
56162306a36Sopenharmony_ci	}, {
56262306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xf2, 0x2f, 0xed,
56362306a36Sopenharmony_ci		0xcE, 0xbb, 0xd4, 0xd6, 0xd2, 0xd6, 0xb5, 0xb4,
56462306a36Sopenharmony_ci		0xaF, 0xc5, 0xc7, 0xbf,	0x00, 0x8c, 0x00, 0x78,
56562306a36Sopenharmony_ci		0x00, 0xaf,
56662306a36Sopenharmony_ci	}, {
56762306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xef, 0x2f, 0xeb,
56862306a36Sopenharmony_ci		0xcd, 0xbb, 0xd2, 0xd7, 0xd3, 0xd6, 0xb3, 0xb4,
56962306a36Sopenharmony_ci		0xae, 0xc5, 0xc6, 0xbe,	0x00, 0x91, 0x00, 0x7d,
57062306a36Sopenharmony_ci		0x00, 0xb6,
57162306a36Sopenharmony_ci	}, {
57262306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xee, 0x2f, 0xea,
57362306a36Sopenharmony_ci		0xce, 0xbd, 0xd4, 0xd6, 0xd2, 0xd5, 0xb2, 0xb3,
57462306a36Sopenharmony_ci		0xad, 0xc3, 0xc4, 0xbb,	0x00, 0x94, 0x00, 0x7f,
57562306a36Sopenharmony_ci		0x00, 0xba,
57662306a36Sopenharmony_ci	}, {
57762306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xec, 0x2f, 0xe8,
57862306a36Sopenharmony_ci		0xce, 0xbe, 0xd3, 0xd6, 0xd3, 0xd5, 0xb2, 0xb2,
57962306a36Sopenharmony_ci		0xac, 0xc3, 0xc5, 0xbc,	0x00, 0x96, 0x00, 0x81,
58062306a36Sopenharmony_ci		0x00, 0xbd,
58162306a36Sopenharmony_ci	}, {
58262306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xeb, 0x2f, 0xe7,
58362306a36Sopenharmony_ci		0xce, 0xbf, 0xd3, 0xd6, 0xd2, 0xd5, 0xb1, 0xb2,
58462306a36Sopenharmony_ci		0xab, 0xc2, 0xc4, 0xbb,	0x00, 0x99, 0x00, 0x83,
58562306a36Sopenharmony_ci		0x00, 0xc0,
58662306a36Sopenharmony_ci	}, {
58762306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xef, 0x5f, 0xe9,
58862306a36Sopenharmony_ci		0xca, 0xbf, 0xd3, 0xd5, 0xd2, 0xd4, 0xb2, 0xb2,
58962306a36Sopenharmony_ci		0xab, 0xc1, 0xc4, 0xba,	0x00, 0x9b, 0x00, 0x85,
59062306a36Sopenharmony_ci		0x00, 0xc3,
59162306a36Sopenharmony_ci	}, {
59262306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xea, 0x5f, 0xe8,
59362306a36Sopenharmony_ci		0xee, 0xbf, 0xd2, 0xd5, 0xd2, 0xd4, 0xb1, 0xb2,
59462306a36Sopenharmony_ci		0xab, 0xc1, 0xc2, 0xb9,	0x00, 0x9D, 0x00, 0x87,
59562306a36Sopenharmony_ci		0x00, 0xc6,
59662306a36Sopenharmony_ci	}, {
59762306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xe9, 0x5f, 0xe7,
59862306a36Sopenharmony_ci		0xcd, 0xbf, 0xd2, 0xd6, 0xd2, 0xd4, 0xb1, 0xb2,
59962306a36Sopenharmony_ci		0xab, 0xbe, 0xc0, 0xb7,	0x00, 0xa1, 0x00, 0x8a,
60062306a36Sopenharmony_ci		0x00, 0xca,
60162306a36Sopenharmony_ci	}, {
60262306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xe8, 0x61, 0xe6,
60362306a36Sopenharmony_ci		0xcd, 0xbf, 0xd1, 0xd6, 0xd3, 0xd4, 0xaf, 0xb0,
60462306a36Sopenharmony_ci		0xa9, 0xbe, 0xc1, 0xb7,	0x00, 0xa3, 0x00, 0x8b,
60562306a36Sopenharmony_ci		0x00, 0xce,
60662306a36Sopenharmony_ci	}, {
60762306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xe8, 0x62, 0xe5,
60862306a36Sopenharmony_ci		0xcc, 0xc0, 0xd0, 0xd6, 0xd2, 0xd4, 0xaf, 0xb1,
60962306a36Sopenharmony_ci		0xa9, 0xbd, 0xc0, 0xb6,	0x00, 0xa5, 0x00, 0x8d,
61062306a36Sopenharmony_ci		0x00, 0xd0,
61162306a36Sopenharmony_ci	}, {
61262306a36Sopenharmony_ci		0xfa, 0x01, 0x1f, 0x1f, 0x1f, 0xe7, 0x7f, 0xe3,
61362306a36Sopenharmony_ci		0xcc, 0xc1, 0xd0, 0xd5, 0xd3, 0xd3, 0xae, 0xaf,
61462306a36Sopenharmony_ci		0xa8, 0xbe, 0xc0, 0xb7,	0x00, 0xa8, 0x00, 0x90,
61562306a36Sopenharmony_ci		0x00, 0xd3,
61662306a36Sopenharmony_ci	}
61762306a36Sopenharmony_ci};
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_cistatic const s6e8aa0_gamma_table s6e8aa0_gamma_tables_v32[GAMMA_LEVEL_NUM] = {
62062306a36Sopenharmony_ci	{
62162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0x72, 0x5e, 0x6b,
62262306a36Sopenharmony_ci		0xa1, 0xa7, 0x9a, 0xb4, 0xcb, 0xb8, 0x92, 0xac,
62362306a36Sopenharmony_ci		0x97, 0xb4, 0xc3, 0xb5, 0x00, 0x4e, 0x00, 0x37,
62462306a36Sopenharmony_ci		0x00, 0x58,
62562306a36Sopenharmony_ci	}, {
62662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0x85, 0x71, 0x7d,
62762306a36Sopenharmony_ci		0xa6, 0xb6, 0xa1, 0xb5, 0xca, 0xba, 0x93, 0xac,
62862306a36Sopenharmony_ci		0x98, 0xb2, 0xc0, 0xaf, 0x00, 0x59, 0x00, 0x43,
62962306a36Sopenharmony_ci		0x00, 0x64,
63062306a36Sopenharmony_ci	}, {
63162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xa4, 0x94, 0x9e,
63262306a36Sopenharmony_ci		0xa0, 0xbb, 0x9c, 0xc3, 0xd2, 0xc6, 0x93, 0xaa,
63362306a36Sopenharmony_ci		0x95, 0xb7, 0xc2, 0xb4, 0x00, 0x65, 0x00, 0x50,
63462306a36Sopenharmony_ci		0x00, 0x74,
63562306a36Sopenharmony_ci	}, {
63662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xad, 0xa1, 0xa6,
63762306a36Sopenharmony_ci		0xa0, 0xb9, 0x9b, 0xc3, 0xd1, 0xc8, 0x90, 0xa6,
63862306a36Sopenharmony_ci		0x90, 0xbb, 0xc3, 0xb7, 0x00, 0x6f, 0x00, 0x5b,
63962306a36Sopenharmony_ci		0x00, 0x80,
64062306a36Sopenharmony_ci	}, {
64162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xa6, 0x9d, 0x9f,
64262306a36Sopenharmony_ci		0x9f, 0xb8, 0x9a, 0xc7, 0xd5, 0xcc, 0x90, 0xa5,
64362306a36Sopenharmony_ci		0x8f, 0xb8, 0xc1, 0xb6, 0x00, 0x74, 0x00, 0x60,
64462306a36Sopenharmony_ci		0x00, 0x85,
64562306a36Sopenharmony_ci	}, {
64662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xb3, 0xae, 0xae,
64762306a36Sopenharmony_ci		0x9e, 0xb7, 0x9a, 0xc8, 0xd6, 0xce, 0x91, 0xa6,
64862306a36Sopenharmony_ci		0x90, 0xb6, 0xc0, 0xb3, 0x00, 0x78, 0x00, 0x65,
64962306a36Sopenharmony_ci		0x00, 0x8a,
65062306a36Sopenharmony_ci	}, {
65162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xad, 0xa9, 0xa8,
65262306a36Sopenharmony_ci		0xa3, 0xb9, 0x9e, 0xc4, 0xd3, 0xcb, 0x94, 0xa6,
65362306a36Sopenharmony_ci		0x90, 0xb6, 0xbf, 0xb3, 0x00, 0x7c, 0x00, 0x69,
65462306a36Sopenharmony_ci		0x00, 0x8e,
65562306a36Sopenharmony_ci	}, {
65662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xaf, 0xaf, 0xa9,
65762306a36Sopenharmony_ci		0xa5, 0xbc, 0xa2, 0xc7, 0xd5, 0xcd, 0x93, 0xa5,
65862306a36Sopenharmony_ci		0x8f, 0xb4, 0xbd, 0xb1, 0x00, 0x83, 0x00, 0x70,
65962306a36Sopenharmony_ci		0x00, 0x96,
66062306a36Sopenharmony_ci	}, {
66162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xa9, 0xab, 0xa3,
66262306a36Sopenharmony_ci		0xaa, 0xbf, 0xa7, 0xc5, 0xd3, 0xcb, 0x93, 0xa5,
66362306a36Sopenharmony_ci		0x8f, 0xb2, 0xbb, 0xb0, 0x00, 0x86, 0x00, 0x74,
66462306a36Sopenharmony_ci		0x00, 0x9b,
66562306a36Sopenharmony_ci	}, {
66662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xb1, 0xb5, 0xab,
66762306a36Sopenharmony_ci		0xab, 0xc0, 0xa9, 0xc7, 0xd4, 0xcc, 0x94, 0xa4,
66862306a36Sopenharmony_ci		0x8f, 0xb1, 0xbb, 0xaf, 0x00, 0x8a, 0x00, 0x77,
66962306a36Sopenharmony_ci		0x00, 0x9e,
67062306a36Sopenharmony_ci	}, {
67162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xad, 0xb2, 0xa7,
67262306a36Sopenharmony_ci		0xae, 0xc2, 0xab, 0xc5, 0xd3, 0xca, 0x93, 0xa4,
67362306a36Sopenharmony_ci		0x8f, 0xb1, 0xba, 0xae, 0x00, 0x8d, 0x00, 0x7b,
67462306a36Sopenharmony_ci		0x00, 0xa2,
67562306a36Sopenharmony_ci	}, {
67662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xa9, 0xaf, 0xa3,
67762306a36Sopenharmony_ci		0xb0, 0xc3, 0xae, 0xc4, 0xd1, 0xc8, 0x93, 0xa4,
67862306a36Sopenharmony_ci		0x8f, 0xb1, 0xba, 0xaf, 0x00, 0x8f, 0x00, 0x7d,
67962306a36Sopenharmony_ci		0x00, 0xa5,
68062306a36Sopenharmony_ci	}, {
68162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xb4, 0xbd, 0xaf,
68262306a36Sopenharmony_ci		0xae, 0xc1, 0xab, 0xc2, 0xd0, 0xc6, 0x94, 0xa4,
68362306a36Sopenharmony_ci		0x8f, 0xb1, 0xba, 0xaf, 0x00, 0x92, 0x00, 0x80,
68462306a36Sopenharmony_ci		0x00, 0xa8,
68562306a36Sopenharmony_ci	}, {
68662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xb0, 0xb9, 0xac,
68762306a36Sopenharmony_ci		0xad, 0xc1, 0xab, 0xc4, 0xd1, 0xc7, 0x95, 0xa4,
68862306a36Sopenharmony_ci		0x90, 0xb0, 0xb9, 0xad, 0x00, 0x95, 0x00, 0x84,
68962306a36Sopenharmony_ci		0x00, 0xac,
69062306a36Sopenharmony_ci	}, {
69162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xad, 0xb6, 0xa7,
69262306a36Sopenharmony_ci		0xaf, 0xc2, 0xae, 0xc5, 0xd1, 0xc7, 0x93, 0xa3,
69362306a36Sopenharmony_ci		0x8e, 0xb0, 0xb9, 0xad, 0x00, 0x98, 0x00, 0x86,
69462306a36Sopenharmony_ci		0x00, 0xaf,
69562306a36Sopenharmony_ci	}, {
69662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xb4, 0xbf, 0xaf,
69762306a36Sopenharmony_ci		0xad, 0xc1, 0xab, 0xc3, 0xd0, 0xc6, 0x94, 0xa3,
69862306a36Sopenharmony_ci		0x8f, 0xaf, 0xb8, 0xac, 0x00, 0x9a, 0x00, 0x89,
69962306a36Sopenharmony_ci		0x00, 0xb2,
70062306a36Sopenharmony_ci	}, {
70162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xb0, 0xbc, 0xac,
70262306a36Sopenharmony_ci		0xaf, 0xc2, 0xad, 0xc2, 0xcf, 0xc4, 0x94, 0xa3,
70362306a36Sopenharmony_ci		0x90, 0xaf, 0xb8, 0xad, 0x00, 0x9c, 0x00, 0x8b,
70462306a36Sopenharmony_ci		0x00, 0xb5,
70562306a36Sopenharmony_ci	}, {
70662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xad, 0xb9, 0xa7,
70762306a36Sopenharmony_ci		0xb1, 0xc4, 0xaf, 0xc3, 0xcf, 0xc5, 0x94, 0xa3,
70862306a36Sopenharmony_ci		0x8f, 0xae, 0xb7, 0xac, 0x00, 0x9f, 0x00, 0x8e,
70962306a36Sopenharmony_ci		0x00, 0xb8,
71062306a36Sopenharmony_ci	}, {
71162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xad, 0xb9, 0xa7,
71262306a36Sopenharmony_ci		0xaf, 0xc2, 0xad, 0xc1, 0xce, 0xc3, 0x95, 0xa3,
71362306a36Sopenharmony_ci		0x90, 0xad, 0xb6, 0xab, 0x00, 0xa2, 0x00, 0x91,
71462306a36Sopenharmony_ci		0x00, 0xbb,
71562306a36Sopenharmony_ci	}, {
71662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xb1, 0xbe, 0xac,
71762306a36Sopenharmony_ci		0xb1, 0xc4, 0xaf, 0xc1, 0xcd, 0xc1, 0x95, 0xa4,
71862306a36Sopenharmony_ci		0x91, 0xad, 0xb6, 0xab, 0x00, 0xa4, 0x00, 0x93,
71962306a36Sopenharmony_ci		0x00, 0xbd,
72062306a36Sopenharmony_ci	}, {
72162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xad, 0xbb, 0xa8,
72262306a36Sopenharmony_ci		0xb3, 0xc5, 0xb2, 0xc1, 0xcd, 0xc2, 0x95, 0xa3,
72362306a36Sopenharmony_ci		0x90, 0xad, 0xb6, 0xab, 0x00, 0xa6, 0x00, 0x95,
72462306a36Sopenharmony_ci		0x00, 0xc0,
72562306a36Sopenharmony_ci	}, {
72662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xad, 0xbb, 0xa8,
72762306a36Sopenharmony_ci		0xb0, 0xc3, 0xaf, 0xc2, 0xce, 0xc2, 0x94, 0xa2,
72862306a36Sopenharmony_ci		0x90, 0xac, 0xb6, 0xab, 0x00, 0xa8, 0x00, 0x98,
72962306a36Sopenharmony_ci		0x00, 0xc3,
73062306a36Sopenharmony_ci	}, {
73162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xa9, 0xb8, 0xa5,
73262306a36Sopenharmony_ci		0xb3, 0xc5, 0xb2, 0xc1, 0xcc, 0xc0, 0x95, 0xa2,
73362306a36Sopenharmony_ci		0x90, 0xad, 0xb6, 0xab, 0x00, 0xaa, 0x00, 0x9a,
73462306a36Sopenharmony_ci		0x00, 0xc5,
73562306a36Sopenharmony_ci	}, {
73662306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xb0, 0xc0, 0xac,
73762306a36Sopenharmony_ci		0xb0, 0xc3, 0xaf, 0xc1, 0xcd, 0xc1, 0x95, 0xa2,
73862306a36Sopenharmony_ci		0x90, 0xac, 0xb5, 0xa9, 0x00, 0xac, 0x00, 0x9c,
73962306a36Sopenharmony_ci		0x00, 0xc8,
74062306a36Sopenharmony_ci	}, {
74162306a36Sopenharmony_ci		0xfa, 0x01, 0x43, 0x14, 0x45, 0xad, 0xbd, 0xa8,
74262306a36Sopenharmony_ci		0xaf, 0xc2, 0xaf, 0xc1, 0xcc, 0xc0, 0x95, 0xa2,
74362306a36Sopenharmony_ci		0x90, 0xac, 0xb5, 0xaa, 0x00, 0xb1, 0x00, 0xa1,
74462306a36Sopenharmony_ci		0x00, 0xcc,
74562306a36Sopenharmony_ci	},
74662306a36Sopenharmony_ci};
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_cistatic const struct s6e8aa0_variant s6e8aa0_variants[] = {
74962306a36Sopenharmony_ci	{
75062306a36Sopenharmony_ci		.version = 32,
75162306a36Sopenharmony_ci		.gamma_tables = s6e8aa0_gamma_tables_v32,
75262306a36Sopenharmony_ci	}, {
75362306a36Sopenharmony_ci		.version = 96,
75462306a36Sopenharmony_ci		.gamma_tables = s6e8aa0_gamma_tables_v96,
75562306a36Sopenharmony_ci	}, {
75662306a36Sopenharmony_ci		.version = 142,
75762306a36Sopenharmony_ci		.gamma_tables = s6e8aa0_gamma_tables_v142,
75862306a36Sopenharmony_ci	}, {
75962306a36Sopenharmony_ci		.version = 210,
76062306a36Sopenharmony_ci		.gamma_tables = s6e8aa0_gamma_tables_v142,
76162306a36Sopenharmony_ci	}
76262306a36Sopenharmony_ci};
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_cistatic void s6e8aa0_brightness_set(struct s6e8aa0 *ctx)
76562306a36Sopenharmony_ci{
76662306a36Sopenharmony_ci	const u8 *gamma;
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci	if (ctx->error)
76962306a36Sopenharmony_ci		return;
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci	gamma = ctx->variant->gamma_tables[ctx->brightness];
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci	if (ctx->version >= 142)
77462306a36Sopenharmony_ci		s6e8aa0_elvss_nvm_set(ctx);
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci	s6e8aa0_dcs_write(ctx, gamma, GAMMA_TABLE_LEN);
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_ci	/* update gamma table. */
77962306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq_static(ctx, 0xf7, 0x03);
78062306a36Sopenharmony_ci}
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_cistatic void s6e8aa0_panel_init(struct s6e8aa0 *ctx)
78362306a36Sopenharmony_ci{
78462306a36Sopenharmony_ci	s6e8aa0_apply_level_1_key(ctx);
78562306a36Sopenharmony_ci	s6e8aa0_apply_level_2_key(ctx);
78662306a36Sopenharmony_ci	msleep(20);
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq_static(ctx, MIPI_DCS_EXIT_SLEEP_MODE);
78962306a36Sopenharmony_ci	msleep(40);
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci	s6e8aa0_panel_cond_set(ctx);
79262306a36Sopenharmony_ci	s6e8aa0_display_condition_set(ctx);
79362306a36Sopenharmony_ci	s6e8aa0_brightness_set(ctx);
79462306a36Sopenharmony_ci	s6e8aa0_etc_source_control(ctx);
79562306a36Sopenharmony_ci	s6e8aa0_etc_pentile_control(ctx);
79662306a36Sopenharmony_ci	s6e8aa0_elvss_nvm_set(ctx);
79762306a36Sopenharmony_ci	s6e8aa0_etc_power_control(ctx);
79862306a36Sopenharmony_ci	s6e8aa0_etc_elvss_control(ctx);
79962306a36Sopenharmony_ci	msleep(ctx->init_delay);
80062306a36Sopenharmony_ci}
80162306a36Sopenharmony_ci
80262306a36Sopenharmony_cistatic void s6e8aa0_set_maximum_return_packet_size(struct s6e8aa0 *ctx,
80362306a36Sopenharmony_ci						   u16 size)
80462306a36Sopenharmony_ci{
80562306a36Sopenharmony_ci	struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
80662306a36Sopenharmony_ci	int ret;
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci	if (ctx->error < 0)
80962306a36Sopenharmony_ci		return;
81062306a36Sopenharmony_ci
81162306a36Sopenharmony_ci	ret = mipi_dsi_set_maximum_return_packet_size(dsi, size);
81262306a36Sopenharmony_ci	if (ret < 0) {
81362306a36Sopenharmony_ci		dev_err(ctx->dev,
81462306a36Sopenharmony_ci			"error %d setting maximum return packet size to %d\n",
81562306a36Sopenharmony_ci			ret, size);
81662306a36Sopenharmony_ci		ctx->error = ret;
81762306a36Sopenharmony_ci	}
81862306a36Sopenharmony_ci}
81962306a36Sopenharmony_ci
82062306a36Sopenharmony_cistatic void s6e8aa0_read_mtp_id(struct s6e8aa0 *ctx)
82162306a36Sopenharmony_ci{
82262306a36Sopenharmony_ci	u8 id[3];
82362306a36Sopenharmony_ci	int ret, i;
82462306a36Sopenharmony_ci
82562306a36Sopenharmony_ci	ret = s6e8aa0_dcs_read(ctx, 0xd1, id, ARRAY_SIZE(id));
82662306a36Sopenharmony_ci	if (ret < 0 || ret < ARRAY_SIZE(id) || id[0] == 0x00) {
82762306a36Sopenharmony_ci		dev_err(ctx->dev, "read id failed\n");
82862306a36Sopenharmony_ci		ctx->error = -EIO;
82962306a36Sopenharmony_ci		return;
83062306a36Sopenharmony_ci	}
83162306a36Sopenharmony_ci
83262306a36Sopenharmony_ci	dev_info(ctx->dev, "ID: 0x%2x, 0x%2x, 0x%2x\n", id[0], id[1], id[2]);
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(s6e8aa0_variants); ++i) {
83562306a36Sopenharmony_ci		if (id[1] == s6e8aa0_variants[i].version)
83662306a36Sopenharmony_ci			break;
83762306a36Sopenharmony_ci	}
83862306a36Sopenharmony_ci	if (i >= ARRAY_SIZE(s6e8aa0_variants)) {
83962306a36Sopenharmony_ci		dev_err(ctx->dev, "unsupported display version %d\n", id[1]);
84062306a36Sopenharmony_ci		ctx->error = -EINVAL;
84162306a36Sopenharmony_ci		return;
84262306a36Sopenharmony_ci	}
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_ci	ctx->variant = &s6e8aa0_variants[i];
84562306a36Sopenharmony_ci	ctx->version = id[1];
84662306a36Sopenharmony_ci	ctx->id = id[2];
84762306a36Sopenharmony_ci}
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_cistatic void s6e8aa0_set_sequence(struct s6e8aa0 *ctx)
85062306a36Sopenharmony_ci{
85162306a36Sopenharmony_ci	s6e8aa0_set_maximum_return_packet_size(ctx, 3);
85262306a36Sopenharmony_ci	s6e8aa0_read_mtp_id(ctx);
85362306a36Sopenharmony_ci	s6e8aa0_panel_init(ctx);
85462306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq_static(ctx, MIPI_DCS_SET_DISPLAY_ON);
85562306a36Sopenharmony_ci}
85662306a36Sopenharmony_ci
85762306a36Sopenharmony_cistatic int s6e8aa0_power_on(struct s6e8aa0 *ctx)
85862306a36Sopenharmony_ci{
85962306a36Sopenharmony_ci	int ret;
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_ci	ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), ctx->supplies);
86262306a36Sopenharmony_ci	if (ret < 0)
86362306a36Sopenharmony_ci		return ret;
86462306a36Sopenharmony_ci
86562306a36Sopenharmony_ci	msleep(ctx->power_on_delay);
86662306a36Sopenharmony_ci
86762306a36Sopenharmony_ci	gpiod_set_value(ctx->reset_gpio, 0);
86862306a36Sopenharmony_ci	usleep_range(10000, 11000);
86962306a36Sopenharmony_ci	gpiod_set_value(ctx->reset_gpio, 1);
87062306a36Sopenharmony_ci
87162306a36Sopenharmony_ci	msleep(ctx->reset_delay);
87262306a36Sopenharmony_ci
87362306a36Sopenharmony_ci	return 0;
87462306a36Sopenharmony_ci}
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_cistatic int s6e8aa0_power_off(struct s6e8aa0 *ctx)
87762306a36Sopenharmony_ci{
87862306a36Sopenharmony_ci	return regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), ctx->supplies);
87962306a36Sopenharmony_ci}
88062306a36Sopenharmony_ci
88162306a36Sopenharmony_cistatic int s6e8aa0_disable(struct drm_panel *panel)
88262306a36Sopenharmony_ci{
88362306a36Sopenharmony_ci	return 0;
88462306a36Sopenharmony_ci}
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_cistatic int s6e8aa0_unprepare(struct drm_panel *panel)
88762306a36Sopenharmony_ci{
88862306a36Sopenharmony_ci	struct s6e8aa0 *ctx = panel_to_s6e8aa0(panel);
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq_static(ctx, MIPI_DCS_ENTER_SLEEP_MODE);
89162306a36Sopenharmony_ci	s6e8aa0_dcs_write_seq_static(ctx, MIPI_DCS_SET_DISPLAY_OFF);
89262306a36Sopenharmony_ci	msleep(40);
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci	s6e8aa0_clear_error(ctx);
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci	return s6e8aa0_power_off(ctx);
89762306a36Sopenharmony_ci}
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_cistatic int s6e8aa0_prepare(struct drm_panel *panel)
90062306a36Sopenharmony_ci{
90162306a36Sopenharmony_ci	struct s6e8aa0 *ctx = panel_to_s6e8aa0(panel);
90262306a36Sopenharmony_ci	int ret;
90362306a36Sopenharmony_ci
90462306a36Sopenharmony_ci	ret = s6e8aa0_power_on(ctx);
90562306a36Sopenharmony_ci	if (ret < 0)
90662306a36Sopenharmony_ci		return ret;
90762306a36Sopenharmony_ci
90862306a36Sopenharmony_ci	s6e8aa0_set_sequence(ctx);
90962306a36Sopenharmony_ci	ret = ctx->error;
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci	if (ret < 0)
91262306a36Sopenharmony_ci		s6e8aa0_unprepare(panel);
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci	return ret;
91562306a36Sopenharmony_ci}
91662306a36Sopenharmony_ci
91762306a36Sopenharmony_cistatic int s6e8aa0_enable(struct drm_panel *panel)
91862306a36Sopenharmony_ci{
91962306a36Sopenharmony_ci	return 0;
92062306a36Sopenharmony_ci}
92162306a36Sopenharmony_ci
92262306a36Sopenharmony_cistatic int s6e8aa0_get_modes(struct drm_panel *panel,
92362306a36Sopenharmony_ci			     struct drm_connector *connector)
92462306a36Sopenharmony_ci{
92562306a36Sopenharmony_ci	struct s6e8aa0 *ctx = panel_to_s6e8aa0(panel);
92662306a36Sopenharmony_ci	struct drm_display_mode *mode;
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci	mode = drm_mode_create(connector->dev);
92962306a36Sopenharmony_ci	if (!mode) {
93062306a36Sopenharmony_ci		dev_err(panel->dev, "failed to create a new display mode\n");
93162306a36Sopenharmony_ci		return 0;
93262306a36Sopenharmony_ci	}
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_ci	drm_display_mode_from_videomode(&ctx->vm, mode);
93562306a36Sopenharmony_ci	mode->width_mm = ctx->width_mm;
93662306a36Sopenharmony_ci	mode->height_mm = ctx->height_mm;
93762306a36Sopenharmony_ci	connector->display_info.width_mm = mode->width_mm;
93862306a36Sopenharmony_ci	connector->display_info.height_mm = mode->height_mm;
93962306a36Sopenharmony_ci
94062306a36Sopenharmony_ci	mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
94162306a36Sopenharmony_ci	drm_mode_probed_add(connector, mode);
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_ci	return 1;
94462306a36Sopenharmony_ci}
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_cistatic const struct drm_panel_funcs s6e8aa0_drm_funcs = {
94762306a36Sopenharmony_ci	.disable = s6e8aa0_disable,
94862306a36Sopenharmony_ci	.unprepare = s6e8aa0_unprepare,
94962306a36Sopenharmony_ci	.prepare = s6e8aa0_prepare,
95062306a36Sopenharmony_ci	.enable = s6e8aa0_enable,
95162306a36Sopenharmony_ci	.get_modes = s6e8aa0_get_modes,
95262306a36Sopenharmony_ci};
95362306a36Sopenharmony_ci
95462306a36Sopenharmony_cistatic int s6e8aa0_parse_dt(struct s6e8aa0 *ctx)
95562306a36Sopenharmony_ci{
95662306a36Sopenharmony_ci	struct device *dev = ctx->dev;
95762306a36Sopenharmony_ci	struct device_node *np = dev->of_node;
95862306a36Sopenharmony_ci	int ret;
95962306a36Sopenharmony_ci
96062306a36Sopenharmony_ci	ret = of_get_videomode(np, &ctx->vm, 0);
96162306a36Sopenharmony_ci	if (ret < 0)
96262306a36Sopenharmony_ci		return ret;
96362306a36Sopenharmony_ci
96462306a36Sopenharmony_ci	of_property_read_u32(np, "power-on-delay", &ctx->power_on_delay);
96562306a36Sopenharmony_ci	of_property_read_u32(np, "reset-delay", &ctx->reset_delay);
96662306a36Sopenharmony_ci	of_property_read_u32(np, "init-delay", &ctx->init_delay);
96762306a36Sopenharmony_ci	of_property_read_u32(np, "panel-width-mm", &ctx->width_mm);
96862306a36Sopenharmony_ci	of_property_read_u32(np, "panel-height-mm", &ctx->height_mm);
96962306a36Sopenharmony_ci
97062306a36Sopenharmony_ci	ctx->flip_horizontal = of_property_read_bool(np, "flip-horizontal");
97162306a36Sopenharmony_ci	ctx->flip_vertical = of_property_read_bool(np, "flip-vertical");
97262306a36Sopenharmony_ci
97362306a36Sopenharmony_ci	return 0;
97462306a36Sopenharmony_ci}
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_cistatic int s6e8aa0_probe(struct mipi_dsi_device *dsi)
97762306a36Sopenharmony_ci{
97862306a36Sopenharmony_ci	struct device *dev = &dsi->dev;
97962306a36Sopenharmony_ci	struct s6e8aa0 *ctx;
98062306a36Sopenharmony_ci	int ret;
98162306a36Sopenharmony_ci
98262306a36Sopenharmony_ci	ctx = devm_kzalloc(dev, sizeof(struct s6e8aa0), GFP_KERNEL);
98362306a36Sopenharmony_ci	if (!ctx)
98462306a36Sopenharmony_ci		return -ENOMEM;
98562306a36Sopenharmony_ci
98662306a36Sopenharmony_ci	mipi_dsi_set_drvdata(dsi, ctx);
98762306a36Sopenharmony_ci
98862306a36Sopenharmony_ci	ctx->dev = dev;
98962306a36Sopenharmony_ci
99062306a36Sopenharmony_ci	dsi->lanes = 4;
99162306a36Sopenharmony_ci	dsi->format = MIPI_DSI_FMT_RGB888;
99262306a36Sopenharmony_ci	dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST
99362306a36Sopenharmony_ci		| MIPI_DSI_MODE_VSYNC_FLUSH | MIPI_DSI_MODE_VIDEO_AUTO_VERT;
99462306a36Sopenharmony_ci
99562306a36Sopenharmony_ci	ret = s6e8aa0_parse_dt(ctx);
99662306a36Sopenharmony_ci	if (ret < 0)
99762306a36Sopenharmony_ci		return ret;
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci	ctx->supplies[0].supply = "vdd3";
100062306a36Sopenharmony_ci	ctx->supplies[1].supply = "vci";
100162306a36Sopenharmony_ci	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(ctx->supplies),
100262306a36Sopenharmony_ci				      ctx->supplies);
100362306a36Sopenharmony_ci	if (ret < 0) {
100462306a36Sopenharmony_ci		dev_err(dev, "failed to get regulators: %d\n", ret);
100562306a36Sopenharmony_ci		return ret;
100662306a36Sopenharmony_ci	}
100762306a36Sopenharmony_ci
100862306a36Sopenharmony_ci	ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
100962306a36Sopenharmony_ci	if (IS_ERR(ctx->reset_gpio)) {
101062306a36Sopenharmony_ci		dev_err(dev, "cannot get reset-gpios %ld\n",
101162306a36Sopenharmony_ci			PTR_ERR(ctx->reset_gpio));
101262306a36Sopenharmony_ci		return PTR_ERR(ctx->reset_gpio);
101362306a36Sopenharmony_ci	}
101462306a36Sopenharmony_ci
101562306a36Sopenharmony_ci	ctx->brightness = GAMMA_LEVEL_NUM - 1;
101662306a36Sopenharmony_ci
101762306a36Sopenharmony_ci	drm_panel_init(&ctx->panel, dev, &s6e8aa0_drm_funcs,
101862306a36Sopenharmony_ci		       DRM_MODE_CONNECTOR_DSI);
101962306a36Sopenharmony_ci	ctx->panel.prepare_prev_first = true;
102062306a36Sopenharmony_ci
102162306a36Sopenharmony_ci	drm_panel_add(&ctx->panel);
102262306a36Sopenharmony_ci
102362306a36Sopenharmony_ci	ret = mipi_dsi_attach(dsi);
102462306a36Sopenharmony_ci	if (ret < 0)
102562306a36Sopenharmony_ci		drm_panel_remove(&ctx->panel);
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_ci	return ret;
102862306a36Sopenharmony_ci}
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_cistatic void s6e8aa0_remove(struct mipi_dsi_device *dsi)
103162306a36Sopenharmony_ci{
103262306a36Sopenharmony_ci	struct s6e8aa0 *ctx = mipi_dsi_get_drvdata(dsi);
103362306a36Sopenharmony_ci
103462306a36Sopenharmony_ci	mipi_dsi_detach(dsi);
103562306a36Sopenharmony_ci	drm_panel_remove(&ctx->panel);
103662306a36Sopenharmony_ci}
103762306a36Sopenharmony_ci
103862306a36Sopenharmony_cistatic const struct of_device_id s6e8aa0_of_match[] = {
103962306a36Sopenharmony_ci	{ .compatible = "samsung,s6e8aa0" },
104062306a36Sopenharmony_ci	{ }
104162306a36Sopenharmony_ci};
104262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, s6e8aa0_of_match);
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_cistatic struct mipi_dsi_driver s6e8aa0_driver = {
104562306a36Sopenharmony_ci	.probe = s6e8aa0_probe,
104662306a36Sopenharmony_ci	.remove = s6e8aa0_remove,
104762306a36Sopenharmony_ci	.driver = {
104862306a36Sopenharmony_ci		.name = "panel-samsung-s6e8aa0",
104962306a36Sopenharmony_ci		.of_match_table = s6e8aa0_of_match,
105062306a36Sopenharmony_ci	},
105162306a36Sopenharmony_ci};
105262306a36Sopenharmony_cimodule_mipi_dsi_driver(s6e8aa0_driver);
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_ciMODULE_AUTHOR("Donghwa Lee <dh09.lee@samsung.com>");
105562306a36Sopenharmony_ciMODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>");
105662306a36Sopenharmony_ciMODULE_AUTHOR("Joongmock Shin <jmock.shin@samsung.com>");
105762306a36Sopenharmony_ciMODULE_AUTHOR("Eunchul Kim <chulspro.kim@samsung.com>");
105862306a36Sopenharmony_ciMODULE_AUTHOR("Tomasz Figa <t.figa@samsung.com>");
105962306a36Sopenharmony_ciMODULE_AUTHOR("Andrzej Hajda <a.hajda@samsung.com>");
106062306a36Sopenharmony_ciMODULE_DESCRIPTION("MIPI-DSI based s6e8aa0 AMOLED LCD Panel Driver");
106162306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
1062