Lines Matching +full:enforce +full:- +full:video +full:- +full:mode

17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
33 #include <video/display_timing.h>
34 #include <video/of_display_timing.h>
35 #include <video/videomode.h>
45 * struct panel_desc - Describes a simple panel.
51 * If only one mode then this can just be the address of the mode.
53 * then you cannot override the mode in the device tree.
93 * become ready and start receiving video data
131 * // enforce prepare_to_enable min time
140 * video data.
210 struct drm_display_mode *mode; in panel_simple_get_timings_modes() local
213 for (i = 0; i < panel->desc->num_timings; i++) { in panel_simple_get_timings_modes()
214 const struct display_timing *dt = &panel->desc->timings[i]; in panel_simple_get_timings_modes()
218 mode = drm_mode_create(connector->dev); in panel_simple_get_timings_modes()
219 if (!mode) { in panel_simple_get_timings_modes()
220 dev_err(panel->base.dev, "failed to add mode %ux%u\n", in panel_simple_get_timings_modes()
221 dt->hactive.typ, dt->vactive.typ); in panel_simple_get_timings_modes()
225 drm_display_mode_from_videomode(&vm, mode); in panel_simple_get_timings_modes()
227 mode->type |= DRM_MODE_TYPE_DRIVER; in panel_simple_get_timings_modes()
229 if (panel->desc->num_timings == 1) in panel_simple_get_timings_modes()
230 mode->type |= DRM_MODE_TYPE_PREFERRED; in panel_simple_get_timings_modes()
232 drm_mode_probed_add(connector, mode); in panel_simple_get_timings_modes()
242 struct drm_display_mode *mode; in panel_simple_get_display_modes() local
245 for (i = 0; i < panel->desc->num_modes; i++) { in panel_simple_get_display_modes()
246 const struct drm_display_mode *m = &panel->desc->modes[i]; in panel_simple_get_display_modes()
248 mode = drm_mode_duplicate(connector->dev, m); in panel_simple_get_display_modes()
249 if (!mode) { in panel_simple_get_display_modes()
250 dev_err(panel->base.dev, "failed to add mode %ux%u@%u\n", in panel_simple_get_display_modes()
251 m->hdisplay, m->vdisplay, in panel_simple_get_display_modes()
256 mode->type |= DRM_MODE_TYPE_DRIVER; in panel_simple_get_display_modes()
258 if (panel->desc->num_modes == 1) in panel_simple_get_display_modes()
259 mode->type |= DRM_MODE_TYPE_PREFERRED; in panel_simple_get_display_modes()
261 drm_mode_set_name(mode); in panel_simple_get_display_modes()
263 drm_mode_probed_add(connector, mode); in panel_simple_get_display_modes()
273 struct drm_display_mode *mode; in panel_simple_get_non_edid_modes() local
274 bool has_override = panel->override_mode.type; in panel_simple_get_non_edid_modes()
277 if (!panel->desc) in panel_simple_get_non_edid_modes()
281 mode = drm_mode_duplicate(connector->dev, in panel_simple_get_non_edid_modes()
282 &panel->override_mode); in panel_simple_get_non_edid_modes()
283 if (mode) { in panel_simple_get_non_edid_modes()
284 drm_mode_probed_add(connector, mode); in panel_simple_get_non_edid_modes()
287 dev_err(panel->base.dev, "failed to add override mode\n"); in panel_simple_get_non_edid_modes()
292 if (num == 0 && panel->desc->num_timings) in panel_simple_get_non_edid_modes()
296 * Only add fixed modes if timings/override added no mode. in panel_simple_get_non_edid_modes()
299 * or a fixed mode. Anything else is rather bogus. in panel_simple_get_non_edid_modes()
301 WARN_ON(panel->desc->num_timings && panel->desc->num_modes); in panel_simple_get_non_edid_modes()
305 connector->display_info.bpc = panel->desc->bpc; in panel_simple_get_non_edid_modes()
306 connector->display_info.width_mm = panel->desc->size.width; in panel_simple_get_non_edid_modes()
307 connector->display_info.height_mm = panel->desc->size.height; in panel_simple_get_non_edid_modes()
308 if (panel->desc->bus_format) in panel_simple_get_non_edid_modes()
309 drm_display_info_set_bus_formats(&connector->display_info, in panel_simple_get_non_edid_modes()
310 &panel->desc->bus_format, 1); in panel_simple_get_non_edid_modes()
311 connector->display_info.bus_flags = panel->desc->bus_flags; in panel_simple_get_non_edid_modes()
334 if (!p->enabled) in panel_simple_disable()
337 if (p->desc->delay.disable) in panel_simple_disable()
338 msleep(p->desc->delay.disable); in panel_simple_disable()
340 p->enabled = false; in panel_simple_disable()
349 gpiod_set_value_cansleep(p->enable_gpio, 0); in panel_simple_suspend()
350 regulator_disable(p->supply); in panel_simple_suspend()
351 p->unprepared_time = ktime_get(); in panel_simple_suspend()
353 kfree(p->edid); in panel_simple_suspend()
354 p->edid = NULL; in panel_simple_suspend()
364 /* Unpreparing when already unprepared is a no-op */ in panel_simple_unprepare()
365 if (!p->prepared) in panel_simple_unprepare()
368 pm_runtime_mark_last_busy(panel->dev); in panel_simple_unprepare()
369 ret = pm_runtime_put_autosuspend(panel->dev); in panel_simple_unprepare()
372 p->prepared = false; in panel_simple_unprepare()
381 p->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); in panel_simple_get_hpd_gpio()
382 if (IS_ERR(p->hpd_gpio)) { in panel_simple_get_hpd_gpio()
383 err = PTR_ERR(p->hpd_gpio); in panel_simple_get_hpd_gpio()
385 if (err != -EPROBE_DEFER) in panel_simple_get_hpd_gpio()
396 struct device *dev = p->base.dev; in panel_simple_prepare_once()
402 panel_simple_wait(p->unprepared_time, p->desc->delay.unprepare); in panel_simple_prepare_once()
404 err = regulator_enable(p->supply); in panel_simple_prepare_once()
410 gpiod_set_value_cansleep(p->enable_gpio, 1); in panel_simple_prepare_once()
412 delay = p->desc->delay.prepare; in panel_simple_prepare_once()
413 if (p->no_hpd) in panel_simple_prepare_once()
414 delay += p->desc->delay.hpd_absent_delay; in panel_simple_prepare_once()
418 if (p->hpd_gpio) { in panel_simple_prepare_once()
419 if (p->desc->delay.hpd_absent_delay) in panel_simple_prepare_once()
420 hpd_wait_us = p->desc->delay.hpd_absent_delay * 1000UL; in panel_simple_prepare_once()
424 err = readx_poll_timeout(gpiod_get_value_cansleep, p->hpd_gpio, in panel_simple_prepare_once()
431 if (err != -ETIMEDOUT) in panel_simple_prepare_once()
438 p->prepared_time = ktime_get(); in panel_simple_prepare_once()
443 gpiod_set_value_cansleep(p->enable_gpio, 0); in panel_simple_prepare_once()
444 regulator_disable(p->supply); in panel_simple_prepare_once()
445 p->unprepared_time = ktime_get(); in panel_simple_prepare_once()
464 if (ret != -ETIMEDOUT) in panel_simple_resume()
468 if (ret == -ETIMEDOUT) in panel_simple_resume()
481 /* Preparing when already prepared is a no-op */ in panel_simple_prepare()
482 if (p->prepared) in panel_simple_prepare()
485 ret = pm_runtime_get_sync(panel->dev); in panel_simple_prepare()
487 pm_runtime_put_autosuspend(panel->dev); in panel_simple_prepare()
491 p->prepared = true; in panel_simple_prepare()
500 if (p->enabled) in panel_simple_enable()
503 if (p->desc->delay.enable) in panel_simple_enable()
504 msleep(p->desc->delay.enable); in panel_simple_enable()
506 panel_simple_wait(p->prepared_time, p->desc->delay.prepare_to_enable); in panel_simple_enable()
508 p->enabled = true; in panel_simple_enable()
520 if (p->ddc) { in panel_simple_get_modes()
521 pm_runtime_get_sync(panel->dev); in panel_simple_get_modes()
523 if (!p->edid) in panel_simple_get_modes()
524 p->edid = drm_get_edid(connector, p->ddc); in panel_simple_get_modes()
526 if (p->edid) in panel_simple_get_modes()
527 num += drm_add_edid_modes(connector, p->edid); in panel_simple_get_modes()
529 pm_runtime_mark_last_busy(panel->dev); in panel_simple_get_modes()
530 pm_runtime_put_autosuspend(panel->dev); in panel_simple_get_modes()
533 /* add hard-coded panel modes */ in panel_simple_get_modes()
537 drm_connector_set_panel_orientation(connector, p->orientation); in panel_simple_get_modes()
549 if (p->desc->num_timings < num_timings) in panel_simple_get_timings()
550 num_timings = p->desc->num_timings; in panel_simple_get_timings()
554 timings[i] = p->desc->timings[i]; in panel_simple_get_timings()
556 return p->desc->num_timings; in panel_simple_get_timings()
580 np = dev->of_node; in panel_dpi_probe()
583 return -ENOMEM; in panel_dpi_probe()
587 return -ENOMEM; in panel_dpi_probe()
589 ret = of_get_display_timing(np, "panel-timing", timing); in panel_dpi_probe()
591 dev_err(dev, "%pOF: no panel-timing node found for \"panel-dpi\" binding\n", in panel_dpi_probe()
596 desc->timings = timing; in panel_dpi_probe()
597 desc->num_timings = 1; in panel_dpi_probe()
599 of_property_read_u32(np, "width-mm", &desc->size.width); in panel_dpi_probe()
600 of_property_read_u32(np, "height-mm", &desc->size.height); in panel_dpi_probe()
604 vm.flags = timing->flags; in panel_dpi_probe()
606 desc->bus_flags = bus_flags; in panel_dpi_probe()
609 desc->connector_type = DRM_MODE_CONNECTOR_DPI; in panel_dpi_probe()
611 panel->desc = desc; in panel_dpi_probe()
617 (to_check->field.typ >= bounds->field.min && \
618 to_check->field.typ <= bounds->field.max)
623 const struct panel_desc *desc = panel->desc; in panel_simple_parse_panel_timing_node()
627 if (WARN_ON(desc->num_modes)) { in panel_simple_parse_panel_timing_node()
628 dev_err(dev, "Reject override mode: panel has a fixed mode\n"); in panel_simple_parse_panel_timing_node()
631 if (WARN_ON(!desc->num_timings)) { in panel_simple_parse_panel_timing_node()
632 dev_err(dev, "Reject override mode: no timings specified\n"); in panel_simple_parse_panel_timing_node()
636 for (i = 0; i < panel->desc->num_timings; i++) { in panel_simple_parse_panel_timing_node()
637 const struct display_timing *dt = &panel->desc->timings[i]; in panel_simple_parse_panel_timing_node()
649 if (ot->flags != dt->flags) in panel_simple_parse_panel_timing_node()
653 drm_display_mode_from_videomode(&vm, &panel->override_mode); in panel_simple_parse_panel_timing_node()
654 panel->override_mode.type |= DRM_MODE_TYPE_DRIVER | in panel_simple_parse_panel_timing_node()
659 if (WARN_ON(!panel->override_mode.type)) in panel_simple_parse_panel_timing_node()
660 dev_err(dev, "Reject override mode: No display_timing found\n"); in panel_simple_parse_panel_timing_node()
675 return -ENOMEM; in panel_simple_probe()
677 panel->enabled = false; in panel_simple_probe()
678 panel->prepared_time = 0; in panel_simple_probe()
679 panel->desc = desc; in panel_simple_probe()
680 panel->aux = aux; in panel_simple_probe()
682 panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd"); in panel_simple_probe()
683 if (!panel->no_hpd) { in panel_simple_probe()
689 panel->supply = devm_regulator_get(dev, "power"); in panel_simple_probe()
690 if (IS_ERR(panel->supply)) in panel_simple_probe()
691 return PTR_ERR(panel->supply); in panel_simple_probe()
693 panel->enable_gpio = devm_gpiod_get_optional(dev, "enable", in panel_simple_probe()
695 if (IS_ERR(panel->enable_gpio)) { in panel_simple_probe()
696 err = PTR_ERR(panel->enable_gpio); in panel_simple_probe()
697 if (err != -EPROBE_DEFER) in panel_simple_probe()
702 err = of_drm_get_panel_orientation(dev->of_node, &panel->orientation); in panel_simple_probe()
704 dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, err); in panel_simple_probe()
708 ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0); in panel_simple_probe()
710 panel->ddc = of_find_i2c_adapter_by_node(ddc); in panel_simple_probe()
713 if (!panel->ddc) in panel_simple_probe()
714 return -EPROBE_DEFER; in panel_simple_probe()
716 panel->ddc = &aux->ddc; in panel_simple_probe()
720 /* Handle the generic panel-dpi binding */ in panel_simple_probe()
725 if (!of_get_display_timing(dev->of_node, "panel-timing", &dt)) in panel_simple_probe()
729 connector_type = desc->connector_type; in panel_simple_probe()
737 WARN_ON(desc->bus_flags & in panel_simple_probe()
742 WARN_ON(desc->bus_format != MEDIA_BUS_FMT_RGB666_1X7X3_SPWG && in panel_simple_probe()
743 desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_SPWG && in panel_simple_probe()
744 desc->bus_format != MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA); in panel_simple_probe()
745 WARN_ON(desc->bus_format == MEDIA_BUS_FMT_RGB666_1X7X3_SPWG && in panel_simple_probe()
746 desc->bpc != 6); in panel_simple_probe()
747 WARN_ON((desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_SPWG || in panel_simple_probe()
748 desc->bus_format == MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA) && in panel_simple_probe()
749 desc->bpc != 8); in panel_simple_probe()
752 if (desc->bpc != 6 && desc->bpc != 8 && desc->bpc != 10) in panel_simple_probe()
753 dev_warn(dev, "Expected bpc in {6,8,10} but got: %u\n", desc->bpc); in panel_simple_probe()
756 if (desc->bpc != 6 && desc->bpc != 8) in panel_simple_probe()
757 dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc); in panel_simple_probe()
768 if (desc->bus_flags & ~bus_flags) in panel_simple_probe()
769 dev_warn(dev, "Unexpected bus_flags(%d)\n", desc->bus_flags & ~bus_flags); in panel_simple_probe()
770 if (!(desc->bus_flags & bus_flags)) in panel_simple_probe()
772 if (desc->bus_format == 0) in panel_simple_probe()
774 if (desc->bpc != 6 && desc->bpc != 8) in panel_simple_probe()
775 dev_warn(dev, "Expected bpc in {6,8} but got: %u\n", desc->bpc); in panel_simple_probe()
778 dev_warn(dev, "Specify a valid connector_type: %d\n", desc->connector_type); in panel_simple_probe()
795 drm_panel_init(&panel->base, dev, &panel_simple_funcs, connector_type); in panel_simple_probe()
797 err = drm_panel_of_backlight(&panel->base); in panel_simple_probe()
801 if (!panel->base.backlight && panel->aux) { in panel_simple_probe()
803 err = drm_panel_dp_aux_backlight(&panel->base, panel->aux); in panel_simple_probe()
810 drm_panel_add(&panel->base); in panel_simple_probe()
818 if (panel->ddc && (!panel->aux || panel->ddc != &panel->aux->ddc)) in panel_simple_probe()
819 put_device(&panel->ddc->dev); in panel_simple_probe()
828 drm_panel_remove(&panel->base); in panel_simple_remove()
829 drm_panel_disable(&panel->base); in panel_simple_remove()
830 drm_panel_unprepare(&panel->base); in panel_simple_remove()
834 if (panel->ddc && (!panel->aux || panel->ddc != &panel->aux->ddc)) in panel_simple_remove()
835 put_device(&panel->ddc->dev); in panel_simple_remove()
844 drm_panel_disable(&panel->base); in panel_simple_shutdown()
845 drm_panel_unprepare(&panel->base); in panel_simple_shutdown()
1645 * - If HPD isn't hooked up you still have 200 ms delay.
1646 * - If HPD is hooked up we won't try to look at it for the
1714 /* S070PWS19HP-FC21 2017/04/22 */
1741 /* S070SWV29HG-DC44 2017/09/21 */
2644 * - total horizontal time: { 1506, 1592, 1716 }
2645 * - total vertical time: { 788, 800, 868 }
3526 * https://www.adafruit.com/images/product-files/2406/c3163.pdf
4333 .hback_porch = { 216 - 128, 216 - 128, 216 - 128 },
4337 .vback_porch = { 35 - 2, 35 - 2, 35 - 2 },
4469 .compatible = "ampire,am-1280800n3tzqw-t00h",
4472 .compatible = "ampire,am-480272h3tmqw-t01h",
4478 .compatible = "arm,rtsm-display",
4481 .compatible = "armadeus,st0700-adapt",
4544 .compatible = "bananapi,s070wv20-ct16",
4547 .compatible = "boe,hv070wsa-100",
4553 .compatible = "boe,nv110wtm-n61",
4556 .compatible = "boe,nv133fhm-n61",
4559 .compatible = "boe,nv133fhm-n62",
4565 .compatible = "cdtech,s043wq26h-ct7",
4568 .compatible = "cdtech,s070pws19hp-fc21",
4571 .compatible = "cdtech,s070swv29hg-dc44",
4574 .compatible = "cdtech,s070wv95-ct16",
4577 .compatible = "chefree,ch101olhlwh-002",
4592 .compatible = "dlc,dlc0700yzg-1",
4628 .compatible = "eink,vb3300-kca",
4634 .compatible = "foxlink,fl500wvr00-a0t",
4664 .compatible = "innolux,g070y2-l01",
4667 .compatible = "innolux,g101ice-l01",
4670 .compatible = "innolux,g121i1-l01",
4673 .compatible = "innolux,g121x1-l03",
4676 .compatible = "innolux,n116bca-ea1",
4682 .compatible = "innolux,n125hce-gn1",
4685 .compatible = "innolux,n156bge-l21",
4688 .compatible = "innolux,p120zdg-bf1",
4691 .compatible = "innolux,zj070na-01p",
4694 .compatible = "ivo,m133nwf4-r0",
4697 .compatible = "kingdisplay,kd116n21-30nv-a010",
4712 .compatible = "lemaker,bl035-rgb-002",
4718 .compatible = "lg,lp079qx1-sp0v",
4721 .compatible = "lg,lp097qx1-spa1",
4733 .compatible = "logictechno,lt161010-2nhc",
4736 .compatible = "logictechno,lt161010-2nhr",
4739 .compatible = "logictechno,lt170410-2whc",
4742 .compatible = "logictechno,lttd800480070-l6wh-rt",
4745 .compatible = "mitsubishi,aa070mc01-ca1",
4748 .compatible = "multi-inno,mi1010ait-1cp",
4751 .compatible = "nec,nl12880bc20-05",
4754 .compatible = "nec,nl4827hc19-05b",
4757 .compatible = "netron-dy,e231732",
4763 .compatible = "newhaven,nhd-4.3-480272ef-atxl",
4766 .compatible = "nlt,nl192108ac18-02d",
4772 .compatible = "okaya,rs800480t-7x0gp",
4775 .compatible = "olimex,lcd-olinuxino-43-ts",
4790 .compatible = "osddisplays,osd070t1718-19ts",
4793 .compatible = "pda,91-00156-a0",
4796 .compatible = "powertip,ph800480t013-idf02",
4799 .compatible = "qiaodian,qd43003c0-40",
4802 .compatible = "qishenglong,gopher2b-lcd",
4808 .compatible = "rocktech,rk101ii01d-ct",
4811 .compatible = "samsung,lsn122dl01-c01",
4817 .compatible = "samsung,ltn140at29-301",
4823 .compatible = "sharp,ld-d5116z01b",
4841 .compatible = "shelly,sca07010-bfn-lnn",
4850 .compatible = "tfc,s9700rtwv43tr-01b",
4862 .compatible = "ti,nspire-cx-lcd-panel",
4865 .compatible = "ti,nspire-classic-lcd-panel",
4871 .compatible = "tpk,f07a-0102",
4874 .compatible = "tpk,f10a-0102",
4877 .compatible = "urt,umsh-8596md-t",
4880 .compatible = "urt,umsh-8596md-1t",
4883 .compatible = "urt,umsh-8596md-7t",
4886 .compatible = "urt,umsh-8596md-11t",
4889 .compatible = "urt,umsh-8596md-19t",
4892 .compatible = "urt,umsh-8596md-20t",
4895 .compatible = "vxt,vl050-8048nt-c01",
4901 .compatible = "yes-optoelectronics,ytc700tlag-05-201c",
4905 .compatible = "panel-dpi",
4917 id = of_match_node(platform_of_match, pdev->dev.of_node); in panel_simple_platform_probe()
4919 return -ENODEV; in panel_simple_platform_probe()
4921 return panel_simple_probe(&pdev->dev, id->data, NULL); in panel_simple_platform_probe()
4926 return panel_simple_remove(&pdev->dev); in panel_simple_platform_remove()
4931 panel_simple_shutdown(&pdev->dev); in panel_simple_platform_shutdown()
4942 .name = "panel-simple",
5166 .compatible = "boe,tv080wum-nl0",
5169 .compatible = "lg,ld070wx3-sl01",
5172 .compatible = "lg,lh500wx1-sd03",
5178 .compatible = "lg,acx467akm-7",
5181 .compatible = "osddisplays,osd101t2045-53ts",
5195 id = of_match_node(dsi_of_match, dsi->dev.of_node); in panel_simple_dsi_probe()
5197 return -ENODEV; in panel_simple_dsi_probe()
5199 desc = id->data; in panel_simple_dsi_probe()
5201 err = panel_simple_probe(&dsi->dev, &desc->desc, NULL); in panel_simple_dsi_probe()
5205 dsi->mode_flags = desc->flags; in panel_simple_dsi_probe()
5206 dsi->format = desc->format; in panel_simple_dsi_probe()
5207 dsi->lanes = desc->lanes; in panel_simple_dsi_probe()
5213 drm_panel_remove(&panel->base); in panel_simple_dsi_probe()
5225 dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", err); in panel_simple_dsi_remove()
5227 return panel_simple_remove(&dsi->dev); in panel_simple_dsi_remove()
5232 panel_simple_shutdown(&dsi->dev); in panel_simple_dsi_shutdown()
5237 .name = "panel-simple-dsi",
5250 id = of_match_node(platform_of_match, aux_ep->dev.of_node); in panel_simple_dp_aux_ep_probe()
5252 return -ENODEV; in panel_simple_dp_aux_ep_probe()
5254 return panel_simple_probe(&aux_ep->dev, id->data, aux_ep->aux); in panel_simple_dp_aux_ep_probe()
5259 panel_simple_remove(&aux_ep->dev); in panel_simple_dp_aux_ep_remove()
5264 panel_simple_shutdown(&aux_ep->dev); in panel_simple_dp_aux_ep_shutdown()
5269 .name = "panel-simple-dp-aux",