Merge tag 'dlm-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm
[deliverable/linux.git] / drivers / media / tuners / tda8290.c
CommitLineData
1da177e4 1/*
de48eebc
HH
2
3 i2c tv tuner chip device driver
4 controls the philips tda8290+75 tuner chip combo.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
910bb3e3
MK
19
20 This "tda8290" module was split apart from the original "tuner" module.
de48eebc
HH
21*/
22
1da177e4 23#include <linux/i2c.h>
5a0e3ad6 24#include <linux/slab.h>
1da177e4 25#include <linux/delay.h>
7f6adeaf 26#include <linux/videodev2.h>
ab166050 27#include "tuner-i2c.h"
910bb3e3 28#include "tda8290.h"
746d9732 29#include "tda827x.h"
5bea1cd3 30#include "tda18271.h"
910bb3e3 31
ab166050
MK
32static int debug;
33module_param(debug, int, 0644);
910bb3e3
MK
34MODULE_PARM_DESC(debug, "enable verbose debug messages");
35
9af0ef27 36static int deemphasis_50;
b450b92e 37module_param(deemphasis_50, int, 0644);
9af0ef27
MCC
38MODULE_PARM_DESC(deemphasis_50, "0 - 75us deemphasis; 1 - 50us deemphasis");
39
1da177e4
LT
40/* ---------------------------------------------------------------------- */
41
b2083199 42struct tda8290_priv {
db8a6956
MK
43 struct tuner_i2c_props i2c_props;
44
b2083199 45 unsigned char tda8290_easy_mode;
746d9732 46
b2083199 47 unsigned char tda827x_addr;
8c125f2c
MK
48
49 unsigned char ver;
50#define TDA8290 1
51#define TDA8295 2
52#define TDA8275 4
53#define TDA8275A 8
54#define TDA18271 16
1da177e4 55
746d9732 56 struct tda827x_config cfg;
5b0e5350 57 struct tda18271_std_map *tda18271_std_map;
1da177e4
LT
58};
59
de48eebc 60/*---------------------------------------------------------------------*/
1da177e4 61
a72dd305 62static int tda8290_i2c_bridge(struct dvb_frontend *fe, int close)
de48eebc 63{
4e9154b8 64 struct tda8290_priv *priv = fe->analog_demod_priv;
db8a6956 65
de48eebc 66 unsigned char enable[2] = { 0x21, 0xC0 };
0157a9cc 67 unsigned char disable[2] = { 0x21, 0x00 };
de48eebc 68 unsigned char *msg;
a72dd305
MK
69
70 if (close) {
de48eebc 71 msg = enable;
db8a6956 72 tuner_i2c_xfer_send(&priv->i2c_props, msg, 2);
de48eebc
HH
73 /* let the bridge stabilize */
74 msleep(20);
75 } else {
76 msg = disable;
db8a6956 77 tuner_i2c_xfer_send(&priv->i2c_props, msg, 2);
de48eebc 78 }
a72dd305
MK
79
80 return 0;
1da177e4
LT
81}
82
a72dd305 83static int tda8295_i2c_bridge(struct dvb_frontend *fe, int close)
5bea1cd3 84{
4e9154b8 85 struct tda8290_priv *priv = fe->analog_demod_priv;
5bea1cd3
MK
86
87 unsigned char enable[2] = { 0x45, 0xc1 };
88 unsigned char disable[2] = { 0x46, 0x00 };
89 unsigned char buf[3] = { 0x45, 0x01, 0x00 };
90 unsigned char *msg;
a72dd305 91
5bea1cd3
MK
92 if (close) {
93 msg = enable;
94 tuner_i2c_xfer_send(&priv->i2c_props, msg, 2);
95 /* let the bridge stabilize */
96 msleep(20);
97 } else {
98 msg = disable;
567aba0b 99 tuner_i2c_xfer_send_recv(&priv->i2c_props, msg, 1, &msg[1], 1);
5bea1cd3
MK
100
101 buf[2] = msg[1];
102 buf[2] &= ~0x04;
103 tuner_i2c_xfer_send(&priv->i2c_props, buf, 3);
104 msleep(5);
105
106 msg[1] |= 0x04;
107 tuner_i2c_xfer_send(&priv->i2c_props, msg, 2);
108 }
a72dd305
MK
109
110 return 0;
5bea1cd3
MK
111}
112
de48eebc
HH
113/*---------------------------------------------------------------------*/
114
c7919d52
MK
115static void set_audio(struct dvb_frontend *fe,
116 struct analog_parameters *params)
1da177e4 117{
4e9154b8 118 struct tda8290_priv *priv = fe->analog_demod_priv;
910bb3e3
MK
119 char* mode;
120
c7919d52 121 if (params->std & V4L2_STD_MN) {
910bb3e3 122 priv->tda8290_easy_mode = 0x01;
910bb3e3 123 mode = "MN";
c7919d52 124 } else if (params->std & V4L2_STD_B) {
910bb3e3
MK
125 priv->tda8290_easy_mode = 0x02;
126 mode = "B";
c7919d52 127 } else if (params->std & V4L2_STD_GH) {
910bb3e3
MK
128 priv->tda8290_easy_mode = 0x04;
129 mode = "GH";
c7919d52 130 } else if (params->std & V4L2_STD_PAL_I) {
910bb3e3
MK
131 priv->tda8290_easy_mode = 0x08;
132 mode = "I";
c7919d52 133 } else if (params->std & V4L2_STD_DK) {
910bb3e3
MK
134 priv->tda8290_easy_mode = 0x10;
135 mode = "DK";
c7919d52 136 } else if (params->std & V4L2_STD_SECAM_L) {
910bb3e3
MK
137 priv->tda8290_easy_mode = 0x20;
138 mode = "L";
c7919d52 139 } else if (params->std & V4L2_STD_SECAM_LC) {
910bb3e3
MK
140 priv->tda8290_easy_mode = 0x40;
141 mode = "LC";
142 } else {
910bb3e3
MK
143 priv->tda8290_easy_mode = 0x10;
144 mode = "xx";
145 }
146
9af0ef27 147 if (params->mode == V4L2_TUNER_RADIO) {
3f76cf8c
MK
148 /* Set TDA8295 to FM radio; Start TDA8290 with MN values */
149 priv->tda8290_easy_mode = (priv->ver & TDA8295) ? 0x80 : 0x01;
9af0ef27
MCC
150 tuner_dbg("setting to radio FM\n");
151 } else {
152 tuner_dbg("setting tda829x to system %s\n", mode);
153 }
910bb3e3
MK
154}
155
4c27f1a4 156static struct {
9af0ef27
MCC
157 unsigned char seq[2];
158} fm_mode[] = {
159 { { 0x01, 0x81} }, /* Put device into expert mode */
160 { { 0x03, 0x48} }, /* Disable NOTCH and VIDEO filters */
161 { { 0x04, 0x04} }, /* Disable color carrier filter (SSIF) */
162 { { 0x05, 0x04} }, /* ADC headroom */
163 { { 0x06, 0x10} }, /* group delay flat */
164
165 { { 0x07, 0x00} }, /* use the same radio DTO values as a tda8295 */
166 { { 0x08, 0x00} },
167 { { 0x09, 0x80} },
168 { { 0x0a, 0xda} },
169 { { 0x0b, 0x4b} },
170 { { 0x0c, 0x68} },
171
172 { { 0x0d, 0x00} }, /* PLL off, no video carrier detect */
173 { { 0x14, 0x00} }, /* disable auto mute if no video */
174};
175
c7919d52
MK
176static void tda8290_set_params(struct dvb_frontend *fe,
177 struct analog_parameters *params)
910bb3e3 178{
4e9154b8 179 struct tda8290_priv *priv = fe->analog_demod_priv;
4e9154b8 180
de48eebc 181 unsigned char soft_reset[] = { 0x00, 0x00 };
b2083199 182 unsigned char easy_mode[] = { 0x01, priv->tda8290_easy_mode };
de48eebc 183 unsigned char expert_mode[] = { 0x01, 0x80 };
0157a9cc 184 unsigned char agc_out_on[] = { 0x02, 0x00 };
de48eebc
HH
185 unsigned char gainset_off[] = { 0x28, 0x14 };
186 unsigned char if_agc_spd[] = { 0x0f, 0x88 };
187 unsigned char adc_head_6[] = { 0x05, 0x04 };
188 unsigned char adc_head_9[] = { 0x05, 0x02 };
189 unsigned char adc_head_12[] = { 0x05, 0x01 };
190 unsigned char pll_bw_nom[] = { 0x0d, 0x47 };
191 unsigned char pll_bw_low[] = { 0x0d, 0x27 };
192 unsigned char gainset_2[] = { 0x28, 0x64 };
193 unsigned char agc_rst_on[] = { 0x0e, 0x0b };
194 unsigned char agc_rst_off[] = { 0x0e, 0x09 };
195 unsigned char if_agc_set[] = { 0x0f, 0x81 };
196 unsigned char addr_adc_sat = 0x1a;
197 unsigned char addr_agc_stat = 0x1d;
198 unsigned char addr_pll_stat = 0x1b;
199 unsigned char adc_sat, agc_stat,
9a741ec9 200 pll_stat;
58ef4f92 201 int i;
de48eebc 202
c7919d52 203 set_audio(fe, params);
910bb3e3 204
ab166050 205 if (priv->cfg.config)
7bff4b4d 206 tuner_dbg("tda827xa config is 0x%02x\n", priv->cfg.config);
db8a6956
MK
207 tuner_i2c_xfer_send(&priv->i2c_props, easy_mode, 2);
208 tuner_i2c_xfer_send(&priv->i2c_props, agc_out_on, 2);
209 tuner_i2c_xfer_send(&priv->i2c_props, soft_reset, 2);
de48eebc
HH
210 msleep(1);
211
9af0ef27 212 if (params->mode == V4L2_TUNER_RADIO) {
9af0ef27
MCC
213 unsigned char deemphasis[] = { 0x13, 1 };
214
215 /* FIXME: allow using a different deemphasis */
216
217 if (deemphasis_50)
218 deemphasis[1] = 2;
219
220 for (i = 0; i < ARRAY_SIZE(fm_mode); i++)
221 tuner_i2c_xfer_send(&priv->i2c_props, fm_mode[i].seq, 2);
222
223 tuner_i2c_xfer_send(&priv->i2c_props, deemphasis, 2);
224 } else {
225 expert_mode[1] = priv->tda8290_easy_mode + 0x80;
226 tuner_i2c_xfer_send(&priv->i2c_props, expert_mode, 2);
227 tuner_i2c_xfer_send(&priv->i2c_props, gainset_off, 2);
228 tuner_i2c_xfer_send(&priv->i2c_props, if_agc_spd, 2);
229 if (priv->tda8290_easy_mode & 0x60)
230 tuner_i2c_xfer_send(&priv->i2c_props, adc_head_9, 2);
231 else
232 tuner_i2c_xfer_send(&priv->i2c_props, adc_head_6, 2);
233 tuner_i2c_xfer_send(&priv->i2c_props, pll_bw_nom, 2);
234 }
de48eebc 235
ecb71d26 236
2f719f7a
OZ
237 if (fe->ops.analog_ops.i2c_gate_ctrl)
238 fe->ops.analog_ops.i2c_gate_ctrl(fe, 1);
746d9732 239
4e9154b8 240 if (fe->ops.tuner_ops.set_analog_params)
c7919d52 241 fe->ops.tuner_ops.set_analog_params(fe, params);
746d9732 242
58ef4f92 243 for (i = 0; i < 3; i++) {
567aba0b
MCC
244 tuner_i2c_xfer_send_recv(&priv->i2c_props,
245 &addr_pll_stat, 1, &pll_stat, 1);
58ef4f92 246 if (pll_stat & 0x80) {
567aba0b
MCC
247 tuner_i2c_xfer_send_recv(&priv->i2c_props,
248 &addr_adc_sat, 1,
249 &adc_sat, 1);
250 tuner_i2c_xfer_send_recv(&priv->i2c_props,
251 &addr_agc_stat, 1,
252 &agc_stat, 1);
58ef4f92
HH
253 tuner_dbg("tda8290 is locked, AGC: %d\n", agc_stat);
254 break;
255 } else {
256 tuner_dbg("tda8290 not locked, no signal?\n");
257 msleep(100);
258 }
259 }
de48eebc 260 /* adjust headroom resp. gain */
4ac95af9
HH
261 if ((agc_stat > 115) || (!(pll_stat & 0x80) && (adc_sat < 20))) {
262 tuner_dbg("adjust gain, step 1. Agc: %d, ADC stat: %d, lock: %d\n",
263 agc_stat, adc_sat, pll_stat & 0x80);
db8a6956 264 tuner_i2c_xfer_send(&priv->i2c_props, gainset_2, 2);
de48eebc 265 msleep(100);
567aba0b
MCC
266 tuner_i2c_xfer_send_recv(&priv->i2c_props,
267 &addr_agc_stat, 1, &agc_stat, 1);
268 tuner_i2c_xfer_send_recv(&priv->i2c_props,
269 &addr_pll_stat, 1, &pll_stat, 1);
de48eebc 270 if ((agc_stat > 115) || !(pll_stat & 0x80)) {
4ac95af9
HH
271 tuner_dbg("adjust gain, step 2. Agc: %d, lock: %d\n",
272 agc_stat, pll_stat & 0x80);
746d9732 273 if (priv->cfg.agcf)
4e9154b8 274 priv->cfg.agcf(fe);
de48eebc 275 msleep(100);
567aba0b
MCC
276 tuner_i2c_xfer_send_recv(&priv->i2c_props,
277 &addr_agc_stat, 1,
278 &agc_stat, 1);
279 tuner_i2c_xfer_send_recv(&priv->i2c_props,
280 &addr_pll_stat, 1,
281 &pll_stat, 1);
de48eebc
HH
282 if((agc_stat > 115) || !(pll_stat & 0x80)) {
283 tuner_dbg("adjust gain, step 3. Agc: %d\n", agc_stat);
db8a6956
MK
284 tuner_i2c_xfer_send(&priv->i2c_props, adc_head_12, 2);
285 tuner_i2c_xfer_send(&priv->i2c_props, pll_bw_low, 2);
de48eebc
HH
286 msleep(100);
287 }
288 }
289 }
1da177e4 290
de48eebc 291 /* l/ l' deadlock? */
b2083199 292 if(priv->tda8290_easy_mode & 0x60) {
567aba0b
MCC
293 tuner_i2c_xfer_send_recv(&priv->i2c_props,
294 &addr_adc_sat, 1,
295 &adc_sat, 1);
296 tuner_i2c_xfer_send_recv(&priv->i2c_props,
297 &addr_pll_stat, 1,
298 &pll_stat, 1);
de48eebc 299 if ((adc_sat > 20) || !(pll_stat & 0x80)) {
4ac95af9 300 tuner_dbg("trying to resolve SECAM L deadlock\n");
db8a6956 301 tuner_i2c_xfer_send(&priv->i2c_props, agc_rst_on, 2);
de48eebc 302 msleep(40);
db8a6956 303 tuner_i2c_xfer_send(&priv->i2c_props, agc_rst_off, 2);
de48eebc
HH
304 }
305 }
586b0cab 306
2f719f7a
OZ
307 if (fe->ops.analog_ops.i2c_gate_ctrl)
308 fe->ops.analog_ops.i2c_gate_ctrl(fe, 0);
db8a6956 309 tuner_i2c_xfer_send(&priv->i2c_props, if_agc_set, 2);
1da177e4
LT
310}
311
de48eebc
HH
312/*---------------------------------------------------------------------*/
313
4e9154b8 314static void tda8295_power(struct dvb_frontend *fe, int enable)
5bea1cd3 315{
4e9154b8 316 struct tda8290_priv *priv = fe->analog_demod_priv;
5bea1cd3
MK
317 unsigned char buf[] = { 0x30, 0x00 }; /* clb_stdbt */
318
567aba0b 319 tuner_i2c_xfer_send_recv(&priv->i2c_props, &buf[0], 1, &buf[1], 1);
5bea1cd3
MK
320
321 if (enable)
322 buf[1] = 0x01;
323 else
324 buf[1] = 0x03;
325
326 tuner_i2c_xfer_send(&priv->i2c_props, buf, 2);
327}
328
4e9154b8 329static void tda8295_set_easy_mode(struct dvb_frontend *fe, int enable)
5bea1cd3 330{
4e9154b8 331 struct tda8290_priv *priv = fe->analog_demod_priv;
5bea1cd3
MK
332 unsigned char buf[] = { 0x01, 0x00 };
333
567aba0b 334 tuner_i2c_xfer_send_recv(&priv->i2c_props, &buf[0], 1, &buf[1], 1);
5bea1cd3
MK
335
336 if (enable)
337 buf[1] = 0x01; /* rising edge sets regs 0x02 - 0x23 */
338 else
339 buf[1] = 0x00; /* reset active bit */
340
341 tuner_i2c_xfer_send(&priv->i2c_props, buf, 2);
342}
343
4e9154b8 344static void tda8295_set_video_std(struct dvb_frontend *fe)
5bea1cd3 345{
4e9154b8 346 struct tda8290_priv *priv = fe->analog_demod_priv;
5bea1cd3
MK
347 unsigned char buf[] = { 0x00, priv->tda8290_easy_mode };
348
349 tuner_i2c_xfer_send(&priv->i2c_props, buf, 2);
350
4e9154b8 351 tda8295_set_easy_mode(fe, 1);
5bea1cd3 352 msleep(20);
4e9154b8 353 tda8295_set_easy_mode(fe, 0);
5bea1cd3
MK
354}
355
356/*---------------------------------------------------------------------*/
357
4e9154b8 358static void tda8295_agc1_out(struct dvb_frontend *fe, int enable)
5bea1cd3 359{
4e9154b8 360 struct tda8290_priv *priv = fe->analog_demod_priv;
5bea1cd3
MK
361 unsigned char buf[] = { 0x02, 0x00 }; /* DIV_FUNC */
362
567aba0b 363 tuner_i2c_xfer_send_recv(&priv->i2c_props, &buf[0], 1, &buf[1], 1);
5bea1cd3
MK
364
365 if (enable)
366 buf[1] &= ~0x40;
367 else
368 buf[1] |= 0x40;
369
370 tuner_i2c_xfer_send(&priv->i2c_props, buf, 2);
371}
372
4e9154b8 373static void tda8295_agc2_out(struct dvb_frontend *fe, int enable)
5bea1cd3 374{
4e9154b8 375 struct tda8290_priv *priv = fe->analog_demod_priv;
5bea1cd3
MK
376 unsigned char set_gpio_cf[] = { 0x44, 0x00 };
377 unsigned char set_gpio_val[] = { 0x46, 0x00 };
378
567aba0b
MCC
379 tuner_i2c_xfer_send_recv(&priv->i2c_props,
380 &set_gpio_cf[0], 1, &set_gpio_cf[1], 1);
381 tuner_i2c_xfer_send_recv(&priv->i2c_props,
382 &set_gpio_val[0], 1, &set_gpio_val[1], 1);
5bea1cd3
MK
383
384 set_gpio_cf[1] &= 0xf0; /* clear GPIO_0 bits 3-0 */
385
386 if (enable) {
387 set_gpio_cf[1] |= 0x01; /* config GPIO_0 as Open Drain Out */
388 set_gpio_val[1] &= 0xfe; /* set GPIO_0 pin low */
389 }
390 tuner_i2c_xfer_send(&priv->i2c_props, set_gpio_cf, 2);
391 tuner_i2c_xfer_send(&priv->i2c_props, set_gpio_val, 2);
392}
393
dfc2e12d 394static int tda8295_has_signal(struct dvb_frontend *fe, u16 *signal)
5bea1cd3 395{
4e9154b8 396 struct tda8290_priv *priv = fe->analog_demod_priv;
5bea1cd3
MK
397
398 unsigned char hvpll_stat = 0x26;
399 unsigned char ret;
400
567aba0b 401 tuner_i2c_xfer_send_recv(&priv->i2c_props, &hvpll_stat, 1, &ret, 1);
dfc2e12d
HV
402 *signal = (ret & 0x01) ? 65535 : 0;
403 return 0;
5bea1cd3
MK
404}
405
406/*---------------------------------------------------------------------*/
407
c7919d52
MK
408static void tda8295_set_params(struct dvb_frontend *fe,
409 struct analog_parameters *params)
5bea1cd3 410{
4e9154b8 411 struct tda8290_priv *priv = fe->analog_demod_priv;
dfc2e12d 412 u16 signal = 0;
5bea1cd3
MK
413 unsigned char blanking_mode[] = { 0x1d, 0x00 };
414
c7919d52 415 set_audio(fe, params);
5bea1cd3 416
7e28adb2 417 tuner_dbg("%s: freq = %d\n", __func__, params->frequency);
5bea1cd3 418
4e9154b8
MK
419 tda8295_power(fe, 1);
420 tda8295_agc1_out(fe, 1);
5bea1cd3 421
567aba0b
MCC
422 tuner_i2c_xfer_send_recv(&priv->i2c_props,
423 &blanking_mode[0], 1, &blanking_mode[1], 1);
5bea1cd3 424
4e9154b8 425 tda8295_set_video_std(fe);
5bea1cd3
MK
426
427 blanking_mode[1] = 0x03;
428 tuner_i2c_xfer_send(&priv->i2c_props, blanking_mode, 2);
429 msleep(20);
430
2f719f7a
OZ
431 if (fe->ops.analog_ops.i2c_gate_ctrl)
432 fe->ops.analog_ops.i2c_gate_ctrl(fe, 1);
5bea1cd3 433
4e9154b8 434 if (fe->ops.tuner_ops.set_analog_params)
c7919d52 435 fe->ops.tuner_ops.set_analog_params(fe, params);
5bea1cd3
MK
436
437 if (priv->cfg.agcf)
4e9154b8 438 priv->cfg.agcf(fe);
5bea1cd3 439
dfc2e12d
HV
440 tda8295_has_signal(fe, &signal);
441 if (signal)
5bea1cd3
MK
442 tuner_dbg("tda8295 is locked\n");
443 else
444 tuner_dbg("tda8295 not locked, no signal?\n");
445
2f719f7a
OZ
446 if (fe->ops.analog_ops.i2c_gate_ctrl)
447 fe->ops.analog_ops.i2c_gate_ctrl(fe, 0);
5bea1cd3
MK
448}
449
450/*---------------------------------------------------------------------*/
451
dfc2e12d 452static int tda8290_has_signal(struct dvb_frontend *fe, u16 *signal)
1da177e4 453{
4e9154b8 454 struct tda8290_priv *priv = fe->analog_demod_priv;
1da177e4 455
910bb3e3
MK
456 unsigned char i2c_get_afc[1] = { 0x1B };
457 unsigned char afc = 0;
1da177e4 458
567aba0b
MCC
459 tuner_i2c_xfer_send_recv(&priv->i2c_props,
460 i2c_get_afc, ARRAY_SIZE(i2c_get_afc), &afc, 1);
dfc2e12d
HV
461 *signal = (afc & 0x80) ? 65535 : 0;
462 return 0;
1da177e4
LT
463}
464
de48eebc
HH
465/*---------------------------------------------------------------------*/
466
4e9154b8 467static void tda8290_standby(struct dvb_frontend *fe)
793cf9e6 468{
4e9154b8
MK
469 struct tda8290_priv *priv = fe->analog_demod_priv;
470
de48eebc
HH
471 unsigned char cb1[] = { 0x30, 0xD0 };
472 unsigned char tda8290_standby[] = { 0x00, 0x02 };
0157a9cc 473 unsigned char tda8290_agc_tri[] = { 0x02, 0x20 };
b2083199 474 struct i2c_msg msg = {.addr = priv->tda827x_addr, .flags=0, .buf=cb1, .len = 2};
de48eebc 475
2f719f7a
OZ
476 if (fe->ops.analog_ops.i2c_gate_ctrl)
477 fe->ops.analog_ops.i2c_gate_ctrl(fe, 1);
8c125f2c 478 if (priv->ver & TDA8275A)
de48eebc 479 cb1[1] = 0x90;
db8a6956 480 i2c_transfer(priv->i2c_props.adap, &msg, 1);
2f719f7a
OZ
481 if (fe->ops.analog_ops.i2c_gate_ctrl)
482 fe->ops.analog_ops.i2c_gate_ctrl(fe, 0);
db8a6956
MK
483 tuner_i2c_xfer_send(&priv->i2c_props, tda8290_agc_tri, 2);
484 tuner_i2c_xfer_send(&priv->i2c_props, tda8290_standby, 2);
793cf9e6
MCC
485}
486
4e9154b8 487static void tda8295_standby(struct dvb_frontend *fe)
5bea1cd3 488{
4e9154b8 489 tda8295_agc1_out(fe, 0); /* Put AGC in tri-state */
5bea1cd3 490
4e9154b8 491 tda8295_power(fe, 0);
5bea1cd3
MK
492}
493
4e9154b8 494static void tda8290_init_if(struct dvb_frontend *fe)
de48eebc 495{
4e9154b8 496 struct tda8290_priv *priv = fe->analog_demod_priv;
db8a6956 497
de48eebc 498 unsigned char set_VS[] = { 0x30, 0x6F };
58ef4f92 499 unsigned char set_GP00_CF[] = { 0x20, 0x01 };
de48eebc
HH
500 unsigned char set_GP01_CF[] = { 0x20, 0x0B };
501
1bacb2df
OZ
502 if ((priv->cfg.config == TDA8290_LNA_GP0_HIGH_ON) ||
503 (priv->cfg.config == TDA8290_LNA_GP0_HIGH_OFF))
db8a6956 504 tuner_i2c_xfer_send(&priv->i2c_props, set_GP00_CF, 2);
58ef4f92 505 else
db8a6956
MK
506 tuner_i2c_xfer_send(&priv->i2c_props, set_GP01_CF, 2);
507 tuner_i2c_xfer_send(&priv->i2c_props, set_VS, 2);
de48eebc
HH
508}
509
4e9154b8 510static void tda8295_init_if(struct dvb_frontend *fe)
5bea1cd3 511{
4e9154b8 512 struct tda8290_priv *priv = fe->analog_demod_priv;
5bea1cd3
MK
513
514 static unsigned char set_adc_ctl[] = { 0x33, 0x14 };
515 static unsigned char set_adc_ctl2[] = { 0x34, 0x00 };
516 static unsigned char set_pll_reg6[] = { 0x3e, 0x63 };
517 static unsigned char set_pll_reg0[] = { 0x38, 0x23 };
518 static unsigned char set_pll_reg7[] = { 0x3f, 0x01 };
519 static unsigned char set_pll_reg10[] = { 0x42, 0x61 };
520 static unsigned char set_gpio_reg0[] = { 0x44, 0x0b };
521
4e9154b8 522 tda8295_power(fe, 1);
5bea1cd3 523
4e9154b8
MK
524 tda8295_set_easy_mode(fe, 0);
525 tda8295_set_video_std(fe);
5bea1cd3
MK
526
527 tuner_i2c_xfer_send(&priv->i2c_props, set_adc_ctl, 2);
528 tuner_i2c_xfer_send(&priv->i2c_props, set_adc_ctl2, 2);
529 tuner_i2c_xfer_send(&priv->i2c_props, set_pll_reg6, 2);
530 tuner_i2c_xfer_send(&priv->i2c_props, set_pll_reg0, 2);
531 tuner_i2c_xfer_send(&priv->i2c_props, set_pll_reg7, 2);
532 tuner_i2c_xfer_send(&priv->i2c_props, set_pll_reg10, 2);
533 tuner_i2c_xfer_send(&priv->i2c_props, set_gpio_reg0, 2);
534
4e9154b8
MK
535 tda8295_agc1_out(fe, 0);
536 tda8295_agc2_out(fe, 0);
5bea1cd3
MK
537}
538
4e9154b8 539static void tda8290_init_tuner(struct dvb_frontend *fe)
1da177e4 540{
4e9154b8 541 struct tda8290_priv *priv = fe->analog_demod_priv;
de48eebc 542 unsigned char tda8275_init[] = { 0x00, 0x00, 0x00, 0x40, 0xdC, 0x04, 0xAf,
9a741ec9 543 0x3F, 0x2A, 0x04, 0xFF, 0x00, 0x00, 0x40 };
de48eebc 544 unsigned char tda8275a_init[] = { 0x00, 0x00, 0x00, 0x00, 0xdC, 0x05, 0x8b,
9a741ec9 545 0x0c, 0x04, 0x20, 0xFF, 0x00, 0x00, 0x4b };
b2083199 546 struct i2c_msg msg = {.addr = priv->tda827x_addr, .flags=0,
c2f6f9d8 547 .buf=tda8275_init, .len = 14};
8c125f2c 548 if (priv->ver & TDA8275A)
de48eebc
HH
549 msg.buf = tda8275a_init;
550
2f719f7a
OZ
551 if (fe->ops.analog_ops.i2c_gate_ctrl)
552 fe->ops.analog_ops.i2c_gate_ctrl(fe, 1);
db8a6956 553 i2c_transfer(priv->i2c_props.adap, &msg, 1);
2f719f7a
OZ
554 if (fe->ops.analog_ops.i2c_gate_ctrl)
555 fe->ops.analog_ops.i2c_gate_ctrl(fe, 0);
de48eebc
HH
556}
557
558/*---------------------------------------------------------------------*/
1da177e4 559
4e9154b8 560static void tda829x_release(struct dvb_frontend *fe)
024cf530 561{
a4f263b5
MK
562 struct tda8290_priv *priv = fe->analog_demod_priv;
563
006ed1ec
MK
564 /* only try to release the tuner if we've
565 * attached it from within this module */
566 if (priv->ver & (TDA18271 | TDA8275 | TDA8275A))
a4f263b5
MK
567 if (fe->ops.tuner_ops.release)
568 fe->ops.tuner_ops.release(fe);
024cf530 569
4e9154b8
MK
570 kfree(fe->analog_demod_priv);
571 fe->analog_demod_priv = NULL;
910bb3e3
MK
572}
573
f21e0d7f
MK
574static struct tda18271_config tda829x_tda18271_config = {
575 .gate = TDA18271_GATE_ANALOG,
576};
577
8c125f2c 578static int tda829x_find_tuner(struct dvb_frontend *fe)
de48eebc 579{
8c125f2c 580 struct tda8290_priv *priv = fe->analog_demod_priv;
de48eebc
HH
581 int i, ret, tuners_found;
582 u32 tuner_addrs;
8c125f2c
MK
583 u8 data;
584 struct i2c_msg msg = { .flags = I2C_M_RD, .buf = &data, .len = 1 };
de48eebc 585
2f719f7a
OZ
586 if (fe->ops.analog_ops.i2c_gate_ctrl)
587 fe->ops.analog_ops.i2c_gate_ctrl(fe, 1);
db8a6956 588
de48eebc
HH
589 /* probe for tuner chip */
590 tuners_found = 0;
591 tuner_addrs = 0;
8c125f2c 592 for (i = 0x60; i <= 0x63; i++) {
de48eebc 593 msg.addr = i;
db8a6956 594 ret = i2c_transfer(priv->i2c_props.adap, &msg, 1);
de48eebc
HH
595 if (ret == 1) {
596 tuners_found++;
597 tuner_addrs = (tuner_addrs << 8) + i;
598 }
599 }
600 /* if there is more than one tuner, we expect the right one is
601 behind the bridge and we choose the highest address that doesn't
602 give a response now
603 */
8c125f2c 604
2f719f7a
OZ
605 if (fe->ops.analog_ops.i2c_gate_ctrl)
606 fe->ops.analog_ops.i2c_gate_ctrl(fe, 0);
8c125f2c
MK
607
608 if (tuners_found > 1)
de48eebc
HH
609 for (i = 0; i < tuners_found; i++) {
610 msg.addr = tuner_addrs & 0xff;
db8a6956 611 ret = i2c_transfer(priv->i2c_props.adap, &msg, 1);
8c125f2c 612 if (ret == 1)
de48eebc
HH
613 tuner_addrs = tuner_addrs >> 8;
614 else
615 break;
616 }
8c125f2c 617
de48eebc 618 if (tuner_addrs == 0) {
8c125f2c
MK
619 tuner_addrs = 0x60;
620 tuner_info("could not clearly identify tuner address, "
621 "defaulting to %x\n", tuner_addrs);
de48eebc
HH
622 } else {
623 tuner_addrs = tuner_addrs & 0xff;
910bb3e3 624 tuner_info("setting tuner address to %x\n", tuner_addrs);
de48eebc 625 }
b2083199 626 priv->tda827x_addr = tuner_addrs;
de48eebc
HH
627 msg.addr = tuner_addrs;
628
2f719f7a
OZ
629 if (fe->ops.analog_ops.i2c_gate_ctrl)
630 fe->ops.analog_ops.i2c_gate_ctrl(fe, 1);
db8a6956 631 ret = i2c_transfer(priv->i2c_props.adap, &msg, 1);
910bb3e3 632
8c125f2c
MK
633 if (ret != 1) {
634 tuner_warn("tuner access failed!\n");
2f719f7a
OZ
635 if (fe->ops.analog_ops.i2c_gate_ctrl)
636 fe->ops.analog_ops.i2c_gate_ctrl(fe, 0);
8c125f2c 637 return -EREMOTEIO;
de48eebc 638 }
746d9732 639
255b5113 640 if ((data == 0x83) || (data == 0x84)) {
8c125f2c 641 priv->ver |= TDA18271;
adcc4b3e 642 tda829x_tda18271_config.config = priv->cfg.config;
5b0e5350 643 tda829x_tda18271_config.std_map = priv->tda18271_std_map;
a07c8779
MK
644 dvb_attach(tda18271_attach, fe, priv->tda827x_addr,
645 priv->i2c_props.adap, &tda829x_tda18271_config);
8c125f2c
MK
646 } else {
647 if ((data & 0x3c) == 0)
648 priv->ver |= TDA8275;
649 else
650 priv->ver |= TDA8275A;
7fd8b263 651
a07c8779
MK
652 dvb_attach(tda827x_attach, fe, priv->tda827x_addr,
653 priv->i2c_props.adap, &priv->cfg);
7bff4b4d 654 priv->cfg.switch_addr = priv->i2c_props.addr;
8c125f2c 655 }
6881647c
MK
656 if (fe->ops.tuner_ops.init)
657 fe->ops.tuner_ops.init(fe);
63c25480 658
6881647c
MK
659 if (fe->ops.tuner_ops.sleep)
660 fe->ops.tuner_ops.sleep(fe);
63c25480 661
2f719f7a
OZ
662 if (fe->ops.analog_ops.i2c_gate_ctrl)
663 fe->ops.analog_ops.i2c_gate_ctrl(fe, 0);
746d9732 664
746d9732 665 return 0;
1da177e4 666}
5bea1cd3 667
f1f32849
MK
668static int tda8290_probe(struct tuner_i2c_props *i2c_props)
669{
670#define TDA8290_ID 0x89
567aba0b
MCC
671 u8 reg = 0x1f, id;
672 struct i2c_msg msg_read[] = {
89a8969a
JW
673 { .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = &reg },
674 { .addr = i2c_props->addr, .flags = I2C_M_RD, .len = 1, .buf = &id },
567aba0b 675 };
f1f32849
MK
676
677 /* detect tda8290 */
567aba0b 678 if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) {
89a8969a 679 printk(KERN_WARNING "%s: couldn't read register 0x%02x\n",
567aba0b
MCC
680 __func__, reg);
681 return -ENODEV;
682 }
f1f32849 683
567aba0b 684 if (id == TDA8290_ID) {
ab166050 685 if (debug)
f1f32849 686 printk(KERN_DEBUG "%s: tda8290 detected @ %d-%04x\n",
7e28adb2 687 __func__, i2c_adapter_id(i2c_props->adap),
f1f32849
MK
688 i2c_props->addr);
689 return 0;
690 }
1f3a4e32 691 return -ENODEV;
f1f32849
MK
692}
693
694static int tda8295_probe(struct tuner_i2c_props *i2c_props)
695{
696#define TDA8295_ID 0x8a
19f8a6c3 697#define TDA8295C2_ID 0x8b
567aba0b
MCC
698 u8 reg = 0x2f, id;
699 struct i2c_msg msg_read[] = {
89a8969a
JW
700 { .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = &reg },
701 { .addr = i2c_props->addr, .flags = I2C_M_RD, .len = 1, .buf = &id },
567aba0b 702 };
f1f32849 703
89a8969a 704 /* detect tda8295 */
567aba0b 705 if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) {
89a8969a 706 printk(KERN_WARNING "%s: couldn't read register 0x%02x\n",
567aba0b
MCC
707 __func__, reg);
708 return -ENODEV;
709 }
f1f32849 710
567aba0b 711 if ((id & 0xfe) == TDA8295_ID) {
ab166050 712 if (debug)
19f8a6c3 713 printk(KERN_DEBUG "%s: %s detected @ %d-%04x\n",
567aba0b 714 __func__, (id == TDA8295_ID) ?
19f8a6c3
MK
715 "tda8295c1" : "tda8295c2",
716 i2c_adapter_id(i2c_props->adap),
f1f32849
MK
717 i2c_props->addr);
718 return 0;
719 }
720
1f3a4e32 721 return -ENODEV;
f1f32849
MK
722}
723
bc3e5c7f 724static struct analog_demod_ops tda8290_ops = {
c7919d52 725 .set_params = tda8290_set_params,
8c125f2c
MK
726 .has_signal = tda8290_has_signal,
727 .standby = tda8290_standby,
728 .release = tda829x_release,
729 .i2c_gate_ctrl = tda8290_i2c_bridge,
730};
731
bc3e5c7f 732static struct analog_demod_ops tda8295_ops = {
c7919d52 733 .set_params = tda8295_set_params,
8c125f2c
MK
734 .has_signal = tda8295_has_signal,
735 .standby = tda8295_standby,
736 .release = tda829x_release,
737 .i2c_gate_ctrl = tda8295_i2c_bridge,
738};
739
ab166050
MK
740struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
741 struct i2c_adapter *i2c_adap, u8 i2c_addr,
742 struct tda829x_config *cfg)
5bea1cd3
MK
743{
744 struct tda8290_priv *priv = NULL;
ab166050 745 char *name;
8c125f2c 746
5bea1cd3
MK
747 priv = kzalloc(sizeof(struct tda8290_priv), GFP_KERNEL);
748 if (priv == NULL)
ab166050 749 return NULL;
8c125f2c 750 fe->analog_demod_priv = priv;
5bea1cd3 751
ab166050
MK
752 priv->i2c_props.addr = i2c_addr;
753 priv->i2c_props.adap = i2c_adap;
2756665c 754 priv->i2c_props.name = "tda829x";
5b0e5350
OZ
755 if (cfg) {
756 priv->cfg.config = cfg->lna_cfg;
757 priv->tda18271_std_map = cfg->tda18271_std_map;
758 }
5bea1cd3 759
f1f32849 760 if (tda8290_probe(&priv->i2c_props) == 0) {
8c125f2c 761 priv->ver = TDA8290;
bc3e5c7f
MK
762 memcpy(&fe->ops.analog_ops, &tda8290_ops,
763 sizeof(struct analog_demod_ops));
5bea1cd3 764 }
8c125f2c 765
f1f32849 766 if (tda8295_probe(&priv->i2c_props) == 0) {
8c125f2c 767 priv->ver = TDA8295;
bc3e5c7f
MK
768 memcpy(&fe->ops.analog_ops, &tda8295_ops,
769 sizeof(struct analog_demod_ops));
5bea1cd3 770 }
5bea1cd3 771
2f719f7a
OZ
772 if (cfg && cfg->no_i2c_gate)
773 fe->ops.analog_ops.i2c_gate_ctrl = NULL;
774
9d700a06
MCC
775 if (!(cfg) || (TDA829X_PROBE_TUNER == cfg->probe_tuner)) {
776 tda8295_power(fe, 1);
777 if (tda829x_find_tuner(fe) < 0)
778 goto fail;
47ab285a 779 }
5bea1cd3 780
ab166050 781 switch (priv->ver) {
c9076279
MK
782 case TDA8290:
783 name = "tda8290";
784 break;
785 case TDA8295:
786 name = "tda8295";
787 break;
ab166050
MK
788 case TDA8290 | TDA8275:
789 name = "tda8290+75";
790 break;
791 case TDA8295 | TDA8275:
792 name = "tda8295+75";
793 break;
794 case TDA8290 | TDA8275A:
795 name = "tda8290+75a";
796 break;
797 case TDA8295 | TDA8275A:
798 name = "tda8295+75a";
799 break;
800 case TDA8290 | TDA18271:
801 name = "tda8290+18271";
802 break;
803 case TDA8295 | TDA18271:
804 name = "tda8295+18271";
805 break;
806 default:
807 goto fail;
808 }
809 tuner_info("type set to %s\n", name);
810
0f2ce983
MK
811 fe->ops.analog_ops.info.name = name;
812
8c125f2c 813 if (priv->ver & TDA8290) {
439b72b6
MK
814 if (priv->ver & (TDA8275 | TDA8275A))
815 tda8290_init_tuner(fe);
8c125f2c
MK
816 tda8290_init_if(fe);
817 } else if (priv->ver & TDA8295)
818 tda8295_init_if(fe);
5bea1cd3 819
ab166050 820 return fe;
fa746aee
MK
821
822fail:
9d700a06
MCC
823 memset(&fe->ops.analog_ops, 0, sizeof(struct analog_demod_ops));
824
fa746aee 825 tda829x_release(fe);
ab166050 826 return NULL;
5bea1cd3 827}
8c125f2c 828EXPORT_SYMBOL_GPL(tda829x_attach);
1da177e4 829
ab166050 830int tda829x_probe(struct i2c_adapter *i2c_adap, u8 i2c_addr)
95736034 831{
910bb3e3 832 struct tuner_i2c_props i2c_props = {
ab166050
MK
833 .adap = i2c_adap,
834 .addr = i2c_addr,
910bb3e3 835 };
db8a6956 836
44fd06fa
HH
837 unsigned char soft_reset[] = { 0x00, 0x00 };
838 unsigned char easy_mode_b[] = { 0x01, 0x02 };
839 unsigned char easy_mode_g[] = { 0x01, 0x04 };
840 unsigned char restore_9886[] = { 0x00, 0xd6, 0x30 };
95736034
HH
841 unsigned char addr_dto_lsb = 0x07;
842 unsigned char data;
a818e1c8
MK
843#define PROBE_BUFFER_SIZE 8
844 unsigned char buf[PROBE_BUFFER_SIZE];
845 int i;
846
847 /* rule out tda9887, which would return the same byte repeatedly */
567aba0b
MCC
848 tuner_i2c_xfer_send_recv(&i2c_props,
849 soft_reset, 1, buf, PROBE_BUFFER_SIZE);
a818e1c8 850 for (i = 1; i < PROBE_BUFFER_SIZE; i++) {
bbe1e0ba
MK
851 if (buf[i] != buf[0])
852 break;
a818e1c8
MK
853 }
854
855 /* all bytes are equal, not a tda829x - probably a tda9887 */
856 if (i == PROBE_BUFFER_SIZE)
857 return -ENODEV;
95736034 858
f1f32849
MK
859 if ((tda8290_probe(&i2c_props) == 0) ||
860 (tda8295_probe(&i2c_props) == 0))
861 return 0;
862
863 /* fall back to old probing method */
910bb3e3
MK
864 tuner_i2c_xfer_send(&i2c_props, easy_mode_b, 2);
865 tuner_i2c_xfer_send(&i2c_props, soft_reset, 2);
567aba0b 866 tuner_i2c_xfer_send_recv(&i2c_props, &addr_dto_lsb, 1, &data, 1);
95736034 867 if (data == 0) {
910bb3e3
MK
868 tuner_i2c_xfer_send(&i2c_props, easy_mode_g, 2);
869 tuner_i2c_xfer_send(&i2c_props, soft_reset, 2);
567aba0b
MCC
870 tuner_i2c_xfer_send_recv(&i2c_props,
871 &addr_dto_lsb, 1, &data, 1);
95736034
HH
872 if (data == 0x7b) {
873 return 0;
874 }
875 }
910bb3e3 876 tuner_i2c_xfer_send(&i2c_props, restore_9886, 3);
1f3a4e32 877 return -ENODEV;
95736034 878}
f1f32849 879EXPORT_SYMBOL_GPL(tda829x_probe);
910bb3e3 880
8c125f2c 881MODULE_DESCRIPTION("Philips/NXP TDA8290/TDA8295 analog IF demodulator driver");
5bea1cd3 882MODULE_AUTHOR("Gerd Knorr, Hartmut Hackmann, Michael Krufky");
910bb3e3 883MODULE_LICENSE("GPL");
This page took 0.938302 seconds and 5 git commands to generate.