[media] s5p-tv: fix mbus configuration
authorTomasz Stanislawski <t.stanislaws@samsung.com>
Thu, 25 Aug 2011 15:47:48 +0000 (12:47 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 26 Sep 2011 11:04:31 +0000 (08:04 -0300)
This patch fixes mbus configuration between Mixer, SDO and HDMI.  The SDO
accepts only YUV444 on input. The HDMI in DVI mode accepts only RGB888. Now
Mixer is choosing proper output format depending on mbus format.

Signed-off-by: Tomasz Stanislawski <t.stanislaws@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/s5p-tv/hdmi_drv.c
drivers/media/video/s5p-tv/mixer_reg.c
drivers/media/video/s5p-tv/regs-mixer.h
drivers/media/video/s5p-tv/sdo_drv.c

index e1b29b488f6c547532ab627c7a280eb971da8070..0279e6e89febaf74db82d92c5ea783ab557ce187 100644 (file)
@@ -440,6 +440,7 @@ static const struct hdmi_preset_conf hdmi_conf_480p = {
                .height = 480,
                .code = V4L2_MBUS_FMT_FIXED, /* means RGB888 */
                .field = V4L2_FIELD_NONE,
+               .colorspace = V4L2_COLORSPACE_SRGB,
        },
 };
 
@@ -472,6 +473,7 @@ static const struct hdmi_preset_conf hdmi_conf_720p60 = {
                .height = 720,
                .code = V4L2_MBUS_FMT_FIXED, /* means RGB888 */
                .field = V4L2_FIELD_NONE,
+               .colorspace = V4L2_COLORSPACE_SRGB,
        },
 };
 
@@ -504,6 +506,7 @@ static const struct hdmi_preset_conf hdmi_conf_1080p50 = {
                .height = 1080,
                .code = V4L2_MBUS_FMT_FIXED, /* means RGB888 */
                .field = V4L2_FIELD_NONE,
+               .colorspace = V4L2_COLORSPACE_SRGB,
        },
 };
 
@@ -536,6 +539,7 @@ static const struct hdmi_preset_conf hdmi_conf_1080p60 = {
                .height = 1080,
                .code = V4L2_MBUS_FMT_FIXED, /* means RGB888 */
                .field = V4L2_FIELD_NONE,
+               .colorspace = V4L2_COLORSPACE_SRGB,
        },
 };
 
index 38dac672aa1c2471a15efedd2a6ad0b9a84eacb0..4800a3cbb297726a235e4d7cdc1e7fc055b1efce 100644 (file)
@@ -90,7 +90,7 @@ void mxr_reg_reset(struct mxr_device *mdev)
        mxr_vsync_set_update(mdev, MXR_DISABLE);
 
        /* set output in RGB888 mode */
-       mxr_write(mdev, MXR_CFG, MXR_CFG_OUT_YUV444);
+       mxr_write(mdev, MXR_CFG, MXR_CFG_OUT_RGB888);
 
        /* 16 beat burst in DMA */
        mxr_write_mask(mdev, MXR_STATUS, MXR_STATUS_16_BURST,
@@ -376,6 +376,12 @@ void mxr_reg_set_mbus_fmt(struct mxr_device *mdev,
        spin_lock_irqsave(&mdev->reg_slock, flags);
        mxr_vsync_set_update(mdev, MXR_DISABLE);
 
+       /* selecting colorspace accepted by output */
+       if (fmt->colorspace == V4L2_COLORSPACE_JPEG)
+               val |= MXR_CFG_OUT_YUV444;
+       else
+               val |= MXR_CFG_OUT_RGB888;
+
        /* choosing between interlace and progressive mode */
        if (fmt->field == V4L2_FIELD_INTERLACED)
                val |= MXR_CFG_SCAN_INTERLACE;
@@ -394,7 +400,8 @@ void mxr_reg_set_mbus_fmt(struct mxr_device *mdev,
        else
                WARN(1, "unrecognized mbus height %u!\n", fmt->height);
 
-       mxr_write_mask(mdev, MXR_CFG, val, MXR_CFG_SCAN_MASK);
+       mxr_write_mask(mdev, MXR_CFG, val, MXR_CFG_SCAN_MASK |
+               MXR_CFG_OUT_MASK);
 
        val = (fmt->field == V4L2_FIELD_INTERLACED) ? ~0 : 0;
        vp_write_mask(mdev, VP_MODE, val,
index 3c8442609c1ad068a4f60fb4854a960f1ec56d27..158abb43d0a40f1e63d4a637a00681800e16f064 100644 (file)
@@ -67,6 +67,7 @@
 /* bits for MXR_CFG */
 #define MXR_CFG_OUT_YUV444             (0 << 8)
 #define MXR_CFG_OUT_RGB888             (1 << 8)
+#define MXR_CFG_OUT_MASK               (1 << 8)
 #define MXR_CFG_DST_SDO                        (0 << 7)
 #define MXR_CFG_DST_HDMI               (1 << 7)
 #define MXR_CFG_DST_MASK               (1 << 7)
index 4dddd6bd635be25a2a4412c4bfa35215267f9b68..8cec67ef48c9214b0f529039e905de235bca219c 100644 (file)
@@ -170,6 +170,7 @@ static int sdo_g_mbus_fmt(struct v4l2_subdev *sd,
        fmt->height = sdev->fmt->height;
        fmt->code = V4L2_MBUS_FMT_FIXED;
        fmt->field = V4L2_FIELD_INTERLACED;
+       fmt->colorspace = V4L2_COLORSPACE_JPEG;
        return 0;
 }