Lines Matching +full:enforce +full:- +full:video +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0+
3 * MIPI-DSI Novatek NT35560-based panel controller.
6 * Sony ACX424AKM - a 480x854 AMOLED DSI panel
7 * Sony ACX424AKP - a 480x864 AMOLED DSI panel
9 * Copyright (C) Linaro Ltd. 2019-2021
11 * Based on code and know-how from Marcus Lorentzon
12 * Copyright (C) ST-Ericsson SA 2010
13 * Based on code and know-how from Johan Olson and Joakim Wesslen
24 #include <video/mipi_display.h>
78 * command mode using the maximum HS frequency.
120 * command mode using the maximum HS frequency.
152 struct mipi_dsi_device *dsi = to_mipi_dsi_device(nt->dev); in nt35560_set_brightness()
154 int duty_ns = bl->props.brightness; in nt35560_set_brightness()
166 dev_err(nt->dev, "failed to disable display backlight (%d)\n", ret); in nt35560_set_brightness()
173 pwm_ratio = max(((duty_ns * 256) / period_ns) - 1, 1); in nt35560_set_brightness()
179 dev_dbg(nt->dev, "calculated duty cycle %02x\n", pwm_ratio); in nt35560_set_brightness()
183 dev_err(nt->dev, "failed to set display PWM ratio (%d)\n", ret); in nt35560_set_brightness()
199 dev_err(nt->dev, "failed to unlock CMD 2 (%d)\n", ret); in nt35560_set_brightness()
205 dev_err(nt->dev, "failed to enter page 1 (%d)\n", ret); in nt35560_set_brightness()
211 dev_err(nt->dev, "failed to disable MTP reload (%d)\n", ret); in nt35560_set_brightness()
216 dev_err(nt->dev, "failed to set PWM divisor (%d)\n", ret); in nt35560_set_brightness()
222 dev_err(nt->dev, "failed to lock CMD 2 (%d)\n", ret); in nt35560_set_brightness()
231 dev_err(nt->dev, "failed to enable display backlight (%d)\n", ret); in nt35560_set_brightness()
250 struct mipi_dsi_device *dsi = to_mipi_dsi_device(nt->dev); in nt35560_read_id()
257 dev_err(nt->dev, "could not vendor ID byte\n"); in nt35560_read_id()
262 dev_err(nt->dev, "could not read device version byte\n"); in nt35560_read_id()
267 dev_err(nt->dev, "could not read panel ID byte\n"); in nt35560_read_id()
272 dev_err(nt->dev, "device vendor ID is zero\n"); in nt35560_read_id()
273 return -ENODEV; in nt35560_read_id()
282 dev_info(nt->dev, "MTP vendor: %02x, version: %02x, panel: %02x\n", in nt35560_read_id()
286 dev_info(nt->dev, "unknown vendor: %02x, version: %02x, panel: %02x\n", in nt35560_read_id()
298 ret = regulator_enable(nt->supply); in nt35560_power_on()
300 dev_err(nt->dev, "failed to enable supply (%d)\n", ret); in nt35560_power_on()
305 gpiod_set_value_cansleep(nt->reset_gpio, 1); in nt35560_power_on()
307 /* De-assert RESET */ in nt35560_power_on()
308 gpiod_set_value_cansleep(nt->reset_gpio, 0); in nt35560_power_on()
317 gpiod_set_value_cansleep(nt->reset_gpio, 1); in nt35560_power_off()
320 regulator_disable(nt->supply); in nt35560_power_off()
326 struct mipi_dsi_device *dsi = to_mipi_dsi_device(nt->dev); in nt35560_prepare()
336 dev_err(nt->dev, "failed to read panel ID (%d)\n", ret); in nt35560_prepare()
340 /* Enabe tearing mode: send TE (tearing effect) at VBLANK */ in nt35560_prepare()
344 dev_err(nt->dev, "failed to enable vblank TE (%d)\n", ret); in nt35560_prepare()
361 dev_err(nt->dev, "failed to set MDDI (%d)\n", ret); in nt35560_prepare()
365 /* Exit sleep mode */ in nt35560_prepare()
368 dev_err(nt->dev, "failed to exit sleep mode (%d)\n", ret); in nt35560_prepare()
375 dev_err(nt->dev, "failed to turn display on (%d)\n", ret); in nt35560_prepare()
378 if (nt->video_mode) { in nt35560_prepare()
379 /* In video mode turn peripheral on */ in nt35560_prepare()
382 dev_err(nt->dev, "failed to turn on peripheral\n"); in nt35560_prepare()
397 struct mipi_dsi_device *dsi = to_mipi_dsi_device(nt->dev); in nt35560_unprepare()
402 dev_err(nt->dev, "failed to turn display off (%d)\n", ret); in nt35560_unprepare()
406 /* Enter sleep mode */ in nt35560_unprepare()
409 dev_err(nt->dev, "failed to enter sleep mode (%d)\n", ret); in nt35560_unprepare()
424 const struct nt35560_config *conf = nt->conf; in nt35560_get_modes()
425 struct drm_display_mode *mode; in nt35560_get_modes() local
427 if (nt->video_mode) in nt35560_get_modes()
428 mode = drm_mode_duplicate(connector->dev, in nt35560_get_modes()
429 conf->vid_mode); in nt35560_get_modes()
431 mode = drm_mode_duplicate(connector->dev, in nt35560_get_modes()
432 conf->cmd_mode); in nt35560_get_modes()
433 if (!mode) { in nt35560_get_modes()
434 dev_err(panel->dev, "bad mode or failed to add mode\n"); in nt35560_get_modes()
435 return -EINVAL; in nt35560_get_modes()
437 drm_mode_set_name(mode); in nt35560_get_modes()
438 mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; in nt35560_get_modes()
440 connector->display_info.width_mm = mode->width_mm; in nt35560_get_modes()
441 connector->display_info.height_mm = mode->height_mm; in nt35560_get_modes()
443 drm_mode_probed_add(connector, mode); in nt35560_get_modes()
456 struct device *dev = &dsi->dev; in nt35560_probe()
462 return -ENOMEM; in nt35560_probe()
463 nt->video_mode = of_property_read_bool(dev->of_node, in nt35560_probe()
464 "enforce-video-mode"); in nt35560_probe()
467 nt->dev = dev; in nt35560_probe()
469 nt->conf = of_device_get_match_data(dev); in nt35560_probe()
470 if (!nt->conf) { in nt35560_probe()
472 return -ENODEV; in nt35560_probe()
475 dsi->lanes = 2; in nt35560_probe()
476 dsi->format = MIPI_DSI_FMT_RGB888; in nt35560_probe()
478 * FIXME: these come from the ST-Ericsson vendor driver for the in nt35560_probe()
480 * platform, if you have the datasheet, please cross-check the in nt35560_probe()
483 dsi->lp_rate = 19200000; in nt35560_probe()
484 dsi->hs_rate = 420160000; in nt35560_probe()
486 if (nt->video_mode) in nt35560_probe()
487 /* Burst mode using event for sync */ in nt35560_probe()
488 dsi->mode_flags = in nt35560_probe()
492 dsi->mode_flags = in nt35560_probe()
495 nt->supply = devm_regulator_get(dev, "vddi"); in nt35560_probe()
496 if (IS_ERR(nt->supply)) in nt35560_probe()
497 return PTR_ERR(nt->supply); in nt35560_probe()
500 nt->reset_gpio = devm_gpiod_get_optional(dev, "reset", in nt35560_probe()
502 if (IS_ERR(nt->reset_gpio)) in nt35560_probe()
503 return dev_err_probe(dev, PTR_ERR(nt->reset_gpio), in nt35560_probe()
506 drm_panel_init(&nt->panel, dev, &nt35560_drm_funcs, in nt35560_probe()
509 nt->panel.backlight = devm_backlight_device_register(dev, "nt35560", dev, nt, in nt35560_probe()
511 if (IS_ERR(nt->panel.backlight)) in nt35560_probe()
512 return dev_err_probe(dev, PTR_ERR(nt->panel.backlight), in nt35560_probe()
515 drm_panel_add(&nt->panel); in nt35560_probe()
519 drm_panel_remove(&nt->panel); in nt35560_probe()
531 drm_panel_remove(&nt->panel); in nt35560_remove()
551 .name = "panel-novatek-nt35560",
558 MODULE_DESCRIPTION("MIPI-DSI Novatek NT35560 Panel Driver");