From: Tomas Winkler <tomas.winkler@xxxxxxxxx> Signed-off-by: Tomas Winkler <tomas.winkler@xxxxxxxxx> Reviewed-by: Dan Carpenter <error27@xxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx> --- drivers/staging/easycap/easycap_low.c | 1302 ++++++++++++++++----------------- 1 files changed, 641 insertions(+), 661 deletions(-) diff --git a/drivers/staging/easycap/easycap_low.c b/drivers/staging/easycap/easycap_low.c index a345a1b..7b2de10 100644 --- a/drivers/staging/easycap/easycap_low.c +++ b/drivers/staging/easycap/easycap_low.c @@ -326,136 +326,132 @@ static int regset(struct usb_device *pusb_device, u16 index, u16 value) /*****************************************************************************/ /****************************************************************************/ -int -confirm_resolution(struct usb_device *p) +int confirm_resolution(struct usb_device *p) { -u8 get0, get1, get2, get3, get4, get5, get6, get7; - -if (NULL == p) - return -ENODEV; -GET(p, 0x0110, &get0); -GET(p, 0x0111, &get1); -GET(p, 0x0112, &get2); -GET(p, 0x0113, &get3); -GET(p, 0x0114, &get4); -GET(p, 0x0115, &get5); -GET(p, 0x0116, &get6); -GET(p, 0x0117, &get7); -JOT(8, "0x%03X, 0x%03X, " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X\n", - get0, get1, get2, get3, get4, get5, get6, get7); -JOT(8, "....cf PAL_720x526: " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X\n", - 0x000, 0x000, 0x001, 0x000, 0x5A0, 0x005, 0x121, 0x001); -JOT(8, "....cf PAL_704x526: " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X\n", - 0x004, 0x000, 0x001, 0x000, 0x584, 0x005, 0x121, 0x001); -JOT(8, "....cf VGA_640x480: " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X, " - "0x%03X, 0x%03X\n", - 0x008, 0x000, 0x020, 0x000, 0x508, 0x005, 0x110, 0x001); -return 0; + u8 get0, get1, get2, get3, get4, get5, get6, get7; + + if (NULL == p) + return -ENODEV; + GET(p, 0x0110, &get0); + GET(p, 0x0111, &get1); + GET(p, 0x0112, &get2); + GET(p, 0x0113, &get3); + GET(p, 0x0114, &get4); + GET(p, 0x0115, &get5); + GET(p, 0x0116, &get6); + GET(p, 0x0117, &get7); + JOT(8, "0x%03X, 0x%03X, " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X\n", + get0, get1, get2, get3, get4, get5, get6, get7); + JOT(8, "....cf PAL_720x526: " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X\n", + 0x000, 0x000, 0x001, 0x000, 0x5A0, 0x005, 0x121, 0x001); + JOT(8, "....cf PAL_704x526: " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X\n", + 0x004, 0x000, 0x001, 0x000, 0x584, 0x005, 0x121, 0x001); + JOT(8, "....cf VGA_640x480: " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X, " + "0x%03X, 0x%03X\n", + 0x008, 0x000, 0x020, 0x000, 0x508, 0x005, 0x110, 0x001); + return 0; } /****************************************************************************/ -int -confirm_stream(struct usb_device *p) +int confirm_stream(struct usb_device *p) { -u16 get2; -u8 igot; - -if (NULL == p) - return -ENODEV; -GET(p, 0x0100, &igot); get2 = 0x80 & igot; -if (0x80 == get2) - JOT(8, "confirm_stream: OK\n"); -else - JOT(8, "confirm_stream: STUCK\n"); -return 0; + u16 get2; + u8 igot; + + if (NULL == p) + return -ENODEV; + GET(p, 0x0100, &igot); get2 = 0x80 & igot; + if (0x80 == get2) + JOT(8, "confirm_stream: OK\n"); + else + JOT(8, "confirm_stream: STUCK\n"); + return 0; } /****************************************************************************/ -int -setup_stk(struct usb_device *p, bool ntsc) +int setup_stk(struct usb_device *p, bool ntsc) { -int i0; - -if (NULL == p) - return -ENODEV; -i0 = 0; -if (true == ntsc) { - while (0xFFF != stk1160configNTSC[i0].reg) { - SET(p, stk1160configNTSC[i0].reg, stk1160configNTSC[i0].set); - i0++; - } -} else { - while (0xFFF != stk1160configPAL[i0].reg) { - SET(p, stk1160configPAL[i0].reg, stk1160configPAL[i0].set); - i0++; + int i0; + + if (NULL == p) + return -ENODEV; + i0 = 0; + if (true == ntsc) { + while (0xFFF != stk1160configNTSC[i0].reg) { + SET(p, stk1160configNTSC[i0].reg, + stk1160configNTSC[i0].set); + i0++; + } + } else { + while (0xFFF != stk1160configPAL[i0].reg) { + SET(p, stk1160configPAL[i0].reg, + stk1160configPAL[i0].set); + i0++; + } } -} -write_300(p); + write_300(p); -return 0; + return 0; } /****************************************************************************/ -int -setup_saa(struct usb_device *p, bool ntsc) +int setup_saa(struct usb_device *p, bool ntsc) { -int i0, ir; - -if (NULL == p) - return -ENODEV; -i0 = 0; -if (true == ntsc) { - while (0xFF != saa7113configNTSC[i0].reg) { - ir = write_saa(p, saa7113configNTSC[i0].reg, - saa7113configNTSC[i0].set); - i0++; - } -} else { - while (0xFF != saa7113configPAL[i0].reg) { - ir = write_saa(p, saa7113configPAL[i0].reg, - saa7113configPAL[i0].set); - i0++; + int i0, ir; + + if (NULL == p) + return -ENODEV; + i0 = 0; + if (true == ntsc) { + while (0xFF != saa7113configNTSC[i0].reg) { + ir = write_saa(p, saa7113configNTSC[i0].reg, + saa7113configNTSC[i0].set); + i0++; + } + } else { + while (0xFF != saa7113configPAL[i0].reg) { + ir = write_saa(p, saa7113configPAL[i0].reg, + saa7113configPAL[i0].set); + i0++; + } } -} -return 0; + return 0; } /****************************************************************************/ -int -write_000(struct usb_device *p, u16 set2, u16 set0) +int write_000(struct usb_device *p, u16 set2, u16 set0) { -u8 igot0, igot2; - -if (NULL == p) - return -ENODEV; -GET(p, 0x0002, &igot2); -GET(p, 0x0000, &igot0); -SET(p, 0x0002, set2); -SET(p, 0x0000, set0); -return 0; + u8 igot0, igot2; + + if (NULL == p) + return -ENODEV; + GET(p, 0x0002, &igot2); + GET(p, 0x0000, &igot0); + SET(p, 0x0002, set2); + SET(p, 0x0000, set0); + return 0; } /****************************************************************************/ -int -write_saa(struct usb_device *p, u16 reg0, u16 set0) +int write_saa(struct usb_device *p, u16 reg0, u16 set0) { -if (NULL == p) - return -ENODEV; -SET(p, 0x200, 0x00); -SET(p, 0x204, reg0); -SET(p, 0x205, set0); -SET(p, 0x200, 0x01); -return wait_i2c(p); + if (NULL == p) + return -ENODEV; + SET(p, 0x200, 0x00); + SET(p, 0x204, reg0); + SET(p, 0x205, set0); + SET(p, 0x200, 0x01); + return wait_i2c(p); } /****************************************************************************/ /*--------------------------------------------------------------------------*/ @@ -470,30 +466,30 @@ return wait_i2c(p); int write_vt(struct usb_device *p, u16 reg0, u16 set0) { -u8 igot; -u16 got502, got503; -u16 set502, set503; + u8 igot; + u16 got502, got503; + u16 set502, set503; -if (NULL == p) - return -ENODEV; -SET(p, 0x0504, reg0); -SET(p, 0x0500, 0x008B); + if (NULL == p) + return -ENODEV; + SET(p, 0x0504, reg0); + SET(p, 0x0500, 0x008B); -GET(p, 0x0502, &igot); got502 = (0xFF & igot); -GET(p, 0x0503, &igot); got503 = (0xFF & igot); + GET(p, 0x0502, &igot); got502 = (0xFF & igot); + GET(p, 0x0503, &igot); got503 = (0xFF & igot); -JOT(16, "write_vt(., 0x%04X, 0x%04X): was 0x%04X\n", - reg0, set0, ((got503 << 8) | got502)); + JOT(16, "write_vt(., 0x%04X, 0x%04X): was 0x%04X\n", + reg0, set0, ((got503 << 8) | got502)); -set502 = (0x00FF & set0); -set503 = ((0xFF00 & set0) >> 8); + set502 = (0x00FF & set0); + set503 = ((0xFF00 & set0) >> 8); -SET(p, 0x0504, reg0); -SET(p, 0x0502, set502); -SET(p, 0x0503, set503); -SET(p, 0x0500, 0x008C); + SET(p, 0x0504, reg0); + SET(p, 0x0502, set502); + SET(p, 0x0503, set503); + SET(p, 0x0500, 0x008C); -return 0; + return 0; } /****************************************************************************/ /*--------------------------------------------------------------------------*/ @@ -505,23 +501,23 @@ return 0; * REGISTER 504: TARGET ADDRESS ON VT1612A */ /*--------------------------------------------------------------------------*/ -int -read_vt(struct usb_device *p, u16 reg0) +int read_vt(struct usb_device *p, u16 reg0) { -u8 igot; -u16 got502, got503; + u8 igot; + u16 got502, got503; -if (NULL == p) - return -ENODEV; -SET(p, 0x0504, reg0); -SET(p, 0x0500, 0x008B); + if (NULL == p) + return -ENODEV; + SET(p, 0x0504, reg0); + SET(p, 0x0500, 0x008B); -GET(p, 0x0502, &igot); got502 = (0xFF & igot); -GET(p, 0x0503, &igot); got503 = (0xFF & igot); + GET(p, 0x0502, &igot); got502 = (0xFF & igot); + GET(p, 0x0503, &igot); got503 = (0xFF & igot); -JOT(16, "read_vt(., 0x%04X): has 0x%04X\n", reg0, ((got503 << 8) | got502)); + JOT(16, "read_vt(., 0x%04X): has 0x%04X\n", + reg0, ((got503 << 8) | got502)); -return (got503 << 8) | got502; + return (got503 << 8) | got502; } /****************************************************************************/ /*--------------------------------------------------------------------------*/ @@ -529,18 +525,17 @@ return (got503 << 8) | got502; * THESE APPEAR TO HAVE NO EFFECT ON EITHER VIDEO OR AUDIO. */ /*--------------------------------------------------------------------------*/ -int -write_300(struct usb_device *p) +int write_300(struct usb_device *p) { -if (NULL == p) - return -ENODEV; -SET(p, 0x300, 0x0012); -SET(p, 0x350, 0x002D); -SET(p, 0x351, 0x0001); -SET(p, 0x352, 0x0000); -SET(p, 0x353, 0x0000); -SET(p, 0x300, 0x0080); -return 0; + if (NULL == p) + return -ENODEV; + SET(p, 0x300, 0x0012); + SET(p, 0x350, 0x002D); + SET(p, 0x351, 0x0001); + SET(p, 0x352, 0x0000); + SET(p, 0x353, 0x0000); + SET(p, 0x300, 0x0080); + return 0; } /****************************************************************************/ /*--------------------------------------------------------------------------*/ @@ -549,75 +544,72 @@ return 0; * REGISTER 0x0F, WHICH IS INVOLVED IN CHROMINANCE AUTOMATIC GAIN CONTROL. */ /*--------------------------------------------------------------------------*/ -int -check_saa(struct usb_device *p, bool ntsc) +int check_saa(struct usb_device *p, bool ntsc) { -int i0, ir, rc; - -if (NULL == p) - return -ENODEV; -i0 = 0; -rc = 0; -if (true == ntsc) { - while (0xFF != saa7113configNTSC[i0].reg) { - if (0x0F == saa7113configNTSC[i0].reg) { - i0++; - continue; - } + int i0, ir, rc; - ir = read_saa(p, saa7113configNTSC[i0].reg); - if (ir != saa7113configNTSC[i0].set) { - SAY("SAA register 0x%02X has 0x%02X, " + if (NULL == p) + return -ENODEV; + i0 = 0; + rc = 0; + if (true == ntsc) { + while (0xFF != saa7113configNTSC[i0].reg) { + if (0x0F == saa7113configNTSC[i0].reg) { + i0++; + continue; + } + + ir = read_saa(p, saa7113configNTSC[i0].reg); + if (ir != saa7113configNTSC[i0].set) { + SAY("SAA register 0x%02X has 0x%02X, " "expected 0x%02X\n", saa7113configNTSC[i0].reg, ir, saa7113configNTSC[i0].set); - rc--; - } - i0++; - } -} else { - while (0xFF != saa7113configPAL[i0].reg) { - if (0x0F == saa7113configPAL[i0].reg) { + rc--; + } i0++; - continue; } + } else { + while (0xFF != saa7113configPAL[i0].reg) { + if (0x0F == saa7113configPAL[i0].reg) { + i0++; + continue; + } - ir = read_saa(p, saa7113configPAL[i0].reg); - if (ir != saa7113configPAL[i0].set) { - SAY("SAA register 0x%02X has 0x%02X, " + ir = read_saa(p, saa7113configPAL[i0].reg); + if (ir != saa7113configPAL[i0].set) { + SAY("SAA register 0x%02X has 0x%02X, " "expected 0x%02X\n", saa7113configPAL[i0].reg, ir, saa7113configPAL[i0].set); - rc--; + rc--; + } + i0++; } - i0++; } -} -if (-8 > rc) - return rc; -else - return 0; + if (-8 > rc) + return rc; + else + return 0; } /****************************************************************************/ -int -merit_saa(struct usb_device *p) +int merit_saa(struct usb_device *p) { -int rc; - -if (NULL == p) - return -ENODEV; -rc = read_saa(p, 0x1F); -if ((0 > rc) || (0x02 & rc)) - return 1 ; -else - return 0; + int rc; + + if (NULL == p) + return -ENODEV; + rc = read_saa(p, 0x1F); + if ((0 > rc) || (0x02 & rc)) + return 1 ; + else + return 0; } /****************************************************************************/ -int -ready_saa(struct usb_device *p) +int ready_saa(struct usb_device *p) { -int j, rc, rate; -const int max = 5, marktime = PATIENCE/5; + int j, rc, rate; + const int max = 5, marktime = PATIENCE/5; /*--------------------------------------------------------------------------*/ /* * RETURNS 0 FOR INTERLACED 50 Hz @@ -626,38 +618,38 @@ const int max = 5, marktime = PATIENCE/5; * 3 FOR NON-INTERLACED 60 Hz */ /*--------------------------------------------------------------------------*/ -if (NULL == p) - return -ENODEV; -j = 0; -while (max > j) { - rc = read_saa(p, 0x1F); - if (0 <= rc) { - if (0 == (0x40 & rc)) - break; - if (1 == (0x01 & rc)) - break; - } - msleep(marktime); - j++; -} -if (max == j) - return -1; -else { - if (0x20 & rc) { - rate = 2; - JOT(8, "hardware detects 60 Hz\n"); - } else { - rate = 0; - JOT(8, "hardware detects 50 Hz\n"); + if (NULL == p) + return -ENODEV; + j = 0; + while (max > j) { + rc = read_saa(p, 0x1F); + if (0 <= rc) { + if (0 == (0x40 & rc)) + break; + if (1 == (0x01 & rc)) + break; + } + msleep(marktime); + j++; } - if (0x80 & rc) - JOT(8, "hardware detects interlacing\n"); + if (max == j) + return -1; else { - rate++; - JOT(8, "hardware detects no interlacing\n"); + if (0x20 & rc) { + rate = 2; + JOT(8, "hardware detects 60 Hz\n"); + } else { + rate = 0; + JOT(8, "hardware detects 50 Hz\n"); + } + if (0x80 & rc) + JOT(8, "hardware detects interlacing\n"); + else { + rate++; + JOT(8, "hardware detects no interlacing\n"); + } } -} -return 0; + return 0; } /****************************************************************************/ /*--------------------------------------------------------------------------*/ @@ -667,106 +659,101 @@ return 0; * REGISTER 0x100: ACCEPT ALSO (0x80 | stk1160config....[.].set) */ /*--------------------------------------------------------------------------*/ -int -check_stk(struct usb_device *p, bool ntsc) +int check_stk(struct usb_device *p, bool ntsc) { -int i0, ir; - -if (NULL == p) - return -ENODEV; -i0 = 0; -if (true == ntsc) { - while (0xFFF != stk1160configNTSC[i0].reg) { - if (0x000 == stk1160configNTSC[i0].reg) { - i0++; continue; - } - if (0x002 == stk1160configNTSC[i0].reg) { - i0++; continue; - } - ir = read_stk(p, stk1160configNTSC[i0].reg); - if (0x100 == stk1160configNTSC[i0].reg) { - if ((ir != (0xFF & stk1160configNTSC[i0].set)) && - (ir != (0x80 | (0xFF & - stk1160configNTSC[i0].set))) && - (0xFFFF != - stk1160configNTSC[i0].set)) { - SAY("STK register 0x%03X has 0x%02X, " + int i0, ir; + + if (NULL == p) + return -ENODEV; + i0 = 0; + if (true == ntsc) { + while (0xFFF != stk1160configNTSC[i0].reg) { + if (0x000 == stk1160configNTSC[i0].reg) { + i0++; continue; + } + if (0x002 == stk1160configNTSC[i0].reg) { + i0++; continue; + } + ir = read_stk(p, stk1160configNTSC[i0].reg); + if (0x100 == stk1160configNTSC[i0].reg) { + if ((ir != (0xFF & stk1160configNTSC[i0].set)) && + (ir != (0x80 | (0xFF & stk1160configNTSC[i0].set))) && + (0xFFFF != stk1160configNTSC[i0].set)) { + SAY("STK register 0x%03X has 0x%02X, " "expected 0x%02X\n", stk1160configNTSC[i0].reg, ir, stk1160configNTSC[i0].set); + } + i0++; continue; } - i0++; continue; - } - if ((ir != (0xFF & stk1160configNTSC[i0].set)) && - (0xFFFF != stk1160configNTSC[i0].set)) { - SAY("STK register 0x%03X has 0x%02X, " + if ((ir != (0xFF & stk1160configNTSC[i0].set)) && + (0xFFFF != stk1160configNTSC[i0].set)) { + SAY("STK register 0x%03X has 0x%02X, " "expected 0x%02X\n", stk1160configNTSC[i0].reg, ir, stk1160configNTSC[i0].set); + } + i0++; } - i0++; - } -} else { - while (0xFFF != stk1160configPAL[i0].reg) { - if (0x000 == stk1160configPAL[i0].reg) { - i0++; continue; - } - if (0x002 == stk1160configPAL[i0].reg) { - i0++; continue; - } - ir = read_stk(p, stk1160configPAL[i0].reg); - if (0x100 == stk1160configPAL[i0].reg) { - if ((ir != (0xFF & stk1160configPAL[i0].set)) && - (ir != (0x80 | (0xFF & - stk1160configPAL[i0].set))) && - (0xFFFF != - stk1160configPAL[i0].set)) { - SAY("STK register 0x%03X has 0x%02X, " + } else { + while (0xFFF != stk1160configPAL[i0].reg) { + if (0x000 == stk1160configPAL[i0].reg) { + i0++; continue; + } + if (0x002 == stk1160configPAL[i0].reg) { + i0++; continue; + } + ir = read_stk(p, stk1160configPAL[i0].reg); + if (0x100 == stk1160configPAL[i0].reg) { + if ((ir != (0xFF & stk1160configPAL[i0].set)) && + (ir != (0x80 | (0xFF & + stk1160configPAL[i0].set))) && + (0xFFFF != + stk1160configPAL[i0].set)) { + SAY("STK register 0x%03X has 0x%02X, " "expected 0x%02X\n", stk1160configPAL[i0].reg, ir, stk1160configPAL[i0].set); + } + i0++; continue; } - i0++; continue; - } - if ((ir != (0xFF & stk1160configPAL[i0].set)) && - (0xFFFF != stk1160configPAL[i0].set)) { - SAY("STK register 0x%03X has 0x%02X, " + if ((ir != (0xFF & stk1160configPAL[i0].set)) && + (0xFFFF != stk1160configPAL[i0].set)) { + SAY("STK register 0x%03X has 0x%02X, " "expected 0x%02X\n", stk1160configPAL[i0].reg, ir, stk1160configPAL[i0].set); + } + i0++; } - i0++; } -} -return 0; + return 0; } /****************************************************************************/ -int -read_saa(struct usb_device *p, u16 reg0) +int read_saa(struct usb_device *p, u16 reg0) { -u8 igot; + u8 igot; -if (NULL == p) - return -ENODEV; -SET(p, 0x208, reg0); -SET(p, 0x200, 0x20); -if (0 != wait_i2c(p)) - return -1; -igot = 0; -GET(p, 0x0209, &igot); -return igot; + if (NULL == p) + return -ENODEV; + SET(p, 0x208, reg0); + SET(p, 0x200, 0x20); + if (0 != wait_i2c(p)) + return -1; + igot = 0; + GET(p, 0x0209, &igot); + return igot; } /****************************************************************************/ -int -read_stk(struct usb_device *p, u32 reg0) +int read_stk(struct usb_device *p, u32 reg0) { -u8 igot; + u8 igot; -if (NULL == p) - return -ENODEV; -igot = 0; -GET(p, reg0, &igot); -return igot; + if (NULL == p) + return -ENODEV; + igot = 0; + GET(p, reg0, &igot); + return igot; } /****************************************************************************/ /*--------------------------------------------------------------------------*/ @@ -790,168 +777,165 @@ return igot; int select_input(struct usb_device *p, int input, int mode) { -int ir; - -if (NULL == p) - return -ENODEV; -stop_100(p); -switch (input) { -case 0: -case 1: { - if (0 != write_saa(p, 0x02, 0x80)) { - SAY("ERROR: failed to set SAA register 0x02 for input %i\n", - input); - } - SET(p, 0x0000, 0x0098); - SET(p, 0x0002, 0x0078); - break; -} -case 2: { - if (0 != write_saa(p, 0x02, 0x80)) { - SAY("ERROR: failed to set SAA register 0x02 for input %i\n", - input); - } - SET(p, 0x0000, 0x0090); - SET(p, 0x0002, 0x0078); - break; -} -case 3: { - if (0 != write_saa(p, 0x02, 0x80)) { - SAY("ERROR: failed to set SAA register 0x02 for input %i\n", - input); - } - SET(p, 0x0000, 0x0088); - SET(p, 0x0002, 0x0078); - break; -} -case 4: { - if (0 != write_saa(p, 0x02, 0x80)) { - SAY("ERROR: failed to set SAA register 0x02 for input %i\n", - input); - } - SET(p, 0x0000, 0x0080); - SET(p, 0x0002, 0x0078); - break; -} -case 5: { - if (9 != mode) - mode = 7; - switch (mode) { - case 7: { - if (0 != write_saa(p, 0x02, 0x87)) { + int ir; + + if (NULL == p) + return -ENODEV; + stop_100(p); + switch (input) { + case 0: + case 1: { + if (0 != write_saa(p, 0x02, 0x80)) { SAY("ERROR: failed to set SAA register 0x02 " "for input %i\n", input); } - if (0 != write_saa(p, 0x05, 0xFF)) { - SAY("ERROR: failed to set SAA register 0x05 " + SET(p, 0x0000, 0x0098); + SET(p, 0x0002, 0x0078); + break; + } + case 2: { + if (0 != write_saa(p, 0x02, 0x80)) { + SAY("ERROR: failed to set SAA register 0x02 " "for input %i\n", input); } + SET(p, 0x0000, 0x0090); + SET(p, 0x0002, 0x0078); + break; + } + case 3: { + if (0 != write_saa(p, 0x02, 0x80)) { + SAY("ERROR: failed to set SAA register 0x02 " + " for input %i\n", input); + } + SET(p, 0x0000, 0x0088); + SET(p, 0x0002, 0x0078); break; } - case 9: { - if (0 != write_saa(p, 0x02, 0x89)) { + case 4: { + if (0 != write_saa(p, 0x02, 0x80)) { SAY("ERROR: failed to set SAA register 0x02 " "for input %i\n", input); } - if (0 != write_saa(p, 0x05, 0x00)) { - SAY("ERROR: failed to set SAA register 0x05 " + SET(p, 0x0000, 0x0080); + SET(p, 0x0002, 0x0078); + break; + } + case 5: { + if (9 != mode) + mode = 7; + switch (mode) { + case 7: { + if (0 != write_saa(p, 0x02, 0x87)) { + SAY("ERROR: failed to set SAA register 0x02 " + "for input %i\n", input); + } + if (0 != write_saa(p, 0x05, 0xFF)) { + SAY("ERROR: failed to set SAA register 0x05 " "for input %i\n", input); + } + break; } - break; + case 9: { + if (0 != write_saa(p, 0x02, 0x89)) { + SAY("ERROR: failed to set SAA register 0x02 " + "for input %i\n", input); + } + if (0 != write_saa(p, 0x05, 0x00)) { + SAY("ERROR: failed to set SAA register 0x05 " + "for input %i\n", input); + } + break; + } + default: { + SAY("MISTAKE: bad mode: %i\n", mode); + return -1; + } + } + if (0 != write_saa(p, 0x04, 0x00)) { + SAY("ERROR: failed to set SAA register 0x04 " + "for input %i\n", input); + } + if (0 != write_saa(p, 0x09, 0x80)) { + SAY("ERROR: failed to set SAA register 0x09 " + "for input %i\n", input); + } + SET(p, 0x0002, 0x0093); + break; } default: { - SAY("MISTAKE: bad mode: %i\n", mode); + SAY("ERROR: bad input: %i\n", input); return -1; } } - if (0 != write_saa(p, 0x04, 0x00)) { - SAY("ERROR: failed to set SAA register 0x04 for input %i\n", - input); - } - if (0 != write_saa(p, 0x09, 0x80)) { - SAY("ERROR: failed to set SAA register 0x09 for input %i\n", - input); - } - SET(p, 0x0002, 0x0093); - break; -} -default: { - SAY("ERROR: bad input: %i\n", input); - return -1; -} -} -ir = read_stk(p, 0x00); -JOT(8, "STK register 0x00 has 0x%02X\n", ir); -ir = read_saa(p, 0x02); -JOT(8, "SAA register 0x02 has 0x%02X\n", ir); + ir = read_stk(p, 0x00); + JOT(8, "STK register 0x00 has 0x%02X\n", ir); + ir = read_saa(p, 0x02); + JOT(8, "SAA register 0x02 has 0x%02X\n", ir); -start_100(p); + start_100(p); -return 0; + return 0; } /****************************************************************************/ -int -set_resolution(struct usb_device *p, - u16 set0, u16 set1, u16 set2, u16 set3) +int set_resolution(struct usb_device *p, + u16 set0, u16 set1, u16 set2, u16 set3) { -u16 u0x0111, u0x0113, u0x0115, u0x0117; - -if (NULL == p) - return -ENODEV; -u0x0111 = ((0xFF00 & set0) >> 8); -u0x0113 = ((0xFF00 & set1) >> 8); -u0x0115 = ((0xFF00 & set2) >> 8); -u0x0117 = ((0xFF00 & set3) >> 8); - -SET(p, 0x0110, (0x00FF & set0)); -SET(p, 0x0111, u0x0111); -SET(p, 0x0112, (0x00FF & set1)); -SET(p, 0x0113, u0x0113); -SET(p, 0x0114, (0x00FF & set2)); -SET(p, 0x0115, u0x0115); -SET(p, 0x0116, (0x00FF & set3)); -SET(p, 0x0117, u0x0117); - -return 0; + u16 u0x0111, u0x0113, u0x0115, u0x0117; + + if (NULL == p) + return -ENODEV; + u0x0111 = ((0xFF00 & set0) >> 8); + u0x0113 = ((0xFF00 & set1) >> 8); + u0x0115 = ((0xFF00 & set2) >> 8); + u0x0117 = ((0xFF00 & set3) >> 8); + + SET(p, 0x0110, (0x00FF & set0)); + SET(p, 0x0111, u0x0111); + SET(p, 0x0112, (0x00FF & set1)); + SET(p, 0x0113, u0x0113); + SET(p, 0x0114, (0x00FF & set2)); + SET(p, 0x0115, u0x0115); + SET(p, 0x0116, (0x00FF & set3)); + SET(p, 0x0117, u0x0117); + + return 0; } /****************************************************************************/ -int -start_100(struct usb_device *p) +int start_100(struct usb_device *p) { -u16 get116, get117, get0; -u8 igot116, igot117, igot; - -if (NULL == p) - return -ENODEV; -GET(p, 0x0116, &igot116); -get116 = igot116; -GET(p, 0x0117, &igot117); -get117 = igot117; -SET(p, 0x0116, 0x0000); -SET(p, 0x0117, 0x0000); - -GET(p, 0x0100, &igot); -get0 = igot; -SET(p, 0x0100, (0x80 | get0)); - -SET(p, 0x0116, get116); -SET(p, 0x0117, get117); - -return 0; + u16 get116, get117, get0; + u8 igot116, igot117, igot; + + if (NULL == p) + return -ENODEV; + GET(p, 0x0116, &igot116); + get116 = igot116; + GET(p, 0x0117, &igot117); + get117 = igot117; + SET(p, 0x0116, 0x0000); + SET(p, 0x0117, 0x0000); + + GET(p, 0x0100, &igot); + get0 = igot; + SET(p, 0x0100, (0x80 | get0)); + + SET(p, 0x0116, get116); + SET(p, 0x0117, get117); + + return 0; } /****************************************************************************/ -int -stop_100(struct usb_device *p) +int stop_100(struct usb_device *p) { -u16 get0; -u8 igot; - -if (NULL == p) - return -ENODEV; -GET(p, 0x0100, &igot); -get0 = igot; -SET(p, 0x0100, (0x7F & get0)); -return 0; + u16 get0; + u8 igot; + + if (NULL == p) + return -ENODEV; + GET(p, 0x0100, &igot); + get0 = igot; + SET(p, 0x0100, (0x7F & get0)); + return 0; } /****************************************************************************/ /*--------------------------------------------------------------------------*/ @@ -959,57 +943,55 @@ return 0; * FUNCTION wait_i2c() RETURNS 0 ON SUCCESS */ /*--------------------------------------------------------------------------*/ -int -wait_i2c(struct usb_device *p) +int wait_i2c(struct usb_device *p) { -u16 get0; -u8 igot; -const int max = 2; -int k; - -if (NULL == p) - return -ENODEV; -for (k = 0; k < max; k++) { - GET(p, 0x0201, &igot); get0 = igot; - switch (get0) { - case 0x04: - case 0x01: { - return 0; - } - case 0x00: { - msleep(20); - continue; - } - default: { - return get0 - 1; - } + u16 get0; + u8 igot; + const int max = 2; + int k; + + if (NULL == p) + return -ENODEV; + for (k = 0; k < max; k++) { + GET(p, 0x0201, &igot); get0 = igot; + switch (get0) { + case 0x04: + case 0x01: { + return 0; + } + case 0x00: { + msleep(20); + continue; + } + default: { + return get0 - 1; + } + } } -} -return -1; + return -1; } /****************************************************************************/ /*****************************************************************************/ -int -wakeup_device(struct usb_device *pusb_device) +int wakeup_device(struct usb_device *pusb_device) { -if (!pusb_device) - return -ENODEV; -return usb_control_msg(pusb_device, usb_sndctrlpipe(pusb_device, 0), - (u8)USB_REQ_SET_FEATURE, - (u8)(USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE), - USB_DEVICE_REMOTE_WAKEUP, - (u16)0, - (void *) NULL, - (u16)0, - (int)50000); + if (!pusb_device) + return -ENODEV; + return usb_control_msg(pusb_device, usb_sndctrlpipe(pusb_device, 0), + (u8)USB_REQ_SET_FEATURE, + USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE, + USB_DEVICE_REMOTE_WAKEUP, + (u16)0, + (void *) NULL, + (u16)0, + (int)50000); } /*****************************************************************************/ int audio_setup(struct easycap *peasycap) { -struct usb_device *pusb_device; -unsigned char buffer[1]; -int rc, id1, id2; + struct usb_device *pusb_device; + unsigned char buffer[1]; + int rc, id1, id2; /*---------------------------------------------------------------------------*/ /* * IMPORTANT: @@ -1018,53 +1000,54 @@ int rc, id1, id2; * TO ENABLE AUDIO THE VALUE 0x0200 MUST BE SENT. */ /*---------------------------------------------------------------------------*/ -const u8 request = 0x01; -const u8 requesttype = - (u8)(USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE); -const u16 value_unmute = 0x0200; -const u16 index = 0x0301; -const u16 length = 1; - -if (NULL == peasycap) - return -EFAULT; - -pusb_device = peasycap->pusb_device; -if (NULL == pusb_device) - return -ENODEV; - -JOM(8, "%02X %02X %02X %02X %02X %02X %02X %02X\n", - requesttype, request, - (0x00FF & value_unmute), - (0xFF00 & value_unmute) >> 8, - (0x00FF & index), - (0xFF00 & index) >> 8, - (0x00FF & length), - (0xFF00 & length) >> 8); - -buffer[0] = 0x01; - -rc = usb_control_msg(pusb_device, usb_sndctrlpipe(pusb_device, 0), - (u8)request, - (u8)requesttype, - (u16)value_unmute, - (u16)index, - (void *)&buffer[0], - (u16)length, - (int)50000); + const u8 request = 0x01; + const u8 requesttype = USB_DIR_OUT | + USB_TYPE_CLASS | + USB_RECIP_INTERFACE; + const u16 value_unmute = 0x0200; + const u16 index = 0x0301; + const u16 length = 1; + + if (NULL == peasycap) + return -EFAULT; + + pusb_device = peasycap->pusb_device; + if (NULL == pusb_device) + return -ENODEV; -JOT(8, "0x%02X=buffer\n", *((u8 *) &buffer[0])); -if (rc != (int)length) { - switch (rc) { - case -EPIPE: { - SAY("usb_control_msg returned -EPIPE\n"); - break; - } - default: { - SAY("ERROR: usb_control_msg returned %i\n", rc); - break; - } + JOM(8, "%02X %02X %02X %02X %02X %02X %02X %02X\n", + requesttype, request, + (0x00FF & value_unmute), + (0xFF00 & value_unmute) >> 8, + (0x00FF & index), + (0xFF00 & index) >> 8, + (0x00FF & length), + (0xFF00 & length) >> 8); + + buffer[0] = 0x01; + + rc = usb_control_msg(pusb_device, usb_sndctrlpipe(pusb_device, 0), + (u8)request, + (u8)requesttype, + (u16)value_unmute, + (u16)index, + (void *)&buffer[0], + (u16)length, + (int)50000); + + JOT(8, "0x%02X=buffer\n", *((u8 *) &buffer[0])); + if (rc != (int)length) { + switch (rc) { + case -EPIPE: { + SAY("usb_control_msg returned -EPIPE\n"); + break; + } + default: { + SAY("ERROR: usb_control_msg returned %i\n", rc); + break; + } + } } -} /*--------------------------------------------------------------------------*/ /* * REGISTER 500: SETTING VALUE TO 0x0094 RESETS AUDIO CONFIGURATION ??? @@ -1080,80 +1063,79 @@ if (rc != (int)length) { * THE UPPER BYTE SEEMS TO HAVE NO EFFECT. */ /*--------------------------------------------------------------------------*/ -SET(pusb_device, 0x0500, 0x0094); -SET(pusb_device, 0x0500, 0x008C); -SET(pusb_device, 0x0506, 0x0001); -SET(pusb_device, 0x0507, 0x0000); -id1 = read_vt(pusb_device, 0x007C); -id2 = read_vt(pusb_device, 0x007E); -SAM("0x%04X:0x%04X is audio vendor id\n", id1, id2); + SET(pusb_device, 0x0500, 0x0094); + SET(pusb_device, 0x0500, 0x008C); + SET(pusb_device, 0x0506, 0x0001); + SET(pusb_device, 0x0507, 0x0000); + id1 = read_vt(pusb_device, 0x007C); + id2 = read_vt(pusb_device, 0x007E); + SAM("0x%04X:0x%04X is audio vendor id\n", id1, id2); /*---------------------------------------------------------------------------*/ /* * SELECT AUDIO SOURCE "LINE IN" AND SET THE AUDIO GAIN. */ /*---------------------------------------------------------------------------*/ -if (0 != audio_gainset(pusb_device, peasycap->gain)) - SAY("ERROR: audio_gainset() failed\n"); -check_vt(pusb_device); -return 0; + if (0 != audio_gainset(pusb_device, peasycap->gain)) + SAY("ERROR: audio_gainset() failed\n"); + check_vt(pusb_device); + return 0; } /*****************************************************************************/ -int -check_vt(struct usb_device *pusb_device) +int check_vt(struct usb_device *pusb_device) { -int igot; - -if (!pusb_device) - return -ENODEV; -igot = read_vt(pusb_device, 0x0002); -if (0 > igot) - SAY("ERROR: failed to read VT1612A register 0x02\n"); -if (0x8000 & igot) - SAY("register 0x%02X muted\n", 0x02); - -igot = read_vt(pusb_device, 0x000E); -if (0 > igot) - SAY("ERROR: failed to read VT1612A register 0x0E\n"); -if (0x8000 & igot) - SAY("register 0x%02X muted\n", 0x0E); - -igot = read_vt(pusb_device, 0x0010); -if (0 > igot) - SAY("ERROR: failed to read VT1612A register 0x10\n"); -if (0x8000 & igot) - SAY("register 0x%02X muted\n", 0x10); - -igot = read_vt(pusb_device, 0x0012); -if (0 > igot) - SAY("ERROR: failed to read VT1612A register 0x12\n"); -if (0x8000 & igot) - SAY("register 0x%02X muted\n", 0x12); - -igot = read_vt(pusb_device, 0x0014); -if (0 > igot) - SAY("ERROR: failed to read VT1612A register 0x14\n"); -if (0x8000 & igot) - SAY("register 0x%02X muted\n", 0x14); - -igot = read_vt(pusb_device, 0x0016); -if (0 > igot) - SAY("ERROR: failed to read VT1612A register 0x16\n"); -if (0x8000 & igot) - SAY("register 0x%02X muted\n", 0x16); - -igot = read_vt(pusb_device, 0x0018); -if (0 > igot) - SAY("ERROR: failed to read VT1612A register 0x18\n"); -if (0x8000 & igot) - SAY("register 0x%02X muted\n", 0x18); - -igot = read_vt(pusb_device, 0x001C); -if (0 > igot) - SAY("ERROR: failed to read VT1612A register 0x1C\n"); -if (0x8000 & igot) - SAY("register 0x%02X muted\n", 0x1C); - -return 0; + int igot; + + if (!pusb_device) + return -ENODEV; + igot = read_vt(pusb_device, 0x0002); + if (0 > igot) + SAY("ERROR: failed to read VT1612A register 0x02\n"); + if (0x8000 & igot) + SAY("register 0x%02X muted\n", 0x02); + + igot = read_vt(pusb_device, 0x000E); + if (0 > igot) + SAY("ERROR: failed to read VT1612A register 0x0E\n"); + if (0x8000 & igot) + SAY("register 0x%02X muted\n", 0x0E); + + igot = read_vt(pusb_device, 0x0010); + if (0 > igot) + SAY("ERROR: failed to read VT1612A register 0x10\n"); + if (0x8000 & igot) + SAY("register 0x%02X muted\n", 0x10); + + igot = read_vt(pusb_device, 0x0012); + if (0 > igot) + SAY("ERROR: failed to read VT1612A register 0x12\n"); + if (0x8000 & igot) + SAY("register 0x%02X muted\n", 0x12); + + igot = read_vt(pusb_device, 0x0014); + if (0 > igot) + SAY("ERROR: failed to read VT1612A register 0x14\n"); + if (0x8000 & igot) + SAY("register 0x%02X muted\n", 0x14); + + igot = read_vt(pusb_device, 0x0016); + if (0 > igot) + SAY("ERROR: failed to read VT1612A register 0x16\n"); + if (0x8000 & igot) + SAY("register 0x%02X muted\n", 0x16); + + igot = read_vt(pusb_device, 0x0018); + if (0 > igot) + SAY("ERROR: failed to read VT1612A register 0x18\n"); + if (0x8000 & igot) + SAY("register 0x%02X muted\n", 0x18); + + igot = read_vt(pusb_device, 0x001C); + if (0 > igot) + SAY("ERROR: failed to read VT1612A register 0x1C\n"); + if (0x8000 & igot) + SAY("register 0x%02X muted\n", 0x1C); + + return 0; } /*****************************************************************************/ /*---------------------------------------------------------------------------*/ @@ -1170,85 +1152,83 @@ return 0; * 31 12.0 22.5 34.5 */ /*---------------------------------------------------------------------------*/ -int -audio_gainset(struct usb_device *pusb_device, s8 loud) +int audio_gainset(struct usb_device *pusb_device, s8 loud) { -int igot; -u8 tmp; -u16 mute; - -if (NULL == pusb_device) - return -ENODEV; -if (0 > loud) - loud = 0; -if (31 < loud) - loud = 31; - -write_vt(pusb_device, 0x0002, 0x8000); + int igot; + u8 tmp; + u16 mute; + + if (NULL == pusb_device) + return -ENODEV; + if (0 > loud) + loud = 0; + if (31 < loud) + loud = 31; + + write_vt(pusb_device, 0x0002, 0x8000); /*---------------------------------------------------------------------------*/ -igot = read_vt(pusb_device, 0x000E); -if (0 > igot) { - SAY("ERROR: failed to read VT1612A register 0x0E\n"); - mute = 0x0000; -} else - mute = 0x8000 & ((unsigned int)igot); -mute = 0; - -if (16 > loud) - tmp = 0x01 | (0x001F & (((u8)(15 - loud)) << 1)); -else - tmp = 0; - -JOT(8, "0x%04X=(mute|tmp) for VT1612A register 0x0E\n", mute | tmp); -write_vt(pusb_device, 0x000E, (mute | tmp)); + igot = read_vt(pusb_device, 0x000E); + if (0 > igot) { + SAY("ERROR: failed to read VT1612A register 0x0E\n"); + mute = 0x0000; + } else + mute = 0x8000 & ((unsigned int)igot); + mute = 0; + + if (16 > loud) + tmp = 0x01 | (0x001F & (((u8)(15 - loud)) << 1)); + else + tmp = 0; + + JOT(8, "0x%04X=(mute|tmp) for VT1612A register 0x0E\n", mute | tmp); + write_vt(pusb_device, 0x000E, (mute | tmp)); /*---------------------------------------------------------------------------*/ -igot = read_vt(pusb_device, 0x0010); -if (0 > igot) { - SAY("ERROR: failed to read VT1612A register 0x10\n"); - mute = 0x0000; -} else - mute = 0x8000 & ((unsigned int)igot); -mute = 0; - -JOT(8, "0x%04X=(mute|tmp|(tmp<<8)) for VT1612A register 0x10,...0x18\n", + igot = read_vt(pusb_device, 0x0010); + if (0 > igot) { + SAY("ERROR: failed to read VT1612A register 0x10\n"); + mute = 0x0000; + } else + mute = 0x8000 & ((unsigned int)igot); + mute = 0; + + JOT(8, "0x%04X=(mute|tmp|(tmp<<8)) for VT1612A register 0x10,...0x18\n", mute | tmp | (tmp << 8)); -write_vt(pusb_device, 0x0010, (mute | tmp | (tmp << 8))); -write_vt(pusb_device, 0x0012, (mute | tmp | (tmp << 8))); -write_vt(pusb_device, 0x0014, (mute | tmp | (tmp << 8))); -write_vt(pusb_device, 0x0016, (mute | tmp | (tmp << 8))); -write_vt(pusb_device, 0x0018, (mute | tmp | (tmp << 8))); + write_vt(pusb_device, 0x0010, (mute | tmp | (tmp << 8))); + write_vt(pusb_device, 0x0012, (mute | tmp | (tmp << 8))); + write_vt(pusb_device, 0x0014, (mute | tmp | (tmp << 8))); + write_vt(pusb_device, 0x0016, (mute | tmp | (tmp << 8))); + write_vt(pusb_device, 0x0018, (mute | tmp | (tmp << 8))); /*---------------------------------------------------------------------------*/ -igot = read_vt(pusb_device, 0x001C); -if (0 > igot) { - SAY("ERROR: failed to read VT1612A register 0x1C\n"); - mute = 0x0000; -} else - mute = 0x8000 & ((unsigned int)igot); -mute = 0; - -if (16 <= loud) - tmp = 0x000F & (u8)(loud - 16); -else - tmp = 0; - -JOT(8, "0x%04X=(mute|tmp|(tmp<<8)) for VT1612A register 0x1C\n", - mute | tmp | (tmp << 8)); -write_vt(pusb_device, 0x001C, (mute | tmp | (tmp << 8))); -write_vt(pusb_device, 0x001A, 0x0404); -write_vt(pusb_device, 0x0002, 0x0000); -return 0; + igot = read_vt(pusb_device, 0x001C); + if (0 > igot) { + SAY("ERROR: failed to read VT1612A register 0x1C\n"); + mute = 0x0000; + } else + mute = 0x8000 & ((unsigned int)igot); + mute = 0; + + if (16 <= loud) + tmp = 0x000F & (u8)(loud - 16); + else + tmp = 0; + + JOT(8, "0x%04X=(mute|tmp|(tmp<<8)) for VT1612A register 0x1C\n", + mute | tmp | (tmp << 8)); + write_vt(pusb_device, 0x001C, (mute | tmp | (tmp << 8))); + write_vt(pusb_device, 0x001A, 0x0404); + write_vt(pusb_device, 0x0002, 0x0000); + return 0; } /*****************************************************************************/ -int -audio_gainget(struct usb_device *pusb_device) +int audio_gainget(struct usb_device *pusb_device) { -int igot; - -if (NULL == pusb_device) - return -ENODEV; -igot = read_vt(pusb_device, 0x001C); -if (0 > igot) - SAY("ERROR: failed to read VT1612A register 0x1C\n"); -return igot; + int igot; + + if (NULL == pusb_device) + return -ENODEV; + igot = read_vt(pusb_device, 0x001C); + if (0 > igot) + SAY("ERROR: failed to read VT1612A register 0x1C\n"); + return igot; } /*****************************************************************************/ -- 1.7.4.1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel