Lines Matching +full:panel +full:- +full:dsi

1 //SPDX-License-Identifier: GPL-2.0-only
21 struct drm_panel panel; member
22 struct mipi_dsi_device *dsi; member
28 static inline struct visionox_r66451 *to_visionox_r66451(struct drm_panel *panel) in to_visionox_r66451() argument
30 return container_of(panel, struct visionox_r66451, panel); in to_visionox_r66451()
35 gpiod_set_value_cansleep(ctx->reset_gpio, 0); in visionox_r66451_reset()
37 gpiod_set_value_cansleep(ctx->reset_gpio, 1); in visionox_r66451_reset()
39 gpiod_set_value_cansleep(ctx->reset_gpio, 0); in visionox_r66451_reset()
45 struct mipi_dsi_device *dsi = ctx->dsi; in visionox_r66451_on() local
47 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in visionox_r66451_on()
49 mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00); in visionox_r66451_on()
50 mipi_dsi_dcs_write_seq(dsi, 0xc2, in visionox_r66451_on()
53 mipi_dsi_dcs_write_seq(dsi, 0xd7, in visionox_r66451_on()
57 mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x80); in visionox_r66451_on()
58 mipi_dsi_dcs_write_seq(dsi, 0xde, in visionox_r66451_on()
61 mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x04); in visionox_r66451_on()
62 mipi_dsi_dcs_write_seq(dsi, 0xe8, 0x00, 0x02); in visionox_r66451_on()
63 mipi_dsi_dcs_write_seq(dsi, 0xe4, 0x00, 0x08); in visionox_r66451_on()
64 mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x00); in visionox_r66451_on()
65 mipi_dsi_dcs_write_seq(dsi, 0xc4, in visionox_r66451_on()
68 mipi_dsi_dcs_write_seq(dsi, 0xcf, in visionox_r66451_on()
72 mipi_dsi_dcs_write_seq(dsi, 0xd3, in visionox_r66451_on()
76 mipi_dsi_dcs_write_seq(dsi, 0xd7, in visionox_r66451_on()
80 mipi_dsi_dcs_write_seq(dsi, 0xd8, in visionox_r66451_on()
87 mipi_dsi_dcs_write_seq(dsi, 0xdf, in visionox_r66451_on()
93 mipi_dsi_dcs_write_seq(dsi, 0xf7, 0x01); in visionox_r66451_on()
94 mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x80); in visionox_r66451_on()
95 mipi_dsi_dcs_write_seq(dsi, 0xe4, 0x34, 0xb4, 0x00, 0x00, 0x00, 0x39, 0x04, 0x09, 0x34); in visionox_r66451_on()
96 mipi_dsi_dcs_write_seq(dsi, 0xe6, 0x00); in visionox_r66451_on()
97 mipi_dsi_dcs_write_seq(dsi, 0xb0, 0x04); in visionox_r66451_on()
98 mipi_dsi_dcs_write_seq(dsi, 0xdf, 0x50, 0x40); in visionox_r66451_on()
99 mipi_dsi_dcs_write_seq(dsi, 0xf3, 0x50, 0x00, 0x00, 0x00, 0x00); in visionox_r66451_on()
100 mipi_dsi_dcs_write_seq(dsi, 0xf2, 0x11); in visionox_r66451_on()
101 mipi_dsi_dcs_write_seq(dsi, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x01); in visionox_r66451_on()
102 mipi_dsi_dcs_write_seq(dsi, 0xf4, 0x00, 0x02); in visionox_r66451_on()
103 mipi_dsi_dcs_write_seq(dsi, 0xf2, 0x19); in visionox_r66451_on()
104 mipi_dsi_dcs_write_seq(dsi, 0xdf, 0x50, 0x42); in visionox_r66451_on()
105 mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); in visionox_r66451_on()
106 mipi_dsi_dcs_set_column_address(dsi, 0, 1080 - 1); in visionox_r66451_on()
107 mipi_dsi_dcs_set_page_address(dsi, 0, 2340 - 1); in visionox_r66451_on()
109 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in visionox_r66451_on()
116 ctx->dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in visionox_r66451_off()
120 static int visionox_r66451_prepare(struct drm_panel *panel) in visionox_r66451_prepare() argument
122 struct visionox_r66451 *ctx = to_visionox_r66451(panel); in visionox_r66451_prepare()
123 struct mipi_dsi_device *dsi = ctx->dsi; in visionox_r66451_prepare() local
124 struct device *dev = &dsi->dev; in visionox_r66451_prepare()
127 if (ctx->prepared) in visionox_r66451_prepare()
130 ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), in visionox_r66451_prepare()
131 ctx->supplies); in visionox_r66451_prepare()
139 dev_err(dev, "Failed to initialize panel: %d\n", ret); in visionox_r66451_prepare()
140 gpiod_set_value_cansleep(ctx->reset_gpio, 1); in visionox_r66451_prepare()
141 regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), ctx->supplies); in visionox_r66451_prepare()
145 mipi_dsi_compression_mode(ctx->dsi, true); in visionox_r66451_prepare()
147 ctx->prepared = true; in visionox_r66451_prepare()
151 static int visionox_r66451_unprepare(struct drm_panel *panel) in visionox_r66451_unprepare() argument
153 struct visionox_r66451 *ctx = to_visionox_r66451(panel); in visionox_r66451_unprepare()
154 struct device *dev = &ctx->dsi->dev; in visionox_r66451_unprepare()
157 if (!ctx->prepared) in visionox_r66451_unprepare()
162 dev_err(dev, "Failed to un-initialize panel: %d\n", ret); in visionox_r66451_unprepare()
164 gpiod_set_value_cansleep(ctx->reset_gpio, 1); in visionox_r66451_unprepare()
165 regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), ctx->supplies); in visionox_r66451_unprepare()
167 ctx->prepared = false; in visionox_r66451_unprepare()
186 static int visionox_r66451_enable(struct drm_panel *panel) in visionox_r66451_enable() argument
188 struct visionox_r66451 *ctx = to_visionox_r66451(panel); in visionox_r66451_enable()
189 struct mipi_dsi_device *dsi = ctx->dsi; in visionox_r66451_enable() local
193 if (ctx->enabled) in visionox_r66451_enable()
196 if (!dsi->dsc) { in visionox_r66451_enable()
197 dev_err(&dsi->dev, "DSC not attached to DSI\n"); in visionox_r66451_enable()
198 return -ENODEV; in visionox_r66451_enable()
201 drm_dsc_pps_payload_pack(&pps, dsi->dsc); in visionox_r66451_enable()
202 ret = mipi_dsi_picture_parameter_set(dsi, &pps); in visionox_r66451_enable()
204 dev_err(&dsi->dev, "Failed to set PPS\n"); in visionox_r66451_enable()
208 ret = mipi_dsi_dcs_exit_sleep_mode(dsi); in visionox_r66451_enable()
210 dev_err(&dsi->dev, "Failed to exit sleep mode: %d\n", ret); in visionox_r66451_enable()
215 ret = mipi_dsi_dcs_set_display_on(dsi); in visionox_r66451_enable()
217 dev_err(&dsi->dev, "Failed on set display on: %d\n", ret); in visionox_r66451_enable()
222 ctx->enabled = true; in visionox_r66451_enable()
227 static int visionox_r66451_disable(struct drm_panel *panel) in visionox_r66451_disable() argument
229 struct visionox_r66451 *ctx = to_visionox_r66451(panel); in visionox_r66451_disable()
230 struct mipi_dsi_device *dsi = ctx->dsi; in visionox_r66451_disable() local
231 struct device *dev = &dsi->dev; in visionox_r66451_disable()
234 ctx->enabled = false; in visionox_r66451_disable()
236 ret = mipi_dsi_dcs_set_display_off(dsi); in visionox_r66451_disable()
243 ret = mipi_dsi_dcs_enter_sleep_mode(dsi); in visionox_r66451_disable()
253 static int visionox_r66451_get_modes(struct drm_panel *panel, in visionox_r66451_get_modes() argument
270 struct mipi_dsi_device *dsi = bl_get_data(bl); in visionox_r66451_bl_update_status() local
273 return mipi_dsi_dcs_set_display_brightness(dsi, brightness); in visionox_r66451_bl_update_status()
281 visionox_r66451_create_backlight(struct mipi_dsi_device *dsi) in visionox_r66451_create_backlight() argument
283 struct device *dev = &dsi->dev; in visionox_r66451_create_backlight()
290 return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, in visionox_r66451_create_backlight()
294 static int visionox_r66451_probe(struct mipi_dsi_device *dsi) in visionox_r66451_probe() argument
296 struct device *dev = &dsi->dev; in visionox_r66451_probe()
303 return -ENOMEM; in visionox_r66451_probe()
307 return -ENOMEM; in visionox_r66451_probe()
310 dsc->dsc_version_major = 0x1; in visionox_r66451_probe()
311 dsc->dsc_version_minor = 0x2; in visionox_r66451_probe()
313 dsc->slice_height = 20; in visionox_r66451_probe()
314 dsc->slice_width = 540; in visionox_r66451_probe()
315 dsc->slice_count = 2; in visionox_r66451_probe()
316 dsc->bits_per_component = 8; in visionox_r66451_probe()
317 dsc->bits_per_pixel = 8 << 4; in visionox_r66451_probe()
318 dsc->block_pred_enable = true; in visionox_r66451_probe()
320 dsi->dsc = dsc; in visionox_r66451_probe()
322 ctx->supplies[0].supply = "vddio"; in visionox_r66451_probe()
323 ctx->supplies[1].supply = "vdd"; in visionox_r66451_probe()
325 ret = devm_regulator_bulk_get(&dsi->dev, ARRAY_SIZE(ctx->supplies), in visionox_r66451_probe()
326 ctx->supplies); in visionox_r66451_probe()
331 ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in visionox_r66451_probe()
332 if (IS_ERR(ctx->reset_gpio)) in visionox_r66451_probe()
333 return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio), "Failed to get reset-gpios\n"); in visionox_r66451_probe()
335 ctx->dsi = dsi; in visionox_r66451_probe()
336 mipi_dsi_set_drvdata(dsi, ctx); in visionox_r66451_probe()
338 dsi->lanes = 4; in visionox_r66451_probe()
339 dsi->format = MIPI_DSI_FMT_RGB888; in visionox_r66451_probe()
340 dsi->mode_flags = MIPI_DSI_MODE_LPM | MIPI_DSI_CLOCK_NON_CONTINUOUS; in visionox_r66451_probe()
342 drm_panel_init(&ctx->panel, dev, &visionox_r66451_funcs, DRM_MODE_CONNECTOR_DSI); in visionox_r66451_probe()
343 ctx->panel.backlight = visionox_r66451_create_backlight(dsi); in visionox_r66451_probe()
344 if (IS_ERR(ctx->panel.backlight)) in visionox_r66451_probe()
345 return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight), in visionox_r66451_probe()
348 drm_panel_add(&ctx->panel); in visionox_r66451_probe()
350 ret = mipi_dsi_attach(dsi); in visionox_r66451_probe()
352 dev_err(dev, "Failed to attach to DSI host: %d\n", ret); in visionox_r66451_probe()
353 drm_panel_remove(&ctx->panel); in visionox_r66451_probe()
359 static void visionox_r66451_remove(struct mipi_dsi_device *dsi) in visionox_r66451_remove() argument
361 struct visionox_r66451 *ctx = mipi_dsi_get_drvdata(dsi); in visionox_r66451_remove()
364 ret = mipi_dsi_detach(dsi); in visionox_r66451_remove()
366 dev_err(&dsi->dev, "Failed to detach DSI host: %d\n", ret); in visionox_r66451_remove()
368 drm_panel_remove(&ctx->panel); in visionox_r66451_remove()
381 .name = "panel-visionox-r66451",
389 MODULE_DESCRIPTION("Panel driver for the Visionox R66451 AMOLED DSI panel");