Lines Matching +full:lvds +full:- +full:encoder

1 // SPDX-License-Identifier: GPL-2.0-only
21 struct drm_device *dev = mdp4_kms->dev; in mdp4_hw_init()
26 pm_runtime_get_sync(dev->dev); in mdp4_hw_init()
38 DRM_DEV_ERROR(dev->dev, "unexpected MDP version: v%d.%d\n", in mdp4_hw_init()
40 ret = -ENXIO; in mdp4_hw_init()
44 mdp4_kms->rev = minor; in mdp4_hw_init()
46 if (mdp4_kms->rev > 1) { in mdp4_hw_init()
56 clk = clk_get_rate(mdp4_kms->clk); in mdp4_hw_init()
58 if ((mdp4_kms->rev >= 1) || (clk >= 90000000)) { in mdp4_hw_init()
59 dmap_cfg = 0x47; /* 16 bytes-burst x 8 req */ in mdp4_hw_init()
60 vg_cfg = 0x47; /* 16 bytes-burs x 8 req */ in mdp4_hw_init()
62 dmap_cfg = 0x27; /* 8 bytes-burst x 8 req */ in mdp4_hw_init()
63 vg_cfg = 0x43; /* 16 bytes-burst x 4 req */ in mdp4_hw_init()
76 if (mdp4_kms->rev >= 2) in mdp4_hw_init()
88 if (mdp4_kms->rev > 1) in mdp4_hw_init()
91 dev->mode_config.allow_fb_modifiers = true; in mdp4_hw_init()
94 pm_runtime_put_sync(dev->dev); in mdp4_hw_init()
132 for_each_crtc_mask(mdp4_kms->dev, crtc, crtc_mask) in mdp4_wait_flush()
142 for_each_crtc_mask(mdp4_kms->dev, crtc, crtc_mask) in mdp4_complete_commit()
147 struct drm_encoder *encoder) in mdp4_round_pixclk() argument
149 /* if we had >1 encoder, we'd need something more clever: */ in mdp4_round_pixclk()
150 switch (encoder->encoder_type) { in mdp4_round_pixclk()
152 return mdp4_dtv_round_pixclk(encoder, rate); in mdp4_round_pixclk()
163 struct device *dev = mdp4_kms->dev->dev; in mdp4_destroy()
164 struct msm_gem_address_space *aspace = kms->aspace; in mdp4_destroy()
166 if (mdp4_kms->blank_cursor_iova) in mdp4_destroy()
167 msm_gem_unpin_iova(mdp4_kms->blank_cursor_bo, kms->aspace); in mdp4_destroy()
168 drm_gem_object_put(mdp4_kms->blank_cursor_bo); in mdp4_destroy()
171 aspace->mmu->funcs->detach(aspace->mmu); in mdp4_destroy()
175 if (mdp4_kms->rpm_enabled) in mdp4_destroy()
207 clk_disable_unprepare(mdp4_kms->clk); in mdp4_disable()
208 if (mdp4_kms->pclk) in mdp4_disable()
209 clk_disable_unprepare(mdp4_kms->pclk); in mdp4_disable()
210 if (mdp4_kms->lut_clk) in mdp4_disable()
211 clk_disable_unprepare(mdp4_kms->lut_clk); in mdp4_disable()
212 if (mdp4_kms->axi_clk) in mdp4_disable()
213 clk_disable_unprepare(mdp4_kms->axi_clk); in mdp4_disable()
222 clk_prepare_enable(mdp4_kms->clk); in mdp4_enable()
223 if (mdp4_kms->pclk) in mdp4_enable()
224 clk_prepare_enable(mdp4_kms->pclk); in mdp4_enable()
225 if (mdp4_kms->lut_clk) in mdp4_enable()
226 clk_prepare_enable(mdp4_kms->lut_clk); in mdp4_enable()
227 if (mdp4_kms->axi_clk) in mdp4_enable()
228 clk_prepare_enable(mdp4_kms->axi_clk); in mdp4_enable()
237 struct drm_device *dev = mdp4_kms->dev; in mdp4_modeset_init_intf()
238 struct msm_drm_private *priv = dev->dev_private; in mdp4_modeset_init_intf()
239 struct drm_encoder *encoder; in mdp4_modeset_init_intf() local
249 * initialize LCDC encoder and LVDS connector) in mdp4_modeset_init_intf()
251 panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0); in mdp4_modeset_init_intf()
255 encoder = mdp4_lcdc_encoder_init(dev, panel_node); in mdp4_modeset_init_intf()
256 if (IS_ERR(encoder)) { in mdp4_modeset_init_intf()
257 DRM_DEV_ERROR(dev->dev, "failed to construct LCDC encoder\n"); in mdp4_modeset_init_intf()
258 return PTR_ERR(encoder); in mdp4_modeset_init_intf()
262 encoder->possible_crtcs = 1 << DMA_P; in mdp4_modeset_init_intf()
264 connector = mdp4_lvds_connector_init(dev, panel_node, encoder); in mdp4_modeset_init_intf()
266 DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n"); in mdp4_modeset_init_intf()
270 priv->encoders[priv->num_encoders++] = encoder; in mdp4_modeset_init_intf()
271 priv->connectors[priv->num_connectors++] = connector; in mdp4_modeset_init_intf()
275 encoder = mdp4_dtv_encoder_init(dev); in mdp4_modeset_init_intf()
276 if (IS_ERR(encoder)) { in mdp4_modeset_init_intf()
277 DRM_DEV_ERROR(dev->dev, "failed to construct DTV encoder\n"); in mdp4_modeset_init_intf()
278 return PTR_ERR(encoder); in mdp4_modeset_init_intf()
282 encoder->possible_crtcs = 1 << 1; in mdp4_modeset_init_intf()
284 if (priv->hdmi) { in mdp4_modeset_init_intf()
286 ret = msm_hdmi_modeset_init(priv->hdmi, dev, encoder); in mdp4_modeset_init_intf()
288 DRM_DEV_ERROR(dev->dev, "failed to initialize HDMI: %d\n", ret); in mdp4_modeset_init_intf()
293 priv->encoders[priv->num_encoders++] = encoder; in mdp4_modeset_init_intf()
300 if (!priv->dsi[dsi_id]) in mdp4_modeset_init_intf()
303 encoder = mdp4_dsi_encoder_init(dev); in mdp4_modeset_init_intf()
304 if (IS_ERR(encoder)) { in mdp4_modeset_init_intf()
305 ret = PTR_ERR(encoder); in mdp4_modeset_init_intf()
306 DRM_DEV_ERROR(dev->dev, in mdp4_modeset_init_intf()
307 "failed to construct DSI encoder: %d\n", ret); in mdp4_modeset_init_intf()
312 encoder->possible_crtcs = 1 << DMA_P; in mdp4_modeset_init_intf()
313 priv->encoders[priv->num_encoders++] = encoder; in mdp4_modeset_init_intf()
315 ret = msm_dsi_modeset_init(priv->dsi[dsi_id], dev, encoder); in mdp4_modeset_init_intf()
317 DRM_DEV_ERROR(dev->dev, "failed to initialize DSI: %d\n", in mdp4_modeset_init_intf()
324 DRM_DEV_ERROR(dev->dev, "Invalid or unsupported interface\n"); in mdp4_modeset_init_intf()
325 return -EINVAL; in mdp4_modeset_init_intf()
333 struct drm_device *dev = mdp4_kms->dev; in modeset_init()
334 struct msm_drm_private *priv = dev->dev_private; in modeset_init()
356 /* construct non-private planes: */ in modeset_init()
360 DRM_DEV_ERROR(dev->dev, in modeset_init()
365 priv->planes[priv->num_planes++] = plane; in modeset_init()
371 DRM_DEV_ERROR(dev->dev, in modeset_init()
377 crtc = mdp4_crtc_init(dev, plane, priv->num_crtcs, i, in modeset_init()
380 DRM_DEV_ERROR(dev->dev, "failed to construct crtc for %s\n", in modeset_init()
386 priv->crtcs[priv->num_crtcs++] = crtc; in modeset_init()
392 * LCDC/LVDS path: RGB1 -> DMA_P -> LCDC -> LVDS in modeset_init()
394 * DSI path: RGB1 -> DMA_P -> DSI1 -> DSI Panel in modeset_init()
396 * DTV/HDMI path: RGB2 -> DMA_E -> DTV -> HDMI in modeset_init()
402 DRM_DEV_ERROR(dev->dev, "failed to initialize intf: %d, %d\n", in modeset_init()
416 struct platform_device *pdev = to_platform_device(dev->dev); in mdp4_kms_init()
425 DRM_DEV_ERROR(dev->dev, "failed to allocate kms\n"); in mdp4_kms_init()
426 ret = -ENOMEM; in mdp4_kms_init()
430 mdp_kms_init(&mdp4_kms->base, &kms_funcs); in mdp4_kms_init()
432 kms = &mdp4_kms->base.base; in mdp4_kms_init()
434 mdp4_kms->dev = dev; in mdp4_kms_init()
436 mdp4_kms->mmio = msm_ioremap(pdev, NULL, "MDP4"); in mdp4_kms_init()
437 if (IS_ERR(mdp4_kms->mmio)) { in mdp4_kms_init()
438 ret = PTR_ERR(mdp4_kms->mmio); in mdp4_kms_init()
445 DRM_DEV_ERROR(dev->dev, "failed to get irq: %d\n", ret); in mdp4_kms_init()
449 kms->irq = irq; in mdp4_kms_init()
455 mdp4_kms->vdd = devm_regulator_get_exclusive(&pdev->dev, "vdd"); in mdp4_kms_init()
456 if (IS_ERR(mdp4_kms->vdd)) in mdp4_kms_init()
457 mdp4_kms->vdd = NULL; in mdp4_kms_init()
459 if (mdp4_kms->vdd) { in mdp4_kms_init()
460 ret = regulator_enable(mdp4_kms->vdd); in mdp4_kms_init()
462 DRM_DEV_ERROR(dev->dev, "failed to enable regulator vdd: %d\n", ret); in mdp4_kms_init()
467 mdp4_kms->clk = devm_clk_get(&pdev->dev, "core_clk"); in mdp4_kms_init()
468 if (IS_ERR(mdp4_kms->clk)) { in mdp4_kms_init()
469 DRM_DEV_ERROR(dev->dev, "failed to get core_clk\n"); in mdp4_kms_init()
470 ret = PTR_ERR(mdp4_kms->clk); in mdp4_kms_init()
474 mdp4_kms->pclk = devm_clk_get(&pdev->dev, "iface_clk"); in mdp4_kms_init()
475 if (IS_ERR(mdp4_kms->pclk)) in mdp4_kms_init()
476 mdp4_kms->pclk = NULL; in mdp4_kms_init()
478 if (mdp4_kms->rev >= 2) { in mdp4_kms_init()
479 mdp4_kms->lut_clk = devm_clk_get(&pdev->dev, "lut_clk"); in mdp4_kms_init()
480 if (IS_ERR(mdp4_kms->lut_clk)) { in mdp4_kms_init()
481 DRM_DEV_ERROR(dev->dev, "failed to get lut_clk\n"); in mdp4_kms_init()
482 ret = PTR_ERR(mdp4_kms->lut_clk); in mdp4_kms_init()
487 mdp4_kms->axi_clk = devm_clk_get(&pdev->dev, "bus_clk"); in mdp4_kms_init()
488 if (IS_ERR(mdp4_kms->axi_clk)) { in mdp4_kms_init()
489 DRM_DEV_ERROR(dev->dev, "failed to get axi_clk\n"); in mdp4_kms_init()
490 ret = PTR_ERR(mdp4_kms->axi_clk); in mdp4_kms_init()
494 clk_set_rate(mdp4_kms->clk, config->max_clk); in mdp4_kms_init()
495 if (mdp4_kms->lut_clk) in mdp4_kms_init()
496 clk_set_rate(mdp4_kms->lut_clk, config->max_clk); in mdp4_kms_init()
498 pm_runtime_enable(dev->dev); in mdp4_kms_init()
499 mdp4_kms->rpm_enabled = true; in mdp4_kms_init()
512 if (config->iommu) { in mdp4_kms_init()
513 struct msm_mmu *mmu = msm_iommu_new(&pdev->dev, in mdp4_kms_init()
514 config->iommu); in mdp4_kms_init()
517 "mdp4", 0x1000, 0x100000000 - 0x1000); in mdp4_kms_init()
521 mmu->funcs->destroy(mmu); in mdp4_kms_init()
526 kms->aspace = aspace; in mdp4_kms_init()
528 DRM_DEV_INFO(dev->dev, "no iommu, fallback to phys " in mdp4_kms_init()
535 DRM_DEV_ERROR(dev->dev, "modeset_init failed: %d\n", ret); in mdp4_kms_init()
539 mdp4_kms->blank_cursor_bo = msm_gem_new(dev, SZ_16K, MSM_BO_WC | MSM_BO_SCANOUT); in mdp4_kms_init()
540 if (IS_ERR(mdp4_kms->blank_cursor_bo)) { in mdp4_kms_init()
541 ret = PTR_ERR(mdp4_kms->blank_cursor_bo); in mdp4_kms_init()
542 DRM_DEV_ERROR(dev->dev, "could not allocate blank-cursor bo: %d\n", ret); in mdp4_kms_init()
543 mdp4_kms->blank_cursor_bo = NULL; in mdp4_kms_init()
547 ret = msm_gem_get_and_pin_iova(mdp4_kms->blank_cursor_bo, kms->aspace, in mdp4_kms_init()
548 &mdp4_kms->blank_cursor_iova); in mdp4_kms_init()
550 DRM_DEV_ERROR(dev->dev, "could not pin blank-cursor bo: %d\n", ret); in mdp4_kms_init()
554 dev->mode_config.min_width = 0; in mdp4_kms_init()
555 dev->mode_config.min_height = 0; in mdp4_kms_init()
556 dev->mode_config.max_width = 2048; in mdp4_kms_init()
557 dev->mode_config.max_height = 2048; in mdp4_kms_init()