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

Configure Feed

Select the types of activity you want to include in your feed.

drm/panel: samsung-s6d7aa0: transition to mipi_dsi wrapped functions

Changes the samsung-s6d7aa0 panel to use multi style functions for
improved error handling.

Signed-off-by: Tejas Vipin <tejasvipin76@gmail.com>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
[dianders: fixed whitespace errors]
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20250319183106.12613-1-tejasvipin76@gmail.com

authored by

Tejas Vipin and committed by
Douglas Anderson
837f9b91 d69362f5

+73 -165
+73 -165
drivers/gpu/drm/panel/panel-samsung-s6d7aa0.c
··· 34 34 35 35 struct s6d7aa0_panel_desc { 36 36 unsigned int panel_type; 37 - int (*init_func)(struct s6d7aa0 *ctx); 38 - int (*off_func)(struct s6d7aa0 *ctx); 37 + void (*init_func)(struct s6d7aa0 *ctx, struct mipi_dsi_multi_context *dsi_ctx); 38 + void (*off_func)(struct mipi_dsi_multi_context *dsi_ctx); 39 39 const struct drm_display_mode *drm_mode; 40 40 unsigned long mode_flags; 41 41 u32 bus_flags; ··· 62 62 msleep(50); 63 63 } 64 64 65 - static int s6d7aa0_lock(struct s6d7aa0 *ctx, bool lock) 65 + static void s6d7aa0_lock(struct s6d7aa0 *ctx, struct mipi_dsi_multi_context *dsi_ctx, bool lock) 66 66 { 67 - struct mipi_dsi_device *dsi = ctx->dsi; 68 - 69 67 if (lock) { 70 - mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD1, 0xa5, 0xa5); 71 - mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD2, 0xa5, 0xa5); 68 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_PASSWD1, 0xa5, 0xa5); 69 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_PASSWD2, 0xa5, 0xa5); 72 70 if (ctx->desc->use_passwd3) 73 - mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD3, 0x5a, 0x5a); 71 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_PASSWD3, 0x5a, 0x5a); 74 72 } else { 75 - mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD1, 0x5a, 0x5a); 76 - mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD2, 0x5a, 0x5a); 73 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_PASSWD1, 0x5a, 0x5a); 74 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_PASSWD2, 0x5a, 0x5a); 77 75 if (ctx->desc->use_passwd3) 78 - mipi_dsi_dcs_write_seq(dsi, MCS_PASSWD3, 0xa5, 0xa5); 76 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_PASSWD3, 0xa5, 0xa5); 79 77 } 80 - 81 - return 0; 82 78 } 83 79 84 80 static int s6d7aa0_on(struct s6d7aa0 *ctx) 85 81 { 86 82 struct mipi_dsi_device *dsi = ctx->dsi; 87 - struct device *dev = &dsi->dev; 88 - int ret; 83 + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; 89 84 90 - ret = ctx->desc->init_func(ctx); 91 - if (ret < 0) { 92 - dev_err(dev, "Failed to initialize panel: %d\n", ret); 93 - gpiod_set_value_cansleep(ctx->reset_gpio, 1); 94 - return ret; 95 - } 85 + ctx->desc->init_func(ctx, &dsi_ctx); 96 86 97 - ret = mipi_dsi_dcs_set_display_on(dsi); 98 - if (ret < 0) { 99 - dev_err(dev, "Failed to set display on: %d\n", ret); 100 - return ret; 101 - } 87 + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx); 102 88 103 - return 0; 89 + return dsi_ctx.accum_err; 104 90 } 105 91 106 - static int s6d7aa0_off(struct s6d7aa0 *ctx) 92 + static void s6d7aa0_off(struct s6d7aa0 *ctx) 107 93 { 108 94 struct mipi_dsi_device *dsi = ctx->dsi; 109 - struct device *dev = &dsi->dev; 110 - int ret; 95 + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; 111 96 112 - ret = ctx->desc->off_func(ctx); 113 - if (ret < 0) { 114 - dev_err(dev, "Panel-specific off function failed: %d\n", ret); 115 - return ret; 116 - } 97 + ctx->desc->off_func(&dsi_ctx); 117 98 118 - ret = mipi_dsi_dcs_set_display_off(dsi); 119 - if (ret < 0) { 120 - dev_err(dev, "Failed to set display off: %d\n", ret); 121 - return ret; 122 - } 123 - msleep(64); 99 + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx); 100 + mipi_dsi_msleep(&dsi_ctx, 64); 124 101 125 - ret = mipi_dsi_dcs_enter_sleep_mode(dsi); 126 - if (ret < 0) { 127 - dev_err(dev, "Failed to enter sleep mode: %d\n", ret); 128 - return ret; 129 - } 130 - msleep(120); 102 + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx); 131 103 132 - return 0; 104 + mipi_dsi_msleep(&dsi_ctx, 120); 133 105 } 134 106 135 107 static int s6d7aa0_prepare(struct drm_panel *panel) 136 108 { 137 109 struct s6d7aa0 *ctx = panel_to_s6d7aa0(panel); 138 - struct device *dev = &ctx->dsi->dev; 139 110 int ret; 140 111 141 112 ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), ctx->supplies); 142 - if (ret < 0) { 143 - dev_err(dev, "Failed to enable regulators: %d\n", ret); 113 + if (ret < 0) 144 114 return ret; 145 - } 146 115 147 116 s6d7aa0_reset(ctx); 148 117 149 118 ret = s6d7aa0_on(ctx); 150 119 if (ret < 0) { 151 - dev_err(dev, "Failed to initialize panel: %d\n", ret); 152 120 gpiod_set_value_cansleep(ctx->reset_gpio, 1); 153 121 return ret; 154 122 } ··· 127 159 static int s6d7aa0_disable(struct drm_panel *panel) 128 160 { 129 161 struct s6d7aa0 *ctx = panel_to_s6d7aa0(panel); 130 - struct device *dev = &ctx->dsi->dev; 131 - int ret; 132 162 133 - ret = s6d7aa0_off(ctx); 134 - if (ret < 0) 135 - dev_err(dev, "Failed to un-initialize panel: %d\n", ret); 163 + s6d7aa0_off(ctx); 136 164 137 165 return 0; 138 166 } ··· 149 185 { 150 186 struct mipi_dsi_device *dsi = bl_get_data(bl); 151 187 u16 brightness = backlight_get_brightness(bl); 152 - int ret; 188 + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; 153 189 154 - ret = mipi_dsi_dcs_set_display_brightness(dsi, brightness); 155 - if (ret < 0) 156 - return ret; 190 + mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, brightness); 157 191 158 - return 0; 192 + return dsi_ctx.accum_err; 159 193 } 160 194 161 195 static int s6d7aa0_bl_get_brightness(struct backlight_device *bl) ··· 190 228 191 229 /* Initialization code and structures for LSL080AL02 panel */ 192 230 193 - static int s6d7aa0_lsl080al02_init(struct s6d7aa0 *ctx) 231 + static void s6d7aa0_lsl080al02_init(struct s6d7aa0 *ctx, struct mipi_dsi_multi_context *dsi_ctx) 194 232 { 195 - struct mipi_dsi_device *dsi = ctx->dsi; 196 - struct device *dev = &dsi->dev; 197 - int ret; 233 + mipi_dsi_usleep_range(dsi_ctx, 20000, 25000); 198 234 199 - usleep_range(20000, 25000); 235 + s6d7aa0_lock(ctx, dsi_ctx, false); 200 236 201 - ret = s6d7aa0_lock(ctx, false); 202 - if (ret < 0) { 203 - dev_err(dev, "Failed to unlock registers: %d\n", ret); 204 - return ret; 205 - } 206 - 207 - mipi_dsi_dcs_write_seq(dsi, MCS_OTP_RELOAD, 0x00, 0x10); 208 - usleep_range(1000, 1500); 237 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_OTP_RELOAD, 0x00, 0x10); 238 + mipi_dsi_usleep_range(dsi_ctx, 1000, 1500); 209 239 210 240 /* SEQ_B6_PARAM_8_R01 */ 211 - mipi_dsi_dcs_write_seq(dsi, 0xb6, 0x10); 241 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xb6, 0x10); 212 242 213 243 /* BL_CTL_ON */ 214 - mipi_dsi_dcs_write_seq(dsi, MCS_BL_CTL, 0x40, 0x00, 0x28); 244 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_BL_CTL, 0x40, 0x00, 0x28); 215 245 216 - usleep_range(5000, 6000); 246 + mipi_dsi_usleep_range(dsi_ctx, 5000, 6000); 217 247 218 - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_ADDRESS_MODE, 0x04); 248 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x04); 219 249 220 - ret = mipi_dsi_dcs_exit_sleep_mode(dsi); 221 - if (ret < 0) { 222 - dev_err(dev, "Failed to exit sleep mode: %d\n", ret); 223 - return ret; 224 - } 250 + mipi_dsi_dcs_exit_sleep_mode_multi(dsi_ctx); 225 251 226 - msleep(120); 227 - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_ADDRESS_MODE, 0x00); 252 + mipi_dsi_msleep(dsi_ctx, 120); 253 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x00); 228 254 229 - ret = s6d7aa0_lock(ctx, true); 230 - if (ret < 0) { 231 - dev_err(dev, "Failed to lock registers: %d\n", ret); 232 - return ret; 233 - } 255 + s6d7aa0_lock(ctx, dsi_ctx, true); 234 256 235 - ret = mipi_dsi_dcs_set_display_on(dsi); 236 - if (ret < 0) { 237 - dev_err(dev, "Failed to set display on: %d\n", ret); 238 - return ret; 239 - } 240 - 241 - return 0; 257 + mipi_dsi_dcs_set_display_on_multi(dsi_ctx); 242 258 } 243 259 244 - static int s6d7aa0_lsl080al02_off(struct s6d7aa0 *ctx) 260 + static void s6d7aa0_lsl080al02_off(struct mipi_dsi_multi_context *dsi_ctx) 245 261 { 246 - struct mipi_dsi_device *dsi = ctx->dsi; 247 - 248 262 /* BL_CTL_OFF */ 249 - mipi_dsi_dcs_write_seq(dsi, MCS_BL_CTL, 0x40, 0x00, 0x20); 250 - 251 - return 0; 263 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_BL_CTL, 0x40, 0x00, 0x20); 252 264 } 253 265 254 266 static const struct drm_display_mode s6d7aa0_lsl080al02_mode = { ··· 253 317 254 318 /* Initialization code and structures for LSL080AL03 panel */ 255 319 256 - static int s6d7aa0_lsl080al03_init(struct s6d7aa0 *ctx) 320 + static void s6d7aa0_lsl080al03_init(struct s6d7aa0 *ctx, struct mipi_dsi_multi_context *dsi_ctx) 257 321 { 258 - struct mipi_dsi_device *dsi = ctx->dsi; 259 - struct device *dev = &dsi->dev; 260 - int ret; 322 + mipi_dsi_usleep_range(dsi_ctx, 20000, 25000); 261 323 262 - usleep_range(20000, 25000); 263 - 264 - ret = s6d7aa0_lock(ctx, false); 265 - if (ret < 0) { 266 - dev_err(dev, "Failed to unlock registers: %d\n", ret); 267 - return ret; 268 - } 324 + s6d7aa0_lock(ctx, dsi_ctx, false); 269 325 270 326 if (ctx->desc->panel_type == S6D7AA0_PANEL_LSL080AL03) { 271 - mipi_dsi_dcs_write_seq(dsi, MCS_BL_CTL, 0xc7, 0x00, 0x29); 272 - mipi_dsi_dcs_write_seq(dsi, 0xbc, 0x01, 0x4e, 0xa0); 273 - mipi_dsi_dcs_write_seq(dsi, 0xfd, 0x16, 0x10, 0x11, 0x23, 274 - 0x09); 275 - mipi_dsi_dcs_write_seq(dsi, 0xfe, 0x00, 0x02, 0x03, 0x21, 276 - 0x80, 0x78); 327 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_BL_CTL, 0xc7, 0x00, 0x29); 328 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xbc, 0x01, 0x4e, 0xa0); 329 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xfd, 0x16, 0x10, 0x11, 0x23, 330 + 0x09); 331 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xfe, 0x00, 0x02, 0x03, 0x21, 332 + 0x80, 0x78); 277 333 } else if (ctx->desc->panel_type == S6D7AA0_PANEL_LTL101AT01) { 278 - mipi_dsi_dcs_write_seq(dsi, MCS_BL_CTL, 0x40, 0x00, 0x08); 279 - mipi_dsi_dcs_write_seq(dsi, 0xbc, 0x01, 0x4e, 0x0b); 280 - mipi_dsi_dcs_write_seq(dsi, 0xfd, 0x16, 0x10, 0x11, 0x23, 281 - 0x09); 282 - mipi_dsi_dcs_write_seq(dsi, 0xfe, 0x00, 0x02, 0x03, 0x21, 283 - 0x80, 0x68); 334 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MCS_BL_CTL, 0x40, 0x00, 0x08); 335 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xbc, 0x01, 0x4e, 0x0b); 336 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xfd, 0x16, 0x10, 0x11, 0x23, 337 + 0x09); 338 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xfe, 0x00, 0x02, 0x03, 0x21, 339 + 0x80, 0x68); 284 340 } 285 341 286 - mipi_dsi_dcs_write_seq(dsi, 0xb3, 0x51); 287 - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x24); 288 - mipi_dsi_dcs_write_seq(dsi, 0xf2, 0x02, 0x08, 0x08); 342 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xb3, 0x51); 343 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x24); 344 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xf2, 0x02, 0x08, 0x08); 289 345 290 - usleep_range(10000, 11000); 346 + mipi_dsi_usleep_range(dsi_ctx, 10000, 11000); 291 347 292 - mipi_dsi_dcs_write_seq(dsi, 0xc0, 0x80, 0x80, 0x30); 293 - mipi_dsi_dcs_write_seq(dsi, 0xcd, 294 - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 295 - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e); 296 - mipi_dsi_dcs_write_seq(dsi, 0xce, 297 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 298 - 0x00, 0x00, 0x00, 0x00, 0x00); 299 - mipi_dsi_dcs_write_seq(dsi, 0xc1, 0x03); 348 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xc0, 0x80, 0x80, 0x30); 349 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xcd, 350 + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 351 + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e); 352 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xce, 353 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 354 + 0x00, 0x00, 0x00, 0x00, 0x00); 355 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0xc1, 0x03); 300 356 301 - ret = mipi_dsi_dcs_exit_sleep_mode(dsi); 302 - if (ret < 0) { 303 - dev_err(dev, "Failed to exit sleep mode: %d\n", ret); 304 - return ret; 305 - } 306 - 307 - ret = s6d7aa0_lock(ctx, true); 308 - if (ret < 0) { 309 - dev_err(dev, "Failed to lock registers: %d\n", ret); 310 - return ret; 311 - } 312 - 313 - ret = mipi_dsi_dcs_set_display_on(dsi); 314 - if (ret < 0) { 315 - dev_err(dev, "Failed to set display on: %d\n", ret); 316 - return ret; 317 - } 318 - 319 - return 0; 357 + mipi_dsi_dcs_exit_sleep_mode_multi(dsi_ctx); 358 + s6d7aa0_lock(ctx, dsi_ctx, true); 359 + mipi_dsi_dcs_set_display_on_multi(dsi_ctx); 320 360 } 321 361 322 - static int s6d7aa0_lsl080al03_off(struct s6d7aa0 *ctx) 362 + static void s6d7aa0_lsl080al03_off(struct mipi_dsi_multi_context *dsi_ctx) 323 363 { 324 - struct mipi_dsi_device *dsi = ctx->dsi; 325 - 326 - mipi_dsi_dcs_write_seq(dsi, 0x22, 0x00); 327 - 328 - return 0; 364 + mipi_dsi_dcs_write_seq_multi(dsi_ctx, 0x22, 0x00); 329 365 } 330 366 331 367 static const struct drm_display_mode s6d7aa0_lsl080al03_mode = {