^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);