Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.4-rc3 1667 lines 46 kB view raw
1/* 2 STB0899 Multistandard Frontend driver 3 Copyright (C) Manu Abraham (abraham.manu@gmail.com) 4 5 Copyright (C) ST Microelectronics 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20*/ 21 22#include <linux/init.h> 23#include <linux/kernel.h> 24#include <linux/module.h> 25#include <linux/slab.h> 26#include <linux/string.h> 27 28#include <linux/dvb/frontend.h> 29#include "dvb_frontend.h" 30 31#include "stb0899_drv.h" 32#include "stb0899_priv.h" 33#include "stb0899_reg.h" 34 35static unsigned int verbose = 0;//1; 36module_param(verbose, int, 0644); 37 38/* C/N in dB/10, NIRM/NIRL */ 39static const struct stb0899_tab stb0899_cn_tab[] = { 40 { 200, 2600 }, 41 { 190, 2700 }, 42 { 180, 2860 }, 43 { 170, 3020 }, 44 { 160, 3210 }, 45 { 150, 3440 }, 46 { 140, 3710 }, 47 { 130, 4010 }, 48 { 120, 4360 }, 49 { 110, 4740 }, 50 { 100, 5190 }, 51 { 90, 5670 }, 52 { 80, 6200 }, 53 { 70, 6770 }, 54 { 60, 7360 }, 55 { 50, 7970 }, 56 { 40, 8250 }, 57 { 30, 9000 }, 58 { 20, 9450 }, 59 { 15, 9600 }, 60}; 61 62/* DVB-S AGCIQ_VALUE vs. signal level in dBm/10. 63 * As measured, connected to a modulator. 64 * -8.0 to -50.0 dBm directly connected, 65 * -52.0 to -74.8 with extra attenuation. 66 * Cut-off to AGCIQ_VALUE = 0x80 below -74.8dBm. 67 * Crude linear extrapolation below -84.8dBm and above -8.0dBm. 68 */ 69static const struct stb0899_tab stb0899_dvbsrf_tab[] = { 70 { -750, -128 }, 71 { -748, -94 }, 72 { -745, -92 }, 73 { -735, -90 }, 74 { -720, -87 }, 75 { -670, -77 }, 76 { -640, -70 }, 77 { -610, -62 }, 78 { -600, -60 }, 79 { -590, -56 }, 80 { -560, -41 }, 81 { -540, -25 }, 82 { -530, -17 }, 83 { -520, -11 }, 84 { -500, 1 }, 85 { -490, 6 }, 86 { -480, 10 }, 87 { -440, 22 }, 88 { -420, 27 }, 89 { -400, 31 }, 90 { -380, 34 }, 91 { -340, 40 }, 92 { -320, 43 }, 93 { -280, 48 }, 94 { -250, 52 }, 95 { -230, 55 }, 96 { -180, 61 }, 97 { -140, 66 }, 98 { -90, 73 }, 99 { -80, 74 }, 100 { 500, 127 } 101}; 102 103/* DVB-S2 IF_AGC_GAIN vs. signal level in dBm/10. 104 * As measured, connected to a modulator. 105 * -8.0 to -50.1 dBm directly connected, 106 * -53.0 to -76.6 with extra attenuation. 107 * Cut-off to IF_AGC_GAIN = 0x3fff below -76.6dBm. 108 * Crude linear extrapolation below -76.6dBm and above -8.0dBm. 109 */ 110static const struct stb0899_tab stb0899_dvbs2rf_tab[] = { 111 { 700, 0 }, 112 { -80, 3217 }, 113 { -150, 3893 }, 114 { -190, 4217 }, 115 { -240, 4621 }, 116 { -280, 4945 }, 117 { -320, 5273 }, 118 { -350, 5545 }, 119 { -370, 5741 }, 120 { -410, 6147 }, 121 { -450, 6671 }, 122 { -490, 7413 }, 123 { -501, 7665 }, 124 { -530, 8767 }, 125 { -560, 10219 }, 126 { -580, 10939 }, 127 { -590, 11518 }, 128 { -600, 11723 }, 129 { -650, 12659 }, 130 { -690, 13219 }, 131 { -730, 13645 }, 132 { -750, 13909 }, 133 { -766, 14153 }, 134 { -950, 16383 } 135}; 136 137/* DVB-S2 Es/N0 quant in dB/100 vs read value * 100*/ 138static struct stb0899_tab stb0899_quant_tab[] = { 139 { 0, 0 }, 140 { 0, 100 }, 141 { 600, 200 }, 142 { 950, 299 }, 143 { 1200, 398 }, 144 { 1400, 501 }, 145 { 1560, 603 }, 146 { 1690, 700 }, 147 { 1810, 804 }, 148 { 1910, 902 }, 149 { 2000, 1000 }, 150 { 2080, 1096 }, 151 { 2160, 1202 }, 152 { 2230, 1303 }, 153 { 2350, 1496 }, 154 { 2410, 1603 }, 155 { 2460, 1698 }, 156 { 2510, 1799 }, 157 { 2600, 1995 }, 158 { 2650, 2113 }, 159 { 2690, 2213 }, 160 { 2720, 2291 }, 161 { 2760, 2399 }, 162 { 2800, 2512 }, 163 { 2860, 2692 }, 164 { 2930, 2917 }, 165 { 2960, 3020 }, 166 { 3010, 3199 }, 167 { 3040, 3311 }, 168 { 3060, 3388 }, 169 { 3120, 3631 }, 170 { 3190, 3936 }, 171 { 3400, 5012 }, 172 { 3610, 6383 }, 173 { 3800, 7943 }, 174 { 4210, 12735 }, 175 { 4500, 17783 }, 176 { 4690, 22131 }, 177 { 4810, 25410 } 178}; 179 180/* DVB-S2 Es/N0 estimate in dB/100 vs read value */ 181static struct stb0899_tab stb0899_est_tab[] = { 182 { 0, 0 }, 183 { 0, 1 }, 184 { 301, 2 }, 185 { 1204, 16 }, 186 { 1806, 64 }, 187 { 2408, 256 }, 188 { 2709, 512 }, 189 { 3010, 1023 }, 190 { 3311, 2046 }, 191 { 3612, 4093 }, 192 { 3823, 6653 }, 193 { 3913, 8185 }, 194 { 4010, 10233 }, 195 { 4107, 12794 }, 196 { 4214, 16368 }, 197 { 4266, 18450 }, 198 { 4311, 20464 }, 199 { 4353, 22542 }, 200 { 4391, 24604 }, 201 { 4425, 26607 }, 202 { 4457, 28642 }, 203 { 4487, 30690 }, 204 { 4515, 32734 }, 205 { 4612, 40926 }, 206 { 4692, 49204 }, 207 { 4816, 65464 }, 208 { 4913, 81846 }, 209 { 4993, 98401 }, 210 { 5060, 114815 }, 211 { 5118, 131220 }, 212 { 5200, 158489 }, 213 { 5300, 199526 }, 214 { 5400, 251189 }, 215 { 5500, 316228 }, 216 { 5600, 398107 }, 217 { 5720, 524807 }, 218 { 5721, 526017 }, 219}; 220 221static int _stb0899_read_reg(struct stb0899_state *state, unsigned int reg) 222{ 223 int ret; 224 225 u8 b0[] = { reg >> 8, reg & 0xff }; 226 u8 buf; 227 228 struct i2c_msg msg[] = { 229 { 230 .addr = state->config->demod_address, 231 .flags = 0, 232 .buf = b0, 233 .len = 2 234 },{ 235 .addr = state->config->demod_address, 236 .flags = I2C_M_RD, 237 .buf = &buf, 238 .len = 1 239 } 240 }; 241 242 ret = i2c_transfer(state->i2c, msg, 2); 243 if (ret != 2) { 244 if (ret != -ERESTARTSYS) 245 dprintk(state->verbose, FE_ERROR, 1, 246 "Read error, Reg=[0x%02x], Status=%d", 247 reg, ret); 248 249 return ret < 0 ? ret : -EREMOTEIO; 250 } 251 if (unlikely(*state->verbose >= FE_DEBUGREG)) 252 dprintk(state->verbose, FE_ERROR, 1, "Reg=[0x%02x], data=%02x", 253 reg, buf); 254 255 return (unsigned int)buf; 256} 257 258int stb0899_read_reg(struct stb0899_state *state, unsigned int reg) 259{ 260 int result; 261 262 result = _stb0899_read_reg(state, reg); 263 /* 264 * Bug ID 9: 265 * access to 0xf2xx/0xf6xx 266 * must be followed by read from 0xf2ff/0xf6ff. 267 */ 268 if ((reg != 0xf2ff) && (reg != 0xf6ff) && 269 (((reg & 0xff00) == 0xf200) || ((reg & 0xff00) == 0xf600))) 270 _stb0899_read_reg(state, (reg | 0x00ff)); 271 272 return result; 273} 274 275u32 _stb0899_read_s2reg(struct stb0899_state *state, 276 u32 stb0899_i2cdev, 277 u32 stb0899_base_addr, 278 u16 stb0899_reg_offset) 279{ 280 int status; 281 u32 data; 282 u8 buf[7] = { 0 }; 283 u16 tmpaddr; 284 285 u8 buf_0[] = { 286 GETBYTE(stb0899_i2cdev, BYTE1), /* 0xf3 S2 Base Address (MSB) */ 287 GETBYTE(stb0899_i2cdev, BYTE0), /* 0xfc S2 Base Address (LSB) */ 288 GETBYTE(stb0899_base_addr, BYTE0), /* 0x00 Base Address (LSB) */ 289 GETBYTE(stb0899_base_addr, BYTE1), /* 0x04 Base Address (LSB) */ 290 GETBYTE(stb0899_base_addr, BYTE2), /* 0x00 Base Address (MSB) */ 291 GETBYTE(stb0899_base_addr, BYTE3), /* 0x00 Base Address (MSB) */ 292 }; 293 u8 buf_1[] = { 294 0x00, /* 0xf3 Reg Offset */ 295 0x00, /* 0x44 Reg Offset */ 296 }; 297 298 struct i2c_msg msg_0 = { 299 .addr = state->config->demod_address, 300 .flags = 0, 301 .buf = buf_0, 302 .len = 6 303 }; 304 305 struct i2c_msg msg_1 = { 306 .addr = state->config->demod_address, 307 .flags = 0, 308 .buf = buf_1, 309 .len = 2 310 }; 311 312 struct i2c_msg msg_r = { 313 .addr = state->config->demod_address, 314 .flags = I2C_M_RD, 315 .buf = buf, 316 .len = 4 317 }; 318 319 tmpaddr = stb0899_reg_offset & 0xff00; 320 if (!(stb0899_reg_offset & 0x8)) 321 tmpaddr = stb0899_reg_offset | 0x20; 322 323 buf_1[0] = GETBYTE(tmpaddr, BYTE1); 324 buf_1[1] = GETBYTE(tmpaddr, BYTE0); 325 326 status = i2c_transfer(state->i2c, &msg_0, 1); 327 if (status < 1) { 328 if (status != -ERESTARTSYS) 329 printk(KERN_ERR "%s ERR(1), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n", 330 __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status); 331 332 goto err; 333 } 334 335 /* Dummy */ 336 status = i2c_transfer(state->i2c, &msg_1, 1); 337 if (status < 1) 338 goto err; 339 340 status = i2c_transfer(state->i2c, &msg_r, 1); 341 if (status < 1) 342 goto err; 343 344 buf_1[0] = GETBYTE(stb0899_reg_offset, BYTE1); 345 buf_1[1] = GETBYTE(stb0899_reg_offset, BYTE0); 346 347 /* Actual */ 348 status = i2c_transfer(state->i2c, &msg_1, 1); 349 if (status < 1) { 350 if (status != -ERESTARTSYS) 351 printk(KERN_ERR "%s ERR(2), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n", 352 __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status); 353 goto err; 354 } 355 356 status = i2c_transfer(state->i2c, &msg_r, 1); 357 if (status < 1) { 358 if (status != -ERESTARTSYS) 359 printk(KERN_ERR "%s ERR(3), Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Status=%d\n", 360 __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, status); 361 return status < 0 ? status : -EREMOTEIO; 362 } 363 364 data = MAKEWORD32(buf[3], buf[2], buf[1], buf[0]); 365 if (unlikely(*state->verbose >= FE_DEBUGREG)) 366 printk(KERN_DEBUG "%s Device=[0x%04x], Base address=[0x%08x], Offset=[0x%04x], Data=[0x%08x]\n", 367 __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, data); 368 369 return data; 370 371err: 372 return status < 0 ? status : -EREMOTEIO; 373} 374 375int stb0899_write_s2reg(struct stb0899_state *state, 376 u32 stb0899_i2cdev, 377 u32 stb0899_base_addr, 378 u16 stb0899_reg_offset, 379 u32 stb0899_data) 380{ 381 int status; 382 383 /* Base Address Setup */ 384 u8 buf_0[] = { 385 GETBYTE(stb0899_i2cdev, BYTE1), /* 0xf3 S2 Base Address (MSB) */ 386 GETBYTE(stb0899_i2cdev, BYTE0), /* 0xfc S2 Base Address (LSB) */ 387 GETBYTE(stb0899_base_addr, BYTE0), /* 0x00 Base Address (LSB) */ 388 GETBYTE(stb0899_base_addr, BYTE1), /* 0x04 Base Address (LSB) */ 389 GETBYTE(stb0899_base_addr, BYTE2), /* 0x00 Base Address (MSB) */ 390 GETBYTE(stb0899_base_addr, BYTE3), /* 0x00 Base Address (MSB) */ 391 }; 392 u8 buf_1[] = { 393 0x00, /* 0xf3 Reg Offset */ 394 0x00, /* 0x44 Reg Offset */ 395 0x00, /* data */ 396 0x00, /* data */ 397 0x00, /* data */ 398 0x00, /* data */ 399 }; 400 401 struct i2c_msg msg_0 = { 402 .addr = state->config->demod_address, 403 .flags = 0, 404 .buf = buf_0, 405 .len = 6 406 }; 407 408 struct i2c_msg msg_1 = { 409 .addr = state->config->demod_address, 410 .flags = 0, 411 .buf = buf_1, 412 .len = 6 413 }; 414 415 buf_1[0] = GETBYTE(stb0899_reg_offset, BYTE1); 416 buf_1[1] = GETBYTE(stb0899_reg_offset, BYTE0); 417 buf_1[2] = GETBYTE(stb0899_data, BYTE0); 418 buf_1[3] = GETBYTE(stb0899_data, BYTE1); 419 buf_1[4] = GETBYTE(stb0899_data, BYTE2); 420 buf_1[5] = GETBYTE(stb0899_data, BYTE3); 421 422 if (unlikely(*state->verbose >= FE_DEBUGREG)) 423 printk(KERN_DEBUG "%s Device=[0x%04x], Base Address=[0x%08x], Offset=[0x%04x], Data=[0x%08x]\n", 424 __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, stb0899_data); 425 426 status = i2c_transfer(state->i2c, &msg_0, 1); 427 if (unlikely(status < 1)) { 428 if (status != -ERESTARTSYS) 429 printk(KERN_ERR "%s ERR (1), Device=[0x%04x], Base Address=[0x%08x], Offset=[0x%04x], Data=[0x%08x], status=%d\n", 430 __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, stb0899_data, status); 431 goto err; 432 } 433 status = i2c_transfer(state->i2c, &msg_1, 1); 434 if (unlikely(status < 1)) { 435 if (status != -ERESTARTSYS) 436 printk(KERN_ERR "%s ERR (2), Device=[0x%04x], Base Address=[0x%08x], Offset=[0x%04x], Data=[0x%08x], status=%d\n", 437 __func__, stb0899_i2cdev, stb0899_base_addr, stb0899_reg_offset, stb0899_data, status); 438 439 return status < 0 ? status : -EREMOTEIO; 440 } 441 442 return 0; 443 444err: 445 return status < 0 ? status : -EREMOTEIO; 446} 447 448int stb0899_read_regs(struct stb0899_state *state, unsigned int reg, u8 *buf, u32 count) 449{ 450 int status; 451 452 u8 b0[] = { reg >> 8, reg & 0xff }; 453 454 struct i2c_msg msg[] = { 455 { 456 .addr = state->config->demod_address, 457 .flags = 0, 458 .buf = b0, 459 .len = 2 460 },{ 461 .addr = state->config->demod_address, 462 .flags = I2C_M_RD, 463 .buf = buf, 464 .len = count 465 } 466 }; 467 468 status = i2c_transfer(state->i2c, msg, 2); 469 if (status != 2) { 470 if (status != -ERESTARTSYS) 471 printk(KERN_ERR "%s Read error, Reg=[0x%04x], Count=%u, Status=%d\n", 472 __func__, reg, count, status); 473 goto err; 474 } 475 /* 476 * Bug ID 9: 477 * access to 0xf2xx/0xf6xx 478 * must be followed by read from 0xf2ff/0xf6ff. 479 */ 480 if ((reg != 0xf2ff) && (reg != 0xf6ff) && 481 (((reg & 0xff00) == 0xf200) || ((reg & 0xff00) == 0xf600))) 482 _stb0899_read_reg(state, (reg | 0x00ff)); 483 484 if (unlikely(*state->verbose >= FE_DEBUGREG)) { 485 int i; 486 487 printk(KERN_DEBUG "%s [0x%04x]:", __func__, reg); 488 for (i = 0; i < count; i++) { 489 printk(" %02x", buf[i]); 490 } 491 printk("\n"); 492 } 493 494 return 0; 495err: 496 return status < 0 ? status : -EREMOTEIO; 497} 498 499int stb0899_write_regs(struct stb0899_state *state, unsigned int reg, u8 *data, u32 count) 500{ 501 int ret; 502 u8 buf[2 + count]; 503 struct i2c_msg i2c_msg = { 504 .addr = state->config->demod_address, 505 .flags = 0, 506 .buf = buf, 507 .len = 2 + count 508 }; 509 510 buf[0] = reg >> 8; 511 buf[1] = reg & 0xff; 512 memcpy(&buf[2], data, count); 513 514 if (unlikely(*state->verbose >= FE_DEBUGREG)) { 515 int i; 516 517 printk(KERN_DEBUG "%s [0x%04x]:", __func__, reg); 518 for (i = 0; i < count; i++) 519 printk(" %02x", data[i]); 520 printk("\n"); 521 } 522 ret = i2c_transfer(state->i2c, &i2c_msg, 1); 523 524 /* 525 * Bug ID 9: 526 * access to 0xf2xx/0xf6xx 527 * must be followed by read from 0xf2ff/0xf6ff. 528 */ 529 if ((((reg & 0xff00) == 0xf200) || ((reg & 0xff00) == 0xf600))) 530 stb0899_read_reg(state, (reg | 0x00ff)); 531 532 if (ret != 1) { 533 if (ret != -ERESTARTSYS) 534 dprintk(state->verbose, FE_ERROR, 1, "Reg=[0x%04x], Data=[0x%02x ...], Count=%u, Status=%d", 535 reg, data[0], count, ret); 536 return ret < 0 ? ret : -EREMOTEIO; 537 } 538 539 return 0; 540} 541 542int stb0899_write_reg(struct stb0899_state *state, unsigned int reg, u8 data) 543{ 544 return stb0899_write_regs(state, reg, &data, 1); 545} 546 547/* 548 * stb0899_get_mclk 549 * Get STB0899 master clock frequency 550 * ExtClk: external clock frequency (Hz) 551 */ 552static u32 stb0899_get_mclk(struct stb0899_state *state) 553{ 554 u32 mclk = 0, div = 0; 555 556 div = stb0899_read_reg(state, STB0899_NCOARSE); 557 mclk = (div + 1) * state->config->xtal_freq / 6; 558 dprintk(state->verbose, FE_DEBUG, 1, "div=%d, mclk=%d", div, mclk); 559 560 return mclk; 561} 562 563/* 564 * stb0899_set_mclk 565 * Set STB0899 master Clock frequency 566 * Mclk: demodulator master clock 567 * ExtClk: external clock frequency (Hz) 568 */ 569static void stb0899_set_mclk(struct stb0899_state *state, u32 Mclk) 570{ 571 struct stb0899_internal *internal = &state->internal; 572 u8 mdiv = 0; 573 574 dprintk(state->verbose, FE_DEBUG, 1, "state->config=%p", state->config); 575 mdiv = ((6 * Mclk) / state->config->xtal_freq) - 1; 576 dprintk(state->verbose, FE_DEBUG, 1, "mdiv=%d", mdiv); 577 578 stb0899_write_reg(state, STB0899_NCOARSE, mdiv); 579 internal->master_clk = stb0899_get_mclk(state); 580 581 dprintk(state->verbose, FE_DEBUG, 1, "MasterCLOCK=%d", internal->master_clk); 582} 583 584static int stb0899_postproc(struct stb0899_state *state, u8 ctl, int enable) 585{ 586 struct stb0899_config *config = state->config; 587 const struct stb0899_postproc *postproc = config->postproc; 588 589 /* post process event */ 590 if (postproc) { 591 if (enable) { 592 if (postproc[ctl].level == STB0899_GPIOPULLUP) 593 stb0899_write_reg(state, postproc[ctl].gpio, 0x02); 594 else 595 stb0899_write_reg(state, postproc[ctl].gpio, 0x82); 596 } else { 597 if (postproc[ctl].level == STB0899_GPIOPULLUP) 598 stb0899_write_reg(state, postproc[ctl].gpio, 0x82); 599 else 600 stb0899_write_reg(state, postproc[ctl].gpio, 0x02); 601 } 602 } 603 return 0; 604} 605 606static void stb0899_release(struct dvb_frontend *fe) 607{ 608 struct stb0899_state *state = fe->demodulator_priv; 609 610 dprintk(state->verbose, FE_DEBUG, 1, "Release Frontend"); 611 /* post process event */ 612 stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0); 613 kfree(state); 614} 615 616/* 617 * stb0899_get_alpha 618 * return: rolloff 619 */ 620static int stb0899_get_alpha(struct stb0899_state *state) 621{ 622 u8 mode_coeff; 623 624 mode_coeff = stb0899_read_reg(state, STB0899_DEMOD); 625 626 if (STB0899_GETFIELD(MODECOEFF, mode_coeff) == 1) 627 return 20; 628 else 629 return 35; 630} 631 632/* 633 * stb0899_init_calc 634 */ 635static void stb0899_init_calc(struct stb0899_state *state) 636{ 637 struct stb0899_internal *internal = &state->internal; 638 int master_clk; 639 u8 agc[2]; 640 u8 agc1cn; 641 u32 reg; 642 643 /* Read registers (in burst mode) */ 644 agc1cn = stb0899_read_reg(state, STB0899_AGC1CN); 645 stb0899_read_regs(state, STB0899_AGC1REF, agc, 2); /* AGC1R and AGC2O */ 646 647 /* Initial calculations */ 648 master_clk = stb0899_get_mclk(state); 649 internal->t_agc1 = 0; 650 internal->t_agc2 = 0; 651 internal->master_clk = master_clk; 652 internal->mclk = master_clk / 65536L; 653 internal->rolloff = stb0899_get_alpha(state); 654 655 /* DVBS2 Initial calculations */ 656 /* Set AGC value to the middle */ 657 internal->agc_gain = 8154; 658 reg = STB0899_READ_S2REG(STB0899_S2DEMOD, IF_AGC_CNTRL); 659 STB0899_SETFIELD_VAL(IF_GAIN_INIT, reg, internal->agc_gain); 660 stb0899_write_s2reg(state, STB0899_S2DEMOD, STB0899_BASE_IF_AGC_CNTRL, STB0899_OFF0_IF_AGC_CNTRL, reg); 661 662 reg = STB0899_READ_S2REG(STB0899_S2DEMOD, RRC_ALPHA); 663 internal->rrc_alpha = STB0899_GETFIELD(RRC_ALPHA, reg); 664 665 internal->center_freq = 0; 666 internal->av_frame_coarse = 10; 667 internal->av_frame_fine = 20; 668 internal->step_size = 2; 669/* 670 if ((pParams->SpectralInv == FE_IQ_NORMAL) || (pParams->SpectralInv == FE_IQ_AUTO)) 671 pParams->IQLocked = 0; 672 else 673 pParams->IQLocked = 1; 674*/ 675} 676 677static int stb0899_wait_diseqc_fifo_empty(struct stb0899_state *state, int timeout) 678{ 679 u8 reg = 0; 680 unsigned long start = jiffies; 681 682 while (1) { 683 reg = stb0899_read_reg(state, STB0899_DISSTATUS); 684 if (!STB0899_GETFIELD(FIFOFULL, reg)) 685 break; 686 if ((jiffies - start) > timeout) { 687 dprintk(state->verbose, FE_ERROR, 1, "timed out !!"); 688 return -ETIMEDOUT; 689 } 690 } 691 692 return 0; 693} 694 695static int stb0899_send_diseqc_msg(struct dvb_frontend *fe, struct dvb_diseqc_master_cmd *cmd) 696{ 697 struct stb0899_state *state = fe->demodulator_priv; 698 u8 reg, i; 699 700 if (cmd->msg_len > 8) 701 return -EINVAL; 702 703 /* enable FIFO precharge */ 704 reg = stb0899_read_reg(state, STB0899_DISCNTRL1); 705 STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 1); 706 stb0899_write_reg(state, STB0899_DISCNTRL1, reg); 707 for (i = 0; i < cmd->msg_len; i++) { 708 /* wait for FIFO empty */ 709 if (stb0899_wait_diseqc_fifo_empty(state, 100) < 0) 710 return -ETIMEDOUT; 711 712 stb0899_write_reg(state, STB0899_DISFIFO, cmd->msg[i]); 713 } 714 reg = stb0899_read_reg(state, STB0899_DISCNTRL1); 715 STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0); 716 stb0899_write_reg(state, STB0899_DISCNTRL1, reg); 717 msleep(100); 718 return 0; 719} 720 721static int stb0899_wait_diseqc_rxidle(struct stb0899_state *state, int timeout) 722{ 723 u8 reg = 0; 724 unsigned long start = jiffies; 725 726 while (!STB0899_GETFIELD(RXEND, reg)) { 727 reg = stb0899_read_reg(state, STB0899_DISRX_ST0); 728 if (jiffies - start > timeout) { 729 dprintk(state->verbose, FE_ERROR, 1, "timed out!!"); 730 return -ETIMEDOUT; 731 } 732 msleep(10); 733 } 734 735 return 0; 736} 737 738static int stb0899_recv_slave_reply(struct dvb_frontend *fe, struct dvb_diseqc_slave_reply *reply) 739{ 740 struct stb0899_state *state = fe->demodulator_priv; 741 u8 reg, length = 0, i; 742 int result; 743 744 if (stb0899_wait_diseqc_rxidle(state, 100) < 0) 745 return -ETIMEDOUT; 746 747 reg = stb0899_read_reg(state, STB0899_DISRX_ST0); 748 if (STB0899_GETFIELD(RXEND, reg)) { 749 750 reg = stb0899_read_reg(state, STB0899_DISRX_ST1); 751 length = STB0899_GETFIELD(FIFOBYTENBR, reg); 752 753 if (length > sizeof (reply->msg)) { 754 result = -EOVERFLOW; 755 goto exit; 756 } 757 reply->msg_len = length; 758 759 /* extract data */ 760 for (i = 0; i < length; i++) 761 reply->msg[i] = stb0899_read_reg(state, STB0899_DISFIFO); 762 } 763 764 return 0; 765exit: 766 767 return result; 768} 769 770static int stb0899_wait_diseqc_txidle(struct stb0899_state *state, int timeout) 771{ 772 u8 reg = 0; 773 unsigned long start = jiffies; 774 775 while (!STB0899_GETFIELD(TXIDLE, reg)) { 776 reg = stb0899_read_reg(state, STB0899_DISSTATUS); 777 if (jiffies - start > timeout) { 778 dprintk(state->verbose, FE_ERROR, 1, "timed out!!"); 779 return -ETIMEDOUT; 780 } 781 msleep(10); 782 } 783 return 0; 784} 785 786static int stb0899_send_diseqc_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t burst) 787{ 788 struct stb0899_state *state = fe->demodulator_priv; 789 u8 reg, old_state; 790 791 /* wait for diseqc idle */ 792 if (stb0899_wait_diseqc_txidle(state, 100) < 0) 793 return -ETIMEDOUT; 794 795 reg = stb0899_read_reg(state, STB0899_DISCNTRL1); 796 old_state = reg; 797 /* set to burst mode */ 798 STB0899_SETFIELD_VAL(DISEQCMODE, reg, 0x03); 799 STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0x01); 800 stb0899_write_reg(state, STB0899_DISCNTRL1, reg); 801 switch (burst) { 802 case SEC_MINI_A: 803 /* unmodulated */ 804 stb0899_write_reg(state, STB0899_DISFIFO, 0x00); 805 break; 806 case SEC_MINI_B: 807 /* modulated */ 808 stb0899_write_reg(state, STB0899_DISFIFO, 0xff); 809 break; 810 } 811 reg = stb0899_read_reg(state, STB0899_DISCNTRL1); 812 STB0899_SETFIELD_VAL(DISPRECHARGE, reg, 0x00); 813 stb0899_write_reg(state, STB0899_DISCNTRL1, reg); 814 /* wait for diseqc idle */ 815 if (stb0899_wait_diseqc_txidle(state, 100) < 0) 816 return -ETIMEDOUT; 817 818 /* restore state */ 819 stb0899_write_reg(state, STB0899_DISCNTRL1, old_state); 820 821 return 0; 822} 823 824static int stb0899_diseqc_init(struct stb0899_state *state) 825{ 826 struct dvb_diseqc_master_cmd tx_data; 827/* 828 struct dvb_diseqc_slave_reply rx_data; 829*/ 830 u8 f22_tx, f22_rx, reg; 831 832 u32 mclk, tx_freq = 22000;/* count = 0, i; */ 833 tx_data.msg[0] = 0xe2; 834 tx_data.msg_len = 3; 835 reg = stb0899_read_reg(state, STB0899_DISCNTRL2); 836 STB0899_SETFIELD_VAL(ONECHIP_TRX, reg, 0); 837 stb0899_write_reg(state, STB0899_DISCNTRL2, reg); 838 839 /* disable Tx spy */ 840 reg = stb0899_read_reg(state, STB0899_DISCNTRL1); 841 STB0899_SETFIELD_VAL(DISEQCRESET, reg, 1); 842 stb0899_write_reg(state, STB0899_DISCNTRL1, reg); 843 844 reg = stb0899_read_reg(state, STB0899_DISCNTRL1); 845 STB0899_SETFIELD_VAL(DISEQCRESET, reg, 0); 846 stb0899_write_reg(state, STB0899_DISCNTRL1, reg); 847 848 mclk = stb0899_get_mclk(state); 849 f22_tx = mclk / (tx_freq * 32); 850 stb0899_write_reg(state, STB0899_DISF22, f22_tx); /* DiSEqC Tx freq */ 851 state->rx_freq = 20000; 852 f22_rx = mclk / (state->rx_freq * 32); 853 854 return 0; 855} 856 857static int stb0899_sleep(struct dvb_frontend *fe) 858{ 859 struct stb0899_state *state = fe->demodulator_priv; 860/* 861 u8 reg; 862*/ 863 dprintk(state->verbose, FE_DEBUG, 1, "Going to Sleep .. (Really tired .. :-))"); 864 /* post process event */ 865 stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 0); 866 867 return 0; 868} 869 870static int stb0899_wakeup(struct dvb_frontend *fe) 871{ 872 int rc; 873 struct stb0899_state *state = fe->demodulator_priv; 874 875 if ((rc = stb0899_write_reg(state, STB0899_SYNTCTRL, STB0899_SELOSCI))) 876 return rc; 877 /* Activate all clocks; DVB-S2 registers are inaccessible otherwise. */ 878 if ((rc = stb0899_write_reg(state, STB0899_STOPCLK1, 0x00))) 879 return rc; 880 if ((rc = stb0899_write_reg(state, STB0899_STOPCLK2, 0x00))) 881 return rc; 882 883 /* post process event */ 884 stb0899_postproc(state, STB0899_POSTPROC_GPIO_POWER, 1); 885 886 return 0; 887} 888 889static int stb0899_init(struct dvb_frontend *fe) 890{ 891 int i; 892 struct stb0899_state *state = fe->demodulator_priv; 893 struct stb0899_config *config = state->config; 894 895 dprintk(state->verbose, FE_DEBUG, 1, "Initializing STB0899 ... "); 896 897 /* init device */ 898 dprintk(state->verbose, FE_DEBUG, 1, "init device"); 899 for (i = 0; config->init_dev[i].address != 0xffff; i++) 900 stb0899_write_reg(state, config->init_dev[i].address, config->init_dev[i].data); 901 902 dprintk(state->verbose, FE_DEBUG, 1, "init S2 demod"); 903 /* init S2 demod */ 904 for (i = 0; config->init_s2_demod[i].offset != 0xffff; i++) 905 stb0899_write_s2reg(state, STB0899_S2DEMOD, 906 config->init_s2_demod[i].base_address, 907 config->init_s2_demod[i].offset, 908 config->init_s2_demod[i].data); 909 910 dprintk(state->verbose, FE_DEBUG, 1, "init S1 demod"); 911 /* init S1 demod */ 912 for (i = 0; config->init_s1_demod[i].address != 0xffff; i++) 913 stb0899_write_reg(state, config->init_s1_demod[i].address, config->init_s1_demod[i].data); 914 915 dprintk(state->verbose, FE_DEBUG, 1, "init S2 FEC"); 916 /* init S2 fec */ 917 for (i = 0; config->init_s2_fec[i].offset != 0xffff; i++) 918 stb0899_write_s2reg(state, STB0899_S2FEC, 919 config->init_s2_fec[i].base_address, 920 config->init_s2_fec[i].offset, 921 config->init_s2_fec[i].data); 922 923 dprintk(state->verbose, FE_DEBUG, 1, "init TST"); 924 /* init test */ 925 for (i = 0; config->init_tst[i].address != 0xffff; i++) 926 stb0899_write_reg(state, config->init_tst[i].address, config->init_tst[i].data); 927 928 stb0899_init_calc(state); 929 stb0899_diseqc_init(state); 930 931 return 0; 932} 933 934static int stb0899_table_lookup(const struct stb0899_tab *tab, int max, int val) 935{ 936 int res = 0; 937 int min = 0, med; 938 939 if (val < tab[min].read) 940 res = tab[min].real; 941 else if (val >= tab[max].read) 942 res = tab[max].real; 943 else { 944 while ((max - min) > 1) { 945 med = (max + min) / 2; 946 if (val >= tab[min].read && val < tab[med].read) 947 max = med; 948 else 949 min = med; 950 } 951 res = ((val - tab[min].read) * 952 (tab[max].real - tab[min].real) / 953 (tab[max].read - tab[min].read)) + 954 tab[min].real; 955 } 956 957 return res; 958} 959 960static int stb0899_read_signal_strength(struct dvb_frontend *fe, u16 *strength) 961{ 962 struct stb0899_state *state = fe->demodulator_priv; 963 struct stb0899_internal *internal = &state->internal; 964 965 int val; 966 u32 reg; 967 *strength = 0; 968 switch (state->delsys) { 969 case SYS_DVBS: 970 case SYS_DSS: 971 if (internal->lock) { 972 reg = stb0899_read_reg(state, STB0899_VSTATUS); 973 if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) { 974 975 reg = stb0899_read_reg(state, STB0899_AGCIQIN); 976 val = (s32)(s8)STB0899_GETFIELD(AGCIQVALUE, reg); 977 978 *strength = stb0899_table_lookup(stb0899_dvbsrf_tab, ARRAY_SIZE(stb0899_dvbsrf_tab) - 1, val); 979 *strength += 750; 980 dprintk(state->verbose, FE_DEBUG, 1, "AGCIQVALUE = 0x%02x, C = %d * 0.1 dBm", 981 val & 0xff, *strength); 982 } 983 } 984 break; 985 case SYS_DVBS2: 986 if (internal->lock) { 987 reg = STB0899_READ_S2REG(STB0899_S2DEMOD, IF_AGC_GAIN); 988 val = STB0899_GETFIELD(IF_AGC_GAIN, reg); 989 990 *strength = stb0899_table_lookup(stb0899_dvbs2rf_tab, ARRAY_SIZE(stb0899_dvbs2rf_tab) - 1, val); 991 *strength += 950; 992 dprintk(state->verbose, FE_DEBUG, 1, "IF_AGC_GAIN = 0x%04x, C = %d * 0.1 dBm", 993 val & 0x3fff, *strength); 994 } 995 break; 996 default: 997 dprintk(state->verbose, FE_DEBUG, 1, "Unsupported delivery system"); 998 return -EINVAL; 999 } 1000 1001 return 0; 1002} 1003 1004static int stb0899_read_snr(struct dvb_frontend *fe, u16 *snr) 1005{ 1006 struct stb0899_state *state = fe->demodulator_priv; 1007 struct stb0899_internal *internal = &state->internal; 1008 1009 unsigned int val, quant, quantn = -1, est, estn = -1; 1010 u8 buf[2]; 1011 u32 reg; 1012 1013 *snr = 0; 1014 reg = stb0899_read_reg(state, STB0899_VSTATUS); 1015 switch (state->delsys) { 1016 case SYS_DVBS: 1017 case SYS_DSS: 1018 if (internal->lock) { 1019 if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) { 1020 1021 stb0899_read_regs(state, STB0899_NIRM, buf, 2); 1022 val = MAKEWORD16(buf[0], buf[1]); 1023 1024 *snr = stb0899_table_lookup(stb0899_cn_tab, ARRAY_SIZE(stb0899_cn_tab) - 1, val); 1025 dprintk(state->verbose, FE_DEBUG, 1, "NIR = 0x%02x%02x = %u, C/N = %d * 0.1 dBm\n", 1026 buf[0], buf[1], val, *snr); 1027 } 1028 } 1029 break; 1030 case SYS_DVBS2: 1031 if (internal->lock) { 1032 reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_CNTRL1); 1033 quant = STB0899_GETFIELD(UWP_ESN0_QUANT, reg); 1034 reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_STAT2); 1035 est = STB0899_GETFIELD(ESN0_EST, reg); 1036 if (est == 1) 1037 val = 301; /* C/N = 30.1 dB */ 1038 else if (est == 2) 1039 val = 270; /* C/N = 27.0 dB */ 1040 else { 1041 /* quantn = 100 * log(quant^2) */ 1042 quantn = stb0899_table_lookup(stb0899_quant_tab, ARRAY_SIZE(stb0899_quant_tab) - 1, quant * 100); 1043 /* estn = 100 * log(est) */ 1044 estn = stb0899_table_lookup(stb0899_est_tab, ARRAY_SIZE(stb0899_est_tab) - 1, est); 1045 /* snr(dBm/10) = -10*(log(est)-log(quant^2)) => snr(dBm/10) = (100*log(quant^2)-100*log(est))/10 */ 1046 val = (quantn - estn) / 10; 1047 } 1048 *snr = val; 1049 dprintk(state->verbose, FE_DEBUG, 1, "Es/N0 quant = %d (%d) estimate = %u (%d), C/N = %d * 0.1 dBm", 1050 quant, quantn, est, estn, val); 1051 } 1052 break; 1053 default: 1054 dprintk(state->verbose, FE_DEBUG, 1, "Unsupported delivery system"); 1055 return -EINVAL; 1056 } 1057 1058 return 0; 1059} 1060 1061static int stb0899_read_status(struct dvb_frontend *fe, enum fe_status *status) 1062{ 1063 struct stb0899_state *state = fe->demodulator_priv; 1064 struct stb0899_internal *internal = &state->internal; 1065 u8 reg; 1066 *status = 0; 1067 1068 switch (state->delsys) { 1069 case SYS_DVBS: 1070 case SYS_DSS: 1071 dprintk(state->verbose, FE_DEBUG, 1, "Delivery system DVB-S/DSS"); 1072 if (internal->lock) { 1073 reg = stb0899_read_reg(state, STB0899_VSTATUS); 1074 if (STB0899_GETFIELD(VSTATUS_LOCKEDVIT, reg)) { 1075 dprintk(state->verbose, FE_DEBUG, 1, "--------> FE_HAS_CARRIER | FE_HAS_LOCK"); 1076 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_LOCK; 1077 1078 reg = stb0899_read_reg(state, STB0899_PLPARM); 1079 if (STB0899_GETFIELD(VITCURPUN, reg)) { 1080 dprintk(state->verbose, FE_DEBUG, 1, "--------> FE_HAS_VITERBI | FE_HAS_SYNC"); 1081 *status |= FE_HAS_VITERBI | FE_HAS_SYNC; 1082 /* post process event */ 1083 stb0899_postproc(state, STB0899_POSTPROC_GPIO_LOCK, 1); 1084 } 1085 } 1086 } 1087 break; 1088 case SYS_DVBS2: 1089 dprintk(state->verbose, FE_DEBUG, 1, "Delivery system DVB-S2"); 1090 if (internal->lock) { 1091 reg = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_STAT2); 1092 if (STB0899_GETFIELD(UWP_LOCK, reg) && STB0899_GETFIELD(CSM_LOCK, reg)) { 1093 *status |= FE_HAS_CARRIER; 1094 dprintk(state->verbose, FE_DEBUG, 1, 1095 "UWP & CSM Lock ! ---> DVB-S2 FE_HAS_CARRIER"); 1096 1097 reg = stb0899_read_reg(state, STB0899_CFGPDELSTATUS1); 1098 if (STB0899_GETFIELD(CFGPDELSTATUS_LOCK, reg)) { 1099 *status |= FE_HAS_LOCK; 1100 dprintk(state->verbose, FE_DEBUG, 1, 1101 "Packet Delineator Locked ! -----> DVB-S2 FE_HAS_LOCK"); 1102 1103 } 1104 if (STB0899_GETFIELD(CONTINUOUS_STREAM, reg)) { 1105 *status |= FE_HAS_VITERBI; 1106 dprintk(state->verbose, FE_DEBUG, 1, 1107 "Packet Delineator found VITERBI ! -----> DVB-S2 FE_HAS_VITERBI"); 1108 } 1109 if (STB0899_GETFIELD(ACCEPTED_STREAM, reg)) { 1110 *status |= FE_HAS_SYNC; 1111 dprintk(state->verbose, FE_DEBUG, 1, 1112 "Packet Delineator found SYNC ! -----> DVB-S2 FE_HAS_SYNC"); 1113 /* post process event */ 1114 stb0899_postproc(state, STB0899_POSTPROC_GPIO_LOCK, 1); 1115 } 1116 } 1117 } 1118 break; 1119 default: 1120 dprintk(state->verbose, FE_DEBUG, 1, "Unsupported delivery system"); 1121 return -EINVAL; 1122 } 1123 return 0; 1124} 1125 1126/* 1127 * stb0899_get_error 1128 * viterbi error for DVB-S/DSS 1129 * packet error for DVB-S2 1130 * Bit Error Rate or Packet Error Rate * 10 ^ 7 1131 */ 1132static int stb0899_read_ber(struct dvb_frontend *fe, u32 *ber) 1133{ 1134 struct stb0899_state *state = fe->demodulator_priv; 1135 struct stb0899_internal *internal = &state->internal; 1136 1137 u8 lsb, msb; 1138 u32 i; 1139 1140 *ber = 0; 1141 1142 switch (state->delsys) { 1143 case SYS_DVBS: 1144 case SYS_DSS: 1145 if (internal->lock) { 1146 /* average 5 BER values */ 1147 for (i = 0; i < 5; i++) { 1148 msleep(100); 1149 lsb = stb0899_read_reg(state, STB0899_ECNT1L); 1150 msb = stb0899_read_reg(state, STB0899_ECNT1M); 1151 *ber += MAKEWORD16(msb, lsb); 1152 } 1153 *ber /= 5; 1154 /* Viterbi Check */ 1155 if (STB0899_GETFIELD(VSTATUS_PRFVIT, internal->v_status)) { 1156 /* Error Rate */ 1157 *ber *= 9766; 1158 /* ber = ber * 10 ^ 7 */ 1159 *ber /= (-1 + (1 << (2 * STB0899_GETFIELD(NOE, internal->err_ctrl)))); 1160 *ber /= 8; 1161 } 1162 } 1163 break; 1164 case SYS_DVBS2: 1165 if (internal->lock) { 1166 /* Average 5 PER values */ 1167 for (i = 0; i < 5; i++) { 1168 msleep(100); 1169 lsb = stb0899_read_reg(state, STB0899_ECNT1L); 1170 msb = stb0899_read_reg(state, STB0899_ECNT1M); 1171 *ber += MAKEWORD16(msb, lsb); 1172 } 1173 /* ber = ber * 10 ^ 7 */ 1174 *ber *= 10000000; 1175 *ber /= (-1 + (1 << (4 + 2 * STB0899_GETFIELD(NOE, internal->err_ctrl)))); 1176 } 1177 break; 1178 default: 1179 dprintk(state->verbose, FE_DEBUG, 1, "Unsupported delivery system"); 1180 return -EINVAL; 1181 } 1182 1183 return 0; 1184} 1185 1186static int stb0899_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) 1187{ 1188 struct stb0899_state *state = fe->demodulator_priv; 1189 1190 switch (voltage) { 1191 case SEC_VOLTAGE_13: 1192 stb0899_write_reg(state, STB0899_GPIO00CFG, 0x82); 1193 stb0899_write_reg(state, STB0899_GPIO01CFG, 0x02); 1194 stb0899_write_reg(state, STB0899_GPIO02CFG, 0x00); 1195 break; 1196 case SEC_VOLTAGE_18: 1197 stb0899_write_reg(state, STB0899_GPIO00CFG, 0x02); 1198 stb0899_write_reg(state, STB0899_GPIO01CFG, 0x02); 1199 stb0899_write_reg(state, STB0899_GPIO02CFG, 0x82); 1200 break; 1201 case SEC_VOLTAGE_OFF: 1202 stb0899_write_reg(state, STB0899_GPIO00CFG, 0x82); 1203 stb0899_write_reg(state, STB0899_GPIO01CFG, 0x82); 1204 stb0899_write_reg(state, STB0899_GPIO02CFG, 0x82); 1205 break; 1206 default: 1207 return -EINVAL; 1208 } 1209 1210 return 0; 1211} 1212 1213static int stb0899_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone) 1214{ 1215 struct stb0899_state *state = fe->demodulator_priv; 1216 struct stb0899_internal *internal = &state->internal; 1217 1218 u8 div, reg; 1219 1220 /* wait for diseqc idle */ 1221 if (stb0899_wait_diseqc_txidle(state, 100) < 0) 1222 return -ETIMEDOUT; 1223 1224 switch (tone) { 1225 case SEC_TONE_ON: 1226 div = (internal->master_clk / 100) / 5632; 1227 div = (div + 5) / 10; 1228 stb0899_write_reg(state, STB0899_DISEQCOCFG, 0x66); 1229 reg = stb0899_read_reg(state, STB0899_ACRPRESC); 1230 STB0899_SETFIELD_VAL(ACRPRESC, reg, 0x03); 1231 stb0899_write_reg(state, STB0899_ACRPRESC, reg); 1232 stb0899_write_reg(state, STB0899_ACRDIV1, div); 1233 break; 1234 case SEC_TONE_OFF: 1235 stb0899_write_reg(state, STB0899_DISEQCOCFG, 0x20); 1236 break; 1237 default: 1238 return -EINVAL; 1239 } 1240 return 0; 1241} 1242 1243int stb0899_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) 1244{ 1245 int i2c_stat; 1246 struct stb0899_state *state = fe->demodulator_priv; 1247 1248 i2c_stat = stb0899_read_reg(state, STB0899_I2CRPT); 1249 if (i2c_stat < 0) 1250 goto err; 1251 1252 if (enable) { 1253 dprintk(state->verbose, FE_DEBUG, 1, "Enabling I2C Repeater ..."); 1254 i2c_stat |= STB0899_I2CTON; 1255 if (stb0899_write_reg(state, STB0899_I2CRPT, i2c_stat) < 0) 1256 goto err; 1257 } else { 1258 dprintk(state->verbose, FE_DEBUG, 1, "Disabling I2C Repeater ..."); 1259 i2c_stat &= ~STB0899_I2CTON; 1260 if (stb0899_write_reg(state, STB0899_I2CRPT, i2c_stat) < 0) 1261 goto err; 1262 } 1263 return 0; 1264err: 1265 dprintk(state->verbose, FE_ERROR, 1, "I2C Repeater control failed"); 1266 return -EREMOTEIO; 1267} 1268 1269 1270static inline void CONVERT32(u32 x, char *str) 1271{ 1272 *str++ = (x >> 24) & 0xff; 1273 *str++ = (x >> 16) & 0xff; 1274 *str++ = (x >> 8) & 0xff; 1275 *str++ = (x >> 0) & 0xff; 1276 *str = '\0'; 1277} 1278 1279int stb0899_get_dev_id(struct stb0899_state *state) 1280{ 1281 u8 chip_id, release; 1282 u16 id; 1283 u32 demod_ver = 0, fec_ver = 0; 1284 char demod_str[5] = { 0 }; 1285 char fec_str[5] = { 0 }; 1286 1287 id = stb0899_read_reg(state, STB0899_DEV_ID); 1288 dprintk(state->verbose, FE_DEBUG, 1, "ID reg=[0x%02x]", id); 1289 chip_id = STB0899_GETFIELD(CHIP_ID, id); 1290 release = STB0899_GETFIELD(CHIP_REL, id); 1291 1292 dprintk(state->verbose, FE_ERROR, 1, "Device ID=[%d], Release=[%d]", 1293 chip_id, release); 1294 1295 CONVERT32(STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_CORE_ID), (char *)&demod_str); 1296 1297 demod_ver = STB0899_READ_S2REG(STB0899_S2DEMOD, DMD_VERSION_ID); 1298 dprintk(state->verbose, FE_ERROR, 1, "Demodulator Core ID=[%s], Version=[%d]", (char *) &demod_str, demod_ver); 1299 CONVERT32(STB0899_READ_S2REG(STB0899_S2FEC, FEC_CORE_ID_REG), (char *)&fec_str); 1300 fec_ver = STB0899_READ_S2REG(STB0899_S2FEC, FEC_VER_ID_REG); 1301 if (! (chip_id > 0)) { 1302 dprintk(state->verbose, FE_ERROR, 1, "couldn't find a STB 0899"); 1303 1304 return -ENODEV; 1305 } 1306 dprintk(state->verbose, FE_ERROR, 1, "FEC Core ID=[%s], Version=[%d]", (char*) &fec_str, fec_ver); 1307 1308 return 0; 1309} 1310 1311static void stb0899_set_delivery(struct stb0899_state *state) 1312{ 1313 u8 reg; 1314 u8 stop_clk[2]; 1315 1316 stop_clk[0] = stb0899_read_reg(state, STB0899_STOPCLK1); 1317 stop_clk[1] = stb0899_read_reg(state, STB0899_STOPCLK2); 1318 1319 switch (state->delsys) { 1320 case SYS_DVBS: 1321 dprintk(state->verbose, FE_DEBUG, 1, "Delivery System -- DVB-S"); 1322 /* FECM/Viterbi ON */ 1323 reg = stb0899_read_reg(state, STB0899_FECM); 1324 STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 0); 1325 STB0899_SETFIELD_VAL(FECM_VITERBI_ON, reg, 1); 1326 stb0899_write_reg(state, STB0899_FECM, reg); 1327 1328 stb0899_write_reg(state, STB0899_RSULC, 0xb1); 1329 stb0899_write_reg(state, STB0899_TSULC, 0x40); 1330 stb0899_write_reg(state, STB0899_RSLLC, 0x42); 1331 stb0899_write_reg(state, STB0899_TSLPL, 0x12); 1332 1333 reg = stb0899_read_reg(state, STB0899_TSTRES); 1334 STB0899_SETFIELD_VAL(FRESLDPC, reg, 1); 1335 stb0899_write_reg(state, STB0899_TSTRES, reg); 1336 1337 STB0899_SETFIELD_VAL(STOP_CHK8PSK, stop_clk[0], 1); 1338 STB0899_SETFIELD_VAL(STOP_CKFEC108, stop_clk[0], 1); 1339 STB0899_SETFIELD_VAL(STOP_CKFEC216, stop_clk[0], 1); 1340 1341 STB0899_SETFIELD_VAL(STOP_CKPKDLIN108, stop_clk[1], 1); 1342 STB0899_SETFIELD_VAL(STOP_CKPKDLIN216, stop_clk[1], 1); 1343 1344 STB0899_SETFIELD_VAL(STOP_CKINTBUF216, stop_clk[0], 1); 1345 STB0899_SETFIELD_VAL(STOP_CKCORE216, stop_clk[0], 0); 1346 1347 STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 1); 1348 break; 1349 case SYS_DVBS2: 1350 /* FECM/Viterbi OFF */ 1351 reg = stb0899_read_reg(state, STB0899_FECM); 1352 STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 0); 1353 STB0899_SETFIELD_VAL(FECM_VITERBI_ON, reg, 0); 1354 stb0899_write_reg(state, STB0899_FECM, reg); 1355 1356 stb0899_write_reg(state, STB0899_RSULC, 0xb1); 1357 stb0899_write_reg(state, STB0899_TSULC, 0x42); 1358 stb0899_write_reg(state, STB0899_RSLLC, 0x40); 1359 stb0899_write_reg(state, STB0899_TSLPL, 0x02); 1360 1361 reg = stb0899_read_reg(state, STB0899_TSTRES); 1362 STB0899_SETFIELD_VAL(FRESLDPC, reg, 0); 1363 stb0899_write_reg(state, STB0899_TSTRES, reg); 1364 1365 STB0899_SETFIELD_VAL(STOP_CHK8PSK, stop_clk[0], 1); 1366 STB0899_SETFIELD_VAL(STOP_CKFEC108, stop_clk[0], 0); 1367 STB0899_SETFIELD_VAL(STOP_CKFEC216, stop_clk[0], 0); 1368 1369 STB0899_SETFIELD_VAL(STOP_CKPKDLIN108, stop_clk[1], 0); 1370 STB0899_SETFIELD_VAL(STOP_CKPKDLIN216, stop_clk[1], 0); 1371 1372 STB0899_SETFIELD_VAL(STOP_CKINTBUF216, stop_clk[0], 0); 1373 STB0899_SETFIELD_VAL(STOP_CKCORE216, stop_clk[0], 0); 1374 1375 STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 0); 1376 break; 1377 case SYS_DSS: 1378 /* FECM/Viterbi ON */ 1379 reg = stb0899_read_reg(state, STB0899_FECM); 1380 STB0899_SETFIELD_VAL(FECM_RSVD0, reg, 1); 1381 STB0899_SETFIELD_VAL(FECM_VITERBI_ON, reg, 1); 1382 stb0899_write_reg(state, STB0899_FECM, reg); 1383 1384 stb0899_write_reg(state, STB0899_RSULC, 0xa1); 1385 stb0899_write_reg(state, STB0899_TSULC, 0x61); 1386 stb0899_write_reg(state, STB0899_RSLLC, 0x42); 1387 1388 reg = stb0899_read_reg(state, STB0899_TSTRES); 1389 STB0899_SETFIELD_VAL(FRESLDPC, reg, 1); 1390 stb0899_write_reg(state, STB0899_TSTRES, reg); 1391 1392 STB0899_SETFIELD_VAL(STOP_CHK8PSK, stop_clk[0], 1); 1393 STB0899_SETFIELD_VAL(STOP_CKFEC108, stop_clk[0], 1); 1394 STB0899_SETFIELD_VAL(STOP_CKFEC216, stop_clk[0], 1); 1395 1396 STB0899_SETFIELD_VAL(STOP_CKPKDLIN108, stop_clk[1], 1); 1397 STB0899_SETFIELD_VAL(STOP_CKPKDLIN216, stop_clk[1], 1); 1398 1399 STB0899_SETFIELD_VAL(STOP_CKCORE216, stop_clk[0], 0); 1400 1401 STB0899_SETFIELD_VAL(STOP_CKS2DMD108, stop_clk[1], 1); 1402 break; 1403 default: 1404 dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system"); 1405 break; 1406 } 1407 STB0899_SETFIELD_VAL(STOP_CKADCI108, stop_clk[0], 0); 1408 stb0899_write_regs(state, STB0899_STOPCLK1, stop_clk, 2); 1409} 1410 1411/* 1412 * stb0899_set_iterations 1413 * set the LDPC iteration scale function 1414 */ 1415static void stb0899_set_iterations(struct stb0899_state *state) 1416{ 1417 struct stb0899_internal *internal = &state->internal; 1418 struct stb0899_config *config = state->config; 1419 1420 s32 iter_scale; 1421 u32 reg; 1422 1423 iter_scale = 17 * (internal->master_clk / 1000); 1424 iter_scale += 410000; 1425 iter_scale /= (internal->srate / 1000000); 1426 iter_scale /= 1000; 1427 1428 if (iter_scale > config->ldpc_max_iter) 1429 iter_scale = config->ldpc_max_iter; 1430 1431 reg = STB0899_READ_S2REG(STB0899_S2FEC, MAX_ITER); 1432 STB0899_SETFIELD_VAL(MAX_ITERATIONS, reg, iter_scale); 1433 stb0899_write_s2reg(state, STB0899_S2FEC, STB0899_BASE_MAX_ITER, STB0899_OFF0_MAX_ITER, reg); 1434} 1435 1436static enum dvbfe_search stb0899_search(struct dvb_frontend *fe) 1437{ 1438 struct stb0899_state *state = fe->demodulator_priv; 1439 struct stb0899_params *i_params = &state->params; 1440 struct stb0899_internal *internal = &state->internal; 1441 struct stb0899_config *config = state->config; 1442 struct dtv_frontend_properties *props = &fe->dtv_property_cache; 1443 1444 u32 SearchRange, gain; 1445 1446 i_params->freq = props->frequency; 1447 i_params->srate = props->symbol_rate; 1448 state->delsys = props->delivery_system; 1449 dprintk(state->verbose, FE_DEBUG, 1, "delivery system=%d", state->delsys); 1450 1451 SearchRange = 10000000; 1452 dprintk(state->verbose, FE_DEBUG, 1, "Frequency=%d, Srate=%d", i_params->freq, i_params->srate); 1453 /* checking Search Range is meaningless for a fixed 3 Mhz */ 1454 if (INRANGE(i_params->srate, 1000000, 45000000)) { 1455 dprintk(state->verbose, FE_DEBUG, 1, "Parameters IN RANGE"); 1456 stb0899_set_delivery(state); 1457 1458 if (state->config->tuner_set_rfsiggain) { 1459 if (internal->srate > 15000000) 1460 gain = 8; /* 15Mb < srate < 45Mb, gain = 8dB */ 1461 else if (internal->srate > 5000000) 1462 gain = 12; /* 5Mb < srate < 15Mb, gain = 12dB */ 1463 else 1464 gain = 14; /* 1Mb < srate < 5Mb, gain = 14db */ 1465 state->config->tuner_set_rfsiggain(fe, gain); 1466 } 1467 1468 if (i_params->srate <= 5000000) 1469 stb0899_set_mclk(state, config->lo_clk); 1470 else 1471 stb0899_set_mclk(state, config->hi_clk); 1472 1473 switch (state->delsys) { 1474 case SYS_DVBS: 1475 case SYS_DSS: 1476 dprintk(state->verbose, FE_DEBUG, 1, "DVB-S delivery system"); 1477 internal->freq = i_params->freq; 1478 internal->srate = i_params->srate; 1479 /* 1480 * search = user search range + 1481 * 500Khz + 1482 * 2 * Tuner_step_size + 1483 * 10% of the symbol rate 1484 */ 1485 internal->srch_range = SearchRange + 1500000 + (i_params->srate / 5); 1486 internal->derot_percent = 30; 1487 1488 /* What to do for tuners having no bandwidth setup ? */ 1489 /* enable tuner I/O */ 1490 stb0899_i2c_gate_ctrl(&state->frontend, 1); 1491 1492 if (state->config->tuner_set_bandwidth) 1493 state->config->tuner_set_bandwidth(fe, (13 * (stb0899_carr_width(state) + SearchRange)) / 10); 1494 if (state->config->tuner_get_bandwidth) 1495 state->config->tuner_get_bandwidth(fe, &internal->tuner_bw); 1496 1497 /* disable tuner I/O */ 1498 stb0899_i2c_gate_ctrl(&state->frontend, 0); 1499 1500 /* Set DVB-S1 AGC */ 1501 stb0899_write_reg(state, STB0899_AGCRFCFG, 0x11); 1502 1503 /* Run the search algorithm */ 1504 dprintk(state->verbose, FE_DEBUG, 1, "running DVB-S search algo .."); 1505 if (stb0899_dvbs_algo(state) == RANGEOK) { 1506 internal->lock = 1; 1507 dprintk(state->verbose, FE_DEBUG, 1, 1508 "-------------------------------------> DVB-S LOCK !"); 1509 1510// stb0899_write_reg(state, STB0899_ERRCTRL1, 0x3d); /* Viterbi Errors */ 1511// internal->v_status = stb0899_read_reg(state, STB0899_VSTATUS); 1512// internal->err_ctrl = stb0899_read_reg(state, STB0899_ERRCTRL1); 1513// dprintk(state->verbose, FE_DEBUG, 1, "VSTATUS=0x%02x", internal->v_status); 1514// dprintk(state->verbose, FE_DEBUG, 1, "ERR_CTRL=0x%02x", internal->err_ctrl); 1515 1516 return DVBFE_ALGO_SEARCH_SUCCESS; 1517 } else { 1518 internal->lock = 0; 1519 1520 return DVBFE_ALGO_SEARCH_FAILED; 1521 } 1522 break; 1523 case SYS_DVBS2: 1524 internal->freq = i_params->freq; 1525 internal->srate = i_params->srate; 1526 internal->srch_range = SearchRange; 1527 1528 /* enable tuner I/O */ 1529 stb0899_i2c_gate_ctrl(&state->frontend, 1); 1530 1531 if (state->config->tuner_set_bandwidth) 1532 state->config->tuner_set_bandwidth(fe, (stb0899_carr_width(state) + SearchRange)); 1533 if (state->config->tuner_get_bandwidth) 1534 state->config->tuner_get_bandwidth(fe, &internal->tuner_bw); 1535 1536 /* disable tuner I/O */ 1537 stb0899_i2c_gate_ctrl(&state->frontend, 0); 1538 1539// pParams->SpectralInv = pSearch->IQ_Inversion; 1540 1541 /* Set DVB-S2 AGC */ 1542 stb0899_write_reg(state, STB0899_AGCRFCFG, 0x1c); 1543 1544 /* Set IterScale =f(MCLK,SYMB) */ 1545 stb0899_set_iterations(state); 1546 1547 /* Run the search algorithm */ 1548 dprintk(state->verbose, FE_DEBUG, 1, "running DVB-S2 search algo .."); 1549 if (stb0899_dvbs2_algo(state) == DVBS2_FEC_LOCK) { 1550 internal->lock = 1; 1551 dprintk(state->verbose, FE_DEBUG, 1, 1552 "-------------------------------------> DVB-S2 LOCK !"); 1553 1554// stb0899_write_reg(state, STB0899_ERRCTRL1, 0xb6); /* Packet Errors */ 1555// internal->v_status = stb0899_read_reg(state, STB0899_VSTATUS); 1556// internal->err_ctrl = stb0899_read_reg(state, STB0899_ERRCTRL1); 1557 1558 return DVBFE_ALGO_SEARCH_SUCCESS; 1559 } else { 1560 internal->lock = 0; 1561 1562 return DVBFE_ALGO_SEARCH_FAILED; 1563 } 1564 break; 1565 default: 1566 dprintk(state->verbose, FE_ERROR, 1, "Unsupported delivery system"); 1567 return DVBFE_ALGO_SEARCH_INVALID; 1568 } 1569 } 1570 1571 return DVBFE_ALGO_SEARCH_ERROR; 1572} 1573 1574static int stb0899_get_frontend(struct dvb_frontend *fe) 1575{ 1576 struct dtv_frontend_properties *p = &fe->dtv_property_cache; 1577 struct stb0899_state *state = fe->demodulator_priv; 1578 struct stb0899_internal *internal = &state->internal; 1579 1580 dprintk(state->verbose, FE_DEBUG, 1, "Get params"); 1581 p->symbol_rate = internal->srate; 1582 1583 return 0; 1584} 1585 1586static enum dvbfe_algo stb0899_frontend_algo(struct dvb_frontend *fe) 1587{ 1588 return DVBFE_ALGO_CUSTOM; 1589} 1590 1591static struct dvb_frontend_ops stb0899_ops = { 1592 .delsys = { SYS_DVBS, SYS_DVBS2, SYS_DSS }, 1593 .info = { 1594 .name = "STB0899 Multistandard", 1595 .frequency_min = 950000, 1596 .frequency_max = 2150000, 1597 .frequency_stepsize = 0, 1598 .frequency_tolerance = 0, 1599 .symbol_rate_min = 5000000, 1600 .symbol_rate_max = 45000000, 1601 1602 .caps = FE_CAN_INVERSION_AUTO | 1603 FE_CAN_FEC_AUTO | 1604 FE_CAN_2G_MODULATION | 1605 FE_CAN_QPSK 1606 }, 1607 1608 .release = stb0899_release, 1609 .init = stb0899_init, 1610 .sleep = stb0899_sleep, 1611// .wakeup = stb0899_wakeup, 1612 1613 .i2c_gate_ctrl = stb0899_i2c_gate_ctrl, 1614 1615 .get_frontend_algo = stb0899_frontend_algo, 1616 .search = stb0899_search, 1617 .get_frontend = stb0899_get_frontend, 1618 1619 1620 .read_status = stb0899_read_status, 1621 .read_snr = stb0899_read_snr, 1622 .read_signal_strength = stb0899_read_signal_strength, 1623 .read_ber = stb0899_read_ber, 1624 1625 .set_voltage = stb0899_set_voltage, 1626 .set_tone = stb0899_set_tone, 1627 1628 .diseqc_send_master_cmd = stb0899_send_diseqc_msg, 1629 .diseqc_recv_slave_reply = stb0899_recv_slave_reply, 1630 .diseqc_send_burst = stb0899_send_diseqc_burst, 1631}; 1632 1633struct dvb_frontend *stb0899_attach(struct stb0899_config *config, struct i2c_adapter *i2c) 1634{ 1635 struct stb0899_state *state = NULL; 1636 enum stb0899_inversion inversion; 1637 1638 state = kzalloc(sizeof (struct stb0899_state), GFP_KERNEL); 1639 if (state == NULL) 1640 goto error; 1641 1642 inversion = config->inversion; 1643 state->verbose = &verbose; 1644 state->config = config; 1645 state->i2c = i2c; 1646 state->frontend.ops = stb0899_ops; 1647 state->frontend.demodulator_priv = state; 1648 state->internal.inversion = inversion; 1649 1650 stb0899_wakeup(&state->frontend); 1651 if (stb0899_get_dev_id(state) == -ENODEV) { 1652 printk("%s: Exiting .. !\n", __func__); 1653 goto error; 1654 } 1655 1656 printk("%s: Attaching STB0899 \n", __func__); 1657 return &state->frontend; 1658 1659error: 1660 kfree(state); 1661 return NULL; 1662} 1663EXPORT_SYMBOL(stb0899_attach); 1664MODULE_PARM_DESC(verbose, "Set Verbosity level"); 1665MODULE_AUTHOR("Manu Abraham"); 1666MODULE_DESCRIPTION("STB0899 Multi-Std frontend"); 1667MODULE_LICENSE("GPL");