Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/panel: elida-kd35t133: transition to mipi_dsi wrapped functions

Changes the elida-kd35t133 panel to use multi style functions for
improved error handling.

Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: Tejas Vipin <tejasvipin76@gmail.com>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240925080003.1250448-1-tejasvipin76@gmail.com

authored by

Tejas Vipin and committed by
Douglas Anderson
a7b3bcc8 86fdd6b9

+48 -66
+48 -66
drivers/gpu/drm/panel/panel-elida-kd35t133.c
··· 50 50 return container_of(panel, struct kd35t133, panel); 51 51 } 52 52 53 - static int kd35t133_init_sequence(struct kd35t133 *ctx) 53 + static void kd35t133_init_sequence(struct mipi_dsi_multi_context *dsi_ctx) 54 54 { 55 - struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); 56 - struct device *dev = ctx->dev; 57 - 58 55 /* 59 56 * Init sequence was supplied by the panel vendor with minimal 60 57 * documentation. 61 58 */ 62 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_POSITIVEGAMMA, 63 - 0x00, 0x13, 0x18, 0x04, 0x0f, 0x06, 0x3a, 0x56, 64 - 0x4d, 0x03, 0x0a, 0x06, 0x30, 0x3e, 0x0f); 65 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_NEGATIVEGAMMA, 66 - 0x00, 0x13, 0x18, 0x01, 0x11, 0x06, 0x38, 0x34, 67 - 0x4d, 0x06, 0x0d, 0x0b, 0x31, 0x37, 0x0f); 68 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_POWERCONTROL1, 0x18, 0x17); 69 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_POWERCONTROL2, 0x41); 70 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_VCOMCONTROL, 0x00, 0x1a, 0x80); 71 - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_ADDRESS_MODE, 0x48); 72 - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_PIXEL_FORMAT, 0x55); 73 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_INTERFACEMODECTRL, 0x00); 74 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_FRAMERATECTRL, 0xa0); 75 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_DISPLAYINVERSIONCTRL, 0x02); 76 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_DISPLAYFUNCTIONCTRL, 77 - 0x20, 0x02); 78 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_SETIMAGEFUNCTION, 0x00); 79 - mipi_dsi_dcs_write_seq(dsi, KD35T133_CMD_ADJUSTCONTROL3, 80 - 0xa9, 0x51, 0x2c, 0x82); 81 - mipi_dsi_dcs_write(dsi, MIPI_DCS_ENTER_INVERT_MODE, NULL, 0); 82 - 83 - dev_dbg(dev, "Panel init sequence done\n"); 84 - return 0; 59 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_POSITIVEGAMMA, 60 + 0x00, 0x13, 0x18, 0x04, 0x0f, 0x06, 0x3a, 0x56, 61 + 0x4d, 0x03, 0x0a, 0x06, 0x30, 0x3e, 0x0f); 62 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_NEGATIVEGAMMA, 63 + 0x00, 0x13, 0x18, 0x01, 0x11, 0x06, 0x38, 0x34, 64 + 0x4d, 0x06, 0x0d, 0x0b, 0x31, 0x37, 0x0f); 65 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_POWERCONTROL1, 0x18, 0x17); 66 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_POWERCONTROL2, 0x41); 67 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_VCOMCONTROL, 0x00, 0x1a, 0x80); 68 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x48); 69 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MIPI_DCS_SET_PIXEL_FORMAT, 0x55); 70 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_INTERFACEMODECTRL, 0x00); 71 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_FRAMERATECTRL, 0xa0); 72 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_DISPLAYINVERSIONCTRL, 0x02); 73 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_DISPLAYFUNCTIONCTRL, 74 + 0x20, 0x02); 75 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_SETIMAGEFUNCTION, 0x00); 76 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, KD35T133_CMD_ADJUSTCONTROL3, 77 + 0xa9, 0x51, 0x2c, 0x82); 78 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MIPI_DCS_ENTER_INVERT_MODE); 85 79 } 86 80 87 81 static int kd35t133_unprepare(struct drm_panel *panel) 88 82 { 89 83 struct kd35t133 *ctx = panel_to_kd35t133(panel); 90 84 struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); 91 - int ret; 85 + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; 92 86 93 - ret = mipi_dsi_dcs_set_display_off(dsi); 94 - if (ret < 0) 95 - dev_err(ctx->dev, "failed to set display off: %d\n", ret); 96 - 97 - ret = mipi_dsi_dcs_enter_sleep_mode(dsi); 98 - if (ret < 0) { 99 - dev_err(ctx->dev, "failed to enter sleep mode: %d\n", ret); 100 - return ret; 101 - } 87 + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx); 88 + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx); 89 + if (dsi_ctx.accum_err) 90 + return dsi_ctx.accum_err; 102 91 103 92 gpiod_set_value_cansleep(ctx->reset_gpio, 1); 104 93 ··· 101 112 { 102 113 struct kd35t133 *ctx = panel_to_kd35t133(panel); 103 114 struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev); 104 - int ret; 115 + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; 105 116 106 117 dev_dbg(ctx->dev, "Resetting the panel\n"); 107 - ret = regulator_enable(ctx->vdd); 108 - if (ret < 0) { 109 - dev_err(ctx->dev, "Failed to enable vdd supply: %d\n", ret); 110 - return ret; 118 + dsi_ctx.accum_err = regulator_enable(ctx->vdd); 119 + if (dsi_ctx.accum_err) { 120 + dev_err(ctx->dev, "Failed to enable vdd supply: %d\n", 121 + dsi_ctx.accum_err); 122 + return dsi_ctx.accum_err; 111 123 } 112 124 113 - ret = regulator_enable(ctx->iovcc); 114 - if (ret < 0) { 115 - dev_err(ctx->dev, "Failed to enable iovcc supply: %d\n", ret); 125 + dsi_ctx.accum_err = regulator_enable(ctx->iovcc); 126 + if (dsi_ctx.accum_err) { 127 + dev_err(ctx->dev, "Failed to enable iovcc supply: %d\n", 128 + dsi_ctx.accum_err); 116 129 goto disable_vdd; 117 130 } 118 131 ··· 126 135 127 136 msleep(20); 128 137 129 - ret = mipi_dsi_dcs_exit_sleep_mode(dsi); 130 - if (ret < 0) { 131 - dev_err(ctx->dev, "Failed to exit sleep mode: %d\n", ret); 138 + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx); 139 + mipi_dsi_msleep(&dsi_ctx, 250); 140 + 141 + kd35t133_init_sequence(&dsi_ctx); 142 + if (!dsi_ctx.accum_err) 143 + dev_dbg(ctx->dev, "Panel init sequence done\n"); 144 + 145 + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx); 146 + mipi_dsi_msleep(&dsi_ctx, 50); 147 + 148 + if (dsi_ctx.accum_err) 132 149 goto disable_iovcc; 133 - } 134 - 135 - msleep(250); 136 - 137 - ret = kd35t133_init_sequence(ctx); 138 - if (ret < 0) { 139 - dev_err(ctx->dev, "Panel init sequence failed: %d\n", ret); 140 - goto disable_iovcc; 141 - } 142 - 143 - ret = mipi_dsi_dcs_set_display_on(dsi); 144 - if (ret < 0) { 145 - dev_err(ctx->dev, "Failed to set display on: %d\n", ret); 146 - goto disable_iovcc; 147 - } 148 - 149 - msleep(50); 150 150 151 151 return 0; 152 152 ··· 145 163 regulator_disable(ctx->iovcc); 146 164 disable_vdd: 147 165 regulator_disable(ctx->vdd); 148 - return ret; 166 + return dsi_ctx.accum_err; 149 167 } 150 168 151 169 static const struct drm_display_mode default_mode = {