On Mon, Jun 24, 2024 at 03:30:29AM GMT, Caleb Connolly wrote: > This is a 1080x2400 120hz panel used on the OnePlus 8T. It uses DSC but > uses non-standard DCS commands. Please add a note regarding the panel using long packets for all the commands. Also the cover letter had a mention of the panel not fully comming up after being reset, is that still true? If so, it should be mentioned in the commit message too. > Signed-off-by: Caleb Connolly <caleb@xxxxxxxxxxxxxxxx> > --- > MAINTAINERS | 7 + > drivers/gpu/drm/panel/Kconfig | 9 + > drivers/gpu/drm/panel/Makefile | 1 + > drivers/gpu/drm/panel/panel-samsung-amb655x.c | 420 ++++++++++++++++++++++++++ > 4 files changed, 437 insertions(+) > +static int samsung_amb655x_on(struct samsung_amb655x *amb655x) > +{ > + struct drm_dsc_picture_parameter_set pps; > + struct mipi_dsi_device *dsi = amb655x->dsi; > + struct mipi_dsi_multi_context ctx = { .dsi = dsi }; > + struct device *dev = &dsi->dev; > + int ret; > + > + dsi->mode_flags |= MIPI_DSI_MODE_LPM; > + > + drm_dsc_pps_payload_pack(&pps, &amb655x->dsc); > + > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0x5a, 0x5a); > + mipi_dsi_dcs_write_buffer_multi(&ctx, &pps, sizeof(pps)); > + mipi_dsi_dcs_write_long(&ctx, 0x9d, 0x01); > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0xa5, 0xa5); > + > + ret = mipi_dsi_dcs_exit_sleep_mode(dsi); _multi. Shouldn't it be a long package too? > + if (ret < 0) { > + dev_err(dev, "Failed to exit sleep mode: %d\n", ret); > + return ret; > + } > + usleep_range(11000, 12000); mipi_dsi_msleep() or add mipi_dsi_usleep_range(). > + ret = mipi_dsi_dcs_set_column_address(dsi, 0x0000, 1080 - 1); _multi, adding the function as required > + if (ret < 0) { > + dev_err(dev, "Failed to set column address: %d\n", ret); > + return ret; > + } > + > + ret = mipi_dsi_dcs_set_page_address(dsi, 0x0000, 2400 - 1); _multi > + if (ret < 0) { > + dev_err(dev, "Failed to set page address: %d\n", ret); > + return ret; > + } > + > + /* FD Setting */ > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0x5a, 0x5a); > + mipi_dsi_dcs_write_long(&ctx, 0xd5, 0x8d); > + mipi_dsi_dcs_write_long(&ctx, 0xb0, 0x0a); > + mipi_dsi_dcs_write_long(&ctx, 0xd5, 0x05); > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0xa5, 0xa5); > + > + /* FFC Function */ > + mipi_dsi_dcs_write_long(&ctx, 0xfc, 0x5a, 0x5a); > + mipi_dsi_dcs_write_long(&ctx, 0xb0, 0x01); > + mipi_dsi_dcs_write_long(&ctx, 0xe4, 0xa6, 0x75, 0xa3); > + mipi_dsi_dcs_write_long(&ctx, 0xe9, > + 0x11, 0x75, 0xa6, 0x75, 0xa3, 0x4b, 0x17, 0xac, > + 0x4b, 0x17, 0xac, 0x00, 0x19, 0x19); > + mipi_dsi_dcs_write_long(&ctx, 0xfc, 0xa5, 0xa5); > + msleep(61); mipi_dsi_msleep > + > + /* Dimming Setting */ > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0x5a, 0x5a); > + mipi_dsi_dcs_write_long(&ctx, 0xb0, 0x06); > + mipi_dsi_dcs_write_long(&ctx, 0xb7, 0x01); > + mipi_dsi_dcs_write_long(&ctx, 0xb0, 0x05); > + mipi_dsi_dcs_write_long(&ctx, 0xb7, 0x13); > + mipi_dsi_dcs_write_long(&ctx, 0xb0, 0x01); > + mipi_dsi_dcs_write_long(&ctx, 0xb7, 0x4c); > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0xa5, 0xa5); > + > + mipi_dsi_dcs_write_long(&ctx, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x20); > + > + /* refresh rate Transition */ > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0x5a, 0x5a); > + /* 60 Hz */ > + //mipi_dsi_dcs_write_long(&ctx, 0x60, 0x00); > + /* 120 Hz */ > + mipi_dsi_dcs_write_long(&ctx, 0x60, 0x10); > + > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0xa5, 0xa5); > + > + /* ACL Mode */ > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0x5a, 0x5a); > + mipi_dsi_dcs_write_long(&ctx, MIPI_DCS_WRITE_POWER_SAVE, 0x00); > + mipi_dsi_dcs_write_long(&ctx, 0xf0, 0xa5, 0xa5); > + mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x20); _multi > + msleep(110); mipi_dsi_msleep() > + > + /* Enable backlight */ > + mipi_dsi_dcs_write_long(&ctx, 0x9F, 0x5A, 0x5A); > + mipi_dsi_dcs_set_display_on(dsi); _multi > + mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_ENTER_NORMAL_MODE); _multi > + mipi_dsi_dcs_write_long(&ctx, 0x9F, 0xA5, 0xA5); > + > + return ctx.accum_err; > +} > + > +static int samsung_amb655x_off(struct samsung_amb655x *amb655x) > +{ > + struct mipi_dsi_device *dsi = amb655x->dsi; > + struct mipi_dsi_multi_context ctx = { .dsi = dsi }; > + struct device *dev = &dsi->dev; > + int ret; > + > + dsi->mode_flags |= MIPI_DSI_MODE_LPM; > + > + mipi_dsi_dcs_write_long(&ctx, 0x9f, 0x5a, 0x5a); > + > + ret = mipi_dsi_dcs_set_display_on(dsi); _multi > + if (ret < 0) { > + dev_err(dev, "Failed to set display on: %d\n", ret); > + return ret; > + } > + msleep(20); mipi_dsi_msleep > + > + ret = mipi_dsi_dcs_set_display_off(dsi); _multi > + if (ret < 0) { > + dev_err(dev, "Failed to set display off: %d\n", ret); > + return ret; > + } > + msleep(20); mipi_dsi_msleep > + > + ret = mipi_dsi_dcs_enter_sleep_mode(dsi); _multi > + if (ret < 0) { > + dev_err(dev, "Failed to enter sleep mode: %d\n", ret); > + return ret; > + } > + > + mipi_dsi_dcs_write_long(&ctx, 0x9f, 0xa5, 0xa5); > + msleep(150); > + > + return ctx.accum_err; > +} > + -- With best wishes Dmitry