Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * tveeprom - eeprom decoder for tvcard configuration eeproms
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Data and decoding routines shamelessly borrowed from bttv-cards.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * eeprom access routine shamelessly borrowed from bttv-if.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * which are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)     Copyright (C) 1996,97,98 Ralph  Metzler (rjkm@thp.uni-koeln.de)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 			   & Marcus Metzler (mocm@thp.uni-koeln.de)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)     (c) 1999-2001 Gerd Knorr <kraxel@goldbach.in-berlin.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  * Adjustments to fit a more general model and all bugs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 	Copyright (C) 2003 John Klar <linpvr at projectplasma.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) #include <linux/videodev2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #include <media/tuner.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #include <media/tveeprom.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) #include <media/v4l2-common.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) MODULE_DESCRIPTION("i2c Hauppauge eeprom decoder driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) MODULE_AUTHOR("John Klar");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #define STRM(array, i) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	(i < sizeof(array) / sizeof(char *) ? array[i] : "unknown")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  * The Hauppauge eeprom uses an 8bit field to determine which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43)  * tuner formats the tuner supports.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	int	id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	const char * const name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) } hauppauge_tuner_fmt[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	{ V4L2_STD_UNKNOWN,                   " UNKNOWN" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	{ V4L2_STD_UNKNOWN,                   " FM" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	{ V4L2_STD_B|V4L2_STD_GH,             " PAL(B/G)" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	{ V4L2_STD_MN,                        " NTSC(M)" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	{ V4L2_STD_PAL_I,                     " PAL(I)" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	{ V4L2_STD_SECAM_L|V4L2_STD_SECAM_LC, " SECAM(L/L')" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	{ V4L2_STD_DK,                        " PAL(D/D1/K)" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	{ V4L2_STD_ATSC,                      " ATSC/DVB Digital" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) /* This is the full list of possible tuners. Many thanks to Hauppauge for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60)    supplying this information. Note that many tuners where only used for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61)    testing and never made it to the outside world. So you will only see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62)    a subset in actual produced cards. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	int  id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	const char * const name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) } hauppauge_tuner[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	/* 0-9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	{ TUNER_ABSENT,			"None" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	{ TUNER_ABSENT,			"External" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	{ TUNER_ABSENT,			"Unspecified" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	{ TUNER_PHILIPS_PAL,		"Philips FI1216" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	{ TUNER_PHILIPS_SECAM,		"Philips FI1216MF" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	{ TUNER_PHILIPS_NTSC,		"Philips FI1236" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	{ TUNER_PHILIPS_PAL_I,		"Philips FI1246" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	{ TUNER_PHILIPS_PAL_DK,		"Philips FI1256" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	{ TUNER_PHILIPS_PAL,		"Philips FI1216 MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	{ TUNER_PHILIPS_SECAM,		"Philips FI1216MF MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	/* 10-19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	{ TUNER_PHILIPS_NTSC,		"Philips FI1236 MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	{ TUNER_PHILIPS_PAL_I,		"Philips FI1246 MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	{ TUNER_PHILIPS_PAL_DK,		"Philips FI1256 MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	{ TUNER_TEMIC_NTSC,		"Temic 4032FY5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	{ TUNER_TEMIC_PAL,		"Temic 4002FH5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	{ TUNER_TEMIC_PAL_I,		"Temic 4062FY5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	{ TUNER_PHILIPS_PAL,		"Philips FR1216 MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	{ TUNER_PHILIPS_SECAM,		"Philips FR1216MF MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	{ TUNER_PHILIPS_NTSC,		"Philips FR1236 MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	{ TUNER_PHILIPS_PAL_I,		"Philips FR1246 MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	/* 20-29 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	{ TUNER_PHILIPS_PAL_DK,		"Philips FR1256 MK2" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	{ TUNER_PHILIPS_PAL,		"Philips FM1216" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	{ TUNER_PHILIPS_SECAM,		"Philips FM1216MF" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	{ TUNER_PHILIPS_NTSC,		"Philips FM1236" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	{ TUNER_PHILIPS_PAL_I,		"Philips FM1246" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	{ TUNER_PHILIPS_PAL_DK,		"Philips FM1256" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	{ TUNER_TEMIC_4036FY5_NTSC,	"Temic 4036FY5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	{ TUNER_ABSENT,			"Samsung TCPN9082D" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	{ TUNER_ABSENT,			"Samsung TCPM9092P" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	{ TUNER_TEMIC_4006FH5_PAL,	"Temic 4006FH5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	/* 30-39 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	{ TUNER_ABSENT,			"Samsung TCPN9085D" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	{ TUNER_ABSENT,			"Samsung TCPB9085P" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	{ TUNER_ABSENT,			"Samsung TCPL9091P" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	{ TUNER_TEMIC_4039FR5_NTSC,	"Temic 4039FR5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	{ TUNER_PHILIPS_FQ1216ME,	"Philips FQ1216 ME" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	{ TUNER_TEMIC_4066FY5_PAL_I,	"Temic 4066FY5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	{ TUNER_PHILIPS_NTSC,		"Philips TD1536" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	{ TUNER_PHILIPS_NTSC,		"Philips TD1536D" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	{ TUNER_PHILIPS_NTSC,		"Philips FMR1236" }, /* mono radio */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	{ TUNER_ABSENT,			"Philips FI1256MP" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	/* 40-49 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	{ TUNER_ABSENT,			"Samsung TCPQ9091P" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	{ TUNER_TEMIC_4006FN5_MULTI_PAL,"Temic 4006FN5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	{ TUNER_TEMIC_4009FR5_PAL,	"Temic 4009FR5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	{ TUNER_TEMIC_4046FM5,		"Temic 4046FM5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	{ TUNER_TEMIC_4009FN5_MULTI_PAL_FM, "Temic 4009FN5" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	{ TUNER_ABSENT,			"Philips TD1536D FH 44"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	{ TUNER_LG_NTSC_FM,		"LG TP18NSR01F"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	{ TUNER_LG_PAL_FM,		"LG TP18PSB01D"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	{ TUNER_LG_PAL,		"LG TP18PSB11D"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	{ TUNER_LG_PAL_I_FM,		"LG TAPC-I001D"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	/* 50-59 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	{ TUNER_LG_PAL_I,		"LG TAPC-I701D"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	{ TUNER_ABSENT,			"Temic 4042FI5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	{ TUNER_MICROTUNE_4049FM5,	"Microtune 4049 FM5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	{ TUNER_ABSENT,			"LG TPI8NSR11F"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	{ TUNER_ABSENT,			"Microtune 4049 FM5 Alt I2C"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	{ TUNER_PHILIPS_FM1216ME_MK3,	"Philips FQ1216ME MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	{ TUNER_ABSENT,			"Philips FI1236 MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	{ TUNER_PHILIPS_FM1216ME_MK3,	"Philips FM1216 ME MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	{ TUNER_PHILIPS_FM1236_MK3,	"Philips FM1236 MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	{ TUNER_ABSENT,			"Philips FM1216MP MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	/* 60-69 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	{ TUNER_PHILIPS_FM1216ME_MK3,	"LG S001D MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	{ TUNER_ABSENT,			"LG M001D MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	{ TUNER_PHILIPS_FM1216ME_MK3,	"LG S701D MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	{ TUNER_ABSENT,			"LG M701D MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	{ TUNER_ABSENT,			"Temic 4146FM5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	{ TUNER_ABSENT,			"Temic 4136FY5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	{ TUNER_ABSENT,			"Temic 4106FH5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	{ TUNER_ABSENT,			"Philips FQ1216LMP MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	{ TUNER_LG_NTSC_TAPE,		"LG TAPE H001F MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	{ TUNER_LG_NTSC_TAPE,		"LG TAPE H701F MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	/* 70-79 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	{ TUNER_ABSENT,			"LG TALN H200T"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	{ TUNER_ABSENT,			"LG TALN H250T"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	{ TUNER_ABSENT,			"LG TALN M200T"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	{ TUNER_ABSENT,			"LG TALN Z200T"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	{ TUNER_ABSENT,			"LG TALN S200T"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	{ TUNER_ABSENT,			"Thompson DTT7595"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	{ TUNER_ABSENT,			"Thompson DTT7592"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	{ TUNER_ABSENT,			"Silicon TDA8275C1 8290"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	{ TUNER_ABSENT,			"Silicon TDA8275C1 8290 FM"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	{ TUNER_ABSENT,			"Thompson DTT757"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	/* 80-89 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	{ TUNER_PHILIPS_FQ1216LME_MK3,	"Philips FQ1216LME MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	{ TUNER_LG_PAL_NEW_TAPC,	"LG TAPC G701D"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	{ TUNER_LG_NTSC_NEW_TAPC,	"LG TAPC H791F"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	{ TUNER_LG_PAL_NEW_TAPC,	"TCL 2002MB 3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	{ TUNER_LG_PAL_NEW_TAPC,	"TCL 2002MI 3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	{ TUNER_TCL_2002N,		"TCL 2002N 6A"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	{ TUNER_PHILIPS_FM1236_MK3,	"Philips FQ1236 MK3"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	{ TUNER_SAMSUNG_TCPN_2121P30A,	"Samsung TCPN 2121P30A"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	{ TUNER_ABSENT,			"Samsung TCPE 4121P30A"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	{ TUNER_PHILIPS_FM1216ME_MK3,	"TCL MFPE05 2"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	/* 90-99 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	{ TUNER_ABSENT,			"LG TALN H202T"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	{ TUNER_PHILIPS_FQ1216AME_MK4,	"Philips FQ1216AME MK4"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	{ TUNER_PHILIPS_FQ1236A_MK4,	"Philips FQ1236A MK4"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	{ TUNER_ABSENT,			"Philips FQ1286A MK4"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	{ TUNER_ABSENT,			"Philips FQ1216ME MK5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	{ TUNER_ABSENT,			"Philips FQ1236 MK5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	{ TUNER_SAMSUNG_TCPG_6121P30A,	"Samsung TCPG 6121P30A"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	{ TUNER_TCL_2002MB,		"TCL 2002MB_3H"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	{ TUNER_ABSENT,			"TCL 2002MI_3H"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	{ TUNER_TCL_2002N,		"TCL 2002N 5H"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	/* 100-109 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	{ TUNER_PHILIPS_FMD1216ME_MK3,	"Philips FMD1216ME"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	{ TUNER_TEA5767,		"Philips TEA5768HL FM Radio"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	{ TUNER_ABSENT,			"Panasonic ENV57H12D5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	{ TUNER_PHILIPS_FM1236_MK3,	"TCL MFNM05-4"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	{ TUNER_PHILIPS_FM1236_MK3,	"TCL MNM05-4"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	{ TUNER_PHILIPS_FM1216ME_MK3,	"TCL MPE05-2"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	{ TUNER_ABSENT,			"TCL MQNM05-4"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	{ TUNER_ABSENT,			"LG TAPC-W701D"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	{ TUNER_ABSENT,			"TCL 9886P-WM"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	{ TUNER_ABSENT,			"TCL 1676NM-WM"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	/* 110-119 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	{ TUNER_ABSENT,			"Thompson DTT75105"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	{ TUNER_ABSENT,			"Conexant_CX24109"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	{ TUNER_TCL_2002N,		"TCL M2523_5N_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	{ TUNER_TCL_2002MB,		"TCL M2523_3DB_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	{ TUNER_ABSENT,			"Philips 8275A"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	{ TUNER_ABSENT,			"Microtune MT2060"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	{ TUNER_PHILIPS_FM1236_MK3,	"Philips FM1236 MK5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	{ TUNER_PHILIPS_FM1216ME_MK3,	"Philips FM1216ME MK5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	{ TUNER_ABSENT,			"TCL M2523_3DI_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	{ TUNER_ABSENT,			"Samsung THPD5222FG30A"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	/* 120-129 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	{ TUNER_XC2028,			"Xceive XC3028"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	{ TUNER_PHILIPS_FQ1216LME_MK3,	"Philips FQ1216LME MK5"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	{ TUNER_ABSENT,			"Philips FQD1216LME"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	{ TUNER_ABSENT,			"Conexant CX24118A"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	{ TUNER_ABSENT,			"TCL DMF11WIP"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	{ TUNER_ABSENT,			"TCL MFNM05_4H_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	{ TUNER_ABSENT,			"TCL MNM05_4H_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	{ TUNER_ABSENT,			"TCL MPE05_2H_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	{ TUNER_ABSENT,			"TCL MQNM05_4_U"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	{ TUNER_ABSENT,			"TCL M2523_5NH_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	/* 130-139 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	{ TUNER_ABSENT,			"TCL M2523_3DBH_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	{ TUNER_ABSENT,			"TCL M2523_3DIH_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	{ TUNER_ABSENT,			"TCL MFPE05_2_U"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	{ TUNER_PHILIPS_FMD1216MEX_MK3,	"Philips FMD1216MEX"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	{ TUNER_ABSENT,			"Philips FRH2036B"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	{ TUNER_ABSENT,			"Panasonic ENGF75_01GF"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	{ TUNER_ABSENT,			"MaxLinear MXL5005"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	{ TUNER_ABSENT,			"MaxLinear MXL5003"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	{ TUNER_ABSENT,			"Xceive XC2028"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	{ TUNER_ABSENT,			"Microtune MT2131"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	/* 140-149 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	{ TUNER_ABSENT,			"Philips 8275A_8295"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	{ TUNER_ABSENT,			"TCL MF02GIP_5N_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	{ TUNER_ABSENT,			"TCL MF02GIP_3DB_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	{ TUNER_ABSENT,			"TCL MF02GIP_3DI_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	{ TUNER_ABSENT,			"Microtune MT2266"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	{ TUNER_ABSENT,			"TCL MF10WPP_4N_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	{ TUNER_ABSENT,			"LG TAPQ_H702F"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	{ TUNER_ABSENT,			"TCL M09WPP_4N_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 	{ TUNER_ABSENT,			"MaxLinear MXL5005_v2"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	{ TUNER_PHILIPS_TDA8290,	"Philips 18271_8295"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	/* 150-159 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	{ TUNER_XC5000,                 "Xceive XC5000"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	{ TUNER_ABSENT,                 "Xceive XC3028L"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	{ TUNER_ABSENT,                 "NXP 18271C2_716x"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	{ TUNER_ABSENT,                 "Xceive XC4000"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	{ TUNER_ABSENT,                 "Dibcom 7070"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	{ TUNER_PHILIPS_TDA8290,        "NXP 18271C2"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	{ TUNER_ABSENT,                 "Siano SMS1010"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	{ TUNER_ABSENT,                 "Siano SMS1150"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	{ TUNER_ABSENT,                 "MaxLinear 5007"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	{ TUNER_ABSENT,                 "TCL M09WPP_2P_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	/* 160-169 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	{ TUNER_ABSENT,                 "Siano SMS1180"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	{ TUNER_ABSENT,                 "Maxim_MAX2165"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	{ TUNER_ABSENT,                 "Siano SMS1140"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	{ TUNER_ABSENT,                 "Siano SMS1150 B1"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	{ TUNER_ABSENT,                 "MaxLinear 111"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	{ TUNER_ABSENT,                 "Dibcom 7770"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	{ TUNER_ABSENT,                 "Siano SMS1180VNS"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	{ TUNER_ABSENT,                 "Siano SMS1184"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	{ TUNER_PHILIPS_FQ1236_MK5,	"TCL M30WTP-4N-E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	{ TUNER_ABSENT,                 "TCL_M11WPP_2PN_E"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	/* 170-179 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	{ TUNER_ABSENT,                 "MaxLinear 301"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	{ TUNER_ABSENT,                 "Mirics MSi001"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	{ TUNER_ABSENT,                 "MaxLinear MxL241SF"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	{ TUNER_XC5000C,                "Xceive XC5000C"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	{ TUNER_ABSENT,                 "Montage M68TS2020"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	{ TUNER_ABSENT,                 "Siano SMS1530"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	{ TUNER_ABSENT,                 "Dibcom 7090"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	{ TUNER_ABSENT,                 "Xceive XC5200C"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	{ TUNER_ABSENT,                 "NXP 18273"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	{ TUNER_ABSENT,                 "Montage M88TS2022"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	/* 180-188 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	{ TUNER_ABSENT,                 "NXP 18272M"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	{ TUNER_ABSENT,                 "NXP 18272S"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	{ TUNER_ABSENT,                 "Mirics MSi003"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	{ TUNER_ABSENT,                 "MaxLinear MxL256"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	{ TUNER_ABSENT,                 "SiLabs Si2158"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	{ TUNER_ABSENT,                 "SiLabs Si2178"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	{ TUNER_ABSENT,                 "SiLabs Si2157"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	{ TUNER_ABSENT,                 "SiLabs Si2177"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	{ TUNER_ABSENT,                 "ITE IT9137FN"},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* Use TVEEPROM_AUDPROC_INTERNAL for those audio 'chips' that are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)  * internal to a video chip, i.e. not a separate audio chip. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) static const struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	u32   id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	const char * const name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) } audio_ic[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	/* 0-4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	{ TVEEPROM_AUDPROC_NONE,  "None"      },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	{ TVEEPROM_AUDPROC_OTHER, "TEA6300"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	{ TVEEPROM_AUDPROC_OTHER, "TEA6320"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	{ TVEEPROM_AUDPROC_OTHER, "TDA9850"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3400C"  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	/* 5-9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3410D"  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3415"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3430"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3438"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	{ TVEEPROM_AUDPROC_OTHER, "CS5331"    },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	/* 10-14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3435"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3440"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3445"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3411"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3416"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	/* 15-19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3425"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3451"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	{ TVEEPROM_AUDPROC_MSP,   "MSP3418"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	{ TVEEPROM_AUDPROC_OTHER, "Type 0x12" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	{ TVEEPROM_AUDPROC_OTHER, "OKI7716"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	/* 20-24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	{ TVEEPROM_AUDPROC_MSP,   "MSP4410"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	{ TVEEPROM_AUDPROC_MSP,   "MSP4420"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	{ TVEEPROM_AUDPROC_MSP,   "MSP4440"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	{ TVEEPROM_AUDPROC_MSP,   "MSP4450"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	{ TVEEPROM_AUDPROC_MSP,   "MSP4408"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	/* 25-29 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	{ TVEEPROM_AUDPROC_MSP,   "MSP4418"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	{ TVEEPROM_AUDPROC_MSP,   "MSP4428"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	{ TVEEPROM_AUDPROC_MSP,   "MSP4448"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	{ TVEEPROM_AUDPROC_MSP,   "MSP4458"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	{ TVEEPROM_AUDPROC_MSP,   "Type 0x1d" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	/* 30-34 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX880"     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX881"     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX883"     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX882"     },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX25840"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	/* 35-39 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX25841"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX25842"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX25843"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX23418"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX23885"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	/* 40-44 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX23888"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	{ TVEEPROM_AUDPROC_INTERNAL, "SAA7131"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX23887"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	{ TVEEPROM_AUDPROC_INTERNAL, "SAA7164"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	{ TVEEPROM_AUDPROC_INTERNAL, "AU8522"    },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	/* 45-49 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	{ TVEEPROM_AUDPROC_INTERNAL, "AVF4910B"  },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	{ TVEEPROM_AUDPROC_INTERNAL, "SAA7231"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	{ TVEEPROM_AUDPROC_INTERNAL, "CX23102"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	{ TVEEPROM_AUDPROC_INTERNAL, "SAA7163"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	{ TVEEPROM_AUDPROC_OTHER,    "AK4113"    },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	/* 50-52 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	{ TVEEPROM_AUDPROC_OTHER,    "CS5340"    },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	{ TVEEPROM_AUDPROC_OTHER,    "CS8416"    },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	{ TVEEPROM_AUDPROC_OTHER,    "CX20810"   },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) /* This list is supplied by Hauppauge. Thanks! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) static const char *decoderIC[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 	/* 0-4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	"None", "BT815", "BT817", "BT819", "BT815A",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	/* 5-9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	"BT817A", "BT819A", "BT827", "BT829", "BT848",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	/* 10-14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	"BT848A", "BT849A", "BT829A", "BT827A", "BT878",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	/* 15-19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 	"BT879", "BT880", "VPX3226E", "SAA7114", "SAA7115",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	/* 20-24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	"CX880", "CX881", "CX883", "SAA7111", "SAA7113",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	/* 25-29 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	"CX882", "TVP5150A", "CX25840", "CX25841", "CX25842",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	/* 30-34 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	"CX25843", "CX23418", "NEC61153", "CX23885", "CX23888",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	/* 35-39 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	"SAA7131", "CX25837", "CX23887", "CX23885A", "CX23887A",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	/* 40-44 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	"SAA7164", "CX23885B", "AU8522", "ADV7401", "AVF4910B",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	/* 45-49 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	"SAA7231", "CX23102", "SAA7163", "ADV7441A", "ADV7181C",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	/* 50-53 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	"CX25836", "TDA9955", "TDA19977", "ADV7842"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) static int hasRadioTuner(int tunerType)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	switch (tunerType) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 	case 18: /* PNPEnv_TUNER_FR1236_MK2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	case 23: /* PNPEnv_TUNER_FM1236 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	case 38: /* PNPEnv_TUNER_FMR1236 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 	case 16: /* PNPEnv_TUNER_FR1216_MK2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 	case 19: /* PNPEnv_TUNER_FR1246_MK2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	case 21: /* PNPEnv_TUNER_FM1216 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	case 24: /* PNPEnv_TUNER_FM1246 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 	case 17: /* PNPEnv_TUNER_FR1216MF_MK2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	case 22: /* PNPEnv_TUNER_FM1216MF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 	case 20: /* PNPEnv_TUNER_FR1256_MK2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	case 25: /* PNPEnv_TUNER_FM1256 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	case 33: /* PNPEnv_TUNER_4039FR5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 	case 42: /* PNPEnv_TUNER_4009FR5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 	case 52: /* PNPEnv_TUNER_4049FM5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 	case 54: /* PNPEnv_TUNER_4049FM5_AltI2C */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	case 44: /* PNPEnv_TUNER_4009FN5 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 	case 31: /* PNPEnv_TUNER_TCPB9085P */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	case 30: /* PNPEnv_TUNER_TCPN9085D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 	case 46: /* PNPEnv_TUNER_TP18NSR01F */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	case 47: /* PNPEnv_TUNER_TP18PSB01D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	case 49: /* PNPEnv_TUNER_TAPC_I001D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	case 60: /* PNPEnv_TUNER_TAPE_S001D_MK3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 	case 57: /* PNPEnv_TUNER_FM1216ME_MK3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 	case 59: /* PNPEnv_TUNER_FM1216MP_MK3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 	case 58: /* PNPEnv_TUNER_FM1236_MK3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 	case 68: /* PNPEnv_TUNER_TAPE_H001F_MK3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 	case 61: /* PNPEnv_TUNER_TAPE_M001D_MK3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	case 78: /* PNPEnv_TUNER_TDA8275C1_8290_FM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 	case 89: /* PNPEnv_TUNER_TCL_MFPE05_2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	case 92: /* PNPEnv_TUNER_PHILIPS_FQ1236A_MK4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	case 105:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) void tveeprom_hauppauge_analog(struct tveeprom *tvee,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 			       unsigned char *eeprom_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 	/* ----------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 	** The hauppauge eeprom format is tagged
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 	** if packet[0] == 0x84, then packet[0..1] == length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 	** else length = packet[0] & 3f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	** if packet[0] & f8 == f8, then EOD and packet[1] == checksum
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 	** In our (ivtv) case we're interested in the following:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	** tuner type:   tag [00].05 or [0a].01 (index into hauppauge_tuner)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 	** tuner fmts:   tag [00].04 or [0a].00 (bitmask index into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 	**		 hauppauge_tuner_fmt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 	** radio:        tag [00].{last} or [0e].00  (bitmask.  bit2=FM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 	** audio proc:   tag [02].01 or [05].00 (mask with 0x7f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	** decoder proc: tag [09].01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	** Fun info:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 	** model:      tag [00].07-08 or [06].00-01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	** revision:   tag [00].09-0b or [06].04-06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	** serial#:    tag [01].05-07 or [04].04-06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 	** # of inputs/outputs ???
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 	int i, j, len, done, beenhere, tag, start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	int tuner1 = 0, t_format1 = 0, audioic = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	const char *t_name1 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	const char *t_fmt_name1[8] = { " none", "", "", "", "", "", "", "" };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	int tuner2 = 0, t_format2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 	const char *t_name2 = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 	const char *t_fmt_name2[8] = { " none", "", "", "", "", "", "", "" };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	memset(tvee, 0, sizeof(*tvee));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	tvee->tuner_type = TUNER_ABSENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 	tvee->tuner2_type = TUNER_ABSENT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 	done = len = beenhere = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	/* Different eeprom start offsets for em28xx, cx2388x and cx23418 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	if (eeprom_data[0] == 0x1a &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 	    eeprom_data[1] == 0xeb &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	    eeprom_data[2] == 0x67 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	    eeprom_data[3] == 0x95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 		start = 0xa0; /* Generic em28xx offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 	else if ((eeprom_data[0] & 0xe1) == 0x01 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 		 eeprom_data[1] == 0x00 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 		 eeprom_data[2] == 0x00 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 		 eeprom_data[8] == 0x84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 		start = 8; /* Generic cx2388x offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 	else if (eeprom_data[1] == 0x70 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 		 eeprom_data[2] == 0x00 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 		 eeprom_data[4] == 0x74 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 		 eeprom_data[8] == 0x84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 		start = 8; /* Generic cx23418 offset (models 74xxx) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 		start = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 	for (i = start; !done && i < 256; i += len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 		if (eeprom_data[i] == 0x84) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 			len = eeprom_data[i + 1] + (eeprom_data[i + 2] << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 			i += 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 		} else if ((eeprom_data[i] & 0xf0) == 0x70) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 			if (eeprom_data[i] & 0x08) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 				/* verify checksum! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 				done = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 			len = eeprom_data[i] & 0x07;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 			++i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 			pr_warn("Encountered bad packet header [%02x]. Corrupt or not a Hauppauge eeprom.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 				eeprom_data[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 			return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 		pr_debug("Tag [%02x] + %d bytes: %*ph\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 			eeprom_data[i], len - 1, len, &eeprom_data[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 		/* process by tag */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 		tag = eeprom_data[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 		switch (tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 		case 0x00:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 			/* tag: 'Comprehensive' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 			tuner1 = eeprom_data[i+6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 			t_format1 = eeprom_data[i+5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 			tvee->has_radio = eeprom_data[i+len-1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 			/* old style tag, don't know how to detect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 			IR presence, mark as unknown. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 			tvee->has_ir = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 			tvee->model =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 				eeprom_data[i+8] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 				(eeprom_data[i+9] << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 			tvee->revision = eeprom_data[i+10] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 				(eeprom_data[i+11] << 8) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 				(eeprom_data[i+12] << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 		case 0x01:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 			/* tag: 'SerialID' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 			tvee->serial_number =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 				eeprom_data[i+6] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 				(eeprom_data[i+7] << 8) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 				(eeprom_data[i+8] << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 		case 0x02:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 			/* tag 'AudioInfo'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 			Note mask with 0x7F, high bit used on some older models
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 			to indicate 4052 mux was removed in favor of using MSP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 			inputs directly. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 			audioic = eeprom_data[i+2] & 0x7f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 			if (audioic < ARRAY_SIZE(audio_ic))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 				tvee->audio_processor = audio_ic[audioic].id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 				tvee->audio_processor = TVEEPROM_AUDPROC_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 		/* case 0x03: tag 'EEInfo' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 		case 0x04:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 			/* tag 'SerialID2' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 			tvee->serial_number =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 				eeprom_data[i+5] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 				(eeprom_data[i+6] << 8) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 				(eeprom_data[i+7] << 16)+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 				(eeprom_data[i+8] << 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 			if (eeprom_data[i + 8] == 0xf0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 				tvee->MAC_address[0] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 				tvee->MAC_address[1] = 0x0D;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 				tvee->MAC_address[2] = 0xFE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 				tvee->MAC_address[3] = eeprom_data[i + 7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 				tvee->MAC_address[4] = eeprom_data[i + 6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 				tvee->MAC_address[5] = eeprom_data[i + 5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 				tvee->has_MAC_address = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 		case 0x05:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 			/* tag 'Audio2'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 			Note mask with 0x7F, high bit used on some older models
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 			to indicate 4052 mux was removed in favor of using MSP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 			inputs directly. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 			audioic = eeprom_data[i+1] & 0x7f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 			if (audioic < ARRAY_SIZE(audio_ic))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 				tvee->audio_processor = audio_ic[audioic].id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 			else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 				tvee->audio_processor = TVEEPROM_AUDPROC_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 		case 0x06:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 			/* tag 'ModelRev' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 			tvee->model =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 				eeprom_data[i + 1] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 				(eeprom_data[i + 2] << 8) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 				(eeprom_data[i + 3] << 16) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 				(eeprom_data[i + 4] << 24);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 			tvee->revision =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 				eeprom_data[i + 5] +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 				(eeprom_data[i + 6] << 8) +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 				(eeprom_data[i + 7] << 16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 		case 0x07:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 			/* tag 'Details': according to Hauppauge not interesting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 			on any PCI-era or later boards. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 		/* there is no tag 0x08 defined */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 		case 0x09:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 			/* tag 'Video' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 			tvee->decoder_processor = eeprom_data[i + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 		case 0x0a:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 			/* tag 'Tuner' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 			if (beenhere == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 				tuner1 = eeprom_data[i + 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 				t_format1 = eeprom_data[i + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 				beenhere = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 				/* a second (radio) tuner may be present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 				tuner2 = eeprom_data[i + 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 				t_format2 = eeprom_data[i + 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 				/* not a TV tuner? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 				if (t_format2 == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 					tvee->has_radio = 1; /* must be radio */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 		case 0x0b:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 			/* tag 'Inputs': according to Hauppauge this is specific
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 			to each driver family, so no good assumptions can be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 			made. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 		/* case 0x0c: tag 'Balun' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 		/* case 0x0d: tag 'Teletext' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 		case 0x0e:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 			/* tag: 'Radio' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 			tvee->has_radio = eeprom_data[i+1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 		case 0x0f:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 			/* tag 'IRInfo' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 			tvee->has_ir = 1 | (eeprom_data[i+1] << 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 		/* case 0x10: tag 'VBIInfo' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 		/* case 0x11: tag 'QCInfo' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 		/* case 0x12: tag 'InfoBits' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 		default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 			pr_debug("Not sure what to do with tag [%02x]\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 					tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 			/* dump the rest of the packet? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 	if (!done) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) 		pr_warn("Ran out of data!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 	if (tvee->revision != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 		tvee->rev_str[0] = 32 + ((tvee->revision >> 18) & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 		tvee->rev_str[1] = 32 + ((tvee->revision >> 12) & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 		tvee->rev_str[2] = 32 + ((tvee->revision >>  6) & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 		tvee->rev_str[3] = 32 + (tvee->revision & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 		tvee->rev_str[4] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 	if (hasRadioTuner(tuner1) && !tvee->has_radio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 		pr_info("The eeprom says no radio is present, but the tuner type\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 		pr_info("indicates otherwise. I will assume that radio is present.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 		tvee->has_radio = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 	if (tuner1 < ARRAY_SIZE(hauppauge_tuner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 		tvee->tuner_type = hauppauge_tuner[tuner1].id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 		t_name1 = hauppauge_tuner[tuner1].name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 		t_name1 = "unknown";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 	if (tuner2 < ARRAY_SIZE(hauppauge_tuner)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 		tvee->tuner2_type = hauppauge_tuner[tuner2].id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 		t_name2 = hauppauge_tuner[tuner2].name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 		t_name2 = "unknown";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 	tvee->tuner_hauppauge_model = tuner1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 	tvee->tuner2_hauppauge_model = tuner2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 	tvee->tuner_formats = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 	tvee->tuner2_formats = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 	for (i = j = 0; i < 8; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 		if (t_format1 & (1 << i)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 			tvee->tuner_formats |= hauppauge_tuner_fmt[i].id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 			t_fmt_name1[j++] = hauppauge_tuner_fmt[i].name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 	for (i = j = 0; i < 8; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 		if (t_format2 & (1 << i)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) 			tvee->tuner2_formats |= hauppauge_tuner_fmt[i].id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 			t_fmt_name2[j++] = hauppauge_tuner_fmt[i].name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 	pr_info("Hauppauge model %d, rev %s, serial# %u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) 		tvee->model, tvee->rev_str, tvee->serial_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 	if (tvee->has_MAC_address == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) 		pr_info("MAC address is %pM\n", tvee->MAC_address);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 	pr_info("tuner model is %s (idx %d, type %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) 		t_name1, tuner1, tvee->tuner_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) 	pr_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) 		t_fmt_name1[0], t_fmt_name1[1], t_fmt_name1[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) 		t_fmt_name1[3],	t_fmt_name1[4], t_fmt_name1[5],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 		t_fmt_name1[6], t_fmt_name1[7],	t_format1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 	if (tuner2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 		pr_info("second tuner model is %s (idx %d, type %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) 					t_name2, tuner2, tvee->tuner2_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 	if (t_format2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 		pr_info("TV standards%s%s%s%s%s%s%s%s (eeprom 0x%02x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 			t_fmt_name2[0], t_fmt_name2[1], t_fmt_name2[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 			t_fmt_name2[3],	t_fmt_name2[4], t_fmt_name2[5],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 			t_fmt_name2[6], t_fmt_name2[7], t_format2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 	if (audioic < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 		pr_info("audio processor is unknown (no idx)\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 		tvee->audio_processor = TVEEPROM_AUDPROC_OTHER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 		if (audioic < ARRAY_SIZE(audio_ic))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 			pr_info("audio processor is %s (idx %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 					audio_ic[audioic].name, audioic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 			pr_info("audio processor is unknown (idx %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 								audioic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 	if (tvee->decoder_processor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 		pr_info("decoder processor is %s (idx %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) 			STRM(decoderIC, tvee->decoder_processor),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 			tvee->decoder_processor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 	if (tvee->has_ir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 		pr_info("has %sradio, has %sIR receiver, has %sIR transmitter\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 				tvee->has_radio ? "" : "no ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 				(tvee->has_ir & 2) ? "" : "no ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 				(tvee->has_ir & 4) ? "" : "no ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 		pr_info("has %sradio\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 				tvee->has_radio ? "" : "no ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) EXPORT_SYMBOL(tveeprom_hauppauge_analog);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) /* ----------------------------------------------------------------------- */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) /* generic helper functions                                                */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) int tveeprom_read(struct i2c_client *c, unsigned char *eedata, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 	unsigned char buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 	buf = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 	err = i2c_master_send(c, &buf, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 	if (err != 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 		pr_info("Huh, no eeprom present (err=%d)?\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 		return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 	err = i2c_master_recv(c, eedata, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) 	if (err != len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) 		pr_warn("i2c eeprom read error (err=%d)\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) 		return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 	print_hex_dump_debug("full 256-byte eeprom dump:", DUMP_PREFIX_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) 			     16, 1, eedata, len, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) EXPORT_SYMBOL(tveeprom_read);