[POWERPC] PS3: Add support for HDMI RGB Full Range mode
authorMasashi Kimoto <Masashi_Kimoto@hq.scei.sony.co.jp>
Fri, 15 Jun 2007 21:19:10 +0000 (07:19 +1000)
committerPaul Mackerras <paulus@samba.org>
Thu, 28 Jun 2007 09:16:35 +0000 (19:16 +1000)
Add support for HDMI RGB Full Range mode, which is available on system
software 1.80 or newer.

CC: Masashi Kimoto <Masashi_Kimoto@hq.scei.sony.co.jp>
Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
drivers/ps3/ps3av_cmd.c
include/asm-powerpc/ps3av.h

index 0145ea1..7c4fb26 100644 (file)
@@ -143,6 +143,14 @@ static u32 ps3av_vid_video2av(int vid)
        return PS3AV_CMD_AV_VID_480P;
 }
 
+static int ps3av_hdmi_range(void)
+{
+       if (ps3_compare_firmware_version(1, 8, 0) < 0)
+               return 0;
+       else
+               return 1; /* supported */
+}
+
 int ps3av_cmd_init(void)
 {
        int res;
@@ -350,6 +358,10 @@ u32 ps3av_cmd_set_av_video_cs(void *p, u32 avport, int video_vid, int cs_out,
        /* should be same as video_mode.video_cs_out */
        av_video_cs->av_cs_in = ps3av_cs_video2av(PS3AV_CMD_VIDEO_CS_RGB_8);
        av_video_cs->bitlen_out = ps3av_cs_video2av_bitlen(cs_out);
+       if ((id & PS3AV_MODE_WHITE) && ps3av_hdmi_range())
+               av_video_cs->super_white = PS3AV_CMD_AV_SUPER_WHITE_ON;
+       else /* default off */
+               av_video_cs->super_white = PS3AV_CMD_AV_SUPER_WHITE_OFF;
        av_video_cs->aspect = aspect;
        if (id & PS3AV_MODE_DITHER) {
                av_video_cs->dither = PS3AV_CMD_AV_DITHER_ON
@@ -392,6 +404,10 @@ u32 ps3av_cmd_set_video_mode(void *p, u32 head, int video_vid, int video_fmt,
        video_mode->pitch = video_mode->width * 4;      /* line_length */
        video_mode->video_out_format = PS3AV_CMD_VIDEO_OUT_FORMAT_RGB_12BIT;
        video_mode->video_format = ps3av_video_fmt_table[video_fmt].format;
+       if ((id & PS3AV_MODE_COLOR) && ps3av_hdmi_range())
+               video_mode->video_cl_cnv = PS3AV_CMD_VIDEO_CL_CNV_DISABLE_LUT;
+       else /* default enable */
+               video_mode->video_cl_cnv = PS3AV_CMD_VIDEO_CL_CNV_ENABLE_LUT;
        video_mode->video_order = ps3av_video_fmt_table[video_fmt].order;
 
        pr_debug("%s: video_mode:vid:%x width:%d height:%d pitch:%d out_format:%d format:%x order:%x\n",
index 9efc40f..7f5948e 100644 (file)
 #define PS3AV_CMD_VIDEO_FMT_X8R8G8B8                   0x0000
 /* video_out_format */
 #define PS3AV_CMD_VIDEO_OUT_FORMAT_RGB_12BIT           0x0000
+/* video_cl_cnv */
+#define PS3AV_CMD_VIDEO_CL_CNV_ENABLE_LUT              0x0000
+#define PS3AV_CMD_VIDEO_CL_CNV_DISABLE_LUT             0x0010
 /* video_sync */
 #define PS3AV_CMD_VIDEO_SYNC_VSYNC                     0x0001
 #define PS3AV_CMD_VIDEO_SYNC_CSYNC                     0x0004
 #define PS3AV_MODE_MASK                                0x000F
 #define PS3AV_MODE_HDCP_OFF                    0x1000  /* Retail PS3 product doesn't support this */
 #define PS3AV_MODE_DITHER                      0x0800
+#define PS3AV_MODE_COLOR                       0x0400
+#define PS3AV_MODE_WHITE                       0x0200
 #define PS3AV_MODE_FULL                                0x0080
 #define PS3AV_MODE_DVI                         0x0040
 #define PS3AV_MODE_RGB                         0x0020
@@ -529,9 +534,9 @@ struct ps3av_pkt_video_mode {
        u32 video_out_format;   /* in: out format */
        u32 video_format;       /* in: input frame buffer format */
        u8 reserved3;
-       u8 reserved4;
+       u8 video_cl_cnv;        /* in: color conversion */
        u16 video_order;        /* in: input RGB order */
-       u32 reserved5;
+       u32 reserved4;
 };
 
 /* video: format */
@@ -539,7 +544,8 @@ struct ps3av_pkt_video_format {
        struct ps3av_send_hdr send_hdr;
        u32 video_head;         /* in: head */
        u32 video_format;       /* in: frame buffer format */
-       u16 reserved;
+       u8 reserved;
+       u8 video_cl_cnv;        /* in: color conversion */
        u16 video_order;        /* in: input RGB order */
 };