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
34 static inline struct novatek_nt37801 *to_novatek_nt37801(struct drm_panel *panel) in to_novatek_nt37801() argument
36 return container_of(panel, struct novatek_nt37801, panel); in to_novatek_nt37801()
41 gpiod_set_value_cansleep(ctx->reset_gpio, 0); in novatek_nt37801_reset()
43 gpiod_set_value_cansleep(ctx->reset_gpio, 1); in novatek_nt37801_reset()
45 gpiod_set_value_cansleep(ctx->reset_gpio, 0); in novatek_nt37801_reset()
57 struct mipi_dsi_device *dsi = ctx->dsi; in novatek_nt37801_on() local
58 struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; in novatek_nt37801_on()
60 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in novatek_nt37801_on()
114 struct mipi_dsi_device *dsi = ctx->dsi; in novatek_nt37801_off() local
115 struct mipi_dsi_multi_context dsi_ctx = { .dsi = dsi }; in novatek_nt37801_off()
117 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in novatek_nt37801_off()
128 static int novatek_nt37801_prepare(struct drm_panel *panel) in novatek_nt37801_prepare() argument
130 struct novatek_nt37801 *ctx = to_novatek_nt37801(panel); in novatek_nt37801_prepare()
131 struct device *dev = &ctx->dsi->dev; in novatek_nt37801_prepare()
136 ctx->supplies); in novatek_nt37801_prepare()
146 drm_dsc_pps_payload_pack(&pps, &ctx->dsc); in novatek_nt37801_prepare()
148 ret = mipi_dsi_picture_parameter_set(ctx->dsi, &pps); in novatek_nt37801_prepare()
150 dev_err(panel->dev, "failed to transmit PPS: %d\n", ret); in novatek_nt37801_prepare()
154 ret = mipi_dsi_compression_mode(ctx->dsi, true); in novatek_nt37801_prepare()
165 gpiod_set_value_cansleep(ctx->reset_gpio, 1); in novatek_nt37801_prepare()
167 ctx->supplies); in novatek_nt37801_prepare()
172 static int novatek_nt37801_unprepare(struct drm_panel *panel) in novatek_nt37801_unprepare() argument
174 struct novatek_nt37801 *ctx = to_novatek_nt37801(panel); in novatek_nt37801_unprepare()
175 struct device *dev = &ctx->dsi->dev; in novatek_nt37801_unprepare()
180 dev_err(dev, "Failed to un-initialize panel: %d\n", ret); in novatek_nt37801_unprepare()
182 gpiod_set_value_cansleep(ctx->reset_gpio, 1); in novatek_nt37801_unprepare()
185 ctx->supplies); in novatek_nt37801_unprepare()
203 static int novatek_nt37801_get_modes(struct drm_panel *panel, in novatek_nt37801_get_modes() argument
218 struct mipi_dsi_device *dsi = bl_get_data(bl); in novatek_nt37801_bl_update_status() local
222 dsi->mode_flags &= ~MIPI_DSI_MODE_LPM; in novatek_nt37801_bl_update_status()
224 ret = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness); in novatek_nt37801_bl_update_status()
228 dsi->mode_flags |= MIPI_DSI_MODE_LPM; in novatek_nt37801_bl_update_status()
238 novatek_nt37801_create_backlight(struct mipi_dsi_device *dsi) in novatek_nt37801_create_backlight() argument
240 struct device *dev = &dsi->dev; in novatek_nt37801_create_backlight()
247 return devm_backlight_device_register(dev, dev_name(dev), dev, dsi, in novatek_nt37801_create_backlight()
251 static int novatek_nt37801_probe(struct mipi_dsi_device *dsi) in novatek_nt37801_probe() argument
253 struct device *dev = &dsi->dev; in novatek_nt37801_probe()
257 ctx = devm_drm_panel_alloc(dev, struct novatek_nt37801, panel, in novatek_nt37801_probe()
266 &ctx->supplies); in novatek_nt37801_probe()
270 ctx->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in novatek_nt37801_probe()
271 if (IS_ERR(ctx->reset_gpio)) in novatek_nt37801_probe()
272 return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio), in novatek_nt37801_probe()
273 "Failed to get reset-gpios\n"); in novatek_nt37801_probe()
275 ctx->dsi = dsi; in novatek_nt37801_probe()
276 mipi_dsi_set_drvdata(dsi, ctx); in novatek_nt37801_probe()
278 dsi->lanes = 4; in novatek_nt37801_probe()
279 dsi->format = MIPI_DSI_FMT_RGB888; in novatek_nt37801_probe()
280 dsi->mode_flags = MIPI_DSI_MODE_NO_EOT_PACKET | MIPI_DSI_CLOCK_NON_CONTINUOUS; in novatek_nt37801_probe()
282 ctx->panel.prepare_prev_first = true; in novatek_nt37801_probe()
283 ctx->panel.backlight = novatek_nt37801_create_backlight(dsi); in novatek_nt37801_probe()
284 if (IS_ERR(ctx->panel.backlight)) in novatek_nt37801_probe()
285 return dev_err_probe(dev, PTR_ERR(ctx->panel.backlight), in novatek_nt37801_probe()
288 drm_panel_add(&ctx->panel); in novatek_nt37801_probe()
290 /* This panel only supports DSC; unconditionally enable it */ in novatek_nt37801_probe()
291 dsi->dsc = &ctx->dsc; in novatek_nt37801_probe()
292 ctx->dsc.dsc_version_major = 1; in novatek_nt37801_probe()
293 ctx->dsc.dsc_version_minor = 1; in novatek_nt37801_probe()
294 ctx->dsc.slice_height = 40; in novatek_nt37801_probe()
295 ctx->dsc.slice_width = 720; in novatek_nt37801_probe()
296 ctx->dsc.slice_count = 1440 / ctx->dsc.slice_width; in novatek_nt37801_probe()
297 ctx->dsc.bits_per_component = 8; in novatek_nt37801_probe()
298 ctx->dsc.bits_per_pixel = 8 << 4; /* 4 fractional bits */ in novatek_nt37801_probe()
299 ctx->dsc.block_pred_enable = true; in novatek_nt37801_probe()
301 ret = mipi_dsi_attach(dsi); in novatek_nt37801_probe()
303 drm_panel_remove(&ctx->panel); in novatek_nt37801_probe()
304 return dev_err_probe(dev, ret, "Failed to attach to DSI host\n"); in novatek_nt37801_probe()
310 static void novatek_nt37801_remove(struct mipi_dsi_device *dsi) in novatek_nt37801_remove() argument
312 struct novatek_nt37801 *ctx = mipi_dsi_get_drvdata(dsi); in novatek_nt37801_remove()
315 ret = mipi_dsi_detach(dsi); in novatek_nt37801_remove()
317 dev_err(&dsi->dev, "Failed to detach from DSI host: %d\n", ret); in novatek_nt37801_remove()
319 drm_panel_remove(&ctx->panel); in novatek_nt37801_remove()
332 .name = "panel-novatek-nt37801",
339 MODULE_DESCRIPTION("Panel driver for the Novatek NT37801/NT37810 AMOLED DSI panel");