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

Commit f2d66aad authored by Russell King's avatar Russell King
Browse files

imx-drm: simplify setup of panel format



The encoder format passed into imx_drm_crtc_panel_format*() is the
encoder format used for DRM in most cases; the HDMI encoder sets
this to none, but this is incorrect, it should be TMDS.

Since this is the case, we can pass the drm_encoder structure
directly into this function and use the supplied fields there to
configure the CRTC.

Acked-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Acked-by: default avatarShawn Guo <shawn.guo@linaro.org>
Reviewed-by: default avatarFabio Estevam <fabio.estevam@freescale.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent baa68c4b
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -111,32 +111,30 @@ struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc)
	return NULL;
}

int imx_drm_crtc_panel_format_pins(struct drm_crtc *crtc, u32 encoder_type,
int imx_drm_panel_format_pins(struct drm_encoder *encoder,
		u32 interface_pix_fmt, int hsync_pin, int vsync_pin)
{
	struct imx_drm_crtc_helper_funcs *helper;
	struct imx_drm_crtc *imx_crtc;

	imx_crtc = imx_drm_find_crtc(crtc);
	imx_crtc = imx_drm_find_crtc(encoder->crtc);
	if (!imx_crtc)
		return -EINVAL;

	helper = &imx_crtc->imx_drm_helper_funcs;
	if (helper->set_interface_pix_fmt)
		return helper->set_interface_pix_fmt(crtc,
				encoder_type, interface_pix_fmt,
		return helper->set_interface_pix_fmt(encoder->crtc,
				encoder->encoder_type, interface_pix_fmt,
				hsync_pin, vsync_pin);
	return 0;
}
EXPORT_SYMBOL_GPL(imx_drm_crtc_panel_format_pins);
EXPORT_SYMBOL_GPL(imx_drm_panel_format_pins);

int imx_drm_crtc_panel_format(struct drm_crtc *crtc, u32 encoder_type,
		u32 interface_pix_fmt)
int imx_drm_panel_format(struct drm_encoder *encoder, u32 interface_pix_fmt)
{
	return imx_drm_crtc_panel_format_pins(crtc, encoder_type,
					      interface_pix_fmt, 2, 3);
	return imx_drm_panel_format_pins(encoder, interface_pix_fmt, 2, 3);
}
EXPORT_SYMBOL_GPL(imx_drm_crtc_panel_format);
EXPORT_SYMBOL_GPL(imx_drm_panel_format);

int imx_drm_crtc_vblank_get(struct imx_drm_crtc *imx_drm_crtc)
{
+2 −2
Original line number Diff line number Diff line
@@ -56,9 +56,9 @@ struct drm_gem_cma_object *imx_drm_fb_get_obj(struct drm_framebuffer *fb);

struct drm_device *imx_drm_device_get(void);
void imx_drm_device_put(void);
int imx_drm_crtc_panel_format_pins(struct drm_crtc *crtc, u32 encoder_type,
int imx_drm_panel_format_pins(struct drm_encoder *encoder,
		u32 interface_pix_fmt, int hsync_pin, int vsync_pin);
int imx_drm_crtc_panel_format(struct drm_crtc *crtc, u32 encoder_type,
int imx_drm_panel_format(struct drm_encoder *encoder,
		u32 interface_pix_fmt);
void imx_drm_fb_helper_set(struct drm_fbdev_cma *fbdev_helper);

+1 −2
Original line number Diff line number Diff line
@@ -1453,8 +1453,7 @@ static void imx_hdmi_encoder_prepare(struct drm_encoder *encoder)
	struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);

	imx_hdmi_poweroff(hdmi);
	imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_NONE,
				  V4L2_PIX_FMT_RGB24);
	imx_drm_panel_format(encoder, V4L2_PIX_FMT_RGB24);
}

static void imx_hdmi_encoder_commit(struct drm_encoder *encoder)
+1 −2
Original line number Diff line number Diff line
@@ -200,8 +200,7 @@ static void imx_ldb_encoder_prepare(struct drm_encoder *encoder)
		pixel_fmt = V4L2_PIX_FMT_RGB24;
	}

	imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_LVDS,
			pixel_fmt);
	imx_drm_panel_format(encoder, pixel_fmt);
}

static void imx_ldb_encoder_commit(struct drm_encoder *encoder)
+7 −5
Original line number Diff line number Diff line
@@ -310,13 +310,11 @@ static void imx_tve_encoder_prepare(struct drm_encoder *encoder)

	switch (tve->mode) {
	case TVE_MODE_VGA:
		imx_drm_crtc_panel_format_pins(encoder->crtc,
				DRM_MODE_ENCODER_DAC, IPU_PIX_FMT_GBR24,
		imx_drm_panel_format_pins(encoder, IPU_PIX_FMT_GBR24,
				tve->hsync_pin, tve->vsync_pin);
		break;
	case TVE_MODE_TVOUT:
		imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_TVDAC,
					  V4L2_PIX_FMT_YUV444);
		imx_drm_panel_format(encoder, V4L2_PIX_FMT_YUV444);
		break;
	}
}
@@ -510,12 +508,16 @@ static int tve_clk_init(struct imx_tve *tve, void __iomem *base)

static int imx_tve_register(struct imx_tve *tve)
{
	int encoder_type;
	int ret;

	encoder_type = tve->mode == TVE_MODE_VGA ?
				DRM_MODE_ENCODER_DAC : DRM_MODE_ENCODER_TVDAC;

	tve->connector.funcs = &imx_tve_connector_funcs;
	tve->encoder.funcs = &imx_tve_encoder_funcs;

	tve->encoder.encoder_type = DRM_MODE_ENCODER_NONE;
	tve->encoder.encoder_type = encoder_type;
	tve->connector.connector_type = DRM_MODE_CONNECTOR_VGA;

	drm_encoder_helper_add(&tve->encoder, &imx_tve_encoder_helper_funcs);
Loading