|
@@ -65,13 +65,11 @@ static int mxsfb_set_pixel_fmt(struct mxsfb_drm_private *mxsfb)
|
|
switch (format) {
|
|
switch (format) {
|
|
case DRM_FORMAT_RGB565:
|
|
case DRM_FORMAT_RGB565:
|
|
dev_dbg(drm->dev, "Setting up RGB565 mode\n");
|
|
dev_dbg(drm->dev, "Setting up RGB565 mode\n");
|
|
- ctrl |= CTRL_SET_BUS_WIDTH(STMLCDIF_16BIT);
|
|
|
|
ctrl |= CTRL_SET_WORD_LENGTH(0);
|
|
ctrl |= CTRL_SET_WORD_LENGTH(0);
|
|
ctrl1 |= CTRL1_SET_BYTE_PACKAGING(0xf);
|
|
ctrl1 |= CTRL1_SET_BYTE_PACKAGING(0xf);
|
|
break;
|
|
break;
|
|
case DRM_FORMAT_XRGB8888:
|
|
case DRM_FORMAT_XRGB8888:
|
|
dev_dbg(drm->dev, "Setting up XRGB8888 mode\n");
|
|
dev_dbg(drm->dev, "Setting up XRGB8888 mode\n");
|
|
- ctrl |= CTRL_SET_BUS_WIDTH(STMLCDIF_24BIT);
|
|
|
|
ctrl |= CTRL_SET_WORD_LENGTH(3);
|
|
ctrl |= CTRL_SET_WORD_LENGTH(3);
|
|
/* Do not use packed pixels = one pixel per word instead. */
|
|
/* Do not use packed pixels = one pixel per word instead. */
|
|
ctrl1 |= CTRL1_SET_BYTE_PACKAGING(0x7);
|
|
ctrl1 |= CTRL1_SET_BYTE_PACKAGING(0x7);
|
|
@@ -87,6 +85,36 @@ static int mxsfb_set_pixel_fmt(struct mxsfb_drm_private *mxsfb)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void mxsfb_set_bus_fmt(struct mxsfb_drm_private *mxsfb)
|
|
|
|
+{
|
|
|
|
+ struct drm_crtc *crtc = &mxsfb->pipe.crtc;
|
|
|
|
+ struct drm_device *drm = crtc->dev;
|
|
|
|
+ u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24;
|
|
|
|
+ u32 reg;
|
|
|
|
+
|
|
|
|
+ reg = readl(mxsfb->base + LCDC_CTRL);
|
|
|
|
+
|
|
|
|
+ if (mxsfb->connector.display_info.num_bus_formats)
|
|
|
|
+ bus_format = mxsfb->connector.display_info.bus_formats[0];
|
|
|
|
+
|
|
|
|
+ reg &= ~CTRL_BUS_WIDTH_MASK;
|
|
|
|
+ switch (bus_format) {
|
|
|
|
+ case MEDIA_BUS_FMT_RGB565_1X16:
|
|
|
|
+ reg |= CTRL_SET_BUS_WIDTH(STMLCDIF_16BIT);
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_RGB666_1X18:
|
|
|
|
+ reg |= CTRL_SET_BUS_WIDTH(STMLCDIF_18BIT);
|
|
|
|
+ break;
|
|
|
|
+ case MEDIA_BUS_FMT_RGB888_1X24:
|
|
|
|
+ reg |= CTRL_SET_BUS_WIDTH(STMLCDIF_24BIT);
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ dev_err(drm->dev, "Unknown media bus format %d\n", bus_format);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ writel(reg, mxsfb->base + LCDC_CTRL);
|
|
|
|
+}
|
|
|
|
+
|
|
static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb)
|
|
static void mxsfb_enable_controller(struct mxsfb_drm_private *mxsfb)
|
|
{
|
|
{
|
|
u32 reg;
|
|
u32 reg;
|
|
@@ -175,6 +203,8 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb)
|
|
|
|
|
|
writel(vdctrl0, mxsfb->base + LCDC_VDCTRL0);
|
|
writel(vdctrl0, mxsfb->base + LCDC_VDCTRL0);
|
|
|
|
|
|
|
|
+ mxsfb_set_bus_fmt(mxsfb);
|
|
|
|
+
|
|
/* Frame length in lines. */
|
|
/* Frame length in lines. */
|
|
writel(m->crtc_vtotal, mxsfb->base + LCDC_VDCTRL1);
|
|
writel(m->crtc_vtotal, mxsfb->base + LCDC_VDCTRL1);
|
|
|
|
|