@@ -41,142 +41,89 @@ static void jdi_fhd_r63452_reset(struct jdi_fhd_r63452 *ctx)
4141static 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
153103static 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
171117static 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