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