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

1 // SPDX-License-Identifier: GPL-2.0-only
19 struct drm_panel panel; member
20 struct mipi_dsi_device *dsi; member
26 static inline struct visionox_vtdr6130 *to_visionox_vtdr6130(struct drm_panel *panel) in to_visionox_vtdr6130() argument
28 return container_of(panel, struct visionox_vtdr6130, panel); in to_visionox_vtdr6130()
33 gpiod_set_value_cansleep(ctx->reset_gpio, 0); in visionox_vtdr6130_reset()
35 gpiod_set_value_cansleep(ctx->reset_gpio, 1); in visionox_vtdr6130_reset()
37 gpiod_set_value_cansleep(ctx->reset_gpio, 0); in visionox_vtdr6130_reset()
43 struct mipi_dsi_device *dsi = ctx->dsi; in visionox_vtdr6130_on() local
44 struct device *dev = &dsi->dev; in visionox_vtdr6130_on()
47 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in visionox_vtdr6130_on()
49 ret = mipi_dsi_dcs_set_tear_on(dsi, MIPI_DSI_DCS_TEAR_MODE_VBLANK); in visionox_vtdr6130_on()
53 mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_WRITE_CONTROL_DISPLAY, 0x20); in visionox_vtdr6130_on()
54 mipi_dsi_dcs_write_seq(dsi, MIPI_DCS_SET_DISPLAY_BRIGHTNESS, 0x00, 0x00); in visionox_vtdr6130_on()
55 mipi_dsi_dcs_write_seq(dsi, 0x59, 0x09); in visionox_vtdr6130_on()
56 mipi_dsi_dcs_write_seq(dsi, 0x6c, 0x01); in visionox_vtdr6130_on()
57 mipi_dsi_dcs_write_seq(dsi, 0x6d, 0x00); in visionox_vtdr6130_on()
58 mipi_dsi_dcs_write_seq(dsi, 0x6f, 0x01); in visionox_vtdr6130_on()
59 mipi_dsi_dcs_write_seq(dsi, 0x70, in visionox_vtdr6130_on()
71 mipi_dsi_dcs_write_seq(dsi, 0xf0, 0xaa, 0x10); in visionox_vtdr6130_on()
72 mipi_dsi_dcs_write_seq(dsi, 0xb1, in visionox_vtdr6130_on()
76 mipi_dsi_dcs_write_seq(dsi, 0xf0, 0xaa, 0x13); in visionox_vtdr6130_on()
77 mipi_dsi_dcs_write_seq(dsi, 0xce, in visionox_vtdr6130_on()
81 mipi_dsi_dcs_write_seq(dsi, 0xf0, 0xaa, 0x14); in visionox_vtdr6130_on()
82 mipi_dsi_dcs_write_seq(dsi, 0xb2, 0x03, 0x33); in visionox_vtdr6130_on()
83 mipi_dsi_dcs_write_seq(dsi, 0xb4, in visionox_vtdr6130_on()
86 mipi_dsi_dcs_write_seq(dsi, 0xb5, in visionox_vtdr6130_on()
88 mipi_dsi_dcs_write_seq(dsi, 0xb9, 0x00, 0x00, 0x08, 0x09, 0x09, 0x09); in visionox_vtdr6130_on()
89 mipi_dsi_dcs_write_seq(dsi, 0xbc, in visionox_vtdr6130_on()
92 mipi_dsi_dcs_write_seq(dsi, 0xbe, in visionox_vtdr6130_on()
95 mipi_dsi_dcs_write_seq(dsi, 0xff, 0x5a, 0x80); in visionox_vtdr6130_on()
96 mipi_dsi_dcs_write_seq(dsi, 0x65, 0x14); in visionox_vtdr6130_on()
97 mipi_dsi_dcs_write_seq(dsi, 0xfa, 0x08, 0x08, 0x08); in visionox_vtdr6130_on()
98 mipi_dsi_dcs_write_seq(dsi, 0xff, 0x5a, 0x81); in visionox_vtdr6130_on()
99 mipi_dsi_dcs_write_seq(dsi, 0x65, 0x05); in visionox_vtdr6130_on()
100 mipi_dsi_dcs_write_seq(dsi, 0xf3, 0x0f); in visionox_vtdr6130_on()
101 mipi_dsi_dcs_write_seq(dsi, 0xf0, 0xaa, 0x00); in visionox_vtdr6130_on()
102 mipi_dsi_dcs_write_seq(dsi, 0xff, 0x5a, 0x82); in visionox_vtdr6130_on()
103 mipi_dsi_dcs_write_seq(dsi, 0xf9, 0x00); in visionox_vtdr6130_on()
104 mipi_dsi_dcs_write_seq(dsi, 0xff, 0x51, 0x83); in visionox_vtdr6130_on()
105 mipi_dsi_dcs_write_seq(dsi, 0x65, 0x04); in visionox_vtdr6130_on()
106 mipi_dsi_dcs_write_seq(dsi, 0xf8, 0x00); in visionox_vtdr6130_on()
107 mipi_dsi_dcs_write_seq(dsi, 0xff, 0x5a, 0x00); in visionox_vtdr6130_on()
108 mipi_dsi_dcs_write_seq(dsi, 0x65, 0x01); in visionox_vtdr6130_on()
109 mipi_dsi_dcs_write_seq(dsi, 0xf4, 0x9a); in visionox_vtdr6130_on()
110 mipi_dsi_dcs_write_seq(dsi, 0xff, 0x5a, 0x00); in visionox_vtdr6130_on()
112 ret = mipi_dsi_dcs_exit_sleep_mode(dsi); in visionox_vtdr6130_on()
119 ret = mipi_dsi_dcs_set_display_on(dsi); in visionox_vtdr6130_on()
131 struct mipi_dsi_device *dsi = ctx->dsi; in visionox_vtdr6130_off() local
132 struct device *dev = &dsi->dev; in visionox_vtdr6130_off()
135 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in visionox_vtdr6130_off()
137 ret = mipi_dsi_dcs_set_display_off(dsi); in visionox_vtdr6130_off()
144 ret = mipi_dsi_dcs_enter_sleep_mode(dsi); in visionox_vtdr6130_off()
154 static int visionox_vtdr6130_prepare(struct drm_panel *panel) in visionox_vtdr6130_prepare() argument
156 struct visionox_vtdr6130 *ctx = to_visionox_vtdr6130(panel); in visionox_vtdr6130_prepare()
157 struct device *dev = &ctx->dsi->dev; in visionox_vtdr6130_prepare()
160 if (ctx->prepared) in visionox_vtdr6130_prepare()
163 ret = regulator_bulk_enable(ARRAY_SIZE(ctx->supplies), in visionox_vtdr6130_prepare()
164 ctx->supplies); in visionox_vtdr6130_prepare()
172 dev_err(dev, "Failed to initialize panel: %d\n", ret); in visionox_vtdr6130_prepare()
173 gpiod_set_value_cansleep(ctx->reset_gpio, 1); in visionox_vtdr6130_prepare()
174 regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), ctx->supplies); in visionox_vtdr6130_prepare()
178 ctx->prepared = true; in visionox_vtdr6130_prepare()
182 static int visionox_vtdr6130_unprepare(struct drm_panel *panel) in visionox_vtdr6130_unprepare() argument
184 struct visionox_vtdr6130 *ctx = to_visionox_vtdr6130(panel); in visionox_vtdr6130_unprepare()
185 struct device *dev = &ctx->dsi->dev; in visionox_vtdr6130_unprepare()
188 if (!ctx->prepared) in visionox_vtdr6130_unprepare()
193 dev_err(dev, "Failed to un-initialize panel: %d\n", ret); in visionox_vtdr6130_unprepare()
195 gpiod_set_value_cansleep(ctx->reset_gpio, 1); in visionox_vtdr6130_unprepare()
197 regulator_bulk_disable(ARRAY_SIZE(ctx->supplies), ctx->supplies); in visionox_vtdr6130_unprepare()
199 ctx->prepared = false; in visionox_vtdr6130_unprepare()
217 static int visionox_vtdr6130_get_modes(struct drm_panel *panel, in visionox_vtdr6130_get_modes() argument
222 mode = drm_mode_duplicate(connector->dev, &visionox_vtdr6130_mode); in visionox_vtdr6130_get_modes()
224 return -ENOMEM; in visionox_vtdr6130_get_modes()
228 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; in visionox_vtdr6130_get_modes()
229 connector->display_info.width_mm = mode->width_mm; in visionox_vtdr6130_get_modes()
230 connector->display_info.height_mm = mode->height_mm; in visionox_vtdr6130_get_modes()
244 struct mipi_dsi_device *dsi = bl_get_data(bl); in visionox_vtdr6130_bl_update_status() local
247 return mipi_dsi_dcs_set_display_brightness_large(dsi, brightness); in visionox_vtdr6130_bl_update_status()
255 visionox_vtdr6130_create_backlight(struct mipi_dsi_device *dsi) in visionox_vtdr6130_create_backlight() argument
257 struct device *dev = &dsi->dev; in visionox_vtdr6130_create_backlight()
264 return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, in visionox_vtdr6130_create_backlight()
268 static int visionox_vtdr6130_probe(struct mipi_dsi_device *dsi) in visionox_vtdr6130_probe() argument
270 struct device *dev = &dsi->dev; in visionox_vtdr6130_probe()
276 return -ENOMEM; in visionox_vtdr6130_probe()
278 ctx->supplies[0].supply = "vddio"; in visionox_vtdr6130_probe()
279 ctx->supplies[1].supply = "vci"; in visionox_vtdr6130_probe()
280 ctx->supplies[2].supply = "vdd"; in visionox_vtdr6130_probe()
282 ret = devm_regulator_bulk_get(&dsi->dev, ARRAY_SIZE(ctx->supplies), in visionox_vtdr6130_probe()
283 ctx->supplies); in visionox_vtdr6130_probe()
287 ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in visionox_vtdr6130_probe()
288 if (IS_ERR(ctx->reset_gpio)) in visionox_vtdr6130_probe()
289 return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio), in visionox_vtdr6130_probe()
290 "Failed to get reset-gpios\n"); in visionox_vtdr6130_probe()
292 ctx->dsi = dsi; in visionox_vtdr6130_probe()
293 mipi_dsi_set_drvdata(dsi, ctx); in visionox_vtdr6130_probe()
295 dsi->lanes = 4; in visionox_vtdr6130_probe()
296 dsi->format = MIPI_DSI_FMT_RGB888; in visionox_vtdr6130_probe()
297 dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_NO_EOT_PACKET | in visionox_vtdr6130_probe()
300 drm_panel_init(&ctx->panel, dev, &visionox_vtdr6130_panel_funcs, in visionox_vtdr6130_probe()
303 ctx->panel.backlight = visionox_vtdr6130_create_backlight(dsi); in visionox_vtdr6130_probe()
304 if (IS_ERR(ctx->panel.backlight)) in visionox_vtdr6130_probe()
305 return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight), in visionox_vtdr6130_probe()
308 drm_panel_add(&ctx->panel); in visionox_vtdr6130_probe()
310 ret = mipi_dsi_attach(dsi); in visionox_vtdr6130_probe()
312 dev_err(dev, "Failed to attach to DSI host: %d\n", ret); in visionox_vtdr6130_probe()
313 drm_panel_remove(&ctx->panel); in visionox_vtdr6130_probe()
320 static void visionox_vtdr6130_remove(struct mipi_dsi_device *dsi) in visionox_vtdr6130_remove() argument
322 struct visionox_vtdr6130 *ctx = mipi_dsi_get_drvdata(dsi); in visionox_vtdr6130_remove()
325 ret = mipi_dsi_detach(dsi); in visionox_vtdr6130_remove()
327 dev_err(&dsi->dev, "Failed to detach from DSI host: %d\n", ret); in visionox_vtdr6130_remove()
329 drm_panel_remove(&ctx->panel); in visionox_vtdr6130_remove()
342 .name = "panel-visionox-vtdr6130",
349 MODULE_DESCRIPTION("Panel driver for the Visionox VTDR6130 AMOLED DSI panel");