Skip to content

Commit 04b5b36

Browse files
meltqdianders
authored andcommitted
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
1 parent 051c86a commit 04b5b36

1 file changed

Lines changed: 48 additions & 101 deletions

File tree

drivers/gpu/drm/panel/panel-jdi-fhd-r63452.c

Lines changed: 48 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -41,142 +41,89 @@ static void jdi_fhd_r63452_reset(struct jdi_fhd_r63452 *ctx)
4141
static int jdi_fhd_r63452_on(struct jdi_fhd_r63452 *ctx)
4242
{
4343
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 };
4645

4746
dsi->mode_flags |= MIPI_DSI_MODE_LPM;
4847

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);
55-
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-
}
61-
62-
mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_ADDRESS_MODE, 0x00);
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);
6354

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-
}
69-
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-
}
55+
mipi_dsi_dcs_set_tear_on_multi(&dsi_ctx, MIPI_DSI_DCS_TEAR_MODE_VBLANK);
7556

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-
}
57+
mipi_dsi_dcs_write_seq_multi(&dsi_ctx, MIPI_DCS_SET_ADDRESS_MODE, 0x00);
8158

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-
}
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);
8764

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-
}
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);
9369

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);
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);
9874

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);
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);
10579

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;
11981
}
12082

121-
static int jdi_fhd_r63452_off(struct jdi_fhd_r63452 *ctx)
83+
static void jdi_fhd_r63452_off(struct jdi_fhd_r63452 *ctx)
12284
{
12385
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 };
12687

12788
dsi->mode_flags &= ~MIPI_DSI_MODE_LPM;
12889

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);
135-
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;
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);
96+
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);
151101
}
152102

153103
static int jdi_fhd_r63452_prepare(struct drm_panel *panel)
154104
{
155105
struct jdi_fhd_r63452 *ctx = to_jdi_fhd_r63452(panel);
156-
struct device *dev = &ctx->dsi->dev;
157106
int ret;
158107

159108
jdi_fhd_r63452_reset(ctx);
160109

161110
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)
164112
gpiod_set_value_cansleep(ctx->reset_gpio, 1);
165-
return ret;
166-
}
167113

168-
return 0;
114+
return ret;
169115
}
170116

171117
static int jdi_fhd_r63452_unprepare(struct drm_panel *panel)
172118
{
173119
struct jdi_fhd_r63452 *ctx = to_jdi_fhd_r63452(panel);
174-
struct device *dev = &ctx->dsi->dev;
175-
int ret;
176120

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);
180127

181128
gpiod_set_value_cansleep(ctx->reset_gpio, 1);
182129

0 commit comments

Comments
 (0)