From e12721da22148e231c9ce5ab4f025329e5e9e86b Mon Sep 17 00:00:00 2001 From: Edip Hzr Date: Sun, 28 Apr 2024 17:42:35 +0300 Subject: [PATCH 1/2] drm: panel: Update panel-k6-38-0e-0b-dsc --- drivers/gpu/drm/panel/panel-k6-38-0e-0b-dsc.c | 648 +++++++++--------- 1 file changed, 324 insertions(+), 324 deletions(-) diff --git a/drivers/gpu/drm/panel/panel-k6-38-0e-0b-dsc.c b/drivers/gpu/drm/panel/panel-k6-38-0e-0b-dsc.c index f3fac8dc67ab90..8d1e4e4d9d1981 100644 --- a/drivers/gpu/drm/panel/panel-k6-38-0e-0b-dsc.c +++ b/drivers/gpu/drm/panel/panel-k6-38-0e-0b-dsc.c @@ -18,415 +18,415 @@ #include struct k6_38_0e_0b_dsc { - struct drm_panel panel; - struct mipi_dsi_device *dsi; - struct drm_dsc_config dsc; - struct gpio_desc *reset_gpio; - bool prepared; + struct drm_panel panel; + struct mipi_dsi_device* dsi; + struct drm_dsc_config dsc; + struct gpio_desc* reset_gpio; + bool prepared; }; -static inline -struct k6_38_0e_0b_dsc *to_k6_38_0e_0b_dsc(struct drm_panel *panel) +static inline struct k6_38_0e_0b_dsc* to_k6_38_0e_0b_dsc(struct drm_panel* panel) { - return container_of(panel, struct k6_38_0e_0b_dsc, panel); + return container_of(panel, struct k6_38_0e_0b_dsc, panel); } -static void k6_38_0e_0b_dsc_reset(struct k6_38_0e_0b_dsc *ctx) +static void k6_38_0e_0b_dsc_reset(struct k6_38_0e_0b_dsc* ctx) { - gpiod_set_value_cansleep(ctx->reset_gpio, 1); - usleep_range(1000, 2000); - gpiod_set_value_cansleep(ctx->reset_gpio, 0); - usleep_range(10000, 11000); + gpiod_set_value_cansleep(ctx->reset_gpio, 1); + usleep_range(1000, 2000); + gpiod_set_value_cansleep(ctx->reset_gpio, 0); + usleep_range(10000, 11000); } -static int k6_38_0e_0b_dsc_on(struct k6_38_0e_0b_dsc *ctx) +static int k6_38_0e_0b_dsc_on(struct k6_38_0e_0b_dsc* ctx) { - struct mipi_dsi_device *dsi = ctx->dsi; - struct device *dev = &dsi->dev; - int ret; - - dsi->mode_flags |= MIPI_DSI_MODE_LPM; - - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); - mipi_dsi_dcs_write_seq(dsi, 0x60, 0x21); - mipi_dsi_dcs_write_seq(dsi, 0xf7, 0x07); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); - mipi_dsi_dcs_write_seq(dsi, 0x9d, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0x9e, - 0x11, 0x00, 0x00, 0x89, 0x30, 0x80, 0x09, 0x60, - 0x04, 0x38, 0x00, 0x28, 0x02, 0x1c, 0x02, 0x1c, - 0x02, 0x00, 0x02, 0x0e, 0x00, 0x20, 0x03, 0xdd, - 0x00, 0x07, 0x00, 0x0c, 0x02, 0x77, 0x02, 0x8b, - 0x18, 0x00, 0x10, 0xf0, 0x03, 0x0c, 0x20, 0x00, - 0x06, 0x0b, 0x0b, 0x33, 0x0e, 0x1c, 0x2a, 0x38, - 0x46, 0x54, 0x62, 0x69, 0x70, 0x77, 0x79, 0x7b, - 0x7d, 0x7e, 0x01, 0x02, 0x01, 0x00, 0x09, 0x40, - 0x09, 0xbe, 0x19, 0xfc, 0x19, 0xfa, 0x19, 0xf8, - 0x1a, 0x38, 0x1a, 0x78, 0x1a, 0xb6, 0x2a, 0xf6, - 0x2b, 0x34, 0x2b, 0x74, 0x3b, 0x74, 0x6b, 0xf4, - 0x00); - usleep_range(11000, 12000); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a); - mipi_dsi_dcs_write_seq(dsi, 0xd8, 0x01, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x46, 0x00, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xe1, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0x9f, 0x5a, 0x5a); - usleep_range(11000, 12000); - - ret = mipi_dsi_dcs_exit_sleep_mode(dsi); - if (ret < 0) { - dev_err(dev, "Failed to exit sleep mode: %d\n", ret); - return ret; - } - msleep(21); - - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x09, 0x00, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xe1, 0x22); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x9c, 0x00, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xe0, 0xd4); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x04, 0x00, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x9a, 0x00, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x03, 0x00, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xe1, 0xff, 0xff, 0xff, 0x7a, 0xaa); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x2c, 0x00, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xe0, - 0x00, 0x03, 0xc2, 0x07, 0x85, 0x03, 0x39, 0x05, - 0x6d, 0x05, 0x51, 0x06, 0xc3, 0x12, 0x9e, 0x44); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x38, 0x00, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xe0, 0xf3); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x41, 0x00, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x13); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); - mipi_dsi_dcs_write_seq(dsi, 0xb2, 0x01, 0x30); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0d, 0xb2, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xb2, 0x20); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0c, 0xb2, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xb2, 0x30); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0b, 0xce, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xce, 0x11); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x08, 0xea, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xea, 0xf6, 0x89); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0a, 0xea, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xea, 0x55, 0x01, 0x04); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0d, 0xea, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xea, 0xff, 0xff); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x74, 0xe1, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xe1, 0x3f); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x10, 0xea, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xea, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x9d, 0xe0, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x04, 0xe0, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x00); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x22, 0xf6, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xf6, 0x20, 0x50, 0x2c, 0x33, 0x7a, 0x7e); - mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x03, 0xcc, 0x01); - mipi_dsi_dcs_write_seq(dsi, 0xcc, 0x30); - mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); - - ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); - if (ret < 0) { - dev_err(dev, "Failed to set tear on: %d\n", ret); - return ret; - } - - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x20); - - ret = mipi_dsi_dcs_set_display_brightness(dsi, 0x0000); - if (ret < 0) { - dev_err(dev, "Failed to set display brightness: %d\n", ret); - return ret; - } - - mipi_dsi_dcs_write_seq(dsi, 0xf7, 0x07); - msleep(101); - - ret = mipi_dsi_dcs_set_display_on(dsi); - if (ret < 0) { - dev_err(dev, "Failed to set display on: %d\n", ret); - return ret; - } - - return 0; + struct mipi_dsi_device* dsi = ctx->dsi; + struct device* dev = &dsi->dev; + int ret; + + dsi->mode_flags |= MIPI_DSI_MODE_LPM; + + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); + mipi_dsi_dcs_write_seq(dsi, 0x60, 0x21); + mipi_dsi_dcs_write_seq(dsi, 0xf7, 0x07); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); + mipi_dsi_dcs_write_seq(dsi, 0x9d, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0x9e, + 0x11, 0x00, 0x00, 0x89, 0x30, 0x80, 0x09, 0x60, + 0x04, 0x38, 0x00, 0x28, 0x02, 0x1c, 0x02, 0x1c, + 0x02, 0x00, 0x02, 0x0e, 0x00, 0x20, 0x03, 0xdd, + 0x00, 0x07, 0x00, 0x0c, 0x02, 0x77, 0x02, 0x8b, + 0x18, 0x00, 0x10, 0xf0, 0x03, 0x0c, 0x20, 0x00, + 0x06, 0x0b, 0x0b, 0x33, 0x0e, 0x1c, 0x2a, 0x38, + 0x46, 0x54, 0x62, 0x69, 0x70, 0x77, 0x79, 0x7b, + 0x7d, 0x7e, 0x01, 0x02, 0x01, 0x00, 0x09, 0x40, + 0x09, 0xbe, 0x19, 0xfc, 0x19, 0xfa, 0x19, 0xf8, + 0x1a, 0x38, 0x1a, 0x78, 0x1a, 0xb6, 0x2a, 0xf6, + 0x2b, 0x34, 0x2b, 0x74, 0x3b, 0x74, 0x6b, 0xf4, + 0x00); + usleep_range(11000, 12000); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a); + mipi_dsi_dcs_write_seq(dsi, 0xd8, 0x01, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x46, 0x00, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xe1, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0x9f, 0x5a, 0x5a); + usleep_range(11000, 12000); + + ret = mipi_dsi_dcs_exit_sleep_mode(dsi); + if (ret < 0) { + dev_err(dev, "Failed to exit sleep mode: %d\n", ret); + return ret; + } + msleep(21); + + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x09, 0x00, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xe1, 0x22); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x9c, 0x00, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xe0, 0xd4); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x04, 0x00, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x9a, 0x00, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x03, 0x00, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xe1, 0xff, 0xff, 0xff, 0x7a, 0xaa); + mipi_dsi_dcs_write_seq(dsi, 0x00, 0x0f, 0xe0, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0x00, 0x1e, 0xe0, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x2c, 0x00, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xe0, + 0x00, 0x03, 0xc2, 0x07, 0x85, 0x03, 0x39, 0x05, + 0x6d, 0x05, 0x51, 0x06, 0xc3, 0x12, 0x9e, 0x44); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x38, 0x00, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xe0, 0xf3); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x41, 0x00, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x13); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); + mipi_dsi_dcs_write_seq(dsi, 0xb2, 0x01, 0x30); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0d, 0xb2, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xb2, 0x20); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0c, 0xb2, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xb2, 0x30); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0b, 0xce, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xce, 0x11); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x08, 0xea, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xea, 0xf6, 0x89); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0a, 0xea, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xea, 0x55, 0x01, 0x04); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x0d, 0xea, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xea, 0xff, 0xff); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x74, 0xe1, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xe1, 0x3f); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x10, 0xea, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xea, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0x5a, 0x5a, 0x5a, 0x5a); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x9d, 0xe0, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x04, 0xe0, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xe0, 0x00); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x22, 0xf6, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xf6, 0x20, 0x50, 0x2c, 0x33, 0x7a, 0x7e); + mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00, 0x03, 0xcc, 0x01); + mipi_dsi_dcs_write_seq(dsi, 0xcc, 0x30); + mipi_dsi_dcs_write_seq(dsi, 0xf1, 0xa5, 0xa5, 0xa5, 0xa5); + + ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); + if (ret < 0) { + dev_err(dev, "Failed to set tear on: %d\n", ret); + return ret; + } + + mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x20); + + ret = mipi_dsi_dcs_set_display_brightness(dsi, 0x0000); + if (ret < 0) { + dev_err(dev, "Failed to set display brightness: %d\n", ret); + return ret; + } + + mipi_dsi_dcs_write_seq(dsi, 0xf7, 0x07); + msleep(101); + + ret = mipi_dsi_dcs_set_display_on(dsi); + if (ret < 0) { + dev_err(dev, "Failed to set display on: %d\n", ret); + return ret; + } + + return 0; } -static int k6_38_0e_0b_dsc_off(struct k6_38_0e_0b_dsc *ctx) +static int k6_38_0e_0b_dsc_off(struct k6_38_0e_0b_dsc* ctx) { - struct mipi_dsi_device *dsi = ctx->dsi; - struct device *dev = &dsi->dev; - int ret; + struct mipi_dsi_device* dsi = ctx->dsi; + struct device* dev = &dsi->dev; + int ret; - dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; - mipi_dsi_dcs_write_seq(dsi, 0x9f, 0x5a, 0x5a); + mipi_dsi_dcs_write_seq(dsi, 0x9f, 0x5a, 0x5a); - ret = mipi_dsi_dcs_set_display_off(dsi); - if (ret < 0) { - dev_err(dev, "Failed to set display off: %d\n", ret); - return ret; - } - usleep_range(11000, 12000); + ret = mipi_dsi_dcs_set_display_off(dsi); + if (ret < 0) { + dev_err(dev, "Failed to set display off: %d\n", ret); + return ret; + } + usleep_range(11000, 12000); - ret = mipi_dsi_dcs_enter_sleep_mode(dsi); - if (ret < 0) { - dev_err(dev, "Failed to enter sleep mode: %d\n", ret); - return ret; - } - msleep(151); + ret = mipi_dsi_dcs_enter_sleep_mode(dsi); + if (ret < 0) { + dev_err(dev, "Failed to enter sleep mode: %d\n", ret); + return ret; + } + msleep(151); - return 0; + return 0; } -static int k6_38_0e_0b_dsc_prepare(struct drm_panel *panel) +static int k6_38_0e_0b_dsc_prepare(struct drm_panel* panel) { - struct k6_38_0e_0b_dsc *ctx = to_k6_38_0e_0b_dsc(panel); - struct device *dev = &ctx->dsi->dev; - struct drm_dsc_picture_parameter_set pps; - int ret; + struct k6_38_0e_0b_dsc* ctx = to_k6_38_0e_0b_dsc(panel); + struct device* dev = &ctx->dsi->dev; + struct drm_dsc_picture_parameter_set pps; + int ret; - if (ctx->prepared) - return 0; + if (ctx->prepared) + return 0; - k6_38_0e_0b_dsc_reset(ctx); + k6_38_0e_0b_dsc_reset(ctx); - ret = k6_38_0e_0b_dsc_on(ctx); - if (ret < 0) { - dev_err(dev, "Failed to initialize panel: %d\n", ret); - gpiod_set_value_cansleep(ctx->reset_gpio, 1); - return ret; - } + ret = k6_38_0e_0b_dsc_on(ctx); + if (ret < 0) { + dev_err(dev, "Failed to initialize panel: %d\n", ret); + gpiod_set_value_cansleep(ctx->reset_gpio, 1); + return ret; + } - drm_dsc_pps_payload_pack(&pps, &ctx->dsc); + drm_dsc_pps_payload_pack(&pps, &ctx->dsc); - ret = mipi_dsi_picture_parameter_set(ctx->dsi, &pps); - if (ret < 0) { - dev_err(panel->dev, "failed to transmit PPS: %d\n", ret); - return ret; - } + ret = mipi_dsi_picture_parameter_set(ctx->dsi, &pps); + if (ret < 0) { + dev_err(panel->dev, "failed to transmit PPS: %d\n", ret); + return ret; + } - ret = mipi_dsi_compression_mode(ctx->dsi, true); - if (ret < 0) { - dev_err(dev, "failed to enable compression mode: %d\n", ret); - return ret; - } + ret = mipi_dsi_compression_mode(ctx->dsi, true); + if (ret < 0) { + dev_err(dev, "failed to enable compression mode: %d\n", ret); + return ret; + } - msleep(28); /* TODO: Is this panel-dependent? */ + msleep(28); /* TODO: Is this panel-dependent? */ - ctx->prepared = true; - return 0; + ctx->prepared = true; + return 0; } -static int k6_38_0e_0b_dsc_unprepare(struct drm_panel *panel) +static int k6_38_0e_0b_dsc_unprepare(struct drm_panel* panel) { - struct k6_38_0e_0b_dsc *ctx = to_k6_38_0e_0b_dsc(panel); - struct device *dev = &ctx->dsi->dev; - int ret; + struct k6_38_0e_0b_dsc* ctx = to_k6_38_0e_0b_dsc(panel); + struct device* dev = &ctx->dsi->dev; + int ret; - if (!ctx->prepared) - return 0; + if (!ctx->prepared) + return 0; - ret = k6_38_0e_0b_dsc_off(ctx); - if (ret < 0) - dev_err(dev, "Failed to un-initialize panel: %d\n", ret); + ret = k6_38_0e_0b_dsc_off(ctx); + if (ret < 0) + dev_err(dev, "Failed to un-initialize panel: %d\n", ret); - gpiod_set_value_cansleep(ctx->reset_gpio, 1); + gpiod_set_value_cansleep(ctx->reset_gpio, 1); - ctx->prepared = false; - return 0; + ctx->prepared = false; + return 0; } static const struct drm_display_mode k6_38_0e_0b_dsc_mode = { - .clock = (1080 + 120 + 28 + 120) * (2400 + 20 + 2 + 10) * 120 / 1000, - .hdisplay = 1080, - .hsync_start = 1080 + 120, - .hsync_end = 1080 + 120 + 28, - .htotal = 1080 + 120 + 28 + 120, - .vdisplay = 2400, - .vsync_start = 2400 + 20, - .vsync_end = 2400 + 20 + 2, - .vtotal = 2400 + 20 + 2 + 10, - .width_mm = 69, - .height_mm = 154, + .clock = (1080 + 120 + 28 + 120) * (2400 + 20 + 2 + 10) * 120 / 1000, + .hdisplay = 1080, + .hsync_start = 1080 + 120, + .hsync_end = 1080 + 120 + 28, + .htotal = 1080 + 120 + 28 + 120, + .vdisplay = 2400, + .vsync_start = 2400 + 20, + .vsync_end = 2400 + 20 + 2, + .vtotal = 2400 + 20 + 2 + 10, + .width_mm = 69, + .height_mm = 154, }; -static int k6_38_0e_0b_dsc_get_modes(struct drm_panel *panel, - struct drm_connector *connector) +static int k6_38_0e_0b_dsc_get_modes(struct drm_panel* panel, + struct drm_connector* connector) { - struct drm_display_mode *mode; + struct drm_display_mode* mode; - mode = drm_mode_duplicate(connector->dev, &k6_38_0e_0b_dsc_mode); - if (!mode) - return -ENOMEM; + mode = drm_mode_duplicate(connector->dev, &k6_38_0e_0b_dsc_mode); + if (!mode) + return -ENOMEM; - drm_mode_set_name(mode); + drm_mode_set_name(mode); - mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; - connector->display_info.width_mm = mode->width_mm; - connector->display_info.height_mm = mode->height_mm; - drm_mode_probed_add(connector, mode); + mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; + connector->display_info.width_mm = mode->width_mm; + connector->display_info.height_mm = mode->height_mm; + drm_mode_probed_add(connector, mode); - return 1; + return 1; } static const struct drm_panel_funcs k6_38_0e_0b_dsc_panel_funcs = { - .prepare = k6_38_0e_0b_dsc_prepare, - .unprepare = k6_38_0e_0b_dsc_unprepare, - .get_modes = k6_38_0e_0b_dsc_get_modes, + .prepare = k6_38_0e_0b_dsc_prepare, + .unprepare = k6_38_0e_0b_dsc_unprepare, + .get_modes = k6_38_0e_0b_dsc_get_modes, }; -static int k6_38_0e_0b_dsc_bl_update_status(struct backlight_device *bl) +static int k6_38_0e_0b_dsc_bl_update_status(struct backlight_device* bl) { - struct mipi_dsi_device *dsi = bl_get_data(bl); - u16 brightness = backlight_get_brightness(bl); - int ret; + struct mipi_dsi_device* dsi = bl_get_data(bl); + u16 brightness = backlight_get_brightness(bl); + int ret; - dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; - ret = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness); - if (ret < 0) - return ret; + ret = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness); + if (ret < 0) + return ret; - dsi->mode_flags |= MIPI_DSI_MODE_LPM; + dsi->mode_flags |= MIPI_DSI_MODE_LPM; - return 0; + return 0; } // TODO: Check if /sys/class/backlight/.../actual_brightness actually returns // correct values. If not, remove this function. -static int k6_38_0e_0b_dsc_bl_get_brightness(struct backlight_device *bl) +static int k6_38_0e_0b_dsc_bl_get_brightness(struct backlight_device* bl) { - struct mipi_dsi_device *dsi = bl_get_data(bl); - u16 brightness; - int ret; + struct mipi_dsi_device* dsi = bl_get_data(bl); + u16 brightness; + int ret; - dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; + dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; - ret = mipi_dsi_dcs_get_display_brightness_large(dsi, &brightness); - if (ret < 0) - return ret; + ret = mipi_dsi_dcs_get_display_brightness_large(dsi, &brightness); + if (ret < 0) + return ret; - dsi->mode_flags |= MIPI_DSI_MODE_LPM; + dsi->mode_flags |= MIPI_DSI_MODE_LPM; - return brightness; + return brightness; } static const struct backlight_ops k6_38_0e_0b_dsc_bl_ops = { - .update_status = k6_38_0e_0b_dsc_bl_update_status, - .get_brightness = k6_38_0e_0b_dsc_bl_get_brightness, + .update_status = k6_38_0e_0b_dsc_bl_update_status, + .get_brightness = k6_38_0e_0b_dsc_bl_get_brightness, }; -static struct backlight_device * -k6_38_0e_0b_dsc_create_backlight(struct mipi_dsi_device *dsi) +static struct backlight_device* +k6_38_0e_0b_dsc_create_backlight(struct mipi_dsi_device* dsi) { - struct device *dev = &dsi->dev; - const struct backlight_properties props = { - .type = BACKLIGHT_RAW, - .brightness = 2047, - .max_brightness = 2047, - }; - - return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, - &k6_38_0e_0b_dsc_bl_ops, &props); + struct device* dev = &dsi->dev; + const struct backlight_properties props = { + .type = BACKLIGHT_RAW, + .brightness = 2047, + .max_brightness = 2047, + }; + + return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, + &k6_38_0e_0b_dsc_bl_ops, &props); } -static int k6_38_0e_0b_dsc_probe(struct mipi_dsi_device *dsi) +static int k6_38_0e_0b_dsc_probe(struct mipi_dsi_device* dsi) { - struct device *dev = &dsi->dev; - struct k6_38_0e_0b_dsc *ctx; - int ret; - - ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); - if (!ctx) - return -ENOMEM; - - ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); - if (IS_ERR(ctx->reset_gpio)) - return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio), - "Failed to get reset-gpios\n"); - - ctx->dsi = dsi; - mipi_dsi_set_drvdata(dsi, ctx); - - dsi->lanes = 4; - dsi->format = MIPI_DSI_FMT_RGB888; - dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | - MIPI_DSI_CLOCK_NON_CONTINUOUS; - - drm_panel_init(&ctx->panel, dev, &k6_38_0e_0b_dsc_panel_funcs, - DRM_MODE_CONNECTOR_DSI); - ctx->panel.prepare_prev_first = true; - - ctx->panel.backlight = k6_38_0e_0b_dsc_create_backlight(dsi); - if (IS_ERR(ctx->panel.backlight)) - return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight), - "Failed to create backlight\n"); - - drm_panel_add(&ctx->panel); - - /* This panel only supports DSC; unconditionally enable it */ - dsi->dsc = &ctx->dsc; - - ctx->dsc.dsc_version_major = 1; - ctx->dsc.dsc_version_minor = 1; - - /* TODO: Pass slice_per_pkt = 2 */ - ctx->dsc.slice_height = 40; - ctx->dsc.slice_width = 540; - /* - * TODO: hdisplay should be read from the selected mode once - * it is passed back to drm_panel (in prepare?) - */ - WARN_ON(1080 % ctx->dsc.slice_width); - ctx->dsc.slice_count = 1080 / ctx->dsc.slice_width; - ctx->dsc.bits_per_component = 8; - ctx->dsc.bits_per_pixel = 8 << 4; /* 4 fractional bits */ - ctx->dsc.block_pred_enable = true; - - ret = mipi_dsi_attach(dsi); - if (ret < 0) { - dev_err(dev, "Failed to attach to DSI host: %d\n", ret); - drm_panel_remove(&ctx->panel); - return ret; - } - - return 0; + struct device* dev = &dsi->dev; + struct k6_38_0e_0b_dsc* ctx; + int ret; + + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(ctx->reset_gpio)) + return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio), + "Failed to get reset-gpios\n"); + + ctx->dsi = dsi; + mipi_dsi_set_drvdata(dsi, ctx); + + dsi->lanes = 4; + dsi->format = MIPI_DSI_FMT_RGB888; + dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_CLOCK_NON_CONTINUOUS; + + drm_panel_init(&ctx->panel, dev, &k6_38_0e_0b_dsc_panel_funcs, + DRM_MODE_CONNECTOR_DSI); + ctx->panel.prepare_prev_first = true; + + ctx->panel.backlight = k6_38_0e_0b_dsc_create_backlight(dsi); + if (IS_ERR(ctx->panel.backlight)) + return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight), + "Failed to create backlight\n"); + + drm_panel_add(&ctx->panel); + + /* This panel only supports DSC; unconditionally enable it */ + dsi->dsc = &ctx->dsc; + + ctx->dsc.dsc_version_major = 1; + ctx->dsc.dsc_version_minor = 1; + + /* TODO: Pass slice_per_pkt = 2 */ + ctx->dsc.slice_height = 40; + ctx->dsc.slice_width = 540; + /* + * TODO: hdisplay should be read from the selected mode once + * it is passed back to drm_panel (in prepare?) + */ + WARN_ON(1080 % ctx->dsc.slice_width); + ctx->dsc.slice_count = 1080 / ctx->dsc.slice_width; + ctx->dsc.bits_per_component = 8; + ctx->dsc.bits_per_pixel = 8 << 4; /* 4 fractional bits */ + ctx->dsc.block_pred_enable = true; + + ret = mipi_dsi_attach(dsi); + if (ret < 0) { + dev_err(dev, "Failed to attach to DSI host: %d\n", ret); + drm_panel_remove(&ctx->panel); + return ret; + } + + return 0; } -static void k6_38_0e_0b_dsc_remove(struct mipi_dsi_device *dsi) +static void k6_38_0e_0b_dsc_remove(struct mipi_dsi_device* dsi) { - struct k6_38_0e_0b_dsc *ctx = mipi_dsi_get_drvdata(dsi); - int ret; + struct k6_38_0e_0b_dsc* ctx = mipi_dsi_get_drvdata(dsi); + int ret; - ret = mipi_dsi_detach(dsi); - if (ret < 0) - dev_err(&dsi->dev, "Failed to detach from DSI host: %d\n", ret); + ret = mipi_dsi_detach(dsi); + if (ret < 0) + dev_err(&dsi->dev, "Failed to detach from DSI host: %d\n", ret); - drm_panel_remove(&ctx->panel); + drm_panel_remove(&ctx->panel); } static const struct of_device_id k6_38_0e_0b_dsc_of_match[] = { - { .compatible = "mdss,k6-38-0e-0b-dsc" }, // FIXME - { /* sentinel */ } + { .compatible = "mdss,k6-38-0e-0b-dsc" }, // FIXME + { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, k6_38_0e_0b_dsc_of_match); static struct mipi_dsi_driver k6_38_0e_0b_dsc_driver = { - .probe = k6_38_0e_0b_dsc_probe, - .remove = k6_38_0e_0b_dsc_remove, - .driver = { - .name = "panel-k6-38-0e-0b-dsc", - .of_match_table = k6_38_0e_0b_dsc_of_match, - }, + .probe = k6_38_0e_0b_dsc_probe, + .remove = k6_38_0e_0b_dsc_remove, + .driver = { + .name = "panel-k6-38-0e-0b-dsc", + .of_match_table = k6_38_0e_0b_dsc_of_match, + }, }; module_mipi_dsi_driver(k6_38_0e_0b_dsc_driver); From 7c24e0e3399038bd7bba6d8b2e229cfb15914ef3 Mon Sep 17 00:00:00 2001 From: Edip Hzr Date: Sun, 28 Apr 2024 17:44:33 +0300 Subject: [PATCH 2/2] fixup! arm64: dts: qcom: sm7150: fix touchscreen for Redmi Note 12 Pro 4G --- arch/arm64/boot/dts/qcom/sm7150-xiaomi-sweet_k6a.dts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/qcom/sm7150-xiaomi-sweet_k6a.dts b/arch/arm64/boot/dts/qcom/sm7150-xiaomi-sweet_k6a.dts index 3c0412f4e37211..ea32d78e0d05a2 100644 --- a/arch/arm64/boot/dts/qcom/sm7150-xiaomi-sweet_k6a.dts +++ b/arch/arm64/boot/dts/qcom/sm7150-xiaomi-sweet_k6a.dts @@ -105,7 +105,7 @@ reg = <0x5d>; interrupt-parent = <&tlmm>; interrupts = <9 IRQ_TYPE_NONE>; - pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-0 = <&ts_int_active>; pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; pinctrl-names = "default", "sleep"; vtouch-supply = <&vreg_l7c_3p0>; @@ -115,9 +115,10 @@ goodix,reset-gpio = <&tlmm 8 GPIO_ACTIVE_HIGH>; goodix,irq-gpio = <&tlmm 9 IRQ_TYPE_NONE>; goodix,irq-flags = <2>; /* trigger falling;*/ - goodix,panel-max-x = <1079>; - goodix,panel-max-y = <2399>; + goodix,panel-max-x = <8639>; + goodix,panel-max-y = <19199>; goodix,panel-max-w = <256>; + goodix,panel-max-p = <256>; goodix,power-on-delay-us = <100>; /* 0.1ms */ goodix,power-off-delay-us = <5000>; /* 50ms */ };