Lines Matching full:panel

46  * struct panel_delay - Describes delays for a simple panel.
52 * The time (in milliseconds) that it takes after powering the panel
56 * NOTE: on some old panel data this number appears to be much too big.
108 * @enable: Time for the panel to display a valid frame.
110 * The time (in milliseconds) that it takes for the panel to
121 * @disable: Time for the panel to turn the display off.
123 * The time (in milliseconds) that it takes for the panel to
134 * The time (in milliseconds) that it takes for the panel
148 * struct panel_desc - Describes a simple panel.
152 * @modes: Pointer to array of fixed modes appropriate for this panel.
177 /** @size: Structure containing the physical size of this panel. */
190 /** @delay: Structure containing various delay values for this panel. */
195 * struct edp_panel_entry - Maps panel ID to delay / panel name.
198 /** @panel_id: 32-bit ID for panel, encoded with drm_edid_encode_panel_id(). */
201 /** @delay: The power sequencing delays needed for this panel. */
204 /** @name: Name of this panel (for printing to logs). */
236 static inline struct panel_edp *to_panel_edp(struct drm_panel *panel) in to_panel_edp() argument
238 return container_of(panel, struct panel_edp, base); in to_panel_edp()
241 static unsigned int panel_edp_get_timings_modes(struct panel_edp *panel, in panel_edp_get_timings_modes() argument
247 for (i = 0; i < panel->desc->num_timings; i++) { in panel_edp_get_timings_modes()
248 const struct display_timing *dt = &panel->desc->timings[i]; in panel_edp_get_timings_modes()
254 dev_err(panel->base.dev, "failed to add mode %ux%u\n", in panel_edp_get_timings_modes()
263 if (panel->desc->num_timings == 1) in panel_edp_get_timings_modes()
273 static unsigned int panel_edp_get_display_modes(struct panel_edp *panel, in panel_edp_get_display_modes() argument
279 for (i = 0; i < panel->desc->num_modes; i++) { in panel_edp_get_display_modes()
280 const struct drm_display_mode *m = &panel->desc->modes[i]; in panel_edp_get_display_modes()
284 dev_err(panel->base.dev, "failed to add mode %ux%u@%u\n", in panel_edp_get_display_modes()
292 if (panel->desc->num_modes == 1) in panel_edp_get_display_modes()
304 static int panel_edp_get_non_edid_modes(struct panel_edp *panel, in panel_edp_get_non_edid_modes() argument
308 bool has_override = panel->override_mode.type; in panel_edp_get_non_edid_modes()
311 if (!panel->desc) in panel_edp_get_non_edid_modes()
316 &panel->override_mode); in panel_edp_get_non_edid_modes()
321 dev_err(panel->base.dev, "failed to add override mode\n"); in panel_edp_get_non_edid_modes()
326 if (num == 0 && panel->desc->num_timings) in panel_edp_get_non_edid_modes()
327 num = panel_edp_get_timings_modes(panel, connector); in panel_edp_get_non_edid_modes()
335 WARN_ON(panel->desc->num_timings && panel->desc->num_modes); in panel_edp_get_non_edid_modes()
337 num = panel_edp_get_display_modes(panel, connector); in panel_edp_get_non_edid_modes()
339 connector->display_info.bpc = panel->desc->bpc; in panel_edp_get_non_edid_modes()
340 connector->display_info.width_mm = panel->desc->size.width; in panel_edp_get_non_edid_modes()
341 connector->display_info.height_mm = panel->desc->size.height; in panel_edp_get_non_edid_modes()
360 static int panel_edp_disable(struct drm_panel *panel) in panel_edp_disable() argument
362 struct panel_edp *p = to_panel_edp(panel); in panel_edp_disable()
386 static int panel_edp_unprepare(struct drm_panel *panel) in panel_edp_unprepare() argument
388 struct panel_edp *p = to_panel_edp(panel); in panel_edp_unprepare()
395 pm_runtime_mark_last_busy(panel->dev); in panel_edp_unprepare()
396 ret = pm_runtime_put_autosuspend(panel->dev); in panel_edp_unprepare()
505 static int panel_edp_prepare(struct drm_panel *panel) in panel_edp_prepare() argument
507 struct panel_edp *p = to_panel_edp(panel); in panel_edp_prepare()
514 ret = pm_runtime_get_sync(panel->dev); in panel_edp_prepare()
516 pm_runtime_put_autosuspend(panel->dev); in panel_edp_prepare()
525 static int panel_edp_enable(struct drm_panel *panel) in panel_edp_enable() argument
527 struct panel_edp *p = to_panel_edp(panel); in panel_edp_enable()
538 * However, we can only count this if HPD is readable by the panel in panel_edp_enable()
566 static int panel_edp_get_modes(struct drm_panel *panel, in panel_edp_get_modes() argument
569 struct panel_edp *p = to_panel_edp(panel); in panel_edp_get_modes()
574 pm_runtime_get_sync(panel->dev); in panel_edp_get_modes()
582 pm_runtime_mark_last_busy(panel->dev); in panel_edp_get_modes()
583 pm_runtime_put_autosuspend(panel->dev); in panel_edp_get_modes()
587 * Add hard-coded panel modes. Don't call this if there are no timings in panel_edp_get_modes()
588 * and no modes (the generic edp-panel case) because it will clobber in panel_edp_get_modes()
605 static int panel_edp_get_timings(struct drm_panel *panel, in panel_edp_get_timings() argument
609 struct panel_edp *p = to_panel_edp(panel); in panel_edp_get_timings()
622 static enum drm_panel_orientation panel_edp_get_orientation(struct drm_panel *panel) in panel_edp_get_orientation() argument
624 struct panel_edp *p = to_panel_edp(panel); in panel_edp_get_orientation()
631 struct drm_panel *panel = s->private; in detected_panel_show() local
632 struct panel_edp *p = to_panel_edp(panel); in detected_panel_show()
646 static void panel_edp_debugfs_init(struct drm_panel *panel, struct dentry *root) in panel_edp_debugfs_init() argument
648 debugfs_create_file("detected_panel", 0600, root, panel, &detected_panel_fops); in panel_edp_debugfs_init()
666 struct panel_edp *panel, in panel_edp_parse_panel_timing_node() argument
669 const struct panel_desc *desc = panel->desc; in panel_edp_parse_panel_timing_node()
674 dev_err(dev, "Reject override mode: panel has a fixed mode\n"); in panel_edp_parse_panel_timing_node()
682 for (i = 0; i < panel->desc->num_timings; i++) { in panel_edp_parse_panel_timing_node()
683 const struct display_timing *dt = &panel->desc->timings[i]; in panel_edp_parse_panel_timing_node()
699 drm_display_mode_from_videomode(&vm, &panel->override_mode); in panel_edp_parse_panel_timing_node()
700 panel->override_mode.type |= DRM_MODE_TYPE_DRIVER | in panel_edp_parse_panel_timing_node()
705 if (WARN_ON(!panel->override_mode.type)) in panel_edp_parse_panel_timing_node()
711 static int generic_edp_panel_probe(struct device *dev, struct panel_edp *panel) in generic_edp_panel_probe() argument
724 panel->desc = desc; in generic_edp_panel_probe()
736 /* Power the panel on so we can read the EDID */ in generic_edp_panel_probe()
739 dev_err(dev, "Couldn't power on panel to read EDID: %d\n", ret); in generic_edp_panel_probe()
743 panel_id = drm_edid_get_panel_id(panel->ddc); in generic_edp_panel_probe()
745 dev_err(dev, "Couldn't identify panel via EDID\n"); in generic_edp_panel_probe()
751 panel->detected_panel = find_edp_panel(panel_id); in generic_edp_panel_probe()
758 if (WARN_ON(!panel->detected_panel)) { in generic_edp_panel_probe()
760 "Unknown panel %s %#06x, using conservative timings\n", in generic_edp_panel_probe()
764 * It's highly likely that the panel will work if we use very in generic_edp_panel_probe()
781 panel->detected_panel = ERR_PTR(-EINVAL); in generic_edp_panel_probe()
784 vend, panel->detected_panel->name, product_id); in generic_edp_panel_probe()
787 desc->delay = *panel->detected_panel->delay; in generic_edp_panel_probe()
801 struct panel_edp *panel; in panel_edp_probe() local
806 panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL); in panel_edp_probe()
807 if (!panel) in panel_edp_probe()
810 panel->enabled = false; in panel_edp_probe()
811 panel->prepared_time = 0; in panel_edp_probe()
812 panel->desc = desc; in panel_edp_probe()
813 panel->aux = aux; in panel_edp_probe()
815 panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd"); in panel_edp_probe()
816 if (!panel->no_hpd) { in panel_edp_probe()
817 err = panel_edp_get_hpd_gpio(dev, panel); in panel_edp_probe()
822 panel->supply = devm_regulator_get(dev, "power"); in panel_edp_probe()
823 if (IS_ERR(panel->supply)) in panel_edp_probe()
824 return PTR_ERR(panel->supply); in panel_edp_probe()
826 panel->enable_gpio = devm_gpiod_get_optional(dev, "enable", in panel_edp_probe()
828 if (IS_ERR(panel->enable_gpio)) in panel_edp_probe()
829 return dev_err_probe(dev, PTR_ERR(panel->enable_gpio), in panel_edp_probe()
832 err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation); in panel_edp_probe()
840 panel->ddc = of_find_i2c_adapter_by_node(ddc); in panel_edp_probe()
843 if (!panel->ddc) in panel_edp_probe()
846 panel->ddc = &aux->ddc; in panel_edp_probe()
849 if (!of_get_display_timing(dev->of_node, "panel-timing", &dt)) in panel_edp_probe()
850 panel_edp_parse_panel_timing_node(dev, panel, &dt); in panel_edp_probe()
852 dev_set_drvdata(dev, panel); in panel_edp_probe()
854 drm_panel_init(&panel->base, dev, &panel_edp_funcs, DRM_MODE_CONNECTOR_eDP); in panel_edp_probe()
856 err = drm_panel_of_backlight(&panel->base); in panel_edp_probe()
861 * We use runtime PM for prepare / unprepare since those power the panel in panel_edp_probe()
863 * to optimize powering the panel on briefly to read the EDID before in panel_edp_probe()
864 * fully enabling the panel. in panel_edp_probe()
870 if (of_device_is_compatible(dev->of_node, "edp-panel")) { in panel_edp_probe()
871 err = generic_edp_panel_probe(dev, panel); in panel_edp_probe()
874 "Couldn't detect panel nor find a fallback\n"); in panel_edp_probe()
877 /* generic_edp_panel_probe() replaces desc in the panel */ in panel_edp_probe()
878 desc = panel->desc; in panel_edp_probe()
883 if (!panel->base.backlight && panel->aux) { in panel_edp_probe()
885 err = drm_panel_dp_aux_backlight(&panel->base, panel->aux); in panel_edp_probe()
892 drm_panel_add(&panel->base); in panel_edp_probe()
900 if (panel->ddc && (!panel->aux || panel->ddc != &panel->aux->ddc)) in panel_edp_probe()
901 put_device(&panel->ddc->dev); in panel_edp_probe()
908 struct panel_edp *panel = dev_get_drvdata(dev); in panel_edp_remove() local
910 drm_panel_remove(&panel->base); in panel_edp_remove()
911 drm_panel_disable(&panel->base); in panel_edp_remove()
912 drm_panel_unprepare(&panel->base); in panel_edp_remove()
916 if (panel->ddc && (!panel->aux || panel->ddc != &panel->aux->ddc)) in panel_edp_remove()
917 put_device(&panel->ddc->dev); in panel_edp_remove()
919 kfree(panel->edid); in panel_edp_remove()
920 panel->edid = NULL; in panel_edp_remove()
925 struct panel_edp *panel = dev_get_drvdata(dev); in panel_edp_shutdown() local
927 drm_panel_disable(&panel->base); in panel_edp_shutdown()
928 drm_panel_unprepare(&panel->base); in panel_edp_shutdown()
1191 * When power is first given to the panel there's a short
1695 .compatible = "edp-panel",
1834 * platform_of_match table (if a panel is listed in both places).
1884 const struct edp_panel_entry *panel; in find_edp_panel() local
1889 for (panel = edp_panels; panel->panel_id; panel++) in find_edp_panel()
1890 if (panel->panel_id == panel_id) in find_edp_panel()
1891 return panel; in find_edp_panel()
1900 /* Skip one since "edp-panel" is only supported on DP AUX bus */ in panel_edp_platform_probe()
1926 .name = "panel-edp",
1958 .name = "panel-simple-dp-aux",