From branko@euro.net  Wed Jan  5 00:11:16 2005
Return-Path: <branko@euro.net>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id DC9DD16A4CE
	for <FreeBSD-gnats-submit@freebsd.org>; 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 <FreeBSD-gnats-submit@freebsd.org>; 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: <branko@euro.net>
Reply-To: <branko@euro.net>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [bktr] [patch] incorrect autodetection of Pinnacle cards
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         75831
>Category:       kern
>Synopsis:       [bktr] [patch] incorrect autodetection of Pinnacle cards
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Jan 05 00:20:25 GMT 2005
>Closed-Date:    Sun Jan 23 07:13:35 GMT 2005
>Last-Modified:  Tue Jun 21 10:30:13 GMT 2005
>Originator:     Branko Lankester <branko@euro.net>
>Release:        FreeBSD 5.3-STABLE i386
>Organization:
>Environment:
	Described in message sent to freebsd-stable mailing list:
        
	From: Michael Nottebrock <michaelnottebrock@gmx.net>
	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:

From: Arne "Wrner" <arne_woerner@yahoo.com>
To: freebsd-gnats-submit@FreeBSD.org, branko@euro.net
Cc: Michael Nottebrock <michaelnottebrock@gmx.net>,
	Branko Lankester <branko@euro.net>,
	Julian Elischer <julian@elischer.org>
Subject: Re: kern/75831: [bktr] [patch] incorrect autodetection of Pinnacle cards
Date: Wed, 5 Jan 2005 12:43:09 -0800 (PST)

 I tested Brankos newest patch together with the suggested patch in
 kern/73324 (it detects the card automatically from the vendor_id;
 see appendix B) and it works fine for me with a PCTV Rave card
 with MT2032 tuner (see appendix A).
 
 I think, that should solve Michael's auto detection problem,
 too...  Auto detection is cooler than manually setting the tuner,
 I think, although manually setting the tuner is quite convinient,
 too.
 
 Thanks...
 
 -Arne
 
 appendix A: dmesg
 Jan  5 20:24:18 neo kernel: bktr1: <BrookTree 878> mem
 0xdfcfc000-0xdfcfcfff irq 10 at device 9.0 on pci0
 Jan  5 20:24:18 neo kernel: bktr1: [GIANT-LOCKED]
 Jan  5 20:24:18 neo kernel: bktr1: MT2032: Companycode=4d54
 Part=04 Revision=04
 Jan  5 20:24:18 neo kernel: bktr1: Pinnacle PCTV Rave, MT2032
 tuner.
 
 appendix B: modified kern/73324 patch
                 if (subsystem_vendor_id == PCI_VENDOR_PINNACLE_ALT
 ||
                     subsystem_vendor_id ==
 PCI_VENDOR_PINNACLE_NEW) {
                     bktr->card = cards[ (card = CARD_MIRO) ];
                     bktr->card.eepromAddr = eeprom_i2c_address;
                     bktr->card.eepromSize = (u_char)(256 /
 EEPROMBLOCKSIZE);
                     goto checkTuner;
                 }
 
 
 
 		
 __________________________________ 
 Do you Yahoo!? 
 Yahoo! Mail - 250MB free storage. Do more. Manage less. 
 http://info.mail.yahoo.com/mail_250

From: Julian Elischer <julian@elischer.org>
To: =?ISO-8859-1?Q?=22Arne_=5C=22W=F6rner=5C=22=22?= <arne_woerner@yahoo.com>
Cc: freebsd-gnats-submit@FreeBSD.org, branko@euro.net,
	Michael Nottebrock <michaelnottebrock@gmx.net>
Subject: Re: kern/75831: [bktr] [patch] incorrect autodetection of Pinnacle
 cards
Date: Wed, 05 Jan 2005 15:25:58 -0800

 Arne Wrner wrote:
 
 >I tested Brankos newest patch together with the suggested patch in
 >kern/73324 (it detects the card automatically from the vendor_id;
 >see appendix B) and it works fine for me with a PCTV Rave card
 >with MT2032 tuner (see appendix A).
 >
 >I think, that should solve Michael's auto detection problem,
 >too...  Auto detection is cooler than manually setting the tuner,
 >I think, although manually setting the tuner is quite convinient,
 >too.
 >
 >Thanks...
 >
 >-Arne
 >
 >appendix A: dmesg
 >Jan  5 20:24:18 neo kernel: bktr1: <BrookTree 878> mem
 >0xdfcfc000-0xdfcfcfff irq 10 at device 9.0 on pci0
 >Jan  5 20:24:18 neo kernel: bktr1: [GIANT-LOCKED]
 >Jan  5 20:24:18 neo kernel: bktr1: MT2032: Companycode=4d54
 >Part=04 Revision=04
 >Jan  5 20:24:18 neo kernel: bktr1: Pinnacle PCTV Rave, MT2032
 >tuner.
 >
 >appendix B: modified kern/73324 patch
 >                if (subsystem_vendor_id == PCI_VENDOR_PINNACLE_ALT
 >||
 >                    subsystem_vendor_id ==
 >PCI_VENDOR_PINNACLE_NEW) {
 >                    bktr->card = cards[ (card = CARD_MIRO) ];
 >                    bktr->card.eepromAddr = eeprom_i2c_address;
 >                    bktr->card.eepromSize = (u_char)(256 /
 >EEPROMBLOCKSIZE);
 >                    goto checkTuner;
 >                }
 >  
 >
 
 let me know when you have a patch that I should commit..
 In the meantime how about EVERYONE with a brooktree tuner check that this
 patch doesn't break them.
 
 >
 >
 >		
 >__________________________________ 
 >Do you Yahoo!? 
 >Yahoo! Mail - 250MB free storage. Do more. Manage less. 
 >http://info.mail.yahoo.com/mail_250
 >  
 >
 
State-Changed-From-To: open->closed 
State-Changed-By: julian 
State-Changed-When: Sun Jan 23 07:11:59 GMT 2005 
State-Changed-Why:  
patch applied 

http://www.freebsd.org/cgi/query-pr.cgi?pr=75831 

From: kernel <kernel@evids.net>
To: bug-followup@FreeBSD.org,  branko@euro.net
Cc:  
Subject: Re: kern/75831: [bktr] [patch] incorrect autodetection of Pinnacle
 cards
Date: Tue, 21 Jun 2005 12:31:30 +0200

 Hi,
 
 I got the same problem with your patch. I took the last bktr_card.c, 
 bktr_card.h, bktr_tuner.c and bktr_tuner.h from April 2005
 and I recompiled my kernel but it doesn't work.
 My dmesg is the following:
 
 bktr0: MT2032: Companycode=0404 Part=04 Revision=04
 bktr0: PLL didn't lock
 bktr0: PLL didn't lock
 bktr0: MT2032: Companycode=0404 Part=04 Revision=04
 bktr0: PLL didn't lock
 bktr0: PLL didn't lock
 bktr0: PLL didn't lock
 bktr0: PLL didn't lock
 bktr0: PLL didn't lock
 bktr0: PLL didn't lock
 bktr0: PLL didn't lock
 
 One week ago, my card was working and I was watching tv normally but for 
 a while, it
 doesn't work anymore.
 My sysctl parameters are the following:
 craterlake# sysctl hw.bt848
 hw.bt848.card: 1
 hw.bt848.tuner: 6
 hw.bt848.reverse_mute: -1
 hw.bt848.format: -1
 hw.bt848.slow_msp_audio: -1
 
 Furthermore, I've tried to put in my kernel configuration options 
 BKTR_OVERRIDE_TUNER=6
 like I saw in a mailing list but it doesn't work either...
 Please let me know what's wrong.
 Thank you in advance
 
 Florian
>Unformatted:
