From owner-freebsd-bugs@FreeBSD.ORG Wed Jan 5 00:20:25 2005 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id D5A6F16A4CF for ; Wed, 5 Jan 2005 00:20:25 +0000 (GMT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 89B1443D39 for ; Wed, 5 Jan 2005 00:20:25 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.1/8.13.1) with ESMTP id j050KP1g012464 for ; Wed, 5 Jan 2005 00:20:25 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.1/8.13.1/Submit) id j050KPg9012463; Wed, 5 Jan 2005 00:20:25 GMT (envelope-from gnats) Resent-Date: Wed, 5 Jan 2005 00:20:25 GMT Resent-Message-Id: <200501050020.j050KPg9012463@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id DC9DD16A4CE for ; Wed, 5 Jan 2005 00:11:15 +0000 (GMT) Received: from slash.euronet.nl (slash.euronet.nl [194.134.32.242]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1151843D39 for ; Wed, 5 Jan 2005 00:11:15 +0000 (GMT) (envelope-from branko@euro.net) Received: by slash.euronet.nl (Postfix, from userid 1001) id 5673ED91C; Wed, 5 Jan 2005 01:11:13 +0100 (MET) Message-Id: <20050105001113.5673ED91C@slash.euronet.nl> Date: Wed, 5 Jan 2005 01:11:13 +0100 (MET) From: To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: kern/75831: [bktr] [patch] incorrect autodetection of Pinnacle cards X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: branko@euro.net List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Jan 2005 00:20:25 -0000 >Number: 75831 >Category: kern >Synopsis: [bktr] [patch] incorrect autodetection of Pinnacle cards >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed Jan 05 00:20:25 GMT 2005 >Closed-Date: >Last-Modified: >Originator: Branko Lankester >Release: FreeBSD 5.3-STABLE i386 >Organization: >Environment: Described in message sent to freebsd-stable mailing list: From: Michael Nottebrock To: stable@freebsd.org Date: Sun, 2 Jan 2005 12:18:55 +0100 Message-Id: <200501021219.00028.michaelnottebrock@gmx.net> Subject: bktr now broken for me System: slash.euronet.nl 4.10-STABLE FreeBSD 4.10-STABLE #3: Tue Oct 5 18:59:20 CEST 2004 branko@snatch.wanadoo.nl:/d0/obj/d0/src/sys/SLASH i386 >Description: Pinnacle cards without MT2032 tuner are autodetected as PCTV Rave >How-To-Repeat: >Fix: The following patch detects the MT2032 tuner by reading its registers instead of looking at the PCI ID. --- pctv_rave_53.diff begins here --- diff -c /home/branko/bktr-org/bktr_card.c ./bktr_card.c *** /home/branko/bktr-org/bktr_card.c Fri Dec 31 09:33:52 2004 --- ./bktr_card.c Tue Jan 4 17:47:08 2005 *************** *** 727,747 **** goto checkTuner; } - if (subsystem_vendor_id == PCI_VENDOR_PINNACLE_NEW) { - bktr->card = cards[ (card = CARD_PINNACLE_PCTV_RAVE) ]; - bktr->card.eepromAddr = eeprom_i2c_address; - bktr->card.eepromSize = (u_char)(256 / EEPROMBLOCKSIZE); - - TDA9887_init(bktr, 0); - - /* look for a tuner */ - tuner_i2c_address = locate_tuner_address( bktr ); - printf( "%s: tuner @ %#x\n", bktr_name(bktr), tuner_i2c_address ); - select_tuner( bktr, TUNER_MT2032 ); - - goto checkDBX; - } - /* Vendor is unknown. We will use the standard probe code */ /* which may not give best results */ printf("%s: Warning - card vendor 0x%04x (model 0x%04x) unknown.\n", --- 727,732 ---- *************** *** 871,876 **** --- 856,867 ---- checkTuner: + + if (card == CARD_MIRO && mt2032_init(bktr) == 0) { + bktr->card = cards[ (card = CARD_PINNACLE_PCTV_RAVE) ]; + select_tuner( bktr, TUNER_MT2032 ); + goto checkDBX; + } /* look for a tuner */ tuner_i2c_address = locate_tuner_address( bktr ); diff -c /home/branko/bktr-org/bktr_tuner.c ./bktr_tuner.c *** /home/branko/bktr-org/bktr_tuner.c Fri Dec 31 09:33:52 2004 --- ./bktr_tuner.c Tue Jan 4 21:38:27 2005 *************** *** 137,143 **** static void mt2032_set_tv_freq(bktr_ptr_t bktr, unsigned int freq); - static int mt2032_init(bktr_ptr_t bktr); static const struct TUNER tuners[] = { --- 137,142 ---- *************** *** 726,734 **** } else { bktr->card.tuner = NULL; } - if (tuner_type == TUNER_MT2032) { - mt2032_init(bktr); - } } /* --- 725,730 ---- *************** *** 1044,1072 **** #define TDA9887_ADDR 0x86 ! int TDA9887_init(bktr_ptr_t bktr, int output2_enable) { u_char addr = TDA9887_ADDR; - #if 0 - char buf[8]; ! /* NOTE: these are PAL values */ ! buf[0] = 0; /* sub address */ ! buf[1] = 0x50; /* output port1 inactive */ ! buf[2] = 0x6e; /* tuner takeover point / de-emphasis */ ! buf[3] = 0x09; /* fVIF = 38.9 MHz, fFM = 5.5 MHz */ ! ! if (!output2_enable) ! buf[1] |= 0x80; ! if (i2cWriteBuf(bktr, addr, 4, buf) == -1) { ! printf("%s: TDA9887 write failed\n", bktr_name(bktr)); ! return -1; ! } #else - i2cWrite(bktr, addr, 0, output2_enable ? 0x50 : 0xd0); - i2cWrite(bktr, addr, 1, 0x6e); i2cWrite(bktr, addr, 2, 0x09); #endif return 0; --- 1040,1057 ---- #define TDA9887_ADDR 0x86 ! static int TDA9887_init(bktr_ptr_t bktr, int output2_enable) { u_char addr = TDA9887_ADDR; ! i2cWrite(bktr, addr, 0, output2_enable ? 0x50 : 0xd0); ! i2cWrite(bktr, addr, 1, 0x6e); /* takeover point / de-emphasis */ ! /* PAL BG: 0x09 PAL I: 0x0a NTSC: 0x04 */ ! #ifdef MT2032_NTSC ! i2cWrite(bktr, addr, 2, 0x04); #else i2cWrite(bktr, addr, 2, 0x09); #endif return 0; *************** *** 1086,1104 **** #define MT2032_ADDR (bktr->card.tuner_pllAddr) #endif ! static u_char _MT2032_GetRegister(bktr_ptr_t bktr, u_char regNum) { int ch; if (i2cWrite(bktr, MT2032_ADDR, regNum, -1) == -1) { ! printf("%s: MT2032 write failed (i2c addr %#x)\n", ! bktr_name(bktr), MT2032_ADDR); } if ((ch = i2cRead(bktr, MT2032_ADDR + 1)) == -1) { ! printf("%s: MT2032 get register %d failed\n", ! bktr_name(bktr), regNum); ! return 0; } return ch; } --- 1071,1092 ---- #define MT2032_ADDR (bktr->card.tuner_pllAddr) #endif ! static int _MT2032_GetRegister(bktr_ptr_t bktr, u_char regNum) { int ch; if (i2cWrite(bktr, MT2032_ADDR, regNum, -1) == -1) { ! if (bootverbose) ! printf("%s: MT2032 write failed (i2c addr %#x)\n", ! bktr_name(bktr), MT2032_ADDR); ! return -1; } if ((ch = i2cRead(bktr, MT2032_ADDR + 1)) == -1) { ! if (bootverbose) ! printf("%s: MT2032 get register %d failed\n", ! bktr_name(bktr), regNum); ! return -1; } return ch; } *************** *** 1113,1133 **** #define MT2032_SetRegister(r,d) _MT2032_SetRegister(bktr,r,d) ! static int mt2032_init(bktr_ptr_t bktr) { u_char rdbuf[22]; int xogc, xok = 0; int i; TDA9887_init(bktr, 0); ! for (i = 0; i < 21; i++) ! rdbuf[i] = MT2032_GetRegister(i); printf("%s: MT2032: Companycode=%02x%02x Part=%02x Revision=%02x\n", bktr_name(bktr), rdbuf[0x11], rdbuf[0x12], rdbuf[0x13], rdbuf[0x14]); /* Initialize Registers per spec. */ MT2032_SetRegister(2, 0xff); --- 1101,1131 ---- #define MT2032_SetRegister(r,d) _MT2032_SetRegister(bktr,r,d) ! int mt2032_init(bktr_ptr_t bktr) { u_char rdbuf[22]; int xogc, xok = 0; int i; + int x; TDA9887_init(bktr, 0); ! for (i = 0; i < 21; i++) { ! if ((x = MT2032_GetRegister(i)) == -1) ! break; ! rdbuf[i] = x; ! } ! if (i < 21) ! return -1; printf("%s: MT2032: Companycode=%02x%02x Part=%02x Revision=%02x\n", bktr_name(bktr), rdbuf[0x11], rdbuf[0x12], rdbuf[0x13], rdbuf[0x14]); + if (rdbuf[0x13] != 4) { + printf("%s: MT2032 not found or unknown type\n", bktr_name(bktr)); + return -1; + } /* Initialize Registers per spec. */ MT2032_SetRegister(2, 0xff); *************** *** 1355,1364 **** TDA9887_init(bktr, 0); - printf("%s: MT2032-SetIFFreq: 0x%02X%02X%02X%02X...\n", - bktr_name(bktr), - buf[0x00], buf[0x01], buf[0x02], buf[0x03]); - /* send only the relevant registers per Rev. 1.2 */ MT2032_SetRegister(0, buf[0x00]); MT2032_SetRegister(1, buf[0x01]); --- 1353,1358 ---- *************** *** 1399,1410 **** mt2032_set_tv_freq(bktr_ptr_t bktr, unsigned int freq) { int if2,from,to; from=32900*1000; to=39900*1000; if2=38900*1000; ! printf("%s: setting frequency to %d\n", bktr_name(bktr), freq*62500); ! MT2032_SetIFFreq(bktr, freq*62500 /* freq*1000*1000/16 */, ! 1090*1000*1000, if2, from, to); } --- 1393,1417 ---- mt2032_set_tv_freq(bktr_ptr_t bktr, unsigned int freq) { int if2,from,to; + int stat, tad; + #ifdef MT2032_NTSC + from=40750*1000; + to=46750*1000; + if2=45750*1000; + #else from=32900*1000; to=39900*1000; if2=38900*1000; + #endif ! if (MT2032_SetIFFreq(bktr, freq*62500 /* freq*1000*1000/16 */, ! 1090*1000*1000, if2, from, to) == 0) { ! bktr->tuner.frequency = freq; ! stat = MT2032_GetRegister(0x0e); ! tad = MT2032_GetRegister(0x0f); ! if (bootverbose) ! printf("%s: frequency set to %d, st = %#x, tad = %#x\n", ! bktr_name(bktr), freq*62500, stat, tad); ! } } diff -c /home/branko/bktr-org/bktr_tuner.h ./bktr_tuner.h *** /home/branko/bktr-org/bktr_tuner.h Fri Dec 31 09:33:52 2004 --- ./bktr_tuner.h Tue Jan 4 17:47:08 2005 *************** *** 92,98 **** int do_afc( bktr_ptr_t bktr, int addr, int frequency ); #endif /* TUNER_AFC */ ! int TDA9887_init(bktr_ptr_t bktr, int output2_enable); /* * This is for start-up convenience only, NOT mandatory. --- 92,98 ---- int do_afc( bktr_ptr_t bktr, int addr, int frequency ); #endif /* TUNER_AFC */ ! int mt2032_init(bktr_ptr_t bktr); /* * This is for start-up convenience only, NOT mandatory. --- pctv_rave_53.diff ends here --- >Release-Note: >Audit-Trail: >Unformatted: