[PATCH 5/7] drm/panel: add driver for samsung amb655x
Dmitry Baryshkov
dmitry.baryshkov at linaro.org
Mon Jun 24 05:31:18 UTC 2024
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 at postmarketos.org>
> ---
> 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
More information about the dri-devel
mailing list