Lines Matching refs:disp
142 * @disp: Back pointer to struct zynqmp_disp
152 struct zynqmp_disp *disp;
942 * @disp: Display controller
947 void zynqmp_disp_handle_vblank(struct zynqmp_disp *disp)
949 struct drm_crtc *crtc = &disp->crtc;
956 * @disp: Display controller
962 bool zynqmp_disp_audio_enabled(struct zynqmp_disp *disp)
964 return !!disp->audio.clk;
969 * @disp: Display controller
973 unsigned int zynqmp_disp_get_audio_clk_rate(struct zynqmp_disp *disp)
975 if (zynqmp_disp_audio_enabled(disp))
977 return clk_get_rate(disp->audio.clk);
982 * @disp: Display controller
986 uint32_t zynqmp_disp_get_crtc_mask(struct zynqmp_disp *disp)
988 return drm_crtc_mask(&disp->crtc);
1029 zynqmp_disp_avbuf_enable_video(&layer->disp->avbuf, layer->id,
1031 zynqmp_disp_blend_layer_enable(&layer->disp->blend, layer);
1050 zynqmp_disp_avbuf_disable_video(&layer->disp->avbuf, layer->id);
1051 zynqmp_disp_blend_layer_disable(&layer->disp->blend, layer);
1071 zynqmp_disp_avbuf_set_format(&layer->disp->avbuf, layer->id,
1128 dev_err(layer->disp->dev,
1221 static int zynqmp_disp_create_planes(struct zynqmp_disp *disp)
1227 struct zynqmp_disp_layer *layer = &disp->layers[i];
1231 drm_formats = drmm_kcalloc(disp->drm, sizeof(*drm_formats),
1243 ret = drm_universal_plane_init(disp->drm, &layer->plane, 0,
1260 * @disp: Display controller
1265 static void zynqmp_disp_layer_release_dma(struct zynqmp_disp *disp,
1287 * @disp: Display controller
1289 static void zynqmp_disp_destroy_layers(struct zynqmp_disp *disp)
1294 zynqmp_disp_layer_release_dma(disp, &disp->layers[i]);
1299 * @disp: Display controller
1306 static int zynqmp_disp_layer_request_dma(struct zynqmp_disp *disp,
1319 dma->chan = of_dma_request_slave_channel(disp->dev->of_node,
1322 dev_err(disp->dev, "failed to request dma channel\n");
1334 * @disp: Display controller
1338 static int zynqmp_disp_create_layers(struct zynqmp_disp *disp)
1357 struct zynqmp_disp_layer *layer = &disp->layers[i];
1360 layer->disp = disp;
1363 ret = zynqmp_disp_layer_request_dma(disp, layer);
1371 zynqmp_disp_destroy_layers(disp);
1381 * @disp: Display controller
1383 static void zynqmp_disp_enable(struct zynqmp_disp *disp)
1385 zynqmp_disp_avbuf_enable(&disp->avbuf);
1387 zynqmp_disp_avbuf_set_clocks_sources(&disp->avbuf, disp->pclk_from_ps,
1388 disp->audio.clk_from_ps, true);
1389 zynqmp_disp_avbuf_enable_channels(&disp->avbuf);
1390 zynqmp_disp_avbuf_enable_audio(&disp->avbuf);
1392 zynqmp_disp_audio_enable(&disp->audio);
1397 * @disp: Display controller
1399 static void zynqmp_disp_disable(struct zynqmp_disp *disp)
1401 zynqmp_disp_audio_disable(&disp->audio);
1403 zynqmp_disp_avbuf_disable_audio(&disp->avbuf);
1404 zynqmp_disp_avbuf_disable_channels(&disp->avbuf);
1405 zynqmp_disp_avbuf_disable(&disp->avbuf);
1416 struct zynqmp_disp *disp = crtc_to_disp(crtc);
1422 ret = clk_set_rate(disp->pclk, mode_clock);
1424 dev_err(disp->dev, "failed to set a pixel clock\n");
1428 rate = clk_get_rate(disp->pclk);
1431 dev_info(disp->dev,
1435 dev_dbg(disp->dev,
1446 struct zynqmp_disp *disp = crtc_to_disp(crtc);
1450 pm_runtime_get_sync(disp->dev);
1454 ret = clk_prepare_enable(disp->pclk);
1456 dev_err(disp->dev, "failed to enable a pixel clock\n");
1457 pm_runtime_put_sync(disp->dev);
1461 zynqmp_disp_blend_set_output_format(&disp->blend,
1463 zynqmp_disp_blend_set_bg_color(&disp->blend, 0, 0, 0);
1464 zynqmp_disp_blend_set_global_alpha(&disp->blend, false, 0);
1466 zynqmp_disp_enable(disp);
1478 struct zynqmp_disp *disp = crtc_to_disp(crtc);
1491 zynqmp_disp_disable(disp);
1493 drm_crtc_vblank_off(&disp->crtc);
1502 clk_disable_unprepare(disp->pclk);
1503 pm_runtime_put_sync(disp->dev);
1550 struct zynqmp_disp *disp = crtc_to_disp(crtc);
1552 zynqmp_dp_enable_vblank(disp->dpsub->dp);
1559 struct zynqmp_disp *disp = crtc_to_disp(crtc);
1561 zynqmp_dp_disable_vblank(disp->dpsub->dp);
1575 static int zynqmp_disp_create_crtc(struct zynqmp_disp *disp)
1577 struct drm_plane *plane = &disp->layers[ZYNQMP_DISP_LAYER_GFX].plane;
1580 ret = drm_crtc_init_with_planes(disp->drm, &disp->crtc, plane,
1585 drm_crtc_helper_add(&disp->crtc, &zynqmp_disp_crtc_helper_funcs);
1588 drm_crtc_vblank_off(&disp->crtc);
1593 static void zynqmp_disp_map_crtc_to_plane(struct zynqmp_disp *disp)
1595 u32 possible_crtcs = drm_crtc_mask(&disp->crtc);
1599 disp->layers[i].plane.possible_crtcs = possible_crtcs;
1608 struct zynqmp_disp *disp = dpsub->disp;
1611 ret = zynqmp_disp_create_planes(disp);
1615 ret = zynqmp_disp_create_crtc(disp);
1619 zynqmp_disp_map_crtc_to_plane(disp);
1627 struct zynqmp_disp *disp;
1632 disp = drmm_kzalloc(drm, sizeof(*disp), GFP_KERNEL);
1633 if (!disp)
1636 disp->dev = &pdev->dev;
1637 disp->dpsub = dpsub;
1638 disp->drm = drm;
1640 dpsub->disp = disp;
1643 disp->blend.base = devm_ioremap_resource(disp->dev, res);
1644 if (IS_ERR(disp->blend.base))
1645 return PTR_ERR(disp->blend.base);
1648 disp->avbuf.base = devm_ioremap_resource(disp->dev, res);
1649 if (IS_ERR(disp->avbuf.base))
1650 return PTR_ERR(disp->avbuf.base);
1653 disp->audio.base = devm_ioremap_resource(disp->dev, res);
1654 if (IS_ERR(disp->audio.base))
1655 return PTR_ERR(disp->audio.base);
1658 disp->pclk = devm_clk_get(disp->dev, "dp_live_video_in_clk");
1659 if (!IS_ERR(disp->pclk))
1660 disp->pclk_from_ps = false;
1661 else if (PTR_ERR(disp->pclk) == -EPROBE_DEFER)
1662 return PTR_ERR(disp->pclk);
1665 if (IS_ERR_OR_NULL(disp->pclk)) {
1666 disp->pclk = devm_clk_get(disp->dev, "dp_vtc_pixel_clk_in");
1667 if (IS_ERR(disp->pclk)) {
1668 dev_err(disp->dev, "failed to init any video clock\n");
1669 return PTR_ERR(disp->pclk);
1671 disp->pclk_from_ps = true;
1674 zynqmp_disp_audio_init(disp->dev, &disp->audio);
1676 ret = zynqmp_disp_create_layers(disp);
1680 layer = &disp->layers[ZYNQMP_DISP_LAYER_VID];
1688 struct zynqmp_disp *disp = dpsub->disp;
1690 zynqmp_disp_destroy_layers(disp);