* [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da
@ 2024-06-24 14:19 Zhaoxiong Lv
2024-06-24 14:19 ` [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands Zhaoxiong Lv
` (5 more replies)
0 siblings, 6 replies; 22+ messages in thread
From: Zhaoxiong Lv @ 2024-06-24 14:19 UTC (permalink / raw)
To: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
quic_jesszhan, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel, Zhaoxiong Lv
This kingdisplay panel uses the jd9365da controller, so add it to
panel-jadard-jd9365da-h3.c driver, but because the init_code and timing
are different, some variables are added in struct jadard_panel_des to
control it.
In addition, since sending init_code in the enable() function takes a long time,
it is moved to the prepare() function.
Changes between V5 and V4:
- PATCH 1/5: No changes.
- PATCH 2/5: No changes.
- PATCH 3/5: New Patch, Switch jd9365da to use mipi_dsi_dcs_write_seq_multi() but no
- functional changes.
- PATCH 4/5: Add a "_ms" suffix to the variables.
- Use more "_multi" in the enable/disable function
- Use mipi_dsi_dcs_write_seq_multi() in the init() function.
- PATCH 5/5: Use dev_err_probe().
- Link to v4: https://lore.kernel.org/all/20240620080509.18504-1-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V4 and V3:
- PATCH 1/4: Only move mipi_dsi_dcs_write_buffer from enable() function to prepare() function,
- and no longer use mipi_dsi_dcs_write_seq_multi.
- PATCH 2/4: Move positions to keep the list sorted.
- PATCH 3/4: Use mipi_dsi_msleep.
- Adjust the ".clock" assignment format.
- Adjust "compatible" positions to keep the list sorted.
- PATCH 4/4: No changes.
- Link to v3: https://lore.kernel.org/all/20240614145510.22965-1-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V3 and V2:
- PATCH 1/4: Modify the init_code sending method
- PATCH 2/4: Add binding for kingdisplay-kd101ne3 in jadard,jd9365da-h3.yaml
- PATCH 3/4: Add compatibility for kingdisplay-kd101ne3 in panel-jadard-jd9365da-h3.c driver,
- and add some variables to control timing.
- PATCH 4/4: Add the function of adjusting orientation.
- Link to v2: https://lore.kernel.org/all/20240601084528.22502-1-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V2 and V1:
- PATCH 1/4: Delete some unnecessary information.
- PATCH 2/4: Use the new mipi_dsi_dcs_write_seq_multi() function, deleted some unnecessary functions.
- PATCH 3/4: Add compatible for Starry-er88577.
- PATCH 4/4: Add starry panel configuration in panel-kingdisplay-kd101ne3 driver.
- Link to v1: https://lore.kernel.org/all/20240418081548.12160-1-lvzhaoxiong@huaqin.corp-partner.google.com/
Zhaoxiong Lv (5):
drm/panel: jd9365da: Modify the method of sending commands
dt-bindings: display: panel: Add compatible for kingdisplay-kd101ne3
drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions
drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel
drm/panel: jd9365da: Add the function of adjusting orientation
.../display/panel/jadard,jd9365da-h3.yaml | 1 +
.../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 1088 +++++++++++------
2 files changed, 682 insertions(+), 407 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands
2024-06-24 14:19 [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Zhaoxiong Lv
@ 2024-06-24 14:19 ` Zhaoxiong Lv
2024-06-24 16:22 ` Doug Anderson
` (2 more replies)
2024-06-24 14:19 ` [PATCH v5 2/5] dt-bindings: display: panel: Add compatible for kingdisplay-kd101ne3 Zhaoxiong Lv
` (4 subsequent siblings)
5 siblings, 3 replies; 22+ messages in thread
From: Zhaoxiong Lv @ 2024-06-24 14:19 UTC (permalink / raw)
To: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
quic_jesszhan, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel, Zhaoxiong Lv
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3005 bytes --]
Currently, the init_code of the jd9365da driver is placed
in the enable() function and sent, but this seems to take
a long time. It takes 17ms to send each instruction (an init
code consists of about 200 instructions), so it takes
about 3.5s to send the init_code. So we moved the sending
of the inti_code to the prepare() function, and each
instruction seemed to take only 25μs.
We checked the DSI host and found that the difference in
command sending time is caused by the different modes of
the DSI host in prepare() and enable() functions.
Our DSI Host only supports sending cmd in LP mode, The
prepare() function can directly send init_code (LP->cmd)
in LP mode, but the enable() function is in HS mode and
needs to switch to LP mode before sending init code
(HS->LP->cmd->HS). Therefore, it takes longer to send
the command.
Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
---
Changes between V5 and V4:
- 1. No changes.
V4:https://lore.kernel.org/all/20240620080509.18504-2-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V4 and V3:
- 1. Only move mipi_dsi_dcs_write_buffer from enable() function to prepare() function,
- and no longer use mipi_dsi_dcs_write_seq_multi.
V3:https://lore.kernel.org/all/20240614145510.22965-2-lvzhaoxiong@huaqin.corp-partner.google.com/
---
.../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 24 +++++++++----------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
index 4879835fe101..a9c483a7b3fa 100644
--- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
+++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
@@ -52,21 +52,9 @@ static int jadard_enable(struct drm_panel *panel)
{
struct device *dev = panel->dev;
struct jadard *jadard = panel_to_jadard(panel);
- const struct jadard_panel_desc *desc = jadard->desc;
struct mipi_dsi_device *dsi = jadard->dsi;
- unsigned int i;
int err;
- msleep(10);
-
- for (i = 0; i < desc->num_init_cmds; i++) {
- const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
-
- err = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
- if (err < 0)
- return err;
- }
-
msleep(120);
err = mipi_dsi_dcs_exit_sleep_mode(dsi);
@@ -100,6 +88,8 @@ static int jadard_disable(struct drm_panel *panel)
static int jadard_prepare(struct drm_panel *panel)
{
struct jadard *jadard = panel_to_jadard(panel);
+ const struct jadard_panel_desc *desc = jadard->desc;
+ unsigned int i;
int ret;
ret = regulator_enable(jadard->vccio);
@@ -117,7 +107,15 @@ static int jadard_prepare(struct drm_panel *panel)
msleep(10);
gpiod_set_value(jadard->reset, 1);
- msleep(120);
+ msleep(130);
+
+ for (i = 0; i < desc->num_init_cmds; i++) {
+ const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
+
+ ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
+ if (ret < 0)
+ return ret;
+ }
return 0;
}
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v5 2/5] dt-bindings: display: panel: Add compatible for kingdisplay-kd101ne3
2024-06-24 14:19 [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Zhaoxiong Lv
2024-06-24 14:19 ` [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands Zhaoxiong Lv
@ 2024-06-24 14:19 ` Zhaoxiong Lv
2024-06-24 14:19 ` [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions Zhaoxiong Lv
` (3 subsequent siblings)
5 siblings, 0 replies; 22+ messages in thread
From: Zhaoxiong Lv @ 2024-06-24 14:19 UTC (permalink / raw)
To: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
quic_jesszhan, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel, Zhaoxiong Lv
The kingdisplay-kd101ne3 is a 10.1" WXGA TFT-LCD panel with
jadard-jd9365da controller. Hence, we add a new compatible
with panel specific config.
Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
Acked-by: Conor Dooley <conor.dooley@microchip.com>
---
Changes between V5 and V4:
- 1. No changes.
V4:https://lore.kernel.org/all/20240620080509.18504-3-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V4 and V3:
- 1. Move positions to keep the list sorted.
V3:https://lore.kernel.org/all/20240614145510.22965-3-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V3 and V2:
- 1. Abandon the V2 patch and add kingdisplay kd101ne3-40ti binding to
- jadard,jd9365da-h3.yaml again.
V2:https://lore.kernel.org/all/20240601084528.22502-2-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V2 and V1:
- Drop some properties that have already been defined in panel-common.
- The header file 'dt-bindings/gpio/gpio.h' is not used, delete it
V1: https://lore.kernel.org/all/20240418081548.12160-2-lvzhaoxiong@huaqin.corp-partner.google.com/
---
.../devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml b/Documentation/devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml
index 41eb7fbf7715..2b977292dc48 100644
--- a/Documentation/devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml
+++ b/Documentation/devicetree/bindings/display/panel/jadard,jd9365da-h3.yaml
@@ -17,6 +17,7 @@ properties:
items:
- enum:
- chongzhou,cz101b4001
+ - kingdisplay,kd101ne3-40ti
- radxa,display-10hd-ad001
- radxa,display-8hd-ad002
- const: jadard,jd9365da-h3
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions
2024-06-24 14:19 [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Zhaoxiong Lv
2024-06-24 14:19 ` [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands Zhaoxiong Lv
2024-06-24 14:19 ` [PATCH v5 2/5] dt-bindings: display: panel: Add compatible for kingdisplay-kd101ne3 Zhaoxiong Lv
@ 2024-06-24 14:19 ` Zhaoxiong Lv
2024-06-24 15:27 ` Dmitry Baryshkov
` (2 more replies)
2024-06-24 14:19 ` [PATCH v5 4/5] drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel Zhaoxiong Lv
` (2 subsequent siblings)
5 siblings, 3 replies; 22+ messages in thread
From: Zhaoxiong Lv @ 2024-06-24 14:19 UTC (permalink / raw)
To: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
quic_jesszhan, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel, Zhaoxiong Lv
Remove conditional code and always use mipi_dsi_dcs_*multi() wrappers to
simplify driver's init/enable/exit code.
Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
---
.../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 793 +++++++++---------
1 file changed, 390 insertions(+), 403 deletions(-)
diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
index a9c483a7b3fa..e836260338bf 100644
--- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
+++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
@@ -19,17 +19,13 @@
#include <linux/of.h>
#include <linux/regulator/consumer.h>
-#define JD9365DA_INIT_CMD_LEN 2
-
-struct jadard_init_cmd {
- u8 data[JD9365DA_INIT_CMD_LEN];
-};
+struct jadard;
struct jadard_panel_desc {
const struct drm_display_mode mode;
unsigned int lanes;
enum mipi_dsi_pixel_format format;
- const struct jadard_init_cmd *init_cmds;
+ int (*init)(struct jadard *jadard);
u32 num_init_cmds;
};
@@ -50,46 +46,33 @@ static inline struct jadard *panel_to_jadard(struct drm_panel *panel)
static int jadard_enable(struct drm_panel *panel)
{
- struct device *dev = panel->dev;
struct jadard *jadard = panel_to_jadard(panel);
- struct mipi_dsi_device *dsi = jadard->dsi;
- int err;
+ struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
msleep(120);
- err = mipi_dsi_dcs_exit_sleep_mode(dsi);
- if (err < 0)
- DRM_DEV_ERROR(dev, "failed to exit sleep mode ret = %d\n", err);
+ mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
- err = mipi_dsi_dcs_set_display_on(dsi);
- if (err < 0)
- DRM_DEV_ERROR(dev, "failed to set display on ret = %d\n", err);
+ mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
- return 0;
+ return dsi_ctx.accum_err;
}
static int jadard_disable(struct drm_panel *panel)
{
- struct device *dev = panel->dev;
struct jadard *jadard = panel_to_jadard(panel);
- int ret;
+ struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
- ret = mipi_dsi_dcs_set_display_off(jadard->dsi);
- if (ret < 0)
- DRM_DEV_ERROR(dev, "failed to set display off: %d\n", ret);
+ mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
- ret = mipi_dsi_dcs_enter_sleep_mode(jadard->dsi);
- if (ret < 0)
- DRM_DEV_ERROR(dev, "failed to enter sleep mode: %d\n", ret);
+ mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
- return 0;
+ return dsi_ctx.accum_err;
}
static int jadard_prepare(struct drm_panel *panel)
{
struct jadard *jadard = panel_to_jadard(panel);
- const struct jadard_panel_desc *desc = jadard->desc;
- unsigned int i;
int ret;
ret = regulator_enable(jadard->vccio);
@@ -109,13 +92,9 @@ static int jadard_prepare(struct drm_panel *panel)
gpiod_set_value(jadard->reset, 1);
msleep(130);
- for (i = 0; i < desc->num_init_cmds; i++) {
- const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
-
- ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
- if (ret < 0)
- return ret;
- }
+ ret = jadard->desc->init(jadard);
+ if (ret)
+ return ret;
return 0;
}
@@ -165,176 +144,181 @@ static const struct drm_panel_funcs jadard_funcs = {
.get_modes = jadard_get_modes,
};
-static const struct jadard_init_cmd radxa_display_8hd_ad002_init_cmds[] = {
- { .data = { 0xE0, 0x00 } },
- { .data = { 0xE1, 0x93 } },
- { .data = { 0xE2, 0x65 } },
- { .data = { 0xE3, 0xF8 } },
- { .data = { 0x80, 0x03 } },
- { .data = { 0xE0, 0x01 } },
- { .data = { 0x00, 0x00 } },
- { .data = { 0x01, 0x7E } },
- { .data = { 0x03, 0x00 } },
- { .data = { 0x04, 0x65 } },
- { .data = { 0x0C, 0x74 } },
- { .data = { 0x17, 0x00 } },
- { .data = { 0x18, 0xB7 } },
- { .data = { 0x19, 0x00 } },
- { .data = { 0x1A, 0x00 } },
- { .data = { 0x1B, 0xB7 } },
- { .data = { 0x1C, 0x00 } },
- { .data = { 0x24, 0xFE } },
- { .data = { 0x37, 0x19 } },
- { .data = { 0x38, 0x05 } },
- { .data = { 0x39, 0x00 } },
- { .data = { 0x3A, 0x01 } },
- { .data = { 0x3B, 0x01 } },
- { .data = { 0x3C, 0x70 } },
- { .data = { 0x3D, 0xFF } },
- { .data = { 0x3E, 0xFF } },
- { .data = { 0x3F, 0xFF } },
- { .data = { 0x40, 0x06 } },
- { .data = { 0x41, 0xA0 } },
- { .data = { 0x43, 0x1E } },
- { .data = { 0x44, 0x0F } },
- { .data = { 0x45, 0x28 } },
- { .data = { 0x4B, 0x04 } },
- { .data = { 0x55, 0x02 } },
- { .data = { 0x56, 0x01 } },
- { .data = { 0x57, 0xA9 } },
- { .data = { 0x58, 0x0A } },
- { .data = { 0x59, 0x0A } },
- { .data = { 0x5A, 0x37 } },
- { .data = { 0x5B, 0x19 } },
- { .data = { 0x5D, 0x78 } },
- { .data = { 0x5E, 0x63 } },
- { .data = { 0x5F, 0x54 } },
- { .data = { 0x60, 0x49 } },
- { .data = { 0x61, 0x45 } },
- { .data = { 0x62, 0x38 } },
- { .data = { 0x63, 0x3D } },
- { .data = { 0x64, 0x28 } },
- { .data = { 0x65, 0x43 } },
- { .data = { 0x66, 0x41 } },
- { .data = { 0x67, 0x43 } },
- { .data = { 0x68, 0x62 } },
- { .data = { 0x69, 0x50 } },
- { .data = { 0x6A, 0x57 } },
- { .data = { 0x6B, 0x49 } },
- { .data = { 0x6C, 0x44 } },
- { .data = { 0x6D, 0x37 } },
- { .data = { 0x6E, 0x23 } },
- { .data = { 0x6F, 0x10 } },
- { .data = { 0x70, 0x78 } },
- { .data = { 0x71, 0x63 } },
- { .data = { 0x72, 0x54 } },
- { .data = { 0x73, 0x49 } },
- { .data = { 0x74, 0x45 } },
- { .data = { 0x75, 0x38 } },
- { .data = { 0x76, 0x3D } },
- { .data = { 0x77, 0x28 } },
- { .data = { 0x78, 0x43 } },
- { .data = { 0x79, 0x41 } },
- { .data = { 0x7A, 0x43 } },
- { .data = { 0x7B, 0x62 } },
- { .data = { 0x7C, 0x50 } },
- { .data = { 0x7D, 0x57 } },
- { .data = { 0x7E, 0x49 } },
- { .data = { 0x7F, 0x44 } },
- { .data = { 0x80, 0x37 } },
- { .data = { 0x81, 0x23 } },
- { .data = { 0x82, 0x10 } },
- { .data = { 0xE0, 0x02 } },
- { .data = { 0x00, 0x47 } },
- { .data = { 0x01, 0x47 } },
- { .data = { 0x02, 0x45 } },
- { .data = { 0x03, 0x45 } },
- { .data = { 0x04, 0x4B } },
- { .data = { 0x05, 0x4B } },
- { .data = { 0x06, 0x49 } },
- { .data = { 0x07, 0x49 } },
- { .data = { 0x08, 0x41 } },
- { .data = { 0x09, 0x1F } },
- { .data = { 0x0A, 0x1F } },
- { .data = { 0x0B, 0x1F } },
- { .data = { 0x0C, 0x1F } },
- { .data = { 0x0D, 0x1F } },
- { .data = { 0x0E, 0x1F } },
- { .data = { 0x0F, 0x5F } },
- { .data = { 0x10, 0x5F } },
- { .data = { 0x11, 0x57 } },
- { .data = { 0x12, 0x77 } },
- { .data = { 0x13, 0x35 } },
- { .data = { 0x14, 0x1F } },
- { .data = { 0x15, 0x1F } },
- { .data = { 0x16, 0x46 } },
- { .data = { 0x17, 0x46 } },
- { .data = { 0x18, 0x44 } },
- { .data = { 0x19, 0x44 } },
- { .data = { 0x1A, 0x4A } },
- { .data = { 0x1B, 0x4A } },
- { .data = { 0x1C, 0x48 } },
- { .data = { 0x1D, 0x48 } },
- { .data = { 0x1E, 0x40 } },
- { .data = { 0x1F, 0x1F } },
- { .data = { 0x20, 0x1F } },
- { .data = { 0x21, 0x1F } },
- { .data = { 0x22, 0x1F } },
- { .data = { 0x23, 0x1F } },
- { .data = { 0x24, 0x1F } },
- { .data = { 0x25, 0x5F } },
- { .data = { 0x26, 0x5F } },
- { .data = { 0x27, 0x57 } },
- { .data = { 0x28, 0x77 } },
- { .data = { 0x29, 0x35 } },
- { .data = { 0x2A, 0x1F } },
- { .data = { 0x2B, 0x1F } },
- { .data = { 0x58, 0x40 } },
- { .data = { 0x59, 0x00 } },
- { .data = { 0x5A, 0x00 } },
- { .data = { 0x5B, 0x10 } },
- { .data = { 0x5C, 0x06 } },
- { .data = { 0x5D, 0x40 } },
- { .data = { 0x5E, 0x01 } },
- { .data = { 0x5F, 0x02 } },
- { .data = { 0x60, 0x30 } },
- { .data = { 0x61, 0x01 } },
- { .data = { 0x62, 0x02 } },
- { .data = { 0x63, 0x03 } },
- { .data = { 0x64, 0x6B } },
- { .data = { 0x65, 0x05 } },
- { .data = { 0x66, 0x0C } },
- { .data = { 0x67, 0x73 } },
- { .data = { 0x68, 0x09 } },
- { .data = { 0x69, 0x03 } },
- { .data = { 0x6A, 0x56 } },
- { .data = { 0x6B, 0x08 } },
- { .data = { 0x6C, 0x00 } },
- { .data = { 0x6D, 0x04 } },
- { .data = { 0x6E, 0x04 } },
- { .data = { 0x6F, 0x88 } },
- { .data = { 0x70, 0x00 } },
- { .data = { 0x71, 0x00 } },
- { .data = { 0x72, 0x06 } },
- { .data = { 0x73, 0x7B } },
- { .data = { 0x74, 0x00 } },
- { .data = { 0x75, 0xF8 } },
- { .data = { 0x76, 0x00 } },
- { .data = { 0x77, 0xD5 } },
- { .data = { 0x78, 0x2E } },
- { .data = { 0x79, 0x12 } },
- { .data = { 0x7A, 0x03 } },
- { .data = { 0x7B, 0x00 } },
- { .data = { 0x7C, 0x00 } },
- { .data = { 0x7D, 0x03 } },
- { .data = { 0x7E, 0x7B } },
- { .data = { 0xE0, 0x04 } },
- { .data = { 0x00, 0x0E } },
- { .data = { 0x02, 0xB3 } },
- { .data = { 0x09, 0x60 } },
- { .data = { 0x0E, 0x2A } },
- { .data = { 0x36, 0x59 } },
- { .data = { 0xE0, 0x00 } },
+static int radxa_display_8hd_ad002_init_cmds(struct jadard *jadard)
+{
+ struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
+
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE1, 0x93);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE2, 0x65);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE3, 0xF8);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x03);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x7E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x65);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0C, 0x74);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0xB7);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1A, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1B, 0xB7);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1C, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0xFE);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x19);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x05);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3A, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3B, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3C, 0x70);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3D, 0xFF);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3E, 0xFF);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3F, 0xFF);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x06);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0xA0);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x1E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x0F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x45, 0x28);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4B, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x56, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0xA9);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x0A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x0A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5A, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5B, 0x19);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5D, 0x78);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5E, 0x63);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5F, 0x54);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x49);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x45);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x38);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x3D);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x28);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x41);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x62);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x50);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6A, 0x57);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6B, 0x49);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6C, 0x44);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6D, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6E, 0x23);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6F, 0x10);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x78);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x71, 0x63);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x72, 0x54);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x73, 0x49);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x74, 0x45);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0x38);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x3D);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0x28);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x41);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7A, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7B, 0x62);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7C, 0x50);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7D, 0x57);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7E, 0x49);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7F, 0x44);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x81, 0x23);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x82, 0x10);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x47);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x47);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0x45);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x45);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x4B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x05, 0x4B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x06, 0x49);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x07, 0x49);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x08, 0x41);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0A, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0B, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0C, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0D, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0E, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0F, 0x5F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x10, 0x5F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x11, 0x57);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x12, 0x77);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x13, 0x35);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x14, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x15, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0x46);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x46);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0x44);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x44);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1A, 0x4A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1B, 0x4A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1C, 0x48);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1D, 0x48);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1E, 0x40);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1F, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x21, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x22, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x23, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0x5F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x26, 0x5F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0x57);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x28, 0x77);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x29, 0x35);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2A, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2B, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x40);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5A, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5B, 0x10);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5C, 0x06);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5D, 0x40);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5E, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5F, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x30);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x03);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x6B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x05);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x0C);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x73);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x09);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x03);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6A, 0x56);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6B, 0x08);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6C, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6D, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6E, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6F, 0x88);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x71, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x72, 0x06);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x73, 0x7B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x74, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0xF8);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0xD5);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x2E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x12);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7A, 0x03);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7B, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7C, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7D, 0x03);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7E, 0x7B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x0E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0xB3);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x60);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0E, 0x2A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x36, 0x59);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
+
+ return dsi_ctx.accum_err;
};
static const struct jadard_panel_desc radxa_display_8hd_ad002_desc = {
@@ -357,205 +341,209 @@ static const struct jadard_panel_desc radxa_display_8hd_ad002_desc = {
},
.lanes = 4,
.format = MIPI_DSI_FMT_RGB888,
- .init_cmds = radxa_display_8hd_ad002_init_cmds,
- .num_init_cmds = ARRAY_SIZE(radxa_display_8hd_ad002_init_cmds),
+ .init = radxa_display_8hd_ad002_init_cmds,
};
-static const struct jadard_init_cmd cz101b4001_init_cmds[] = {
- { .data = { 0xE0, 0x00 } },
- { .data = { 0xE1, 0x93 } },
- { .data = { 0xE2, 0x65 } },
- { .data = { 0xE3, 0xF8 } },
- { .data = { 0x80, 0x03 } },
- { .data = { 0xE0, 0x01 } },
- { .data = { 0x00, 0x00 } },
- { .data = { 0x01, 0x3B } },
- { .data = { 0x0C, 0x74 } },
- { .data = { 0x17, 0x00 } },
- { .data = { 0x18, 0xAF } },
- { .data = { 0x19, 0x00 } },
- { .data = { 0x1A, 0x00 } },
- { .data = { 0x1B, 0xAF } },
- { .data = { 0x1C, 0x00 } },
- { .data = { 0x35, 0x26 } },
- { .data = { 0x37, 0x09 } },
- { .data = { 0x38, 0x04 } },
- { .data = { 0x39, 0x00 } },
- { .data = { 0x3A, 0x01 } },
- { .data = { 0x3C, 0x78 } },
- { .data = { 0x3D, 0xFF } },
- { .data = { 0x3E, 0xFF } },
- { .data = { 0x3F, 0x7F } },
- { .data = { 0x40, 0x06 } },
- { .data = { 0x41, 0xA0 } },
- { .data = { 0x42, 0x81 } },
- { .data = { 0x43, 0x14 } },
- { .data = { 0x44, 0x23 } },
- { .data = { 0x45, 0x28 } },
- { .data = { 0x55, 0x02 } },
- { .data = { 0x57, 0x69 } },
- { .data = { 0x59, 0x0A } },
- { .data = { 0x5A, 0x2A } },
- { .data = { 0x5B, 0x17 } },
- { .data = { 0x5D, 0x7F } },
- { .data = { 0x5E, 0x6B } },
- { .data = { 0x5F, 0x5C } },
- { .data = { 0x60, 0x4F } },
- { .data = { 0x61, 0x4D } },
- { .data = { 0x62, 0x3F } },
- { .data = { 0x63, 0x42 } },
- { .data = { 0x64, 0x2B } },
- { .data = { 0x65, 0x44 } },
- { .data = { 0x66, 0x43 } },
- { .data = { 0x67, 0x43 } },
- { .data = { 0x68, 0x63 } },
- { .data = { 0x69, 0x52 } },
- { .data = { 0x6A, 0x5A } },
- { .data = { 0x6B, 0x4F } },
- { .data = { 0x6C, 0x4E } },
- { .data = { 0x6D, 0x20 } },
- { .data = { 0x6E, 0x0F } },
- { .data = { 0x6F, 0x00 } },
- { .data = { 0x70, 0x7F } },
- { .data = { 0x71, 0x6B } },
- { .data = { 0x72, 0x5C } },
- { .data = { 0x73, 0x4F } },
- { .data = { 0x74, 0x4D } },
- { .data = { 0x75, 0x3F } },
- { .data = { 0x76, 0x42 } },
- { .data = { 0x77, 0x2B } },
- { .data = { 0x78, 0x44 } },
- { .data = { 0x79, 0x43 } },
- { .data = { 0x7A, 0x43 } },
- { .data = { 0x7B, 0x63 } },
- { .data = { 0x7C, 0x52 } },
- { .data = { 0x7D, 0x5A } },
- { .data = { 0x7E, 0x4F } },
- { .data = { 0x7F, 0x4E } },
- { .data = { 0x80, 0x20 } },
- { .data = { 0x81, 0x0F } },
- { .data = { 0x82, 0x00 } },
- { .data = { 0xE0, 0x02 } },
- { .data = { 0x00, 0x02 } },
- { .data = { 0x01, 0x02 } },
- { .data = { 0x02, 0x00 } },
- { .data = { 0x03, 0x00 } },
- { .data = { 0x04, 0x1E } },
- { .data = { 0x05, 0x1E } },
- { .data = { 0x06, 0x1F } },
- { .data = { 0x07, 0x1F } },
- { .data = { 0x08, 0x1F } },
- { .data = { 0x09, 0x17 } },
- { .data = { 0x0A, 0x17 } },
- { .data = { 0x0B, 0x37 } },
- { .data = { 0x0C, 0x37 } },
- { .data = { 0x0D, 0x47 } },
- { .data = { 0x0E, 0x47 } },
- { .data = { 0x0F, 0x45 } },
- { .data = { 0x10, 0x45 } },
- { .data = { 0x11, 0x4B } },
- { .data = { 0x12, 0x4B } },
- { .data = { 0x13, 0x49 } },
- { .data = { 0x14, 0x49 } },
- { .data = { 0x15, 0x1F } },
- { .data = { 0x16, 0x01 } },
- { .data = { 0x17, 0x01 } },
- { .data = { 0x18, 0x00 } },
- { .data = { 0x19, 0x00 } },
- { .data = { 0x1A, 0x1E } },
- { .data = { 0x1B, 0x1E } },
- { .data = { 0x1C, 0x1F } },
- { .data = { 0x1D, 0x1F } },
- { .data = { 0x1E, 0x1F } },
- { .data = { 0x1F, 0x17 } },
- { .data = { 0x20, 0x17 } },
- { .data = { 0x21, 0x37 } },
- { .data = { 0x22, 0x37 } },
- { .data = { 0x23, 0x46 } },
- { .data = { 0x24, 0x46 } },
- { .data = { 0x25, 0x44 } },
- { .data = { 0x26, 0x44 } },
- { .data = { 0x27, 0x4A } },
- { .data = { 0x28, 0x4A } },
- { .data = { 0x29, 0x48 } },
- { .data = { 0x2A, 0x48 } },
- { .data = { 0x2B, 0x1F } },
- { .data = { 0x2C, 0x01 } },
- { .data = { 0x2D, 0x01 } },
- { .data = { 0x2E, 0x00 } },
- { .data = { 0x2F, 0x00 } },
- { .data = { 0x30, 0x1F } },
- { .data = { 0x31, 0x1F } },
- { .data = { 0x32, 0x1E } },
- { .data = { 0x33, 0x1E } },
- { .data = { 0x34, 0x1F } },
- { .data = { 0x35, 0x17 } },
- { .data = { 0x36, 0x17 } },
- { .data = { 0x37, 0x37 } },
- { .data = { 0x38, 0x37 } },
- { .data = { 0x39, 0x08 } },
- { .data = { 0x3A, 0x08 } },
- { .data = { 0x3B, 0x0A } },
- { .data = { 0x3C, 0x0A } },
- { .data = { 0x3D, 0x04 } },
- { .data = { 0x3E, 0x04 } },
- { .data = { 0x3F, 0x06 } },
- { .data = { 0x40, 0x06 } },
- { .data = { 0x41, 0x1F } },
- { .data = { 0x42, 0x02 } },
- { .data = { 0x43, 0x02 } },
- { .data = { 0x44, 0x00 } },
- { .data = { 0x45, 0x00 } },
- { .data = { 0x46, 0x1F } },
- { .data = { 0x47, 0x1F } },
- { .data = { 0x48, 0x1E } },
- { .data = { 0x49, 0x1E } },
- { .data = { 0x4A, 0x1F } },
- { .data = { 0x4B, 0x17 } },
- { .data = { 0x4C, 0x17 } },
- { .data = { 0x4D, 0x37 } },
- { .data = { 0x4E, 0x37 } },
- { .data = { 0x4F, 0x09 } },
- { .data = { 0x50, 0x09 } },
- { .data = { 0x51, 0x0B } },
- { .data = { 0x52, 0x0B } },
- { .data = { 0x53, 0x05 } },
- { .data = { 0x54, 0x05 } },
- { .data = { 0x55, 0x07 } },
- { .data = { 0x56, 0x07 } },
- { .data = { 0x57, 0x1F } },
- { .data = { 0x58, 0x40 } },
- { .data = { 0x5B, 0x30 } },
- { .data = { 0x5C, 0x16 } },
- { .data = { 0x5D, 0x34 } },
- { .data = { 0x5E, 0x05 } },
- { .data = { 0x5F, 0x02 } },
- { .data = { 0x63, 0x00 } },
- { .data = { 0x64, 0x6A } },
- { .data = { 0x67, 0x73 } },
- { .data = { 0x68, 0x1D } },
- { .data = { 0x69, 0x08 } },
- { .data = { 0x6A, 0x6A } },
- { .data = { 0x6B, 0x08 } },
- { .data = { 0x6C, 0x00 } },
- { .data = { 0x6D, 0x00 } },
- { .data = { 0x6E, 0x00 } },
- { .data = { 0x6F, 0x88 } },
- { .data = { 0x75, 0xFF } },
- { .data = { 0x77, 0xDD } },
- { .data = { 0x78, 0x3F } },
- { .data = { 0x79, 0x15 } },
- { .data = { 0x7A, 0x17 } },
- { .data = { 0x7D, 0x14 } },
- { .data = { 0x7E, 0x82 } },
- { .data = { 0xE0, 0x04 } },
- { .data = { 0x00, 0x0E } },
- { .data = { 0x02, 0xB3 } },
- { .data = { 0x09, 0x61 } },
- { .data = { 0x0E, 0x48 } },
- { .data = { 0xE0, 0x00 } },
- { .data = { 0xE6, 0x02 } },
- { .data = { 0xE7, 0x0C } },
+static int cz101b4001_init_cmds(struct jadard *jadard)
+{
+ struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
+
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE1, 0x93);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE2, 0x65);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE3, 0xF8);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x03);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x3B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0C, 0x74);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0xAF);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1A, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1B, 0xAF);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1C, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x26);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x09);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3A, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3C, 0x78);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3D, 0xFF);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3E, 0xFF);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3F, 0x7F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x06);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0xA0);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x42, 0x81);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x14);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x23);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x45, 0x28);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0x69);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x0A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5A, 0x2A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5B, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5D, 0x7F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5E, 0x6B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5F, 0x5C);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x4F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x4D);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x3F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x42);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x2B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x44);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x63);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x52);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6A, 0x5A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6B, 0x4F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6C, 0x4E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6D, 0x20);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6E, 0x0F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6F, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x7F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x71, 0x6B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x72, 0x5C);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x73, 0x4F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x74, 0x4D);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0x3F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x42);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0x2B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x44);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7A, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7B, 0x63);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7C, 0x52);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7D, 0x5A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7E, 0x4F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7F, 0x4E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x20);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x81, 0x0F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x82, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x1E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x05, 0x1E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x06, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x07, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x08, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0A, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0B, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0C, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0D, 0x47);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0E, 0x47);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0F, 0x45);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x10, 0x45);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x11, 0x4B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x12, 0x4B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x13, 0x49);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x14, 0x49);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x15, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1A, 0x1E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1B, 0x1E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1C, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1D, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1E, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1F, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x21, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x22, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x23, 0x46);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0x46);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0x44);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x26, 0x44);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0x4A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x28, 0x4A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x29, 0x48);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2A, 0x48);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2B, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2C, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2D, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2E, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2F, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x30, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x31, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x32, 0x1E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x33, 0x1E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x34, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x36, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x08);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3A, 0x08);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3B, 0x0A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3C, 0x0A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3D, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3E, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3F, 0x06);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x06);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x42, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x45, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x46, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x47, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x1E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x49, 0x1E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4A, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4B, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4C, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4D, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4E, 0x37);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4F, 0x09);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x50, 0x09);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x51, 0x0B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x52, 0x0B);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x53, 0x05);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x54, 0x05);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x07);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x56, 0x07);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0x1F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x40);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5B, 0x30);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5C, 0x16);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5D, 0x34);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5E, 0x05);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5F, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x6A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x73);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x1D);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x08);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6A, 0x6A);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6B, 0x08);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6C, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6D, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6E, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6F, 0x88);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0xFF);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0xDD);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x3F);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x15);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7A, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7D, 0x14);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7E, 0x82);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x0E);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0xB3);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x61);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0E, 0x48);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE6, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE7, 0x0C);
+
+ return dsi_ctx.accum_err;
};
static const struct jadard_panel_desc cz101b4001_desc = {
@@ -578,8 +566,7 @@ static const struct jadard_panel_desc cz101b4001_desc = {
},
.lanes = 4,
.format = MIPI_DSI_FMT_RGB888,
- .init_cmds = cz101b4001_init_cmds,
- .num_init_cmds = ARRAY_SIZE(cz101b4001_init_cmds),
+ .init = cz101b4001_init_cmds,
};
static int jadard_dsi_probe(struct mipi_dsi_device *dsi)
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v5 4/5] drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel
2024-06-24 14:19 [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Zhaoxiong Lv
` (2 preceding siblings ...)
2024-06-24 14:19 ` [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions Zhaoxiong Lv
@ 2024-06-24 14:19 ` Zhaoxiong Lv
2024-06-24 16:45 ` Doug Anderson
2024-06-25 0:55 ` Jessica Zhang
2024-06-24 14:19 ` [PATCH v5 5/5] drm/panel: jd9365da: Add the function of adjusting orientation Zhaoxiong Lv
2024-06-28 9:07 ` [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Neil Armstrong
5 siblings, 2 replies; 22+ messages in thread
From: Zhaoxiong Lv @ 2024-06-24 14:19 UTC (permalink / raw)
To: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
quic_jesszhan, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel, Zhaoxiong Lv
The K&d kd101ne3-40ti is a 10.1" WXGA TFT-LCD panel, use
jd9365da controller,which fits in nicely with the existing
panel-jadard-jd9365da-h3 driver.Hence,we add a new compatible
with panel specific config.
Although they have the same control IC, the two panels are different,
and the timing will be slightly different, so we added some variables
in struct jadard_panel_desc to control the timing.
Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
---
Changes between V5 and V4:
- 1. Add a "_ms" suffix to the variables.
- 2. Use more "_multi" in the enable/disable function
- 3. Use mipi_dsi_dcs_write_seq_multi() in the init() function.
V4:https://lore.kernel.org/all/20240620080509.18504-4-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V4 and V3:
- 1. Use mipi_dsi_msleep.
- 2. Adjust the ".clock" assignment format.
- 3. Adjust "compatible" positions to keep the list sorted.
V3:https://lore.kernel.org/all/20240614145510.22965-4-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V3 and V2:
- 1. Give up creating a new driver and re-add K&d kd101ne3-40ti
- configuration to the panel-jadard-jd9365da-h3.c driver.
V2:https://lore.kernel.org/all/20240601084528.22502-3-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V2 and V1:
- 1. Use the new mipi_dsi_dcs_write_seq_multi() function.
- 2. Modify Move mipi_dsi_dcs_set_display_off() and mipi_dsi_dcs_enter_sleep_mode() to disable(),
- and drop kingdisplay_panel_enter_sleep_mode().
- 3. If prepare fails, disable GPIO before regulators.
- 4. This function drm_connector_set_panel_orientation() is no longer used. Delete it.
- 5. Drop ".shutdown = kingdisplay_panel_shutdown".
---
.../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 277 ++++++++++++++++++
1 file changed, 277 insertions(+)
diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
index e836260338bf..593e12b31ebd 100644
--- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
+++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
@@ -27,6 +27,15 @@ struct jadard_panel_desc {
enum mipi_dsi_pixel_format format;
int (*init)(struct jadard *jadard);
u32 num_init_cmds;
+ bool lp11_before_reset;
+ bool reset_before_power_off_vcioo;
+ unsigned int vcioo_to_lp11_delay_ms;
+ unsigned int lp11_to_reset_delay_ms;
+ unsigned int exit_sleep_to_display_on_delay_ms;
+ unsigned int display_on_delay_ms;
+ unsigned int backlight_off_to_display_off_delay_ms;
+ unsigned int display_off_to_enter_sleep_delay_ms;
+ unsigned int enter_sleep_to_reset_down_delay_ms;
};
struct jadard {
@@ -53,8 +62,14 @@ static int jadard_enable(struct drm_panel *panel)
mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
+ if (jadard->desc->exit_sleep_to_display_on_delay_ms)
+ mipi_dsi_msleep(&dsi_ctx, jadard->desc->exit_sleep_to_display_on_delay_ms);
+
mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
+ if (jadard->desc->display_on_delay_ms)
+ mipi_dsi_msleep(&dsi_ctx, jadard->desc->display_on_delay_ms);
+
return dsi_ctx.accum_err;
}
@@ -63,10 +78,19 @@ static int jadard_disable(struct drm_panel *panel)
struct jadard *jadard = panel_to_jadard(panel);
struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
+ if (jadard->desc->backlight_off_to_display_off_delay_ms)
+ mipi_dsi_msleep(&dsi_ctx, jadard->desc->backlight_off_to_display_off_delay_ms);
+
mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
+ if (jadard->desc->display_off_to_enter_sleep_delay_ms)
+ mipi_dsi_msleep(&dsi_ctx, jadard->desc->display_off_to_enter_sleep_delay_ms);
+
mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
+ if (jadard->desc->enter_sleep_to_reset_down_delay_ms)
+ mipi_dsi_msleep(&dsi_ctx, jadard->desc->enter_sleep_to_reset_down_delay_ms);
+
return dsi_ctx.accum_err;
}
@@ -83,6 +107,18 @@ static int jadard_prepare(struct drm_panel *panel)
if (ret)
return ret;
+ if (jadard->desc->vcioo_to_lp11_delay_ms)
+ msleep(jadard->desc->vcioo_to_lp11_delay_ms);
+
+ if (jadard->desc->lp11_before_reset) {
+ ret = mipi_dsi_dcs_nop(jadard->dsi);
+ if (ret)
+ return ret;
+ }
+
+ if (jadard->desc->lp11_to_reset_delay_ms)
+ msleep(jadard->desc->lp11_to_reset_delay_ms);
+
gpiod_set_value(jadard->reset, 1);
msleep(5);
@@ -106,6 +142,12 @@ static int jadard_unprepare(struct drm_panel *panel)
gpiod_set_value(jadard->reset, 1);
msleep(120);
+ if (jadard->desc->reset_before_power_off_vcioo) {
+ gpiod_set_value(jadard->reset, 0);
+
+ usleep_range(1000, 2000);
+ }
+
regulator_disable(jadard->vdd);
regulator_disable(jadard->vccio);
@@ -569,6 +611,237 @@ static const struct jadard_panel_desc cz101b4001_desc = {
.init = cz101b4001_init_cmds,
};
+static int kingdisplay_kd101ne3_init_cmds(struct jadard *jadard)
+{
+ struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
+
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe1, 0x93);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe2, 0x65);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe3, 0xf8);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x03);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0c, 0x74);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0xc7);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1a, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1b, 0xc7);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1c, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0xfe);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x19);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x28);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x05);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x08);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3a, 0x12);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3c, 0x7e);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3d, 0xff);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3e, 0xff);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3f, 0x7f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x06);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0xa0);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x1e);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x0b);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0x6a);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x0a);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5a, 0x2e);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0x1a);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5c, 0x15);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5d, 0x7f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5e, 0x61);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5f, 0x50);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x3f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x32);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x35);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x38);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x36);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x36);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x54);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x42);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6a, 0x48);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6b, 0x39);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6c, 0x34);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6d, 0x26);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6e, 0x14);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6f, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x7f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x71, 0x61);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x72, 0x50);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x73, 0x43);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x74, 0x3f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0x32);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x35);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x38);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x36);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7a, 0x36);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7b, 0x54);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7c, 0x42);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7d, 0x48);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7e, 0x39);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7f, 0x34);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x26);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x81, 0x14);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x82, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x02);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x52);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x50);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x77);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x05, 0x57);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x06, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x07, 0x4e);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x08, 0x4c);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0a, 0x4a);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0b, 0x48);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0c, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0d, 0x46);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0e, 0x44);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0f, 0x40);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x10, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x11, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x12, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x13, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x14, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x15, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0x53);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x51);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1a, 0x77);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1b, 0x57);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1c, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1d, 0x4f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1e, 0x4d);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1f, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0x4b);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x21, 0x49);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x22, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x23, 0x47);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0x45);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0x41);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x26, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x28, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x29, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2a, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2b, 0x5f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2c, 0x13);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2d, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2e, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2f, 0x01);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x30, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x31, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x32, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x33, 0x0d);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x34, 0x0f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x36, 0x05);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x07);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x09);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3a, 0x0b);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3b, 0x11);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3c, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3d, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3e, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3f, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x42, 0x12);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x45, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x46, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x47, 0x17);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x49, 0x0c);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4a, 0x0e);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4b, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4c, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4d, 0x06);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4e, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4f, 0x08);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x50, 0x0a);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x51, 0x10);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x52, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x53, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x54, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x56, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0x1f);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x40);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0x10);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5c, 0x06);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5d, 0x40);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5e, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5f, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x40);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x03);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x6c);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x6c);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x75);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x08);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0xb4);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x08);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x6c);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6a, 0x6c);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6b, 0x0c);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6d, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6e, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6f, 0x88);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0xbb);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x00);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0x05);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x2a);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x04);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x0e);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0xb3);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x61);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0e, 0x48);
+ mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x00);
+
+ return dsi_ctx.accum_err;
+};
+
+static const struct jadard_panel_desc kingdisplay_kd101ne3_40ti_desc = {
+ .mode = {
+ .clock = (800 + 24 + 24 + 24) * (1280 + 30 + 4 + 8) * 60 / 1000,
+
+ .hdisplay = 800,
+ .hsync_start = 800 + 24,
+ .hsync_end = 800 + 24 + 24,
+ .htotal = 800 + 24 + 24 + 24,
+
+ .vdisplay = 1280,
+ .vsync_start = 1280 + 30,
+ .vsync_end = 1280 + 30 + 4,
+ .vtotal = 1280 + 30 + 4 + 8,
+
+ .width_mm = 135,
+ .height_mm = 216,
+ .type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
+ },
+ .lanes = 4,
+ .format = MIPI_DSI_FMT_RGB888,
+ .init = kingdisplay_kd101ne3_init_cmds,
+ .lp11_before_reset = true,
+ .reset_before_power_off_vcioo = true,
+ .vcioo_to_lp11_delay_ms = 5,
+ .lp11_to_reset_delay_ms = 10,
+ .exit_sleep_to_display_on_delay_ms = 120,
+ .display_on_delay_ms = 20,
+ .backlight_off_to_display_off_delay_ms = 100,
+ .display_off_to_enter_sleep_delay_ms = 50,
+ .enter_sleep_to_reset_down_delay_ms = 100,
+};
+
static int jadard_dsi_probe(struct mipi_dsi_device *dsi)
{
struct device *dev = &dsi->dev;
@@ -637,6 +910,10 @@ static const struct of_device_id jadard_of_match[] = {
.compatible = "chongzhou,cz101b4001",
.data = &cz101b4001_desc
},
+ {
+ .compatible = "kingdisplay,kd101ne3-40ti",
+ .data = &kingdisplay_kd101ne3_40ti_desc
+ },
{
.compatible = "radxa,display-10hd-ad001",
.data = &cz101b4001_desc
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v5 5/5] drm/panel: jd9365da: Add the function of adjusting orientation
2024-06-24 14:19 [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Zhaoxiong Lv
` (3 preceding siblings ...)
2024-06-24 14:19 ` [PATCH v5 4/5] drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel Zhaoxiong Lv
@ 2024-06-24 14:19 ` Zhaoxiong Lv
2024-06-24 16:46 ` Doug Anderson
2024-06-25 0:43 ` Jessica Zhang
2024-06-28 9:07 ` [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Neil Armstrong
5 siblings, 2 replies; 22+ messages in thread
From: Zhaoxiong Lv @ 2024-06-24 14:19 UTC (permalink / raw)
To: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
quic_jesszhan, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel, Zhaoxiong Lv
This driver does not have the function to adjust the orientation,
so this function is added.
Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
---
Changes between V5 and V4:
- 1. Change dev_err() to dev_err_probe().
V4:https://lore.kernel.org/all/20240620080509.18504-5-lvzhaoxiong@huaqin.corp-partner.google.com/
Changes between V4 and V3:
- No changes.
---
drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
index 593e12b31ebd..c6b669866fed 100644
--- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
+++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
@@ -42,7 +42,7 @@ struct jadard {
struct drm_panel panel;
struct mipi_dsi_device *dsi;
const struct jadard_panel_desc *desc;
-
+ enum drm_panel_orientation orientation;
struct regulator *vdd;
struct regulator *vccio;
struct gpio_desc *reset;
@@ -178,12 +178,20 @@ static int jadard_get_modes(struct drm_panel *panel,
return 1;
}
+static enum drm_panel_orientation jadard_panel_get_orientation(struct drm_panel *panel)
+{
+ struct jadard *jadard = panel_to_jadard(panel);
+
+ return jadard->orientation;
+}
+
static const struct drm_panel_funcs jadard_funcs = {
.disable = jadard_disable,
.unprepare = jadard_unprepare,
.prepare = jadard_prepare,
.enable = jadard_enable,
.get_modes = jadard_get_modes,
+ .get_orientation = jadard_panel_get_orientation,
};
static int radxa_display_8hd_ad002_init_cmds(struct jadard *jadard)
@@ -880,6 +888,10 @@ static int jadard_dsi_probe(struct mipi_dsi_device *dsi)
drm_panel_init(&jadard->panel, dev, &jadard_funcs,
DRM_MODE_CONNECTOR_DSI);
+ ret = of_drm_get_panel_orientation(dev->of_node, &jadard->orientation);
+ if (ret < 0)
+ return dev_err_probe(dev, ret, "failed to get orientation\n");
+
ret = drm_panel_of_backlight(&jadard->panel);
if (ret)
return ret;
--
2.17.1
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions
2024-06-24 14:19 ` [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions Zhaoxiong Lv
@ 2024-06-24 15:27 ` Dmitry Baryshkov
2024-06-24 16:31 ` Doug Anderson
2024-06-24 16:39 ` Doug Anderson
2024-06-24 23:59 ` Jessica Zhang
2 siblings, 1 reply; 22+ messages in thread
From: Dmitry Baryshkov @ 2024-06-24 15:27 UTC (permalink / raw)
To: Zhaoxiong Lv
Cc: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
quic_jesszhan, dri-devel, devicetree, linux-kernel
On Mon, Jun 24, 2024 at 10:19:24PM GMT, Zhaoxiong Lv wrote:
> Remove conditional code and always use mipi_dsi_dcs_*multi() wrappers to
> simplify driver's init/enable/exit code.
>
> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
> ---
> .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 793 +++++++++---------
> 1 file changed, 390 insertions(+), 403 deletions(-)
>
> diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> index a9c483a7b3fa..e836260338bf 100644
> --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> @@ -19,17 +19,13 @@
> #include <linux/of.h>
> #include <linux/regulator/consumer.h>
>
> -#define JD9365DA_INIT_CMD_LEN 2
> -
> -struct jadard_init_cmd {
> - u8 data[JD9365DA_INIT_CMD_LEN];
> -};
> +struct jadard;
>
> struct jadard_panel_desc {
> const struct drm_display_mode mode;
> unsigned int lanes;
> enum mipi_dsi_pixel_format format;
> - const struct jadard_init_cmd *init_cmds;
> + int (*init)(struct jadard *jadard);
> u32 num_init_cmds;
> };
>
> @@ -50,46 +46,33 @@ static inline struct jadard *panel_to_jadard(struct drm_panel *panel)
>
> static int jadard_enable(struct drm_panel *panel)
> {
> - struct device *dev = panel->dev;
> struct jadard *jadard = panel_to_jadard(panel);
> - struct mipi_dsi_device *dsi = jadard->dsi;
> - int err;
> + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
>
> msleep(120);
>
> - err = mipi_dsi_dcs_exit_sleep_mode(dsi);
> - if (err < 0)
> - DRM_DEV_ERROR(dev, "failed to exit sleep mode ret = %d\n", err);
> + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
>
> - err = mipi_dsi_dcs_set_display_on(dsi);
> - if (err < 0)
> - DRM_DEV_ERROR(dev, "failed to set display on ret = %d\n", err);
> + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
>
> - return 0;
> + return dsi_ctx.accum_err;
> }
>
> static int jadard_disable(struct drm_panel *panel)
> {
> - struct device *dev = panel->dev;
> struct jadard *jadard = panel_to_jadard(panel);
> - int ret;
> + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
>
> - ret = mipi_dsi_dcs_set_display_off(jadard->dsi);
> - if (ret < 0)
> - DRM_DEV_ERROR(dev, "failed to set display off: %d\n", ret);
> + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
>
> - ret = mipi_dsi_dcs_enter_sleep_mode(jadard->dsi);
> - if (ret < 0)
> - DRM_DEV_ERROR(dev, "failed to enter sleep mode: %d\n", ret);
> + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
>
> - return 0;
> + return dsi_ctx.accum_err;
> }
>
> static int jadard_prepare(struct drm_panel *panel)
> {
> struct jadard *jadard = panel_to_jadard(panel);
> - const struct jadard_panel_desc *desc = jadard->desc;
> - unsigned int i;
> int ret;
>
> ret = regulator_enable(jadard->vccio);
> @@ -109,13 +92,9 @@ static int jadard_prepare(struct drm_panel *panel)
> gpiod_set_value(jadard->reset, 1);
> msleep(130);
>
> - for (i = 0; i < desc->num_init_cmds; i++) {
> - const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> -
> - ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
This function usesd mipi_dsi_dcs_write_buffer()...
> - if (ret < 0)
> - return ret;
> - }
> + ret = jadard->desc->init(jadard);
> + if (ret)
> + return ret;
>
> return 0;
[...]
> +static int radxa_display_8hd_ad002_init_cmds(struct jadard *jadard)
> +{
> + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> +
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
... while your code uses mipi_dsi_dcs_write_seq_multi(), which
internally calls mipi_dsi_generic_write_multi(). These two function use
different packet types to send the payload. To be conservatite, please
use mipi_dsi_dcs_write_buffer_multi().
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE1, 0x93);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE2, 0x65);
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands
2024-06-24 14:19 ` [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands Zhaoxiong Lv
@ 2024-06-24 16:22 ` Doug Anderson
2024-06-24 23:41 ` Jessica Zhang
2024-06-28 8:32 ` neil.armstrong
2 siblings, 0 replies; 22+ messages in thread
From: Doug Anderson @ 2024-06-24 16:22 UTC (permalink / raw)
To: Zhaoxiong Lv
Cc: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, hsinyi, jagan, neil.armstrong, quic_jesszhan,
dmitry.baryshkov, dri-devel, devicetree, linux-kernel
Hi,
On Mon, Jun 24, 2024 at 7:20 AM Zhaoxiong Lv
<lvzhaoxiong@huaqin.corp-partner.google.com> wrote:
>
> Currently, the init_code of the jd9365da driver is placed
> in the enable() function and sent, but this seems to take
> a long time. It takes 17ms to send each instruction (an init
> code consists of about 200 instructions), so it takes
> about 3.5s to send the init_code. So we moved the sending
> of the inti_code to the prepare() function, and each
> instruction seemed to take only 25μs.
>
> We checked the DSI host and found that the difference in
> command sending time is caused by the different modes of
> the DSI host in prepare() and enable() functions.
> Our DSI Host only supports sending cmd in LP mode, The
> prepare() function can directly send init_code (LP->cmd)
> in LP mode, but the enable() function is in HS mode and
> needs to switch to LP mode before sending init code
> (HS->LP->cmd->HS). Therefore, it takes longer to send
> the command.
>
> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
> ---
> Changes between V5 and V4:
> - 1. No changes.
>
> V4:https://lore.kernel.org/all/20240620080509.18504-2-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V4 and V3:
> - 1. Only move mipi_dsi_dcs_write_buffer from enable() function to prepare() function,
> - and no longer use mipi_dsi_dcs_write_seq_multi.
>
> V3:https://lore.kernel.org/all/20240614145510.22965-2-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> ---
> .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 24 +++++++++----------
> 1 file changed, 11 insertions(+), 13 deletions(-)
As mentioned in v4, it would be good if someone with more MIPI history
confirmed that this looks like a reasonable thing to do. However, the
code looks fine so I'll give:
Reviewed-by: Douglas Anderson <dianders@chromium.org>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions
2024-06-24 15:27 ` Dmitry Baryshkov
@ 2024-06-24 16:31 ` Doug Anderson
2024-06-24 16:33 ` Dmitry Baryshkov
0 siblings, 1 reply; 22+ messages in thread
From: Doug Anderson @ 2024-06-24 16:31 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Zhaoxiong Lv, dmitry.torokhov, robh, krzysztof.kozlowski+dt,
conor+dt, jikos, benjamin.tissoires, hsinyi, jagan,
neil.armstrong, quic_jesszhan, dri-devel, devicetree,
linux-kernel
Hi,
On Mon, Jun 24, 2024 at 8:27 AM Dmitry Baryshkov
<dmitry.baryshkov@linaro.org> wrote:
>
> On Mon, Jun 24, 2024 at 10:19:24PM GMT, Zhaoxiong Lv wrote:
> > Remove conditional code and always use mipi_dsi_dcs_*multi() wrappers to
> > simplify driver's init/enable/exit code.
> >
> > Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
> > ---
> > .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 793 +++++++++---------
> > 1 file changed, 390 insertions(+), 403 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> > index a9c483a7b3fa..e836260338bf 100644
> > --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> > +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> > @@ -19,17 +19,13 @@
> > #include <linux/of.h>
> > #include <linux/regulator/consumer.h>
> >
> > -#define JD9365DA_INIT_CMD_LEN 2
> > -
> > -struct jadard_init_cmd {
> > - u8 data[JD9365DA_INIT_CMD_LEN];
> > -};
> > +struct jadard;
> >
> > struct jadard_panel_desc {
> > const struct drm_display_mode mode;
> > unsigned int lanes;
> > enum mipi_dsi_pixel_format format;
> > - const struct jadard_init_cmd *init_cmds;
> > + int (*init)(struct jadard *jadard);
> > u32 num_init_cmds;
> > };
> >
> > @@ -50,46 +46,33 @@ static inline struct jadard *panel_to_jadard(struct drm_panel *panel)
> >
> > static int jadard_enable(struct drm_panel *panel)
> > {
> > - struct device *dev = panel->dev;
> > struct jadard *jadard = panel_to_jadard(panel);
> > - struct mipi_dsi_device *dsi = jadard->dsi;
> > - int err;
> > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> >
> > msleep(120);
> >
> > - err = mipi_dsi_dcs_exit_sleep_mode(dsi);
> > - if (err < 0)
> > - DRM_DEV_ERROR(dev, "failed to exit sleep mode ret = %d\n", err);
> > + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
> >
> > - err = mipi_dsi_dcs_set_display_on(dsi);
> > - if (err < 0)
> > - DRM_DEV_ERROR(dev, "failed to set display on ret = %d\n", err);
> > + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
> >
> > - return 0;
> > + return dsi_ctx.accum_err;
> > }
> >
> > static int jadard_disable(struct drm_panel *panel)
> > {
> > - struct device *dev = panel->dev;
> > struct jadard *jadard = panel_to_jadard(panel);
> > - int ret;
> > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> >
> > - ret = mipi_dsi_dcs_set_display_off(jadard->dsi);
> > - if (ret < 0)
> > - DRM_DEV_ERROR(dev, "failed to set display off: %d\n", ret);
> > + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
> >
> > - ret = mipi_dsi_dcs_enter_sleep_mode(jadard->dsi);
> > - if (ret < 0)
> > - DRM_DEV_ERROR(dev, "failed to enter sleep mode: %d\n", ret);
> > + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
> >
> > - return 0;
> > + return dsi_ctx.accum_err;
> > }
> >
> > static int jadard_prepare(struct drm_panel *panel)
> > {
> > struct jadard *jadard = panel_to_jadard(panel);
> > - const struct jadard_panel_desc *desc = jadard->desc;
> > - unsigned int i;
> > int ret;
> >
> > ret = regulator_enable(jadard->vccio);
> > @@ -109,13 +92,9 @@ static int jadard_prepare(struct drm_panel *panel)
> > gpiod_set_value(jadard->reset, 1);
> > msleep(130);
> >
> > - for (i = 0; i < desc->num_init_cmds; i++) {
> > - const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> > -
> > - ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
>
> This function usesd mipi_dsi_dcs_write_buffer()...
>
> > - if (ret < 0)
> > - return ret;
> > - }
> > + ret = jadard->desc->init(jadard);
> > + if (ret)
> > + return ret;
> >
> > return 0;
>
> [...]
>
> > +static int radxa_display_8hd_ad002_init_cmds(struct jadard *jadard)
> > +{
> > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> > +
> > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
>
> ... while your code uses mipi_dsi_dcs_write_seq_multi(), which
> internally calls mipi_dsi_generic_write_multi(). These two function use
> different packet types to send the payload. To be conservatite, please
> use mipi_dsi_dcs_write_buffer_multi().
Are you certain about this? I see that mipi_dsi_dcs_write_seq_multi()
is just a wrapper on mipi_dsi_dcs_write_buffer_multi(). Specifically,
I see:
#define mipi_dsi_dcs_write_seq_multi(ctx, cmd, seq...) \
do { \
static const u8 d[] = { cmd, seq }; \
mipi_dsi_dcs_write_buffer_multi(ctx, d, ARRAY_SIZE(d)); \
} while (0)
Certainly I could be confused...
-Doug
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions
2024-06-24 16:31 ` Doug Anderson
@ 2024-06-24 16:33 ` Dmitry Baryshkov
0 siblings, 0 replies; 22+ messages in thread
From: Dmitry Baryshkov @ 2024-06-24 16:33 UTC (permalink / raw)
To: Doug Anderson
Cc: Zhaoxiong Lv, dmitry.torokhov, robh, krzysztof.kozlowski+dt,
conor+dt, jikos, benjamin.tissoires, hsinyi, jagan,
neil.armstrong, quic_jesszhan, dri-devel, devicetree,
linux-kernel
On Mon, 24 Jun 2024 at 19:31, Doug Anderson <dianders@google.com> wrote:
>
> Hi,
>
> On Mon, Jun 24, 2024 at 8:27 AM Dmitry Baryshkov
> <dmitry.baryshkov@linaro.org> wrote:
> >
> > On Mon, Jun 24, 2024 at 10:19:24PM GMT, Zhaoxiong Lv wrote:
> > > Remove conditional code and always use mipi_dsi_dcs_*multi() wrappers to
> > > simplify driver's init/enable/exit code.
> > >
> > > Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
> > > ---
> > > .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 793 +++++++++---------
> > > 1 file changed, 390 insertions(+), 403 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> > > index a9c483a7b3fa..e836260338bf 100644
> > > --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> > > +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> > > @@ -19,17 +19,13 @@
> > > #include <linux/of.h>
> > > #include <linux/regulator/consumer.h>
> > >
> > > -#define JD9365DA_INIT_CMD_LEN 2
> > > -
> > > -struct jadard_init_cmd {
> > > - u8 data[JD9365DA_INIT_CMD_LEN];
> > > -};
> > > +struct jadard;
> > >
> > > struct jadard_panel_desc {
> > > const struct drm_display_mode mode;
> > > unsigned int lanes;
> > > enum mipi_dsi_pixel_format format;
> > > - const struct jadard_init_cmd *init_cmds;
> > > + int (*init)(struct jadard *jadard);
> > > u32 num_init_cmds;
> > > };
> > >
> > > @@ -50,46 +46,33 @@ static inline struct jadard *panel_to_jadard(struct drm_panel *panel)
> > >
> > > static int jadard_enable(struct drm_panel *panel)
> > > {
> > > - struct device *dev = panel->dev;
> > > struct jadard *jadard = panel_to_jadard(panel);
> > > - struct mipi_dsi_device *dsi = jadard->dsi;
> > > - int err;
> > > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> > >
> > > msleep(120);
> > >
> > > - err = mipi_dsi_dcs_exit_sleep_mode(dsi);
> > > - if (err < 0)
> > > - DRM_DEV_ERROR(dev, "failed to exit sleep mode ret = %d\n", err);
> > > + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
> > >
> > > - err = mipi_dsi_dcs_set_display_on(dsi);
> > > - if (err < 0)
> > > - DRM_DEV_ERROR(dev, "failed to set display on ret = %d\n", err);
> > > + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
> > >
> > > - return 0;
> > > + return dsi_ctx.accum_err;
> > > }
> > >
> > > static int jadard_disable(struct drm_panel *panel)
> > > {
> > > - struct device *dev = panel->dev;
> > > struct jadard *jadard = panel_to_jadard(panel);
> > > - int ret;
> > > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> > >
> > > - ret = mipi_dsi_dcs_set_display_off(jadard->dsi);
> > > - if (ret < 0)
> > > - DRM_DEV_ERROR(dev, "failed to set display off: %d\n", ret);
> > > + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
> > >
> > > - ret = mipi_dsi_dcs_enter_sleep_mode(jadard->dsi);
> > > - if (ret < 0)
> > > - DRM_DEV_ERROR(dev, "failed to enter sleep mode: %d\n", ret);
> > > + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
> > >
> > > - return 0;
> > > + return dsi_ctx.accum_err;
> > > }
> > >
> > > static int jadard_prepare(struct drm_panel *panel)
> > > {
> > > struct jadard *jadard = panel_to_jadard(panel);
> > > - const struct jadard_panel_desc *desc = jadard->desc;
> > > - unsigned int i;
> > > int ret;
> > >
> > > ret = regulator_enable(jadard->vccio);
> > > @@ -109,13 +92,9 @@ static int jadard_prepare(struct drm_panel *panel)
> > > gpiod_set_value(jadard->reset, 1);
> > > msleep(130);
> > >
> > > - for (i = 0; i < desc->num_init_cmds; i++) {
> > > - const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> > > -
> > > - ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> >
> > This function usesd mipi_dsi_dcs_write_buffer()...
> >
> > > - if (ret < 0)
> > > - return ret;
> > > - }
> > > + ret = jadard->desc->init(jadard);
> > > + if (ret)
> > > + return ret;
> > >
> > > return 0;
> >
> > [...]
> >
> > > +static int radxa_display_8hd_ad002_init_cmds(struct jadard *jadard)
> > > +{
> > > + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> > > +
> > > + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
> >
> > ... while your code uses mipi_dsi_dcs_write_seq_multi(), which
> > internally calls mipi_dsi_generic_write_multi(). These two function use
> > different packet types to send the payload. To be conservatite, please
> > use mipi_dsi_dcs_write_buffer_multi().
>
> Are you certain about this? I see that mipi_dsi_dcs_write_seq_multi()
> is just a wrapper on mipi_dsi_dcs_write_buffer_multi(). Specifically,
> I see:
I see, I was looking at mipi_dsi_generic_write_seq_multi() instead.
Please excuse me.
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>
> #define mipi_dsi_dcs_write_seq_multi(ctx, cmd, seq...) \
> do { \
> static const u8 d[] = { cmd, seq }; \
> mipi_dsi_dcs_write_buffer_multi(ctx, d, ARRAY_SIZE(d)); \
> } while (0)
>
> Certainly I could be confused...
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions
2024-06-24 14:19 ` [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions Zhaoxiong Lv
2024-06-24 15:27 ` Dmitry Baryshkov
@ 2024-06-24 16:39 ` Doug Anderson
2024-06-24 23:59 ` Jessica Zhang
2 siblings, 0 replies; 22+ messages in thread
From: Doug Anderson @ 2024-06-24 16:39 UTC (permalink / raw)
To: Zhaoxiong Lv
Cc: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, hsinyi, jagan, neil.armstrong, quic_jesszhan,
dmitry.baryshkov, dri-devel, devicetree, linux-kernel
Hi,
On Mon, Jun 24, 2024 at 7:21 AM Zhaoxiong Lv
<lvzhaoxiong@huaqin.corp-partner.google.com> wrote:
>
> +static int radxa_display_8hd_ad002_init_cmds(struct jadard *jadard)
> +{
> + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> +
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
nit: could you convert the hex from UPPERCASE to lowercase in this
patch. As an example, 0xE0 above should be 0xe0.
Other than that nit, this looks OK to me:
Reviewed-by: Douglas Anderson <dianders@chromium.org>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 4/5] drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel
2024-06-24 14:19 ` [PATCH v5 4/5] drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel Zhaoxiong Lv
@ 2024-06-24 16:45 ` Doug Anderson
2024-06-25 0:55 ` Jessica Zhang
1 sibling, 0 replies; 22+ messages in thread
From: Doug Anderson @ 2024-06-24 16:45 UTC (permalink / raw)
To: Zhaoxiong Lv
Cc: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, hsinyi, jagan, neil.armstrong, quic_jesszhan,
dmitry.baryshkov, dri-devel, devicetree, linux-kernel
Hi,
On Mon, Jun 24, 2024 at 7:21 AM Zhaoxiong Lv
<lvzhaoxiong@huaqin.corp-partner.google.com> wrote:
>
> The K&d kd101ne3-40ti is a 10.1" WXGA TFT-LCD panel, use
> jd9365da controller,which fits in nicely with the existing
> panel-jadard-jd9365da-h3 driver.Hence,we add a new compatible
> with panel specific config.
>
> Although they have the same control IC, the two panels are different,
> and the timing will be slightly different, so we added some variables
> in struct jadard_panel_desc to control the timing.
>
> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
> ---
> Changes between V5 and V4:
> - 1. Add a "_ms" suffix to the variables.
> - 2. Use more "_multi" in the enable/disable function
> - 3. Use mipi_dsi_dcs_write_seq_multi() in the init() function.
>
> V4:https://lore.kernel.org/all/20240620080509.18504-4-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V4 and V3:
> - 1. Use mipi_dsi_msleep.
> - 2. Adjust the ".clock" assignment format.
> - 3. Adjust "compatible" positions to keep the list sorted.
>
> V3:https://lore.kernel.org/all/20240614145510.22965-4-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V3 and V2:
> - 1. Give up creating a new driver and re-add K&d kd101ne3-40ti
> - configuration to the panel-jadard-jd9365da-h3.c driver.
>
> V2:https://lore.kernel.org/all/20240601084528.22502-3-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V2 and V1:
> - 1. Use the new mipi_dsi_dcs_write_seq_multi() function.
> - 2. Modify Move mipi_dsi_dcs_set_display_off() and mipi_dsi_dcs_enter_sleep_mode() to disable(),
> - and drop kingdisplay_panel_enter_sleep_mode().
> - 3. If prepare fails, disable GPIO before regulators.
> - 4. This function drm_connector_set_panel_orientation() is no longer used. Delete it.
> - 5. Drop ".shutdown = kingdisplay_panel_shutdown".
>
> ---
> .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 277 ++++++++++++++++++
> 1 file changed, 277 insertions(+)
It still seems weird to me that the other variants of the same panel
don't need similar delays, but the code looks fine to me now:
Reviewed-by: Douglas Anderson <dianders@chromium.org>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 5/5] drm/panel: jd9365da: Add the function of adjusting orientation
2024-06-24 14:19 ` [PATCH v5 5/5] drm/panel: jd9365da: Add the function of adjusting orientation Zhaoxiong Lv
@ 2024-06-24 16:46 ` Doug Anderson
2024-06-25 0:43 ` Jessica Zhang
1 sibling, 0 replies; 22+ messages in thread
From: Doug Anderson @ 2024-06-24 16:46 UTC (permalink / raw)
To: Zhaoxiong Lv
Cc: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, hsinyi, jagan, neil.armstrong, quic_jesszhan,
dmitry.baryshkov, dri-devel, devicetree, linux-kernel
Hi,
On Mon, Jun 24, 2024 at 7:21 AM Zhaoxiong Lv
<lvzhaoxiong@huaqin.corp-partner.google.com> wrote:
>
> This driver does not have the function to adjust the orientation,
> so this function is added.
>
> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
> ---
> Changes between V5 and V4:
> - 1. Change dev_err() to dev_err_probe().
>
> V4:https://lore.kernel.org/all/20240620080509.18504-5-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V4 and V3:
> - No changes.
>
> ---
> drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
Reviewed-by: Douglas Anderson <dianders@chromium.org>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands
2024-06-24 14:19 ` [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands Zhaoxiong Lv
2024-06-24 16:22 ` Doug Anderson
@ 2024-06-24 23:41 ` Jessica Zhang
2024-06-25 12:13 ` zhaoxiong lv
2024-06-28 8:32 ` neil.armstrong
2 siblings, 1 reply; 22+ messages in thread
From: Jessica Zhang @ 2024-06-24 23:41 UTC (permalink / raw)
To: Zhaoxiong Lv, dmitry.torokhov, robh, krzysztof.kozlowski+dt,
conor+dt, jikos, benjamin.tissoires, dianders, hsinyi, jagan,
neil.armstrong, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel
On 6/24/2024 7:19 AM, Zhaoxiong Lv wrote:
> Currently, the init_code of the jd9365da driver is placed
> in the enable() function and sent, but this seems to take
> a long time. It takes 17ms to send each instruction (an init
> code consists of about 200 instructions), so it takes
> about 3.5s to send the init_code. So we moved the sending
> of the inti_code to the prepare() function, and each
> instruction seemed to take only 25μs.
>
> We checked the DSI host and found that the difference in
> command sending time is caused by the different modes of
> the DSI host in prepare() and enable() functions.
> Our DSI Host only supports sending cmd in LP mode, The
> prepare() function can directly send init_code (LP->cmd)
> in LP mode, but the enable() function is in HS mode and
> needs to switch to LP mode before sending init code
> (HS->LP->cmd->HS). Therefore, it takes longer to send
> the command.
>
> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
Hi Zhaoxiong,
Just curious, if the host expects that commands are sent in LP mode, why
isn't the MIPI_DSI_MODE_LPM flag set before sending the DCS commands?
Thanks,
Jessica Zhang
> ---
> Changes between V5 and V4:
> - 1. No changes.
>
> V4:https://lore.kernel.org/all/20240620080509.18504-2-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V4 and V3:
> - 1. Only move mipi_dsi_dcs_write_buffer from enable() function to prepare() function,
> - and no longer use mipi_dsi_dcs_write_seq_multi.
>
> V3:https://lore.kernel.org/all/20240614145510.22965-2-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> ---
> .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 24 +++++++++----------
> 1 file changed, 11 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> index 4879835fe101..a9c483a7b3fa 100644
> --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> @@ -52,21 +52,9 @@ static int jadard_enable(struct drm_panel *panel)
> {
> struct device *dev = panel->dev;
> struct jadard *jadard = panel_to_jadard(panel);
> - const struct jadard_panel_desc *desc = jadard->desc;
> struct mipi_dsi_device *dsi = jadard->dsi;
> - unsigned int i;
> int err;
>
> - msleep(10);
> -
> - for (i = 0; i < desc->num_init_cmds; i++) {
> - const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> -
> - err = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> - if (err < 0)
> - return err;
> - }
> -
> msleep(120);
>
> err = mipi_dsi_dcs_exit_sleep_mode(dsi);
> @@ -100,6 +88,8 @@ static int jadard_disable(struct drm_panel *panel)
> static int jadard_prepare(struct drm_panel *panel)
> {
> struct jadard *jadard = panel_to_jadard(panel);
> + const struct jadard_panel_desc *desc = jadard->desc;
> + unsigned int i;
> int ret;
>
> ret = regulator_enable(jadard->vccio);
> @@ -117,7 +107,15 @@ static int jadard_prepare(struct drm_panel *panel)
> msleep(10);
>
> gpiod_set_value(jadard->reset, 1);
> - msleep(120);
> + msleep(130);
> +
> + for (i = 0; i < desc->num_init_cmds; i++) {
> + const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> +
> + ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> + if (ret < 0)
> + return ret;
> + }
>
> return 0;
> }
> --
> 2.17.1
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions
2024-06-24 14:19 ` [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions Zhaoxiong Lv
2024-06-24 15:27 ` Dmitry Baryshkov
2024-06-24 16:39 ` Doug Anderson
@ 2024-06-24 23:59 ` Jessica Zhang
2 siblings, 0 replies; 22+ messages in thread
From: Jessica Zhang @ 2024-06-24 23:59 UTC (permalink / raw)
To: Zhaoxiong Lv, dmitry.torokhov, robh, krzysztof.kozlowski+dt,
conor+dt, jikos, benjamin.tissoires, dianders, hsinyi, jagan,
neil.armstrong, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel
On 6/24/2024 7:19 AM, Zhaoxiong Lv wrote:
> Remove conditional code and always use mipi_dsi_dcs_*multi() wrappers to
> simplify driver's init/enable/exit code.
>
> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 793 +++++++++---------
> 1 file changed, 390 insertions(+), 403 deletions(-)
>
> diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> index a9c483a7b3fa..e836260338bf 100644
> --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> @@ -19,17 +19,13 @@
> #include <linux/of.h>
> #include <linux/regulator/consumer.h>
>
> -#define JD9365DA_INIT_CMD_LEN 2
> -
> -struct jadard_init_cmd {
> - u8 data[JD9365DA_INIT_CMD_LEN];
> -};
> +struct jadard;
>
> struct jadard_panel_desc {
> const struct drm_display_mode mode;
> unsigned int lanes;
> enum mipi_dsi_pixel_format format;
> - const struct jadard_init_cmd *init_cmds;
> + int (*init)(struct jadard *jadard);
> u32 num_init_cmds;
> };
>
> @@ -50,46 +46,33 @@ static inline struct jadard *panel_to_jadard(struct drm_panel *panel)
>
> static int jadard_enable(struct drm_panel *panel)
> {
> - struct device *dev = panel->dev;
> struct jadard *jadard = panel_to_jadard(panel);
> - struct mipi_dsi_device *dsi = jadard->dsi;
> - int err;
> + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
>
> msleep(120);
>
> - err = mipi_dsi_dcs_exit_sleep_mode(dsi);
> - if (err < 0)
> - DRM_DEV_ERROR(dev, "failed to exit sleep mode ret = %d\n", err);
> + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
>
> - err = mipi_dsi_dcs_set_display_on(dsi);
> - if (err < 0)
> - DRM_DEV_ERROR(dev, "failed to set display on ret = %d\n", err);
> + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
>
> - return 0;
> + return dsi_ctx.accum_err;
> }
>
> static int jadard_disable(struct drm_panel *panel)
> {
> - struct device *dev = panel->dev;
> struct jadard *jadard = panel_to_jadard(panel);
> - int ret;
> + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
>
> - ret = mipi_dsi_dcs_set_display_off(jadard->dsi);
> - if (ret < 0)
> - DRM_DEV_ERROR(dev, "failed to set display off: %d\n", ret);
> + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
>
> - ret = mipi_dsi_dcs_enter_sleep_mode(jadard->dsi);
> - if (ret < 0)
> - DRM_DEV_ERROR(dev, "failed to enter sleep mode: %d\n", ret);
> + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
>
> - return 0;
> + return dsi_ctx.accum_err;
> }
>
> static int jadard_prepare(struct drm_panel *panel)
> {
> struct jadard *jadard = panel_to_jadard(panel);
> - const struct jadard_panel_desc *desc = jadard->desc;
> - unsigned int i;
> int ret;
>
> ret = regulator_enable(jadard->vccio);
> @@ -109,13 +92,9 @@ static int jadard_prepare(struct drm_panel *panel)
> gpiod_set_value(jadard->reset, 1);
> msleep(130);
>
> - for (i = 0; i < desc->num_init_cmds; i++) {
> - const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> -
> - ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> - if (ret < 0)
> - return ret;
> - }
> + ret = jadard->desc->init(jadard);
> + if (ret)
> + return ret;
>
> return 0;
> }
> @@ -165,176 +144,181 @@ static const struct drm_panel_funcs jadard_funcs = {
> .get_modes = jadard_get_modes,
> };
>
> -static const struct jadard_init_cmd radxa_display_8hd_ad002_init_cmds[] = {
> - { .data = { 0xE0, 0x00 } },
> - { .data = { 0xE1, 0x93 } },
> - { .data = { 0xE2, 0x65 } },
> - { .data = { 0xE3, 0xF8 } },
> - { .data = { 0x80, 0x03 } },
> - { .data = { 0xE0, 0x01 } },
> - { .data = { 0x00, 0x00 } },
> - { .data = { 0x01, 0x7E } },
> - { .data = { 0x03, 0x00 } },
> - { .data = { 0x04, 0x65 } },
> - { .data = { 0x0C, 0x74 } },
> - { .data = { 0x17, 0x00 } },
> - { .data = { 0x18, 0xB7 } },
> - { .data = { 0x19, 0x00 } },
> - { .data = { 0x1A, 0x00 } },
> - { .data = { 0x1B, 0xB7 } },
> - { .data = { 0x1C, 0x00 } },
> - { .data = { 0x24, 0xFE } },
> - { .data = { 0x37, 0x19 } },
> - { .data = { 0x38, 0x05 } },
> - { .data = { 0x39, 0x00 } },
> - { .data = { 0x3A, 0x01 } },
> - { .data = { 0x3B, 0x01 } },
> - { .data = { 0x3C, 0x70 } },
> - { .data = { 0x3D, 0xFF } },
> - { .data = { 0x3E, 0xFF } },
> - { .data = { 0x3F, 0xFF } },
> - { .data = { 0x40, 0x06 } },
> - { .data = { 0x41, 0xA0 } },
> - { .data = { 0x43, 0x1E } },
> - { .data = { 0x44, 0x0F } },
> - { .data = { 0x45, 0x28 } },
> - { .data = { 0x4B, 0x04 } },
> - { .data = { 0x55, 0x02 } },
> - { .data = { 0x56, 0x01 } },
> - { .data = { 0x57, 0xA9 } },
> - { .data = { 0x58, 0x0A } },
> - { .data = { 0x59, 0x0A } },
> - { .data = { 0x5A, 0x37 } },
> - { .data = { 0x5B, 0x19 } },
> - { .data = { 0x5D, 0x78 } },
> - { .data = { 0x5E, 0x63 } },
> - { .data = { 0x5F, 0x54 } },
> - { .data = { 0x60, 0x49 } },
> - { .data = { 0x61, 0x45 } },
> - { .data = { 0x62, 0x38 } },
> - { .data = { 0x63, 0x3D } },
> - { .data = { 0x64, 0x28 } },
> - { .data = { 0x65, 0x43 } },
> - { .data = { 0x66, 0x41 } },
> - { .data = { 0x67, 0x43 } },
> - { .data = { 0x68, 0x62 } },
> - { .data = { 0x69, 0x50 } },
> - { .data = { 0x6A, 0x57 } },
> - { .data = { 0x6B, 0x49 } },
> - { .data = { 0x6C, 0x44 } },
> - { .data = { 0x6D, 0x37 } },
> - { .data = { 0x6E, 0x23 } },
> - { .data = { 0x6F, 0x10 } },
> - { .data = { 0x70, 0x78 } },
> - { .data = { 0x71, 0x63 } },
> - { .data = { 0x72, 0x54 } },
> - { .data = { 0x73, 0x49 } },
> - { .data = { 0x74, 0x45 } },
> - { .data = { 0x75, 0x38 } },
> - { .data = { 0x76, 0x3D } },
> - { .data = { 0x77, 0x28 } },
> - { .data = { 0x78, 0x43 } },
> - { .data = { 0x79, 0x41 } },
> - { .data = { 0x7A, 0x43 } },
> - { .data = { 0x7B, 0x62 } },
> - { .data = { 0x7C, 0x50 } },
> - { .data = { 0x7D, 0x57 } },
> - { .data = { 0x7E, 0x49 } },
> - { .data = { 0x7F, 0x44 } },
> - { .data = { 0x80, 0x37 } },
> - { .data = { 0x81, 0x23 } },
> - { .data = { 0x82, 0x10 } },
> - { .data = { 0xE0, 0x02 } },
> - { .data = { 0x00, 0x47 } },
> - { .data = { 0x01, 0x47 } },
> - { .data = { 0x02, 0x45 } },
> - { .data = { 0x03, 0x45 } },
> - { .data = { 0x04, 0x4B } },
> - { .data = { 0x05, 0x4B } },
> - { .data = { 0x06, 0x49 } },
> - { .data = { 0x07, 0x49 } },
> - { .data = { 0x08, 0x41 } },
> - { .data = { 0x09, 0x1F } },
> - { .data = { 0x0A, 0x1F } },
> - { .data = { 0x0B, 0x1F } },
> - { .data = { 0x0C, 0x1F } },
> - { .data = { 0x0D, 0x1F } },
> - { .data = { 0x0E, 0x1F } },
> - { .data = { 0x0F, 0x5F } },
> - { .data = { 0x10, 0x5F } },
> - { .data = { 0x11, 0x57 } },
> - { .data = { 0x12, 0x77 } },
> - { .data = { 0x13, 0x35 } },
> - { .data = { 0x14, 0x1F } },
> - { .data = { 0x15, 0x1F } },
> - { .data = { 0x16, 0x46 } },
> - { .data = { 0x17, 0x46 } },
> - { .data = { 0x18, 0x44 } },
> - { .data = { 0x19, 0x44 } },
> - { .data = { 0x1A, 0x4A } },
> - { .data = { 0x1B, 0x4A } },
> - { .data = { 0x1C, 0x48 } },
> - { .data = { 0x1D, 0x48 } },
> - { .data = { 0x1E, 0x40 } },
> - { .data = { 0x1F, 0x1F } },
> - { .data = { 0x20, 0x1F } },
> - { .data = { 0x21, 0x1F } },
> - { .data = { 0x22, 0x1F } },
> - { .data = { 0x23, 0x1F } },
> - { .data = { 0x24, 0x1F } },
> - { .data = { 0x25, 0x5F } },
> - { .data = { 0x26, 0x5F } },
> - { .data = { 0x27, 0x57 } },
> - { .data = { 0x28, 0x77 } },
> - { .data = { 0x29, 0x35 } },
> - { .data = { 0x2A, 0x1F } },
> - { .data = { 0x2B, 0x1F } },
> - { .data = { 0x58, 0x40 } },
> - { .data = { 0x59, 0x00 } },
> - { .data = { 0x5A, 0x00 } },
> - { .data = { 0x5B, 0x10 } },
> - { .data = { 0x5C, 0x06 } },
> - { .data = { 0x5D, 0x40 } },
> - { .data = { 0x5E, 0x01 } },
> - { .data = { 0x5F, 0x02 } },
> - { .data = { 0x60, 0x30 } },
> - { .data = { 0x61, 0x01 } },
> - { .data = { 0x62, 0x02 } },
> - { .data = { 0x63, 0x03 } },
> - { .data = { 0x64, 0x6B } },
> - { .data = { 0x65, 0x05 } },
> - { .data = { 0x66, 0x0C } },
> - { .data = { 0x67, 0x73 } },
> - { .data = { 0x68, 0x09 } },
> - { .data = { 0x69, 0x03 } },
> - { .data = { 0x6A, 0x56 } },
> - { .data = { 0x6B, 0x08 } },
> - { .data = { 0x6C, 0x00 } },
> - { .data = { 0x6D, 0x04 } },
> - { .data = { 0x6E, 0x04 } },
> - { .data = { 0x6F, 0x88 } },
> - { .data = { 0x70, 0x00 } },
> - { .data = { 0x71, 0x00 } },
> - { .data = { 0x72, 0x06 } },
> - { .data = { 0x73, 0x7B } },
> - { .data = { 0x74, 0x00 } },
> - { .data = { 0x75, 0xF8 } },
> - { .data = { 0x76, 0x00 } },
> - { .data = { 0x77, 0xD5 } },
> - { .data = { 0x78, 0x2E } },
> - { .data = { 0x79, 0x12 } },
> - { .data = { 0x7A, 0x03 } },
> - { .data = { 0x7B, 0x00 } },
> - { .data = { 0x7C, 0x00 } },
> - { .data = { 0x7D, 0x03 } },
> - { .data = { 0x7E, 0x7B } },
> - { .data = { 0xE0, 0x04 } },
> - { .data = { 0x00, 0x0E } },
> - { .data = { 0x02, 0xB3 } },
> - { .data = { 0x09, 0x60 } },
> - { .data = { 0x0E, 0x2A } },
> - { .data = { 0x36, 0x59 } },
> - { .data = { 0xE0, 0x00 } },
> +static int radxa_display_8hd_ad002_init_cmds(struct jadard *jadard)
> +{
> + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> +
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE1, 0x93);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE2, 0x65);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE3, 0xF8);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x03);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x7E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x65);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0C, 0x74);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0xB7);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1A, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1B, 0xB7);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1C, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0xFE);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x19);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x05);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3A, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3B, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3C, 0x70);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3D, 0xFF);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3E, 0xFF);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3F, 0xFF);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x06);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0xA0);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x1E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x0F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x45, 0x28);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4B, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x56, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0xA9);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x0A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x0A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5A, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5B, 0x19);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5D, 0x78);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5E, 0x63);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5F, 0x54);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x49);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x45);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x38);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x3D);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x28);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x41);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x62);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x50);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6A, 0x57);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6B, 0x49);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6C, 0x44);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6D, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6E, 0x23);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6F, 0x10);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x78);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x71, 0x63);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x72, 0x54);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x73, 0x49);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x74, 0x45);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0x38);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x3D);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0x28);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x41);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7A, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7B, 0x62);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7C, 0x50);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7D, 0x57);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7E, 0x49);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7F, 0x44);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x81, 0x23);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x82, 0x10);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x47);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x47);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0x45);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x45);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x4B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x05, 0x4B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x06, 0x49);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x07, 0x49);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x08, 0x41);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0A, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0B, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0C, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0D, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0E, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0F, 0x5F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x10, 0x5F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x11, 0x57);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x12, 0x77);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x13, 0x35);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x14, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x15, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0x46);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x46);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0x44);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x44);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1A, 0x4A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1B, 0x4A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1C, 0x48);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1D, 0x48);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1E, 0x40);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1F, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x21, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x22, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x23, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0x5F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x26, 0x5F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0x57);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x28, 0x77);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x29, 0x35);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2A, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2B, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x40);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5A, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5B, 0x10);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5C, 0x06);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5D, 0x40);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5E, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5F, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x30);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x03);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x6B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x05);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x0C);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x73);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x09);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x03);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6A, 0x56);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6B, 0x08);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6C, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6D, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6E, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6F, 0x88);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x71, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x72, 0x06);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x73, 0x7B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x74, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0xF8);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0xD5);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x2E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x12);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7A, 0x03);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7B, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7C, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7D, 0x03);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7E, 0x7B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x0E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0xB3);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x60);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0E, 0x2A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x36, 0x59);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
> +
> + return dsi_ctx.accum_err;
> };
>
> static const struct jadard_panel_desc radxa_display_8hd_ad002_desc = {
> @@ -357,205 +341,209 @@ static const struct jadard_panel_desc radxa_display_8hd_ad002_desc = {
> },
> .lanes = 4,
> .format = MIPI_DSI_FMT_RGB888,
> - .init_cmds = radxa_display_8hd_ad002_init_cmds,
> - .num_init_cmds = ARRAY_SIZE(radxa_display_8hd_ad002_init_cmds),
> + .init = radxa_display_8hd_ad002_init_cmds,
> };
>
> -static const struct jadard_init_cmd cz101b4001_init_cmds[] = {
> - { .data = { 0xE0, 0x00 } },
> - { .data = { 0xE1, 0x93 } },
> - { .data = { 0xE2, 0x65 } },
> - { .data = { 0xE3, 0xF8 } },
> - { .data = { 0x80, 0x03 } },
> - { .data = { 0xE0, 0x01 } },
> - { .data = { 0x00, 0x00 } },
> - { .data = { 0x01, 0x3B } },
> - { .data = { 0x0C, 0x74 } },
> - { .data = { 0x17, 0x00 } },
> - { .data = { 0x18, 0xAF } },
> - { .data = { 0x19, 0x00 } },
> - { .data = { 0x1A, 0x00 } },
> - { .data = { 0x1B, 0xAF } },
> - { .data = { 0x1C, 0x00 } },
> - { .data = { 0x35, 0x26 } },
> - { .data = { 0x37, 0x09 } },
> - { .data = { 0x38, 0x04 } },
> - { .data = { 0x39, 0x00 } },
> - { .data = { 0x3A, 0x01 } },
> - { .data = { 0x3C, 0x78 } },
> - { .data = { 0x3D, 0xFF } },
> - { .data = { 0x3E, 0xFF } },
> - { .data = { 0x3F, 0x7F } },
> - { .data = { 0x40, 0x06 } },
> - { .data = { 0x41, 0xA0 } },
> - { .data = { 0x42, 0x81 } },
> - { .data = { 0x43, 0x14 } },
> - { .data = { 0x44, 0x23 } },
> - { .data = { 0x45, 0x28 } },
> - { .data = { 0x55, 0x02 } },
> - { .data = { 0x57, 0x69 } },
> - { .data = { 0x59, 0x0A } },
> - { .data = { 0x5A, 0x2A } },
> - { .data = { 0x5B, 0x17 } },
> - { .data = { 0x5D, 0x7F } },
> - { .data = { 0x5E, 0x6B } },
> - { .data = { 0x5F, 0x5C } },
> - { .data = { 0x60, 0x4F } },
> - { .data = { 0x61, 0x4D } },
> - { .data = { 0x62, 0x3F } },
> - { .data = { 0x63, 0x42 } },
> - { .data = { 0x64, 0x2B } },
> - { .data = { 0x65, 0x44 } },
> - { .data = { 0x66, 0x43 } },
> - { .data = { 0x67, 0x43 } },
> - { .data = { 0x68, 0x63 } },
> - { .data = { 0x69, 0x52 } },
> - { .data = { 0x6A, 0x5A } },
> - { .data = { 0x6B, 0x4F } },
> - { .data = { 0x6C, 0x4E } },
> - { .data = { 0x6D, 0x20 } },
> - { .data = { 0x6E, 0x0F } },
> - { .data = { 0x6F, 0x00 } },
> - { .data = { 0x70, 0x7F } },
> - { .data = { 0x71, 0x6B } },
> - { .data = { 0x72, 0x5C } },
> - { .data = { 0x73, 0x4F } },
> - { .data = { 0x74, 0x4D } },
> - { .data = { 0x75, 0x3F } },
> - { .data = { 0x76, 0x42 } },
> - { .data = { 0x77, 0x2B } },
> - { .data = { 0x78, 0x44 } },
> - { .data = { 0x79, 0x43 } },
> - { .data = { 0x7A, 0x43 } },
> - { .data = { 0x7B, 0x63 } },
> - { .data = { 0x7C, 0x52 } },
> - { .data = { 0x7D, 0x5A } },
> - { .data = { 0x7E, 0x4F } },
> - { .data = { 0x7F, 0x4E } },
> - { .data = { 0x80, 0x20 } },
> - { .data = { 0x81, 0x0F } },
> - { .data = { 0x82, 0x00 } },
> - { .data = { 0xE0, 0x02 } },
> - { .data = { 0x00, 0x02 } },
> - { .data = { 0x01, 0x02 } },
> - { .data = { 0x02, 0x00 } },
> - { .data = { 0x03, 0x00 } },
> - { .data = { 0x04, 0x1E } },
> - { .data = { 0x05, 0x1E } },
> - { .data = { 0x06, 0x1F } },
> - { .data = { 0x07, 0x1F } },
> - { .data = { 0x08, 0x1F } },
> - { .data = { 0x09, 0x17 } },
> - { .data = { 0x0A, 0x17 } },
> - { .data = { 0x0B, 0x37 } },
> - { .data = { 0x0C, 0x37 } },
> - { .data = { 0x0D, 0x47 } },
> - { .data = { 0x0E, 0x47 } },
> - { .data = { 0x0F, 0x45 } },
> - { .data = { 0x10, 0x45 } },
> - { .data = { 0x11, 0x4B } },
> - { .data = { 0x12, 0x4B } },
> - { .data = { 0x13, 0x49 } },
> - { .data = { 0x14, 0x49 } },
> - { .data = { 0x15, 0x1F } },
> - { .data = { 0x16, 0x01 } },
> - { .data = { 0x17, 0x01 } },
> - { .data = { 0x18, 0x00 } },
> - { .data = { 0x19, 0x00 } },
> - { .data = { 0x1A, 0x1E } },
> - { .data = { 0x1B, 0x1E } },
> - { .data = { 0x1C, 0x1F } },
> - { .data = { 0x1D, 0x1F } },
> - { .data = { 0x1E, 0x1F } },
> - { .data = { 0x1F, 0x17 } },
> - { .data = { 0x20, 0x17 } },
> - { .data = { 0x21, 0x37 } },
> - { .data = { 0x22, 0x37 } },
> - { .data = { 0x23, 0x46 } },
> - { .data = { 0x24, 0x46 } },
> - { .data = { 0x25, 0x44 } },
> - { .data = { 0x26, 0x44 } },
> - { .data = { 0x27, 0x4A } },
> - { .data = { 0x28, 0x4A } },
> - { .data = { 0x29, 0x48 } },
> - { .data = { 0x2A, 0x48 } },
> - { .data = { 0x2B, 0x1F } },
> - { .data = { 0x2C, 0x01 } },
> - { .data = { 0x2D, 0x01 } },
> - { .data = { 0x2E, 0x00 } },
> - { .data = { 0x2F, 0x00 } },
> - { .data = { 0x30, 0x1F } },
> - { .data = { 0x31, 0x1F } },
> - { .data = { 0x32, 0x1E } },
> - { .data = { 0x33, 0x1E } },
> - { .data = { 0x34, 0x1F } },
> - { .data = { 0x35, 0x17 } },
> - { .data = { 0x36, 0x17 } },
> - { .data = { 0x37, 0x37 } },
> - { .data = { 0x38, 0x37 } },
> - { .data = { 0x39, 0x08 } },
> - { .data = { 0x3A, 0x08 } },
> - { .data = { 0x3B, 0x0A } },
> - { .data = { 0x3C, 0x0A } },
> - { .data = { 0x3D, 0x04 } },
> - { .data = { 0x3E, 0x04 } },
> - { .data = { 0x3F, 0x06 } },
> - { .data = { 0x40, 0x06 } },
> - { .data = { 0x41, 0x1F } },
> - { .data = { 0x42, 0x02 } },
> - { .data = { 0x43, 0x02 } },
> - { .data = { 0x44, 0x00 } },
> - { .data = { 0x45, 0x00 } },
> - { .data = { 0x46, 0x1F } },
> - { .data = { 0x47, 0x1F } },
> - { .data = { 0x48, 0x1E } },
> - { .data = { 0x49, 0x1E } },
> - { .data = { 0x4A, 0x1F } },
> - { .data = { 0x4B, 0x17 } },
> - { .data = { 0x4C, 0x17 } },
> - { .data = { 0x4D, 0x37 } },
> - { .data = { 0x4E, 0x37 } },
> - { .data = { 0x4F, 0x09 } },
> - { .data = { 0x50, 0x09 } },
> - { .data = { 0x51, 0x0B } },
> - { .data = { 0x52, 0x0B } },
> - { .data = { 0x53, 0x05 } },
> - { .data = { 0x54, 0x05 } },
> - { .data = { 0x55, 0x07 } },
> - { .data = { 0x56, 0x07 } },
> - { .data = { 0x57, 0x1F } },
> - { .data = { 0x58, 0x40 } },
> - { .data = { 0x5B, 0x30 } },
> - { .data = { 0x5C, 0x16 } },
> - { .data = { 0x5D, 0x34 } },
> - { .data = { 0x5E, 0x05 } },
> - { .data = { 0x5F, 0x02 } },
> - { .data = { 0x63, 0x00 } },
> - { .data = { 0x64, 0x6A } },
> - { .data = { 0x67, 0x73 } },
> - { .data = { 0x68, 0x1D } },
> - { .data = { 0x69, 0x08 } },
> - { .data = { 0x6A, 0x6A } },
> - { .data = { 0x6B, 0x08 } },
> - { .data = { 0x6C, 0x00 } },
> - { .data = { 0x6D, 0x00 } },
> - { .data = { 0x6E, 0x00 } },
> - { .data = { 0x6F, 0x88 } },
> - { .data = { 0x75, 0xFF } },
> - { .data = { 0x77, 0xDD } },
> - { .data = { 0x78, 0x3F } },
> - { .data = { 0x79, 0x15 } },
> - { .data = { 0x7A, 0x17 } },
> - { .data = { 0x7D, 0x14 } },
> - { .data = { 0x7E, 0x82 } },
> - { .data = { 0xE0, 0x04 } },
> - { .data = { 0x00, 0x0E } },
> - { .data = { 0x02, 0xB3 } },
> - { .data = { 0x09, 0x61 } },
> - { .data = { 0x0E, 0x48 } },
> - { .data = { 0xE0, 0x00 } },
> - { .data = { 0xE6, 0x02 } },
> - { .data = { 0xE7, 0x0C } },
> +static int cz101b4001_init_cmds(struct jadard *jadard)
> +{
> + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> +
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE1, 0x93);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE2, 0x65);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE3, 0xF8);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x03);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x3B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0C, 0x74);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0xAF);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1A, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1B, 0xAF);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1C, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x26);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x09);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3A, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3C, 0x78);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3D, 0xFF);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3E, 0xFF);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3F, 0x7F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x06);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0xA0);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x42, 0x81);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x14);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x23);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x45, 0x28);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0x69);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x0A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5A, 0x2A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5B, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5D, 0x7F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5E, 0x6B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5F, 0x5C);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x4F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x4D);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x3F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x42);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x2B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x44);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x63);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x52);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6A, 0x5A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6B, 0x4F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6C, 0x4E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6D, 0x20);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6E, 0x0F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6F, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x7F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x71, 0x6B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x72, 0x5C);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x73, 0x4F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x74, 0x4D);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0x3F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x42);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0x2B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x44);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7A, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7B, 0x63);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7C, 0x52);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7D, 0x5A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7E, 0x4F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7F, 0x4E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x20);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x81, 0x0F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x82, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x1E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x05, 0x1E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x06, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x07, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x08, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0A, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0B, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0C, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0D, 0x47);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0E, 0x47);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0F, 0x45);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x10, 0x45);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x11, 0x4B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x12, 0x4B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x13, 0x49);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x14, 0x49);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x15, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1A, 0x1E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1B, 0x1E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1C, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1D, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1E, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1F, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x21, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x22, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x23, 0x46);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0x46);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0x44);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x26, 0x44);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0x4A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x28, 0x4A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x29, 0x48);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2A, 0x48);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2B, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2C, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2D, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2E, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2F, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x30, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x31, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x32, 0x1E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x33, 0x1E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x34, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x36, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x08);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3A, 0x08);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3B, 0x0A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3C, 0x0A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3D, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3E, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3F, 0x06);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x06);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x42, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x45, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x46, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x47, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x1E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x49, 0x1E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4A, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4B, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4C, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4D, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4E, 0x37);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4F, 0x09);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x50, 0x09);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x51, 0x0B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x52, 0x0B);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x53, 0x05);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x54, 0x05);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x07);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x56, 0x07);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0x1F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x40);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5B, 0x30);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5C, 0x16);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5D, 0x34);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5E, 0x05);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5F, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x6A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x73);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x1D);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x08);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6A, 0x6A);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6B, 0x08);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6C, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6D, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6E, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6F, 0x88);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0xFF);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0xDD);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x3F);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x15);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7A, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7D, 0x14);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7E, 0x82);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x0E);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0xB3);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x61);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0E, 0x48);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE0, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE6, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xE7, 0x0C);
> +
> + return dsi_ctx.accum_err;
> };
>
> static const struct jadard_panel_desc cz101b4001_desc = {
> @@ -578,8 +566,7 @@ static const struct jadard_panel_desc cz101b4001_desc = {
> },
> .lanes = 4,
> .format = MIPI_DSI_FMT_RGB888,
> - .init_cmds = cz101b4001_init_cmds,
> - .num_init_cmds = ARRAY_SIZE(cz101b4001_init_cmds),
> + .init = cz101b4001_init_cmds,
> };
>
> static int jadard_dsi_probe(struct mipi_dsi_device *dsi)
> --
> 2.17.1
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 5/5] drm/panel: jd9365da: Add the function of adjusting orientation
2024-06-24 14:19 ` [PATCH v5 5/5] drm/panel: jd9365da: Add the function of adjusting orientation Zhaoxiong Lv
2024-06-24 16:46 ` Doug Anderson
@ 2024-06-25 0:43 ` Jessica Zhang
1 sibling, 0 replies; 22+ messages in thread
From: Jessica Zhang @ 2024-06-25 0:43 UTC (permalink / raw)
To: Zhaoxiong Lv, dmitry.torokhov, robh, krzysztof.kozlowski+dt,
conor+dt, jikos, benjamin.tissoires, dianders, hsinyi, jagan,
neil.armstrong, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel
On 6/24/2024 7:19 AM, Zhaoxiong Lv wrote:
> This driver does not have the function to adjust the orientation,
> so this function is added.
>
> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> Changes between V5 and V4:
> - 1. Change dev_err() to dev_err_probe().
>
> V4:https://lore.kernel.org/all/20240620080509.18504-5-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V4 and V3:
> - No changes.
>
> ---
> drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c | 14 +++++++++++++-
> 1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> index 593e12b31ebd..c6b669866fed 100644
> --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> @@ -42,7 +42,7 @@ struct jadard {
> struct drm_panel panel;
> struct mipi_dsi_device *dsi;
> const struct jadard_panel_desc *desc;
> -
> + enum drm_panel_orientation orientation;
> struct regulator *vdd;
> struct regulator *vccio;
> struct gpio_desc *reset;
> @@ -178,12 +178,20 @@ static int jadard_get_modes(struct drm_panel *panel,
> return 1;
> }
>
> +static enum drm_panel_orientation jadard_panel_get_orientation(struct drm_panel *panel)
> +{
> + struct jadard *jadard = panel_to_jadard(panel);
> +
> + return jadard->orientation;
> +}
> +
> static const struct drm_panel_funcs jadard_funcs = {
> .disable = jadard_disable,
> .unprepare = jadard_unprepare,
> .prepare = jadard_prepare,
> .enable = jadard_enable,
> .get_modes = jadard_get_modes,
> + .get_orientation = jadard_panel_get_orientation,
> };
>
> static int radxa_display_8hd_ad002_init_cmds(struct jadard *jadard)
> @@ -880,6 +888,10 @@ static int jadard_dsi_probe(struct mipi_dsi_device *dsi)
> drm_panel_init(&jadard->panel, dev, &jadard_funcs,
> DRM_MODE_CONNECTOR_DSI);
>
> + ret = of_drm_get_panel_orientation(dev->of_node, &jadard->orientation);
> + if (ret < 0)
> + return dev_err_probe(dev, ret, "failed to get orientation\n");
> +
> ret = drm_panel_of_backlight(&jadard->panel);
> if (ret)
> return ret;
> --
> 2.17.1
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 4/5] drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel
2024-06-24 14:19 ` [PATCH v5 4/5] drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel Zhaoxiong Lv
2024-06-24 16:45 ` Doug Anderson
@ 2024-06-25 0:55 ` Jessica Zhang
1 sibling, 0 replies; 22+ messages in thread
From: Jessica Zhang @ 2024-06-25 0:55 UTC (permalink / raw)
To: Zhaoxiong Lv, dmitry.torokhov, robh, krzysztof.kozlowski+dt,
conor+dt, jikos, benjamin.tissoires, dianders, hsinyi, jagan,
neil.armstrong, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel
On 6/24/2024 7:19 AM, Zhaoxiong Lv wrote:
> The K&d kd101ne3-40ti is a 10.1" WXGA TFT-LCD panel, use
> jd9365da controller,which fits in nicely with the existing
> panel-jadard-jd9365da-h3 driver.Hence,we add a new compatible
> with panel specific config.
>
> Although they have the same control IC, the two panels are different,
> and the timing will be slightly different, so we added some variables
> in struct jadard_panel_desc to control the timing.
>
> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
Acked-by: Jessica Zhang <quic_jesszhan@quicinc.com>
> ---
> Changes between V5 and V4:
> - 1. Add a "_ms" suffix to the variables.
> - 2. Use more "_multi" in the enable/disable function
> - 3. Use mipi_dsi_dcs_write_seq_multi() in the init() function.
>
> V4:https://lore.kernel.org/all/20240620080509.18504-4-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V4 and V3:
> - 1. Use mipi_dsi_msleep.
> - 2. Adjust the ".clock" assignment format.
> - 3. Adjust "compatible" positions to keep the list sorted.
>
> V3:https://lore.kernel.org/all/20240614145510.22965-4-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V3 and V2:
> - 1. Give up creating a new driver and re-add K&d kd101ne3-40ti
> - configuration to the panel-jadard-jd9365da-h3.c driver.
>
> V2:https://lore.kernel.org/all/20240601084528.22502-3-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V2 and V1:
> - 1. Use the new mipi_dsi_dcs_write_seq_multi() function.
> - 2. Modify Move mipi_dsi_dcs_set_display_off() and mipi_dsi_dcs_enter_sleep_mode() to disable(),
> - and drop kingdisplay_panel_enter_sleep_mode().
> - 3. If prepare fails, disable GPIO before regulators.
> - 4. This function drm_connector_set_panel_orientation() is no longer used. Delete it.
> - 5. Drop ".shutdown = kingdisplay_panel_shutdown".
>
> ---
> .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 277 ++++++++++++++++++
> 1 file changed, 277 insertions(+)
>
> diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> index e836260338bf..593e12b31ebd 100644
> --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> @@ -27,6 +27,15 @@ struct jadard_panel_desc {
> enum mipi_dsi_pixel_format format;
> int (*init)(struct jadard *jadard);
> u32 num_init_cmds;
> + bool lp11_before_reset;
> + bool reset_before_power_off_vcioo;
> + unsigned int vcioo_to_lp11_delay_ms;
> + unsigned int lp11_to_reset_delay_ms;
> + unsigned int exit_sleep_to_display_on_delay_ms;
> + unsigned int display_on_delay_ms;
> + unsigned int backlight_off_to_display_off_delay_ms;
> + unsigned int display_off_to_enter_sleep_delay_ms;
> + unsigned int enter_sleep_to_reset_down_delay_ms;
> };
>
> struct jadard {
> @@ -53,8 +62,14 @@ static int jadard_enable(struct drm_panel *panel)
>
> mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx);
>
> + if (jadard->desc->exit_sleep_to_display_on_delay_ms)
> + mipi_dsi_msleep(&dsi_ctx, jadard->desc->exit_sleep_to_display_on_delay_ms);
> +
> mipi_dsi_dcs_set_display_on_multi(&dsi_ctx);
>
> + if (jadard->desc->display_on_delay_ms)
> + mipi_dsi_msleep(&dsi_ctx, jadard->desc->display_on_delay_ms);
> +
> return dsi_ctx.accum_err;
> }
>
> @@ -63,10 +78,19 @@ static int jadard_disable(struct drm_panel *panel)
> struct jadard *jadard = panel_to_jadard(panel);
> struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
>
> + if (jadard->desc->backlight_off_to_display_off_delay_ms)
> + mipi_dsi_msleep(&dsi_ctx, jadard->desc->backlight_off_to_display_off_delay_ms);
> +
> mipi_dsi_dcs_set_display_off_multi(&dsi_ctx);
>
> + if (jadard->desc->display_off_to_enter_sleep_delay_ms)
> + mipi_dsi_msleep(&dsi_ctx, jadard->desc->display_off_to_enter_sleep_delay_ms);
> +
> mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx);
>
> + if (jadard->desc->enter_sleep_to_reset_down_delay_ms)
> + mipi_dsi_msleep(&dsi_ctx, jadard->desc->enter_sleep_to_reset_down_delay_ms);
> +
> return dsi_ctx.accum_err;
> }
>
> @@ -83,6 +107,18 @@ static int jadard_prepare(struct drm_panel *panel)
> if (ret)
> return ret;
>
> + if (jadard->desc->vcioo_to_lp11_delay_ms)
> + msleep(jadard->desc->vcioo_to_lp11_delay_ms);
> +
> + if (jadard->desc->lp11_before_reset) {
> + ret = mipi_dsi_dcs_nop(jadard->dsi);
> + if (ret)
> + return ret;
> + }
> +
> + if (jadard->desc->lp11_to_reset_delay_ms)
> + msleep(jadard->desc->lp11_to_reset_delay_ms);
> +
> gpiod_set_value(jadard->reset, 1);
> msleep(5);
>
> @@ -106,6 +142,12 @@ static int jadard_unprepare(struct drm_panel *panel)
> gpiod_set_value(jadard->reset, 1);
> msleep(120);
>
> + if (jadard->desc->reset_before_power_off_vcioo) {
> + gpiod_set_value(jadard->reset, 0);
> +
> + usleep_range(1000, 2000);
> + }
> +
> regulator_disable(jadard->vdd);
> regulator_disable(jadard->vccio);
>
> @@ -569,6 +611,237 @@ static const struct jadard_panel_desc cz101b4001_desc = {
> .init = cz101b4001_init_cmds,
> };
>
> +static int kingdisplay_kd101ne3_init_cmds(struct jadard *jadard)
> +{
> + struct mipi_dsi_multi_context dsi_ctx = { .dsi = jadard->dsi };
> +
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe1, 0x93);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe2, 0x65);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe3, 0xf8);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x03);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0c, 0x74);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0xc7);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1a, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1b, 0xc7);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1c, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0xfe);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x19);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x28);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x05);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x08);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3a, 0x12);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3c, 0x7e);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3d, 0xff);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3e, 0xff);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3f, 0x7f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x06);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0xa0);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x1e);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x0b);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0x6a);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x59, 0x0a);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5a, 0x2e);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0x1a);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5c, 0x15);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5d, 0x7f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5e, 0x61);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5f, 0x50);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x3f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x32);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x35);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x38);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x36);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0x36);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x54);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x42);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6a, 0x48);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6b, 0x39);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6c, 0x34);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6d, 0x26);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6e, 0x14);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6f, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x70, 0x7f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x71, 0x61);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x72, 0x50);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x73, 0x43);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x74, 0x3f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0x32);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x35);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x38);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x79, 0x36);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7a, 0x36);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7b, 0x54);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7c, 0x42);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7d, 0x48);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7e, 0x39);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x7f, 0x34);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x80, 0x26);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x81, 0x14);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x82, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x02);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x52);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x01, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x03, 0x50);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x04, 0x77);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x05, 0x57);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x06, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x07, 0x4e);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x08, 0x4c);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0a, 0x4a);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0b, 0x48);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0c, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0d, 0x46);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0e, 0x44);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0f, 0x40);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x10, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x11, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x12, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x13, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x14, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x15, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x16, 0x53);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x17, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x18, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x19, 0x51);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1a, 0x77);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1b, 0x57);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1c, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1d, 0x4f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1e, 0x4d);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x1f, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x20, 0x4b);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x21, 0x49);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x22, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x23, 0x47);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x24, 0x45);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x25, 0x41);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x26, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x27, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x28, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x29, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2a, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2b, 0x5f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2c, 0x13);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2d, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2e, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x2f, 0x01);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x30, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x31, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x32, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x33, 0x0d);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x34, 0x0f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x35, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x36, 0x05);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x37, 0x07);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x38, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x39, 0x09);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3a, 0x0b);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3b, 0x11);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3c, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3d, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3e, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x3f, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x40, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x41, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x42, 0x12);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x43, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x44, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x45, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x46, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x47, 0x17);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x48, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x49, 0x0c);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4a, 0x0e);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4b, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4c, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4d, 0x06);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4e, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x4f, 0x08);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x50, 0x0a);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x51, 0x10);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x52, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x53, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x54, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x55, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x56, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x57, 0x1f);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x58, 0x40);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5b, 0x10);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5c, 0x06);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5d, 0x40);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5e, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x5f, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x60, 0x40);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x61, 0x03);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x62, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x63, 0x6c);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x64, 0x6c);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x65, 0x75);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x66, 0x08);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x67, 0xb4);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x68, 0x08);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x69, 0x6c);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6a, 0x6c);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6b, 0x0c);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6d, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6e, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x6f, 0x88);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x75, 0xbb);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x76, 0x00);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x77, 0x05);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x78, 0x2a);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x04);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x00, 0x0e);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x02, 0xb3);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x09, 0x61);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x0e, 0x48);
> + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0xe0, 0x00);
> +
> + return dsi_ctx.accum_err;
> +};
> +
> +static const struct jadard_panel_desc kingdisplay_kd101ne3_40ti_desc = {
> + .mode = {
> + .clock = (800 + 24 + 24 + 24) * (1280 + 30 + 4 + 8) * 60 / 1000,
> +
> + .hdisplay = 800,
> + .hsync_start = 800 + 24,
> + .hsync_end = 800 + 24 + 24,
> + .htotal = 800 + 24 + 24 + 24,
> +
> + .vdisplay = 1280,
> + .vsync_start = 1280 + 30,
> + .vsync_end = 1280 + 30 + 4,
> + .vtotal = 1280 + 30 + 4 + 8,
> +
> + .width_mm = 135,
> + .height_mm = 216,
> + .type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,
> + },
> + .lanes = 4,
> + .format = MIPI_DSI_FMT_RGB888,
> + .init = kingdisplay_kd101ne3_init_cmds,
> + .lp11_before_reset = true,
> + .reset_before_power_off_vcioo = true,
> + .vcioo_to_lp11_delay_ms = 5,
> + .lp11_to_reset_delay_ms = 10,
> + .exit_sleep_to_display_on_delay_ms = 120,
> + .display_on_delay_ms = 20,
> + .backlight_off_to_display_off_delay_ms = 100,
> + .display_off_to_enter_sleep_delay_ms = 50,
> + .enter_sleep_to_reset_down_delay_ms = 100,
> +};
> +
> static int jadard_dsi_probe(struct mipi_dsi_device *dsi)
> {
> struct device *dev = &dsi->dev;
> @@ -637,6 +910,10 @@ static const struct of_device_id jadard_of_match[] = {
> .compatible = "chongzhou,cz101b4001",
> .data = &cz101b4001_desc
> },
> + {
> + .compatible = "kingdisplay,kd101ne3-40ti",
> + .data = &kingdisplay_kd101ne3_40ti_desc
> + },
> {
> .compatible = "radxa,display-10hd-ad001",
> .data = &cz101b4001_desc
> --
> 2.17.1
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands
2024-06-24 23:41 ` Jessica Zhang
@ 2024-06-25 12:13 ` zhaoxiong lv
2024-06-25 17:49 ` Jessica Zhang
0 siblings, 1 reply; 22+ messages in thread
From: zhaoxiong lv @ 2024-06-25 12:13 UTC (permalink / raw)
To: Jessica Zhang
Cc: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
dmitry.baryshkov, dri-devel, devicetree, linux-kernel,
Shuijing Li
On Tue, Jun 25, 2024 at 7:41 AM Jessica Zhang <quic_jesszhan@quicinc.com> wrote:
>
>
>
> On 6/24/2024 7:19 AM, Zhaoxiong Lv wrote:
> > Currently, the init_code of the jd9365da driver is placed
> > in the enable() function and sent, but this seems to take
> > a long time. It takes 17ms to send each instruction (an init
> > code consists of about 200 instructions), so it takes
> > about 3.5s to send the init_code. So we moved the sending
> > of the inti_code to the prepare() function, and each
> > instruction seemed to take only 25μs.
> >
> > We checked the DSI host and found that the difference in
> > command sending time is caused by the different modes of
> > the DSI host in prepare() and enable() functions.
> > Our DSI Host only supports sending cmd in LP mode, The
> > prepare() function can directly send init_code (LP->cmd)
> > in LP mode, but the enable() function is in HS mode and
> > needs to switch to LP mode before sending init code
> > (HS->LP->cmd->HS). Therefore, it takes longer to send
> > the command.
> >
> > Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
>
> Hi Zhaoxiong,
>
> Just curious, if the host expects that commands are sent in LP mode, why
> isn't the MIPI_DSI_MODE_LPM flag set before sending the DCS commands?
>
> Thanks,
>
> Jessica Zhang
hi jessica
We have tried to set dsi->mode_flags to MIPI_DSI_MODE_LPM in the
probe() function,
but this seems to still happen. MTK colleagues believe that the host
dsi configuration is
still in LP mode during the prepare() function, and when in the
enable() function, the host
dsi is already in HS mode. However, since the command must be sent in
LP mode, it will
switch back and forth between HS->LP->HS.
Add Mediatek colleagues(shuijing.li@mediatek.corp-partner.google.com)
>
> > ---
> > Changes between V5 and V4:
> > - 1. No changes.
> >
> > V4:https://lore.kernel.org/all/20240620080509.18504-2-lvzhaoxiong@huaqin.corp-partner.google.com/
> >
> > Changes between V4 and V3:
> > - 1. Only move mipi_dsi_dcs_write_buffer from enable() function to prepare() function,
> > - and no longer use mipi_dsi_dcs_write_seq_multi.
> >
> > V3:https://lore.kernel.org/all/20240614145510.22965-2-lvzhaoxiong@huaqin.corp-partner.google.com/
> >
> > ---
> > .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 24 +++++++++----------
> > 1 file changed, 11 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> > index 4879835fe101..a9c483a7b3fa 100644
> > --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> > +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> > @@ -52,21 +52,9 @@ static int jadard_enable(struct drm_panel *panel)
> > {
> > struct device *dev = panel->dev;
> > struct jadard *jadard = panel_to_jadard(panel);
> > - const struct jadard_panel_desc *desc = jadard->desc;
> > struct mipi_dsi_device *dsi = jadard->dsi;
> > - unsigned int i;
> > int err;
> >
> > - msleep(10);
> > -
> > - for (i = 0; i < desc->num_init_cmds; i++) {
> > - const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> > -
> > - err = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> > - if (err < 0)
> > - return err;
> > - }
> > -
> > msleep(120);
> >
> > err = mipi_dsi_dcs_exit_sleep_mode(dsi);
> > @@ -100,6 +88,8 @@ static int jadard_disable(struct drm_panel *panel)
> > static int jadard_prepare(struct drm_panel *panel)
> > {
> > struct jadard *jadard = panel_to_jadard(panel);
> > + const struct jadard_panel_desc *desc = jadard->desc;
> > + unsigned int i;
> > int ret;
> >
> > ret = regulator_enable(jadard->vccio);
> > @@ -117,7 +107,15 @@ static int jadard_prepare(struct drm_panel *panel)
> > msleep(10);
> >
> > gpiod_set_value(jadard->reset, 1);
> > - msleep(120);
> > + msleep(130);
> > +
> > + for (i = 0; i < desc->num_init_cmds; i++) {
> > + const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> > +
> > + ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> > + if (ret < 0)
> > + return ret;
> > + }
> >
> > return 0;
> > }
> > --
> > 2.17.1
> >
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands
2024-06-25 12:13 ` zhaoxiong lv
@ 2024-06-25 17:49 ` Jessica Zhang
2024-06-26 10:55 ` zhaoxiong lv
0 siblings, 1 reply; 22+ messages in thread
From: Jessica Zhang @ 2024-06-25 17:49 UTC (permalink / raw)
To: zhaoxiong lv
Cc: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
dmitry.baryshkov, dri-devel, devicetree, linux-kernel,
Shuijing Li
On 6/25/2024 5:13 AM, zhaoxiong lv wrote:
> On Tue, Jun 25, 2024 at 7:41 AM Jessica Zhang <quic_jesszhan@quicinc.com> wrote:
>>
>>
>>
>> On 6/24/2024 7:19 AM, Zhaoxiong Lv wrote:
>>> Currently, the init_code of the jd9365da driver is placed
>>> in the enable() function and sent, but this seems to take
>>> a long time. It takes 17ms to send each instruction (an init
>>> code consists of about 200 instructions), so it takes
>>> about 3.5s to send the init_code. So we moved the sending
>>> of the inti_code to the prepare() function, and each
>>> instruction seemed to take only 25μs.
>>>
>>> We checked the DSI host and found that the difference in
>>> command sending time is caused by the different modes of
>>> the DSI host in prepare() and enable() functions.
>>> Our DSI Host only supports sending cmd in LP mode, The
>>> prepare() function can directly send init_code (LP->cmd)
>>> in LP mode, but the enable() function is in HS mode and
>>> needs to switch to LP mode before sending init code
>>> (HS->LP->cmd->HS). Therefore, it takes longer to send
>>> the command.
>>>
>>> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
>>
>> Hi Zhaoxiong,
>>
>> Just curious, if the host expects that commands are sent in LP mode, why
>> isn't the MIPI_DSI_MODE_LPM flag set before sending the DCS commands?
>>
>> Thanks,
>>
>> Jessica Zhang
>
> hi jessica
>
> We have tried to set dsi->mode_flags to MIPI_DSI_MODE_LPM in the
> probe() function,
> but this seems to still happen. MTK colleagues believe that the host
> dsi configuration is
> still in LP mode during the prepare() function, and when in the
> enable() function, the host
> dsi is already in HS mode. However, since the command must be sent in
> LP mode, it will
> switch back and forth between HS->LP->HS.
>
> Add Mediatek colleagues(shuijing.li@mediatek.corp-partner.google.com)
Got it. Even drivers that call their init commands in prepare() set the
LPM flag [1][2] when applicable so I was just wondering why this driver
doesn't seem to set LPM at all even though it is going into LP mode.
[1]
https://elixir.bootlin.com/linux/v6.10-rc5/source/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c#L46
[2]
https://elixir.bootlin.com/linux/v6.10-rc5/source/drivers/gpu/drm/panel/panel-visionox-r66451.c#L46
>
>
>>
>>> ---
>>> Changes between V5 and V4:
>>> - 1. No changes.
>>>
>>> V4:https://lore.kernel.org/all/20240620080509.18504-2-lvzhaoxiong@huaqin.corp-partner.google.com/
>>>
>>> Changes between V4 and V3:
>>> - 1. Only move mipi_dsi_dcs_write_buffer from enable() function to prepare() function,
>>> - and no longer use mipi_dsi_dcs_write_seq_multi.
>>>
>>> V3:https://lore.kernel.org/all/20240614145510.22965-2-lvzhaoxiong@huaqin.corp-partner.google.com/
>>>
>>> ---
>>> .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 24 +++++++++----------
>>> 1 file changed, 11 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
>>> index 4879835fe101..a9c483a7b3fa 100644
>>> --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
>>> +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
>>> @@ -52,21 +52,9 @@ static int jadard_enable(struct drm_panel *panel)
>>> {
>>> struct device *dev = panel->dev;
>>> struct jadard *jadard = panel_to_jadard(panel);
>>> - const struct jadard_panel_desc *desc = jadard->desc;
>>> struct mipi_dsi_device *dsi = jadard->dsi;
>>> - unsigned int i;
>>> int err;
>>>
>>> - msleep(10);
>>> -
>>> - for (i = 0; i < desc->num_init_cmds; i++) {
>>> - const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
>>> -
>>> - err = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
>>> - if (err < 0)
>>> - return err;
>>> - }
>>> -
>>> msleep(120);
>>>
>>> err = mipi_dsi_dcs_exit_sleep_mode(dsi);
>>> @@ -100,6 +88,8 @@ static int jadard_disable(struct drm_panel *panel)
>>> static int jadard_prepare(struct drm_panel *panel)
>>> {
>>> struct jadard *jadard = panel_to_jadard(panel);
>>> + const struct jadard_panel_desc *desc = jadard->desc;
>>> + unsigned int i;
>>> int ret;
>>>
>>> ret = regulator_enable(jadard->vccio);
>>> @@ -117,7 +107,15 @@ static int jadard_prepare(struct drm_panel *panel)
>>> msleep(10);
>>>
>>> gpiod_set_value(jadard->reset, 1);
>>> - msleep(120);
>>> + msleep(130);
>>> +
>>> + for (i = 0; i < desc->num_init_cmds; i++) {
>>> + const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
>>> +
>>> + ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
>>> + if (ret < 0)
>>> + return ret;
>>> + }
>>>
>>> return 0;
>>> }
>>> --
>>> 2.17.1
>>>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands
2024-06-25 17:49 ` Jessica Zhang
@ 2024-06-26 10:55 ` zhaoxiong lv
0 siblings, 0 replies; 22+ messages in thread
From: zhaoxiong lv @ 2024-06-26 10:55 UTC (permalink / raw)
To: Jessica Zhang
Cc: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, neil.armstrong,
dmitry.baryshkov, dri-devel, devicetree, linux-kernel,
Shuijing Li
On Wed, Jun 26, 2024 at 1:49 AM Jessica Zhang <quic_jesszhan@quicinc.com> wrote:
>
>
>
> On 6/25/2024 5:13 AM, zhaoxiong lv wrote:
> > On Tue, Jun 25, 2024 at 7:41 AM Jessica Zhang <quic_jesszhan@quicinc.com> wrote:
> >>
> >>
> >>
> >> On 6/24/2024 7:19 AM, Zhaoxiong Lv wrote:
> >>> Currently, the init_code of the jd9365da driver is placed
> >>> in the enable() function and sent, but this seems to take
> >>> a long time. It takes 17ms to send each instruction (an init
> >>> code consists of about 200 instructions), so it takes
> >>> about 3.5s to send the init_code. So we moved the sending
> >>> of the inti_code to the prepare() function, and each
> >>> instruction seemed to take only 25μs.
> >>>
> >>> We checked the DSI host and found that the difference in
> >>> command sending time is caused by the different modes of
> >>> the DSI host in prepare() and enable() functions.
> >>> Our DSI Host only supports sending cmd in LP mode, The
> >>> prepare() function can directly send init_code (LP->cmd)
> >>> in LP mode, but the enable() function is in HS mode and
> >>> needs to switch to LP mode before sending init code
> >>> (HS->LP->cmd->HS). Therefore, it takes longer to send
> >>> the command.
> >>>
> >>> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
> >>
> >> Hi Zhaoxiong,
> >>
> >> Just curious, if the host expects that commands are sent in LP mode, why
> >> isn't the MIPI_DSI_MODE_LPM flag set before sending the DCS commands?
> >>
> >> Thanks,
> >>
> >> Jessica Zhang
> >
> > hi jessica
> >
> > We have tried to set dsi->mode_flags to MIPI_DSI_MODE_LPM in the
> > probe() function,
> > but this seems to still happen. MTK colleagues believe that the host
> > dsi configuration is
> > still in LP mode during the prepare() function, and when in the
> > enable() function, the host
> > dsi is already in HS mode. However, since the command must be sent in
> > LP mode, it will
> > switch back and forth between HS->LP->HS.
> >
> > Add Mediatek colleagues(shuijing.li@mediatek.corp-partner.google.com)
>
> Got it. Even drivers that call their init commands in prepare() set the
> LPM flag [1][2] when applicable so I was just wondering why this driver
> doesn't seem to set LPM at all even though it is going into LP mode.
>
> [1]
> https://elixir.bootlin.com/linux/v6.10-rc5/source/drivers/gpu/drm/panel/panel-visionox-vtdr6130.c#L46
>
> [2]
> https://elixir.bootlin.com/linux/v6.10-rc5/source/drivers/gpu/drm/panel/panel-visionox-r66451.c#L46
hi jessica
The initial default setting of our host DSI is the LP mode.
>
> >
> >
> >>
> >>> ---
> >>> Changes between V5 and V4:
> >>> - 1. No changes.
> >>>
> >>> V4:https://lore.kernel.org/all/20240620080509.18504-2-lvzhaoxiong@huaqin.corp-partner.google.com/
> >>>
> >>> Changes between V4 and V3:
> >>> - 1. Only move mipi_dsi_dcs_write_buffer from enable() function to prepare() function,
> >>> - and no longer use mipi_dsi_dcs_write_seq_multi.
> >>>
> >>> V3:https://lore.kernel.org/all/20240614145510.22965-2-lvzhaoxiong@huaqin.corp-partner.google.com/
> >>>
> >>> ---
> >>> .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 24 +++++++++----------
> >>> 1 file changed, 11 insertions(+), 13 deletions(-)
> >>>
> >>> diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> >>> index 4879835fe101..a9c483a7b3fa 100644
> >>> --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> >>> +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> >>> @@ -52,21 +52,9 @@ static int jadard_enable(struct drm_panel *panel)
> >>> {
> >>> struct device *dev = panel->dev;
> >>> struct jadard *jadard = panel_to_jadard(panel);
> >>> - const struct jadard_panel_desc *desc = jadard->desc;
> >>> struct mipi_dsi_device *dsi = jadard->dsi;
> >>> - unsigned int i;
> >>> int err;
> >>>
> >>> - msleep(10);
> >>> -
> >>> - for (i = 0; i < desc->num_init_cmds; i++) {
> >>> - const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> >>> -
> >>> - err = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> >>> - if (err < 0)
> >>> - return err;
> >>> - }
> >>> -
> >>> msleep(120);
> >>>
> >>> err = mipi_dsi_dcs_exit_sleep_mode(dsi);
> >>> @@ -100,6 +88,8 @@ static int jadard_disable(struct drm_panel *panel)
> >>> static int jadard_prepare(struct drm_panel *panel)
> >>> {
> >>> struct jadard *jadard = panel_to_jadard(panel);
> >>> + const struct jadard_panel_desc *desc = jadard->desc;
> >>> + unsigned int i;
> >>> int ret;
> >>>
> >>> ret = regulator_enable(jadard->vccio);
> >>> @@ -117,7 +107,15 @@ static int jadard_prepare(struct drm_panel *panel)
> >>> msleep(10);
> >>>
> >>> gpiod_set_value(jadard->reset, 1);
> >>> - msleep(120);
> >>> + msleep(130);
> >>> +
> >>> + for (i = 0; i < desc->num_init_cmds; i++) {
> >>> + const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> >>> +
> >>> + ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> >>> + if (ret < 0)
> >>> + return ret;
> >>> + }
> >>>
> >>> return 0;
> >>> }
> >>> --
> >>> 2.17.1
> >>>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands
2024-06-24 14:19 ` [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands Zhaoxiong Lv
2024-06-24 16:22 ` Doug Anderson
2024-06-24 23:41 ` Jessica Zhang
@ 2024-06-28 8:32 ` neil.armstrong
2 siblings, 0 replies; 22+ messages in thread
From: neil.armstrong @ 2024-06-28 8:32 UTC (permalink / raw)
To: Zhaoxiong Lv, dmitry.torokhov, robh, krzysztof.kozlowski+dt,
conor+dt, jikos, benjamin.tissoires, dianders, hsinyi, jagan,
quic_jesszhan, dmitry.baryshkov
Cc: dri-devel, devicetree, linux-kernel
On 24/06/2024 16:19, Zhaoxiong Lv wrote:
> Currently, the init_code of the jd9365da driver is placed
> in the enable() function and sent, but this seems to take
> a long time. It takes 17ms to send each instruction (an init
> code consists of about 200 instructions), so it takes
> about 3.5s to send the init_code. So we moved the sending
> of the inti_code to the prepare() function, and each
> instruction seemed to take only 25μs.
>
> We checked the DSI host and found that the difference in
> command sending time is caused by the different modes of
> the DSI host in prepare() and enable() functions.
> Our DSI Host only supports sending cmd in LP mode, The
> prepare() function can directly send init_code (LP->cmd)
> in LP mode, but the enable() function is in HS mode and
> needs to switch to LP mode before sending init code
> (HS->LP->cmd->HS). Therefore, it takes longer to send
> the command.
>
> Signed-off-by: Zhaoxiong Lv <lvzhaoxiong@huaqin.corp-partner.google.com>
> ---
> Changes between V5 and V4:
> - 1. No changes.
>
> V4:https://lore.kernel.org/all/20240620080509.18504-2-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> Changes between V4 and V3:
> - 1. Only move mipi_dsi_dcs_write_buffer from enable() function to prepare() function,
> - and no longer use mipi_dsi_dcs_write_seq_multi.
>
> V3:https://lore.kernel.org/all/20240614145510.22965-2-lvzhaoxiong@huaqin.corp-partner.google.com/
>
> ---
> .../gpu/drm/panel/panel-jadard-jd9365da-h3.c | 24 +++++++++----------
> 1 file changed, 11 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> index 4879835fe101..a9c483a7b3fa 100644
> --- a/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> +++ b/drivers/gpu/drm/panel/panel-jadard-jd9365da-h3.c
> @@ -52,21 +52,9 @@ static int jadard_enable(struct drm_panel *panel)
> {
> struct device *dev = panel->dev;
> struct jadard *jadard = panel_to_jadard(panel);
> - const struct jadard_panel_desc *desc = jadard->desc;
> struct mipi_dsi_device *dsi = jadard->dsi;
> - unsigned int i;
> int err;
>
> - msleep(10);
> -
> - for (i = 0; i < desc->num_init_cmds; i++) {
> - const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> -
> - err = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> - if (err < 0)
> - return err;
> - }
> -
> msleep(120);
>
> err = mipi_dsi_dcs_exit_sleep_mode(dsi);
> @@ -100,6 +88,8 @@ static int jadard_disable(struct drm_panel *panel)
> static int jadard_prepare(struct drm_panel *panel)
> {
> struct jadard *jadard = panel_to_jadard(panel);
> + const struct jadard_panel_desc *desc = jadard->desc;
> + unsigned int i;
> int ret;
>
> ret = regulator_enable(jadard->vccio);
> @@ -117,7 +107,15 @@ static int jadard_prepare(struct drm_panel *panel)
> msleep(10);
>
> gpiod_set_value(jadard->reset, 1);
> - msleep(120);
> + msleep(130);
> +
> + for (i = 0; i < desc->num_init_cmds; i++) {
> + const struct jadard_init_cmd *cmd = &desc->init_cmds[i];
> +
> + ret = mipi_dsi_dcs_write_buffer(dsi, cmd->data, JD9365DA_INIT_CMD_LEN);
> + if (ret < 0)
> + return ret;
> + }
>
> return 0;
> }
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da
2024-06-24 14:19 [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Zhaoxiong Lv
` (4 preceding siblings ...)
2024-06-24 14:19 ` [PATCH v5 5/5] drm/panel: jd9365da: Add the function of adjusting orientation Zhaoxiong Lv
@ 2024-06-28 9:07 ` Neil Armstrong
5 siblings, 0 replies; 22+ messages in thread
From: Neil Armstrong @ 2024-06-28 9:07 UTC (permalink / raw)
To: dmitry.torokhov, robh, krzysztof.kozlowski+dt, conor+dt, jikos,
benjamin.tissoires, dianders, hsinyi, jagan, quic_jesszhan,
dmitry.baryshkov, Zhaoxiong Lv
Cc: dri-devel, devicetree, linux-kernel
Hi,
On Mon, 24 Jun 2024 22:19:21 +0800, Zhaoxiong Lv wrote:
> This kingdisplay panel uses the jd9365da controller, so add it to
> panel-jadard-jd9365da-h3.c driver, but because the init_code and timing
> are different, some variables are added in struct jadard_panel_des to
> control it.
>
> In addition, since sending init_code in the enable() function takes a long time,
> it is moved to the prepare() function.
>
> [...]
Thanks, Applied to https://gitlab.freedesktop.org/drm/misc/kernel.git (drm-misc-next)
[1/5] drm/panel: jd9365da: Modify the method of sending commands
https://gitlab.freedesktop.org/drm/misc/kernel/-/commit/38cae7b626ec7b89cd14f15efb36f64682c76371
[2/5] dt-bindings: display: panel: Add compatible for kingdisplay-kd101ne3
https://gitlab.freedesktop.org/drm/misc/kernel/-/commit/e7f5112ae111a125366039666e9c6ff8dd71d0a4
[3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions
https://gitlab.freedesktop.org/drm/misc/kernel/-/commit/35583e129995164aebb169103fe64614482ccf8e
[4/5] drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel
https://gitlab.freedesktop.org/drm/misc/kernel/-/commit/2b976ad760dc3a62e4ff4c4e5afa02ec16e4013a
[5/5] drm/panel: jd9365da: Add the function of adjusting orientation
https://gitlab.freedesktop.org/drm/misc/kernel/-/commit/e1c550898f75eec9c6dcfc16a584d5bc58eebf77
--
Neil
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2024-06-28 9:07 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-24 14:19 [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Zhaoxiong Lv
2024-06-24 14:19 ` [PATCH v5 1/5] drm/panel: jd9365da: Modify the method of sending commands Zhaoxiong Lv
2024-06-24 16:22 ` Doug Anderson
2024-06-24 23:41 ` Jessica Zhang
2024-06-25 12:13 ` zhaoxiong lv
2024-06-25 17:49 ` Jessica Zhang
2024-06-26 10:55 ` zhaoxiong lv
2024-06-28 8:32 ` neil.armstrong
2024-06-24 14:19 ` [PATCH v5 2/5] dt-bindings: display: panel: Add compatible for kingdisplay-kd101ne3 Zhaoxiong Lv
2024-06-24 14:19 ` [PATCH v5 3/5] drm/panel: panel-jadard-jd9365da-h3: use wrapped MIPI DCS functions Zhaoxiong Lv
2024-06-24 15:27 ` Dmitry Baryshkov
2024-06-24 16:31 ` Doug Anderson
2024-06-24 16:33 ` Dmitry Baryshkov
2024-06-24 16:39 ` Doug Anderson
2024-06-24 23:59 ` Jessica Zhang
2024-06-24 14:19 ` [PATCH v5 4/5] drm/panel: jd9365da: Support for kd101ne3-40ti MIPI-DSI panel Zhaoxiong Lv
2024-06-24 16:45 ` Doug Anderson
2024-06-25 0:55 ` Jessica Zhang
2024-06-24 14:19 ` [PATCH v5 5/5] drm/panel: jd9365da: Add the function of adjusting orientation Zhaoxiong Lv
2024-06-24 16:46 ` Doug Anderson
2024-06-25 0:43 ` Jessica Zhang
2024-06-28 9:07 ` [PATCH v5 0/5] Add kd101ne3-40ti configuration in driver jd9365da Neil Armstrong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).