Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
tda827x.c
Go to the documentation of this file.
1 /*
2  *
3  * (c) 2005 Hartmut Hackmann
4  * (c) 2007 Michael Krufky
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.
19  */
20 
21 #include <linux/module.h>
22 #include <linux/slab.h>
23 #include <asm/types.h>
24 #include <linux/dvb/frontend.h>
25 #include <linux/videodev2.h>
26 
27 #include "tda827x.h"
28 
29 static int debug;
30 module_param(debug, int, 0644);
31 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
32 
33 #define dprintk(args...) \
34  do { \
35  if (debug) printk(KERN_DEBUG "tda827x: " args); \
36  } while (0)
37 
38 struct tda827x_priv {
39  int i2c_addr;
42 
43  unsigned int sgIF;
44  unsigned char lpsel;
45 
48 };
49 
50 static void tda827x_set_std(struct dvb_frontend *fe,
51  struct analog_parameters *params)
52 {
53  struct tda827x_priv *priv = fe->tuner_priv;
54  char *mode;
55 
56  priv->lpsel = 0;
57  if (params->std & V4L2_STD_MN) {
58  priv->sgIF = 92;
59  priv->lpsel = 1;
60  mode = "MN";
61  } else if (params->std & V4L2_STD_B) {
62  priv->sgIF = 108;
63  mode = "B";
64  } else if (params->std & V4L2_STD_GH) {
65  priv->sgIF = 124;
66  mode = "GH";
67  } else if (params->std & V4L2_STD_PAL_I) {
68  priv->sgIF = 124;
69  mode = "I";
70  } else if (params->std & V4L2_STD_DK) {
71  priv->sgIF = 124;
72  mode = "DK";
73  } else if (params->std & V4L2_STD_SECAM_L) {
74  priv->sgIF = 124;
75  mode = "L";
76  } else if (params->std & V4L2_STD_SECAM_LC) {
77  priv->sgIF = 20;
78  mode = "LC";
79  } else {
80  priv->sgIF = 124;
81  mode = "xx";
82  }
83 
84  if (params->mode == V4L2_TUNER_RADIO) {
85  priv->sgIF = 88; /* if frequency is 5.5 MHz */
86  dprintk("setting tda827x to radio FM\n");
87  } else
88  dprintk("setting tda827x to system %s\n", mode);
89 }
90 
91 
92 /* ------------------------------------------------------------------ */
93 
94 struct tda827x_data {
97  u8 bs;
98  u8 bp;
99  u8 cp;
102 };
103 
104 static const struct tda827x_data tda827x_table[] = {
105  { .lomax = 62000000, .spd = 3, .bs = 2, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 1},
106  { .lomax = 66000000, .spd = 3, .bs = 3, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 1},
107  { .lomax = 76000000, .spd = 3, .bs = 1, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 0},
108  { .lomax = 84000000, .spd = 3, .bs = 2, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 0},
109  { .lomax = 93000000, .spd = 3, .bs = 2, .bp = 0, .cp = 0, .gc3 = 1, .div1p5 = 0},
110  { .lomax = 98000000, .spd = 3, .bs = 3, .bp = 0, .cp = 0, .gc3 = 1, .div1p5 = 0},
111  { .lomax = 109000000, .spd = 3, .bs = 3, .bp = 1, .cp = 0, .gc3 = 1, .div1p5 = 0},
112  { .lomax = 123000000, .spd = 2, .bs = 2, .bp = 1, .cp = 0, .gc3 = 1, .div1p5 = 1},
113  { .lomax = 133000000, .spd = 2, .bs = 3, .bp = 1, .cp = 0, .gc3 = 1, .div1p5 = 1},
114  { .lomax = 151000000, .spd = 2, .bs = 1, .bp = 1, .cp = 0, .gc3 = 1, .div1p5 = 0},
115  { .lomax = 154000000, .spd = 2, .bs = 2, .bp = 1, .cp = 0, .gc3 = 1, .div1p5 = 0},
116  { .lomax = 181000000, .spd = 2, .bs = 2, .bp = 1, .cp = 0, .gc3 = 0, .div1p5 = 0},
117  { .lomax = 185000000, .spd = 2, .bs = 2, .bp = 2, .cp = 0, .gc3 = 1, .div1p5 = 0},
118  { .lomax = 217000000, .spd = 2, .bs = 3, .bp = 2, .cp = 0, .gc3 = 1, .div1p5 = 0},
119  { .lomax = 244000000, .spd = 1, .bs = 2, .bp = 2, .cp = 0, .gc3 = 1, .div1p5 = 1},
120  { .lomax = 265000000, .spd = 1, .bs = 3, .bp = 2, .cp = 0, .gc3 = 1, .div1p5 = 1},
121  { .lomax = 302000000, .spd = 1, .bs = 1, .bp = 2, .cp = 0, .gc3 = 1, .div1p5 = 0},
122  { .lomax = 324000000, .spd = 1, .bs = 2, .bp = 2, .cp = 0, .gc3 = 1, .div1p5 = 0},
123  { .lomax = 370000000, .spd = 1, .bs = 2, .bp = 3, .cp = 0, .gc3 = 1, .div1p5 = 0},
124  { .lomax = 454000000, .spd = 1, .bs = 3, .bp = 3, .cp = 0, .gc3 = 1, .div1p5 = 0},
125  { .lomax = 493000000, .spd = 0, .bs = 2, .bp = 3, .cp = 0, .gc3 = 1, .div1p5 = 1},
126  { .lomax = 530000000, .spd = 0, .bs = 3, .bp = 3, .cp = 0, .gc3 = 1, .div1p5 = 1},
127  { .lomax = 554000000, .spd = 0, .bs = 1, .bp = 3, .cp = 0, .gc3 = 1, .div1p5 = 0},
128  { .lomax = 604000000, .spd = 0, .bs = 1, .bp = 4, .cp = 0, .gc3 = 0, .div1p5 = 0},
129  { .lomax = 696000000, .spd = 0, .bs = 2, .bp = 4, .cp = 0, .gc3 = 0, .div1p5 = 0},
130  { .lomax = 740000000, .spd = 0, .bs = 2, .bp = 4, .cp = 1, .gc3 = 0, .div1p5 = 0},
131  { .lomax = 820000000, .spd = 0, .bs = 3, .bp = 4, .cp = 0, .gc3 = 0, .div1p5 = 0},
132  { .lomax = 865000000, .spd = 0, .bs = 3, .bp = 4, .cp = 1, .gc3 = 0, .div1p5 = 0},
133  { .lomax = 0, .spd = 0, .bs = 0, .bp = 0, .cp = 0, .gc3 = 0, .div1p5 = 0}
134 };
135 
136 static int tuner_transfer(struct dvb_frontend *fe,
137  struct i2c_msg *msg,
138  const int size)
139 {
140  int rc;
141  struct tda827x_priv *priv = fe->tuner_priv;
142 
143  if (fe->ops.i2c_gate_ctrl)
144  fe->ops.i2c_gate_ctrl(fe, 1);
145  rc = i2c_transfer(priv->i2c_adap, msg, size);
146  if (fe->ops.i2c_gate_ctrl)
147  fe->ops.i2c_gate_ctrl(fe, 0);
148 
149  if (rc >= 0 && rc != size)
150  return -EIO;
151 
152  return rc;
153 }
154 
155 static int tda827xo_set_params(struct dvb_frontend *fe)
156 {
158  struct tda827x_priv *priv = fe->tuner_priv;
159  u8 buf[14];
160  int rc;
161 
162  struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
163  .buf = buf, .len = sizeof(buf) };
164  int i, tuner_freq, if_freq;
165  u32 N;
166 
167  dprintk("%s:\n", __func__);
168  if (c->bandwidth_hz == 0) {
169  if_freq = 5000000;
170  } else if (c->bandwidth_hz <= 6000000) {
171  if_freq = 4000000;
172  } else if (c->bandwidth_hz <= 7000000) {
173  if_freq = 4500000;
174  } else { /* 8 MHz */
175  if_freq = 5000000;
176  }
177  tuner_freq = c->frequency;
178 
179  i = 0;
180  while (tda827x_table[i].lomax < tuner_freq) {
181  if (tda827x_table[i + 1].lomax == 0)
182  break;
183  i++;
184  }
185 
186  tuner_freq += if_freq;
187 
188  N = ((tuner_freq + 125000) / 250000) << (tda827x_table[i].spd + 2);
189  buf[0] = 0;
190  buf[1] = (N>>8) | 0x40;
191  buf[2] = N & 0xff;
192  buf[3] = 0;
193  buf[4] = 0x52;
194  buf[5] = (tda827x_table[i].spd << 6) + (tda827x_table[i].div1p5 << 5) +
195  (tda827x_table[i].bs << 3) +
196  tda827x_table[i].bp;
197  buf[6] = (tda827x_table[i].gc3 << 4) + 0x8f;
198  buf[7] = 0xbf;
199  buf[8] = 0x2a;
200  buf[9] = 0x05;
201  buf[10] = 0xff;
202  buf[11] = 0x00;
203  buf[12] = 0x00;
204  buf[13] = 0x40;
205 
206  msg.len = 14;
207  rc = tuner_transfer(fe, &msg, 1);
208  if (rc < 0)
209  goto err;
210 
211  msleep(500);
212  /* correct CP value */
213  buf[0] = 0x30;
214  buf[1] = 0x50 + tda827x_table[i].cp;
215  msg.len = 2;
216 
217  rc = tuner_transfer(fe, &msg, 1);
218  if (rc < 0)
219  goto err;
220 
221  priv->frequency = c->frequency;
222  priv->bandwidth = c->bandwidth_hz;
223 
224  return 0;
225 
226 err:
227  printk(KERN_ERR "%s: could not write to tuner at addr: 0x%02x\n",
228  __func__, priv->i2c_addr << 1);
229  return rc;
230 }
231 
232 static int tda827xo_sleep(struct dvb_frontend *fe)
233 {
234  struct tda827x_priv *priv = fe->tuner_priv;
235  static u8 buf[] = { 0x30, 0xd0 };
236  struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
237  .buf = buf, .len = sizeof(buf) };
238 
239  dprintk("%s:\n", __func__);
240  tuner_transfer(fe, &msg, 1);
241 
242  if (priv->cfg && priv->cfg->sleep)
243  priv->cfg->sleep(fe);
244 
245  return 0;
246 }
247 
248 /* ------------------------------------------------------------------ */
249 
250 static int tda827xo_set_analog_params(struct dvb_frontend *fe,
251  struct analog_parameters *params)
252 {
253  unsigned char tuner_reg[8];
254  unsigned char reg2[2];
255  u32 N;
256  int i;
257  struct tda827x_priv *priv = fe->tuner_priv;
258  struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0 };
259  unsigned int freq = params->frequency;
260 
261  tda827x_set_std(fe, params);
262 
263  if (params->mode == V4L2_TUNER_RADIO)
264  freq = freq / 1000;
265 
266  N = freq + priv->sgIF;
267 
268  i = 0;
269  while (tda827x_table[i].lomax < N * 62500) {
270  if (tda827x_table[i + 1].lomax == 0)
271  break;
272  i++;
273  }
274 
275  N = N << tda827x_table[i].spd;
276 
277  tuner_reg[0] = 0;
278  tuner_reg[1] = (unsigned char)(N>>8);
279  tuner_reg[2] = (unsigned char) N;
280  tuner_reg[3] = 0x40;
281  tuner_reg[4] = 0x52 + (priv->lpsel << 5);
282  tuner_reg[5] = (tda827x_table[i].spd << 6) +
283  (tda827x_table[i].div1p5 << 5) +
284  (tda827x_table[i].bs << 3) + tda827x_table[i].bp;
285  tuner_reg[6] = 0x8f + (tda827x_table[i].gc3 << 4);
286  tuner_reg[7] = 0x8f;
287 
288  msg.buf = tuner_reg;
289  msg.len = 8;
290  tuner_transfer(fe, &msg, 1);
291 
292  msg.buf = reg2;
293  msg.len = 2;
294  reg2[0] = 0x80;
295  reg2[1] = 0;
296  tuner_transfer(fe, &msg, 1);
297 
298  reg2[0] = 0x60;
299  reg2[1] = 0xbf;
300  tuner_transfer(fe, &msg, 1);
301 
302  reg2[0] = 0x30;
303  reg2[1] = tuner_reg[4] + 0x80;
304  tuner_transfer(fe, &msg, 1);
305 
306  msleep(1);
307  reg2[0] = 0x30;
308  reg2[1] = tuner_reg[4] + 4;
309  tuner_transfer(fe, &msg, 1);
310 
311  msleep(1);
312  reg2[0] = 0x30;
313  reg2[1] = tuner_reg[4];
314  tuner_transfer(fe, &msg, 1);
315 
316  msleep(550);
317  reg2[0] = 0x30;
318  reg2[1] = (tuner_reg[4] & 0xfc) + tda827x_table[i].cp;
319  tuner_transfer(fe, &msg, 1);
320 
321  reg2[0] = 0x60;
322  reg2[1] = 0x3f;
323  tuner_transfer(fe, &msg, 1);
324 
325  reg2[0] = 0x80;
326  reg2[1] = 0x08; /* Vsync en */
327  tuner_transfer(fe, &msg, 1);
328 
329  priv->frequency = params->frequency;
330 
331  return 0;
332 }
333 
334 static void tda827xo_agcf(struct dvb_frontend *fe)
335 {
336  struct tda827x_priv *priv = fe->tuner_priv;
337  unsigned char data[] = { 0x80, 0x0c };
338  struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
339  .buf = data, .len = 2};
340 
341  tuner_transfer(fe, &msg, 1);
342 }
343 
344 /* ------------------------------------------------------------------ */
345 
353 };
354 
355 static struct tda827xa_data tda827xa_dvbt[] = {
356  { .lomax = 56875000, .svco = 3, .spd = 4, .scr = 0, .sbs = 0, .gc3 = 1},
357  { .lomax = 67250000, .svco = 0, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1},
358  { .lomax = 81250000, .svco = 1, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1},
359  { .lomax = 97500000, .svco = 2, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1},
360  { .lomax = 113750000, .svco = 3, .spd = 3, .scr = 0, .sbs = 1, .gc3 = 1},
361  { .lomax = 134500000, .svco = 0, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
362  { .lomax = 154000000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
363  { .lomax = 162500000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
364  { .lomax = 183000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
365  { .lomax = 195000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1},
366  { .lomax = 227500000, .svco = 3, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1},
367  { .lomax = 269000000, .svco = 0, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1},
368  { .lomax = 290000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1},
369  { .lomax = 325000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1},
370  { .lomax = 390000000, .svco = 2, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1},
371  { .lomax = 455000000, .svco = 3, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1},
372  { .lomax = 520000000, .svco = 0, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1},
373  { .lomax = 538000000, .svco = 0, .spd = 0, .scr = 1, .sbs = 3, .gc3 = 1},
374  { .lomax = 550000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1},
375  { .lomax = 620000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
376  { .lomax = 650000000, .svco = 1, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
377  { .lomax = 700000000, .svco = 2, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
378  { .lomax = 780000000, .svco = 2, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
379  { .lomax = 820000000, .svco = 3, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
380  { .lomax = 870000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
381  { .lomax = 911000000, .svco = 3, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 0},
382  { .lomax = 0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}
383 };
384 
385 static struct tda827xa_data tda827xa_dvbc[] = {
386  { .lomax = 50125000, .svco = 2, .spd = 4, .scr = 2, .sbs = 0, .gc3 = 3},
387  { .lomax = 58500000, .svco = 3, .spd = 4, .scr = 2, .sbs = 0, .gc3 = 3},
388  { .lomax = 69250000, .svco = 0, .spd = 3, .scr = 2, .sbs = 0, .gc3 = 3},
389  { .lomax = 83625000, .svco = 1, .spd = 3, .scr = 2, .sbs = 0, .gc3 = 3},
390  { .lomax = 97500000, .svco = 2, .spd = 3, .scr = 2, .sbs = 0, .gc3 = 3},
391  { .lomax = 100250000, .svco = 2, .spd = 3, .scr = 2, .sbs = 1, .gc3 = 1},
392  { .lomax = 117000000, .svco = 3, .spd = 3, .scr = 2, .sbs = 1, .gc3 = 1},
393  { .lomax = 138500000, .svco = 0, .spd = 2, .scr = 2, .sbs = 1, .gc3 = 1},
394  { .lomax = 167250000, .svco = 1, .spd = 2, .scr = 2, .sbs = 1, .gc3 = 1},
395  { .lomax = 187000000, .svco = 2, .spd = 2, .scr = 2, .sbs = 1, .gc3 = 1},
396  { .lomax = 200500000, .svco = 2, .spd = 2, .scr = 2, .sbs = 2, .gc3 = 1},
397  { .lomax = 234000000, .svco = 3, .spd = 2, .scr = 2, .sbs = 2, .gc3 = 3},
398  { .lomax = 277000000, .svco = 0, .spd = 1, .scr = 2, .sbs = 2, .gc3 = 3},
399  { .lomax = 325000000, .svco = 1, .spd = 1, .scr = 2, .sbs = 2, .gc3 = 1},
400  { .lomax = 334500000, .svco = 1, .spd = 1, .scr = 2, .sbs = 3, .gc3 = 3},
401  { .lomax = 401000000, .svco = 2, .spd = 1, .scr = 2, .sbs = 3, .gc3 = 3},
402  { .lomax = 468000000, .svco = 3, .spd = 1, .scr = 2, .sbs = 3, .gc3 = 1},
403  { .lomax = 535000000, .svco = 0, .spd = 0, .scr = 1, .sbs = 3, .gc3 = 1},
404  { .lomax = 554000000, .svco = 0, .spd = 0, .scr = 2, .sbs = 3, .gc3 = 1},
405  { .lomax = 638000000, .svco = 1, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 1},
406  { .lomax = 669000000, .svco = 1, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 1},
407  { .lomax = 720000000, .svco = 2, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 1},
408  { .lomax = 802000000, .svco = 2, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 1},
409  { .lomax = 835000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 1},
410  { .lomax = 885000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 1},
411  { .lomax = 911000000, .svco = 3, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 1},
412  { .lomax = 0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}
413 };
414 
415 static struct tda827xa_data tda827xa_analog[] = {
416  { .lomax = 56875000, .svco = 3, .spd = 4, .scr = 0, .sbs = 0, .gc3 = 3},
417  { .lomax = 67250000, .svco = 0, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 3},
418  { .lomax = 81250000, .svco = 1, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 3},
419  { .lomax = 97500000, .svco = 2, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 3},
420  { .lomax = 113750000, .svco = 3, .spd = 3, .scr = 0, .sbs = 1, .gc3 = 1},
421  { .lomax = 134500000, .svco = 0, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
422  { .lomax = 154000000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
423  { .lomax = 162500000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
424  { .lomax = 183000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
425  { .lomax = 195000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1},
426  { .lomax = 227500000, .svco = 3, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 3},
427  { .lomax = 269000000, .svco = 0, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 3},
428  { .lomax = 325000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1},
429  { .lomax = 390000000, .svco = 2, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 3},
430  { .lomax = 455000000, .svco = 3, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 3},
431  { .lomax = 520000000, .svco = 0, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1},
432  { .lomax = 538000000, .svco = 0, .spd = 0, .scr = 1, .sbs = 3, .gc3 = 1},
433  { .lomax = 554000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1},
434  { .lomax = 620000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
435  { .lomax = 650000000, .svco = 1, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
436  { .lomax = 700000000, .svco = 2, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
437  { .lomax = 780000000, .svco = 2, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
438  { .lomax = 820000000, .svco = 3, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
439  { .lomax = 870000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
440  { .lomax = 911000000, .svco = 3, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 0},
441  { .lomax = 0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}
442 };
443 
444 static int tda827xa_sleep(struct dvb_frontend *fe)
445 {
446  struct tda827x_priv *priv = fe->tuner_priv;
447  static u8 buf[] = { 0x30, 0x90 };
448  struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
449  .buf = buf, .len = sizeof(buf) };
450 
451  dprintk("%s:\n", __func__);
452 
453  tuner_transfer(fe, &msg, 1);
454 
455  if (priv->cfg && priv->cfg->sleep)
456  priv->cfg->sleep(fe);
457 
458  return 0;
459 }
460 
461 static void tda827xa_lna_gain(struct dvb_frontend *fe, int high,
462  struct analog_parameters *params)
463 {
464  struct tda827x_priv *priv = fe->tuner_priv;
465  unsigned char buf[] = {0x22, 0x01};
466  int arg;
467  int gp_func;
468  struct i2c_msg msg = { .flags = 0, .buf = buf, .len = sizeof(buf) };
469 
470  if (NULL == priv->cfg) {
471  dprintk("tda827x_config not defined, cannot set LNA gain!\n");
472  return;
473  }
474  msg.addr = priv->cfg->switch_addr;
475  if (priv->cfg->config) {
476  if (high)
477  dprintk("setting LNA to high gain\n");
478  else
479  dprintk("setting LNA to low gain\n");
480  }
481  switch (priv->cfg->config) {
482  case 0: /* no LNA */
483  break;
484  case 1: /* switch is GPIO 0 of tda8290 */
485  case 2:
486  if (params == NULL) {
487  gp_func = 0;
488  arg = 0;
489  } else {
490  /* turn Vsync on */
491  gp_func = 1;
492  if (params->std & V4L2_STD_MN)
493  arg = 1;
494  else
495  arg = 0;
496  }
497  if (fe->callback)
498  fe->callback(priv->i2c_adap->algo_data,
500  gp_func, arg);
501  buf[1] = high ? 0 : 1;
502  if (priv->cfg->config == 2)
503  buf[1] = high ? 1 : 0;
504  tuner_transfer(fe, &msg, 1);
505  break;
506  case 3: /* switch with GPIO of saa713x */
507  if (fe->callback)
508  fe->callback(priv->i2c_adap->algo_data,
510  break;
511  }
512 }
513 
514 static int tda827xa_set_params(struct dvb_frontend *fe)
515 {
517  struct tda827x_priv *priv = fe->tuner_priv;
518  struct tda827xa_data *frequency_map = tda827xa_dvbt;
519  u8 buf[11];
520 
521  struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
522  .buf = buf, .len = sizeof(buf) };
523 
524  int i, tuner_freq, if_freq, rc;
525  u32 N;
526 
527  dprintk("%s:\n", __func__);
528 
529  tda827xa_lna_gain(fe, 1, NULL);
530  msleep(20);
531 
532  if (c->bandwidth_hz == 0) {
533  if_freq = 5000000;
534  } else if (c->bandwidth_hz <= 6000000) {
535  if_freq = 4000000;
536  } else if (c->bandwidth_hz <= 7000000) {
537  if_freq = 4500000;
538  } else { /* 8 MHz */
539  if_freq = 5000000;
540  }
541  tuner_freq = c->frequency;
542 
543  switch (c->delivery_system) {
544  case SYS_DVBC_ANNEX_A:
545  case SYS_DVBC_ANNEX_C:
546  dprintk("%s select tda827xa_dvbc\n", __func__);
547  frequency_map = tda827xa_dvbc;
548  break;
549  default:
550  break;
551  }
552 
553  i = 0;
554  while (frequency_map[i].lomax < tuner_freq) {
555  if (frequency_map[i + 1].lomax == 0)
556  break;
557  i++;
558  }
559 
560  tuner_freq += if_freq;
561 
562  N = ((tuner_freq + 31250) / 62500) << frequency_map[i].spd;
563  buf[0] = 0; // subaddress
564  buf[1] = N >> 8;
565  buf[2] = N & 0xff;
566  buf[3] = 0;
567  buf[4] = 0x16;
568  buf[5] = (frequency_map[i].spd << 5) + (frequency_map[i].svco << 3) +
569  frequency_map[i].sbs;
570  buf[6] = 0x4b + (frequency_map[i].gc3 << 4);
571  buf[7] = 0x1c;
572  buf[8] = 0x06;
573  buf[9] = 0x24;
574  buf[10] = 0x00;
575  msg.len = 11;
576  rc = tuner_transfer(fe, &msg, 1);
577  if (rc < 0)
578  goto err;
579 
580  buf[0] = 0x90;
581  buf[1] = 0xff;
582  buf[2] = 0x60;
583  buf[3] = 0x00;
584  buf[4] = 0x59; // lpsel, for 6MHz + 2
585  msg.len = 5;
586  rc = tuner_transfer(fe, &msg, 1);
587  if (rc < 0)
588  goto err;
589 
590  buf[0] = 0xa0;
591  buf[1] = 0x40;
592  msg.len = 2;
593  rc = tuner_transfer(fe, &msg, 1);
594  if (rc < 0)
595  goto err;
596 
597  msleep(11);
598  msg.flags = I2C_M_RD;
599  rc = tuner_transfer(fe, &msg, 1);
600  if (rc < 0)
601  goto err;
602  msg.flags = 0;
603 
604  buf[1] >>= 4;
605  dprintk("tda8275a AGC2 gain is: %d\n", buf[1]);
606  if ((buf[1]) < 2) {
607  tda827xa_lna_gain(fe, 0, NULL);
608  buf[0] = 0x60;
609  buf[1] = 0x0c;
610  rc = tuner_transfer(fe, &msg, 1);
611  if (rc < 0)
612  goto err;
613  }
614 
615  buf[0] = 0xc0;
616  buf[1] = 0x99; // lpsel, for 6MHz + 2
617  rc = tuner_transfer(fe, &msg, 1);
618  if (rc < 0)
619  goto err;
620 
621  buf[0] = 0x60;
622  buf[1] = 0x3c;
623  rc = tuner_transfer(fe, &msg, 1);
624  if (rc < 0)
625  goto err;
626 
627  /* correct CP value */
628  buf[0] = 0x30;
629  buf[1] = 0x10 + frequency_map[i].scr;
630  rc = tuner_transfer(fe, &msg, 1);
631  if (rc < 0)
632  goto err;
633 
634  msleep(163);
635  buf[0] = 0xc0;
636  buf[1] = 0x39; // lpsel, for 6MHz + 2
637  rc = tuner_transfer(fe, &msg, 1);
638  if (rc < 0)
639  goto err;
640 
641  msleep(3);
642  /* freeze AGC1 */
643  buf[0] = 0x50;
644  buf[1] = 0x4f + (frequency_map[i].gc3 << 4);
645  rc = tuner_transfer(fe, &msg, 1);
646  if (rc < 0)
647  goto err;
648 
649  priv->frequency = c->frequency;
650  priv->bandwidth = c->bandwidth_hz;
651 
652  return 0;
653 
654 err:
655  printk(KERN_ERR "%s: could not write to tuner at addr: 0x%02x\n",
656  __func__, priv->i2c_addr << 1);
657  return rc;
658 }
659 
660 
661 static int tda827xa_set_analog_params(struct dvb_frontend *fe,
662  struct analog_parameters *params)
663 {
664  unsigned char tuner_reg[11];
665  u32 N;
666  int i;
667  struct tda827x_priv *priv = fe->tuner_priv;
668  struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
669  .buf = tuner_reg, .len = sizeof(tuner_reg) };
670  unsigned int freq = params->frequency;
671 
672  tda827x_set_std(fe, params);
673 
674  tda827xa_lna_gain(fe, 1, params);
675  msleep(10);
676 
677  if (params->mode == V4L2_TUNER_RADIO)
678  freq = freq / 1000;
679 
680  N = freq + priv->sgIF;
681 
682  i = 0;
683  while (tda827xa_analog[i].lomax < N * 62500) {
684  if (tda827xa_analog[i + 1].lomax == 0)
685  break;
686  i++;
687  }
688 
689  N = N << tda827xa_analog[i].spd;
690 
691  tuner_reg[0] = 0;
692  tuner_reg[1] = (unsigned char)(N>>8);
693  tuner_reg[2] = (unsigned char) N;
694  tuner_reg[3] = 0;
695  tuner_reg[4] = 0x16;
696  tuner_reg[5] = (tda827xa_analog[i].spd << 5) +
697  (tda827xa_analog[i].svco << 3) +
698  tda827xa_analog[i].sbs;
699  tuner_reg[6] = 0x8b + (tda827xa_analog[i].gc3 << 4);
700  tuner_reg[7] = 0x1c;
701  tuner_reg[8] = 4;
702  tuner_reg[9] = 0x20;
703  tuner_reg[10] = 0x00;
704  msg.len = 11;
705  tuner_transfer(fe, &msg, 1);
706 
707  tuner_reg[0] = 0x90;
708  tuner_reg[1] = 0xff;
709  tuner_reg[2] = 0xe0;
710  tuner_reg[3] = 0;
711  tuner_reg[4] = 0x99 + (priv->lpsel << 1);
712  msg.len = 5;
713  tuner_transfer(fe, &msg, 1);
714 
715  tuner_reg[0] = 0xa0;
716  tuner_reg[1] = 0xc0;
717  msg.len = 2;
718  tuner_transfer(fe, &msg, 1);
719 
720  tuner_reg[0] = 0x30;
721  tuner_reg[1] = 0x10 + tda827xa_analog[i].scr;
722  tuner_transfer(fe, &msg, 1);
723 
724  msg.flags = I2C_M_RD;
725  tuner_transfer(fe, &msg, 1);
726  msg.flags = 0;
727  tuner_reg[1] >>= 4;
728  dprintk("AGC2 gain is: %d\n", tuner_reg[1]);
729  if (tuner_reg[1] < 1)
730  tda827xa_lna_gain(fe, 0, params);
731 
732  msleep(100);
733  tuner_reg[0] = 0x60;
734  tuner_reg[1] = 0x3c;
735  tuner_transfer(fe, &msg, 1);
736 
737  msleep(163);
738  tuner_reg[0] = 0x50;
739  tuner_reg[1] = 0x8f + (tda827xa_analog[i].gc3 << 4);
740  tuner_transfer(fe, &msg, 1);
741 
742  tuner_reg[0] = 0x80;
743  tuner_reg[1] = 0x28;
744  tuner_transfer(fe, &msg, 1);
745 
746  tuner_reg[0] = 0xb0;
747  tuner_reg[1] = 0x01;
748  tuner_transfer(fe, &msg, 1);
749 
750  tuner_reg[0] = 0xc0;
751  tuner_reg[1] = 0x19 + (priv->lpsel << 1);
752  tuner_transfer(fe, &msg, 1);
753 
754  priv->frequency = params->frequency;
755 
756  return 0;
757 }
758 
759 static void tda827xa_agcf(struct dvb_frontend *fe)
760 {
761  struct tda827x_priv *priv = fe->tuner_priv;
762  unsigned char data[] = {0x80, 0x2c};
763  struct i2c_msg msg = {.addr = priv->i2c_addr, .flags = 0,
764  .buf = data, .len = 2};
765  tuner_transfer(fe, &msg, 1);
766 }
767 
768 /* ------------------------------------------------------------------ */
769 
770 static int tda827x_release(struct dvb_frontend *fe)
771 {
772  kfree(fe->tuner_priv);
773  fe->tuner_priv = NULL;
774  return 0;
775 }
776 
777 static int tda827x_get_frequency(struct dvb_frontend *fe, u32 *frequency)
778 {
779  struct tda827x_priv *priv = fe->tuner_priv;
780  *frequency = priv->frequency;
781  return 0;
782 }
783 
784 static int tda827x_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
785 {
786  struct tda827x_priv *priv = fe->tuner_priv;
787  *bandwidth = priv->bandwidth;
788  return 0;
789 }
790 
791 static int tda827x_init(struct dvb_frontend *fe)
792 {
793  struct tda827x_priv *priv = fe->tuner_priv;
794  dprintk("%s:\n", __func__);
795  if (priv->cfg && priv->cfg->init)
796  priv->cfg->init(fe);
797 
798  return 0;
799 }
800 
801 static int tda827x_probe_version(struct dvb_frontend *fe);
802 
803 static int tda827x_initial_init(struct dvb_frontend *fe)
804 {
805  int ret;
806  ret = tda827x_probe_version(fe);
807  if (ret)
808  return ret;
809  return fe->ops.tuner_ops.init(fe);
810 }
811 
812 static int tda827x_initial_sleep(struct dvb_frontend *fe)
813 {
814  int ret;
815  ret = tda827x_probe_version(fe);
816  if (ret)
817  return ret;
818  return fe->ops.tuner_ops.sleep(fe);
819 }
820 
821 static struct dvb_tuner_ops tda827xo_tuner_ops = {
822  .info = {
823  .name = "Philips TDA827X",
824  .frequency_min = 55000000,
825  .frequency_max = 860000000,
826  .frequency_step = 250000
827  },
828  .release = tda827x_release,
829  .init = tda827x_initial_init,
830  .sleep = tda827x_initial_sleep,
831  .set_params = tda827xo_set_params,
832  .set_analog_params = tda827xo_set_analog_params,
833  .get_frequency = tda827x_get_frequency,
834  .get_bandwidth = tda827x_get_bandwidth,
835 };
836 
837 static struct dvb_tuner_ops tda827xa_tuner_ops = {
838  .info = {
839  .name = "Philips TDA827XA",
840  .frequency_min = 44000000,
841  .frequency_max = 906000000,
842  .frequency_step = 62500
843  },
844  .release = tda827x_release,
845  .init = tda827x_init,
846  .sleep = tda827xa_sleep,
847  .set_params = tda827xa_set_params,
848  .set_analog_params = tda827xa_set_analog_params,
849  .get_frequency = tda827x_get_frequency,
850  .get_bandwidth = tda827x_get_bandwidth,
851 };
852 
853 static int tda827x_probe_version(struct dvb_frontend *fe)
854 {
855  u8 data;
856  int rc;
857  struct tda827x_priv *priv = fe->tuner_priv;
858  struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = I2C_M_RD,
859  .buf = &data, .len = 1 };
860 
861  rc = tuner_transfer(fe, &msg, 1);
862 
863  if (rc < 0) {
864  printk("%s: could not read from tuner at addr: 0x%02x\n",
865  __func__, msg.addr << 1);
866  return rc;
867  }
868  if ((data & 0x3c) == 0) {
869  dprintk("tda827x tuner found\n");
870  fe->ops.tuner_ops.init = tda827x_init;
871  fe->ops.tuner_ops.sleep = tda827xo_sleep;
872  if (priv->cfg)
873  priv->cfg->agcf = tda827xo_agcf;
874  } else {
875  dprintk("tda827xa tuner found\n");
876  memcpy(&fe->ops.tuner_ops, &tda827xa_tuner_ops, sizeof(struct dvb_tuner_ops));
877  if (priv->cfg)
878  priv->cfg->agcf = tda827xa_agcf;
879  }
880  return 0;
881 }
882 
884  struct i2c_adapter *i2c,
885  struct tda827x_config *cfg)
886 {
887  struct tda827x_priv *priv = NULL;
888 
889  dprintk("%s:\n", __func__);
890  priv = kzalloc(sizeof(struct tda827x_priv), GFP_KERNEL);
891  if (priv == NULL)
892  return NULL;
893 
894  priv->i2c_addr = addr;
895  priv->i2c_adap = i2c;
896  priv->cfg = cfg;
897  memcpy(&fe->ops.tuner_ops, &tda827xo_tuner_ops, sizeof(struct dvb_tuner_ops));
898  fe->tuner_priv = priv;
899 
900  dprintk("type set to %s\n", fe->ops.tuner_ops.info.name);
901 
902  return fe;
903 }
905 
906 MODULE_DESCRIPTION("DVB TDA827x driver");
907 MODULE_AUTHOR("Hartmut Hackmann <[email protected]>");
908 MODULE_AUTHOR("Michael Krufky <[email protected]>");
909 MODULE_LICENSE("GPL");
910 
911 /*
912  * Overrides for Emacs so that we follow Linus's tabbing style.
913  * ---------------------------------------------------------------------------
914  * Local variables:
915  * c-basic-offset: 8
916  * End:
917  */