Lines Matching +full:zynqmp +full:- +full:dpsub +full:- +full:1
1 // SPDX-License-Identifier: GPL-2.0
3 * ZynqMP DisplayPort Subsystem Driver
5 * Copyright (C) 2017 - 2020 Xilinx, Inc.
8 * - Hyun Woo Kwon <hyun.kwon@xilinx.com>
9 * - Laurent Pinchart <laurent.pinchart@ideasonboard.com>
13 #include <linux/dma-mapping.h>
35 /* -----------------------------------------------------------------------------
43 struct zynqmp_dpsub *dpsub = to_zynqmp_dpsub(drm); in zynqmp_dpsub_dumb_create() local
44 unsigned int pitch = DIV_ROUND_UP(args->width * args->bpp, 8); in zynqmp_dpsub_dumb_create()
47 args->pitch = ALIGN(pitch, dpsub->dma_align); in zynqmp_dpsub_dumb_create()
56 struct zynqmp_dpsub *dpsub = to_zynqmp_dpsub(drm); in zynqmp_dpsub_fb_create() local
62 cmd.pitches[i] = ALIGN(cmd.pitches[i], dpsub->dma_align); in zynqmp_dpsub_fb_create()
73 /* -----------------------------------------------------------------------------
99 .name = "zynqmp-dpsub",
102 .major = 1,
106 static int zynqmp_dpsub_drm_init(struct zynqmp_dpsub *dpsub) in zynqmp_dpsub_drm_init() argument
108 struct drm_device *drm = &dpsub->drm; in zynqmp_dpsub_drm_init()
116 drm->mode_config.funcs = &zynqmp_dpsub_mode_config_funcs; in zynqmp_dpsub_drm_init()
117 drm->mode_config.min_width = 0; in zynqmp_dpsub_drm_init()
118 drm->mode_config.min_height = 0; in zynqmp_dpsub_drm_init()
119 drm->mode_config.max_width = ZYNQMP_DISP_MAX_WIDTH; in zynqmp_dpsub_drm_init()
120 drm->mode_config.max_height = ZYNQMP_DISP_MAX_HEIGHT; in zynqmp_dpsub_drm_init()
122 ret = drm_vblank_init(drm, 1); in zynqmp_dpsub_drm_init()
126 drm->irq_enabled = 1; in zynqmp_dpsub_drm_init()
135 ret = zynqmp_disp_drm_init(dpsub); in zynqmp_dpsub_drm_init()
139 ret = zynqmp_dp_drm_init(dpsub); in zynqmp_dpsub_drm_init()
160 /* -----------------------------------------------------------------------------
166 struct zynqmp_dpsub *dpsub = dev_get_drvdata(dev); in zynqmp_dpsub_suspend() local
168 return drm_mode_config_helper_suspend(&dpsub->drm); in zynqmp_dpsub_suspend()
173 struct zynqmp_dpsub *dpsub = dev_get_drvdata(dev); in zynqmp_dpsub_resume() local
175 return drm_mode_config_helper_resume(&dpsub->drm); in zynqmp_dpsub_resume()
182 /* -----------------------------------------------------------------------------
186 static int zynqmp_dpsub_init_clocks(struct zynqmp_dpsub *dpsub) in zynqmp_dpsub_init_clocks() argument
190 dpsub->apb_clk = devm_clk_get(dpsub->dev, "dp_apb_clk"); in zynqmp_dpsub_init_clocks()
191 if (IS_ERR(dpsub->apb_clk)) in zynqmp_dpsub_init_clocks()
192 return PTR_ERR(dpsub->apb_clk); in zynqmp_dpsub_init_clocks()
194 ret = clk_prepare_enable(dpsub->apb_clk); in zynqmp_dpsub_init_clocks()
196 dev_err(dpsub->dev, "failed to enable the APB clock\n"); in zynqmp_dpsub_init_clocks()
205 struct zynqmp_dpsub *dpsub; in zynqmp_dpsub_probe() local
209 dpsub = devm_drm_dev_alloc(&pdev->dev, &zynqmp_dpsub_drm_driver, in zynqmp_dpsub_probe()
211 if (IS_ERR(dpsub)) in zynqmp_dpsub_probe()
212 return PTR_ERR(dpsub); in zynqmp_dpsub_probe()
214 dpsub->dev = &pdev->dev; in zynqmp_dpsub_probe()
215 platform_set_drvdata(pdev, dpsub); in zynqmp_dpsub_probe()
217 dma_set_mask(dpsub->dev, DMA_BIT_MASK(ZYNQMP_DISP_MAX_DMA_BIT)); in zynqmp_dpsub_probe()
220 of_reserved_mem_device_init(&pdev->dev); in zynqmp_dpsub_probe()
222 ret = zynqmp_dpsub_init_clocks(dpsub); in zynqmp_dpsub_probe()
226 pm_runtime_enable(&pdev->dev); in zynqmp_dpsub_probe()
232 ret = zynqmp_dp_probe(dpsub, &dpsub->drm); in zynqmp_dpsub_probe()
236 ret = zynqmp_disp_probe(dpsub, &dpsub->drm); in zynqmp_dpsub_probe()
240 ret = zynqmp_dpsub_drm_init(dpsub); in zynqmp_dpsub_probe()
244 dev_info(&pdev->dev, "ZynqMP DisplayPort Subsystem driver probed"); in zynqmp_dpsub_probe()
249 zynqmp_disp_remove(dpsub); in zynqmp_dpsub_probe()
251 zynqmp_dp_remove(dpsub); in zynqmp_dpsub_probe()
253 pm_runtime_disable(&pdev->dev); in zynqmp_dpsub_probe()
254 clk_disable_unprepare(dpsub->apb_clk); in zynqmp_dpsub_probe()
256 of_reserved_mem_device_release(&pdev->dev); in zynqmp_dpsub_probe()
262 struct zynqmp_dpsub *dpsub = platform_get_drvdata(pdev); in zynqmp_dpsub_remove() local
263 struct drm_device *drm = &dpsub->drm; in zynqmp_dpsub_remove()
269 zynqmp_disp_remove(dpsub); in zynqmp_dpsub_remove()
270 zynqmp_dp_remove(dpsub); in zynqmp_dpsub_remove()
272 pm_runtime_disable(&pdev->dev); in zynqmp_dpsub_remove()
273 clk_disable_unprepare(dpsub->apb_clk); in zynqmp_dpsub_remove()
274 of_reserved_mem_device_release(&pdev->dev); in zynqmp_dpsub_remove()
281 struct zynqmp_dpsub *dpsub = platform_get_drvdata(pdev); in zynqmp_dpsub_shutdown() local
283 drm_atomic_helper_shutdown(&dpsub->drm); in zynqmp_dpsub_shutdown()
287 { .compatible = "xlnx,zynqmp-dpsub-1.7", },
297 .name = "zynqmp-dpsub",
306 MODULE_DESCRIPTION("ZynqMP DP Subsystem Driver");