Lines Matching refs:panel
45 * struct panel_desc - Describes a simple panel.
49 * @modes: Pointer to array of fixed modes appropriate for this panel.
74 /** @size: Structure containing the physical size of this panel. */
87 /** @delay: Structure containing various delay values for this panel. */
90 * @delay.prepare: Time for the panel to become ready.
92 * The time (in milliseconds) that it takes for the panel to
98 * @delay.enable: Time for the panel to display a valid frame.
100 * The time (in milliseconds) that it takes for the panel to
107 * @delay.disable: Time for the panel to turn the display off.
109 * The time (in milliseconds) that it takes for the panel to
117 * The time (in milliseconds) that it takes for the panel
160 static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
162 return container_of(panel, struct panel_simple, base);
165 static unsigned int panel_simple_get_timings_modes(struct panel_simple *panel,
171 for (i = 0; i < panel->desc->num_timings; i++) {
172 const struct display_timing *dt = &panel->desc->timings[i];
178 dev_err(panel->base.dev, "failed to add mode %ux%u\n",
187 if (panel->desc->num_timings == 1)
197 static unsigned int panel_simple_get_display_modes(struct panel_simple *panel,
203 for (i = 0; i < panel->desc->num_modes; i++) {
204 const struct drm_display_mode *m = &panel->desc->modes[i];
208 dev_err(panel->base.dev, "failed to add mode %ux%u@%u\n",
216 if (panel->desc->num_modes == 1)
228 static int panel_simple_get_non_edid_modes(struct panel_simple *panel,
232 bool has_override = panel->override_mode.type;
235 if (!panel->desc)
240 &panel->override_mode);
245 dev_err(panel->base.dev, "failed to add override mode\n");
250 if (num == 0 && panel->desc->num_timings)
251 num = panel_simple_get_timings_modes(panel, connector);
259 WARN_ON(panel->desc->num_timings && panel->desc->num_modes);
261 num = panel_simple_get_display_modes(panel, connector);
263 connector->display_info.bpc = panel->desc->bpc;
264 connector->display_info.width_mm = panel->desc->size.width;
265 connector->display_info.height_mm = panel->desc->size.height;
266 if (panel->desc->bus_format)
268 &panel->desc->bus_format, 1);
269 connector->display_info.bus_flags = panel->desc->bus_flags;
288 static int panel_simple_disable(struct drm_panel *panel)
290 struct panel_simple *p = to_panel_simple(panel);
317 static int panel_simple_unprepare(struct drm_panel *panel)
319 struct panel_simple *p = to_panel_simple(panel);
326 pm_runtime_mark_last_busy(panel->dev);
327 ret = pm_runtime_put_autosuspend(panel->dev);
356 static int panel_simple_prepare(struct drm_panel *panel)
358 struct panel_simple *p = to_panel_simple(panel);
365 ret = pm_runtime_get_sync(panel->dev);
367 pm_runtime_put_autosuspend(panel->dev);
376 static int panel_simple_enable(struct drm_panel *panel)
378 struct panel_simple *p = to_panel_simple(panel);
391 static int panel_simple_get_modes(struct drm_panel *panel,
394 struct panel_simple *p = to_panel_simple(panel);
399 pm_runtime_get_sync(panel->dev);
407 pm_runtime_mark_last_busy(panel->dev);
408 pm_runtime_put_autosuspend(panel->dev);
411 /* add hard-coded panel modes */
423 static int panel_simple_get_timings(struct drm_panel *panel,
427 struct panel_simple *p = to_panel_simple(panel);
440 static enum drm_panel_orientation panel_simple_get_orientation(struct drm_panel *panel)
442 struct panel_simple *p = to_panel_simple(panel);
460 struct panel_simple *panel)
478 ret = of_get_display_timing(np, "panel-timing", timing);
480 dev_err(dev, "%pOF: no panel-timing node found for \"panel-dpi\" binding\n",
500 panel->desc = desc;
509 struct panel_simple *panel,
512 const struct panel_desc *desc = panel->desc;
517 dev_err(dev, "Reject override mode: panel has a fixed mode\n");
525 for (i = 0; i < panel->desc->num_timings; i++) {
526 const struct display_timing *dt = &panel->desc->timings[i];
542 drm_display_mode_from_videomode(&vm, &panel->override_mode);
543 panel->override_mode.type |= DRM_MODE_TYPE_DRIVER |
548 if (WARN_ON(!panel->override_mode.type))
554 struct panel_simple *panel;
561 panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL);
562 if (!panel)
565 panel->enabled = false;
566 panel->desc = desc;
568 panel->supply = devm_regulator_get(dev, "power");
569 if (IS_ERR(panel->supply))
570 return PTR_ERR(panel->supply);
572 panel->enable_gpio = devm_gpiod_get_optional(dev, "enable",
574 if (IS_ERR(panel->enable_gpio))
575 return dev_err_probe(dev, PTR_ERR(panel->enable_gpio),
578 err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation);
586 panel->ddc = of_find_i2c_adapter_by_node(ddc);
589 if (!panel->ddc)
594 /* Handle the generic panel-dpi binding */
595 err = panel_dpi_probe(dev, panel);
598 desc = panel->desc;
600 if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
601 panel_simple_parse_panel_timing_node(dev, panel, &dt);
627 dev_warn(dev, "eDP panels moved to panel-edp\n");
658 dev_set_drvdata(dev, panel);
661 * We use runtime PM for prepare / unprepare since those power the panel
663 * to optimize powering the panel on briefly to read the EDID before
664 * fully enabling the panel.
670 drm_panel_init(&panel->base, dev, &panel_simple_funcs, connector_type);
672 err = drm_panel_of_backlight(&panel->base);
678 drm_panel_add(&panel->base);
686 if (panel->ddc)
687 put_device(&panel->ddc->dev);
694 struct panel_simple *panel = dev_get_drvdata(dev);
696 drm_panel_remove(&panel->base);
697 drm_panel_disable(&panel->base);
698 drm_panel_unprepare(&panel->base);
702 if (panel->ddc)
703 put_device(&panel->ddc->dev);
708 struct panel_simple *panel = dev_get_drvdata(dev);
710 drm_panel_disable(&panel->base);
711 drm_panel_unprepare(&panel->base);
3126 * 800x480 CVT. The panel appears to be quite accepting, at least as far as
3871 /* The grayscale panel has 8 bit for the color .. Y (black) */
4477 .compatible = "ti,nspire-cx-lcd-panel",
4480 .compatible = "ti,nspire-classic-lcd-panel",
4510 .compatible = "vivax,tpc9150-panel",
4523 .compatible = "panel-dpi",
4560 .name = "panel-simple",
4826 struct panel_simple *panel = mipi_dsi_get_drvdata(dsi);
4828 drm_panel_remove(&panel->base);
4852 .name = "panel-simple-dsi",