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

drm/panel: jdi-fhd-r63452: transition to mipi_dsi wrapped functions

Changes the jdi-fhd-r63452 panel to use multi style functions for
improved error handling.

Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Tejas Vipin <tejasvipin76@gmail.com>
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20240818060816.848784-3-tejasvipin76@gmail.com

authored by

Tejas Vipin and committed by
Douglas Anderson
04b5b362 051c86af

+47 -100
+47 -100
drivers/gpu/drm/panel/panel-jdi-fhd-r63452.c
··· 41 41 static int jdi_fhd_r63452_on(struct jdi_fhd_r63452 *ctx) 42 42 { 43 43 struct mipi_dsi_device *dsi = ctx->dsi; 44 - struct device *dev = &dsi->dev; 45 - int ret; 44 + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; 46 45 47 46 dsi->mode_flags |= MIPI_DSI_MODE_LPM; 48 47 49 - mipi_dsi_generic_write_seq(dsi, 0xb0, 0x00); 50 - mipi_dsi_generic_write_seq(dsi, 0xd6, 0x01); 51 - mipi_dsi_generic_write_seq(dsi, 0xec, 52 - 0x64, 0xdc, 0xec, 0x3b, 0x52, 0x00, 0x0b, 0x0b, 53 - 0x13, 0x15, 0x68, 0x0b, 0xb5); 54 - mipi_dsi_generic_write_seq(dsi, 0xb0, 0x03); 48 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x00); 49 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xd6, 0x01); 50 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xec, 51 + 0x64, 0xdc, 0xec, 0x3b, 0x52, 0x00, 0x0b, 0x0b, 52 + 0x13, 0x15, 0x68, 0x0b, 0xb5); 53 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x03); 55 54 56 - ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); 57 - if (ret < 0) { 58 - dev_err(dev, "Failed to set tear on: %d\n", ret); 59 - return ret; 60 - } 55 + mipi_dsi_dcs_set_tear_on_multi(&dsi_ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK); 61 56 62 - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_ADDRESS_MODE, 0x00); 57 + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x00); 63 58 64 - ret = mipi_dsi_dcs_set_pixel_format(dsi, 0x77); 65 - if (ret < 0) { 66 - dev_err(dev, "Failed to set pixel format: %d\n", ret); 67 - return ret; 68 - } 59 + mipi_dsi_dcs_set_pixel_format_multi(&dsi_ctx, 0x77); 60 + mipi_dsi_dcs_set_column_address_multi(&dsi_ctx, 0x0000, 0x0437); 61 + mipi_dsi_dcs_set_page_address_multi(&dsi_ctx, 0x0000, 0x077f); 62 + mipi_dsi_dcs_set_tear_scanline_multi(&dsi_ctx, 0x0000); 63 + mipi_dsi_dcs_set_display_brightness_multi(&dsi_ctx, 0x00ff); 69 64 70 - ret = mipi_dsi_dcs_set_column_address(dsi, 0x0000, 0x0437); 71 - if (ret < 0) { 72 - dev_err(dev, "Failed to set column address: %d\n", ret); 73 - return ret; 74 - } 65 + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x24); 66 + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_WRITE_POWER_SAVE, 0x00); 67 + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_CABC_MIN_BRIGHTNESS, 0x00); 68 + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x84, 0x00); 75 69 76 - ret = mipi_dsi_dcs_set_page_address(dsi, 0x0000, 0x077f); 77 - if (ret < 0) { 78 - dev_err(dev, "Failed to set page address: %d\n", ret); 79 - return ret; 80 - } 70 + mipi_dsi_dcs_set_display_on_multi(&dsi_ctx); 71 + mipi_dsi_msleep(&dsi_ctx, 20); 72 + mipi_dsi_dcs_exit_sleep_mode_multi(&dsi_ctx); 73 + mipi_dsi_msleep(&dsi_ctx, 80); 81 74 82 - ret = mipi_dsi_dcs_set_tear_scanline(dsi, 0x0000); 83 - if (ret < 0) { 84 - dev_err(dev, "Failed to set tear scanline: %d\n", ret); 85 - return ret; 86 - } 75 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x04); 76 + mipi_dsi_dcs_write_seq_multi(&dsi_ctx, 0x84, 0x00); 77 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xc8, 0x11); 78 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x03); 87 79 88 - ret = mipi_dsi_dcs_set_display_brightness(dsi, 0x00ff); 89 - if (ret < 0) { 90 - dev_err(dev, "Failed to set display brightness: %d\n", ret); 91 - return ret; 92 - } 93 - 94 - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x24); 95 - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_POWER_SAVE, 0x00); 96 - mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_CABC_MIN_BRIGHTNESS, 0x00); 97 - mipi_dsi_dcs_write_seq(dsi, 0x84, 0x00); 98 - 99 - ret = mipi_dsi_dcs_set_display_on(dsi); 100 - if (ret < 0) { 101 - dev_err(dev, "Failed to set display on: %d\n", ret); 102 - return ret; 103 - } 104 - msleep(20); 105 - 106 - ret = mipi_dsi_dcs_exit_sleep_mode(dsi); 107 - if (ret < 0) { 108 - dev_err(dev, "Failed to exit sleep mode: %d\n", ret); 109 - return ret; 110 - } 111 - msleep(80); 112 - 113 - mipi_dsi_generic_write_seq(dsi, 0xb0, 0x04); 114 - mipi_dsi_dcs_write_seq(dsi, 0x84, 0x00); 115 - mipi_dsi_generic_write_seq(dsi, 0xc8, 0x11); 116 - mipi_dsi_generic_write_seq(dsi, 0xb0, 0x03); 117 - 118 - return 0; 80 + return dsi_ctx.accum_err; 119 81 } 120 82 121 - static int jdi_fhd_r63452_off(struct jdi_fhd_r63452 *ctx) 83 + static void jdi_fhd_r63452_off(struct jdi_fhd_r63452 *ctx) 122 84 { 123 85 struct mipi_dsi_device *dsi = ctx->dsi; 124 - struct device *dev = &dsi->dev; 125 - int ret; 86 + struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; 126 87 127 88 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; 128 89 129 - mipi_dsi_generic_write_seq(dsi, 0xb0, 0x00); 130 - mipi_dsi_generic_write_seq(dsi, 0xd6, 0x01); 131 - mipi_dsi_generic_write_seq(dsi, 0xec, 132 - 0x64, 0xdc, 0xec, 0x3b, 0x52, 0x00, 0x0b, 0x0b, 133 - 0x13, 0x15, 0x68, 0x0b, 0x95); 134 - mipi_dsi_generic_write_seq(dsi, 0xb0, 0x03); 90 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x00); 91 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xd6, 0x01); 92 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xec, 93 + 0x64, 0xdc, 0xec, 0x3b, 0x52, 0x00, 0x0b, 0x0b, 94 + 0x13, 0x15, 0x68, 0x0b, 0x95); 95 + mipi_dsi_generic_write_seq_multi(&dsi_ctx, 0xb0, 0x03); 135 96 136 - ret = mipi_dsi_dcs_set_display_off(dsi); 137 - if (ret < 0) { 138 - dev_err(dev, "Failed to set display off: %d\n", ret); 139 - return ret; 140 - } 141 - usleep_range(2000, 3000); 142 - 143 - ret = mipi_dsi_dcs_enter_sleep_mode(dsi); 144 - if (ret < 0) { 145 - dev_err(dev, "Failed to enter sleep mode: %d\n", ret); 146 - return ret; 147 - } 148 - msleep(120); 149 - 150 - return 0; 97 + mipi_dsi_dcs_set_display_off_multi(&dsi_ctx); 98 + mipi_dsi_usleep_range(&dsi_ctx, 2000, 3000); 99 + mipi_dsi_dcs_enter_sleep_mode_multi(&dsi_ctx); 100 + mipi_dsi_msleep(&dsi_ctx, 120); 151 101 } 152 102 153 103 static int jdi_fhd_r63452_prepare(struct drm_panel *panel) 154 104 { 155 105 struct jdi_fhd_r63452 *ctx = to_jdi_fhd_r63452(panel); 156 - struct device *dev = &ctx->dsi->dev; 157 106 int ret; 158 107 159 108 jdi_fhd_r63452_reset(ctx); 160 109 161 110 ret = jdi_fhd_r63452_on(ctx); 162 - if (ret < 0) { 163 - dev_err(dev, "Failed to initialize panel: %d\n", ret); 111 + if (ret < 0) 164 112 gpiod_set_value_cansleep(ctx->reset_gpio, 1); 165 - return ret; 166 - } 167 113 168 - return 0; 114 + return ret; 169 115 } 170 116 171 117 static int jdi_fhd_r63452_unprepare(struct drm_panel *panel) 172 118 { 173 119 struct jdi_fhd_r63452 *ctx = to_jdi_fhd_r63452(panel); 174 - struct device *dev = &ctx->dsi->dev; 175 - int ret; 176 120 177 - ret = jdi_fhd_r63452_off(ctx); 178 - if (ret < 0) 179 - dev_err(dev, "Failed to un-initialize panel: %d\n", ret); 121 + /* 122 + * NOTE: We don't return an error here as while the panel won't have 123 + * been cleanly turned off at least we've asserted the reset signal 124 + * so it should be safe to power it back on again later 125 + */ 126 + jdi_fhd_r63452_off(ctx); 180 127 181 128 gpiod_set_value_cansleep(ctx->reset_gpio, 1); 182 129