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