Lines Matching full:disp

142  * @disp: Back pointer to struct zynqmp_disp
152 struct zynqmp_disp *disp; member
409 static u32 zynqmp_disp_avbuf_read(struct zynqmp_disp *disp, int reg) in zynqmp_disp_avbuf_read() argument
411 return readl(disp->avbuf.base + reg); in zynqmp_disp_avbuf_read()
414 static void zynqmp_disp_avbuf_write(struct zynqmp_disp *disp, int reg, u32 val) in zynqmp_disp_avbuf_write() argument
416 writel(val, disp->avbuf.base + reg); in zynqmp_disp_avbuf_write()
431 * @disp: Display controller
437 static void zynqmp_disp_avbuf_set_format(struct zynqmp_disp *disp, in zynqmp_disp_avbuf_set_format() argument
444 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_FMT); in zynqmp_disp_avbuf_set_format()
449 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_FMT, val); in zynqmp_disp_avbuf_set_format()
456 zynqmp_disp_avbuf_write(disp, reg, fmt->sf[i]); in zynqmp_disp_avbuf_set_format()
462 * @disp: Display controller
472 zynqmp_disp_avbuf_set_clocks_sources(struct zynqmp_disp *disp, in zynqmp_disp_avbuf_set_clocks_sources() argument
485 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_CLK_SRC, val); in zynqmp_disp_avbuf_set_clocks_sources()
490 * @disp: Display controller
494 static void zynqmp_disp_avbuf_enable_channels(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_enable_channels() argument
504 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_CHBUF(i), in zynqmp_disp_avbuf_enable_channels()
512 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_CHBUF(i), in zynqmp_disp_avbuf_enable_channels()
518 * @disp: Display controller
522 static void zynqmp_disp_avbuf_disable_channels(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_disable_channels() argument
527 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_CHBUF(i), in zynqmp_disp_avbuf_disable_channels()
533 * @disp: Display controller
537 static void zynqmp_disp_avbuf_enable_audio(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_enable_audio() argument
541 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_OUTPUT); in zynqmp_disp_avbuf_enable_audio()
545 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_OUTPUT, val); in zynqmp_disp_avbuf_enable_audio()
550 * @disp: Display controller
554 static void zynqmp_disp_avbuf_disable_audio(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_disable_audio() argument
558 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_OUTPUT); in zynqmp_disp_avbuf_disable_audio()
562 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_OUTPUT, val); in zynqmp_disp_avbuf_disable_audio()
567 * @disp: Display controller
573 static void zynqmp_disp_avbuf_enable_video(struct zynqmp_disp *disp, in zynqmp_disp_avbuf_enable_video() argument
579 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_OUTPUT); in zynqmp_disp_avbuf_enable_video()
594 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_OUTPUT, val); in zynqmp_disp_avbuf_enable_video()
599 * @disp: Display controller
604 static void zynqmp_disp_avbuf_disable_video(struct zynqmp_disp *disp, in zynqmp_disp_avbuf_disable_video() argument
609 val = zynqmp_disp_avbuf_read(disp, ZYNQMP_DISP_AV_BUF_OUTPUT); in zynqmp_disp_avbuf_disable_video()
617 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_OUTPUT, val); in zynqmp_disp_avbuf_disable_video()
622 * @disp: Display controller
626 static void zynqmp_disp_avbuf_enable(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_enable() argument
628 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_SRST_REG, 0); in zynqmp_disp_avbuf_enable()
633 * @disp: Display controller
637 static void zynqmp_disp_avbuf_disable(struct zynqmp_disp *disp) in zynqmp_disp_avbuf_disable() argument
639 zynqmp_disp_avbuf_write(disp, ZYNQMP_DISP_AV_BUF_SRST_REG, in zynqmp_disp_avbuf_disable()
647 static void zynqmp_disp_blend_write(struct zynqmp_disp *disp, int reg, u32 val) in zynqmp_disp_blend_write() argument
649 writel(val, disp->blend.base + reg); in zynqmp_disp_blend_write()
695 * @disp: Display controller
700 static void zynqmp_disp_blend_set_output_format(struct zynqmp_disp *disp, in zynqmp_disp_blend_set_output_format() argument
716 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_OUTPUT_VID_FMT, fmt); in zynqmp_disp_blend_set_output_format()
726 zynqmp_disp_blend_write(disp, in zynqmp_disp_blend_set_output_format()
731 zynqmp_disp_blend_write(disp, in zynqmp_disp_blend_set_output_format()
738 * @disp: Display controller
747 static void zynqmp_disp_blend_set_bg_color(struct zynqmp_disp *disp, in zynqmp_disp_blend_set_bg_color() argument
750 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_BG_CLR_0, rcr); in zynqmp_disp_blend_set_bg_color()
751 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_BG_CLR_1, gy); in zynqmp_disp_blend_set_bg_color()
752 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_BG_CLR_2, bcb); in zynqmp_disp_blend_set_bg_color()
757 * @disp: Display controller
761 static void zynqmp_disp_blend_set_global_alpha(struct zynqmp_disp *disp, in zynqmp_disp_blend_set_global_alpha() argument
764 zynqmp_disp_blend_write(disp, ZYNQMP_DISP_V_BLEND_SET_GLOBAL_ALPHA, in zynqmp_disp_blend_set_global_alpha()
771 * @disp: Display controller
780 static void zynqmp_disp_blend_layer_set_csc(struct zynqmp_disp *disp, in zynqmp_disp_blend_layer_set_csc() argument
807 zynqmp_disp_blend_write(disp, reg + 0, coeffs[i + swap[0]]); in zynqmp_disp_blend_layer_set_csc()
808 zynqmp_disp_blend_write(disp, reg + 4, coeffs[i + swap[1]]); in zynqmp_disp_blend_layer_set_csc()
809 zynqmp_disp_blend_write(disp, reg + 8, coeffs[i + swap[2]]); in zynqmp_disp_blend_layer_set_csc()
818 zynqmp_disp_blend_write(disp, reg + i * 4, offsets[i]); in zynqmp_disp_blend_layer_set_csc()
823 * @disp: Display controller
826 static void zynqmp_disp_blend_layer_enable(struct zynqmp_disp *disp, in zynqmp_disp_blend_layer_enable() argument
838 zynqmp_disp_blend_write(disp, in zynqmp_disp_blend_layer_enable()
850 zynqmp_disp_blend_layer_set_csc(disp, layer, coeffs, offsets); in zynqmp_disp_blend_layer_enable()
855 * @disp: Display controller
858 static void zynqmp_disp_blend_layer_disable(struct zynqmp_disp *disp, in zynqmp_disp_blend_layer_disable() argument
861 zynqmp_disp_blend_write(disp, in zynqmp_disp_blend_layer_disable()
865 zynqmp_disp_blend_layer_set_csc(disp, layer, csc_zero_matrix, in zynqmp_disp_blend_layer_disable()
873 static void zynqmp_disp_audio_write(struct zynqmp_disp *disp, int reg, u32 val) in zynqmp_disp_audio_write() argument
875 writel(val, disp->audio.base + reg); in zynqmp_disp_audio_write()
880 * @disp: Display controller
885 static void zynqmp_disp_audio_enable(struct zynqmp_disp *disp) in zynqmp_disp_audio_enable() argument
888 zynqmp_disp_audio_write(disp, ZYNQMP_DISP_AUD_SOFT_RESET, 0); in zynqmp_disp_audio_enable()
889 zynqmp_disp_audio_write(disp, ZYNQMP_DISP_AUD_MIXER_VOLUME, in zynqmp_disp_audio_enable()
895 * @disp: Display controller
899 static void zynqmp_disp_audio_disable(struct zynqmp_disp *disp) in zynqmp_disp_audio_disable() argument
901 zynqmp_disp_audio_write(disp, ZYNQMP_DISP_AUD_SOFT_RESET, in zynqmp_disp_audio_disable()
905 static void zynqmp_disp_audio_init(struct zynqmp_disp *disp) in zynqmp_disp_audio_init() argument
908 disp->audio.clk = devm_clk_get(disp->dev, "dp_live_audio_aclk"); in zynqmp_disp_audio_init()
909 if (!IS_ERR(disp->audio.clk)) { in zynqmp_disp_audio_init()
910 disp->audio.clk_from_ps = false; in zynqmp_disp_audio_init()
915 disp->audio.clk = devm_clk_get(disp->dev, "dp_aud_clk"); in zynqmp_disp_audio_init()
916 if (!IS_ERR(disp->audio.clk)) { in zynqmp_disp_audio_init()
917 disp->audio.clk_from_ps = true; in zynqmp_disp_audio_init()
921 dev_err(disp->dev, "audio disabled due to missing clock\n"); in zynqmp_disp_audio_init()
930 * @disp: Display controller
935 void zynqmp_disp_handle_vblank(struct zynqmp_disp *disp) in zynqmp_disp_handle_vblank() argument
937 struct drm_crtc *crtc = &disp->crtc; in zynqmp_disp_handle_vblank()
944 * @disp: Display controller
950 bool zynqmp_disp_audio_enabled(struct zynqmp_disp *disp) in zynqmp_disp_audio_enabled() argument
952 return !!disp->audio.clk; in zynqmp_disp_audio_enabled()
957 * @disp: Display controller
961 unsigned int zynqmp_disp_get_audio_clk_rate(struct zynqmp_disp *disp) in zynqmp_disp_get_audio_clk_rate() argument
963 if (zynqmp_disp_audio_enabled(disp)) in zynqmp_disp_get_audio_clk_rate()
965 return clk_get_rate(disp->audio.clk); in zynqmp_disp_get_audio_clk_rate()
970 * @disp: Display controller
974 uint32_t zynqmp_disp_get_crtc_mask(struct zynqmp_disp *disp) in zynqmp_disp_get_crtc_mask() argument
976 return drm_crtc_mask(&disp->crtc); in zynqmp_disp_get_crtc_mask()
1017 zynqmp_disp_avbuf_enable_video(layer->disp, layer, in zynqmp_disp_layer_enable()
1019 zynqmp_disp_blend_layer_enable(layer->disp, layer); in zynqmp_disp_layer_enable()
1038 zynqmp_disp_avbuf_disable_video(layer->disp, layer); in zynqmp_disp_layer_disable()
1039 zynqmp_disp_blend_layer_disable(layer->disp, layer); in zynqmp_disp_layer_disable()
1059 zynqmp_disp_avbuf_set_format(layer->disp, layer, layer->disp_fmt); in zynqmp_disp_layer_set_format()
1119 dev_err(layer->disp->dev, in zynqmp_disp_layer_update()
1172 zynqmp_disp_blend_set_global_alpha(layer->disp, false, in zynqmp_disp_plane_atomic_disable()
1204 zynqmp_disp_blend_set_global_alpha(layer->disp, true, in zynqmp_disp_plane_atomic_update()
1227 static int zynqmp_disp_create_planes(struct zynqmp_disp *disp) in zynqmp_disp_create_planes() argument
1233 struct zynqmp_disp_layer *layer = &disp->layers[i]; in zynqmp_disp_create_planes()
1237 drm_formats = drmm_kcalloc(disp->drm, sizeof(*drm_formats), in zynqmp_disp_create_planes()
1249 ret = drm_universal_plane_init(disp->drm, &layer->plane, 0, in zynqmp_disp_create_planes()
1270 * @disp: Display controller
1275 static void zynqmp_disp_layer_release_dma(struct zynqmp_disp *disp, in zynqmp_disp_layer_release_dma() argument
1297 * @disp: Display controller
1299 static void zynqmp_disp_destroy_layers(struct zynqmp_disp *disp) in zynqmp_disp_destroy_layers() argument
1304 zynqmp_disp_layer_release_dma(disp, &disp->layers[i]); in zynqmp_disp_destroy_layers()
1309 * @disp: Display controller
1316 static int zynqmp_disp_layer_request_dma(struct zynqmp_disp *disp, in zynqmp_disp_layer_request_dma() argument
1329 dma->chan = dma_request_chan(disp->dev, dma_channel_name); in zynqmp_disp_layer_request_dma()
1331 dev_err(disp->dev, "failed to request dma channel\n"); in zynqmp_disp_layer_request_dma()
1343 * @disp: Display controller
1347 static int zynqmp_disp_create_layers(struct zynqmp_disp *disp) in zynqmp_disp_create_layers() argument
1366 struct zynqmp_disp_layer *layer = &disp->layers[i]; in zynqmp_disp_create_layers()
1369 layer->disp = disp; in zynqmp_disp_create_layers()
1372 ret = zynqmp_disp_layer_request_dma(disp, layer); in zynqmp_disp_create_layers()
1380 zynqmp_disp_destroy_layers(disp); in zynqmp_disp_create_layers()
1390 * @disp: Display controller
1392 static void zynqmp_disp_enable(struct zynqmp_disp *disp) in zynqmp_disp_enable() argument
1394 zynqmp_disp_avbuf_enable(disp); in zynqmp_disp_enable()
1396 zynqmp_disp_avbuf_set_clocks_sources(disp, disp->pclk_from_ps, in zynqmp_disp_enable()
1397 disp->audio.clk_from_ps, true); in zynqmp_disp_enable()
1398 zynqmp_disp_avbuf_enable_channels(disp); in zynqmp_disp_enable()
1399 zynqmp_disp_avbuf_enable_audio(disp); in zynqmp_disp_enable()
1401 zynqmp_disp_audio_enable(disp); in zynqmp_disp_enable()
1406 * @disp: Display controller
1408 static void zynqmp_disp_disable(struct zynqmp_disp *disp) in zynqmp_disp_disable() argument
1410 zynqmp_disp_audio_disable(disp); in zynqmp_disp_disable()
1412 zynqmp_disp_avbuf_disable_audio(disp); in zynqmp_disp_disable()
1413 zynqmp_disp_avbuf_disable_channels(disp); in zynqmp_disp_disable()
1414 zynqmp_disp_avbuf_disable(disp); in zynqmp_disp_disable()
1425 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_setup_clock() local
1431 ret = clk_set_rate(disp->pclk, mode_clock); in zynqmp_disp_crtc_setup_clock()
1433 dev_err(disp->dev, "failed to set a pixel clock\n"); in zynqmp_disp_crtc_setup_clock()
1437 rate = clk_get_rate(disp->pclk); in zynqmp_disp_crtc_setup_clock()
1440 dev_info(disp->dev, in zynqmp_disp_crtc_setup_clock()
1444 dev_dbg(disp->dev, in zynqmp_disp_crtc_setup_clock()
1455 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_atomic_enable() local
1459 pm_runtime_get_sync(disp->dev); in zynqmp_disp_crtc_atomic_enable()
1463 ret = clk_prepare_enable(disp->pclk); in zynqmp_disp_crtc_atomic_enable()
1465 dev_err(disp->dev, "failed to enable a pixel clock\n"); in zynqmp_disp_crtc_atomic_enable()
1466 pm_runtime_put_sync(disp->dev); in zynqmp_disp_crtc_atomic_enable()
1470 zynqmp_disp_blend_set_output_format(disp, ZYNQMP_DPSUB_FORMAT_RGB); in zynqmp_disp_crtc_atomic_enable()
1471 zynqmp_disp_blend_set_bg_color(disp, 0, 0, 0); in zynqmp_disp_crtc_atomic_enable()
1473 zynqmp_disp_enable(disp); in zynqmp_disp_crtc_atomic_enable()
1485 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_atomic_disable() local
1497 zynqmp_disp_disable(disp); in zynqmp_disp_crtc_atomic_disable()
1499 drm_crtc_vblank_off(&disp->crtc); in zynqmp_disp_crtc_atomic_disable()
1508 clk_disable_unprepare(disp->pclk); in zynqmp_disp_crtc_atomic_disable()
1509 pm_runtime_put_sync(disp->dev); in zynqmp_disp_crtc_atomic_disable()
1556 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_enable_vblank() local
1558 zynqmp_dp_enable_vblank(disp->dpsub->dp); in zynqmp_disp_crtc_enable_vblank()
1565 struct zynqmp_disp *disp = crtc_to_disp(crtc); in zynqmp_disp_crtc_disable_vblank() local
1567 zynqmp_dp_disable_vblank(disp->dpsub->dp); in zynqmp_disp_crtc_disable_vblank()
1581 static int zynqmp_disp_create_crtc(struct zynqmp_disp *disp) in zynqmp_disp_create_crtc() argument
1583 struct drm_plane *plane = &disp->layers[ZYNQMP_DISP_LAYER_GFX].plane; in zynqmp_disp_create_crtc()
1586 ret = drm_crtc_init_with_planes(disp->drm, &disp->crtc, plane, in zynqmp_disp_create_crtc()
1591 drm_crtc_helper_add(&disp->crtc, &zynqmp_disp_crtc_helper_funcs); in zynqmp_disp_create_crtc()
1594 drm_crtc_vblank_off(&disp->crtc); in zynqmp_disp_create_crtc()
1599 static void zynqmp_disp_map_crtc_to_plane(struct zynqmp_disp *disp) in zynqmp_disp_map_crtc_to_plane() argument
1601 u32 possible_crtcs = drm_crtc_mask(&disp->crtc); in zynqmp_disp_map_crtc_to_plane()
1605 disp->layers[i].plane.possible_crtcs = possible_crtcs; in zynqmp_disp_map_crtc_to_plane()
1614 struct zynqmp_disp *disp = dpsub->disp; in zynqmp_disp_drm_init() local
1617 ret = zynqmp_disp_create_planes(disp); in zynqmp_disp_drm_init()
1621 ret = zynqmp_disp_create_crtc(disp); in zynqmp_disp_drm_init()
1625 zynqmp_disp_map_crtc_to_plane(disp); in zynqmp_disp_drm_init()
1633 struct zynqmp_disp *disp; in zynqmp_disp_probe() local
1638 disp = drmm_kzalloc(drm, sizeof(*disp), GFP_KERNEL); in zynqmp_disp_probe()
1639 if (!disp) in zynqmp_disp_probe()
1642 disp->dev = &pdev->dev; in zynqmp_disp_probe()
1643 disp->dpsub = dpsub; in zynqmp_disp_probe()
1644 disp->drm = drm; in zynqmp_disp_probe()
1646 dpsub->disp = disp; in zynqmp_disp_probe()
1649 disp->blend.base = devm_ioremap_resource(disp->dev, res); in zynqmp_disp_probe()
1650 if (IS_ERR(disp->blend.base)) in zynqmp_disp_probe()
1651 return PTR_ERR(disp->blend.base); in zynqmp_disp_probe()
1654 disp->avbuf.base = devm_ioremap_resource(disp->dev, res); in zynqmp_disp_probe()
1655 if (IS_ERR(disp->avbuf.base)) in zynqmp_disp_probe()
1656 return PTR_ERR(disp->avbuf.base); in zynqmp_disp_probe()
1659 disp->audio.base = devm_ioremap_resource(disp->dev, res); in zynqmp_disp_probe()
1660 if (IS_ERR(disp->audio.base)) in zynqmp_disp_probe()
1661 return PTR_ERR(disp->audio.base); in zynqmp_disp_probe()
1664 disp->pclk = devm_clk_get(disp->dev, "dp_live_video_in_clk"); in zynqmp_disp_probe()
1665 if (!IS_ERR(disp->pclk)) in zynqmp_disp_probe()
1666 disp->pclk_from_ps = false; in zynqmp_disp_probe()
1667 else if (PTR_ERR(disp->pclk) == -EPROBE_DEFER) in zynqmp_disp_probe()
1668 return PTR_ERR(disp->pclk); in zynqmp_disp_probe()
1671 if (IS_ERR_OR_NULL(disp->pclk)) { in zynqmp_disp_probe()
1672 disp->pclk = devm_clk_get(disp->dev, "dp_vtc_pixel_clk_in"); in zynqmp_disp_probe()
1673 if (IS_ERR(disp->pclk)) { in zynqmp_disp_probe()
1674 dev_err(disp->dev, "failed to init any video clock\n"); in zynqmp_disp_probe()
1675 return PTR_ERR(disp->pclk); in zynqmp_disp_probe()
1677 disp->pclk_from_ps = true; in zynqmp_disp_probe()
1680 zynqmp_disp_audio_init(disp); in zynqmp_disp_probe()
1682 ret = zynqmp_disp_create_layers(disp); in zynqmp_disp_probe()
1686 layer = &disp->layers[ZYNQMP_DISP_LAYER_VID]; in zynqmp_disp_probe()
1694 struct zynqmp_disp *disp = dpsub->disp; in zynqmp_disp_remove() local
1696 zynqmp_disp_destroy_layers(disp); in zynqmp_disp_remove()