Lines Matching +full:meson +full:- +full:device

1 // SPDX-License-Identifier: GPL-2.0-or-later
17 #include <linux/soc/amlogic/meson-canvas.h>
43 #define DRIVER_NAME "meson"
44 #define DRIVER_DESC "Amlogic Meson DRM driver"
54 * - Full reset of entire video processing HW blocks
55 * - Scaling and setup of the VPU clock
56 * - Bus clock gates
57 * - Powering up video processing HW blocks
58 * - Powering Up HDMI controller and PHY
74 struct meson_drm *priv = dev->dev_private; in meson_irq()
76 (void)readl_relaxed(priv->io_base + _REG(VENC_INTFLAG)); in meson_irq()
89 args->pitch = ALIGN(DIV_ROUND_UP(args->width * args->bpp, 8), SZ_64); in meson_dumb_create()
90 args->size = PAGE_ALIGN(args->pitch * args->height); in meson_dumb_create()
112 static bool meson_vpu_has_available_connectors(struct device *dev) in meson_vpu_has_available_connectors()
117 for_each_endpoint_of_node(dev->of_node, ep) { in meson_vpu_has_available_connectors()
147 writel_relaxed(value, priv->io_base + _REG(VPU_RDARB_MODE_L1C1)); in meson_vpu_init()
151 writel_relaxed(value, priv->io_base + _REG(VPU_RDARB_MODE_L1C2)); in meson_vpu_init()
156 writel_relaxed(value, priv->io_base + _REG(VPU_RDARB_MODE_L2C1)); in meson_vpu_init()
160 writel_relaxed(value, priv->io_base + _REG(VPU_WRARB_MODE_L2C1)); in meson_vpu_init()
181 static int meson_drv_bind_master(struct device *dev, bool has_components) in meson_drv_bind_master()
194 return -ENODEV; in meson_drv_bind_master()
199 return -ENODEV; in meson_drv_bind_master()
207 ret = -ENOMEM; in meson_drv_bind_master()
210 drm->dev_private = priv; in meson_drv_bind_master()
211 priv->drm = drm; in meson_drv_bind_master()
212 priv->dev = dev; in meson_drv_bind_master()
213 priv->compat = match->compat; in meson_drv_bind_master()
214 priv->afbcd.ops = match->afbcd_ops; in meson_drv_bind_master()
222 priv->io_base = regs; in meson_drv_bind_master()
226 ret = -EINVAL; in meson_drv_bind_master()
230 regs = devm_ioremap(dev, res->start, resource_size(res)); in meson_drv_bind_master()
232 ret = -EADDRNOTAVAIL; in meson_drv_bind_master()
236 priv->hhi = devm_regmap_init_mmio(dev, regs, in meson_drv_bind_master()
238 if (IS_ERR(priv->hhi)) { in meson_drv_bind_master()
239 dev_err(&pdev->dev, "Couldn't create the HHI regmap\n"); in meson_drv_bind_master()
240 ret = PTR_ERR(priv->hhi); in meson_drv_bind_master()
244 priv->canvas = meson_canvas_get(dev); in meson_drv_bind_master()
245 if (IS_ERR(priv->canvas)) { in meson_drv_bind_master()
246 ret = PTR_ERR(priv->canvas); in meson_drv_bind_master()
250 ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_osd1); in meson_drv_bind_master()
253 ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_vd1_0); in meson_drv_bind_master()
256 ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_vd1_1); in meson_drv_bind_master()
259 ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_vd1_2); in meson_drv_bind_master()
263 priv->vsync_irq = platform_get_irq(pdev, 0); in meson_drv_bind_master()
272 priv->limits = &meson_drm_soc_attrs[i].limits; in meson_drv_bind_master()
288 drm->mode_config.max_width = 3840; in meson_drv_bind_master()
289 drm->mode_config.max_height = 2160; in meson_drv_bind_master()
290 drm->mode_config.funcs = &meson_mode_config_funcs; in meson_drv_bind_master()
291 drm->mode_config.helper_private = &meson_mode_config_helpers; in meson_drv_bind_master()
299 if (priv->afbcd.ops) { in meson_drv_bind_master()
300 ret = priv->afbcd.ops->init(priv); in meson_drv_bind_master()
314 dev_err(drm->dev, "Couldn't bind all components\n"); in meson_drv_bind_master()
343 ret = request_irq(priv->vsync_irq, meson_irq, 0, drm->driver->name, drm); in meson_drv_bind_master()
362 free_irq(priv->vsync_irq, drm); in meson_drv_bind_master()
364 if (priv->afbcd.ops) in meson_drv_bind_master()
365 priv->afbcd.ops->exit(priv); in meson_drv_bind_master()
367 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_2); in meson_drv_bind_master()
369 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_1); in meson_drv_bind_master()
371 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_0); in meson_drv_bind_master()
373 meson_canvas_free(priv->canvas, priv->canvas_id_osd1); in meson_drv_bind_master()
387 static int meson_drv_bind(struct device *dev) in meson_drv_bind()
392 static void meson_drv_unbind(struct device *dev) in meson_drv_unbind()
395 struct drm_device *drm = priv->drm; in meson_drv_unbind()
397 if (priv->canvas) { in meson_drv_unbind()
398 meson_canvas_free(priv->canvas, priv->canvas_id_osd1); in meson_drv_unbind()
399 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_0); in meson_drv_unbind()
400 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_1); in meson_drv_unbind()
401 meson_canvas_free(priv->canvas, priv->canvas_id_vd1_2); in meson_drv_unbind()
407 free_irq(priv->vsync_irq, drm); in meson_drv_unbind()
416 if (priv->afbcd.ops) in meson_drv_unbind()
417 priv->afbcd.ops->exit(priv); in meson_drv_unbind()
425 static int __maybe_unused meson_drv_pm_suspend(struct device *dev) in meson_drv_pm_suspend()
432 return drm_mode_config_helper_suspend(priv->drm); in meson_drv_pm_suspend()
435 static int __maybe_unused meson_drv_pm_resume(struct device *dev) in meson_drv_pm_resume()
446 if (priv->afbcd.ops) in meson_drv_pm_resume()
447 priv->afbcd.ops->init(priv); in meson_drv_pm_resume()
449 return drm_mode_config_helper_resume(priv->drm); in meson_drv_pm_resume()
454 struct meson_drm *priv = dev_get_drvdata(&pdev->dev); in meson_drv_shutdown()
459 drm_kms_helper_poll_fini(priv->drm); in meson_drv_shutdown()
460 drm_atomic_helper_shutdown(priv->drm); in meson_drv_shutdown()
470 { .compatible = "amlogic,meson-gxbb-dw-hdmi" },
471 { .compatible = "amlogic,meson-gxl-dw-hdmi" },
472 { .compatible = "amlogic,meson-gxm-dw-hdmi" },
473 { .compatible = "amlogic,meson-g12a-dw-hdmi" },
480 struct device_node *np = pdev->dev.of_node; in meson_drv_probe()
492 component_match_add(&pdev->dev, &match, component_compare_of, remote); in meson_drv_probe()
494 dev_dbg(&pdev->dev, "parent %pOF remote match add %pOF parent %s\n", in meson_drv_probe()
495 np, remote, dev_name(&pdev->dev)); in meson_drv_probe()
504 return meson_drv_bind_master(&pdev->dev, false); in meson_drv_probe()
508 dev_info(&pdev->dev, "Queued %d outputs on vpu\n", count); in meson_drv_probe()
510 return component_master_add_with_match(&pdev->dev, in meson_drv_probe()
521 component_master_del(&pdev->dev, &meson_drv_master_ops); in meson_drv_remove()
543 { .compatible = "amlogic,meson-gxbb-vpu",
545 { .compatible = "amlogic,meson-gxl-vpu",
547 { .compatible = "amlogic,meson-gxm-vpu",
549 { .compatible = "amlogic,meson-g12a-vpu",
564 .name = "meson-drm",