Commit f2d66aad authored by Russell King's avatar Russell King

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
...@@ -111,32 +111,30 @@ struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc) ...@@ -111,32 +111,30 @@ struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc)
return NULL; 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) u32 interface_pix_fmt, int hsync_pin, int vsync_pin)
{ {
struct imx_drm_crtc_helper_funcs *helper; struct imx_drm_crtc_helper_funcs *helper;
struct imx_drm_crtc *imx_crtc; struct imx_drm_crtc *imx_crtc;
imx_crtc = imx_drm_find_crtc(crtc); imx_crtc = imx_drm_find_crtc(encoder->crtc);
if (!imx_crtc) if (!imx_crtc)
return -EINVAL; return -EINVAL;
helper = &imx_crtc->imx_drm_helper_funcs; helper = &imx_crtc->imx_drm_helper_funcs;
if (helper->set_interface_pix_fmt) if (helper->set_interface_pix_fmt)
return helper->set_interface_pix_fmt(crtc, return helper->set_interface_pix_fmt(encoder->crtc,
encoder_type, interface_pix_fmt, encoder->encoder_type, interface_pix_fmt,
hsync_pin, vsync_pin); hsync_pin, vsync_pin);
return 0; 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, int imx_drm_panel_format(struct drm_encoder *encoder, u32 interface_pix_fmt)
u32 interface_pix_fmt)
{ {
return imx_drm_crtc_panel_format_pins(crtc, encoder_type, return imx_drm_panel_format_pins(encoder, interface_pix_fmt, 2, 3);
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) int imx_drm_crtc_vblank_get(struct imx_drm_crtc *imx_drm_crtc)
{ {
......
...@@ -56,9 +56,9 @@ struct drm_gem_cma_object *imx_drm_fb_get_obj(struct drm_framebuffer *fb); ...@@ -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); struct drm_device *imx_drm_device_get(void);
void imx_drm_device_put(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); 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); u32 interface_pix_fmt);
void imx_drm_fb_helper_set(struct drm_fbdev_cma *fbdev_helper); void imx_drm_fb_helper_set(struct drm_fbdev_cma *fbdev_helper);
......
...@@ -1453,8 +1453,7 @@ static void imx_hdmi_encoder_prepare(struct drm_encoder *encoder) ...@@ -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); struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);
imx_hdmi_poweroff(hdmi); imx_hdmi_poweroff(hdmi);
imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_NONE, imx_drm_panel_format(encoder, V4L2_PIX_FMT_RGB24);
V4L2_PIX_FMT_RGB24);
} }
static void imx_hdmi_encoder_commit(struct drm_encoder *encoder) static void imx_hdmi_encoder_commit(struct drm_encoder *encoder)
......
...@@ -200,8 +200,7 @@ static void imx_ldb_encoder_prepare(struct drm_encoder *encoder) ...@@ -200,8 +200,7 @@ static void imx_ldb_encoder_prepare(struct drm_encoder *encoder)
pixel_fmt = V4L2_PIX_FMT_RGB24; pixel_fmt = V4L2_PIX_FMT_RGB24;
} }
imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_LVDS, imx_drm_panel_format(encoder, pixel_fmt);
pixel_fmt);
} }
static void imx_ldb_encoder_commit(struct drm_encoder *encoder) static void imx_ldb_encoder_commit(struct drm_encoder *encoder)
......
...@@ -310,13 +310,11 @@ static void imx_tve_encoder_prepare(struct drm_encoder *encoder) ...@@ -310,13 +310,11 @@ static void imx_tve_encoder_prepare(struct drm_encoder *encoder)
switch (tve->mode) { switch (tve->mode) {
case TVE_MODE_VGA: case TVE_MODE_VGA:
imx_drm_crtc_panel_format_pins(encoder->crtc, imx_drm_panel_format_pins(encoder, IPU_PIX_FMT_GBR24,
DRM_MODE_ENCODER_DAC, IPU_PIX_FMT_GBR24,
tve->hsync_pin, tve->vsync_pin); tve->hsync_pin, tve->vsync_pin);
break; break;
case TVE_MODE_TVOUT: case TVE_MODE_TVOUT:
imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_TVDAC, imx_drm_panel_format(encoder, V4L2_PIX_FMT_YUV444);
V4L2_PIX_FMT_YUV444);
break; break;
} }
} }
...@@ -510,12 +508,16 @@ static int tve_clk_init(struct imx_tve *tve, void __iomem *base) ...@@ -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) static int imx_tve_register(struct imx_tve *tve)
{ {
int encoder_type;
int ret; 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->connector.funcs = &imx_tve_connector_funcs;
tve->encoder.funcs = &imx_tve_encoder_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; tve->connector.connector_type = DRM_MODE_CONNECTOR_VGA;
drm_encoder_helper_add(&tve->encoder, &imx_tve_encoder_helper_funcs); drm_encoder_helper_add(&tve->encoder, &imx_tve_encoder_helper_funcs);
......
...@@ -284,6 +284,7 @@ static int ipu_set_interface_pix_fmt(struct drm_crtc *crtc, u32 encoder_type, ...@@ -284,6 +284,7 @@ static int ipu_set_interface_pix_fmt(struct drm_crtc *crtc, u32 encoder_type,
ipu_crtc->di_clkflags = IPU_DI_CLKMODE_SYNC | ipu_crtc->di_clkflags = IPU_DI_CLKMODE_SYNC |
IPU_DI_CLKMODE_EXT; IPU_DI_CLKMODE_EXT;
break; break;
case DRM_MODE_ENCODER_TMDS:
case DRM_MODE_ENCODER_NONE: case DRM_MODE_ENCODER_NONE:
ipu_crtc->di_clkflags = 0; ipu_crtc->di_clkflags = 0;
break; break;
......
...@@ -108,8 +108,7 @@ static void imx_pd_encoder_prepare(struct drm_encoder *encoder) ...@@ -108,8 +108,7 @@ static void imx_pd_encoder_prepare(struct drm_encoder *encoder)
{ {
struct imx_parallel_display *imxpd = enc_to_imxpd(encoder); struct imx_parallel_display *imxpd = enc_to_imxpd(encoder);
imx_drm_crtc_panel_format(encoder->crtc, DRM_MODE_ENCODER_NONE, imx_drm_panel_format(encoder, imxpd->interface_pix_fmt);
imxpd->interface_pix_fmt);
} }
static void imx_pd_encoder_commit(struct drm_encoder *encoder) static void imx_pd_encoder_commit(struct drm_encoder *encoder)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment