/*
 * 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>

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 const struct {
	int	id;
	const char * const 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 const struct {
	int  id;
	const char * const 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 TVEEPROM_AUDPROC_INTERNAL for those audio 'chips' that are
 * internal to a video chip, i.e. not a separate audio chip. */
static const struct {
	u32   id;
	const char * const name;
} audio_ic[] = {
	/* 0-4 */
	{ TVEEPROM_AUDPROC_NONE,  "None"      },
	{ TVEEPROM_AUDPROC_OTHER, "TEA6300"   },
	{ TVEEPROM_AUDPROC_OTHER, "TEA6320"   },
	{ TVEEPROM_AUDPROC_OTHER, "TDA9850"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3400C"  },
	/* 5-9 */
	{ TVEEPROM_AUDPROC_MSP,   "MSP3410D"  },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3415"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3430"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3438"   },
	{ TVEEPROM_AUDPROC_OTHER, "CS5331"    },
	/* 10-14 */
	{ TVEEPROM_AUDPROC_MSP,   "MSP3435"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3440"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3445"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3411"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3416"   },
	/* 15-19 */
	{ TVEEPROM_AUDPROC_MSP,   "MSP3425"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3451"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP3418"   },
	{ TVEEPROM_AUDPROC_OTHER, "Type 0x12" },
	{ TVEEPROM_AUDPROC_OTHER, "OKI7716"   },
	/* 20-24 */
	{ TVEEPROM_AUDPROC_MSP,   "MSP4410"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP4420"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP4440"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP4450"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP4408"   },
	/* 25-29 */
	{ TVEEPROM_AUDPROC_MSP,   "MSP4418"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP4428"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP4448"   },
	{ TVEEPROM_AUDPROC_MSP,   "MSP4458"   },
	{ TVEEPROM_AUDPROC_MSP,   "Type 0x1d" },
	/* 30-34 */
	{ TVEEPROM_AUDPROC_INTERNAL, "CX880"     },
	{ TVEEPROM_AUDPROC_INTERNAL, "CX881"     },
	{ TVEEPROM_AUDPROC_INTERNAL, "CX883"     },
	{ TVEEPROM_AUDPROC_INTERNAL, "CX882"     },
	{ TVEEPROM_AUDPROC_INTERNAL, "CX25840"   },
	/* 35-39 */
	{ TVEEPROM_AUDPROC_INTERNAL, "CX25841"   },
	{ TVEEPROM_AUDPROC_INTERNAL, "CX25842"   },
	{ TVEEPROM_AUDPROC_INTERNAL, "CX25843"   },
	{ TVEEPROM_AUDPROC_INTERNAL, "CX23418"   },
	{ TVEEPROM_AUDPROC_INTERNAL, "CX23885"   },
	/* 40-44 */
	{ TVEEPROM_AUDPROC_INTERNAL, "CX23888"   },
	{ TVEEPROM_AUDPROC_INTERNAL, "SAA7131"   },
	{ TVEEPROM_AUDPROC_INTERNAL, "CX23887"   },
	{ TVEEPROM_AUDPROC_INTERNAL, "SAA7164"   },
	{ TVEEPROM_AUDPROC_INTERNAL, "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;
	const char *t_name1 = NULL;
	const char *t_fmt_name1[8] = { " none", "", "", "", "", "", "", "" };

	int tuner2 = 0, t_format2 = 0;
	const 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(audio_ic))
				tvee->audio_processor = audio_ic[audioic].id;
			else
				tvee->audio_processor = TVEEPROM_AUDPROC_OTHER;
			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(audio_ic))
				tvee->audio_processor = audio_ic[audioic].id;
			else
				tvee->audio_processor = TVEEPROM_AUDPROC_OTHER;

			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 = TVEEPROM_AUDPROC_OTHER;
	} else {
		if (audioic < ARRAY_SIZE(audio_ic))
			tveeprom_info("audio processor is %s (idx %d)\n",
					audio_ic[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);
