diff options
| author | Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com> | 2007-10-16 04:29:42 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-16 12:43:20 -0400 |
| commit | 57f70c6067b66b16398010d43d1ee2eba5e56760 (patch) | |
| tree | 2466a4ccc0dd69ac1d7d6d9d6798200b6a87b365 /drivers/ps3 | |
| parent | fd5621129bbfa30839efbb6d32f20026a113f894 (diff) | |
ps3av: add quirk database for broken monitors
add a quirk database for broken monitors where the `best' advertised
video mode doesn't work
Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
Signed-off-by: Antonino Daplas <adaplas@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/ps3')
| -rw-r--r-- | drivers/ps3/ps3av.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/ps3/ps3av.c b/drivers/ps3/ps3av.c index fbf8dcde9675..cae4af9959d3 100644 --- a/drivers/ps3/ps3av.c +++ b/drivers/ps3/ps3av.c | |||
| @@ -721,6 +721,45 @@ static void ps3av_monitor_info_dump(const struct ps3av_pkt_av_get_monitor_info * | |||
| 721 | } | 721 | } |
| 722 | } | 722 | } |
| 723 | 723 | ||
| 724 | static const struct ps3av_monitor_quirk { | ||
| 725 | const char *monitor_name; | ||
| 726 | u32 clear_60, clear_50, clear_vesa; | ||
| 727 | } ps3av_monitor_quirks[] = { | ||
| 728 | { | ||
| 729 | .monitor_name = "DELL 2007WFP", | ||
| 730 | .clear_60 = PS3AV_RESBIT_1920x1080I | ||
| 731 | }, { | ||
| 732 | .monitor_name = "L226WTQ", | ||
| 733 | .clear_60 = PS3AV_RESBIT_1920x1080I | | ||
| 734 | PS3AV_RESBIT_1920x1080P | ||
| 735 | }, { | ||
| 736 | .monitor_name = "SyncMaster", | ||
| 737 | .clear_60 = PS3AV_RESBIT_1920x1080I | ||
| 738 | } | ||
| 739 | }; | ||
| 740 | |||
| 741 | static void ps3av_fixup_monitor_info(struct ps3av_info_monitor *info) | ||
| 742 | { | ||
| 743 | unsigned int i; | ||
| 744 | const struct ps3av_monitor_quirk *quirk; | ||
| 745 | |||
| 746 | for (i = 0; i < ARRAY_SIZE(ps3av_monitor_quirks); i++) { | ||
| 747 | quirk = &ps3av_monitor_quirks[i]; | ||
| 748 | if (!strncmp(info->monitor_name, quirk->monitor_name, | ||
| 749 | sizeof(info->monitor_name))) { | ||
| 750 | pr_info("%s: Applying quirk for %s\n", __func__, | ||
| 751 | quirk->monitor_name); | ||
| 752 | info->res_60.res_bits &= ~quirk->clear_60; | ||
| 753 | info->res_60.native &= ~quirk->clear_60; | ||
| 754 | info->res_50.res_bits &= ~quirk->clear_50; | ||
| 755 | info->res_50.native &= ~quirk->clear_50; | ||
| 756 | info->res_vesa.res_bits &= ~quirk->clear_vesa; | ||
| 757 | info->res_vesa.native &= ~quirk->clear_vesa; | ||
| 758 | break; | ||
| 759 | } | ||
| 760 | } | ||
| 761 | } | ||
| 762 | |||
| 724 | static int ps3av_auto_videomode(struct ps3av_pkt_av_get_hw_conf *av_hw_conf, | 763 | static int ps3av_auto_videomode(struct ps3av_pkt_av_get_hw_conf *av_hw_conf, |
| 725 | int boot) | 764 | int boot) |
| 726 | { | 765 | { |
| @@ -739,6 +778,8 @@ static int ps3av_auto_videomode(struct ps3av_pkt_av_get_hw_conf *av_hw_conf, | |||
| 739 | ps3av_monitor_info_dump(&monitor_info); | 778 | ps3av_monitor_info_dump(&monitor_info); |
| 740 | 779 | ||
| 741 | info = &monitor_info.info; | 780 | info = &monitor_info.info; |
| 781 | ps3av_fixup_monitor_info(info); | ||
| 782 | |||
| 742 | switch (info->monitor_type) { | 783 | switch (info->monitor_type) { |
| 743 | case PS3AV_MONITOR_TYPE_DVI: | 784 | case PS3AV_MONITOR_TYPE_DVI: |
| 744 | dvi = PS3AV_MODE_DVI; | 785 | dvi = PS3AV_MODE_DVI; |
