Lines Matching +full:e +full:- +full:ddc
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
46 * struct panel_delay - Describes delays for a simple panel.
59 * hpd_absent. While that works, it's non-ideal.
68 * This is T3-max on eDP timing diagrams or the delay from power on
114 * This is (T6-min + max(T7-max, T8-min)) on eDP timing diagrams or
126 * This is T9-min (delay from backlight off to end of valid video
142 * This is T12-min on eDP timing diagrams.
148 * struct panel_desc - Describes a simple 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(). */
224 struct i2c_adapter *ddc; member
250 for (i = 0; i < panel->desc->num_timings; i++) { in panel_edp_get_timings_modes()
251 const struct display_timing *dt = &panel->desc->timings[i]; in panel_edp_get_timings_modes()
255 mode = drm_mode_create(connector->dev); in panel_edp_get_timings_modes()
257 dev_err(panel->base.dev, "failed to add mode %ux%u\n", in panel_edp_get_timings_modes()
258 dt->hactive.typ, dt->vactive.typ); in panel_edp_get_timings_modes()
264 mode->type |= DRM_MODE_TYPE_DRIVER; in panel_edp_get_timings_modes()
266 if (panel->desc->num_timings == 1) in panel_edp_get_timings_modes()
267 mode->type |= DRM_MODE_TYPE_PREFERRED; in panel_edp_get_timings_modes()
282 for (i = 0; i < panel->desc->num_modes; i++) { in panel_edp_get_display_modes()
283 const struct drm_display_mode *m = &panel->desc->modes[i]; in panel_edp_get_display_modes()
285 mode = drm_mode_duplicate(connector->dev, m); in panel_edp_get_display_modes()
287 dev_err(panel->base.dev, "failed to add mode %ux%u@%u\n", in panel_edp_get_display_modes()
288 m->hdisplay, m->vdisplay, in panel_edp_get_display_modes()
293 mode->type |= DRM_MODE_TYPE_DRIVER; in panel_edp_get_display_modes()
295 if (panel->desc->num_modes == 1) in panel_edp_get_display_modes()
296 mode->type |= DRM_MODE_TYPE_PREFERRED; in panel_edp_get_display_modes()
313 mode = drm_mode_duplicate(connector->dev, override_mode); in panel_edp_override_edid_mode()
315 dev_err(panel->base.dev, "failed to add additional mode\n"); in panel_edp_override_edid_mode()
319 mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; in panel_edp_override_edid_mode()
329 bool has_override = panel->override_mode.type; in panel_edp_get_non_edid_modes()
332 if (!panel->desc) in panel_edp_get_non_edid_modes()
336 mode = drm_mode_duplicate(connector->dev, in panel_edp_get_non_edid_modes()
337 &panel->override_mode); in panel_edp_get_non_edid_modes()
342 dev_err(panel->base.dev, "failed to add override mode\n"); in panel_edp_get_non_edid_modes()
347 if (num == 0 && panel->desc->num_timings) in panel_edp_get_non_edid_modes()
356 WARN_ON(panel->desc->num_timings && panel->desc->num_modes); in panel_edp_get_non_edid_modes()
360 connector->display_info.bpc = panel->desc->bpc; in panel_edp_get_non_edid_modes()
361 connector->display_info.width_mm = panel->desc->size.width; in panel_edp_get_non_edid_modes()
362 connector->display_info.height_mm = panel->desc->size.height; in panel_edp_get_non_edid_modes()
385 if (!p->enabled) in panel_edp_disable()
388 if (p->desc->delay.disable) in panel_edp_disable()
389 msleep(p->desc->delay.disable); in panel_edp_disable()
391 p->enabled = false; in panel_edp_disable()
400 gpiod_set_value_cansleep(p->enable_gpio, 0); in panel_edp_suspend()
401 regulator_disable(p->supply); in panel_edp_suspend()
402 p->unprepared_time = ktime_get_boottime(); in panel_edp_suspend()
412 /* Unpreparing when already unprepared is a no-op */ in panel_edp_unprepare()
413 if (!p->prepared) in panel_edp_unprepare()
416 pm_runtime_mark_last_busy(panel->dev); in panel_edp_unprepare()
417 ret = pm_runtime_put_autosuspend(panel->dev); in panel_edp_unprepare()
420 p->prepared = false; in panel_edp_unprepare()
427 p->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); in panel_edp_get_hpd_gpio()
428 if (IS_ERR(p->hpd_gpio)) in panel_edp_get_hpd_gpio()
429 return dev_err_probe(dev, PTR_ERR(p->hpd_gpio), in panel_edp_get_hpd_gpio()
437 return !p->no_hpd && (p->hpd_gpio || (p->aux && p->aux->wait_hpd_asserted)); in panel_edp_can_read_hpd()
442 struct device *dev = p->base.dev; in panel_edp_prepare_once()
448 panel_edp_wait(p->unprepared_time, p->desc->delay.unprepare); in panel_edp_prepare_once()
450 err = regulator_enable(p->supply); in panel_edp_prepare_once()
456 gpiod_set_value_cansleep(p->enable_gpio, 1); in panel_edp_prepare_once()
458 delay = p->desc->delay.hpd_reliable; in panel_edp_prepare_once()
459 if (p->no_hpd) in panel_edp_prepare_once()
460 delay = max(delay, p->desc->delay.hpd_absent); in panel_edp_prepare_once()
465 if (p->desc->delay.hpd_absent) in panel_edp_prepare_once()
466 hpd_wait_us = p->desc->delay.hpd_absent * 1000UL; in panel_edp_prepare_once()
470 if (p->hpd_gpio) { in panel_edp_prepare_once()
472 p->hpd_gpio, hpd_asserted, in panel_edp_prepare_once()
477 err = p->aux->wait_hpd_asserted(p->aux, hpd_wait_us); in panel_edp_prepare_once()
481 if (err != -ETIMEDOUT) in panel_edp_prepare_once()
488 p->prepared_time = ktime_get_boottime(); in panel_edp_prepare_once()
493 gpiod_set_value_cansleep(p->enable_gpio, 0); in panel_edp_prepare_once()
494 regulator_disable(p->supply); in panel_edp_prepare_once()
495 p->unprepared_time = ktime_get_boottime(); in panel_edp_prepare_once()
514 if (ret != -ETIMEDOUT) in panel_edp_resume()
518 if (ret == -ETIMEDOUT) in panel_edp_resume()
531 /* Preparing when already prepared is a no-op */ in panel_edp_prepare()
532 if (p->prepared) in panel_edp_prepare()
535 ret = pm_runtime_get_sync(panel->dev); in panel_edp_prepare()
537 pm_runtime_put_autosuspend(panel->dev); in panel_edp_prepare()
541 p->prepared = true; in panel_edp_prepare()
551 if (p->enabled) in panel_edp_enable()
554 delay = p->desc->delay.enable; in panel_edp_enable()
564 * called (and link training took zero time). Note that "no-hpd" in panel_edp_enable()
573 if (p->desc->delay.prepare_to_enable && in panel_edp_enable()
574 !panel_edp_can_read_hpd(p) && !p->no_hpd) in panel_edp_enable()
575 delay = max(delay, p->desc->delay.prepare_to_enable); in panel_edp_enable()
580 panel_edp_wait(p->prepared_time, p->desc->delay.prepare_to_enable); in panel_edp_enable()
582 p->enabled = true; in panel_edp_enable()
592 bool has_override_edid_mode = p->detected_panel && in panel_edp_get_modes()
593 p->detected_panel != ERR_PTR(-EINVAL) && in panel_edp_get_modes()
594 p->detected_panel->override_edid_mode; in panel_edp_get_modes()
596 /* probe EDID if a DDC bus is available */ in panel_edp_get_modes()
597 if (p->ddc) { in panel_edp_get_modes()
598 pm_runtime_get_sync(panel->dev); in panel_edp_get_modes()
600 if (!p->edid) in panel_edp_get_modes()
601 p->edid = drm_get_edid(connector, p->ddc); in panel_edp_get_modes()
602 if (p->edid) { in panel_edp_get_modes()
609 p->detected_panel->override_edid_mode); in panel_edp_get_modes()
611 num += drm_add_edid_modes(connector, p->edid); in panel_edp_get_modes()
615 pm_runtime_mark_last_busy(panel->dev); in panel_edp_get_modes()
616 pm_runtime_put_autosuspend(panel->dev); in panel_edp_get_modes()
620 * Add hard-coded panel modes. Don't call this if there are no timings in panel_edp_get_modes()
621 * and no modes (the generic edp-panel case) because it will clobber in panel_edp_get_modes()
624 if (p->desc->num_timings || p->desc->num_modes) in panel_edp_get_modes()
627 dev_warn(p->base.dev, "No display modes\n"); in panel_edp_get_modes()
633 drm_connector_set_panel_orientation(connector, p->orientation); in panel_edp_get_modes()
645 if (p->desc->num_timings < num_timings) in panel_edp_get_timings()
646 num_timings = p->desc->num_timings; in panel_edp_get_timings()
650 timings[i] = p->desc->timings[i]; in panel_edp_get_timings()
652 return p->desc->num_timings; in panel_edp_get_timings()
659 return p->orientation; in panel_edp_get_orientation()
664 struct drm_panel *panel = s->private; in detected_panel_show()
667 if (IS_ERR(p->detected_panel)) in detected_panel_show()
669 else if (!p->detected_panel) in detected_panel_show()
672 seq_printf(s, "%s\n", p->detected_panel->name); in detected_panel_show()
696 (to_check->field.typ >= bounds->field.min && \
697 to_check->field.typ <= bounds->field.max)
702 const struct panel_desc *desc = panel->desc; in panel_edp_parse_panel_timing_node()
706 if (WARN_ON(desc->num_modes)) { in panel_edp_parse_panel_timing_node()
710 if (WARN_ON(!desc->num_timings)) { in panel_edp_parse_panel_timing_node()
715 for (i = 0; i < panel->desc->num_timings; i++) { in panel_edp_parse_panel_timing_node()
716 const struct display_timing *dt = &panel->desc->timings[i]; in panel_edp_parse_panel_timing_node()
728 if (ot->flags != dt->flags) in panel_edp_parse_panel_timing_node()
732 drm_display_mode_from_videomode(&vm, &panel->override_mode); in panel_edp_parse_panel_timing_node()
733 panel->override_mode.type |= DRM_MODE_TYPE_DRIVER | in panel_edp_parse_panel_timing_node()
738 if (WARN_ON(!panel->override_mode.type)) in panel_edp_parse_panel_timing_node()
756 return -ENOMEM; in generic_edp_panel_probe()
757 panel->desc = desc; in generic_edp_panel_probe()
764 of_property_read_u32(dev->of_node, "hpd-reliable-delay-ms", &reliable_ms); in generic_edp_panel_probe()
765 desc->delay.hpd_reliable = reliable_ms; in generic_edp_panel_probe()
766 of_property_read_u32(dev->of_node, "hpd-absent-delay-ms", &absent_ms); in generic_edp_panel_probe()
767 desc->delay.hpd_absent = absent_ms; in generic_edp_panel_probe()
776 panel_id = drm_edid_get_panel_id(panel->ddc); in generic_edp_panel_probe()
779 ret = -EIO; in generic_edp_panel_probe()
784 panel->detected_panel = find_edp_panel(panel_id); in generic_edp_panel_probe()
787 * We're using non-optimized timings and want it really obvious that in generic_edp_panel_probe()
791 if (WARN_ON(!panel->detected_panel)) { in generic_edp_panel_probe()
799 * the HPD-related delays must have worked since we got this in generic_edp_panel_probe()
811 desc->delay.unprepare = 2000; in generic_edp_panel_probe()
812 desc->delay.enable = 200; in generic_edp_panel_probe()
814 panel->detected_panel = ERR_PTR(-EINVAL); in generic_edp_panel_probe()
817 vend, panel->detected_panel->name, product_id); in generic_edp_panel_probe()
820 desc->delay = *panel->detected_panel->delay; in generic_edp_panel_probe()
836 struct device_node *ddc; in panel_edp_probe() local
841 return -ENOMEM; in panel_edp_probe()
843 panel->enabled = false; in panel_edp_probe()
844 panel->prepared_time = 0; in panel_edp_probe()
845 panel->desc = desc; in panel_edp_probe()
846 panel->aux = aux; in panel_edp_probe()
848 panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd"); in panel_edp_probe()
849 if (!panel->no_hpd) { in panel_edp_probe()
855 panel->supply = devm_regulator_get(dev, "power"); in panel_edp_probe()
856 if (IS_ERR(panel->supply)) in panel_edp_probe()
857 return PTR_ERR(panel->supply); in panel_edp_probe()
859 panel->enable_gpio = devm_gpiod_get_optional(dev, "enable", in panel_edp_probe()
861 if (IS_ERR(panel->enable_gpio)) in panel_edp_probe()
862 return dev_err_probe(dev, PTR_ERR(panel->enable_gpio), in panel_edp_probe()
865 err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation); in panel_edp_probe()
867 dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err); in panel_edp_probe()
871 ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0); in panel_edp_probe()
872 if (ddc) { in panel_edp_probe()
873 panel->ddc = of_find_i2c_adapter_by_node(ddc); in panel_edp_probe()
874 of_node_put(ddc); in panel_edp_probe()
876 if (!panel->ddc) in panel_edp_probe()
877 return -EPROBE_DEFER; in panel_edp_probe()
879 panel->ddc = &aux->ddc; in panel_edp_probe()
882 if (!of_get_display_timing(dev->of_node, "panel-timing", &dt)) in panel_edp_probe()
887 drm_panel_init(&panel->base, dev, &panel_edp_funcs, DRM_MODE_CONNECTOR_eDP); in panel_edp_probe()
889 err = drm_panel_of_backlight(&panel->base); in panel_edp_probe()
903 if (of_device_is_compatible(dev->of_node, "edp-panel")) { in panel_edp_probe()
911 desc = panel->desc; in panel_edp_probe()
912 } else if (desc->bpc != 6 && desc->bpc != 8 && desc->bpc != 10) { in panel_edp_probe()
913 dev_warn(dev, "Expected bpc in {6,8,10} but got: %u\n", desc->bpc); in panel_edp_probe()
916 if (!panel->base.backlight && panel->aux) { in panel_edp_probe()
918 err = drm_panel_dp_aux_backlight(&panel->base, panel->aux); in panel_edp_probe()
925 drm_panel_add(&panel->base); in panel_edp_probe()
933 if (panel->ddc && (!panel->aux || panel->ddc != &panel->aux->ddc)) in panel_edp_probe()
934 put_device(&panel->ddc->dev); in panel_edp_probe()
943 drm_panel_remove(&panel->base); in panel_edp_remove()
944 drm_panel_disable(&panel->base); in panel_edp_remove()
945 drm_panel_unprepare(&panel->base); in panel_edp_remove()
949 if (panel->ddc && (!panel->aux || panel->ddc != &panel->aux->ddc)) in panel_edp_remove()
950 put_device(&panel->ddc->dev); in panel_edp_remove()
952 kfree(panel->edid); in panel_edp_remove()
953 panel->edid = NULL; in panel_edp_remove()
960 drm_panel_disable(&panel->base); in panel_edp_shutdown()
961 drm_panel_unprepare(&panel->base); in panel_edp_shutdown()
1151 /* TODO: should be hpd-absent and no-hpd should be set? */
1231 * - If HPD isn't hooked up you still have 200 ms delay.
1232 * - If HPD is hooked up we won't try to look at it for the
1265 /* TODO: should be hpd-absent and no-hpd should be set? */
1303 * - total horizontal time: { 1506, 1592, 1716 }
1304 * - total vertical time: { 788, 800, 868 }
1720 /* TODO: should be hpd-absent and no-hpd should be set? */
1730 .compatible = "edp-panel",
1753 .compatible = "boe,nv110wtm-n61",
1756 .compatible = "boe,nv133fhm-n61",
1759 .compatible = "boe,nv133fhm-n62",
1765 .compatible = "innolux,n116bca-ea1",
1771 .compatible = "innolux,n125hce-gn1",
1774 .compatible = "innolux,p120zdg-bf1",
1777 .compatible = "ivo,m133nwf4-r0",
1780 .compatible = "kingdisplay,kd116n21-30nv-a010",
1783 .compatible = "lg,lp079qx1-sp0v",
1786 .compatible = "lg,lp097qx1-spa1",
1798 .compatible = "samsung,lsn122dl01-c01",
1801 .compatible = "samsung,ltn140at29-301",
1804 .compatible = "sharp,ld-d5116z01b",
1893 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0786, &delay_200_500_p2e80, "NV116WHM-T01"),
1894 EDP_PANEL_ENTRY('B', 'O', 'E', 0x07d1, &boe_nv133fhm_n61.delay, "NV133FHM-N61"),
1895 EDP_PANEL_ENTRY('B', 'O', 'E', 0x082d, &boe_nv133fhm_n61.delay, "NV133FHM-N62"),
1896 EDP_PANEL_ENTRY('B', 'O', 'E', 0x09c3, &delay_200_500_e50, "NT116WHM-N21,836X2"),
1897 EDP_PANEL_ENTRY('B', 'O', 'E', 0x094b, &delay_200_500_e50, "NT116WHM-N21"),
1898 EDP_PANEL_ENTRY('B', 'O', 'E', 0x095f, &delay_200_500_e50, "NE135FBM-N41 v8.1"),
1899 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0979, &delay_200_500_e50, "NV116WHM-N49 V8.0"),
1900 EDP_PANEL_ENTRY('B', 'O', 'E', 0x098d, &boe_nv110wtm_n61.delay, "NV110WTM-N61"),
1901 EDP_PANEL_ENTRY('B', 'O', 'E', 0x09dd, &delay_200_500_e50, "NT116WHM-N21"),
1902 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0a5d, &delay_200_500_e50, "NV116WHM-N45"),
1903 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0ac5, &delay_200_500_e50, "NV116WHM-N4C"),
1905 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1139, &delay_200_500_e80_d50, "N116BGE-EA2"),
1906 EDP_PANEL_ENTRY('C', 'M', 'N', 0x114c, &innolux_n116bca_ea1.delay, "N116BCA-EA1"),
1907 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1152, &delay_200_500_e80_d50, "N116BCN-EA1"),
1908 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1153, &delay_200_500_e80_d50, "N116BGE-EA2"),
1909 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1154, &delay_200_500_e80_d50, "N116BCA-EA2"),
1910 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1247, &delay_200_500_e80_d50, "N120ACA-EA1"),
1911 EDP_PANEL_ENTRY('C', 'M', 'N', 0x14d4, &delay_200_500_e80_d50, "N140HCA-EAC"),
1915 EDP_PANEL_ENTRY('I', 'V', 'O', 0x854b, &delay_200_500_p2e100, "R133NW4K-R0"),
1917 EDP_PANEL_ENTRY('K', 'D', 'B', 0x0624, &kingdisplay_kd116n21_30nv_a010.delay, "116N21-30NV-A010"),
1918 EDP_PANEL_ENTRY('K', 'D', 'B', 0x1120, &delay_200_500_e80_d50, "116N29-30NK-C007"),
1924 EDP_PANEL_ENTRY('S', 'T', 'A', 0x0100, &delay_100_500_e200, "2081116HHD028001-51D"),
1936 for (panel = edp_panels; panel->panel_id; panel++) in find_edp_panel()
1937 if (panel->panel_id == panel_id) in find_edp_panel()
1947 /* Skip one since "edp-panel" is only supported on DP AUX bus */ in panel_edp_platform_probe()
1948 id = of_match_node(platform_of_match + 1, pdev->dev.of_node); in panel_edp_platform_probe()
1950 return -ENODEV; in panel_edp_platform_probe()
1952 return panel_edp_probe(&pdev->dev, id->data, NULL); in panel_edp_platform_probe()
1957 panel_edp_remove(&pdev->dev); in panel_edp_platform_remove()
1962 panel_edp_shutdown(&pdev->dev); in panel_edp_platform_shutdown()
1973 .name = "panel-edp",
1986 id = of_match_node(platform_of_match, aux_ep->dev.of_node); in panel_edp_dp_aux_ep_probe()
1988 return -ENODEV; in panel_edp_dp_aux_ep_probe()
1990 return panel_edp_probe(&aux_ep->dev, id->data, aux_ep->aux); in panel_edp_dp_aux_ep_probe()
1995 panel_edp_remove(&aux_ep->dev); in panel_edp_dp_aux_ep_remove()
2000 panel_edp_shutdown(&aux_ep->dev); in panel_edp_dp_aux_ep_shutdown()
2005 .name = "panel-simple-dp-aux",