viafb: add function to change sync polarity per device
authorFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
Sat, 18 Sep 2010 23:47:28 +0000 (23:47 +0000)
committerFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
Fri, 24 Sep 2010 02:15:16 +0000 (02:15 +0000)
At the moment only the sync polarity for CRT is handled but there are
also bits for controlling the sync polarity for other output devices.
Add a function to change those similar to the other output device
functions.
There is no runtime change yet as the code still handles only CRT.

Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Cc: Joseph Chan <JosephChan@via.com.tw>
drivers/video/via/hw.c
drivers/video/via/hw.h

index 132d811525ed11493f4e49783457778cc5cd58cb..d6bbb0a05c3e4a72d57dc89d489bcd49eb29b73b 100644 (file)
@@ -1151,6 +1151,24 @@ void via_set_state(u32 devices, u8 state)
                set_lvds2_state(state);
 }
 
+void via_set_sync_polarity(u32 devices, u8 polarity)
+{
+       if (polarity & ~(VIA_HSYNC_NEGATIVE | VIA_VSYNC_NEGATIVE)) {
+               printk(KERN_WARNING "viafb: Unsupported polarity: %d\n",
+                       polarity);
+               return;
+       }
+
+       if (devices & VIA_CRT)
+               via_write_misc_reg_mask(polarity << 6, 0xC0);
+       if (devices & VIA_DVP1)
+               via_write_reg_mask(VIACR, 0x9B, polarity << 5, 0x60);
+       if (devices & VIA_LVDS1)
+               via_write_reg_mask(VIACR, 0x99, polarity << 5, 0x60);
+       if (devices & VIA_LVDS2)
+               via_write_reg_mask(VIACR, 0x97, polarity << 5, 0x60);
+}
+
 u32 via_parse_odev(char *input, char **end)
 {
        char *ptr = input;
@@ -2026,10 +2044,10 @@ void viafb_fill_crtc_timing(struct crt_mode_table *crt_table,
 
        /* update polarity for CRT timing */
        if (crt_table[index].h_sync_polarity == NEGATIVE)
-               polarity |= BIT6;
+               polarity |= VIA_HSYNC_NEGATIVE;
        if (crt_table[index].v_sync_polarity == NEGATIVE)
-               polarity |= BIT7;
-       via_write_misc_reg_mask(polarity, BIT6 | BIT7);
+               polarity |= VIA_VSYNC_NEGATIVE;
+       via_set_sync_polarity(VIA_CRT, polarity);
 
        if (set_iga == IGA1) {
                viafb_unlock_crt();
index b067cbb45ebfbeb1e72b6f96695bf0a288314366..ad6f9b1cf40eb49242369f1246b6a9605f92f4a6 100644 (file)
 #define VIA_STATE_SUSPEND      2
 #define VIA_STATE_OFF          3
 
+/* VIA output device sync polarity */
+#define VIA_HSYNC_NEGATIVE     0x01
+#define VIA_VSYNC_NEGATIVE     0x02
+
 /***************************************************
 * Definition IGA1 Design Method of CRTC Registers *
 ****************************************************/
@@ -912,6 +916,7 @@ void viafb_load_reg(int timing_value, int viafb_load_reg_num,
              int io_type);
 void via_set_source(u32 devices, u8 iga);
 void via_set_state(u32 devices, u8 state);
+void via_set_sync_polarity(u32 devices, u8 polarity);
 u32 via_parse_odev(char *input, char **end);
 void via_odev_to_seq(struct seq_file *m, u32 odev);
 void init_ad9389(void);