Lines Matching defs:panel

46  * struct panel_desc - Describes a simple panel.
50 * @modes: Pointer to array of fixed modes appropriate for this panel.
75 /** @size: Structure containing the physical size of this panel. */
88 /** @delay: Structure containing various delay values for this panel. */
91 * @delay.prepare: Time for the panel to become ready.
93 * The time (in milliseconds) that it takes for the panel to
99 * @delay.enable: Time for the panel to display a valid frame.
101 * The time (in milliseconds) that it takes for the panel to
108 * @delay.disable: Time for the panel to turn the display off.
110 * The time (in milliseconds) that it takes for the panel to
118 * The time (in milliseconds) that it takes for the panel
161 static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
163 return container_of(panel, struct panel_simple, base);
166 static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel,
172 for (i = 0; i < panel->desc->num_timings; i++) {
173 const struct display_timing *dt = &panel->desc->timings[i];
179 dev_err(panel->base.dev, "failed to add mode %ux%u\n",
188 if (panel->desc->num_timings == 1)
198 static unsigned int panel_simple_get_display_modes(struct panel_simple *panel,
204 for (i = 0; i < panel->desc->num_modes; i++) {
205 const struct drm_display_mode *m = &panel->desc->modes[i];
209 dev_err(panel->base.dev, "failed to add mode %ux%u@%u\n",
217 if (panel->desc->num_modes == 1)
229 static int panel_simple_get_non_edid_modes(struct panel_simple *panel,
233 bool has_override = panel->override_mode.type;
236 if (!panel->desc)
241 &panel->override_mode);
246 dev_err(panel->base.dev, "failed to add override mode\n");
251 if (num == 0 && panel->desc->num_timings)
252 num = panel_simple_get_timings_modes(panel, connector);
260 WARN_ON(panel->desc->num_timings && panel->desc->num_modes);
262 num = panel_simple_get_display_modes(panel, connector);
264 connector->display_info.bpc = panel->desc->bpc;
265 connector->display_info.width_mm = panel->desc->size.width;
266 connector->display_info.height_mm = panel->desc->size.height;
267 if (panel->desc->bus_format)
269 &panel->desc->bus_format, 1);
270 connector->display_info.bus_flags = panel->desc->bus_flags;
289 static int panel_simple_disable(struct drm_panel *panel)
291 struct panel_simple *p = to_panel_simple(panel);
318 static int panel_simple_unprepare(struct drm_panel *panel)
320 struct panel_simple *p = to_panel_simple(panel);
327 pm_runtime_mark_last_busy(panel->dev);
328 ret = pm_runtime_put_autosuspend(panel->dev);
357 static int panel_simple_prepare(struct drm_panel *panel)
359 struct panel_simple *p = to_panel_simple(panel);
366 ret = pm_runtime_get_sync(panel->dev);
368 pm_runtime_put_autosuspend(panel->dev);
377 static int panel_simple_enable(struct drm_panel *panel)
379 struct panel_simple *p = to_panel_simple(panel);
392 static int panel_simple_get_modes(struct drm_panel *panel,
395 struct panel_simple *p = to_panel_simple(panel);
400 pm_runtime_get_sync(panel->dev);
409 pm_runtime_mark_last_busy(panel->dev);
410 pm_runtime_put_autosuspend(panel->dev);
413 /* add hard-coded panel modes */
425 static int panel_simple_get_timings(struct drm_panel *panel,
429 struct panel_simple *p = to_panel_simple(panel);
442 static enum drm_panel_orientation panel_simple_get_orientation(struct drm_panel *panel)
444 struct panel_simple *p = to_panel_simple(panel);
462 struct panel_simple *panel)
480 ret = of_get_display_timing(np, "panel-timing", timing);
482 dev_err(dev, "%pOF: no panel-timing node found for \"panel-dpi\" binding\n",
502 panel->desc = desc;
511 struct panel_simple *panel,
514 const struct panel_desc *desc = panel->desc;
519 dev_err(dev, "Reject override mode: panel has a fixed mode\n");
527 for (i = 0; i < panel->desc->num_timings; i++) {
528 const struct display_timing *dt = &panel->desc->timings[i];
544 drm_display_mode_from_videomode(&vm, &panel->override_mode);
545 panel->override_mode.type |= DRM_MODE_TYPE_DRIVER |
550 if (WARN_ON(!panel->override_mode.type))
555 struct panel_simple *panel)
584 if (panel->desc->bpc != bpc || panel->desc->bus_format != ret) {
587 override_desc = devm_kmemdup(dev, panel->desc, sizeof(*panel->desc), GFP_KERNEL);
593 panel->desc = override_desc;
601 struct panel_simple *panel;
608 panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL);
609 if (!panel)
612 panel->enabled = false;
613 panel->desc = desc;
615 panel->supply = devm_regulator_get(dev, "power");
616 if (IS_ERR(panel->supply))
617 return PTR_ERR(panel->supply);
619 panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
621 if (IS_ERR(panel->enable_gpio))
622 return dev_err_probe(dev, PTR_ERR(panel->enable_gpio),
625 err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
633 panel->ddc = of_find_i2c_adapter_by_node(ddc);
636 if (!panel->ddc)
641 /* Handle the generic panel-dpi binding */
642 err = panel_dpi_probe(dev, panel);
645 desc = panel->desc;
647 if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
648 panel_simple_parse_panel_timing_node(dev, panel, &dt);
653 err = panel_simple_override_nondefault_lvds_datamapping(dev, panel);
681 dev_warn(dev, "eDP panels moved to panel-edp\n");
712 dev_set_drvdata(dev, panel);
715 * We use runtime PM for prepare / unprepare since those power the panel
717 * to optimize powering the panel on briefly to read the EDID before
718 * fully enabling the panel.
724 drm_panel_init(&panel->base, dev, &panel_simple_funcs, connector_type);
726 err = drm_panel_of_backlight(&panel->base);
732 drm_panel_add(&panel->base);
740 if (panel->ddc)
741 put_device(&panel->ddc->dev);
748 struct panel_simple *panel = dev_get_drvdata(dev);
750 drm_panel_remove(&panel->base);
751 drm_panel_disable(&panel->base);
752 drm_panel_unprepare(&panel->base);
756 if (panel->ddc)
757 put_device(&panel->ddc->dev);
762 struct panel_simple *panel = dev_get_drvdata(dev);
764 drm_panel_disable(&panel->base);
765 drm_panel_unprepare(&panel->base);
3385 * 800x480 CVT. The panel appears to be quite accepting, at least as far as
4157 /* The grayscale panel has 8 bit for the color .. Y (black) */
4790 .compatible = "ti,nspire-cx-lcd-panel",
4793 .compatible = "ti,nspire-classic-lcd-panel",
4823 .compatible = "vivax,tpc9150-panel",
4836 .compatible = "panel-dpi",
4873 .name = "panel-simple",
5139 struct panel_simple *panel = mipi_dsi_get_drvdata(dsi);
5141 drm_panel_remove(&panel->base);
5165 .name = "panel-simple-dsi",