Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66cae477 authored by Maxime Jourdan's avatar Maxime Jourdan Committed by Neil Armstrong
Browse files

drm/meson: Use optional canvas provider



This is the first step into converting the meson/drm driver to use
the canvas module.

If a canvas provider node is detected in DT, use it. Otherwise,
fall back to what is currently being done.

Signed-off-by: default avatarMaxime Jourdan <mjourdan@baylibre.com>
Reviewed-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
[narmstrong: added back priv in meson_drv_unbind()]
Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181105104508.23090-3-mjourdan@baylibre.com
parent 2b80b98b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ config DRM_MESON
	select DRM_GEM_CMA_HELPER
	select VIDEOMODE_HELPERS
	select REGMAP_MMIO
	select MESON_CANVAS

config DRM_MESON_DW_HDMI
	tristate "HDMI Synopsys Controller support for Amlogic Meson Display"
+10 −4
Original line number Diff line number Diff line
@@ -193,6 +193,12 @@ void meson_crtc_irq(struct meson_drm *priv)
		} else
			meson_vpp_disable_interlace_vscaler_osd1(priv);

		if (priv->canvas)
			meson_canvas_config(priv->canvas, priv->canvas_id_osd1,
				priv->viu.osd1_addr, priv->viu.osd1_stride,
				priv->viu.osd1_height, MESON_CANVAS_WRAP_NONE,
				MESON_CANVAS_BLKMODE_LINEAR, 0);
		else
			meson_canvas_setup(priv, MESON_CANVAS_ID_OSD1,
				priv->viu.osd1_addr, priv->viu.osd1_stride,
				priv->viu.osd1_height, MESON_CANVAS_WRAP_NONE,
+30 −17
Original line number Diff line number Diff line
@@ -208,6 +208,14 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
		goto free_drm;
	}

	priv->canvas = meson_canvas_get(dev);
	if (!IS_ERR(priv->canvas)) {
		ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_osd1);
		if (ret)
			goto free_drm;
	} else {
		priv->canvas = NULL;

		res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dmc");
		if (!res) {
			ret = -EINVAL;
@@ -227,6 +235,7 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
			ret = PTR_ERR(priv->dmc);
			goto free_drm;
		}
	}

	priv->vsync_irq = platform_get_irq(pdev, 0);

@@ -300,6 +309,10 @@ static int meson_drv_bind(struct device *dev)
static void meson_drv_unbind(struct device *dev)
{
	struct drm_device *drm = dev_get_drvdata(dev);
	struct meson_drm *priv = drm->dev_private;

	if (priv->canvas)
		meson_canvas_free(priv->canvas, priv->canvas_id_osd1);

	drm_dev_unregister(drm);
	drm_kms_helper_poll_fini(drm);
+4 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/of.h>
#include <linux/soc/amlogic/meson-canvas.h>
#include <drm/drmP.h>

struct meson_drm {
@@ -31,6 +32,9 @@ struct meson_drm {
	struct regmap *dmc;
	int vsync_irq;

	struct meson_canvas *canvas;
	u8 canvas_id_osd1;

	struct drm_device *drm;
	struct drm_crtc *crtc;
	struct drm_plane *primary_plane;
+7 −1
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ static void meson_plane_atomic_update(struct drm_plane *plane,
		.y2 = state->crtc_y + state->crtc_h,
	};
	unsigned long flags;
	u8 canvas_id_osd1;

	/*
	 * Update Coordinates
@@ -104,8 +105,13 @@ static void meson_plane_atomic_update(struct drm_plane *plane,
				   (0xFF << OSD_GLOBAL_ALPHA_SHIFT) |
				   OSD_BLK0_ENABLE;

	if (priv->canvas)
		canvas_id_osd1 = priv->canvas_id_osd1;
	else
		canvas_id_osd1 = MESON_CANVAS_ID_OSD1;

	/* Set up BLK0 to point to the right canvas */
	priv->viu.osd1_blk0_cfg[0] = ((MESON_CANVAS_ID_OSD1 << OSD_CANVAS_SEL) |
	priv->viu.osd1_blk0_cfg[0] = ((canvas_id_osd1 << OSD_CANVAS_SEL) |
				      OSD_ENDIANNESS_LE);

	/* On GXBB, Use the old non-HDR RGB2YUV converter */