24 #include <linux/module.h>
26 #include <linux/videodev2.h>
29 #include <linux/i2c.h>
40 static int no_poweroff;
42 MODULE_PARM_DESC(no_poweroff,
"0 (default) powers device off when not used.\n"
43 "\t\t1 keep device energized and with tuner ready all the times.\n"
44 "\t\tFaster, but consumes more power and keeps the device hotter");
47 static LIST_HEAD(hybrid_tuner_instance_list);
49 #define dprintk(level, fmt, arg...) if (debug >= level) \
50 printk(KERN_INFO "%s: " fmt, "xc5000", ## arg)
71 #define MAX_TV_STANDARD 24
72 #define XC_MAX_I2C_WRITE_LENGTH 64
75 #define XC_RF_MODE_AIR 0
76 #define XC_RF_MODE_CABLE 1
79 #define XC_RESULT_SUCCESS 0
80 #define XC_RESULT_RESET_FAILURE 1
81 #define XC_RESULT_I2C_WRITE_FAILURE 2
82 #define XC_RESULT_I2C_READ_FAILURE 3
83 #define XC_RESULT_OUT_OF_RANGE 5
86 #define XC_PRODUCT_ID_FW_NOT_LOADED 0x2000
87 #define XC_PRODUCT_ID_FW_LOADED 0x1388
90 #define XREG_INIT 0x00
91 #define XREG_VIDEO_MODE 0x01
92 #define XREG_AUDIO_MODE 0x02
93 #define XREG_RF_FREQ 0x03
94 #define XREG_D_CODE 0x04
95 #define XREG_IF_OUT 0x05
96 #define XREG_SEEK_MODE 0x07
97 #define XREG_POWER_DOWN 0x0A
99 #define XREG_OUTPUT_AMP 0x0B
100 #define XREG_SIGNALSOURCE 0x0D
101 #define XREG_SMOOTHEDCVBS 0x0E
102 #define XREG_XTALFREQ 0x0F
103 #define XREG_FINERFREQ 0x10
104 #define XREG_DDIMODE 0x11
106 #define XREG_ADC_ENV 0x00
107 #define XREG_QUALITY 0x01
108 #define XREG_FRAME_LINES 0x02
109 #define XREG_HSYNC_FREQ 0x03
110 #define XREG_LOCK 0x04
111 #define XREG_FREQ_ERROR 0x05
112 #define XREG_SNR 0x06
113 #define XREG_VERSION 0x07
114 #define XREG_PRODUCT_ID 0x08
115 #define XREG_BUSY 0x09
116 #define XREG_BUILD 0x0D
117 #define XREG_TOTALGAIN 0x0F
118 #define XREG_FW_CHECKSUM 0x12
119 #define XREG_INIT_STATUS 0x13
161 #define MN_NTSC_PAL_BTSC 0
162 #define MN_NTSC_PAL_A2 1
163 #define MN_NTSC_PAL_EIAJ 2
164 #define MN_NTSC_PAL_Mono 3
166 #define BG_PAL_NICAM 5
167 #define BG_PAL_MONO 6
168 #define I_PAL_NICAM 7
169 #define I_PAL_NICAM_MONO 8
171 #define DK_PAL_NICAM 10
172 #define DK_PAL_MONO 11
173 #define DK_SECAM_A2DK1 12
174 #define DK_SECAM_A2LDK3 13
175 #define DK_SECAM_A2MONO 14
176 #define L_SECAM_NICAM 15
177 #define LC_SECAM_NICAM 16
182 #define FM_Radio_INPUT2 21
183 #define FM_Radio_INPUT1 22
184 #define FM_Radio_INPUT1_MONO 23
187 {
"M/N-NTSC/PAL-BTSC", 0x0400, 0x8020},
188 {
"M/N-NTSC/PAL-A2", 0x0600, 0x8020},
189 {
"M/N-NTSC/PAL-EIAJ", 0x0440, 0x8020},
190 {
"M/N-NTSC/PAL-Mono", 0x0478, 0x8020},
191 {
"B/G-PAL-A2", 0x0A00, 0x8049},
192 {
"B/G-PAL-NICAM", 0x0C04, 0x8049},
193 {
"B/G-PAL-MONO", 0x0878, 0x8059},
194 {
"I-PAL-NICAM", 0x1080, 0x8009},
195 {
"I-PAL-NICAM-MONO", 0x0E78, 0x8009},
196 {
"D/K-PAL-A2", 0x1600, 0x8009},
197 {
"D/K-PAL-NICAM", 0x0E80, 0x8009},
198 {
"D/K-PAL-MONO", 0x1478, 0x8009},
199 {
"D/K-SECAM-A2 DK1", 0x1200, 0x8009},
200 {
"D/K-SECAM-A2 L/DK3", 0x0E00, 0x8009},
201 {
"D/K-SECAM-A2 MONO", 0x1478, 0x8009},
202 {
"L-SECAM-NICAM", 0x8E82, 0x0009},
203 {
"L'-SECAM-NICAM", 0x8E82, 0x4009},
204 {
"DTV6", 0x00C0, 0x8002},
205 {
"DTV8", 0x00C0, 0x800B},
206 {
"DTV7/8", 0x00C0, 0x801B},
207 {
"DTV7", 0x00C0, 0x8007},
208 {
"FM Radio-INPUT2", 0x9802, 0x9002},
209 {
"FM Radio-INPUT1", 0x0208, 0x9002},
210 {
"FM Radio-INPUT1_MONO", 0x0278, 0x9002}
222 #define XC5000A_FIRMWARE "dvb-fe-xc5000-1.6.114.fw"
229 #define XC5000C_FIRMWARE "dvb-fe-xc5000c-4.1.30.7.fw"
234 .init_status_supported = 1,
235 .fw_checksum_supported = 1,
243 return &xc5000a_1_6_114;
245 return &xc5000c_41_024_5;
250 static int xc5000_is_firmware_loaded(
struct dvb_frontend *fe);
257 .flags = 0, .buf =
buf, .len = len };
270 static int xc_read_i2c_data(
struct xc5000_priv *priv,
u8 *buf,
int len)
285 u8 buf[2] = { reg >> 8, reg & 0xff };
286 u8 bval[2] = { 0, 0 };
289 .flags = 0, .buf = &buf[0], .len = 2 },
291 .flags =
I2C_M_RD, .buf = &bval[0], .len = 2 },
299 *val = (bval[0] << 8) | bval[1];
303 static void xc_wait(
int wait_ms)
313 dprintk(1,
"%s()\n", __func__);
326 printk(
KERN_ERR "xc5000: no tuner reset callback function, fatal\n");
335 int WatchDogTimer = 100;
338 buf[0] = (regAddr >> 8) & 0xFF;
339 buf[1] = regAddr & 0xFF;
340 buf[2] = (i2cData >> 8) & 0xFF;
341 buf[3] = i2cData & 0xFF;
342 result = xc_send_i2c_data(priv, buf, 4);
348 if ((buf[0] == 0) && (buf[1] == 0)) {
358 if (WatchDogTimer <= 0)
364 static int xc_load_i2c_sequence(
struct dvb_frontend *fe,
const u8 *i2c_sequence)
373 while ((i2c_sequence[index] != 0xFF) ||
374 (i2c_sequence[index + 1] != 0xFF)) {
375 len = i2c_sequence[
index] * 256 + i2c_sequence[index+1];
378 result = xc5000_TunerReset(fe);
382 }
else if (len & 0x8000) {
384 xc_wait(len & 0x7FFF);
391 buf[0] = i2c_sequence[
index];
392 buf[1] = i2c_sequence[index + 1];
399 nbytes_to_send = (len - pos + 2);
400 for (i = 2; i < nbytes_to_send; i++) {
401 buf[
i] = i2c_sequence[index + pos +
404 result = xc_send_i2c_data(priv, buf,
410 pos += nbytes_to_send - 2;
420 dprintk(1,
"%s()\n", __func__);
424 static int xc_SetTVStandard(
struct xc5000_priv *priv,
425 u16 VideoMode,
u16 AudioMode)
428 dprintk(1,
"%s(0x%04x,0x%04x)\n", __func__, VideoMode, AudioMode);
429 dprintk(1,
"%s() Standard = %s\n",
442 dprintk(1,
"%s(%d) Source = %s\n", __func__, rf_mode,
448 "%s(), Invalid mode, defaulting to CABLE",
456 static int xc_set_RF_frequency(
struct xc5000_priv *priv,
u32 freq_hz)
460 dprintk(1,
"%s(%u)\n", __func__, freq_hz);
462 if ((freq_hz > xc5000_tuner_ops.info.frequency_max) ||
463 (freq_hz < xc5000_tuner_ops.info.frequency_min))
466 freq_code = (
u16)(freq_hz / 15625);
475 static int xc_set_IF_frequency(
struct xc5000_priv *priv,
u32 freq_khz)
477 u32 freq_code = (freq_khz * 1024)/1000;
478 dprintk(1,
"%s(freq_khz = %d) freq_code = 0x%x\n",
479 __func__, freq_khz, freq_code);
485 static int xc_get_ADC_Envelope(
struct xc5000_priv *priv,
u16 *adc_envelope)
487 return xc5000_readreg(priv,
XREG_ADC_ENV, adc_envelope);
490 static int xc_get_frequency_error(
struct xc5000_priv *priv,
u32 *freq_error_hz)
501 (*freq_error_hz) = (tmp * 15625) / 1000;
505 static int xc_get_lock_status(
struct xc5000_priv *priv,
u16 *lock_status)
507 return xc5000_readreg(priv,
XREG_LOCK, lock_status);
510 static int xc_get_version(
struct xc5000_priv *priv,
511 u8 *hw_majorversion,
u8 *hw_minorversion,
512 u8 *fw_majorversion,
u8 *fw_minorversion)
521 (*hw_majorversion) = (data >> 12) & 0x0F;
522 (*hw_minorversion) = (data >> 8) & 0x0F;
523 (*fw_majorversion) = (data >> 4) & 0x0F;
524 (*fw_minorversion) = data & 0x0F;
529 static int xc_get_buildversion(
struct xc5000_priv *priv,
u16 *buildrev)
531 return xc5000_readreg(priv,
XREG_BUILD, buildrev);
534 static int xc_get_hsync_freq(
struct xc5000_priv *priv,
u32 *hsync_freq_hz)
543 (*hsync_freq_hz) = ((regData & 0x0fff) * 763)/100;
547 static int xc_get_frame_lines(
struct xc5000_priv *priv,
u16 *frame_lines)
559 return xc5000_readreg(priv,
XREG_SNR, snr);
562 static int xc_get_totalgain(
struct xc5000_priv *priv,
u16 *totalgain)
570 int watchDogCount = 40;
572 while ((lockState == 0) && (watchDogCount > 0)) {
573 xc_get_lock_status(priv, &lockState);
574 if (lockState != 1) {
582 #define XC_TUNE_ANALOG 0
583 #define XC_TUNE_DIGITAL 1
588 dprintk(1,
"%s(%u)\n", __func__, freq_hz);
594 if (WaitForLock(priv) == 1)
619 ret = xc_write_reg(priv, 0x000f, 0x8081);
633 xc5000_assign_firmware(priv->
chip_id);
659 ret = xc_load_i2c_sequence(fe, fw->
data);
661 ret = xc_set_xtal(fe);
673 static void xc_debug_dump(
struct xc5000_priv *priv)
676 u32 freq_error_hz = 0;
678 u32 hsync_freq_hz = 0;
683 u8 hw_majorversion = 0, hw_minorversion = 0;
684 u8 fw_majorversion = 0, fw_minorversion = 0;
685 u16 fw_buildversion = 0;
694 xc_get_ADC_Envelope(priv, &adc_envelope);
695 dprintk(1,
"*** ADC envelope (0-1023) = %d\n", adc_envelope);
697 xc_get_frequency_error(priv, &freq_error_hz);
698 dprintk(1,
"*** Frequency error = %d Hz\n", freq_error_hz);
700 xc_get_lock_status(priv, &lock_status);
701 dprintk(1,
"*** Lock status (0-Wait, 1-Locked, 2-No-signal) = %d\n",
704 xc_get_version(priv, &hw_majorversion, &hw_minorversion,
705 &fw_majorversion, &fw_minorversion);
706 xc_get_buildversion(priv, &fw_buildversion);
707 dprintk(1,
"*** HW: V%d.%d, FW: V %d.%d.%d\n",
708 hw_majorversion, hw_minorversion,
709 fw_majorversion, fw_minorversion, fw_buildversion);
711 xc_get_hsync_freq(priv, &hsync_freq_hz);
712 dprintk(1,
"*** Horizontal sync frequency = %d Hz\n", hsync_freq_hz);
714 xc_get_frame_lines(priv, &frame_lines);
715 dprintk(1,
"*** Frame lines = %d\n", frame_lines);
717 xc_get_quality(priv, &quality);
718 dprintk(1,
"*** Quality (0:<8dB, 7:>56dB) = %d\n", quality & 0x07);
720 xc_get_analogsnr(priv, &snr);
721 dprintk(1,
"*** Unweighted analog SNR = %d dB\n", snr & 0x3f);
723 xc_get_totalgain(priv, &totalgain);
724 dprintk(1,
"*** Total gain = %d.%d dB\n", totalgain / 256,
725 (totalgain % 256) * 100 / 256);
729 dprintk(1,
"*** PLL lock status = 0x%04x\n", regval);
742 dprintk(1,
"Unable to load firmware and init tuner\n");
746 dprintk(1,
"%s() frequency=%d (Hz)\n", __func__, freq);
750 dprintk(1,
"%s() VSB modulation\n", __func__);
752 priv->
freq_hz = freq - 1750000;
756 dprintk(1,
"%s() QAM modulation\n", __func__);
758 priv->
freq_hz = freq - 1750000;
769 dprintk(1,
"%s() OFDM\n", __func__);
773 priv->
freq_hz = freq - 1750000;
777 priv->
freq_hz = freq - 2250000;
781 priv->
freq_hz = freq - 2750000;
790 dprintk(1,
"%s() QAM modulation\n", __func__);
794 priv->
freq_hz = freq - 1750000;
796 }
else if (bw <= 7000000) {
798 priv->
freq_hz = freq - 2250000;
802 priv->
freq_hz = freq - 2750000;
805 dprintk(1,
"%s() Bandwidth %dMHz (%d)\n", __func__,
813 dprintk(1,
"%s() frequency=%d (compensated to %d)\n",
814 __func__, freq, priv->
freq_hz);
816 ret = xc_SetSignalSource(priv, priv->
rf_mode);
819 "xc5000: xc_SetSignalSource(%d) failed\n",
824 ret = xc_SetTVStandard(priv,
832 ret = xc_set_IF_frequency(priv, priv->
if_khz);
851 static int xc5000_is_firmware_loaded(
struct dvb_frontend *fe)
865 dprintk(1,
"%s() returns %s id = 0x%x\n", __func__,
877 dprintk(1,
"%s() frequency=%d (in units of 62.5khz)\n",
932 ret = xc_SetSignalSource(priv, priv->
rf_mode);
935 "xc5000: xc_SetSignalSource(%d) failed\n",
940 ret = xc_SetTVStandard(priv,
958 if (pll_lock_status > 63) {
960 dprintk(1,
"xc5000: PLL not locked (0x%x). Reloading...\n",
973 static int xc5000_set_radio_freq(
struct dvb_frontend *fe,
980 dprintk(1,
"%s() frequency=%d (in units of khz)\n",
984 dprintk(1,
"%s() radio input not configured\n", __func__);
995 dprintk(1,
"%s() unknown radio input %d\n", __func__,
1004 ret = xc_SetTVStandard(priv, XC5000_Standard[radio_input].VideoMode,
1005 XC5000_Standard[radio_input].AudioMode);
1012 ret = xc_SetSignalSource(priv, priv->
rf_mode);
1015 "xc5000: xc_SetSignalSource(%d) failed\n",
1031 static int xc5000_set_analog_params(
struct dvb_frontend *fe,
1041 dprintk(1,
"Unable to load firmware and init tuner\n");
1045 switch (params->
mode) {
1047 ret = xc5000_set_radio_freq(fe, params);
1051 ret = xc5000_set_tv_freq(fe, params);
1062 dprintk(1,
"%s()\n", __func__);
1067 static int xc5000_get_if_frequency(
struct dvb_frontend *fe,
u32 *freq)
1070 dprintk(1,
"%s()\n", __func__);
1071 *freq = priv->
if_khz * 1000;
1078 dprintk(1,
"%s()\n", __func__);
1087 u16 lock_status = 0;
1089 xc_get_lock_status(priv, &lock_status);
1091 dprintk(1,
"%s() lock_status = 0x%08x\n", __func__, lock_status);
1093 *status = lock_status;
1102 u16 pll_lock_status;
1109 ret = xc5000_fwupload(fe);
1118 dprintk(1,
"%s() FW checksum reading failed.\n",
1124 dprintk(1,
"%s() FW checksum failed = 0x%04x\n",
1131 ret |= xc_initialize(priv);
1145 dprintk(1,
"%s() FW failed reading init status.\n",
1151 dprintk(1,
"%s() FW init status failed = 0x%04x\n", __func__, fw_ck);
1159 if (pll_lock_status > 63) {
1177 dprintk(1,
"%s()\n", __func__);
1186 ret = xc5000_TunerReset(fe);
1189 "xc5000: %s() unable to shutdown tuner\n",
1199 dprintk(1,
"%s()\n", __func__);
1207 xc_debug_dump(priv);
1216 dprintk(1,
"%s()\n", __func__);
1230 static int xc5000_set_config(
struct dvb_frontend *fe,
void *priv_cfg)
1235 dprintk(1,
"%s()\n", __func__);
1249 .name =
"Xceive XC5000",
1250 .frequency_min = 1000000,
1251 .frequency_max = 1023000000,
1252 .frequency_step = 50000,
1255 .release = xc5000_release,
1256 .init = xc5000_init,
1257 .sleep = xc5000_sleep,
1259 .set_config = xc5000_set_config,
1260 .set_params = xc5000_set_params,
1261 .set_analog_params = xc5000_set_analog_params,
1262 .get_frequency = xc5000_get_frequency,
1263 .get_if_frequency = xc5000_get_if_frequency,
1264 .get_bandwidth = xc5000_get_bandwidth,
1265 .get_status = xc5000_get_status
1276 dprintk(1,
"%s(%d-%04x)\n", __func__,
1277 i2c ? i2c_adapter_id(i2c) : -1,
1329 "xc5000: Successfully identified at address 0x%02x\n",
1332 "xc5000: Firmware has been loaded previously\n");
1336 "xc5000: Successfully identified at address 0x%02x\n",
1339 "xc5000: Firmware has not been loaded previously\n");
1343 "xc5000: Device not found at addr 0x%02x (0x%x)\n",
1350 memcpy(&fe->
ops.tuner_ops, &xc5000_tuner_ops,