diff options
Diffstat (limited to 'drivers/video/via/hw.c')
-rw-r--r-- | drivers/video/via/hw.c | 85 |
1 files changed, 53 insertions, 32 deletions
diff --git a/drivers/video/via/hw.c b/drivers/video/via/hw.c index 400373fda210..ecbb01f05112 100644 --- a/drivers/video/via/hw.c +++ b/drivers/video/via/hw.c | |||
@@ -685,6 +685,54 @@ void viafb_set_secondary_pitch(u32 pitch) | |||
685 | viafb_write_reg_mask(0x71, VIACR, (pitch >> (10 - 7)) & 0x80, 0x80); | 685 | viafb_write_reg_mask(0x71, VIACR, (pitch >> (10 - 7)) & 0x80, 0x80); |
686 | } | 686 | } |
687 | 687 | ||
688 | void viafb_set_primary_color_depth(u8 depth) | ||
689 | { | ||
690 | u8 value; | ||
691 | |||
692 | DEBUG_MSG(KERN_DEBUG "viafb_set_primary_color_depth(%d)\n", depth); | ||
693 | switch (depth) { | ||
694 | case 6: | ||
695 | value = 0x00; | ||
696 | break; | ||
697 | case 16: | ||
698 | value = 0x14; | ||
699 | break; | ||
700 | case 24: | ||
701 | value = 0x0C; | ||
702 | break; | ||
703 | default: | ||
704 | printk(KERN_WARNING "viafb_set_primary_color_depth: " | ||
705 | "Unsupported depth: %d\n", depth); | ||
706 | return; | ||
707 | } | ||
708 | |||
709 | viafb_write_reg_mask(0x15, VIASR, value, 0x1C); | ||
710 | } | ||
711 | |||
712 | void viafb_set_secondary_color_depth(u8 depth) | ||
713 | { | ||
714 | u8 value; | ||
715 | |||
716 | DEBUG_MSG(KERN_DEBUG "viafb_set_secondary_color_depth(%d)\n", depth); | ||
717 | switch (depth) { | ||
718 | case 6: | ||
719 | value = 0x00; | ||
720 | break; | ||
721 | case 16: | ||
722 | value = 0x40; | ||
723 | break; | ||
724 | case 24: | ||
725 | value = 0xC0; | ||
726 | break; | ||
727 | default: | ||
728 | printk(KERN_WARNING "viafb_set_secondary_color_depth: " | ||
729 | "Unsupported depth: %d\n", depth); | ||
730 | return; | ||
731 | } | ||
732 | |||
733 | viafb_write_reg_mask(0x67, VIACR, value, 0xC0); | ||
734 | } | ||
735 | |||
688 | void viafb_set_output_path(int device, int set_iga, int output_interface) | 736 | void viafb_set_output_path(int device, int set_iga, int output_interface) |
689 | { | 737 | { |
690 | switch (device) { | 738 | switch (device) { |
@@ -1761,35 +1809,6 @@ void viafb_load_crtc_timing(struct display_timing device_timing, | |||
1761 | viafb_lock_crt(); | 1809 | viafb_lock_crt(); |
1762 | } | 1810 | } |
1763 | 1811 | ||
1764 | void viafb_set_color_depth(int bpp_byte, int set_iga) | ||
1765 | { | ||
1766 | if (set_iga == IGA1) { | ||
1767 | switch (bpp_byte) { | ||
1768 | case MODE_8BPP: | ||
1769 | viafb_write_reg_mask(SR15, VIASR, 0x22, 0x7E); | ||
1770 | break; | ||
1771 | case MODE_16BPP: | ||
1772 | viafb_write_reg_mask(SR15, VIASR, 0xB6, 0xFE); | ||
1773 | break; | ||
1774 | case MODE_32BPP: | ||
1775 | viafb_write_reg_mask(SR15, VIASR, 0xAE, 0xFE); | ||
1776 | break; | ||
1777 | } | ||
1778 | } else { | ||
1779 | switch (bpp_byte) { | ||
1780 | case MODE_8BPP: | ||
1781 | viafb_write_reg_mask(CR67, VIACR, 0x00, BIT6 + BIT7); | ||
1782 | break; | ||
1783 | case MODE_16BPP: | ||
1784 | viafb_write_reg_mask(CR67, VIACR, 0x40, BIT6 + BIT7); | ||
1785 | break; | ||
1786 | case MODE_32BPP: | ||
1787 | viafb_write_reg_mask(CR67, VIACR, 0xC0, BIT6 + BIT7); | ||
1788 | break; | ||
1789 | } | ||
1790 | } | ||
1791 | } | ||
1792 | |||
1793 | void viafb_fill_crtc_timing(struct crt_mode_table *crt_table, | 1812 | void viafb_fill_crtc_timing(struct crt_mode_table *crt_table, |
1794 | struct VideoModeTable *video_mode, int bpp_byte, int set_iga) | 1813 | struct VideoModeTable *video_mode, int bpp_byte, int set_iga) |
1795 | { | 1814 | { |
@@ -1867,9 +1886,6 @@ void viafb_fill_crtc_timing(struct crt_mode_table *crt_table, | |||
1867 | && (viaparinfo->chip_info->gfx_chip_name != UNICHROME_K400)) | 1886 | && (viaparinfo->chip_info->gfx_chip_name != UNICHROME_K400)) |
1868 | viafb_load_FIFO_reg(set_iga, h_addr, v_addr); | 1887 | viafb_load_FIFO_reg(set_iga, h_addr, v_addr); |
1869 | 1888 | ||
1870 | /* load SR Register About Memory and Color part */ | ||
1871 | viafb_set_color_depth(bpp_byte, set_iga); | ||
1872 | |||
1873 | pll_D_N = viafb_get_clk_value(crt_table[index].clk); | 1889 | pll_D_N = viafb_get_clk_value(crt_table[index].clk); |
1874 | DEBUG_MSG(KERN_INFO "PLL=%x", pll_D_N); | 1890 | DEBUG_MSG(KERN_INFO "PLL=%x", pll_D_N); |
1875 | viafb_set_vclock(pll_D_N, set_iga); | 1891 | viafb_set_vclock(pll_D_N, set_iga); |
@@ -2206,6 +2222,8 @@ int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp, | |||
2206 | outb(VPIT.SR[i - 1], VIASR + 1); | 2222 | outb(VPIT.SR[i - 1], VIASR + 1); |
2207 | } | 2223 | } |
2208 | 2224 | ||
2225 | viafb_write_reg_mask(0x15, VIASR, viafbinfo->fix.visual | ||
2226 | == FB_VISUAL_PSEUDOCOLOR ? 0x22 : 0xA2, 0xA2); | ||
2209 | viafb_set_iga_path(); | 2227 | viafb_set_iga_path(); |
2210 | 2228 | ||
2211 | /* Write CRTC */ | 2229 | /* Write CRTC */ |
@@ -2245,6 +2263,9 @@ int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp, | |||
2245 | viafb_set_primary_pitch(viafbinfo->fix.line_length); | 2263 | viafb_set_primary_pitch(viafbinfo->fix.line_length); |
2246 | viafb_set_secondary_pitch(viafb_dual_fb ? viafbinfo1->fix.line_length | 2264 | viafb_set_secondary_pitch(viafb_dual_fb ? viafbinfo1->fix.line_length |
2247 | : viafbinfo->fix.line_length); | 2265 | : viafbinfo->fix.line_length); |
2266 | viafb_set_primary_color_depth(viaparinfo->depth); | ||
2267 | viafb_set_secondary_color_depth(viafb_dual_fb ? viaparinfo1->depth | ||
2268 | : viaparinfo->depth); | ||
2248 | /* Update Refresh Rate Setting */ | 2269 | /* Update Refresh Rate Setting */ |
2249 | 2270 | ||
2250 | /* Clear On Screen */ | 2271 | /* Clear On Screen */ |