/* tag: 'Radio' */ 
/* tag: 'Radio' */ 
void tveeprom_hauppauge_analog(struct i2c_client *c, struct tveeprom *tvee,                                unsigned char *eeprom_data){	/* ----------------------------------------------	** The hauppauge eeprom format is tagged	**	** if packet[0] == 0x84, then packet[0..1] == length	** else length = packet[0] & 3f;	** if packet[0] & f8 == f8, then EOD and packet[1] == checksum	**	** In our (ivtv) case we're interested in the following:	** tuner type:   tag [00].05 or [0a].01 (index into hauppauge_tuner)	** tuner fmts:   tag [00].04 or [0a].00 (bitmask index into hauppauge_tuner_fmt)	** radio:        tag [00].{last} or [0e].00  (bitmask.  bit2=FM)	** audio proc:   tag [02].01 or [05].00 (mask with 0x7f)	** decoder proc: tag [09].01)	** Fun info:	** model:      tag [00].07-08 or [06].00-01	** revision:   tag [00].09-0b or [06].04-06	** serial#:    tag [01].05-07 or [04].04-06	** # of inputs/outputs ???	*/	int i, j, len, done, beenhere, tag;        int tuner1 = 0, t_format1 = 0;	char *t_name1 = NULL;        const char *t_fmt_name1[8] = { " none", "", "", "", "", "", "", "" };        int tuner2 = 0, t_format2 = 0;	char *t_name2 = NULL;        const char *t_fmt_name2[8] = { " none", "", "", "", "", "", "", "" };        memset(tvee, 0, sizeof(*tvee));	done = len = beenhere = 0;	for (i = 0; !done && i < 256; i += len) {		if (eeprom_data[i] == 0x84) {			len = eeprom_data[i + 1] + (eeprom_data[i + 2] << 8);			i += 3;		} else if ((eeprom_data[i] & 0xf0) == 0x70) {			if (eeprom_data[i] & 0x08) {				/* verify checksum! */				done = 1;				break;			}			len = eeprom_data[i] & 0x07;			++i;		} else {			tveeprom_warn("Encountered bad packet header [%02x]. "				   "Corrupt or not a Hauppauge eeprom.\n", eeprom_data[i]);			return;		}                if (debug) {                        tveeprom_info("Tag [%02x] + %d bytes:", eeprom_data[i], len - 1);                        for(j = 1; j < len; j++) {                                printk(" %02x", eeprom_data[i + j]);                        }                        printk("\n");                }		/* process by tag */		tag = eeprom_data[i];		switch (tag) {		case 0x00:                        /* tag: 'Comprehensive' */			tuner1 = eeprom_data[i+6];			t_format1 = eeprom_data[i+5];			tvee->has_radio = eeprom_data[i+len-1];                        /* old style tag, don't know how to detect                           IR presence, mark as unknown. */			tvee->has_ir = 2;			tvee->model =				eeprom_data[i+8] +				(eeprom_data[i+9] << 8);			tvee->revision = eeprom_data[i+10] +				(eeprom_data[i+11] << 8) +				(eeprom_data[i+12] << 16);			break;		case 0x01:                        /* tag: 'SerialID' */			tvee->serial_number =				eeprom_data[i+6] +				(eeprom_data[i+7] << 8) +				(eeprom_data[i+8] << 16);			break;		case 0x02:                        /* tag 'AudioInfo'                           Note mask with 0x7F, high bit used on some older models                           to indicate 4052 mux was removed in favor of using MSP                           inputs directly. */			tvee->audio_processor = eeprom_data[i+2] & 0x7f;			break;                /* case 0x03: tag 'EEInfo' */		case 0x04:                        /* tag 'SerialID2' */			tvee->serial_number =				eeprom_data[i+5] +				(eeprom_data[i+6] << 8) +				(eeprom_data[i+7] << 16);			break;		case 0x05:                        /* tag 'Audio2'                           Note mask with 0x7F, high bit used on some older models                           to indicate 4052 mux was removed in favor of using MSP                           inputs directly. */			tvee->audio_processor = eeprom_data[i+1] & 0x7f;			break;		case 0x06:                        /* tag 'ModelRev' */			tvee->model =				eeprom_data[i+1] +				(eeprom_data[i+2] << 8);			tvee->revision = eeprom_data[i+5] +				(eeprom_data[i+6] << 8) +				(eeprom_data[i+7] << 16);			break;		case 0x07:                        /* tag 'Details': according to Hauppauge not interesting                           on any PCI-era or later boards. */			break;                /* there is no tag 0x08 defined */		case 0x09:                        /* tag 'Video' */			tvee->decoder_processor = eeprom_data[i + 1];			break;		case 0x0a:                        /* tag 'Tuner' */			if (beenhere == 0) {				tuner1 = eeprom_data[i+2];				t_format1 = eeprom_data[i+1];				beenhere = 1;			} else {                                /* a second (radio) tuner may be present */				tuner2 = eeprom_data[i+2];				t_format2 = eeprom_data[i+1];                                if (t_format2 == 0) {  /* not a TV tuner? */                                        tvee->has_radio = 1; /* must be radio */                                }                        }			break;                case 0x0b:                        /* tag 'Inputs': according to Hauppauge this is specific                           to each driver family, so no good assumptions can be                           made. */                        break;                /* case 0x0c: tag 'Balun' */                /* case 0x0d: tag 'Teletext' */		case 0x0e:                        /* tag: 'Radio' */			tvee->has_radio = eeprom_data[i+1];			break;                case 0x0f:                        /* tag 'IRInfo' */                        tvee->has_ir = eeprom_data[i+1];                        break;                /* case 0x10: tag 'VBIInfo' */                /* case 0x11: tag 'QCInfo' */                /* case 0x12: tag 'InfoBits' */		default:			tveeprom_dbg("Not sure what to do with tag [%02x]\n", tag);			/* dump the rest of the packet? */		}	}	if (!done) {		tveeprom_warn("Ran out of data!\n");		return;	}	if (tvee->revision != 0) {		tvee->rev_str[0] = 32 + ((tvee->revision >> 18) & 0x3f);		tvee->rev_str[1] = 32 + ((tvee->revision >> 12) & 0x3f);		tvee->rev_str[2] = 32 + ((tvee->revision >>  6) & 0x3f);		tvee->rev_str[3] = 32 + ( tvee->revision        & 0x3f);		tvee->rev_str[4] = 0;	}        if (hasRadioTuner(tuner1) && !tvee->has_radio) {	    tveeprom_info("The eeprom says no radio is present, but the tuner type\n");	    tveeprom_info("indicates otherwise. I will assume that radio is present.\n");            tvee->has_radio = 1;        }	if (tuner1 < sizeof(hauppauge_tuner)/sizeof(struct HAUPPAUGE_TUNER)) {		tvee->tuner_type = hauppauge_tuner[tuner1].id;		t_name1 = hauppauge_tuner[tuner1].name;	} else {		t_name1 = "unknown";	}	if (tuner2 < sizeof(hauppauge_tuner)/sizeof(struct HAUPPAUGE_TUNER)) {		tvee->tuner2_type = hauppauge_tuner[tuner2].id;		t_name2 = hauppauge_tuner[tuner2].name;	} else {		t_name2 = "unknown";	}	tvee->tuner_formats = 0;	tvee->tuner2_formats = 0;	for (i = j = 0; i < 8; i++) {		if (t_format1 & (1 << i)) {			tvee->tuner_formats |= hauppauge_tuner_fmt[i].id;			t_fmt_name1[j++] = hauppauge_tuner_fmt[i].name;		}                if (t_format2 & (1 << i)) {                        tvee->tuner2_formats |= hauppauge_tuner_fmt[i].id;                        t_fmt_name2[j++] = hauppauge_tuner_fmt[i].name;                }	}	tveeprom_info("Hauppauge model %d, rev %s, serial# %d\n",		   tvee->model, tvee->rev_str, tvee->serial_number);	tveeprom_info("tuner model is %s (idx %d, type %d)\n",		   t_name1, tuner1, tvee->tuner_type);	tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",		   t_fmt_name1[0], t_fmt_name1[1], t_fmt_name1[2], t_fmt_name1[3],		   t_fmt_name1[4], t_fmt_name1[5], t_fmt_name1[6], t_fmt_name1[7],                   t_format1);        if (tuner2) {                tveeprom_info("second tuner model is %s (idx %d, type %d)\n",                           t_name2, tuner2, tvee->tuner2_type);        }        if (t_format2) {                tveeprom_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",                           t_fmt_name2[0], t_fmt_name2[1], t_fmt_name2[2], t_fmt_name2[3],                           t_fmt_name2[4], t_fmt_name2[5], t_fmt_name2[6], t_fmt_name2[7],                           t_format2);        }	tveeprom_info("audio processor is %s (idx %d)\n",		   STRM(audioIC, tvee->audio_processor),		   tvee->audio_processor);        if (tvee->decoder_processor) {                tveeprom_info("decoder processor is %s (idx %d)\n",                           STRM(decoderIC, tvee->decoder_processor),                           tvee->decoder_processor);        }        if (tvee->has_ir == 2)                tveeprom_info("has %sradio\n",                                tvee->has_radio ? "" : "no ");        else                tveeprom_info("has %sradio, has %sIR remote\n",                                tvee->has_radio ? "" : "no ",                                tvee->has_ir ? "" : "no ");}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/90a7ed47a37297bee1f4ce11484190ccac29ae7c/tveeprom.c/buggy/drivers/media/video/tveeprom.c