Skip to content

Commit

Permalink
ps3: Fix black and white stripes
Browse files Browse the repository at this point in the history
Fix the black and white stripes issue with WUXGA monitor via HDMI.

It seems that when we use a VESA resolution from boot up, the AV settings
driver could not be initialized correctly.  In that case we need a dummy
packet before VESA setting.

[Geert] Refactored to reduce code duplication.

Signed-off-by: Geert Uytterhoeven <[email protected]>
CC: Geoff Levand <[email protected]>
Signed-off-by: Antonino Daplas <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Masashi Kimoto authored and Linus Torvalds committed Oct 16, 2007
1 parent 779121e commit 8ca0bf7
Showing 1 changed file with 38 additions and 20 deletions.
58 changes: 38 additions & 20 deletions drivers/ps3/ps3av.c
Original file line number Diff line number Diff line change
Expand Up @@ -491,10 +491,10 @@ static int ps3av_set_videomode(void)
return 0;
}

static void ps3av_set_videomode_cont(u32 id, u32 old_id)
static void ps3av_set_videomode_packet(u32 id)
{
struct ps3av_pkt_avb_param avb_param;
int i;
unsigned int i;
u32 len = 0, av_video_cs;
const struct avset_video_mode *video_mode;
int res;
Expand All @@ -507,24 +507,6 @@ static void ps3av_set_videomode_cont(u32 id, u32 old_id)
ps3av->av_hw_conf.num_of_avmulti;
avb_param.num_of_av_audio_pkt = 0;

/* video signal off */
ps3av_set_video_disable_sig();

/* Retail PS3 product doesn't support this */
if (id & PS3AV_MODE_HDCP_OFF) {
res = ps3av_cmd_av_hdmi_mode(PS3AV_CMD_AV_HDMI_HDCP_OFF);
if (res == PS3AV_STATUS_UNSUPPORTED_HDMI_MODE)
dev_dbg(&ps3av->dev->core, "Not supported\n");
else if (res)
dev_dbg(&ps3av->dev->core,
"ps3av_cmd_av_hdmi_mode failed\n");
} else if (old_id & PS3AV_MODE_HDCP_OFF) {
res = ps3av_cmd_av_hdmi_mode(PS3AV_CMD_AV_HDMI_MODE_NORMAL);
if (res < 0 && res != PS3AV_STATUS_UNSUPPORTED_HDMI_MODE)
dev_dbg(&ps3av->dev->core,
"ps3av_cmd_av_hdmi_mode failed\n");
}

/* video_pkt */
for (i = 0; i < avb_param.num_of_video_pkt; i++)
len += ps3av_cmd_set_video_mode(&avb_param.buf[len],
Expand Down Expand Up @@ -555,6 +537,42 @@ static void ps3av_set_videomode_cont(u32 id, u32 old_id)
__func__);
else if (res)
dev_dbg(&ps3av->dev->core, "ps3av_cmd_avb_param failed\n");
}

static void ps3av_set_videomode_cont(u32 id, u32 old_id)
{
static int vesa = 0;
int res;

/* video signal off */
ps3av_set_video_disable_sig();

/*
* AV backend needs non-VESA mode setting at least one time
* when VESA mode is used.
*/
if (vesa == 0 && (id & PS3AV_MODE_MASK) >= 11) {
/* vesa mode */
ps3av_set_videomode_packet(2); /* 480P */
}
vesa = 1;

/* Retail PS3 product doesn't support this */
if (id & PS3AV_MODE_HDCP_OFF) {
res = ps3av_cmd_av_hdmi_mode(PS3AV_CMD_AV_HDMI_HDCP_OFF);
if (res == PS3AV_STATUS_UNSUPPORTED_HDMI_MODE)
dev_dbg(&ps3av->dev->core, "Not supported\n");
else if (res)
dev_dbg(&ps3av->dev->core,
"ps3av_cmd_av_hdmi_mode failed\n");
} else if (old_id & PS3AV_MODE_HDCP_OFF) {
res = ps3av_cmd_av_hdmi_mode(PS3AV_CMD_AV_HDMI_MODE_NORMAL);
if (res < 0 && res != PS3AV_STATUS_UNSUPPORTED_HDMI_MODE)
dev_dbg(&ps3av->dev->core,
"ps3av_cmd_av_hdmi_mode failed\n");
}

ps3av_set_videomode_packet(id);

msleep(1500);
/* av video mute */
Expand Down

0 comments on commit 8ca0bf7

Please sign in to comment.