]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blame - drivers/media/common/tuners/xc5000.c
[media] xc5000: remove static dependencies on xc5000 created by previous changesets
[mirror_ubuntu-hirsute-kernel.git] / drivers / media / common / tuners / xc5000.c
CommitLineData
aacb9d31
ST
1/*
2 * Driver for Xceive XC5000 "QAM/8VSB single chip tuner"
3 *
4 * Copyright (c) 2007 Xceive Corporation
6d897616 5 * Copyright (c) 2007 Steven Toth <stoth@linuxtv.org>
e80858e8 6 * Copyright (c) 2009 Devin Heitmueller <dheitmueller@kernellabs.com>
aacb9d31
ST
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 *
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 */
23
24#include <linux/module.h>
25#include <linux/moduleparam.h>
4917019d 26#include <linux/videodev2.h>
aacb9d31
ST
27#include <linux/delay.h>
28#include <linux/dvb/frontend.h>
29#include <linux/i2c.h>
30
31#include "dvb_frontend.h"
32
33#include "xc5000.h"
89fd2854 34#include "tuner-i2c.h"
aacb9d31
ST
35
36static int debug;
37module_param(debug, int, 0644);
38MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
39
b6bd5eb8
DH
40static int no_poweroff;
41module_param(no_poweroff, int, 0644);
42MODULE_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");
45
89fd2854
MK
46static DEFINE_MUTEX(xc5000_list_mutex);
47static LIST_HEAD(hybrid_tuner_instance_list);
48
8f3cd530 49#define dprintk(level, fmt, arg...) if (debug >= level) \
aacb9d31
ST
50 printk(KERN_INFO "%s: " fmt, "xc5000", ## arg)
51
ffb41234 52struct xc5000_priv {
89fd2854
MK
53 struct tuner_i2c_props i2c_props;
54 struct list_head hybrid_tuner_instance_list;
ffb41234 55
2a6003c2 56 u32 if_khz;
ffb41234
MK
57 u32 freq_hz;
58 u32 bandwidth;
59 u8 video_standard;
60 u8 rf_mode;
496e9057 61 u8 radio_input;
76efb0ba
MK
62
63 struct xc5000_fw_cfg *fw;
ffb41234
MK
64};
65
aacb9d31 66/* Misc Defines */
724dcbfa 67#define MAX_TV_STANDARD 24
aacb9d31
ST
68#define XC_MAX_I2C_WRITE_LENGTH 64
69
70/* Signal Types */
71#define XC_RF_MODE_AIR 0
72#define XC_RF_MODE_CABLE 1
73
74/* Result codes */
75#define XC_RESULT_SUCCESS 0
76#define XC_RESULT_RESET_FAILURE 1
77#define XC_RESULT_I2C_WRITE_FAILURE 2
78#define XC_RESULT_I2C_READ_FAILURE 3
79#define XC_RESULT_OUT_OF_RANGE 5
80
27c685a4
ST
81/* Product id */
82#define XC_PRODUCT_ID_FW_NOT_LOADED 0x2000
83#define XC_PRODUCT_ID_FW_LOADED 0x1388
84
aacb9d31
ST
85/* Registers */
86#define XREG_INIT 0x00
87#define XREG_VIDEO_MODE 0x01
88#define XREG_AUDIO_MODE 0x02
89#define XREG_RF_FREQ 0x03
90#define XREG_D_CODE 0x04
91#define XREG_IF_OUT 0x05
92#define XREG_SEEK_MODE 0x07
7f05b530 93#define XREG_POWER_DOWN 0x0A /* Obsolete */
724dcbfa
DB
94/* Set the output amplitude - SIF for analog, DTVP/DTVN for digital */
95#define XREG_OUTPUT_AMP 0x0B
aacb9d31
ST
96#define XREG_SIGNALSOURCE 0x0D /* 0=Air, 1=Cable */
97#define XREG_SMOOTHEDCVBS 0x0E
98#define XREG_XTALFREQ 0x0F
81c4dfe7 99#define XREG_FINERFREQ 0x10
aacb9d31
ST
100#define XREG_DDIMODE 0x11
101
102#define XREG_ADC_ENV 0x00
103#define XREG_QUALITY 0x01
104#define XREG_FRAME_LINES 0x02
105#define XREG_HSYNC_FREQ 0x03
106#define XREG_LOCK 0x04
107#define XREG_FREQ_ERROR 0x05
108#define XREG_SNR 0x06
109#define XREG_VERSION 0x07
110#define XREG_PRODUCT_ID 0x08
111#define XREG_BUSY 0x09
bae7b7d7 112#define XREG_BUILD 0x0D
aacb9d31
ST
113
114/*
115 Basic firmware description. This will remain with
116 the driver for documentation purposes.
117
118 This represents an I2C firmware file encoded as a
119 string of unsigned char. Format is as follows:
120
121 char[0 ]=len0_MSB -> len = len_MSB * 256 + len_LSB
122 char[1 ]=len0_LSB -> length of first write transaction
123 char[2 ]=data0 -> first byte to be sent
124 char[3 ]=data1
125 char[4 ]=data2
126 char[ ]=...
127 char[M ]=dataN -> last byte to be sent
128 char[M+1]=len1_MSB -> len = len_MSB * 256 + len_LSB
129 char[M+2]=len1_LSB -> length of second write transaction
130 char[M+3]=data0
131 char[M+4]=data1
132 ...
133 etc.
134
135 The [len] value should be interpreted as follows:
136
137 len= len_MSB _ len_LSB
138 len=1111_1111_1111_1111 : End of I2C_SEQUENCE
139 len=0000_0000_0000_0000 : Reset command: Do hardware reset
140 len=0NNN_NNNN_NNNN_NNNN : Normal transaction: number of bytes = {1:32767)
141 len=1WWW_WWWW_WWWW_WWWW : Wait command: wait for {1:32767} ms
142
143 For the RESET and WAIT commands, the two following bytes will contain
144 immediately the length of the following transaction.
145
146*/
8f3cd530 147struct XC_TV_STANDARD {
aacb9d31 148 char *Name;
e12671cf
ST
149 u16 AudioMode;
150 u16 VideoMode;
8f3cd530 151};
aacb9d31
ST
152
153/* Tuner standards */
27c685a4
ST
154#define MN_NTSC_PAL_BTSC 0
155#define MN_NTSC_PAL_A2 1
156#define MN_NTSC_PAL_EIAJ 2
157#define MN_NTSC_PAL_Mono 3
158#define BG_PAL_A2 4
159#define BG_PAL_NICAM 5
160#define BG_PAL_MONO 6
161#define I_PAL_NICAM 7
162#define I_PAL_NICAM_MONO 8
163#define DK_PAL_A2 9
164#define DK_PAL_NICAM 10
165#define DK_PAL_MONO 11
166#define DK_SECAM_A2DK1 12
167#define DK_SECAM_A2LDK3 13
168#define DK_SECAM_A2MONO 14
169#define L_SECAM_NICAM 15
170#define LC_SECAM_NICAM 16
171#define DTV6 17
172#define DTV8 18
173#define DTV7_8 19
174#define DTV7 20
175#define FM_Radio_INPUT2 21
176#define FM_Radio_INPUT1 22
724dcbfa 177#define FM_Radio_INPUT1_MONO 23
aacb9d31 178
8f3cd530 179static struct XC_TV_STANDARD XC5000_Standard[MAX_TV_STANDARD] = {
aacb9d31
ST
180 {"M/N-NTSC/PAL-BTSC", 0x0400, 0x8020},
181 {"M/N-NTSC/PAL-A2", 0x0600, 0x8020},
182 {"M/N-NTSC/PAL-EIAJ", 0x0440, 0x8020},
183 {"M/N-NTSC/PAL-Mono", 0x0478, 0x8020},
184 {"B/G-PAL-A2", 0x0A00, 0x8049},
185 {"B/G-PAL-NICAM", 0x0C04, 0x8049},
186 {"B/G-PAL-MONO", 0x0878, 0x8059},
187 {"I-PAL-NICAM", 0x1080, 0x8009},
188 {"I-PAL-NICAM-MONO", 0x0E78, 0x8009},
189 {"D/K-PAL-A2", 0x1600, 0x8009},
190 {"D/K-PAL-NICAM", 0x0E80, 0x8009},
191 {"D/K-PAL-MONO", 0x1478, 0x8009},
192 {"D/K-SECAM-A2 DK1", 0x1200, 0x8009},
8f3cd530 193 {"D/K-SECAM-A2 L/DK3", 0x0E00, 0x8009},
aacb9d31
ST
194 {"D/K-SECAM-A2 MONO", 0x1478, 0x8009},
195 {"L-SECAM-NICAM", 0x8E82, 0x0009},
196 {"L'-SECAM-NICAM", 0x8E82, 0x4009},
197 {"DTV6", 0x00C0, 0x8002},
198 {"DTV8", 0x00C0, 0x800B},
199 {"DTV7/8", 0x00C0, 0x801B},
200 {"DTV7", 0x00C0, 0x8007},
201 {"FM Radio-INPUT2", 0x9802, 0x9002},
724dcbfa
DB
202 {"FM Radio-INPUT1", 0x0208, 0x9002},
203 {"FM Radio-INPUT1_MONO", 0x0278, 0x9002}
aacb9d31
ST
204};
205
ddea427f
MK
206
207struct xc5000_fw_cfg {
208 char *name;
209 u16 size;
210};
211
212static struct xc5000_fw_cfg xc5000a_1_6_114 = {
76efb0ba
MK
213 .name = "dvb-fe-xc5000-1.6.114.fw",
214 .size = 12401,
215};
216
ddea427f 217static struct xc5000_fw_cfg xc5000c_41_024_5_31875 = {
d8398805
MK
218 .name = "dvb-fe-xc5000c-41.024.5-31875.fw",
219 .size = 16503,
220};
221
ddea427f
MK
222static inline struct xc5000_fw_cfg *xc5000_assign_firmware(int fw)
223{
224 switch (fw) {
225 default:
226 case XC5000_FW_A_1_6_114:
227 return &xc5000a_1_6_114;
228 case XC5000_FW_C_41_024_5_31875:
229 return &xc5000c_41_024_5_31875;
230 }
231}
232
8e4c6797 233static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe);
91bd625e 234static int xc5000_is_firmware_loaded(struct dvb_frontend *fe);
bdd33563 235static int xc5000_readreg(struct xc5000_priv *priv, u16 reg, u16 *val);
91bd625e 236static int xc5000_TunerReset(struct dvb_frontend *fe);
aacb9d31 237
e12671cf 238static int xc_send_i2c_data(struct xc5000_priv *priv, u8 *buf, int len)
aacb9d31 239{
d7800d4e
DH
240 struct i2c_msg msg = { .addr = priv->i2c_props.addr,
241 .flags = 0, .buf = buf, .len = len };
242
243 if (i2c_transfer(priv->i2c_props.adap, &msg, 1) != 1) {
244 printk(KERN_ERR "xc5000: I2C write failed (len=%i)\n", len);
245 return XC_RESULT_I2C_WRITE_FAILURE;
246 }
247 return XC_RESULT_SUCCESS;
aacb9d31
ST
248}
249
1cdffda7 250#if 0
bdd33563
DH
251/* This routine is never used because the only time we read data from the
252 i2c bus is when we read registers, and we want that to be an atomic i2c
253 transaction in case we are on a multi-master bus */
e12671cf 254static int xc_read_i2c_data(struct xc5000_priv *priv, u8 *buf, int len)
aacb9d31 255{
bdd33563
DH
256 struct i2c_msg msg = { .addr = priv->i2c_props.addr,
257 .flags = I2C_M_RD, .buf = buf, .len = len };
258
259 if (i2c_transfer(priv->i2c_props.adap, &msg, 1) != 1) {
260 printk(KERN_ERR "xc5000 I2C read failed (len=%i)\n", len);
261 return -EREMOTEIO;
262 }
263 return 0;
aacb9d31 264}
1cdffda7 265#endif
aacb9d31 266
4743319f
DB
267static int xc5000_readreg(struct xc5000_priv *priv, u16 reg, u16 *val)
268{
269 u8 buf[2] = { reg >> 8, reg & 0xff };
270 u8 bval[2] = { 0, 0 };
271 struct i2c_msg msg[2] = {
272 { .addr = priv->i2c_props.addr,
273 .flags = 0, .buf = &buf[0], .len = 2 },
274 { .addr = priv->i2c_props.addr,
275 .flags = I2C_M_RD, .buf = &bval[0], .len = 2 },
276 };
277
278 if (i2c_transfer(priv->i2c_props.adap, msg, 2) != 2) {
279 printk(KERN_WARNING "xc5000: I2C read failed\n");
280 return -EREMOTEIO;
281 }
282
283 *val = (bval[0] << 8) | bval[1];
284 return XC_RESULT_SUCCESS;
285}
286
e12671cf 287static void xc_wait(int wait_ms)
aacb9d31 288{
e12671cf 289 msleep(wait_ms);
aacb9d31
ST
290}
291
91bd625e 292static int xc5000_TunerReset(struct dvb_frontend *fe)
aacb9d31
ST
293{
294 struct xc5000_priv *priv = fe->tuner_priv;
295 int ret;
296
271ddbf7 297 dprintk(1, "%s()\n", __func__);
aacb9d31 298
d7cba043
MK
299 if (fe->callback) {
300 ret = fe->callback(((fe->dvb) && (fe->dvb->priv)) ?
30650961
MK
301 fe->dvb->priv :
302 priv->i2c_props.adap->algo_data,
d7cba043 303 DVB_FRONTEND_COMPONENT_TUNER,
30650961 304 XC5000_TUNER_RESET, 0);
91bd625e 305 if (ret) {
aacb9d31 306 printk(KERN_ERR "xc5000: reset failed\n");
91bd625e
DH
307 return XC_RESULT_RESET_FAILURE;
308 }
309 } else {
27c685a4 310 printk(KERN_ERR "xc5000: no tuner reset callback function, fatal\n");
91bd625e
DH
311 return XC_RESULT_RESET_FAILURE;
312 }
313 return XC_RESULT_SUCCESS;
aacb9d31
ST
314}
315
e12671cf 316static int xc_write_reg(struct xc5000_priv *priv, u16 regAddr, u16 i2cData)
aacb9d31 317{
e12671cf 318 u8 buf[4];
a37791c5 319 int WatchDogTimer = 100;
aacb9d31
ST
320 int result;
321
322 buf[0] = (regAddr >> 8) & 0xFF;
323 buf[1] = regAddr & 0xFF;
324 buf[2] = (i2cData >> 8) & 0xFF;
325 buf[3] = i2cData & 0xFF;
326 result = xc_send_i2c_data(priv, buf, 4);
e12671cf 327 if (result == XC_RESULT_SUCCESS) {
aacb9d31
ST
328 /* wait for busy flag to clear */
329 while ((WatchDogTimer > 0) && (result == XC_RESULT_SUCCESS)) {
1cdffda7 330 result = xc5000_readreg(priv, XREG_BUSY, (u16 *)buf);
aacb9d31 331 if (result == XC_RESULT_SUCCESS) {
4743319f
DB
332 if ((buf[0] == 0) && (buf[1] == 0)) {
333 /* busy flag cleared */
aacb9d31 334 break;
4743319f
DB
335 } else {
336 xc_wait(5); /* wait 5 ms */
337 WatchDogTimer--;
aacb9d31
ST
338 }
339 }
340 }
341 }
342 if (WatchDogTimer < 0)
343 result = XC_RESULT_I2C_WRITE_FAILURE;
344
345 return result;
346}
347
c63e87e9 348static int xc_load_i2c_sequence(struct dvb_frontend *fe, const u8 *i2c_sequence)
aacb9d31
ST
349{
350 struct xc5000_priv *priv = fe->tuner_priv;
351
352 int i, nbytes_to_send, result;
353 unsigned int len, pos, index;
e12671cf 354 u8 buf[XC_MAX_I2C_WRITE_LENGTH];
aacb9d31 355
8f3cd530
ST
356 index = 0;
357 while ((i2c_sequence[index] != 0xFF) ||
358 (i2c_sequence[index + 1] != 0xFF)) {
359 len = i2c_sequence[index] * 256 + i2c_sequence[index+1];
e12671cf 360 if (len == 0x0000) {
aacb9d31 361 /* RESET command */
91bd625e 362 result = xc5000_TunerReset(fe);
aacb9d31 363 index += 2;
e12671cf 364 if (result != XC_RESULT_SUCCESS)
aacb9d31
ST
365 return result;
366 } else if (len & 0x8000) {
367 /* WAIT command */
368 xc_wait(len & 0x7FFF);
369 index += 2;
370 } else {
371 /* Send i2c data whilst ensuring individual transactions
372 * do not exceed XC_MAX_I2C_WRITE_LENGTH bytes.
373 */
374 index += 2;
375 buf[0] = i2c_sequence[index];
376 buf[1] = i2c_sequence[index + 1];
377 pos = 2;
378 while (pos < len) {
8f3cd530
ST
379 if ((len - pos) > XC_MAX_I2C_WRITE_LENGTH - 2)
380 nbytes_to_send =
381 XC_MAX_I2C_WRITE_LENGTH;
382 else
aacb9d31 383 nbytes_to_send = (len - pos + 2);
8f3cd530
ST
384 for (i = 2; i < nbytes_to_send; i++) {
385 buf[i] = i2c_sequence[index + pos +
386 i - 2];
aacb9d31 387 }
8f3cd530
ST
388 result = xc_send_i2c_data(priv, buf,
389 nbytes_to_send);
aacb9d31 390
e12671cf 391 if (result != XC_RESULT_SUCCESS)
aacb9d31
ST
392 return result;
393
394 pos += nbytes_to_send - 2;
395 }
396 index += len;
397 }
398 }
399 return XC_RESULT_SUCCESS;
400}
401
e12671cf 402static int xc_initialize(struct xc5000_priv *priv)
aacb9d31 403{
271ddbf7 404 dprintk(1, "%s()\n", __func__);
aacb9d31
ST
405 return xc_write_reg(priv, XREG_INIT, 0);
406}
407
e12671cf
ST
408static int xc_SetTVStandard(struct xc5000_priv *priv,
409 u16 VideoMode, u16 AudioMode)
aacb9d31
ST
410{
411 int ret;
271ddbf7 412 dprintk(1, "%s(0x%04x,0x%04x)\n", __func__, VideoMode, AudioMode);
aacb9d31 413 dprintk(1, "%s() Standard = %s\n",
271ddbf7 414 __func__,
aacb9d31
ST
415 XC5000_Standard[priv->video_standard].Name);
416
417 ret = xc_write_reg(priv, XREG_VIDEO_MODE, VideoMode);
418 if (ret == XC_RESULT_SUCCESS)
419 ret = xc_write_reg(priv, XREG_AUDIO_MODE, AudioMode);
420
421 return ret;
422}
423
e12671cf 424static int xc_SetSignalSource(struct xc5000_priv *priv, u16 rf_mode)
aacb9d31 425{
271ddbf7 426 dprintk(1, "%s(%d) Source = %s\n", __func__, rf_mode,
aacb9d31
ST
427 rf_mode == XC_RF_MODE_AIR ? "ANTENNA" : "CABLE");
428
8f3cd530 429 if ((rf_mode != XC_RF_MODE_AIR) && (rf_mode != XC_RF_MODE_CABLE)) {
aacb9d31
ST
430 rf_mode = XC_RF_MODE_CABLE;
431 printk(KERN_ERR
432 "%s(), Invalid mode, defaulting to CABLE",
271ddbf7 433 __func__);
aacb9d31
ST
434 }
435 return xc_write_reg(priv, XREG_SIGNALSOURCE, rf_mode);
436}
437
e12671cf 438static const struct dvb_tuner_ops xc5000_tuner_ops;
aacb9d31 439
e12671cf
ST
440static int xc_set_RF_frequency(struct xc5000_priv *priv, u32 freq_hz)
441{
442 u16 freq_code;
aacb9d31 443
271ddbf7 444 dprintk(1, "%s(%u)\n", __func__, freq_hz);
aacb9d31 445
e12671cf
ST
446 if ((freq_hz > xc5000_tuner_ops.info.frequency_max) ||
447 (freq_hz < xc5000_tuner_ops.info.frequency_min))
aacb9d31
ST
448 return XC_RESULT_OUT_OF_RANGE;
449
e12671cf
ST
450 freq_code = (u16)(freq_hz / 15625);
451
81c4dfe7
DH
452 /* Starting in firmware version 1.1.44, Xceive recommends using the
453 FINERFREQ for all normal tuning (the doc indicates reg 0x03 should
454 only be used for fast scanning for channel lock) */
455 return xc_write_reg(priv, XREG_FINERFREQ, freq_code);
aacb9d31
ST
456}
457
aacb9d31 458
e12671cf
ST
459static int xc_set_IF_frequency(struct xc5000_priv *priv, u32 freq_khz)
460{
461 u32 freq_code = (freq_khz * 1024)/1000;
462 dprintk(1, "%s(freq_khz = %d) freq_code = 0x%x\n",
271ddbf7 463 __func__, freq_khz, freq_code);
aacb9d31 464
e12671cf 465 return xc_write_reg(priv, XREG_IF_OUT, freq_code);
aacb9d31
ST
466}
467
aacb9d31 468
e12671cf 469static int xc_get_ADC_Envelope(struct xc5000_priv *priv, u16 *adc_envelope)
aacb9d31 470{
bdd33563 471 return xc5000_readreg(priv, XREG_ADC_ENV, adc_envelope);
aacb9d31
ST
472}
473
e12671cf 474static int xc_get_frequency_error(struct xc5000_priv *priv, u32 *freq_error_hz)
aacb9d31
ST
475{
476 int result;
e12671cf 477 u16 regData;
aacb9d31
ST
478 u32 tmp;
479
bdd33563 480 result = xc5000_readreg(priv, XREG_FREQ_ERROR, &regData);
7988fc21 481 if (result != XC_RESULT_SUCCESS)
aacb9d31
ST
482 return result;
483
484 tmp = (u32)regData;
e12671cf 485 (*freq_error_hz) = (tmp * 15625) / 1000;
aacb9d31
ST
486 return result;
487}
488
e12671cf 489static int xc_get_lock_status(struct xc5000_priv *priv, u16 *lock_status)
aacb9d31 490{
bdd33563 491 return xc5000_readreg(priv, XREG_LOCK, lock_status);
aacb9d31
ST
492}
493
e12671cf
ST
494static int xc_get_version(struct xc5000_priv *priv,
495 u8 *hw_majorversion, u8 *hw_minorversion,
496 u8 *fw_majorversion, u8 *fw_minorversion)
aacb9d31 497{
e12671cf 498 u16 data;
aacb9d31
ST
499 int result;
500
bdd33563 501 result = xc5000_readreg(priv, XREG_VERSION, &data);
7988fc21 502 if (result != XC_RESULT_SUCCESS)
aacb9d31
ST
503 return result;
504
e12671cf
ST
505 (*hw_majorversion) = (data >> 12) & 0x0F;
506 (*hw_minorversion) = (data >> 8) & 0x0F;
507 (*fw_majorversion) = (data >> 4) & 0x0F;
508 (*fw_minorversion) = data & 0x0F;
aacb9d31
ST
509
510 return 0;
511}
512
bae7b7d7
DH
513static int xc_get_buildversion(struct xc5000_priv *priv, u16 *buildrev)
514{
515 return xc5000_readreg(priv, XREG_BUILD, buildrev);
516}
517
e12671cf 518static int xc_get_hsync_freq(struct xc5000_priv *priv, u32 *hsync_freq_hz)
aacb9d31 519{
e12671cf 520 u16 regData;
aacb9d31
ST
521 int result;
522
bdd33563 523 result = xc5000_readreg(priv, XREG_HSYNC_FREQ, &regData);
7988fc21 524 if (result != XC_RESULT_SUCCESS)
aacb9d31
ST
525 return result;
526
527 (*hsync_freq_hz) = ((regData & 0x0fff) * 763)/100;
528 return result;
529}
530
e12671cf 531static int xc_get_frame_lines(struct xc5000_priv *priv, u16 *frame_lines)
aacb9d31 532{
bdd33563 533 return xc5000_readreg(priv, XREG_FRAME_LINES, frame_lines);
aacb9d31
ST
534}
535
e12671cf 536static int xc_get_quality(struct xc5000_priv *priv, u16 *quality)
aacb9d31 537{
bdd33563 538 return xc5000_readreg(priv, XREG_QUALITY, quality);
aacb9d31
ST
539}
540
e12671cf 541static u16 WaitForLock(struct xc5000_priv *priv)
aacb9d31 542{
e12671cf 543 u16 lockState = 0;
aacb9d31 544 int watchDogCount = 40;
e12671cf
ST
545
546 while ((lockState == 0) && (watchDogCount > 0)) {
aacb9d31 547 xc_get_lock_status(priv, &lockState);
e12671cf 548 if (lockState != 1) {
aacb9d31
ST
549 xc_wait(5);
550 watchDogCount--;
551 }
552 }
553 return lockState;
554}
555
a78baacf
DH
556#define XC_TUNE_ANALOG 0
557#define XC_TUNE_DIGITAL 1
558static int xc_tune_channel(struct xc5000_priv *priv, u32 freq_hz, int mode)
aacb9d31
ST
559{
560 int found = 0;
561
271ddbf7 562 dprintk(1, "%s(%u)\n", __func__, freq_hz);
aacb9d31 563
e12671cf 564 if (xc_set_RF_frequency(priv, freq_hz) != XC_RESULT_SUCCESS)
aacb9d31
ST
565 return 0;
566
a78baacf
DH
567 if (mode == XC_TUNE_ANALOG) {
568 if (WaitForLock(priv) == 1)
569 found = 1;
570 }
aacb9d31
ST
571
572 return found;
573}
574
aacb9d31 575
8f3cd530 576static int xc5000_fwupload(struct dvb_frontend *fe)
aacb9d31
ST
577{
578 struct xc5000_priv *priv = fe->tuner_priv;
579 const struct firmware *fw;
580 int ret;
581
e12671cf
ST
582 /* request the firmware, this will block and timeout */
583 printk(KERN_INFO "xc5000: waiting for firmware upload (%s)...\n",
76efb0ba 584 priv->fw->name);
e12671cf 585
76efb0ba 586 ret = request_firmware(&fw, priv->fw->name,
e9785250 587 priv->i2c_props.adap->dev.parent);
aacb9d31
ST
588 if (ret) {
589 printk(KERN_ERR "xc5000: Upload failed. (file not found?)\n");
590 ret = XC_RESULT_RESET_FAILURE;
5ea60531 591 goto out;
aacb9d31 592 } else {
34a0db92 593 printk(KERN_DEBUG "xc5000: firmware read %Zu bytes.\n",
3f51451b 594 fw->size);
aacb9d31
ST
595 ret = XC_RESULT_SUCCESS;
596 }
597
76efb0ba 598 if (fw->size != priv->fw->size) {
aacb9d31
ST
599 printk(KERN_ERR "xc5000: firmware incorrect size\n");
600 ret = XC_RESULT_RESET_FAILURE;
601 } else {
34a0db92 602 printk(KERN_INFO "xc5000: firmware uploading...\n");
8f3cd530 603 ret = xc_load_i2c_sequence(fe, fw->data);
34a0db92 604 printk(KERN_INFO "xc5000: firmware upload complete...\n");
aacb9d31
ST
605 }
606
5ea60531 607out:
aacb9d31
ST
608 release_firmware(fw);
609 return ret;
610}
611
e12671cf 612static void xc_debug_dump(struct xc5000_priv *priv)
aacb9d31 613{
e12671cf
ST
614 u16 adc_envelope;
615 u32 freq_error_hz = 0;
616 u16 lock_status;
617 u32 hsync_freq_hz = 0;
618 u16 frame_lines;
619 u16 quality;
620 u8 hw_majorversion = 0, hw_minorversion = 0;
621 u8 fw_majorversion = 0, fw_minorversion = 0;
bae7b7d7 622 u16 fw_buildversion = 0;
aacb9d31
ST
623
624 /* Wait for stats to stabilize.
625 * Frame Lines needs two frame times after initial lock
626 * before it is valid.
627 */
e12671cf 628 xc_wait(100);
aacb9d31 629
e12671cf
ST
630 xc_get_ADC_Envelope(priv, &adc_envelope);
631 dprintk(1, "*** ADC envelope (0-1023) = %d\n", adc_envelope);
aacb9d31 632
e12671cf
ST
633 xc_get_frequency_error(priv, &freq_error_hz);
634 dprintk(1, "*** Frequency error = %d Hz\n", freq_error_hz);
aacb9d31 635
e12671cf
ST
636 xc_get_lock_status(priv, &lock_status);
637 dprintk(1, "*** Lock status (0-Wait, 1-Locked, 2-No-signal) = %d\n",
aacb9d31
ST
638 lock_status);
639
640 xc_get_version(priv, &hw_majorversion, &hw_minorversion,
e12671cf 641 &fw_majorversion, &fw_minorversion);
bae7b7d7
DH
642 xc_get_buildversion(priv, &fw_buildversion);
643 dprintk(1, "*** HW: V%02x.%02x, FW: V%02x.%02x.%04x\n",
aacb9d31 644 hw_majorversion, hw_minorversion,
bae7b7d7 645 fw_majorversion, fw_minorversion, fw_buildversion);
aacb9d31 646
e12671cf
ST
647 xc_get_hsync_freq(priv, &hsync_freq_hz);
648 dprintk(1, "*** Horizontal sync frequency = %d Hz\n", hsync_freq_hz);
aacb9d31 649
e12671cf
ST
650 xc_get_frame_lines(priv, &frame_lines);
651 dprintk(1, "*** Frame lines = %d\n", frame_lines);
aacb9d31 652
e12671cf
ST
653 xc_get_quality(priv, &quality);
654 dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
aacb9d31
ST
655}
656
14d24d14 657static int xc5000_set_params(struct dvb_frontend *fe)
aacb9d31 658{
fd66c45d 659 int ret, b;
aacb9d31 660 struct xc5000_priv *priv = fe->tuner_priv;
fd66c45d
MCC
661 u32 bw = fe->dtv_property_cache.bandwidth_hz;
662 u32 freq = fe->dtv_property_cache.frequency;
663 u32 delsys = fe->dtv_property_cache.delivery_system;
aacb9d31 664
760c466c
DH
665 if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
666 if (xc_load_fw_and_init_tuner(fe) != XC_RESULT_SUCCESS) {
667 dprintk(1, "Unable to load firmware and init tuner\n");
668 return -EINVAL;
669 }
670 }
8e4c6797 671
fd66c45d 672 dprintk(1, "%s() frequency=%d (Hz)\n", __func__, freq);
aacb9d31 673
fd66c45d
MCC
674 switch (delsys) {
675 case SYS_ATSC:
676 dprintk(1, "%s() VSB modulation\n", __func__);
677 priv->rf_mode = XC_RF_MODE_AIR;
678 priv->freq_hz = freq - 1750000;
fd66c45d
MCC
679 priv->video_standard = DTV6;
680 break;
681 case SYS_DVBC_ANNEX_B:
682 dprintk(1, "%s() QAM modulation\n", __func__);
683 priv->rf_mode = XC_RF_MODE_CABLE;
684 priv->freq_hz = freq - 1750000;
fd66c45d
MCC
685 priv->video_standard = DTV6;
686 break;
687 case SYS_DVBT:
688 case SYS_DVBT2:
6c99080d 689 dprintk(1, "%s() OFDM\n", __func__);
fd66c45d
MCC
690 switch (bw) {
691 case 6000000:
6c99080d 692 priv->video_standard = DTV6;
fd66c45d 693 priv->freq_hz = freq - 1750000;
6c99080d 694 break;
fd66c45d 695 case 7000000:
0433cd28 696 priv->video_standard = DTV7;
fd66c45d 697 priv->freq_hz = freq - 2250000;
0433cd28 698 break;
fd66c45d 699 case 8000000:
6c99080d 700 priv->video_standard = DTV8;
fd66c45d 701 priv->freq_hz = freq - 2750000;
6c99080d
DW
702 break;
703 default:
704 printk(KERN_ERR "xc5000 bandwidth not set!\n");
705 return -EINVAL;
706 }
aacb9d31 707 priv->rf_mode = XC_RF_MODE_AIR;
fd66c45d
MCC
708 case SYS_DVBC_ANNEX_A:
709 case SYS_DVBC_ANNEX_C:
710 dprintk(1, "%s() QAM modulation\n", __func__);
711 priv->rf_mode = XC_RF_MODE_CABLE;
712 if (bw <= 6000000) {
fd66c45d
MCC
713 priv->video_standard = DTV6;
714 priv->freq_hz = freq - 1750000;
715 b = 6;
716 } else if (bw <= 7000000) {
fd66c45d
MCC
717 priv->video_standard = DTV7;
718 priv->freq_hz = freq - 2250000;
719 b = 7;
720 } else {
fd66c45d
MCC
721 priv->video_standard = DTV7_8;
722 priv->freq_hz = freq - 2750000;
723 b = 8;
e80edce1 724 }
fd66c45d
MCC
725 dprintk(1, "%s() Bandwidth %dMHz (%d)\n", __func__,
726 b, bw);
727 break;
728 default:
729 printk(KERN_ERR "xc5000: delivery system is not supported!\n");
aacb9d31
ST
730 return -EINVAL;
731 }
732
fd66c45d
MCC
733 dprintk(1, "%s() frequency=%d (compensated to %d)\n",
734 __func__, freq, priv->freq_hz);
aacb9d31 735
e12671cf
ST
736 ret = xc_SetSignalSource(priv, priv->rf_mode);
737 if (ret != XC_RESULT_SUCCESS) {
738 printk(KERN_ERR
739 "xc5000: xc_SetSignalSource(%d) failed\n",
740 priv->rf_mode);
741 return -EREMOTEIO;
742 }
aacb9d31 743
e12671cf 744 ret = xc_SetTVStandard(priv,
aacb9d31
ST
745 XC5000_Standard[priv->video_standard].VideoMode,
746 XC5000_Standard[priv->video_standard].AudioMode);
e12671cf
ST
747 if (ret != XC_RESULT_SUCCESS) {
748 printk(KERN_ERR "xc5000: xc_SetTVStandard failed\n");
749 return -EREMOTEIO;
750 }
751
2a6003c2 752 ret = xc_set_IF_frequency(priv, priv->if_khz);
e12671cf
ST
753 if (ret != XC_RESULT_SUCCESS) {
754 printk(KERN_ERR "xc5000: xc_Set_IF_frequency(%d) failed\n",
2a6003c2 755 priv->if_khz);
e12671cf
ST
756 return -EIO;
757 }
758
724dcbfa
DB
759 xc_write_reg(priv, XREG_OUTPUT_AMP, 0x8a);
760
a78baacf 761 xc_tune_channel(priv, priv->freq_hz, XC_TUNE_DIGITAL);
aacb9d31 762
e12671cf
ST
763 if (debug)
764 xc_debug_dump(priv);
aacb9d31 765
c6f56e7d
MCC
766 priv->bandwidth = bw;
767
aacb9d31
ST
768 return 0;
769}
770
e470d817
ST
771static int xc5000_is_firmware_loaded(struct dvb_frontend *fe)
772{
773 struct xc5000_priv *priv = fe->tuner_priv;
774 int ret;
775 u16 id;
776
777 ret = xc5000_readreg(priv, XREG_PRODUCT_ID, &id);
778 if (ret == XC_RESULT_SUCCESS) {
779 if (id == XC_PRODUCT_ID_FW_NOT_LOADED)
780 ret = XC_RESULT_RESET_FAILURE;
781 else
782 ret = XC_RESULT_SUCCESS;
783 }
784
785 dprintk(1, "%s() returns %s id = 0x%x\n", __func__,
786 ret == XC_RESULT_SUCCESS ? "True" : "False", id);
787 return ret;
788}
789
d7009cdc 790static int xc5000_set_tv_freq(struct dvb_frontend *fe,
27c685a4
ST
791 struct analog_parameters *params)
792{
793 struct xc5000_priv *priv = fe->tuner_priv;
794 int ret;
795
27c685a4 796 dprintk(1, "%s() frequency=%d (in units of 62.5khz)\n",
271ddbf7 797 __func__, params->frequency);
27c685a4 798
1fab14ed
MCC
799 /* Fix me: it could be air. */
800 priv->rf_mode = params->mode;
801 if (params->mode > XC_RF_MODE_CABLE)
802 priv->rf_mode = XC_RF_MODE_CABLE;
27c685a4
ST
803
804 /* params->frequency is in units of 62.5khz */
805 priv->freq_hz = params->frequency * 62500;
806
807 /* FIX ME: Some video standards may have several possible audio
808 standards. We simply default to one of them here.
809 */
8f3cd530 810 if (params->std & V4L2_STD_MN) {
27c685a4
ST
811 /* default to BTSC audio standard */
812 priv->video_standard = MN_NTSC_PAL_BTSC;
813 goto tune_channel;
814 }
815
8f3cd530 816 if (params->std & V4L2_STD_PAL_BG) {
27c685a4
ST
817 /* default to NICAM audio standard */
818 priv->video_standard = BG_PAL_NICAM;
819 goto tune_channel;
820 }
821
8f3cd530 822 if (params->std & V4L2_STD_PAL_I) {
27c685a4
ST
823 /* default to NICAM audio standard */
824 priv->video_standard = I_PAL_NICAM;
825 goto tune_channel;
826 }
827
8f3cd530 828 if (params->std & V4L2_STD_PAL_DK) {
27c685a4
ST
829 /* default to NICAM audio standard */
830 priv->video_standard = DK_PAL_NICAM;
831 goto tune_channel;
832 }
833
8f3cd530 834 if (params->std & V4L2_STD_SECAM_DK) {
27c685a4
ST
835 /* default to A2 DK1 audio standard */
836 priv->video_standard = DK_SECAM_A2DK1;
837 goto tune_channel;
838 }
839
8f3cd530 840 if (params->std & V4L2_STD_SECAM_L) {
27c685a4
ST
841 priv->video_standard = L_SECAM_NICAM;
842 goto tune_channel;
843 }
844
8f3cd530 845 if (params->std & V4L2_STD_SECAM_LC) {
27c685a4
ST
846 priv->video_standard = LC_SECAM_NICAM;
847 goto tune_channel;
848 }
849
850tune_channel:
851 ret = xc_SetSignalSource(priv, priv->rf_mode);
852 if (ret != XC_RESULT_SUCCESS) {
8f3cd530 853 printk(KERN_ERR
27c685a4
ST
854 "xc5000: xc_SetSignalSource(%d) failed\n",
855 priv->rf_mode);
856 return -EREMOTEIO;
857 }
858
859 ret = xc_SetTVStandard(priv,
860 XC5000_Standard[priv->video_standard].VideoMode,
861 XC5000_Standard[priv->video_standard].AudioMode);
862 if (ret != XC_RESULT_SUCCESS) {
863 printk(KERN_ERR "xc5000: xc_SetTVStandard failed\n");
864 return -EREMOTEIO;
865 }
866
724dcbfa
DB
867 xc_write_reg(priv, XREG_OUTPUT_AMP, 0x09);
868
a78baacf 869 xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
27c685a4
ST
870
871 if (debug)
872 xc_debug_dump(priv);
873
874 return 0;
875}
876
d7009cdc
BILDB
877static int xc5000_set_radio_freq(struct dvb_frontend *fe,
878 struct analog_parameters *params)
879{
880 struct xc5000_priv *priv = fe->tuner_priv;
881 int ret = -EINVAL;
496e9057 882 u8 radio_input;
d7009cdc
BILDB
883
884 dprintk(1, "%s() frequency=%d (in units of khz)\n",
885 __func__, params->frequency);
886
496e9057
DH
887 if (priv->radio_input == XC5000_RADIO_NOT_CONFIGURED) {
888 dprintk(1, "%s() radio input not configured\n", __func__);
889 return -EINVAL;
890 }
891
892 if (priv->radio_input == XC5000_RADIO_FM1)
893 radio_input = FM_Radio_INPUT1;
894 else if (priv->radio_input == XC5000_RADIO_FM2)
895 radio_input = FM_Radio_INPUT2;
724dcbfa
DB
896 else if (priv->radio_input == XC5000_RADIO_FM1_MONO)
897 radio_input = FM_Radio_INPUT1_MONO;
496e9057
DH
898 else {
899 dprintk(1, "%s() unknown radio input %d\n", __func__,
900 priv->radio_input);
901 return -EINVAL;
902 }
903
d7009cdc
BILDB
904 priv->freq_hz = params->frequency * 125 / 2;
905
906 priv->rf_mode = XC_RF_MODE_AIR;
907
496e9057
DH
908 ret = xc_SetTVStandard(priv, XC5000_Standard[radio_input].VideoMode,
909 XC5000_Standard[radio_input].AudioMode);
d7009cdc
BILDB
910
911 if (ret != XC_RESULT_SUCCESS) {
912 printk(KERN_ERR "xc5000: xc_SetTVStandard failed\n");
913 return -EREMOTEIO;
914 }
915
916 ret = xc_SetSignalSource(priv, priv->rf_mode);
917 if (ret != XC_RESULT_SUCCESS) {
918 printk(KERN_ERR
919 "xc5000: xc_SetSignalSource(%d) failed\n",
920 priv->rf_mode);
921 return -EREMOTEIO;
922 }
923
724dcbfa
DB
924 if ((priv->radio_input == XC5000_RADIO_FM1) ||
925 (priv->radio_input == XC5000_RADIO_FM2))
926 xc_write_reg(priv, XREG_OUTPUT_AMP, 0x09);
927 else if (priv->radio_input == XC5000_RADIO_FM1_MONO)
928 xc_write_reg(priv, XREG_OUTPUT_AMP, 0x06);
929
d7009cdc
BILDB
930 xc_tune_channel(priv, priv->freq_hz, XC_TUNE_ANALOG);
931
932 return 0;
933}
934
935static int xc5000_set_analog_params(struct dvb_frontend *fe,
936 struct analog_parameters *params)
937{
938 struct xc5000_priv *priv = fe->tuner_priv;
939 int ret = -EINVAL;
940
941 if (priv->i2c_props.adap == NULL)
942 return -EINVAL;
943
760c466c
DH
944 if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
945 if (xc_load_fw_and_init_tuner(fe) != XC_RESULT_SUCCESS) {
946 dprintk(1, "Unable to load firmware and init tuner\n");
947 return -EINVAL;
948 }
949 }
d7009cdc
BILDB
950
951 switch (params->mode) {
952 case V4L2_TUNER_RADIO:
953 ret = xc5000_set_radio_freq(fe, params);
954 break;
955 case V4L2_TUNER_ANALOG_TV:
956 case V4L2_TUNER_DIGITAL_TV:
957 ret = xc5000_set_tv_freq(fe, params);
958 break;
959 }
960
961 return ret;
962}
963
964
aacb9d31
ST
965static int xc5000_get_frequency(struct dvb_frontend *fe, u32 *freq)
966{
967 struct xc5000_priv *priv = fe->tuner_priv;
271ddbf7 968 dprintk(1, "%s()\n", __func__);
e12671cf 969 *freq = priv->freq_hz;
aacb9d31
ST
970 return 0;
971}
972
35621030
MCC
973static int xc5000_get_if_frequency(struct dvb_frontend *fe, u32 *freq)
974{
975 struct xc5000_priv *priv = fe->tuner_priv;
976 dprintk(1, "%s()\n", __func__);
977 *freq = priv->if_khz * 1000;
978 return 0;
979}
980
aacb9d31
ST
981static int xc5000_get_bandwidth(struct dvb_frontend *fe, u32 *bw)
982{
983 struct xc5000_priv *priv = fe->tuner_priv;
271ddbf7 984 dprintk(1, "%s()\n", __func__);
27c685a4 985
aacb9d31
ST
986 *bw = priv->bandwidth;
987 return 0;
988}
989
990static int xc5000_get_status(struct dvb_frontend *fe, u32 *status)
991{
992 struct xc5000_priv *priv = fe->tuner_priv;
e12671cf 993 u16 lock_status = 0;
aacb9d31
ST
994
995 xc_get_lock_status(priv, &lock_status);
996
271ddbf7 997 dprintk(1, "%s() lock_status = 0x%08x\n", __func__, lock_status);
aacb9d31
ST
998
999 *status = lock_status;
1000
1001 return 0;
1002}
1003
e12671cf 1004static int xc_load_fw_and_init_tuner(struct dvb_frontend *fe)
aacb9d31
ST
1005{
1006 struct xc5000_priv *priv = fe->tuner_priv;
27c685a4 1007 int ret = 0;
aacb9d31 1008
e470d817 1009 if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
aacb9d31 1010 ret = xc5000_fwupload(fe);
e12671cf
ST
1011 if (ret != XC_RESULT_SUCCESS)
1012 return ret;
aacb9d31
ST
1013 }
1014
1015 /* Start the tuner self-calibration process */
1016 ret |= xc_initialize(priv);
1017
1018 /* Wait for calibration to complete.
1019 * We could continue but XC5000 will clock stretch subsequent
1020 * I2C transactions until calibration is complete. This way we
1021 * don't have to rely on clock stretching working.
1022 */
8f3cd530 1023 xc_wait(100);
aacb9d31
ST
1024
1025 /* Default to "CABLE" mode */
1026 ret |= xc_write_reg(priv, XREG_SIGNALSOURCE, XC_RF_MODE_CABLE);
1027
1028 return ret;
1029}
1030
e12671cf
ST
1031static int xc5000_sleep(struct dvb_frontend *fe)
1032{
27c685a4
ST
1033 int ret;
1034
271ddbf7 1035 dprintk(1, "%s()\n", __func__);
e12671cf 1036
b6bd5eb8
DH
1037 /* Avoid firmware reload on slow devices */
1038 if (no_poweroff)
1039 return 0;
1040
7f05b530
DH
1041 /* According to Xceive technical support, the "powerdown" register
1042 was removed in newer versions of the firmware. The "supported"
1043 way to sleep the tuner is to pull the reset pin low for 10ms */
1044 ret = xc5000_TunerReset(fe);
8f3cd530 1045 if (ret != XC_RESULT_SUCCESS) {
27c685a4
ST
1046 printk(KERN_ERR
1047 "xc5000: %s() unable to shutdown tuner\n",
271ddbf7 1048 __func__);
27c685a4 1049 return -EREMOTEIO;
8f3cd530 1050 } else
27c685a4 1051 return XC_RESULT_SUCCESS;
e12671cf
ST
1052}
1053
aacb9d31
ST
1054static int xc5000_init(struct dvb_frontend *fe)
1055{
1056 struct xc5000_priv *priv = fe->tuner_priv;
271ddbf7 1057 dprintk(1, "%s()\n", __func__);
aacb9d31 1058
e12671cf
ST
1059 if (xc_load_fw_and_init_tuner(fe) != XC_RESULT_SUCCESS) {
1060 printk(KERN_ERR "xc5000: Unable to initialise tuner\n");
1061 return -EREMOTEIO;
1062 }
1063
1064 if (debug)
1065 xc_debug_dump(priv);
aacb9d31
ST
1066
1067 return 0;
1068}
1069
1070static int xc5000_release(struct dvb_frontend *fe)
1071{
89fd2854
MK
1072 struct xc5000_priv *priv = fe->tuner_priv;
1073
271ddbf7 1074 dprintk(1, "%s()\n", __func__);
89fd2854
MK
1075
1076 mutex_lock(&xc5000_list_mutex);
1077
1078 if (priv)
1079 hybrid_tuner_release_state(priv);
1080
1081 mutex_unlock(&xc5000_list_mutex);
1082
aacb9d31 1083 fe->tuner_priv = NULL;
89fd2854 1084
aacb9d31
ST
1085 return 0;
1086}
1087
724dcbfa
DB
1088static int xc5000_set_config(struct dvb_frontend *fe, void *priv_cfg)
1089{
1090 struct xc5000_priv *priv = fe->tuner_priv;
1091 struct xc5000_config *p = priv_cfg;
1092
1093 dprintk(1, "%s()\n", __func__);
1094
1095 if (p->if_khz)
1096 priv->if_khz = p->if_khz;
1097
1098 if (p->radio_input)
1099 priv->radio_input = p->radio_input;
1100
1101 return 0;
1102}
1103
1104
aacb9d31
ST
1105static const struct dvb_tuner_ops xc5000_tuner_ops = {
1106 .info = {
1107 .name = "Xceive XC5000",
1108 .frequency_min = 1000000,
1109 .frequency_max = 1023000000,
1110 .frequency_step = 50000,
1111 },
1112
27c685a4
ST
1113 .release = xc5000_release,
1114 .init = xc5000_init,
1115 .sleep = xc5000_sleep,
aacb9d31 1116
724dcbfa 1117 .set_config = xc5000_set_config,
27c685a4
ST
1118 .set_params = xc5000_set_params,
1119 .set_analog_params = xc5000_set_analog_params,
1120 .get_frequency = xc5000_get_frequency,
35621030 1121 .get_if_frequency = xc5000_get_if_frequency,
27c685a4
ST
1122 .get_bandwidth = xc5000_get_bandwidth,
1123 .get_status = xc5000_get_status
aacb9d31
ST
1124};
1125
48723543
MK
1126struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
1127 struct i2c_adapter *i2c,
2e4e98e7 1128 const struct xc5000_config *cfg)
aacb9d31
ST
1129{
1130 struct xc5000_priv *priv = NULL;
89fd2854 1131 int instance;
aacb9d31
ST
1132 u16 id = 0;
1133
89fd2854
MK
1134 dprintk(1, "%s(%d-%04x)\n", __func__,
1135 i2c ? i2c_adapter_id(i2c) : -1,
1136 cfg ? cfg->i2c_address : -1);
aacb9d31 1137
89fd2854 1138 mutex_lock(&xc5000_list_mutex);
aacb9d31 1139
89fd2854
MK
1140 instance = hybrid_tuner_request_state(struct xc5000_priv, priv,
1141 hybrid_tuner_instance_list,
1142 i2c, cfg->i2c_address, "xc5000");
1143 switch (instance) {
1144 case 0:
1145 goto fail;
1146 break;
1147 case 1:
1148 /* new tuner instance */
c6f56e7d 1149 priv->bandwidth = 6000000;
89fd2854
MK
1150 fe->tuner_priv = priv;
1151 break;
1152 default:
1153 /* existing tuner instance */
1154 fe->tuner_priv = priv;
1155 break;
1156 }
aacb9d31 1157
ea227863
DH
1158 if (priv->if_khz == 0) {
1159 /* If the IF hasn't been set yet, use the value provided by
1160 the caller (occurs in hybrid devices where the analog
1161 call to xc5000_attach occurs before the digital side) */
1162 priv->if_khz = cfg->if_khz;
1163 }
1164
496e9057
DH
1165 if (priv->radio_input == 0)
1166 priv->radio_input = cfg->radio_input;
1167
76efb0ba
MK
1168 /* don't override firmware filename if it's already been set
1169 unless explicitly specified */
1170 if ((priv->fw == NULL) || (cfg->fw))
1171 /* use default firmware if none specified */
ddea427f
MK
1172 priv->fw = xc5000_assign_firmware((cfg->fw) ?
1173 cfg->fw : XC5000_DEFAULT_FIRMWARE);
76efb0ba 1174
27c685a4
ST
1175 /* Check if firmware has been loaded. It is possible that another
1176 instance of the driver has loaded the firmware.
1177 */
7988fc21 1178 if (xc5000_readreg(priv, XREG_PRODUCT_ID, &id) != XC_RESULT_SUCCESS)
89fd2854 1179 goto fail;
aacb9d31 1180
8f3cd530 1181 switch (id) {
27c685a4
ST
1182 case XC_PRODUCT_ID_FW_LOADED:
1183 printk(KERN_INFO
1184 "xc5000: Successfully identified at address 0x%02x\n",
1185 cfg->i2c_address);
1186 printk(KERN_INFO
1187 "xc5000: Firmware has been loaded previously\n");
27c685a4
ST
1188 break;
1189 case XC_PRODUCT_ID_FW_NOT_LOADED:
1190 printk(KERN_INFO
1191 "xc5000: Successfully identified at address 0x%02x\n",
1192 cfg->i2c_address);
1193 printk(KERN_INFO
1194 "xc5000: Firmware has not been loaded previously\n");
27c685a4
ST
1195 break;
1196 default:
aacb9d31
ST
1197 printk(KERN_ERR
1198 "xc5000: Device not found at addr 0x%02x (0x%x)\n",
1199 cfg->i2c_address, id);
89fd2854 1200 goto fail;
aacb9d31
ST
1201 }
1202
89fd2854
MK
1203 mutex_unlock(&xc5000_list_mutex);
1204
aacb9d31
ST
1205 memcpy(&fe->ops.tuner_ops, &xc5000_tuner_ops,
1206 sizeof(struct dvb_tuner_ops));
1207
aacb9d31 1208 return fe;
89fd2854
MK
1209fail:
1210 mutex_unlock(&xc5000_list_mutex);
1211
1212 xc5000_release(fe);
1213 return NULL;
aacb9d31
ST
1214}
1215EXPORT_SYMBOL(xc5000_attach);
1216
1217MODULE_AUTHOR("Steven Toth");
e12671cf 1218MODULE_DESCRIPTION("Xceive xc5000 silicon tuner driver");
aacb9d31 1219MODULE_LICENSE("GPL");