Lines Matching +full:composite +full:- +full:video +full:- +full:connector
1 // SPDX-License-Identifier: GPL-2.0-or-later
16 #include <linux/soc/amlogic/meson-canvas.h>
43 * DOC: Video Processing Unit
45 * VPU Handles the Global Video Processing, it includes management of the
50 * - Full reset of entire video processing HW blocks
51 * - Scaling and setup of the VPU clock
52 * - Bus clock gates
53 * - Powering up video processing HW blocks
54 * - Powering Up HDMI controller and PHY
70 struct meson_drm *priv = dev->dev_private; in meson_irq()
72 (void)readl_relaxed(priv->io_base + _REG(VENC_INTFLAG)); in meson_irq()
85 args->pitch = ALIGN(DIV_ROUND_UP(args->width * args->bpp, 8), SZ_64); in meson_dumb_create()
86 args->size = PAGE_ALIGN(args->pitch * args->height); in meson_dumb_create()
113 for_each_endpoint_of_node(dev->of_node, ep) { in meson_vpu_has_available_connectors()
140 writel_relaxed(value, priv->io_base + _REG(VPU_RDARB_MODE_L1C1)); in meson_vpu_init()
144 writel_relaxed(value, priv->io_base + _REG(VPU_RDARB_MODE_L1C2)); in meson_vpu_init()
149 writel_relaxed(value, priv->io_base + _REG(VPU_RDARB_MODE_L2C1)); in meson_vpu_init()
153 writel_relaxed(value, priv->io_base + _REG(VPU_WRARB_MODE_L2C1)); in meson_vpu_init()
184 /* Checks if an output connector is available */ in meson_drv_bind_master()
186 dev_err(dev, "No output connector available\n"); in meson_drv_bind_master()
187 return -ENODEV; in meson_drv_bind_master()
192 return -ENODEV; in meson_drv_bind_master()
200 ret = -ENOMEM; in meson_drv_bind_master()
203 drm->dev_private = priv; in meson_drv_bind_master()
204 priv->drm = drm; in meson_drv_bind_master()
205 priv->dev = dev; in meson_drv_bind_master()
206 priv->compat = match->compat; in meson_drv_bind_master()
207 priv->afbcd.ops = match->afbcd_ops; in meson_drv_bind_master()
216 priv->io_base = regs; in meson_drv_bind_master()
220 ret = -EINVAL; in meson_drv_bind_master()
224 regs = devm_ioremap(dev, res->start, resource_size(res)); in meson_drv_bind_master()
226 ret = -EADDRNOTAVAIL; in meson_drv_bind_master()
230 priv->hhi = devm_regmap_init_mmio(dev, regs, in meson_drv_bind_master()
232 if (IS_ERR(priv->hhi)) { in meson_drv_bind_master()
233 dev_err(&pdev->dev, "Couldn't create the HHI regmap\n"); in meson_drv_bind_master()
234 ret = PTR_ERR(priv->hhi); in meson_drv_bind_master()
238 priv->canvas = meson_canvas_get(dev); in meson_drv_bind_master()
239 if (IS_ERR(priv->canvas)) { in meson_drv_bind_master()
240 ret = PTR_ERR(priv->canvas); in meson_drv_bind_master()
244 ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_osd1); in meson_drv_bind_master()
247 ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_vd1_0); in meson_drv_bind_master()
249 meson_canvas_free(priv->canvas, priv->canvas_id_osd1); in meson_drv_bind_master()
252 ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_vd1_1); in meson_drv_bind_master()
254 meson_canvas_free(priv->canvas, priv->canvas_id_osd1); in meson_drv_bind_master()
255 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_0); in meson_drv_bind_master()
258 ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_vd1_2); in meson_drv_bind_master()
260 meson_canvas_free(priv->canvas, priv->canvas_id_osd1); in meson_drv_bind_master()
261 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_0); in meson_drv_bind_master()
262 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_1); in meson_drv_bind_master()
266 priv->vsync_irq = platform_get_irq(pdev, 0); in meson_drv_bind_master()
275 priv->limits = &meson_drm_soc_attrs[i].limits; in meson_drv_bind_master()
291 drm->mode_config.max_width = 3840; in meson_drv_bind_master()
292 drm->mode_config.max_height = 2160; in meson_drv_bind_master()
293 drm->mode_config.funcs = &meson_mode_config_funcs; in meson_drv_bind_master()
294 drm->mode_config.helper_private = &meson_mode_config_helpers; in meson_drv_bind_master()
302 if (priv->afbcd.ops) { in meson_drv_bind_master()
303 ret = priv->afbcd.ops->init(priv); in meson_drv_bind_master()
315 ret = component_bind_all(drm->dev, drm); in meson_drv_bind_master()
317 dev_err(drm->dev, "Couldn't bind all components\n"); in meson_drv_bind_master()
334 ret = request_irq(priv->vsync_irq, meson_irq, 0, drm->driver->name, drm); in meson_drv_bind_master()
353 free_irq(priv->vsync_irq, drm); in meson_drv_bind_master()
368 struct drm_device *drm = priv->drm; in meson_drv_unbind()
370 if (priv->canvas) { in meson_drv_unbind()
371 meson_canvas_free(priv->canvas, priv->canvas_id_osd1); in meson_drv_unbind()
372 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_0); in meson_drv_unbind()
373 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_1); in meson_drv_unbind()
374 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_2); in meson_drv_unbind()
381 free_irq(priv->vsync_irq, drm); in meson_drv_unbind()
384 if (priv->afbcd.ops) { in meson_drv_unbind()
385 priv->afbcd.ops->reset(priv); in meson_drv_unbind()
402 return drm_mode_config_helper_suspend(priv->drm); in meson_drv_pm_suspend()
416 if (priv->afbcd.ops) in meson_drv_pm_resume()
417 priv->afbcd.ops->init(priv); in meson_drv_pm_resume()
419 return drm_mode_config_helper_resume(priv->drm); in meson_drv_pm_resume()
425 dev->of_node, data); in compare_of()
427 return dev->of_node == data; in compare_of()
432 { .compatible = "composite-video-connector" },
433 { .compatible = "svideo-connector" },
434 { .compatible = "hdmi-connector" },
435 { .compatible = "dvi-connector" },
447 /* If node is a connector, return and do not add to match table */ in meson_probe_remote()
451 component_match_add(&pdev->dev, match, compare_of, remote); in meson_probe_remote()
472 struct meson_drm *priv = dev_get_drvdata(&pdev->dev); in meson_drv_shutdown()
477 drm_kms_helper_poll_fini(priv->drm); in meson_drv_shutdown()
478 drm_atomic_helper_shutdown(priv->drm); in meson_drv_shutdown()
484 struct device_node *np = pdev->dev.of_node; in meson_drv_probe()
500 return meson_drv_bind_master(&pdev->dev, false); in meson_drv_probe()
504 dev_info(&pdev->dev, "Queued %d outputs on vpu\n", count); in meson_drv_probe()
506 return component_master_add_with_match(&pdev->dev, in meson_drv_probe()
534 { .compatible = "amlogic,meson-gxbb-vpu",
536 { .compatible = "amlogic,meson-gxl-vpu",
538 { .compatible = "amlogic,meson-gxm-vpu",
540 { .compatible = "amlogic,meson-g12a-vpu",
554 .name = "meson-drm",