/*
 * tveeprom - eeprom decoder for tvcard configuration eeproms
 *
 * Data and decoding routines shamelessly borrowed from bttv-cards.c
 * eeprom access routine shamelessly borrowed from bttv-if.c
 * which are:

    Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
			   & Marcus Metzler (mocm@thp.uni-koeln.de)
    (c) 1999-2001 Gerd Knorr <kraxel@goldbach.in-berlin.de>

 * Adjustments to fit a more general model and all bugs:

	Copyright (C) 2003 John Klar <linpvr at projectplasma.com>

 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */


#include <linux/module.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/videodev2.h>
#include <linux/i2c.h>

#include <media/tuner.h>
#include <media/tveeprom.h>
#include <media/v4l2-common.h>
#include <media/v4l2-chip-ident.h>

MODULE_DESCRIPTION("i2c Hauppauge eeprom decoder driver");
MODULE_AUTHOR("John Klar");
MODULE_LICENSE("GPL");

static int debug;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Debug level (0-1)");

#define STRM(array, i) \
	(i < sizeof(array) / sizeof(char *) ? array[i] : "unknown")

#define tveeprom_info(fmt, arg...) \
	v4l_printk(KERN_INFO, "tveeprom", c->adapter, c->addr, fmt , ## arg)
#define tveeprom_warn(fmt, arg...) \
	v4l_printk(KERN_WARNING, "tveeprom", c->adapter, c->addr, fmt , ## arg)
#define tveeprom_dbg(fmt, arg...) do { \
	if (debug) \
		v4l_printk(KERN_DEBUG, "tveeprom", \
				c->adapter, c->addr, fmt , ## arg); \
	} while (0)

/*
 * The Hauppauge eeprom uses an 8bit field to determine which
 * tuner formats the tuner supports.
 */
static struct HAUPPAUGE_TUNER_FMT
{
	int	id;
	char *name;
}
hauppauge_tuner_fmt[] =
{
	{ V4L2_STD_UNKNOWN,                   " UNKNOWN" },
	{ V4L2_STD_UNKNOWN,                   " FM" },
	{ V4L2_STD_B|V4L2_STD_GH,             " PAL(B/G)" },
	{ V4L2_STD_MN,                        " NTSC(M)" },
	{ V4L2_STD_PAL_I,                     " PAL(I)" },
	{ V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC, " SECAM(L/L')" },
	{ V4L2_STD_DK,                        " PAL(D/D1/K)" },
	{ V4L2_STD_ATSC,                      " ATSC/DVB Digital" },
};

/* This is the full list of possible tuners. Many thanks to Hauppauge for
   supplying this information. Note that many tuners where only used for
   testing and never made it to the outside world. So you will only see
   a subset in actual produced cards. */
static struct HAUPPAUGE_TUNER
{
	int  id;
	char *name;
}
hauppauge_tuner[] =
{
	/* 0-9 */
	{ TUNER_ABSENT,			"None" },
	{ TUNER_ABSENT,			"External" },
	{ TUNER_ABSENT,			"Unspecified" },
	{ TUNER_PHILIPS_PAL,		"Philips FI1216" },
	{ TUNER_PHILIPS_SECAM,		"Philips FI1216MF" },
	{ TUNER_PHILIPS_NTSC,		"Philips FI1236" },
	{ TUNER_PHILIPS_PAL_I,		"Philips FI1246" },
	{ TUNER_PHILIPS_PAL_DK,		"Philips FI1256" },
	{ TUNER_PHILIPS_PAL,		"Philips FI1216 MK2" },
	{ TUNER_PHILIPS_SECAM,		"Philips FI1216MF MK2" },
	/* 10-19 */
	{ TUNER_PHILIPS_NTSC,		"Philips FI1236 MK2" },
	{ TUNER_PHILIPS_PAL_I,		"Philips FI1246 MK2" },
	{ TUNER_PHILIPS_PAL_DK,		"Philips FI1256 MK2" },
	{ TUNER_TEMIC_NTSC,		"Temic 4032FY5" },
	{ TUNER_TEMIC_PAL,		"Temic 4002FH5" },
	{ TUNER_TEMIC_PAL_I,		"Temic 4062FY5" },
	{ TUNER_PHILIPS_PAL,		"Philips FR1216 MK2" },
	{ TUNER_PHILIPS_SECAM,		"Philips FR1216MF MK2" },
	{ TUNER_PHILIPS_NTSC,		"Philips FR1236 MK2" },
	{ TUNER_PHILIPS_PAL_I,		"Philips FR1246 MK2" },
	/* 20-29 */
	{ TUNER_PHILIPS_PAL_DK,		"Philips FR1256 MK2" },
	{ TUNER_PHILIPS_PAL,		"Philips FM1216" },
	{ TUNER_PHILIPS_SECAM,		"Philips FM1216MF" },
	{ TUNER_PHILIPS_NTSC,		"Philips FM1236" },
	{ TUNER_PHILIPS_PAL_I,		"Philips FM1246" },
	{ TUNER_PHILIPS_PAL_DK,		"Philips FM1256" },
	{ TUNER_TEMIC_4036FY5_NTSC,	"Temic 4036FY5" },
	{ TUNER_ABSENT,			"Samsung TCPN9082D" },
	{ TUNER_ABSENT,			"Samsung TCPM9092P" },
	{ TUNER_TEMIC_4006FH5_PAL,	"Temic 4006FH5" },
	/* 30-39 */
	{ TUNER_ABSENT,			"Samsung TCPN9085D" },
	{ TUNER_ABSENT,			"Samsung TCPB9085P" },
	{ TUNER_ABSENT,			"Samsung TCPL9091P" },
	{ TUNER_TEMIC_4039FR5_NTSC,	"Temic 4039FR5" },
	{ TUNER_PHILIPS_FQ1216ME,	"Philips FQ1216 ME" },
	{ TUNER_TEMIC_4066FY5_PAL_I,	"Temic 4066FY5" },
	{ TUNER_PHILIPS_NTSC,		"Philips TD1536" },
	{ TUNER_PHILIPS_NTSC,		"Philips TD1536D" },
	{ TUNER_PHILIPS_NTSC,		"Philips FMR1236" }, /* mono radio */
	{ TUNER_ABSENT,			"Philips FI1256MP" },
	/* 40-49 */
	{ TUNER_ABSENT,			"Samsung TCPQ9091P" },
	{ TUNER_TEMIC_4006FN5_MULTI_PAL,"Temic 4006FN5" },
	{ TUNER_TEMIC_4009FR5_PAL,	"Temic 4009FR5" },
	{ TUNER_TEMIC_4046FM5,		"Temic 4046FM5" },
	{ TUNER_TEMIC_4009FN5_MULTI_PAL_FM, "Temic 4009FN5" },
	{ TUNER_ABSENT,			"Philips TD1536D FH 44"},
	{ TUNER_LG_NTSC_FM,		"LG TP18NSR01F"},
	{ TUNER_LG_PAL_FM,		"LG TP18PSB01D"},
	{ TUNER_LG_PAL,		"LG TP18PSB11D"},
	{ TUNER_LG_PAL_I_FM,		"LG TAPC-I001D"},
	/* 50-59 */
	{ TUNER_LG_PAL_I,		"LG TAPC-I701D"},
	{ TUNER_ABSENT,			"Temic 4042FI5"},
	{ TUNER_MICROTUNE_4049FM5,	"Microtune 4049 FM5"},
	{ TUNER_ABSENT,			"LG TPI8NSR11F"},
	{ TUNER_ABSENT,			"Microtune 4049 FM5 Alt I2C"},
	{ TUNER_PHILIPS_FM1216ME_MK3,	"Philips FQ1216ME MK3"},
	{ TUNER_ABSENT,			"Philips FI1236 MK3"},
	{ TUNER_PHILIPS_FM1216ME_MK3,	"Philips FM1216 ME MK3"},
	{ TUNER_PHILIPS_FM1236_MK3,	"Philips FM1236 MK3"},
	{ TUNER_ABSENT,			"Philips FM1216MP MK3"},
	/* 60-69 */
	{ TUNER_PHILIPS_FM1216ME_MK3,	"LG S001D MK3"},
	{ TUNER_ABSENT,			"LG M001D MK3"},
	{ TUNER_PHILIPS_FM1216ME_MK3,	"LG S701D MK3"},
	{ TUNER_ABSENT,			"LG M701D MK3"},
	{ TUNER_ABSENT,			"Temic 4146FM5"},
	{ TUNER_ABSENT,			"Temic 4136FY5"},
	{ TUNER_ABSENT,			"Temic 4106FH5"},
	{ TUNER_ABSENT,			"Philips FQ1216LMP MK3"},
	{ TUNER_LG_NTSC_TAPE,		"LG TAPE H001F MK3"},
	{ TUNER_LG_NTSC_TAPE,		"LG TAPE H701F MK3"},
	/* 70-79 */
	{ TUNER_ABSENT,			"LG TALN H200T"},
	{ TUNER_ABSENT,			"LG TALN H250T"},
	{ TUNER_ABSENT,			"LG TALN M200T"},
	{ TUNER_ABSENT,			"LG TALN Z200T"},
	{ TUNER_ABSENT,			"LG TALN S200T"},
	{ TUNER_ABSENT,			"Thompson DTT7595"},
	{ TUNER_ABSENT,			"Thompson DTT7592"},
	{ TUNER_ABSENT,			"Silicon TDA8275C1 8290"},
	{ TUNER_ABSENT,			"Silicon TDA8275C1 8290 FM"},
	{ TUNER_ABSENT,			"Thompson DTT757"},
	/* 80-89 */
	{ TUNER_PHILIPS_FQ1216LME_MK3,	"Philips FQ1216LME MK3"},
	{ TUNER_LG_PAL_NEW_TAPC,	"LG TAPC G701D"},
	{ TUNER_LG_NTSC_NEW_TAPC,	"LG TAPC H791F"},
	{ TUNER_LG_PAL_NEW_TAPC,	"TCL 2002MB 3"},
	{ TUNER_LG_PAL_NEW_TAPC,	"TCL 2002MI 3"},
	{ TUNER_TCL_2002N,		"TCL 2002N 6A"},
	{ TUNER_PHILIPS_FM1236_MK3,	"Philips FQ1236 MK3"},
	{ TUNER_SAMSUNG_TCPN_2121P30A,	"Samsung TCPN 2121P30A"},
	{ TUNER_ABSENT,			"Samsung TCPE 4121P30A"},
	{ TUNER_PHILIPS_FM1216ME_MK3,	"TCL MFPE05 2"},
	/* 90-99 */
	{ TUNER_ABSENT,			"LG TALN H202T"},
	{ TUNER_PHILIPS_FQ1216AME_MK4,	"Philips FQ1216AME MK4"},
	{ TUNER_PHILIPS_FQ1236A_MK4,	"Philips FQ1236A MK4"},
	{ TUNER_ABSENT,			"Philips FQ1286A MK4"},
	{ TUNER_ABSENT,			"Philips FQ1216ME MK5"},
	{ TUNER_ABSENT,			"Philips FQ1236 MK5"},
	{ TUNER_SAMSUNG_TCPG_6121P30A,	"Samsung TCPG 6121P30A"},
	{ TUNER_TCL_2002MB,		"TCL 2002MB_3H"},
	{ TUNER_ABSENT,			"TCL 2002MI_3H"},
	{ TUNER_TCL_2002N,		"TCL 2002N 5H"},
	/* 100-109 */
	{ TUNER_PHILIPS_FMD1216ME_MK3,	"Philips FMD1216ME"},
	{ TUNER_TEA5767,		"Philips TEA5768HL FM Radio"},
	{ TUNER_ABSENT,			"Panasonic ENV57H12D5"},
	{ TUNER_PHILIPS_FM1236_MK3,	"TCL MFNM05-4"},
	{ TUNER_PHILIPS_FM1236_MK3,	"TCL MNM05-4"},
	{ TUNER_PHILIPS_FM1216ME_MK3,	"TCL MPE05-2"},
	{ TUNER_ABSENT,			"TCL MQNM05-4"},
	{ TUNER_ABSENT,			"LG TAPC-W701D"},
	{ TUNER_ABSENT,			"TCL 9886P-WM"},
	{ TUNER_ABSENT,			"TCL 1676NM-WM"},
	/* 110-119 */
	{ TUNER_ABSENT,			"Thompson DTT75105"},
	{ TUNER_ABSENT,			"Conexant_CX24109"},
	{ TUNER_TCL_2002N,		"TCL M2523_5N_E"},
	{ TUNER_TCL_2002MB,		"TCL M2523_3DB_E"},
	{ TUNER_ABSENT,			"Philips 8275A"},
	{ TUNER_ABSENT,			"Microtune MT2060"},
	{ TUNER_PHILIPS_FM1236_MK3,	"Philips FM1236 MK5"},
	{ TUNER_PHILIPS_FM1216ME_MK3,	"Philips FM1216ME MK5"},
	{ TUNER_ABSENT,			"TCL M2523_3DI_E"},
	{ TUNER_ABSENT,			"Samsung THPD5222FG30A"},
	/* 120-129 */
	{ TUNER_XC2028,			"Xceive XC3028"},
	{ TUNER_PHILIPS_FQ1216LME_MK3,	"Philips FQ1216LME MK5"},
	{ TUNER_ABSENT,			"Philips FQD1216LME"},
	{ TUNER_ABSENT,			"Conexant CX24118A"},
	{ TUNER_ABSENT,			"TCL DMF11WIP"},
	{ TUNER_ABSENT,			"TCL MFNM05_4H_E"},
	{ TUNER_ABSENT,			"TCL MNM05_4H_E"},
	{ TUNER_ABSENT,			"TCL MPE05_2H_E"},
	{ TUNER_ABSENT,			"TCL MQNM05_4_U"},
	{ TUNER_ABSENT,			"TCL M2523_5NH_E"},
	/* 130-139 */
	{ TUNER_ABSENT,			"TCL M2523_3DBH_E"},
	{ TUNER_ABSENT,			"TCL M2523_3DIH_E"},
	{ TUNER_ABSENT,			"TCL MFPE05_2_U"},
	{ TUNER_PHILIPS_FMD1216MEX_MK3,	"Philips FMD1216MEX"},
	{ TUNER_ABSENT,			"Philips FRH2036B"},
	{ TUNER_ABSENT,			"Panasonic ENGF75_01GF"},
	{ TUNER_ABSENT,			"MaxLinear MXL5005"},
	{ TUNER_ABSENT,			"MaxLinear MXL5003"},
	{ TUNER_ABSENT,			"Xceive XC2028"},
	{ TUNER_ABSENT,			"Microtune MT2131"},
	/* 140-149 */
	{ TUNER_ABSENT,			"Philips 8275A_8295"},
	{ TUNER_ABSENT,			"TCL MF02GIP_5N_E"},
	{ TUNER_ABSENT,			"TCL MF02GIP_3DB_E"},
	{ TUNER_ABSENT,			"TCL MF02GIP_3DI_E"},
	{ TUNER_ABSENT,			"Microtune MT2266"},
	{ TUNER_ABSENT,			"TCL MF10WPP_4N_E"},
	{ TUNER_ABSENT,			"LG TAPQ_H702F"},
	{ TUNER_ABSENT,			"TCL M09WPP_4N_E"},
	{ TUNER_ABSENT,			"MaxLinear MXL5005_v2"},
	{ TUNER_PHILIPS_TDA8290,	"Philips 18271_8295"},
	/* 150-159 */
	{ TUNER_XC5000,                 "Xceive XC5000"},
	{ TUNER_ABSENT,                 "Xceive XC3028L"},
	{ TUNER_ABSENT,                 "NXP 18271C2_716x"},
	{ TUNER_ABSENT,                 "Xceive XC4000"},
	{ TUNER_ABSENT,                 "Dibcom 7070"},
	{ TUNER_PHILIPS_TDA8290,        "NXP 18271C2"},
	{ TUNER_ABSENT,                 "Siano SMS1010"},
	{ TUNER_ABSENT,                 "Siano SMS1150"},
	{ TUNER_ABSENT,                 "MaxLinear 5007"},
	{ TUNER_ABSENT,                 "TCL M09WPP_2P_E"},
	/* 160-169 */
	{ TUNER_ABSENT,                 "Siano SMS1180"},
	{ TUNER_ABSENT,                 "Maxim_MAX2165"},
	{ TUNER_ABSENT,                 "Siano SMS1140"},
	{ TUNER_ABSENT,                 "Siano SMS1150 B1"},
	{ TUNER_ABSENT,                 "MaxLinear 111"},
	{ TUNER_ABSENT,                 "Dibcom 7770"},
	{ TUNER_ABSENT,                 "Siano SMS1180VNS"},
	{ TUNER_ABSENT,                 "Siano SMS1184"},
	{ TUNER_PHILIPS_FQ1236_MK5,	"TCL M30WTP-4N-E"},
	{ TUNER_ABSENT,                 "TCL_M11WPP_2PN_E"},
	/* 170-179 */
	{ TUNER_ABSENT,                 "MaxLinear 301"},
	{ TUNER_ABSENT,                 "Mirics MSi001"},
	{ TUNER_ABSENT,                 "MaxLinear MxL241SF"},
	{ TUNER_XC5000C,                "Xceive XC5000C"},
	{ TUNER_ABSENT,                 "Montage M68TS2020"},
	{ TUNER_ABSENT,                 "Siano SMS1530"},
	{ TUNER_ABSENT,                 "Dibcom 7090"},
	{ TUNER_ABSENT,                 "Xceive XC5200C"},
	{ TUNER_ABSENT,                 "NXP 18273"},
	{ TUNER_ABSENT,                 "Montage M88TS2022"},
	/* 180-189 */
	{ TUNER_ABSENT,                 "NXP 18272M"},
	{ TUNER_ABSENT,                 "NXP 18272S"},
};

/* Use V4L2_IDENT_AMBIGUOUS for those audio 'chips' that are
 * internal to a video chip, i.e. not a separate audio chip. */
static struct HAUPPAUGE_AUDIOIC
{
	u32   id;
	char *name;
}
audioIC[] =
{
	/* 0-4 */
	{ V4L2_IDENT_NONE,      "None"      },
	{ V4L2_IDENT_UNKNOWN,   "TEA6300"   },
	{ V4L2_IDENT_UNKNOWN,   "TEA6320"   },
	{ V4L2_IDENT_UNKNOWN,   "TDA9850"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP3400C"  },
	/* 5-9 */
	{ V4L2_IDENT_MSPX4XX,   "MSP3410D"  },
	{ V4L2_IDENT_MSPX4XX,   "MSP3415"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP3430"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP3438"   },
	{ V4L2_IDENT_UNKNOWN,   "CS5331"    },
	/* 10-14 */
	{ V4L2_IDENT_MSPX4XX,   "MSP3435"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP3440"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP3445"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP3411"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP3416"   },
	/* 15-19 */
	{ V4L2_IDENT_MSPX4XX,   "MSP3425"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP3451"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP3418"   },
	{ V4L2_IDENT_UNKNOWN,   "Type 0x12" },
	{ V4L2_IDENT_UNKNOWN,   "OKI7716"   },
	/* 20-24 */
	{ V4L2_IDENT_MSPX4XX,   "MSP4410"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP4420"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP4440"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP4450"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP4408"   },
	/* 25-29 */
	{ V4L2_IDENT_MSPX4XX,   "MSP4418"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP4428"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP4448"   },
	{ V4L2_IDENT_MSPX4XX,   "MSP4458"   },
	{ V4L2_IDENT_MSPX4XX,   "Type 0x1d" },
	/* 30-34 */
	{ V4L2_IDENT_AMBIGUOUS, "CX880"     },
	{ V4L2_IDENT_AMBIGUOUS, "CX881"     },
	{ V4L2_IDENT_AMBIGUOUS, "CX883"     },
	{ V4L2_IDENT_AMBIGUOUS, "CX882"     },
	{ V4L2_IDENT_AMBIGUOUS, "CX25840"   },
	/* 35-39 */
	{ V4L2_IDENT_AMBIGUOUS, "CX25841"   },
	{ V4L2_IDENT_AMBIGUOUS, "CX25842"   },
	{ V4L2_IDENT_AMBIGUOUS, "CX25843"   },
	{ V4L2_IDENT_AMBIGUOUS, "CX23418"   },
	{ V4L2_IDENT_AMBIGUOUS, "CX23885"   },
	/* 40-44 */
	{ V4L2_IDENT_AMBIGUOUS, "CX23888"   },
	{ V4L2_IDENT_AMBIGUOUS, "SAA7131"   },
	{ V4L2_IDENT_AMBIGUOUS, "CX23887"   },
	{ V4L2_IDENT_AMBIGUOUS, "SAA7164"   },
	{ V4L2_IDENT_AMBIGUOUS, "AU8522"    },
};

/* This list is supplied by Hauppauge. Thanks! */
static const char *decoderIC[] = {
	/* 0-4 */
	"None", "BT815", "BT817", "BT819", "BT815A",
	/* 5-9 */
	"BT817A", "BT819A", "BT827", "BT829", "BT848",
	/* 10-14 */
	"BT848A", "BT849A", "BT829A", "BT827A", "BT878",
	/* 15-19 */
	"BT879", "BT880", "VPX3226E", "SAA7114", "SAA7115",
	/* 20-24 */
	"CX880", "CX881", "CX883", "SAA7111", "SAA7113",
	/* 25-29 */
	"CX882", "TVP5150A", "CX25840", "CX25841", "CX25842",
	/* 30-34 */
	"CX25843", "CX23418", "NEC61153", "CX23885", "CX23888",
	/* 35-39 */
	"SAA7131", "CX25837", "CX23887", "CX23885A", "CX23887A",
	/* 40-42 */
	"SAA7164", "CX23885B", "AU8522"
};

static int hasRadioTuner(int tunerType)
{
	switch (tunerType) {
	case 18: /* PNPEnv_TUNER_FR1236_MK2 */
	case 23: /* PNPEnv_TUNER_FM1236 */
	case 38: /* PNPEnv_TUNER_FMR1236 */
	case 16: /* PNPEnv_TUNER_FR1216_MK2 */
	case 19: /* PNPEnv_TUNER_FR1246_MK2 */
	case 21: /* PNPEnv_TUNER_FM1216 */
	case 24: /* PNPEnv_TUNER_FM1246 */
	case 17: /* PNPEnv_TUNER_FR1216MF_MK2 */
	case 22: /* PNPEnv_TUNER_FM1216MF */
	case 20: /* PNPEnv_TUNER_FR1256_MK2 */
	case 25: /* PNPEnv_TUNER_FM1256 */
	case 33: /* PNPEnv_TUNER_4039FR5 */
	case 42: /* PNPEnv_TUNER_4009FR5 */
	case 52: /* PNPEnv_TUNER_4049FM5 */
	case 54: /* PNPEnv_TUNER_4049FM5_AltI2C */
	case 44: /* PNPEnv_TUNER_4009FN5 */
	case 31: /* PNPEnv_TUNER_TCPB9085P */
	case 30: /* PNPEnv_TUNER_TCPN9085D */
	case 46: /* PNPEnv_TUNER_TP18NSR01F */
	case 47: /* PNPEnv_TUNER_TP18PSB01D */
	case 49: /* PNPEnv_TUNER_TAPC_I001D */
	case 60: /* PNPEnv_TUNER_TAPE_S001D_MK3 */
	case 57: /* PNPEnv_TUNER_FM1216ME_MK3 */
	case 59: /* PNPEnv_TUNER_FM1216MP_MK3 */
	case 58: /* PNPEnv_TUNER_FM1236_MK3 */
	case 68: /* PNPEnv_TUNER_TAPE_H001F_MK3 */
	case 61: /* PNPEnv_TUNER_TAPE_M001D_MK3 */
	case 78: /* PNPEnv_TUNER_TDA8275C1_8290_FM */
	case 89: /* PNPEnv_TUNER_TCL_MFPE05_2 */
	case 92: /* PNPEnv_TUNER_PHILIPS_FQ1236A_MK4 */
	case 105:
		return 1;
	}
	return 0;
}

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, start;

	int tuner1 = 0, t_format1 = 0, audioic = -1;
	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));
	tvee->tuner_type = TUNER_ABSENT;
	tvee->tuner2_type = TUNER_ABSENT;

	done = len = beenhere = 0;

	/* Different eeprom start offsets for em28xx, cx2388x and cx23418 */
	if (eeprom_data[0] == 0x1a &&
	    eeprom_data[1] == 0xeb &&
	    eeprom_data[2] == 0x67 &&
	    eeprom_data[3] == 0x95)
		start = 0xa0; /* Generic em28xx offset */
	else if ((eeprom_data[0] & 0xe1) == 0x01 &&
		 eeprom_data[1] == 0x00 &&
		 eeprom_data[2] == 0x00 &&
		 eeprom_data[8] == 0x84)
		start = 8; /* Generic cx2388x offset */
	else if (eeprom_data[1] == 0x70 &&
		 eeprom_data[2] == 0x00 &&
		 eeprom_data[4] == 0x74 &&
		 eeprom_data[8] == 0x84)
		start = 8; /* Generic cx23418 offset (models 74xxx) */
	else
		start = 0;

	for (i = start; !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(KERN_CONT " %02x", eeprom_data[i + j]);
			printk(KERN_CONT "\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 = 0;
			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. */
			audioic = eeprom_data[i+2] & 0x7f;
			if (audioic < ARRAY_SIZE(audioIC))
				tvee->audio_processor = audioIC[audioic].id;
			else
				tvee->audio_processor = V4L2_IDENT_UNKNOWN;
			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);

			if ((eeprom_data[i + 8] & 0xf0) &&
					(tvee->serial_number < 0xffffff)) {
				tvee->MAC_address[0] = 0x00;
				tvee->MAC_address[1] = 0x0D;
				tvee->MAC_address[2] = 0xFE;
				tvee->MAC_address[3] = eeprom_data[i + 7];
				tvee->MAC_address[4] = eeprom_data[i + 6];
				tvee->MAC_address[5] = eeprom_data[i + 5];
				tvee->has_MAC_address = 1;
			}
			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. */
			audioic = eeprom_data[i+1] & 0x7f;
			if (audioic < ARRAY_SIZE(audioIC))
				tvee->audio_processor = audioIC[audioic].id;
			else
				tvee->audio_processor = V4L2_IDENT_UNKNOWN;

			break;

		case 0x06:
			/* tag 'ModelRev' */
			tvee->model =
				eeprom_data[i + 1] +
				(eeprom_data[i + 2] << 8) +
				(eeprom_data[i + 3] << 16) +
				(eeprom_data[i + 4] << 24);
			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];
				/* not a TV tuner? */
				if (t_format2 == 0)
					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 = 1 | (eeprom_data[i+1] << 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 < ARRAY_SIZE(hauppauge_tuner)) {
		tvee->tuner_type = hauppauge_tuner[tuner1].id;
		t_name1 = hauppauge_tuner[tuner1].name;
	} else {
		t_name1 = "unknown";
	}

	if (tuner2 < ARRAY_SIZE(hauppauge_tuner)) {
		tvee->tuner2_type = hauppauge_tuner[tuner2].id;
		t_name2 = hauppauge_tuner[tuner2].name;
	} else {
		t_name2 = "unknown";
	}

	tvee->tuner_hauppauge_model = tuner1;
	tvee->tuner2_hauppauge_model = tuner2;
	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;
		}
	}
	for (i = j = 0; i < 8; i++) {
		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);
	if (tvee->has_MAC_address == 1)
		tveeprom_info("MAC address is %pM\n", tvee->MAC_address);
	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);
	if (audioic < 0) {
		tveeprom_info("audio processor is unknown (no idx)\n");
		tvee->audio_processor = V4L2_IDENT_UNKNOWN;
	} else {
		if (audioic < ARRAY_SIZE(audioIC))
			tveeprom_info("audio processor is %s (idx %d)\n",
					audioIC[audioic].name, audioic);
		else
			tveeprom_info("audio processor is unknown (idx %d)\n",
								audioic);
	}
	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)
		tveeprom_info("has %sradio, has %sIR receiver, has %sIR transmitter\n",
				tvee->has_radio ? "" : "no ",
				(tvee->has_ir & 2) ? "" : "no ",
				(tvee->has_ir & 4) ? "" : "no ");
	else
		tveeprom_info("has %sradio\n",
				tvee->has_radio ? "" : "no ");
}
EXPORT_SYMBOL(tveeprom_hauppauge_analog);

/* ----------------------------------------------------------------------- */
/* generic helper functions                                                */

int tveeprom_read(struct i2c_client *c, unsigned char *eedata, int len)
{
	unsigned char buf;
	int err;

	buf = 0;
	err = i2c_master_send(c, &buf, 1);
	if (err != 1) {
		tveeprom_info("Huh, no eeprom present (err=%d)?\n", err);
		return -1;
	}
	err = i2c_master_recv(c, eedata, len);
	if (err != len) {
		tveeprom_warn("i2c eeprom read error (err=%d)\n", err);
		return -1;
	}
	if (debug) {
		int i;

		tveeprom_info("full 256-byte eeprom dump:\n");
		for (i = 0; i < len; i++) {
			if (0 == (i % 16))
				tveeprom_info("%02x:", i);
			printk(KERN_CONT " %02x", eedata[i]);
			if (15 == (i % 16))
				printk(KERN_CONT "\n");
		}
	}
	return 0;
}
EXPORT_SYMBOL(tveeprom_read);
