Lines Matching full:disp
141 * @disp: Back pointer to struct zynqmp_disp
151 struct zynqmp_disp *disp; member
408 static u32 zynqmp_disp_avbuf_read(struct zynqmp_disp *disp, int reg) in zynqmp_disp_avbuf_read() argument
410 return readl(disp->avbuf.base + reg); in zynqmp_disp_avbuf_read()
413 static void zynqmp_disp_avbuf_write(struct zynqmp_disp *disp, int reg, u32 val) in zynqmp_disp_avbuf_write() argument
415 writel(val, disp->avbuf.base + reg); in zynqmp_disp_avbuf_write()
430 * @disp: Display controller
436 static void zynqmp_disp_avbuf_set_format(struct zynqmp_disp *disp, in zynqmp_disp_avbuf_set_format() argument
443 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_FMT); in zynqmp_disp_avbuf_set_format()
448 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_FMT, val); in zynqmp_disp_avbuf_set_format()
455 zynqmp_disp_avbuf_write(disp, reg, fmt->sf[i]); in zynqmp_disp_avbuf_set_format()
461 * @disp: Display controller
471 zynqmp_disp_avbuf_set_clocks_sources(struct zynqmp_disp *disp, in zynqmp_disp_avbuf_set_clocks_sources() argument
484 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_CLK_SRC, val); in zynqmp_disp_avbuf_set_clocks_sources()
489 * @disp: Display controller
493 static void zynqmp_disp_avbuf_enable_channels(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_enable_channels() argument
503 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_CHBUF(i), in zynqmp_disp_avbuf_enable_channels()
511 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_CHBUF(i), in zynqmp_disp_avbuf_enable_channels()
517 * @disp: Display controller
521 static void zynqmp_disp_avbuf_disable_channels(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_disable_channels() argument
526 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_CHBUF(i), in zynqmp_disp_avbuf_disable_channels()
532 * @disp: Display controller
536 static void zynqmp_disp_avbuf_enable_audio(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_enable_audio() argument
540 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_OUTPUT); in zynqmp_disp_avbuf_enable_audio()
544 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_OUTPUT, val); in zynqmp_disp_avbuf_enable_audio()
549 * @disp: Display controller
553 static void zynqmp_disp_avbuf_disable_audio(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_disable_audio() argument
557 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_OUTPUT); in zynqmp_disp_avbuf_disable_audio()
561 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_OUTPUT, val); in zynqmp_disp_avbuf_disable_audio()
566 * @disp: Display controller
572 static void zynqmp_disp_avbuf_enable_video(struct zynqmp_disp *disp, in zynqmp_disp_avbuf_enable_video() argument
578 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_OUTPUT); in zynqmp_disp_avbuf_enable_video()
593 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_OUTPUT, val); in zynqmp_disp_avbuf_enable_video()
598 * @disp: Display controller
603 static void zynqmp_disp_avbuf_disable_video(struct zynqmp_disp *disp, in zynqmp_disp_avbuf_disable_video() argument
608 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_OUTPUT); in zynqmp_disp_avbuf_disable_video()
616 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_OUTPUT, val); in zynqmp_disp_avbuf_disable_video()
621 * @disp: Display controller
625 static void zynqmp_disp_avbuf_enable(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_enable() argument
627 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_SRST_REG, 0); in zynqmp_disp_avbuf_enable()
632 * @disp: Display controller
636 static void zynqmp_disp_avbuf_disable(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_disable() argument
638 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_SRST_REG, in zynqmp_disp_avbuf_disable()
646 static void zynqmp_disp_blend_write(struct zynqmp_disp *disp, int reg, u32 val) in zynqmp_disp_blend_write() argument
648 writel(val, disp->blend.base + reg); in zynqmp_disp_blend_write()
694 * @disp: Display controller
699 static void zynqmp_disp_blend_set_output_format(struct zynqmp_disp *disp, in zynqmp_disp_blend_set_output_format() argument
715 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_OUTPUT_VID_FMT, fmt); in zynqmp_disp_blend_set_output_format()
725 zynqmp_disp_blend_write(disp, in zynqmp_disp_blend_set_output_format()
730 zynqmp_disp_blend_write(disp, in zynqmp_disp_blend_set_output_format()
737 * @disp: Display controller
746 static void zynqmp_disp_blend_set_bg_color(struct zynqmp_disp *disp, in zynqmp_disp_blend_set_bg_color() argument
749 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_BG_CLR_0, rcr); in zynqmp_disp_blend_set_bg_color()
750 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_BG_CLR_1, gy); in zynqmp_disp_blend_set_bg_color()
751 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_BG_CLR_2, bcb); in zynqmp_disp_blend_set_bg_color()
756 * @disp: Display controller
760 static void zynqmp_disp_blend_set_global_alpha(struct zynqmp_disp *disp, in zynqmp_disp_blend_set_global_alpha() argument
763 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_SET_GLOBAL_ALPHA, in zynqmp_disp_blend_set_global_alpha()
770 * @disp: Display controller
779 static void zynqmp_disp_blend_layer_set_csc(struct zynqmp_disp *disp, in zynqmp_disp_blend_layer_set_csc() argument
806 zynqmp_disp_blend_write(disp, reg + 0, coeffs[i + swap[0]]); in zynqmp_disp_blend_layer_set_csc()
807 zynqmp_disp_blend_write(disp, reg + 4, coeffs[i + swap[1]]); in zynqmp_disp_blend_layer_set_csc()
808 zynqmp_disp_blend_write(disp, reg + 8, coeffs[i + swap[2]]); in zynqmp_disp_blend_layer_set_csc()
817 zynqmp_disp_blend_write(disp, reg + i * 4, offsets[i]); in zynqmp_disp_blend_layer_set_csc()
822 * @disp: Display controller
825 static void zynqmp_disp_blend_layer_enable(struct zynqmp_disp *disp, in zynqmp_disp_blend_layer_enable() argument
837 zynqmp_disp_blend_write(disp, in zynqmp_disp_blend_layer_enable()
849 zynqmp_disp_blend_layer_set_csc(disp, layer, coeffs, offsets); in zynqmp_disp_blend_layer_enable()
854 * @disp: Display controller
857 static void zynqmp_disp_blend_layer_disable(struct zynqmp_disp *disp, in zynqmp_disp_blend_layer_disable() argument
860 zynqmp_disp_blend_write(disp, in zynqmp_disp_blend_layer_disable()
864 zynqmp_disp_blend_layer_set_csc(disp, layer, csc_zero_matrix, in zynqmp_disp_blend_layer_disable()
872 static void zynqmp_disp_audio_write(struct zynqmp_disp *disp, int reg, u32 val) in zynqmp_disp_audio_write() argument
874 writel(val, disp->audio.base + reg); in zynqmp_disp_audio_write()
879 * @disp: Display controller
884 static void zynqmp_disp_audio_enable(struct zynqmp_disp *disp) in zynqmp_disp_audio_enable() argument
887 zynqmp_disp_audio_write(disp, ZYNQMP_DISP_AUD_SOFT_RESET, 0); in zynqmp_disp_audio_enable()
888 zynqmp_disp_audio_write(disp, ZYNQMP_DISP_AUD_MIXER_VOLUME, in zynqmp_disp_audio_enable()
894 * @disp: Display controller
898 static void zynqmp_disp_audio_disable(struct zynqmp_disp *disp) in zynqmp_disp_audio_disable() argument
900 zynqmp_disp_audio_write(disp, ZYNQMP_DISP_AUD_SOFT_RESET, in zynqmp_disp_audio_disable()
904 static void zynqmp_disp_audio_init(struct zynqmp_disp *disp) in zynqmp_disp_audio_init() argument
907 disp->audio.clk = devm_clk_get(disp->dev, "dp_live_audio_aclk"); in zynqmp_disp_audio_init()
908 if (!IS_ERR(disp->audio.clk)) { in zynqmp_disp_audio_init()
909 disp->audio.clk_from_ps = false; in zynqmp_disp_audio_init()
914 disp->audio.clk = devm_clk_get(disp->dev, "dp_aud_clk"); in zynqmp_disp_audio_init()
915 if (!IS_ERR(disp->audio.clk)) { in zynqmp_disp_audio_init()
916 disp->audio.clk_from_ps = true; in zynqmp_disp_audio_init()
920 dev_err(disp->dev, "audio disabled due to missing clock\n"); in zynqmp_disp_audio_init()
929 * @disp: Display controller
934 void zynqmp_disp_handle_vblank(struct zynqmp_disp *disp) in zynqmp_disp_handle_vblank() argument
936 struct drm_crtc *crtc = &disp->crtc; in zynqmp_disp_handle_vblank()
943 * @disp: Display controller
949 bool zynqmp_disp_audio_enabled(struct zynqmp_disp *disp) in zynqmp_disp_audio_enabled() argument
951 return !!disp->audio.clk; in zynqmp_disp_audio_enabled()
956 * @disp: Display controller
960 unsigned int zynqmp_disp_get_audio_clk_rate(struct zynqmp_disp *disp) in zynqmp_disp_get_audio_clk_rate() argument
962 if (zynqmp_disp_audio_enabled(disp)) in zynqmp_disp_get_audio_clk_rate()
964 return clk_get_rate(disp->audio.clk); in zynqmp_disp_get_audio_clk_rate()
969 * @disp: Display controller
973 uint32_t zynqmp_disp_get_crtc_mask(struct zynqmp_disp *disp) in zynqmp_disp_get_crtc_mask() argument
975 return drm_crtc_mask(&disp->crtc); in zynqmp_disp_get_crtc_mask()
1016 zynqmp_disp_avbuf_enable_video(layer->disp, layer, in zynqmp_disp_layer_enable()
1018 zynqmp_disp_blend_layer_enable(layer->disp, layer); in zynqmp_disp_layer_enable()
1037 zynqmp_disp_avbuf_disable_video(layer->disp, layer); in zynqmp_disp_layer_disable()
1038 zynqmp_disp_blend_layer_disable(layer->disp, layer); in zynqmp_disp_layer_disable()
1058 zynqmp_disp_avbuf_set_format(layer->disp, layer, layer->disp_fmt); in zynqmp_disp_layer_set_format()
1114 dev_err(layer->disp->dev, in zynqmp_disp_layer_update()
1167 zynqmp_disp_blend_set_global_alpha(layer->disp, false, in zynqmp_disp_plane_atomic_disable()
1199 zynqmp_disp_blend_set_global_alpha(layer->disp, true, in zynqmp_disp_plane_atomic_update()
1222 static int zynqmp_disp_create_planes(struct zynqmp_disp *disp) in zynqmp_disp_create_planes() argument
1228 struct zynqmp_disp_layer *layer = &disp->layers[i]; in zynqmp_disp_create_planes()
1232 drm_formats = drmm_kcalloc(disp->drm, sizeof(*drm_formats), in zynqmp_disp_create_planes()
1244 ret = drm_universal_plane_init(disp->drm, &layer->plane, 0, in zynqmp_disp_create_planes()
1265 * @disp: Display controller
1270 static void zynqmp_disp_layer_release_dma(struct zynqmp_disp *disp, in zynqmp_disp_layer_release_dma() argument
1292 * @disp: Display controller
1294 static void zynqmp_disp_destroy_layers(struct zynqmp_disp *disp) in zynqmp_disp_destroy_layers() argument
1299 zynqmp_disp_layer_release_dma(disp, &disp->layers[i]); in zynqmp_disp_destroy_layers()
1304 * @disp: Display controller
1311 static int zynqmp_disp_layer_request_dma(struct zynqmp_disp *disp, in zynqmp_disp_layer_request_dma() argument
1324 dma->chan = dma_request_chan(disp->dev, dma_channel_name); in zynqmp_disp_layer_request_dma()
1326 dev_err(disp->dev, "failed to request dma channel\n"); in zynqmp_disp_layer_request_dma()
1338 * @disp: Display controller
1342 static int zynqmp_disp_create_layers(struct zynqmp_disp *disp) in zynqmp_disp_create_layers() argument
1361 struct zynqmp_disp_layer *layer = &disp->layers[i]; in zynqmp_disp_create_layers()
1364 layer->disp = disp; in zynqmp_disp_create_layers()
1367 ret = zynqmp_disp_layer_request_dma(disp, layer); in zynqmp_disp_create_layers()
1375 zynqmp_disp_destroy_layers(disp); in zynqmp_disp_create_layers()
1385 * @disp: Display controller
1387 static void zynqmp_disp_enable(struct zynqmp_disp *disp) in zynqmp_disp_enable() argument
1389 zynqmp_disp_avbuf_enable(disp); in zynqmp_disp_enable()
1391 zynqmp_disp_avbuf_set_clocks_sources(disp, disp->pclk_from_ps, in zynqmp_disp_enable()
1392 disp->audio.clk_from_ps, true); in zynqmp_disp_enable()
1393 zynqmp_disp_avbuf_enable_channels(disp); in zynqmp_disp_enable()
1394 zynqmp_disp_avbuf_enable_audio(disp); in zynqmp_disp_enable()
1396 zynqmp_disp_audio_enable(disp); in zynqmp_disp_enable()
1401 * @disp: Display controller
1403 static void zynqmp_disp_disable(struct zynqmp_disp *disp) in zynqmp_disp_disable() argument
1405 zynqmp_disp_audio_disable(disp); in zynqmp_disp_disable()
1407 zynqmp_disp_avbuf_disable_audio(disp); in zynqmp_disp_disable()
1408 zynqmp_disp_avbuf_disable_channels(disp); in zynqmp_disp_disable()
1409 zynqmp_disp_avbuf_disable(disp); in zynqmp_disp_disable()
1420 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_setup_clock() local
1426 ret = clk_set_rate(disp->pclk, mode_clock); in zynqmp_disp_crtc_setup_clock()
1428 dev_err(disp->dev, "failed to set a pixel clock\n"); in zynqmp_disp_crtc_setup_clock()
1432 rate = clk_get_rate(disp->pclk); in zynqmp_disp_crtc_setup_clock()
1435 dev_info(disp->dev, in zynqmp_disp_crtc_setup_clock()
1439 dev_dbg(disp->dev, in zynqmp_disp_crtc_setup_clock()
1450 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_atomic_enable() local
1454 pm_runtime_get_sync(disp->dev); in zynqmp_disp_crtc_atomic_enable()
1458 ret = clk_prepare_enable(disp->pclk); in zynqmp_disp_crtc_atomic_enable()
1460 dev_err(disp->dev, "failed to enable a pixel clock\n"); in zynqmp_disp_crtc_atomic_enable()
1461 pm_runtime_put_sync(disp->dev); in zynqmp_disp_crtc_atomic_enable()
1465 zynqmp_disp_blend_set_output_format(disp, ZYNQMP_DPSUB_FORMAT_RGB); in zynqmp_disp_crtc_atomic_enable()
1466 zynqmp_disp_blend_set_bg_color(disp, 0, 0, 0); in zynqmp_disp_crtc_atomic_enable()
1468 zynqmp_disp_enable(disp); in zynqmp_disp_crtc_atomic_enable()
1480 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_atomic_disable() local
1492 zynqmp_disp_disable(disp); in zynqmp_disp_crtc_atomic_disable()
1494 drm_crtc_vblank_off(&disp->crtc); in zynqmp_disp_crtc_atomic_disable()
1503 clk_disable_unprepare(disp->pclk); in zynqmp_disp_crtc_atomic_disable()
1504 pm_runtime_put_sync(disp->dev); in zynqmp_disp_crtc_atomic_disable()
1551 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_enable_vblank() local
1553 zynqmp_dp_enable_vblank(disp->dpsub->dp); in zynqmp_disp_crtc_enable_vblank()
1560 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_disable_vblank() local
1562 zynqmp_dp_disable_vblank(disp->dpsub->dp); in zynqmp_disp_crtc_disable_vblank()
1576 static int zynqmp_disp_create_crtc(struct zynqmp_disp *disp) in zynqmp_disp_create_crtc() argument
1578 struct drm_plane *plane = &disp->layers[ZYNQMP_DISP_LAYER_GFX].plane; in zynqmp_disp_create_crtc()
1581 ret = drm_crtc_init_with_planes(disp->drm, &disp->crtc, plane, in zynqmp_disp_create_crtc()
1586 drm_crtc_helper_add(&disp->crtc, &zynqmp_disp_crtc_helper_funcs); in zynqmp_disp_create_crtc()
1589 drm_crtc_vblank_off(&disp->crtc); in zynqmp_disp_create_crtc()
1594 static void zynqmp_disp_map_crtc_to_plane(struct zynqmp_disp *disp) in zynqmp_disp_map_crtc_to_plane() argument
1596 u32 possible_crtcs = drm_crtc_mask(&disp->crtc); in zynqmp_disp_map_crtc_to_plane()
1600 disp->layers[i].plane.possible_crtcs = possible_crtcs; in zynqmp_disp_map_crtc_to_plane()
1609 struct zynqmp_disp *disp = dpsub->disp; in zynqmp_disp_drm_init() local
1612 ret = zynqmp_disp_create_planes(disp); in zynqmp_disp_drm_init()
1616 ret = zynqmp_disp_create_crtc(disp); in zynqmp_disp_drm_init()
1620 zynqmp_disp_map_crtc_to_plane(disp); in zynqmp_disp_drm_init()
1628 struct zynqmp_disp *disp; in zynqmp_disp_probe() local
1633 disp = drmm_kzalloc(drm, sizeof(*disp), GFP_KERNEL); in zynqmp_disp_probe()
1634 if (!disp) in zynqmp_disp_probe()
1637 disp->dev = &pdev->dev; in zynqmp_disp_probe()
1638 disp->dpsub = dpsub; in zynqmp_disp_probe()
1639 disp->drm = drm; in zynqmp_disp_probe()
1641 dpsub->disp = disp; in zynqmp_disp_probe()
1644 disp->blend.base = devm_ioremap_resource(disp->dev, res); in zynqmp_disp_probe()
1645 if (IS_ERR(disp->blend.base)) in zynqmp_disp_probe()
1646 return PTR_ERR(disp->blend.base); in zynqmp_disp_probe()
1649 disp->avbuf.base = devm_ioremap_resource(disp->dev, res); in zynqmp_disp_probe()
1650 if (IS_ERR(disp->avbuf.base)) in zynqmp_disp_probe()
1651 return PTR_ERR(disp->avbuf.base); in zynqmp_disp_probe()
1654 disp->audio.base = devm_ioremap_resource(disp->dev, res); in zynqmp_disp_probe()
1655 if (IS_ERR(disp->audio.base)) in zynqmp_disp_probe()
1656 return PTR_ERR(disp->audio.base); in zynqmp_disp_probe()
1659 disp->pclk = devm_clk_get(disp->dev, "dp_live_video_in_clk"); in zynqmp_disp_probe()
1660 if (!IS_ERR(disp->pclk)) in zynqmp_disp_probe()
1661 disp->pclk_from_ps = false; in zynqmp_disp_probe()
1662 else if (PTR_ERR(disp->pclk) == -EPROBE_DEFER) in zynqmp_disp_probe()
1663 return PTR_ERR(disp->pclk); in zynqmp_disp_probe()
1666 if (IS_ERR_OR_NULL(disp->pclk)) { in zynqmp_disp_probe()
1667 disp->pclk = devm_clk_get(disp->dev, "dp_vtc_pixel_clk_in"); in zynqmp_disp_probe()
1668 if (IS_ERR(disp->pclk)) { in zynqmp_disp_probe()
1669 dev_err(disp->dev, "failed to init any video clock\n"); in zynqmp_disp_probe()
1670 return PTR_ERR(disp->pclk); in zynqmp_disp_probe()
1672 disp->pclk_from_ps = true; in zynqmp_disp_probe()
1675 zynqmp_disp_audio_init(disp); in zynqmp_disp_probe()
1677 ret = zynqmp_disp_create_layers(disp); in zynqmp_disp_probe()
1681 layer = &disp->layers[ZYNQMP_DISP_LAYER_VID]; in zynqmp_disp_probe()
1689 struct zynqmp_disp *disp = dpsub->disp; in zynqmp_disp_remove() local
1691 zynqmp_disp_destroy_layers(disp); in zynqmp_disp_remove()