diff options
Diffstat (limited to 'drivers/ps3/ps3av_cmd.c')
-rw-r--r-- | drivers/ps3/ps3av_cmd.c | 51 |
1 files changed, 18 insertions, 33 deletions
diff --git a/drivers/ps3/ps3av_cmd.c b/drivers/ps3/ps3av_cmd.c index 0145ea173c42..f72f5ddf18e4 100644 --- a/drivers/ps3/ps3av_cmd.c +++ b/drivers/ps3/ps3av_cmd.c | |||
@@ -143,6 +143,14 @@ static u32 ps3av_vid_video2av(int vid) | |||
143 | return PS3AV_CMD_AV_VID_480P; | 143 | return PS3AV_CMD_AV_VID_480P; |
144 | } | 144 | } |
145 | 145 | ||
146 | static int ps3av_hdmi_range(void) | ||
147 | { | ||
148 | if (ps3_compare_firmware_version(1, 8, 0) < 0) | ||
149 | return 0; | ||
150 | else | ||
151 | return 1; /* supported */ | ||
152 | } | ||
153 | |||
146 | int ps3av_cmd_init(void) | 154 | int ps3av_cmd_init(void) |
147 | { | 155 | { |
148 | int res; | 156 | int res; |
@@ -350,6 +358,10 @@ u32 ps3av_cmd_set_av_video_cs(void *p, u32 avport, int video_vid, int cs_out, | |||
350 | /* should be same as video_mode.video_cs_out */ | 358 | /* should be same as video_mode.video_cs_out */ |
351 | av_video_cs->av_cs_in = ps3av_cs_video2av(PS3AV_CMD_VIDEO_CS_RGB_8); | 359 | av_video_cs->av_cs_in = ps3av_cs_video2av(PS3AV_CMD_VIDEO_CS_RGB_8); |
352 | av_video_cs->bitlen_out = ps3av_cs_video2av_bitlen(cs_out); | 360 | av_video_cs->bitlen_out = ps3av_cs_video2av_bitlen(cs_out); |
361 | if ((id & PS3AV_MODE_WHITE) && ps3av_hdmi_range()) | ||
362 | av_video_cs->super_white = PS3AV_CMD_AV_SUPER_WHITE_ON; | ||
363 | else /* default off */ | ||
364 | av_video_cs->super_white = PS3AV_CMD_AV_SUPER_WHITE_OFF; | ||
353 | av_video_cs->aspect = aspect; | 365 | av_video_cs->aspect = aspect; |
354 | if (id & PS3AV_MODE_DITHER) { | 366 | if (id & PS3AV_MODE_DITHER) { |
355 | av_video_cs->dither = PS3AV_CMD_AV_DITHER_ON | 367 | 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, | |||
392 | video_mode->pitch = video_mode->width * 4; /* line_length */ | 404 | video_mode->pitch = video_mode->width * 4; /* line_length */ |
393 | video_mode->video_out_format = PS3AV_CMD_VIDEO_OUT_FORMAT_RGB_12BIT; | 405 | video_mode->video_out_format = PS3AV_CMD_VIDEO_OUT_FORMAT_RGB_12BIT; |
394 | video_mode->video_format = ps3av_video_fmt_table[video_fmt].format; | 406 | video_mode->video_format = ps3av_video_fmt_table[video_fmt].format; |
407 | if ((id & PS3AV_MODE_COLOR) && ps3av_hdmi_range()) | ||
408 | video_mode->video_cl_cnv = PS3AV_CMD_VIDEO_CL_CNV_DISABLE_LUT; | ||
409 | else /* default enable */ | ||
410 | video_mode->video_cl_cnv = PS3AV_CMD_VIDEO_CL_CNV_ENABLE_LUT; | ||
395 | video_mode->video_order = ps3av_video_fmt_table[video_fmt].order; | 411 | video_mode->video_order = ps3av_video_fmt_table[video_fmt].order; |
396 | 412 | ||
397 | pr_debug("%s: video_mode:vid:%x width:%d height:%d pitch:%d out_format:%d format:%x order:%x\n", | 413 | pr_debug("%s: video_mode:vid:%x width:%d height:%d pitch:%d out_format:%d format:%x order:%x\n", |
@@ -852,7 +868,7 @@ int ps3av_cmd_avb_param(struct ps3av_pkt_avb_param *avb, u32 send_len) | |||
852 | { | 868 | { |
853 | int res; | 869 | int res; |
854 | 870 | ||
855 | ps3fb_flip_ctl(0); /* flip off */ | 871 | ps3av_flip_ctl(0); /* flip off */ |
856 | 872 | ||
857 | /* avb packet */ | 873 | /* avb packet */ |
858 | res = ps3av_do_pkt(PS3AV_CID_AVB_PARAM, send_len, sizeof(*avb), | 874 | res = ps3av_do_pkt(PS3AV_CID_AVB_PARAM, send_len, sizeof(*avb), |
@@ -866,7 +882,7 @@ int ps3av_cmd_avb_param(struct ps3av_pkt_avb_param *avb, u32 send_len) | |||
866 | res); | 882 | res); |
867 | 883 | ||
868 | out: | 884 | out: |
869 | ps3fb_flip_ctl(1); /* flip on */ | 885 | ps3av_flip_ctl(1); /* flip on */ |
870 | return res; | 886 | return res; |
871 | } | 887 | } |
872 | 888 | ||
@@ -987,34 +1003,3 @@ void ps3av_cmd_av_monitor_info_dump(const struct ps3av_pkt_av_get_monitor_info * | |||
987 | | PS3AV_CMD_AV_LAYOUT_176 \ | 1003 | | PS3AV_CMD_AV_LAYOUT_176 \ |
988 | | PS3AV_CMD_AV_LAYOUT_192) | 1004 | | PS3AV_CMD_AV_LAYOUT_192) |
989 | 1005 | ||
990 | /************************* vuart ***************************/ | ||
991 | |||
992 | #define POLLING_INTERVAL 25 /* in msec */ | ||
993 | |||
994 | int ps3av_vuart_write(struct ps3_vuart_port_device *dev, const void *buf, | ||
995 | unsigned long size) | ||
996 | { | ||
997 | int error = ps3_vuart_write(dev, buf, size); | ||
998 | return error ? error : size; | ||
999 | } | ||
1000 | |||
1001 | int ps3av_vuart_read(struct ps3_vuart_port_device *dev, void *buf, | ||
1002 | unsigned long size, int timeout) | ||
1003 | { | ||
1004 | int error; | ||
1005 | int loopcnt = 0; | ||
1006 | |||
1007 | timeout = (timeout + POLLING_INTERVAL - 1) / POLLING_INTERVAL; | ||
1008 | while (loopcnt++ <= timeout) { | ||
1009 | error = ps3_vuart_read(dev, buf, size); | ||
1010 | if (!error) | ||
1011 | return size; | ||
1012 | if (error != -EAGAIN) { | ||
1013 | printk(KERN_ERR "%s: ps3_vuart_read failed %d\n", | ||
1014 | __func__, error); | ||
1015 | return error; | ||
1016 | } | ||
1017 | msleep(POLLING_INTERVAL); | ||
1018 | } | ||
1019 | return -EWOULDBLOCK; | ||
1020 | } | ||