1 /* 2 * For Philips TEA5767 FM Chip used on some TV Cards like Prolink Pixelview 3 * I2C address is allways 0xC0. 4 * 5 * 6 * Copyright (c) 2005 Mauro Carvalho Chehab (mchehab@infradead.org) 7 * This code is placed under the terms of the GNU General Public License 8 * 9 * tea5767 autodetection thanks to Torsten Seeboth and Atsushi Nakagawa 10 * from their contributions on DScaler. 11 */ 12 13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 14 15 #include <linux/i2c.h> 16 #include <linux/slab.h> 17 #include <linux/delay.h> 18 #include <linux/videodev2.h> 19 #include "tuner-i2c.h" 20 #include "tea5767.h" 21 22 static int debug; 23 module_param(debug, int, 0644); 24 MODULE_PARM_DESC(debug, "enable verbose debug messages"); 25 26 /*****************************************************************************/ 27 28 struct tea5767_priv { 29 struct tuner_i2c_props i2c_props; 30 u32 frequency; 31 struct tea5767_ctrl ctrl; 32 }; 33 34 /*****************************************************************************/ 35 36 /****************************** 37 * Write mode register values * 38 ******************************/ 39 40 /* First register */ 41 #define TEA5767_MUTE 0x80 /* Mutes output */ 42 #define TEA5767_SEARCH 0x40 /* Activates station search */ 43 /* Bits 0-5 for divider MSB */ 44 45 /* Second register */ 46 /* Bits 0-7 for divider LSB */ 47 48 /* Third register */ 49 50 /* Station search from botton to up */ 51 #define TEA5767_SEARCH_UP 0x80 52 53 /* Searches with ADC output = 10 */ 54 #define TEA5767_SRCH_HIGH_LVL 0x60 55 56 /* Searches with ADC output = 10 */ 57 #define TEA5767_SRCH_MID_LVL 0x40 58 59 /* Searches with ADC output = 5 */ 60 #define TEA5767_SRCH_LOW_LVL 0x20 61 62 /* if on, div=4*(Frf+Fif)/Fref otherwise, div=4*(Frf-Fif)/Freq) */ 63 #define TEA5767_HIGH_LO_INJECT 0x10 64 65 /* Disable stereo */ 66 #define TEA5767_MONO 0x08 67 68 /* Disable right channel and turns to mono */ 69 #define TEA5767_MUTE_RIGHT 0x04 70 71 /* Disable left channel and turns to mono */ 72 #define TEA5767_MUTE_LEFT 0x02 73 74 #define TEA5767_PORT1_HIGH 0x01 75 76 /* Fourth register */ 77 #define TEA5767_PORT2_HIGH 0x80 78 /* Chips stops working. Only I2C bus remains on */ 79 #define TEA5767_STDBY 0x40 80 81 /* Japan freq (76-108 MHz. If disabled, 87.5-108 MHz */ 82 #define TEA5767_JAPAN_BAND 0x20 83 84 /* Unselected means 32.768 KHz freq as reference. Otherwise Xtal at 13 MHz */ 85 #define TEA5767_XTAL_32768 0x10 86 87 /* Cuts weak signals */ 88 #define TEA5767_SOFT_MUTE 0x08 89 90 /* Activates high cut control */ 91 #define TEA5767_HIGH_CUT_CTRL 0x04 92 93 /* Activates stereo noise control */ 94 #define TEA5767_ST_NOISE_CTL 0x02 95 96 /* If activate PORT 1 indicates SEARCH or else it is used as PORT1 */ 97 #define TEA5767_SRCH_IND 0x01 98 99 /* Fifth register */ 100 101 /* By activating, it will use Xtal at 13 MHz as reference for divider */ 102 #define TEA5767_PLLREF_ENABLE 0x80 103 104 /* By activating, deemphasis=50, or else, deemphasis of 50us */ 105 #define TEA5767_DEEMPH_75 0X40 106 107 /***************************** 108 * Read mode register values * 109 *****************************/ 110 111 /* First register */ 112 #define TEA5767_READY_FLAG_MASK 0x80 113 #define TEA5767_BAND_LIMIT_MASK 0X40 114 /* Bits 0-5 for divider MSB after search or preset */ 115 116 /* Second register */ 117 /* Bits 0-7 for divider LSB after search or preset */ 118 119 /* Third register */ 120 #define TEA5767_STEREO_MASK 0x80 121 #define TEA5767_IF_CNTR_MASK 0x7f 122 123 /* Fourth register */ 124 #define TEA5767_ADC_LEVEL_MASK 0xf0 125 126 /* should be 0 */ 127 #define TEA5767_CHIP_ID_MASK 0x0f 128 129 /* Fifth register */ 130 /* Reserved for future extensions */ 131 #define TEA5767_RESERVED_MASK 0xff 132 133 /*****************************************************************************/ 134 135 static void tea5767_status_dump(struct tea5767_priv *priv, 136 unsigned char *buffer) 137 { 138 unsigned int div, frq; 139 140 if (TEA5767_READY_FLAG_MASK & buffer[0]) 141 tuner_info("Ready Flag ON\n"); 142 else 143 tuner_info("Ready Flag OFF\n"); 144 145 if (TEA5767_BAND_LIMIT_MASK & buffer[0]) 146 tuner_info("Tuner at band limit\n"); 147 else 148 tuner_info("Tuner not at band limit\n"); 149 150 div = ((buffer[0] & 0x3f) << 8) | buffer[1]; 151 152 switch (priv->ctrl.xtal_freq) { 153 case TEA5767_HIGH_LO_13MHz: 154 frq = (div * 50000 - 700000 - 225000) / 4; /* Freq in KHz */ 155 break; 156 case TEA5767_LOW_LO_13MHz: 157 frq = (div * 50000 + 700000 + 225000) / 4; /* Freq in KHz */ 158 break; 159 case TEA5767_LOW_LO_32768: 160 frq = (div * 32768 + 700000 + 225000) / 4; /* Freq in KHz */ 161 break; 162 case TEA5767_HIGH_LO_32768: 163 default: 164 frq = (div * 32768 - 700000 - 225000) / 4; /* Freq in KHz */ 165 break; 166 } 167 buffer[0] = (div >> 8) & 0x3f; 168 buffer[1] = div & 0xff; 169 170 tuner_info("Frequency %d.%03d KHz (divider = 0x%04x)\n", 171 frq / 1000, frq % 1000, div); 172 173 if (TEA5767_STEREO_MASK & buffer[2]) 174 tuner_info("Stereo\n"); 175 else 176 tuner_info("Mono\n"); 177 178 tuner_info("IF Counter = %d\n", buffer[2] & TEA5767_IF_CNTR_MASK); 179 180 tuner_info("ADC Level = %d\n", 181 (buffer[3] & TEA5767_ADC_LEVEL_MASK) >> 4); 182 183 tuner_info("Chip ID = %d\n", (buffer[3] & TEA5767_CHIP_ID_MASK)); 184 185 tuner_info("Reserved = 0x%02x\n", 186 (buffer[4] & TEA5767_RESERVED_MASK)); 187 } 188 189 /* Freq should be specifyed at 62.5 Hz */ 190 static int set_radio_freq(struct dvb_frontend *fe, 191 struct analog_parameters *params) 192 { 193 struct tea5767_priv *priv = fe->tuner_priv; 194 unsigned int frq = params->frequency; 195 unsigned char buffer[5]; 196 unsigned div; 197 int rc; 198 199 tuner_dbg("radio freq = %d.%03d MHz\n", frq/16000,(frq/16)%1000); 200 201 buffer[2] = 0; 202 203 if (priv->ctrl.port1) 204 buffer[2] |= TEA5767_PORT1_HIGH; 205 206 if (params->audmode == V4L2_TUNER_MODE_MONO) { 207 tuner_dbg("TEA5767 set to mono\n"); 208 buffer[2] |= TEA5767_MONO; 209 } else { 210 tuner_dbg("TEA5767 set to stereo\n"); 211 } 212 213 214 buffer[3] = 0; 215 216 if (priv->ctrl.port2) 217 buffer[3] |= TEA5767_PORT2_HIGH; 218 219 if (priv->ctrl.high_cut) 220 buffer[3] |= TEA5767_HIGH_CUT_CTRL; 221 222 if (priv->ctrl.st_noise) 223 buffer[3] |= TEA5767_ST_NOISE_CTL; 224 225 if (priv->ctrl.soft_mute) 226 buffer[3] |= TEA5767_SOFT_MUTE; 227 228 if (priv->ctrl.japan_band) 229 buffer[3] |= TEA5767_JAPAN_BAND; 230 231 buffer[4] = 0; 232 233 if (priv->ctrl.deemph_75) 234 buffer[4] |= TEA5767_DEEMPH_75; 235 236 if (priv->ctrl.pllref) 237 buffer[4] |= TEA5767_PLLREF_ENABLE; 238 239 240 /* Rounds freq to next decimal value - for 62.5 KHz step */ 241 /* frq = 20*(frq/16)+radio_frq[frq%16]; */ 242 243 switch (priv->ctrl.xtal_freq) { 244 case TEA5767_HIGH_LO_13MHz: 245 tuner_dbg("radio HIGH LO inject xtal @ 13 MHz\n"); 246 buffer[2] |= TEA5767_HIGH_LO_INJECT; 247 div = (frq * (4000 / 16) + 700000 + 225000 + 25000) / 50000; 248 break; 249 case TEA5767_LOW_LO_13MHz: 250 tuner_dbg("radio LOW LO inject xtal @ 13 MHz\n"); 251 252 div = (frq * (4000 / 16) - 700000 - 225000 + 25000) / 50000; 253 break; 254 case TEA5767_LOW_LO_32768: 255 tuner_dbg("radio LOW LO inject xtal @ 32,768 MHz\n"); 256 buffer[3] |= TEA5767_XTAL_32768; 257 /* const 700=4000*175 Khz - to adjust freq to right value */ 258 div = ((frq * (4000 / 16) - 700000 - 225000) + 16384) >> 15; 259 break; 260 case TEA5767_HIGH_LO_32768: 261 default: 262 tuner_dbg("radio HIGH LO inject xtal @ 32,768 MHz\n"); 263 264 buffer[2] |= TEA5767_HIGH_LO_INJECT; 265 buffer[3] |= TEA5767_XTAL_32768; 266 div = ((frq * (4000 / 16) + 700000 + 225000) + 16384) >> 15; 267 break; 268 } 269 buffer[0] = (div >> 8) & 0x3f; 270 buffer[1] = div & 0xff; 271 272 if (5 != (rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 5))) 273 tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc); 274 275 if (debug) { 276 if (5 != (rc = tuner_i2c_xfer_recv(&priv->i2c_props, buffer, 5))) 277 tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc); 278 else 279 tea5767_status_dump(priv, buffer); 280 } 281 282 priv->frequency = frq * 125 / 2; 283 284 return 0; 285 } 286 287 static int tea5767_read_status(struct dvb_frontend *fe, char *buffer) 288 { 289 struct tea5767_priv *priv = fe->tuner_priv; 290 int rc; 291 292 memset(buffer, 0, 5); 293 if (5 != (rc = tuner_i2c_xfer_recv(&priv->i2c_props, buffer, 5))) { 294 tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc); 295 return -EREMOTEIO; 296 } 297 298 return 0; 299 } 300 301 static inline int tea5767_signal(struct dvb_frontend *fe, const char *buffer) 302 { 303 struct tea5767_priv *priv = fe->tuner_priv; 304 305 int signal = ((buffer[3] & TEA5767_ADC_LEVEL_MASK) << 8); 306 307 tuner_dbg("Signal strength: %d\n", signal); 308 309 return signal; 310 } 311 312 static inline int tea5767_stereo(struct dvb_frontend *fe, const char *buffer) 313 { 314 struct tea5767_priv *priv = fe->tuner_priv; 315 316 int stereo = buffer[2] & TEA5767_STEREO_MASK; 317 318 tuner_dbg("Radio ST GET = %02x\n", stereo); 319 320 return (stereo ? V4L2_TUNER_SUB_STEREO : 0); 321 } 322 323 static int tea5767_get_status(struct dvb_frontend *fe, u32 *status) 324 { 325 unsigned char buffer[5]; 326 327 *status = 0; 328 329 if (0 == tea5767_read_status(fe, buffer)) { 330 if (tea5767_signal(fe, buffer)) 331 *status = TUNER_STATUS_LOCKED; 332 if (tea5767_stereo(fe, buffer)) 333 *status |= TUNER_STATUS_STEREO; 334 } 335 336 return 0; 337 } 338 339 static int tea5767_get_rf_strength(struct dvb_frontend *fe, u16 *strength) 340 { 341 unsigned char buffer[5]; 342 343 *strength = 0; 344 345 if (0 == tea5767_read_status(fe, buffer)) 346 *strength = tea5767_signal(fe, buffer); 347 348 return 0; 349 } 350 351 static int tea5767_standby(struct dvb_frontend *fe) 352 { 353 unsigned char buffer[5]; 354 struct tea5767_priv *priv = fe->tuner_priv; 355 unsigned div, rc; 356 357 div = (87500 * 4 + 700 + 225 + 25) / 50; /* Set frequency to 87.5 MHz */ 358 buffer[0] = (div >> 8) & 0x3f; 359 buffer[1] = div & 0xff; 360 buffer[2] = TEA5767_PORT1_HIGH; 361 buffer[3] = TEA5767_PORT2_HIGH | TEA5767_HIGH_CUT_CTRL | 362 TEA5767_ST_NOISE_CTL | TEA5767_JAPAN_BAND | TEA5767_STDBY; 363 buffer[4] = 0; 364 365 if (5 != (rc = tuner_i2c_xfer_send(&priv->i2c_props, buffer, 5))) 366 tuner_warn("i2c i/o error: rc == %d (should be 5)\n", rc); 367 368 return 0; 369 } 370 371 int tea5767_autodetection(struct i2c_adapter* i2c_adap, u8 i2c_addr) 372 { 373 struct tuner_i2c_props i2c = { .adap = i2c_adap, .addr = i2c_addr }; 374 unsigned char buffer[7] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; 375 376 int rc; 377 378 if ((rc = tuner_i2c_xfer_recv(&i2c, buffer, 7))< 5) { 379 pr_warn("It is not a TEA5767. Received %i bytes.\n", rc); 380 return -EINVAL; 381 } 382 383 /* If all bytes are the same then it's a TV tuner and not a tea5767 */ 384 if (buffer[0] == buffer[1] && buffer[0] == buffer[2] && 385 buffer[0] == buffer[3] && buffer[0] == buffer[4]) { 386 pr_warn("All bytes are equal. It is not a TEA5767\n"); 387 return -EINVAL; 388 } 389 390 /* Status bytes: 391 * Byte 4: bit 3:1 : CI (Chip Identification) == 0 392 * bit 0 : internally set to 0 393 * Byte 5: bit 7:0 : == 0 394 */ 395 if (((buffer[3] & 0x0f) != 0x00) || (buffer[4] != 0x00)) { 396 pr_warn("Chip ID is not zero. It is not a TEA5767\n"); 397 return -EINVAL; 398 } 399 400 401 return 0; 402 } 403 404 static int tea5767_release(struct dvb_frontend *fe) 405 { 406 kfree(fe->tuner_priv); 407 fe->tuner_priv = NULL; 408 409 return 0; 410 } 411 412 static int tea5767_get_frequency(struct dvb_frontend *fe, u32 *frequency) 413 { 414 struct tea5767_priv *priv = fe->tuner_priv; 415 *frequency = priv->frequency; 416 417 return 0; 418 } 419 420 static int tea5767_set_config (struct dvb_frontend *fe, void *priv_cfg) 421 { 422 struct tea5767_priv *priv = fe->tuner_priv; 423 424 memcpy(&priv->ctrl, priv_cfg, sizeof(priv->ctrl)); 425 426 return 0; 427 } 428 429 static const struct dvb_tuner_ops tea5767_tuner_ops = { 430 .info = { 431 .name = "tea5767", // Philips TEA5767HN FM Radio 432 }, 433 434 .set_analog_params = set_radio_freq, 435 .set_config = tea5767_set_config, 436 .sleep = tea5767_standby, 437 .release = tea5767_release, 438 .get_frequency = tea5767_get_frequency, 439 .get_status = tea5767_get_status, 440 .get_rf_strength = tea5767_get_rf_strength, 441 }; 442 443 struct dvb_frontend *tea5767_attach(struct dvb_frontend *fe, 444 struct i2c_adapter* i2c_adap, 445 u8 i2c_addr) 446 { 447 struct tea5767_priv *priv = NULL; 448 449 priv = kzalloc(sizeof(struct tea5767_priv), GFP_KERNEL); 450 if (priv == NULL) 451 return NULL; 452 fe->tuner_priv = priv; 453 454 priv->i2c_props.addr = i2c_addr; 455 priv->i2c_props.adap = i2c_adap; 456 priv->i2c_props.name = "tea5767"; 457 458 priv->ctrl.xtal_freq = TEA5767_HIGH_LO_32768; 459 priv->ctrl.port1 = 1; 460 priv->ctrl.port2 = 1; 461 priv->ctrl.high_cut = 1; 462 priv->ctrl.st_noise = 1; 463 priv->ctrl.japan_band = 1; 464 465 memcpy(&fe->ops.tuner_ops, &tea5767_tuner_ops, 466 sizeof(struct dvb_tuner_ops)); 467 468 tuner_info("type set to %s\n", "Philips TEA5767HN FM Radio"); 469 470 return fe; 471 } 472 473 EXPORT_SYMBOL_GPL(tea5767_attach); 474 EXPORT_SYMBOL_GPL(tea5767_autodetection); 475 476 MODULE_DESCRIPTION("Philips TEA5767 FM tuner driver"); 477 MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>"); 478 MODULE_LICENSE("GPL"); 479