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_hard_coded_modes = p->desc->num_timings || p->desc->num_modes; in panel_edp_get_modes()
593 bool has_override_edid_mode = p->detected_panel && in panel_edp_get_modes()
594 p->detected_panel != ERR_PTR(-EINVAL) && in panel_edp_get_modes()
595 p->detected_panel->override_edid_mode; in panel_edp_get_modes()
597 /* probe EDID if a DDC bus is available */ in panel_edp_get_modes()
598 if (p->ddc) { in panel_edp_get_modes()
599 pm_runtime_get_sync(panel->dev); in panel_edp_get_modes()
601 if (!p->edid) in panel_edp_get_modes()
602 p->edid = drm_get_edid(connector, p->ddc); in panel_edp_get_modes()
604 * If both edid and hard-coded modes exists, skip edid modes to in panel_edp_get_modes()
607 if (p->edid && !has_hard_coded_modes) { in panel_edp_get_modes()
614 p->detected_panel->override_edid_mode); in panel_edp_get_modes()
616 num += drm_add_edid_modes(connector, p->edid); in panel_edp_get_modes()
620 pm_runtime_mark_last_busy(panel->dev); in panel_edp_get_modes()
621 pm_runtime_put_autosuspend(panel->dev); 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()
1164 /* TODO: should be hpd-absent and no-hpd should be set? */
1244 * - If HPD isn't hooked up you still have 200 ms delay.
1245 * - If HPD is hooked up we won't try to look at it for the
1278 /* TODO: should be hpd-absent and no-hpd should be set? */
1316 * - total horizontal time: { 1506, 1592, 1716 }
1317 * - total vertical time: { 788, 800, 868 }
1733 /* TODO: should be hpd-absent and no-hpd should be set? */
1743 .compatible = "edp-panel",
1766 .compatible = "boe,nv110wtm-n61",
1769 .compatible = "boe,nv133fhm-n61",
1772 .compatible = "boe,nv133fhm-n62",
1778 .compatible = "innolux,n116bca-ea1",
1784 .compatible = "innolux,n125hce-gn1",
1787 .compatible = "innolux,p120zdg-bf1",
1790 .compatible = "ivo,m133nwf4-r0",
1793 .compatible = "kingdisplay,kd116n21-30nv-a010",
1796 .compatible = "lg,lp079qx1-sp0v",
1799 .compatible = "lg,lp097qx1-spa1",
1811 .compatible = "samsung,lsn122dl01-c01",
1814 .compatible = "samsung,ltn140at29-301",
1817 .compatible = "sharp,ld-d5116z01b",
1934 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0715, &delay_200_150_e200, "NT116WHM-N21"),
1935 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0731, &delay_200_500_e80, "NT116WHM-N42"),
1936 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0741, &delay_200_500_e200, "NT116WHM-N44"),
1937 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0786, &delay_200_500_p2e80, "NV116WHM-T01"),
1938 EDP_PANEL_ENTRY('B', 'O', 'E', 0x07d1, &boe_nv133fhm_n61.delay, "NV133FHM-N61"),
1939 EDP_PANEL_ENTRY('B', 'O', 'E', 0x07f6, &delay_200_500_e200, "NT140FHM-N44"),
1940 EDP_PANEL_ENTRY('B', 'O', 'E', 0x082d, &boe_nv133fhm_n61.delay, "NV133FHM-N62"),
1941 EDP_PANEL_ENTRY('B', 'O', 'E', 0x08b2, &delay_200_500_e200, "NT140WHM-N49"),
1942 EDP_PANEL_ENTRY('B', 'O', 'E', 0x09c3, &delay_200_500_e50, "NT116WHM-N21,836X2"),
1943 EDP_PANEL_ENTRY('B', 'O', 'E', 0x094b, &delay_200_500_e50, "NT116WHM-N21"),
1944 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0951, &delay_200_500_e80, "NV116WHM-N47"),
1945 EDP_PANEL_ENTRY('B', 'O', 'E', 0x095f, &delay_200_500_e50, "NE135FBM-N41 v8.1"),
1946 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0979, &delay_200_500_e50, "NV116WHM-N49 V8.0"),
1947 EDP_PANEL_ENTRY('B', 'O', 'E', 0x098d, &boe_nv110wtm_n61.delay, "NV110WTM-N61"),
1948 EDP_PANEL_ENTRY('B', 'O', 'E', 0x09ae, &delay_200_500_e200, "NT140FHM-N45"),
1949 EDP_PANEL_ENTRY('B', 'O', 'E', 0x09dd, &delay_200_500_e50, "NT116WHM-N21"),
1950 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0a5d, &delay_200_500_e50, "NV116WHM-N45"),
1951 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0ac5, &delay_200_500_e50, "NV116WHM-N4C"),
1952 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0b43, &delay_200_500_e200, "NV140FHM-T09"),
1953 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0b56, &delay_200_500_e80, "NT140FHM-N47"),
1954 EDP_PANEL_ENTRY('B', 'O', 'E', 0x0c20, &delay_200_500_e80, "NT140FHM-N47"),
1956 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1132, &delay_200_500_e80_d50, "N116BGE-EA2"),
1957 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1138, &innolux_n116bca_ea1.delay, "N116BCA-EA1-RC4"),
1958 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1139, &delay_200_500_e80_d50, "N116BGE-EA2"),
1959 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1145, &delay_200_500_e80_d50, "N116BCN-EB1"),
1960 EDP_PANEL_ENTRY('C', 'M', 'N', 0x114c, &innolux_n116bca_ea1.delay, "N116BCA-EA1"),
1961 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1152, &delay_200_500_e80_d50, "N116BCN-EA1"),
1962 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1153, &delay_200_500_e80_d50, "N116BGE-EA2"),
1963 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1154, &delay_200_500_e80_d50, "N116BCA-EA2"),
1964 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1157, &delay_200_500_e80_d50, "N116BGE-EA2"),
1965 EDP_PANEL_ENTRY('C', 'M', 'N', 0x115b, &delay_200_500_e80_d50, "N116BCN-EB1"),
1966 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1247, &delay_200_500_e80_d50, "N120ACA-EA1"),
1967 EDP_PANEL_ENTRY('C', 'M', 'N', 0x142b, &delay_200_500_e80_d50, "N140HCA-EAC"),
1968 EDP_PANEL_ENTRY('C', 'M', 'N', 0x144f, &delay_200_500_e80_d50, "N140HGA-EA1"),
1969 EDP_PANEL_ENTRY('C', 'M', 'N', 0x1468, &delay_200_500_e80, "N140HGA-EA1"),
1970 EDP_PANEL_ENTRY('C', 'M', 'N', 0x14d4, &delay_200_500_e80_d50, "N140HCA-EAC"),
1971 EDP_PANEL_ENTRY('C', 'M', 'N', 0x14d6, &delay_200_500_e80_d50, "N140BGA-EA4"),
1972 EDP_PANEL_ENTRY('C', 'M', 'N', 0x14e5, &delay_200_500_e80_d50, "N140HGA-EA1"),
1974 EDP_PANEL_ENTRY('H', 'K', 'C', 0x2d5c, &delay_200_500_e200, "MB116AN01-2"),
1979 EDP_PANEL_ENTRY('I', 'V', 'O', 0x854b, &delay_200_500_p2e100, "R133NW4K-R0"),
1982 EDP_PANEL_ENTRY('K', 'D', 'B', 0x0624, &kingdisplay_kd116n21_30nv_a010.delay, "116N21-30NV-A010"),
1983 EDP_PANEL_ENTRY('K', 'D', 'B', 0x1120, &delay_200_500_e80_d50, "116N29-30NK-C007"),
1993 EDP_PANEL_ENTRY('S', 'T', 'A', 0x0100, &delay_100_500_e200, "2081116HHD028001-51D"),
2005 for (panel = edp_panels; panel->panel_id; panel++) in find_edp_panel()
2006 if (panel->panel_id == panel_id) in find_edp_panel()
2016 /* Skip one since "edp-panel" is only supported on DP AUX bus */ in panel_edp_platform_probe()
2017 id = of_match_node(platform_of_match + 1, pdev->dev.of_node); in panel_edp_platform_probe()
2019 return -ENODEV; in panel_edp_platform_probe()
2021 return panel_edp_probe(&pdev->dev, id->data, NULL); in panel_edp_platform_probe()
2026 panel_edp_remove(&pdev->dev); in panel_edp_platform_remove()
2031 panel_edp_shutdown(&pdev->dev); in panel_edp_platform_shutdown()
2042 .name = "panel-edp",
2055 id = of_match_node(platform_of_match, aux_ep->dev.of_node); in panel_edp_dp_aux_ep_probe()
2057 return -ENODEV; in panel_edp_dp_aux_ep_probe()
2059 return panel_edp_probe(&aux_ep->dev, id->data, aux_ep->aux); in panel_edp_dp_aux_ep_probe()
2064 panel_edp_remove(&aux_ep->dev); in panel_edp_dp_aux_ep_remove()
2069 panel_edp_shutdown(&aux_ep->dev); in panel_edp_dp_aux_ep_shutdown()
2074 .name = "panel-simple-dp-aux",