cxd2880_top.c (46678B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * cxd2880_top.c 4 * Sony CXD2880 DVB-T2/T tuner + demodulator driver 5 * 6 * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation 7 */ 8 9#define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__ 10 11#include <linux/spi/spi.h> 12 13#include <media/dvb_frontend.h> 14#include <media/dvb_math.h> 15 16#include "cxd2880.h" 17#include "cxd2880_tnrdmd_mon.h" 18#include "cxd2880_tnrdmd_dvbt2_mon.h" 19#include "cxd2880_tnrdmd_dvbt_mon.h" 20#include "cxd2880_integ.h" 21#include "cxd2880_tnrdmd_dvbt2.h" 22#include "cxd2880_tnrdmd_dvbt.h" 23#include "cxd2880_devio_spi.h" 24#include "cxd2880_spi_device.h" 25#include "cxd2880_tnrdmd_driver_version.h" 26 27struct cxd2880_priv { 28 struct cxd2880_tnrdmd tnrdmd; 29 struct spi_device *spi; 30 struct cxd2880_io regio; 31 struct cxd2880_spi_device spi_device; 32 struct cxd2880_spi cxd2880_spi; 33 struct cxd2880_dvbt_tune_param dvbt_tune_param; 34 struct cxd2880_dvbt2_tune_param dvbt2_tune_param; 35 struct mutex *spi_mutex; /* For SPI access exclusive control */ 36 unsigned long pre_ber_update; 37 unsigned long pre_ber_interval; 38 unsigned long post_ber_update; 39 unsigned long post_ber_interval; 40 unsigned long ucblock_update; 41 unsigned long ucblock_interval; 42 enum fe_status s; 43}; 44 45static int cxd2880_pre_bit_err_t(struct cxd2880_tnrdmd *tnrdmd, 46 u32 *pre_bit_err, u32 *pre_bit_count) 47{ 48 u8 rdata[2]; 49 int ret; 50 51 if (!tnrdmd || !pre_bit_err || !pre_bit_count) 52 return -EINVAL; 53 54 if (tnrdmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 55 return -EINVAL; 56 57 if (tnrdmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 58 return -EINVAL; 59 60 if (tnrdmd->sys != CXD2880_DTV_SYS_DVBT) 61 return -EINVAL; 62 63 ret = slvt_freeze_reg(tnrdmd); 64 if (ret) 65 return ret; 66 67 ret = tnrdmd->io->write_reg(tnrdmd->io, 68 CXD2880_IO_TGT_DMD, 69 0x00, 0x10); 70 if (ret) { 71 slvt_unfreeze_reg(tnrdmd); 72 return ret; 73 } 74 75 ret = tnrdmd->io->read_regs(tnrdmd->io, 76 CXD2880_IO_TGT_DMD, 77 0x39, rdata, 1); 78 if (ret) { 79 slvt_unfreeze_reg(tnrdmd); 80 return ret; 81 } 82 83 if ((rdata[0] & 0x01) == 0) { 84 slvt_unfreeze_reg(tnrdmd); 85 return -EAGAIN; 86 } 87 88 ret = tnrdmd->io->read_regs(tnrdmd->io, 89 CXD2880_IO_TGT_DMD, 90 0x22, rdata, 2); 91 if (ret) { 92 slvt_unfreeze_reg(tnrdmd); 93 return ret; 94 } 95 96 *pre_bit_err = (rdata[0] << 8) | rdata[1]; 97 98 ret = tnrdmd->io->read_regs(tnrdmd->io, 99 CXD2880_IO_TGT_DMD, 100 0x6f, rdata, 1); 101 if (ret) { 102 slvt_unfreeze_reg(tnrdmd); 103 return ret; 104 } 105 106 slvt_unfreeze_reg(tnrdmd); 107 108 *pre_bit_count = ((rdata[0] & 0x07) == 0) ? 109 256 : (0x1000 << (rdata[0] & 0x07)); 110 111 return 0; 112} 113 114static int cxd2880_pre_bit_err_t2(struct cxd2880_tnrdmd *tnrdmd, 115 u32 *pre_bit_err, 116 u32 *pre_bit_count) 117{ 118 u32 period_exp = 0; 119 u32 n_ldpc = 0; 120 u8 data[5]; 121 int ret; 122 123 if (!tnrdmd || !pre_bit_err || !pre_bit_count) 124 return -EINVAL; 125 126 if (tnrdmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 127 return -EINVAL; 128 129 if (tnrdmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 130 return -EINVAL; 131 132 if (tnrdmd->sys != CXD2880_DTV_SYS_DVBT2) 133 return -EINVAL; 134 135 ret = slvt_freeze_reg(tnrdmd); 136 if (ret) 137 return ret; 138 139 ret = tnrdmd->io->write_reg(tnrdmd->io, 140 CXD2880_IO_TGT_DMD, 141 0x00, 0x0b); 142 if (ret) { 143 slvt_unfreeze_reg(tnrdmd); 144 return ret; 145 } 146 147 ret = tnrdmd->io->read_regs(tnrdmd->io, 148 CXD2880_IO_TGT_DMD, 149 0x3c, data, sizeof(data)); 150 if (ret) { 151 slvt_unfreeze_reg(tnrdmd); 152 return ret; 153 } 154 155 if (!(data[0] & 0x01)) { 156 slvt_unfreeze_reg(tnrdmd); 157 return -EAGAIN; 158 } 159 *pre_bit_err = 160 ((data[1] & 0x0f) << 24) | (data[2] << 16) | (data[3] << 8) | data[4]; 161 162 ret = tnrdmd->io->read_regs(tnrdmd->io, 163 CXD2880_IO_TGT_DMD, 164 0xa0, data, 1); 165 if (ret) { 166 slvt_unfreeze_reg(tnrdmd); 167 return ret; 168 } 169 170 if (((enum cxd2880_dvbt2_plp_fec)(data[0] & 0x03)) == 171 CXD2880_DVBT2_FEC_LDPC_16K) 172 n_ldpc = 16200; 173 else 174 n_ldpc = 64800; 175 slvt_unfreeze_reg(tnrdmd); 176 177 ret = tnrdmd->io->write_reg(tnrdmd->io, 178 CXD2880_IO_TGT_DMD, 179 0x00, 0x20); 180 if (ret) 181 return ret; 182 183 ret = tnrdmd->io->read_regs(tnrdmd->io, 184 CXD2880_IO_TGT_DMD, 185 0x6f, data, 1); 186 if (ret) 187 return ret; 188 189 period_exp = data[0] & 0x0f; 190 191 *pre_bit_count = (1U << period_exp) * n_ldpc; 192 193 return 0; 194} 195 196static int cxd2880_post_bit_err_t(struct cxd2880_tnrdmd *tnrdmd, 197 u32 *post_bit_err, 198 u32 *post_bit_count) 199{ 200 u8 rdata[3]; 201 u32 bit_error = 0; 202 u32 period_exp = 0; 203 int ret; 204 205 if (!tnrdmd || !post_bit_err || !post_bit_count) 206 return -EINVAL; 207 208 if (tnrdmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 209 return -EINVAL; 210 211 if (tnrdmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 212 return -EINVAL; 213 214 if (tnrdmd->sys != CXD2880_DTV_SYS_DVBT) 215 return -EINVAL; 216 217 ret = tnrdmd->io->write_reg(tnrdmd->io, 218 CXD2880_IO_TGT_DMD, 219 0x00, 0x0d); 220 if (ret) 221 return ret; 222 223 ret = tnrdmd->io->read_regs(tnrdmd->io, 224 CXD2880_IO_TGT_DMD, 225 0x15, rdata, 3); 226 if (ret) 227 return ret; 228 229 if ((rdata[0] & 0x40) == 0) 230 return -EAGAIN; 231 232 *post_bit_err = ((rdata[0] & 0x3f) << 16) | (rdata[1] << 8) | rdata[2]; 233 234 ret = tnrdmd->io->write_reg(tnrdmd->io, 235 CXD2880_IO_TGT_DMD, 236 0x00, 0x10); 237 if (ret) 238 return ret; 239 240 ret = tnrdmd->io->read_regs(tnrdmd->io, 241 CXD2880_IO_TGT_DMD, 242 0x60, rdata, 1); 243 if (ret) 244 return ret; 245 246 period_exp = (rdata[0] & 0x1f); 247 248 if (period_exp <= 11 && (bit_error > (1U << period_exp) * 204 * 8)) 249 return -EAGAIN; 250 251 *post_bit_count = (1U << period_exp) * 204 * 8; 252 253 return 0; 254} 255 256static int cxd2880_post_bit_err_t2(struct cxd2880_tnrdmd *tnrdmd, 257 u32 *post_bit_err, 258 u32 *post_bit_count) 259{ 260 u32 period_exp = 0; 261 u32 n_bch = 0; 262 u8 data[3]; 263 enum cxd2880_dvbt2_plp_fec plp_fec_type = 264 CXD2880_DVBT2_FEC_LDPC_16K; 265 enum cxd2880_dvbt2_plp_code_rate plp_code_rate = 266 CXD2880_DVBT2_R1_2; 267 int ret; 268 static const u16 n_bch_bits_lookup[2][8] = { 269 {7200, 9720, 10800, 11880, 12600, 13320, 5400, 6480}, 270 {32400, 38880, 43200, 48600, 51840, 54000, 21600, 25920} 271 }; 272 273 if (!tnrdmd || !post_bit_err || !post_bit_count) 274 return -EINVAL; 275 276 if (tnrdmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 277 return -EINVAL; 278 279 if (tnrdmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 280 return -EINVAL; 281 282 if (tnrdmd->sys != CXD2880_DTV_SYS_DVBT2) 283 return -EINVAL; 284 285 ret = slvt_freeze_reg(tnrdmd); 286 if (ret) 287 return ret; 288 289 ret = tnrdmd->io->write_reg(tnrdmd->io, 290 CXD2880_IO_TGT_DMD, 291 0x00, 0x0b); 292 if (ret) { 293 slvt_unfreeze_reg(tnrdmd); 294 return ret; 295 } 296 297 ret = tnrdmd->io->read_regs(tnrdmd->io, 298 CXD2880_IO_TGT_DMD, 299 0x15, data, 3); 300 if (ret) { 301 slvt_unfreeze_reg(tnrdmd); 302 return ret; 303 } 304 305 if (!(data[0] & 0x40)) { 306 slvt_unfreeze_reg(tnrdmd); 307 return -EAGAIN; 308 } 309 310 *post_bit_err = 311 ((data[0] & 0x3f) << 16) | (data[1] << 8) | data[2]; 312 313 ret = tnrdmd->io->read_regs(tnrdmd->io, 314 CXD2880_IO_TGT_DMD, 315 0x9d, data, 1); 316 if (ret) { 317 slvt_unfreeze_reg(tnrdmd); 318 return ret; 319 } 320 321 plp_code_rate = 322 (enum cxd2880_dvbt2_plp_code_rate)(data[0] & 0x07); 323 324 ret = tnrdmd->io->read_regs(tnrdmd->io, 325 CXD2880_IO_TGT_DMD, 326 0xa0, data, 1); 327 if (ret) { 328 slvt_unfreeze_reg(tnrdmd); 329 return ret; 330 } 331 332 plp_fec_type = (enum cxd2880_dvbt2_plp_fec)(data[0] & 0x03); 333 334 slvt_unfreeze_reg(tnrdmd); 335 336 ret = tnrdmd->io->write_reg(tnrdmd->io, 337 CXD2880_IO_TGT_DMD, 338 0x00, 0x20); 339 if (ret) 340 return ret; 341 342 ret = tnrdmd->io->read_regs(tnrdmd->io, 343 CXD2880_IO_TGT_DMD, 344 0x72, data, 1); 345 if (ret) 346 return ret; 347 348 period_exp = data[0] & 0x0f; 349 350 if (plp_fec_type > CXD2880_DVBT2_FEC_LDPC_64K || 351 plp_code_rate > CXD2880_DVBT2_R2_5) 352 return -EAGAIN; 353 354 n_bch = n_bch_bits_lookup[plp_fec_type][plp_code_rate]; 355 356 if (*post_bit_err > ((1U << period_exp) * n_bch)) 357 return -EAGAIN; 358 359 *post_bit_count = (1U << period_exp) * n_bch; 360 361 return 0; 362} 363 364static int cxd2880_read_block_err_t(struct cxd2880_tnrdmd *tnrdmd, 365 u32 *block_err, 366 u32 *block_count) 367{ 368 u8 rdata[3]; 369 int ret; 370 371 if (!tnrdmd || !block_err || !block_count) 372 return -EINVAL; 373 374 if (tnrdmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 375 return -EINVAL; 376 377 if (tnrdmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 378 return -EINVAL; 379 380 if (tnrdmd->sys != CXD2880_DTV_SYS_DVBT) 381 return -EINVAL; 382 383 ret = tnrdmd->io->write_reg(tnrdmd->io, 384 CXD2880_IO_TGT_DMD, 385 0x00, 0x0d); 386 if (ret) 387 return ret; 388 389 ret = tnrdmd->io->read_regs(tnrdmd->io, 390 CXD2880_IO_TGT_DMD, 391 0x18, rdata, 3); 392 if (ret) 393 return ret; 394 395 if ((rdata[0] & 0x01) == 0) 396 return -EAGAIN; 397 398 *block_err = (rdata[1] << 8) | rdata[2]; 399 400 ret = tnrdmd->io->write_reg(tnrdmd->io, 401 CXD2880_IO_TGT_DMD, 402 0x00, 0x10); 403 if (ret) 404 return ret; 405 406 ret = tnrdmd->io->read_regs(tnrdmd->io, 407 CXD2880_IO_TGT_DMD, 408 0x5c, rdata, 1); 409 if (ret) 410 return ret; 411 412 *block_count = 1U << (rdata[0] & 0x0f); 413 414 if ((*block_count == 0) || (*block_err > *block_count)) 415 return -EAGAIN; 416 417 return 0; 418} 419 420static int cxd2880_read_block_err_t2(struct cxd2880_tnrdmd *tnrdmd, 421 u32 *block_err, 422 u32 *block_count) 423{ 424 u8 rdata[3]; 425 int ret; 426 427 if (!tnrdmd || !block_err || !block_count) 428 return -EINVAL; 429 430 if (tnrdmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 431 return -EINVAL; 432 433 if (tnrdmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 434 return -EINVAL; 435 if (tnrdmd->sys != CXD2880_DTV_SYS_DVBT2) 436 return -EINVAL; 437 438 ret = tnrdmd->io->write_reg(tnrdmd->io, 439 CXD2880_IO_TGT_DMD, 440 0x00, 0x0b); 441 if (ret) 442 return ret; 443 444 ret = tnrdmd->io->read_regs(tnrdmd->io, 445 CXD2880_IO_TGT_DMD, 446 0x18, rdata, 3); 447 if (ret) 448 return ret; 449 450 if ((rdata[0] & 0x01) == 0) 451 return -EAGAIN; 452 453 *block_err = (rdata[1] << 8) | rdata[2]; 454 455 ret = tnrdmd->io->write_reg(tnrdmd->io, 456 CXD2880_IO_TGT_DMD, 457 0x00, 0x24); 458 if (ret) 459 return ret; 460 461 ret = tnrdmd->io->read_regs(tnrdmd->io, 462 CXD2880_IO_TGT_DMD, 463 0xdc, rdata, 1); 464 if (ret) 465 return ret; 466 467 *block_count = 1U << (rdata[0] & 0x0f); 468 469 if ((*block_count == 0) || (*block_err > *block_count)) 470 return -EAGAIN; 471 472 return 0; 473} 474 475static void cxd2880_release(struct dvb_frontend *fe) 476{ 477 struct cxd2880_priv *priv = NULL; 478 479 if (!fe) { 480 pr_err("invalid arg.\n"); 481 return; 482 } 483 priv = fe->demodulator_priv; 484 kfree(priv); 485} 486 487static int cxd2880_init(struct dvb_frontend *fe) 488{ 489 int ret; 490 struct cxd2880_priv *priv = NULL; 491 struct cxd2880_tnrdmd_create_param create_param; 492 493 if (!fe) { 494 pr_err("invalid arg.\n"); 495 return -EINVAL; 496 } 497 498 priv = fe->demodulator_priv; 499 500 create_param.ts_output_if = CXD2880_TNRDMD_TSOUT_IF_SPI; 501 create_param.xtal_share_type = CXD2880_TNRDMD_XTAL_SHARE_NONE; 502 create_param.en_internal_ldo = 1; 503 create_param.xosc_cap = 18; 504 create_param.xosc_i = 8; 505 create_param.stationary_use = 1; 506 507 mutex_lock(priv->spi_mutex); 508 if (priv->tnrdmd.io != &priv->regio) { 509 ret = cxd2880_tnrdmd_create(&priv->tnrdmd, 510 &priv->regio, &create_param); 511 if (ret) { 512 mutex_unlock(priv->spi_mutex); 513 pr_info("cxd2880 tnrdmd create failed %d\n", ret); 514 return ret; 515 } 516 } 517 ret = cxd2880_integ_init(&priv->tnrdmd); 518 if (ret) { 519 mutex_unlock(priv->spi_mutex); 520 pr_err("cxd2880 integ init failed %d\n", ret); 521 return ret; 522 } 523 524 ret = cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 525 CXD2880_TNRDMD_CFG_TSPIN_CURRENT, 526 0x00); 527 if (ret) { 528 mutex_unlock(priv->spi_mutex); 529 pr_err("cxd2880 set config failed %d\n", ret); 530 return ret; 531 } 532 mutex_unlock(priv->spi_mutex); 533 534 pr_debug("OK.\n"); 535 536 return ret; 537} 538 539static int cxd2880_sleep(struct dvb_frontend *fe) 540{ 541 int ret; 542 struct cxd2880_priv *priv = NULL; 543 544 if (!fe) { 545 pr_err("invalid arg\n"); 546 return -EINVAL; 547 } 548 549 priv = fe->demodulator_priv; 550 551 mutex_lock(priv->spi_mutex); 552 ret = cxd2880_tnrdmd_sleep(&priv->tnrdmd); 553 mutex_unlock(priv->spi_mutex); 554 555 pr_debug("tnrdmd_sleep ret %d\n", ret); 556 557 return ret; 558} 559 560static int cxd2880_read_signal_strength(struct dvb_frontend *fe, 561 u16 *strength) 562{ 563 int ret; 564 struct cxd2880_priv *priv = NULL; 565 struct dtv_frontend_properties *c = NULL; 566 int level = 0; 567 568 if (!fe || !strength) { 569 pr_err("invalid arg\n"); 570 return -EINVAL; 571 } 572 573 priv = fe->demodulator_priv; 574 c = &fe->dtv_property_cache; 575 576 mutex_lock(priv->spi_mutex); 577 if (c->delivery_system == SYS_DVBT || 578 c->delivery_system == SYS_DVBT2) { 579 ret = cxd2880_tnrdmd_mon_rf_lvl(&priv->tnrdmd, &level); 580 } else { 581 pr_debug("invalid system\n"); 582 mutex_unlock(priv->spi_mutex); 583 return -EINVAL; 584 } 585 mutex_unlock(priv->spi_mutex); 586 587 level /= 125; 588 /* 589 * level should be between -105dBm and -30dBm. 590 * E.g. they should be between: 591 * -105000/125 = -840 and -30000/125 = -240 592 */ 593 level = clamp(level, -840, -240); 594 /* scale value to 0x0000-0xffff */ 595 *strength = ((level + 840) * 0xffff) / (-240 + 840); 596 597 if (ret) 598 pr_debug("ret = %d\n", ret); 599 600 return ret; 601} 602 603static int cxd2880_read_snr(struct dvb_frontend *fe, u16 *snr) 604{ 605 int ret; 606 int snrvalue = 0; 607 struct cxd2880_priv *priv = NULL; 608 struct dtv_frontend_properties *c = NULL; 609 610 if (!fe || !snr) { 611 pr_err("invalid arg\n"); 612 return -EINVAL; 613 } 614 615 priv = fe->demodulator_priv; 616 c = &fe->dtv_property_cache; 617 618 mutex_lock(priv->spi_mutex); 619 if (c->delivery_system == SYS_DVBT) { 620 ret = cxd2880_tnrdmd_dvbt_mon_snr(&priv->tnrdmd, 621 &snrvalue); 622 } else if (c->delivery_system == SYS_DVBT2) { 623 ret = cxd2880_tnrdmd_dvbt2_mon_snr(&priv->tnrdmd, 624 &snrvalue); 625 } else { 626 pr_err("invalid system\n"); 627 mutex_unlock(priv->spi_mutex); 628 return -EINVAL; 629 } 630 mutex_unlock(priv->spi_mutex); 631 632 if (snrvalue < 0) 633 snrvalue = 0; 634 *snr = snrvalue; 635 636 if (ret) 637 pr_debug("ret = %d\n", ret); 638 639 return ret; 640} 641 642static int cxd2880_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) 643{ 644 int ret; 645 struct cxd2880_priv *priv = NULL; 646 struct dtv_frontend_properties *c = NULL; 647 648 if (!fe || !ucblocks) { 649 pr_err("invalid arg\n"); 650 return -EINVAL; 651 } 652 653 priv = fe->demodulator_priv; 654 c = &fe->dtv_property_cache; 655 656 mutex_lock(priv->spi_mutex); 657 if (c->delivery_system == SYS_DVBT) { 658 ret = cxd2880_tnrdmd_dvbt_mon_packet_error_number(&priv->tnrdmd, 659 ucblocks); 660 } else if (c->delivery_system == SYS_DVBT2) { 661 ret = cxd2880_tnrdmd_dvbt2_mon_packet_error_number(&priv->tnrdmd, 662 ucblocks); 663 } else { 664 pr_err("invalid system\n"); 665 mutex_unlock(priv->spi_mutex); 666 return -EINVAL; 667 } 668 mutex_unlock(priv->spi_mutex); 669 670 if (ret) 671 pr_debug("ret = %d\n", ret); 672 673 return ret; 674} 675 676static int cxd2880_read_ber(struct dvb_frontend *fe, u32 *ber) 677{ 678 *ber = 0; 679 680 return 0; 681} 682 683static int cxd2880_set_ber_per_period_t(struct dvb_frontend *fe) 684{ 685 int ret; 686 struct cxd2880_priv *priv; 687 struct cxd2880_dvbt_tpsinfo info; 688 enum cxd2880_dtv_bandwidth bw; 689 u32 pre_ber_rate = 0; 690 u32 post_ber_rate = 0; 691 u32 ucblock_rate = 0; 692 u32 mes_exp = 0; 693 static const int cr_table[5] = {31500, 42000, 47250, 52500, 55125}; 694 static const int denominator_tbl[4] = {125664, 129472, 137088, 152320}; 695 696 if (!fe) { 697 pr_err("invalid arg\n"); 698 return -EINVAL; 699 } 700 701 priv = fe->demodulator_priv; 702 bw = priv->dvbt_tune_param.bandwidth; 703 704 ret = cxd2880_tnrdmd_dvbt_mon_tps_info(&priv->tnrdmd, 705 &info); 706 if (ret) { 707 pr_err("tps monitor error ret = %d\n", ret); 708 info.hierarchy = CXD2880_DVBT_HIERARCHY_NON; 709 info.constellation = CXD2880_DVBT_CONSTELLATION_QPSK; 710 info.guard = CXD2880_DVBT_GUARD_1_4; 711 info.rate_hp = CXD2880_DVBT_CODERATE_1_2; 712 info.rate_lp = CXD2880_DVBT_CODERATE_1_2; 713 } 714 715 if (info.hierarchy == CXD2880_DVBT_HIERARCHY_NON) { 716 pre_ber_rate = 63000000 * bw * (info.constellation * 2 + 2) / 717 denominator_tbl[info.guard]; 718 719 post_ber_rate = 1000 * cr_table[info.rate_hp] * bw * 720 (info.constellation * 2 + 2) / 721 denominator_tbl[info.guard]; 722 723 ucblock_rate = 875 * cr_table[info.rate_hp] * bw * 724 (info.constellation * 2 + 2) / 725 denominator_tbl[info.guard]; 726 } else { 727 u8 data = 0; 728 struct cxd2880_tnrdmd *tnrdmd = &priv->tnrdmd; 729 730 ret = tnrdmd->io->write_reg(tnrdmd->io, 731 CXD2880_IO_TGT_DMD, 732 0x00, 0x10); 733 if (!ret) { 734 ret = tnrdmd->io->read_regs(tnrdmd->io, 735 CXD2880_IO_TGT_DMD, 736 0x67, &data, 1); 737 if (ret) 738 data = 0x00; 739 } else { 740 data = 0x00; 741 } 742 743 if (data & 0x01) { /* Low priority */ 744 pre_ber_rate = 745 63000000 * bw * (info.constellation * 2 + 2) / 746 denominator_tbl[info.guard]; 747 748 post_ber_rate = 1000 * cr_table[info.rate_lp] * bw * 749 (info.constellation * 2 + 2) / 750 denominator_tbl[info.guard]; 751 752 ucblock_rate = (1000 * 7 / 8) * cr_table[info.rate_lp] * 753 bw * (info.constellation * 2 + 2) / 754 denominator_tbl[info.guard]; 755 } else { /* High priority */ 756 pre_ber_rate = 757 63000000 * bw * 2 / denominator_tbl[info.guard]; 758 759 post_ber_rate = 1000 * cr_table[info.rate_hp] * bw * 2 / 760 denominator_tbl[info.guard]; 761 762 ucblock_rate = (1000 * 7 / 8) * cr_table[info.rate_hp] * 763 bw * 2 / denominator_tbl[info.guard]; 764 } 765 } 766 767 mes_exp = pre_ber_rate < 8192 ? 8 : intlog2(pre_ber_rate) >> 24; 768 priv->pre_ber_interval = 769 ((1U << mes_exp) * 1000 + (pre_ber_rate / 2)) / 770 pre_ber_rate; 771 cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 772 CXD2880_TNRDMD_CFG_DVBT_VBER_PERIOD, 773 mes_exp == 8 ? 0 : mes_exp - 12); 774 775 mes_exp = intlog2(post_ber_rate) >> 24; 776 priv->post_ber_interval = 777 ((1U << mes_exp) * 1000 + (post_ber_rate / 2)) / 778 post_ber_rate; 779 cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 780 CXD2880_TNRDMD_CFG_DVBT_BERN_PERIOD, 781 mes_exp); 782 783 mes_exp = intlog2(ucblock_rate) >> 24; 784 priv->ucblock_interval = 785 ((1U << mes_exp) * 1000 + (ucblock_rate / 2)) / 786 ucblock_rate; 787 cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 788 CXD2880_TNRDMD_CFG_DVBT_PER_MES, 789 mes_exp); 790 791 return 0; 792} 793 794static int cxd2880_set_ber_per_period_t2(struct dvb_frontend *fe) 795{ 796 int ret; 797 struct cxd2880_priv *priv; 798 struct cxd2880_dvbt2_l1pre l1pre; 799 struct cxd2880_dvbt2_l1post l1post; 800 struct cxd2880_dvbt2_plp plp; 801 struct cxd2880_dvbt2_bbheader bbheader; 802 enum cxd2880_dtv_bandwidth bw = CXD2880_DTV_BW_1_7_MHZ; 803 u32 pre_ber_rate = 0; 804 u32 post_ber_rate = 0; 805 u32 ucblock_rate = 0; 806 u32 mes_exp = 0; 807 u32 term_a = 0; 808 u32 term_b = 0; 809 u32 denominator = 0; 810 static const u32 gi_tbl[7] = {32, 64, 128, 256, 8, 152, 76}; 811 static const u8 n_tbl[6] = {8, 2, 4, 16, 1, 1}; 812 static const u8 mode_tbl[6] = {2, 8, 4, 1, 16, 32}; 813 static const u32 kbch_tbl[2][8] = { 814 {6952, 9472, 10552, 11632, 12352, 13072, 5152, 6232}, 815 {32128, 38608, 42960, 48328, 51568, 53760, 0, 0} 816 }; 817 818 if (!fe) { 819 pr_err("invalid arg\n"); 820 return -EINVAL; 821 } 822 823 priv = fe->demodulator_priv; 824 bw = priv->dvbt2_tune_param.bandwidth; 825 826 ret = cxd2880_tnrdmd_dvbt2_mon_l1_pre(&priv->tnrdmd, &l1pre); 827 if (ret) { 828 pr_info("l1 pre error\n"); 829 goto error_ber_setting; 830 } 831 832 ret = cxd2880_tnrdmd_dvbt2_mon_active_plp(&priv->tnrdmd, 833 CXD2880_DVBT2_PLP_DATA, &plp); 834 if (ret) { 835 pr_info("plp info error\n"); 836 goto error_ber_setting; 837 } 838 839 ret = cxd2880_tnrdmd_dvbt2_mon_l1_post(&priv->tnrdmd, &l1post); 840 if (ret) { 841 pr_info("l1 post error\n"); 842 goto error_ber_setting; 843 } 844 845 term_a = 846 (mode_tbl[l1pre.fft_mode] * (1024 + gi_tbl[l1pre.gi])) * 847 (l1pre.num_symbols + n_tbl[l1pre.fft_mode]) + 2048; 848 849 if (l1pre.mixed && l1post.fef_intvl) { 850 term_b = (l1post.fef_length + (l1post.fef_intvl / 2)) / 851 l1post.fef_intvl; 852 } else { 853 term_b = 0; 854 } 855 856 switch (bw) { 857 case CXD2880_DTV_BW_1_7_MHZ: 858 denominator = ((term_a + term_b) * 71 + (131 / 2)) / 131; 859 break; 860 case CXD2880_DTV_BW_5_MHZ: 861 denominator = ((term_a + term_b) * 7 + 20) / 40; 862 break; 863 case CXD2880_DTV_BW_6_MHZ: 864 denominator = ((term_a + term_b) * 7 + 24) / 48; 865 break; 866 case CXD2880_DTV_BW_7_MHZ: 867 denominator = ((term_a + term_b) + 4) / 8; 868 break; 869 case CXD2880_DTV_BW_8_MHZ: 870 default: 871 denominator = ((term_a + term_b) * 7 + 32) / 64; 872 break; 873 } 874 875 if (plp.til_type && plp.til_len) { 876 pre_ber_rate = 877 (plp.num_blocks_max * 1000000 + (denominator / 2)) / 878 denominator; 879 pre_ber_rate = (pre_ber_rate + (plp.til_len / 2)) / 880 plp.til_len; 881 } else { 882 pre_ber_rate = 883 (plp.num_blocks_max * 1000000 + (denominator / 2)) / 884 denominator; 885 } 886 887 post_ber_rate = pre_ber_rate; 888 889 mes_exp = intlog2(pre_ber_rate) >> 24; 890 priv->pre_ber_interval = 891 ((1U << mes_exp) * 1000 + (pre_ber_rate / 2)) / 892 pre_ber_rate; 893 cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 894 CXD2880_TNRDMD_CFG_DVBT2_LBER_MES, 895 mes_exp); 896 897 mes_exp = intlog2(post_ber_rate) >> 24; 898 priv->post_ber_interval = 899 ((1U << mes_exp) * 1000 + (post_ber_rate / 2)) / 900 post_ber_rate; 901 cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 902 CXD2880_TNRDMD_CFG_DVBT2_BBER_MES, 903 mes_exp); 904 905 ret = cxd2880_tnrdmd_dvbt2_mon_bbheader(&priv->tnrdmd, 906 CXD2880_DVBT2_PLP_DATA, 907 &bbheader); 908 if (ret) { 909 pr_info("bb header error\n"); 910 goto error_ucblock_setting; 911 } 912 913 if (bbheader.plp_mode == CXD2880_DVBT2_PLP_MODE_NM) { 914 if (!bbheader.issy_indicator) { 915 ucblock_rate = 916 (pre_ber_rate * kbch_tbl[plp.fec][plp.plp_cr] + 917 752) / 1504; 918 } else { 919 ucblock_rate = 920 (pre_ber_rate * kbch_tbl[plp.fec][plp.plp_cr] + 921 764) / 1528; 922 } 923 } else if (bbheader.plp_mode == CXD2880_DVBT2_PLP_MODE_HEM) { 924 ucblock_rate = 925 (pre_ber_rate * kbch_tbl[plp.fec][plp.plp_cr] + 748) / 926 1496; 927 } else { 928 pr_info("plp mode is not Normal or HEM\n"); 929 goto error_ucblock_setting; 930 } 931 932 mes_exp = intlog2(ucblock_rate) >> 24; 933 priv->ucblock_interval = 934 ((1U << mes_exp) * 1000 + (ucblock_rate / 2)) / 935 ucblock_rate; 936 cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 937 CXD2880_TNRDMD_CFG_DVBT2_PER_MES, 938 mes_exp); 939 940 return 0; 941 942error_ber_setting: 943 priv->pre_ber_interval = 1000; 944 cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 945 CXD2880_TNRDMD_CFG_DVBT2_LBER_MES, 0); 946 947 priv->post_ber_interval = 1000; 948 cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 949 CXD2880_TNRDMD_CFG_DVBT2_BBER_MES, 0); 950 951error_ucblock_setting: 952 priv->ucblock_interval = 1000; 953 cxd2880_tnrdmd_set_cfg(&priv->tnrdmd, 954 CXD2880_TNRDMD_CFG_DVBT2_PER_MES, 8); 955 956 return 0; 957} 958 959static int cxd2880_dvbt_tune(struct cxd2880_tnrdmd *tnr_dmd, 960 struct cxd2880_dvbt_tune_param 961 *tune_param) 962{ 963 int ret; 964 965 if (!tnr_dmd || !tune_param) 966 return -EINVAL; 967 968 if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 969 return -EINVAL; 970 971 if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 972 tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 973 return -EINVAL; 974 975 atomic_set(&tnr_dmd->cancel, 0); 976 977 if (tune_param->bandwidth != CXD2880_DTV_BW_5_MHZ && 978 tune_param->bandwidth != CXD2880_DTV_BW_6_MHZ && 979 tune_param->bandwidth != CXD2880_DTV_BW_7_MHZ && 980 tune_param->bandwidth != CXD2880_DTV_BW_8_MHZ) { 981 return -ENOTTY; 982 } 983 984 ret = cxd2880_tnrdmd_dvbt_tune1(tnr_dmd, tune_param); 985 if (ret) 986 return ret; 987 988 usleep_range(CXD2880_TNRDMD_WAIT_AGC_STABLE * 10000, 989 CXD2880_TNRDMD_WAIT_AGC_STABLE * 10000 + 1000); 990 991 return cxd2880_tnrdmd_dvbt_tune2(tnr_dmd, tune_param); 992} 993 994static int cxd2880_dvbt2_tune(struct cxd2880_tnrdmd *tnr_dmd, 995 struct cxd2880_dvbt2_tune_param 996 *tune_param) 997{ 998 int ret; 999 1000 if (!tnr_dmd || !tune_param) 1001 return -EINVAL; 1002 1003 if (tnr_dmd->diver_mode == CXD2880_TNRDMD_DIVERMODE_SUB) 1004 return -EINVAL; 1005 1006 if (tnr_dmd->state != CXD2880_TNRDMD_STATE_SLEEP && 1007 tnr_dmd->state != CXD2880_TNRDMD_STATE_ACTIVE) 1008 return -EINVAL; 1009 1010 atomic_set(&tnr_dmd->cancel, 0); 1011 1012 if (tune_param->bandwidth != CXD2880_DTV_BW_1_7_MHZ && 1013 tune_param->bandwidth != CXD2880_DTV_BW_5_MHZ && 1014 tune_param->bandwidth != CXD2880_DTV_BW_6_MHZ && 1015 tune_param->bandwidth != CXD2880_DTV_BW_7_MHZ && 1016 tune_param->bandwidth != CXD2880_DTV_BW_8_MHZ) { 1017 return -ENOTTY; 1018 } 1019 1020 if (tune_param->profile != CXD2880_DVBT2_PROFILE_BASE && 1021 tune_param->profile != CXD2880_DVBT2_PROFILE_LITE) 1022 return -EINVAL; 1023 1024 ret = cxd2880_tnrdmd_dvbt2_tune1(tnr_dmd, tune_param); 1025 if (ret) 1026 return ret; 1027 1028 usleep_range(CXD2880_TNRDMD_WAIT_AGC_STABLE * 10000, 1029 CXD2880_TNRDMD_WAIT_AGC_STABLE * 10000 + 1000); 1030 1031 return cxd2880_tnrdmd_dvbt2_tune2(tnr_dmd, tune_param); 1032} 1033 1034static int cxd2880_set_frontend(struct dvb_frontend *fe) 1035{ 1036 int ret; 1037 struct dtv_frontend_properties *c; 1038 struct cxd2880_priv *priv; 1039 enum cxd2880_dtv_bandwidth bw = CXD2880_DTV_BW_1_7_MHZ; 1040 1041 if (!fe) { 1042 pr_err("invalid arg\n"); 1043 return -EINVAL; 1044 } 1045 1046 priv = fe->demodulator_priv; 1047 c = &fe->dtv_property_cache; 1048 1049 c->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1050 c->pre_bit_error.stat[0].uvalue = 0; 1051 c->pre_bit_error.len = 1; 1052 c->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1053 c->pre_bit_count.stat[0].uvalue = 0; 1054 c->pre_bit_count.len = 1; 1055 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1056 c->post_bit_error.stat[0].uvalue = 0; 1057 c->post_bit_error.len = 1; 1058 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1059 c->post_bit_count.stat[0].uvalue = 0; 1060 c->post_bit_count.len = 1; 1061 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1062 c->block_error.stat[0].uvalue = 0; 1063 c->block_error.len = 1; 1064 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1065 c->block_count.stat[0].uvalue = 0; 1066 c->block_count.len = 1; 1067 1068 switch (c->bandwidth_hz) { 1069 case 1712000: 1070 bw = CXD2880_DTV_BW_1_7_MHZ; 1071 break; 1072 case 5000000: 1073 bw = CXD2880_DTV_BW_5_MHZ; 1074 break; 1075 case 6000000: 1076 bw = CXD2880_DTV_BW_6_MHZ; 1077 break; 1078 case 7000000: 1079 bw = CXD2880_DTV_BW_7_MHZ; 1080 break; 1081 case 8000000: 1082 bw = CXD2880_DTV_BW_8_MHZ; 1083 break; 1084 default: 1085 return -EINVAL; 1086 } 1087 1088 priv->s = 0; 1089 1090 pr_info("sys:%d freq:%d bw:%d\n", 1091 c->delivery_system, c->frequency, bw); 1092 mutex_lock(priv->spi_mutex); 1093 if (c->delivery_system == SYS_DVBT) { 1094 priv->tnrdmd.sys = CXD2880_DTV_SYS_DVBT; 1095 priv->dvbt_tune_param.center_freq_khz = c->frequency / 1000; 1096 priv->dvbt_tune_param.bandwidth = bw; 1097 priv->dvbt_tune_param.profile = CXD2880_DVBT_PROFILE_HP; 1098 ret = cxd2880_dvbt_tune(&priv->tnrdmd, 1099 &priv->dvbt_tune_param); 1100 } else if (c->delivery_system == SYS_DVBT2) { 1101 priv->tnrdmd.sys = CXD2880_DTV_SYS_DVBT2; 1102 priv->dvbt2_tune_param.center_freq_khz = c->frequency / 1000; 1103 priv->dvbt2_tune_param.bandwidth = bw; 1104 priv->dvbt2_tune_param.data_plp_id = (u16)c->stream_id; 1105 priv->dvbt2_tune_param.profile = CXD2880_DVBT2_PROFILE_BASE; 1106 ret = cxd2880_dvbt2_tune(&priv->tnrdmd, 1107 &priv->dvbt2_tune_param); 1108 } else { 1109 pr_err("invalid system\n"); 1110 mutex_unlock(priv->spi_mutex); 1111 return -EINVAL; 1112 } 1113 mutex_unlock(priv->spi_mutex); 1114 1115 pr_info("tune result %d\n", ret); 1116 1117 return ret; 1118} 1119 1120static int cxd2880_get_stats(struct dvb_frontend *fe, 1121 enum fe_status status) 1122{ 1123 struct cxd2880_priv *priv = NULL; 1124 struct dtv_frontend_properties *c = NULL; 1125 u32 pre_bit_err = 0, pre_bit_count = 0; 1126 u32 post_bit_err = 0, post_bit_count = 0; 1127 u32 block_err = 0, block_count = 0; 1128 int ret; 1129 1130 if (!fe) { 1131 pr_err("invalid arg\n"); 1132 return -EINVAL; 1133 } 1134 1135 priv = fe->demodulator_priv; 1136 c = &fe->dtv_property_cache; 1137 1138 if (!(status & FE_HAS_LOCK) || !(status & FE_HAS_CARRIER)) { 1139 c->pre_bit_error.len = 1; 1140 c->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1141 c->pre_bit_count.len = 1; 1142 c->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1143 c->post_bit_error.len = 1; 1144 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1145 c->post_bit_count.len = 1; 1146 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1147 c->block_error.len = 1; 1148 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1149 c->block_count.len = 1; 1150 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1151 1152 return 0; 1153 } 1154 1155 if (time_after(jiffies, priv->pre_ber_update)) { 1156 priv->pre_ber_update = 1157 jiffies + msecs_to_jiffies(priv->pre_ber_interval); 1158 if (c->delivery_system == SYS_DVBT) { 1159 mutex_lock(priv->spi_mutex); 1160 ret = cxd2880_pre_bit_err_t(&priv->tnrdmd, 1161 &pre_bit_err, 1162 &pre_bit_count); 1163 mutex_unlock(priv->spi_mutex); 1164 } else if (c->delivery_system == SYS_DVBT2) { 1165 mutex_lock(priv->spi_mutex); 1166 ret = cxd2880_pre_bit_err_t2(&priv->tnrdmd, 1167 &pre_bit_err, 1168 &pre_bit_count); 1169 mutex_unlock(priv->spi_mutex); 1170 } else { 1171 return -EINVAL; 1172 } 1173 1174 if (!ret) { 1175 c->pre_bit_error.len = 1; 1176 c->pre_bit_error.stat[0].scale = FE_SCALE_COUNTER; 1177 c->pre_bit_error.stat[0].uvalue += pre_bit_err; 1178 c->pre_bit_count.len = 1; 1179 c->pre_bit_count.stat[0].scale = FE_SCALE_COUNTER; 1180 c->pre_bit_count.stat[0].uvalue += pre_bit_count; 1181 } else { 1182 c->pre_bit_error.len = 1; 1183 c->pre_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1184 c->pre_bit_count.len = 1; 1185 c->pre_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1186 pr_debug("pre_bit_error_t failed %d\n", ret); 1187 } 1188 } 1189 1190 if (time_after(jiffies, priv->post_ber_update)) { 1191 priv->post_ber_update = 1192 jiffies + msecs_to_jiffies(priv->post_ber_interval); 1193 if (c->delivery_system == SYS_DVBT) { 1194 mutex_lock(priv->spi_mutex); 1195 ret = cxd2880_post_bit_err_t(&priv->tnrdmd, 1196 &post_bit_err, 1197 &post_bit_count); 1198 mutex_unlock(priv->spi_mutex); 1199 } else if (c->delivery_system == SYS_DVBT2) { 1200 mutex_lock(priv->spi_mutex); 1201 ret = cxd2880_post_bit_err_t2(&priv->tnrdmd, 1202 &post_bit_err, 1203 &post_bit_count); 1204 mutex_unlock(priv->spi_mutex); 1205 } else { 1206 return -EINVAL; 1207 } 1208 1209 if (!ret) { 1210 c->post_bit_error.len = 1; 1211 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; 1212 c->post_bit_error.stat[0].uvalue += post_bit_err; 1213 c->post_bit_count.len = 1; 1214 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; 1215 c->post_bit_count.stat[0].uvalue += post_bit_count; 1216 } else { 1217 c->post_bit_error.len = 1; 1218 c->post_bit_error.stat[0].scale = 1219 FE_SCALE_NOT_AVAILABLE; 1220 c->post_bit_count.len = 1; 1221 c->post_bit_count.stat[0].scale = 1222 FE_SCALE_NOT_AVAILABLE; 1223 pr_debug("post_bit_err_t %d\n", ret); 1224 } 1225 } 1226 1227 if (time_after(jiffies, priv->ucblock_update)) { 1228 priv->ucblock_update = 1229 jiffies + msecs_to_jiffies(priv->ucblock_interval); 1230 if (c->delivery_system == SYS_DVBT) { 1231 mutex_lock(priv->spi_mutex); 1232 ret = cxd2880_read_block_err_t(&priv->tnrdmd, 1233 &block_err, 1234 &block_count); 1235 mutex_unlock(priv->spi_mutex); 1236 } else if (c->delivery_system == SYS_DVBT2) { 1237 mutex_lock(priv->spi_mutex); 1238 ret = cxd2880_read_block_err_t2(&priv->tnrdmd, 1239 &block_err, 1240 &block_count); 1241 mutex_unlock(priv->spi_mutex); 1242 } else { 1243 return -EINVAL; 1244 } 1245 if (!ret) { 1246 c->block_error.len = 1; 1247 c->block_error.stat[0].scale = FE_SCALE_COUNTER; 1248 c->block_error.stat[0].uvalue += block_err; 1249 c->block_count.len = 1; 1250 c->block_count.stat[0].scale = FE_SCALE_COUNTER; 1251 c->block_count.stat[0].uvalue += block_count; 1252 } else { 1253 c->block_error.len = 1; 1254 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1255 c->block_count.len = 1; 1256 c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1257 pr_debug("read_block_err_t %d\n", ret); 1258 } 1259 } 1260 1261 return 0; 1262} 1263 1264static int cxd2880_check_l1post_plp(struct dvb_frontend *fe) 1265{ 1266 u8 valid = 0; 1267 u8 plp_not_found; 1268 int ret; 1269 struct cxd2880_priv *priv = NULL; 1270 1271 if (!fe) { 1272 pr_err("invalid arg\n"); 1273 return -EINVAL; 1274 } 1275 1276 priv = fe->demodulator_priv; 1277 1278 ret = cxd2880_tnrdmd_dvbt2_check_l1post_valid(&priv->tnrdmd, 1279 &valid); 1280 if (ret) 1281 return ret; 1282 1283 if (!valid) 1284 return -EAGAIN; 1285 1286 ret = cxd2880_tnrdmd_dvbt2_mon_data_plp_error(&priv->tnrdmd, 1287 &plp_not_found); 1288 if (ret) 1289 return ret; 1290 1291 if (plp_not_found) { 1292 priv->dvbt2_tune_param.tune_info = 1293 CXD2880_TNRDMD_DVBT2_TUNE_INFO_INVALID_PLP_ID; 1294 } else { 1295 priv->dvbt2_tune_param.tune_info = 1296 CXD2880_TNRDMD_DVBT2_TUNE_INFO_OK; 1297 } 1298 1299 return 0; 1300} 1301 1302static int cxd2880_read_status(struct dvb_frontend *fe, 1303 enum fe_status *status) 1304{ 1305 int ret; 1306 u8 sync = 0; 1307 u8 lock = 0; 1308 u8 unlock = 0; 1309 struct cxd2880_priv *priv = NULL; 1310 struct dtv_frontend_properties *c = NULL; 1311 1312 if (!fe || !status) { 1313 pr_err("invalid arg\n"); 1314 return -EINVAL; 1315 } 1316 1317 priv = fe->demodulator_priv; 1318 c = &fe->dtv_property_cache; 1319 *status = 0; 1320 1321 if (priv->tnrdmd.state == CXD2880_TNRDMD_STATE_ACTIVE) { 1322 mutex_lock(priv->spi_mutex); 1323 if (c->delivery_system == SYS_DVBT) { 1324 ret = cxd2880_tnrdmd_dvbt_mon_sync_stat(&priv->tnrdmd, 1325 &sync, 1326 &lock, 1327 &unlock); 1328 } else if (c->delivery_system == SYS_DVBT2) { 1329 ret = cxd2880_tnrdmd_dvbt2_mon_sync_stat(&priv->tnrdmd, 1330 &sync, 1331 &lock, 1332 &unlock); 1333 } else { 1334 pr_err("invalid system"); 1335 mutex_unlock(priv->spi_mutex); 1336 return -EINVAL; 1337 } 1338 1339 mutex_unlock(priv->spi_mutex); 1340 if (ret) { 1341 pr_err("failed. sys = %d\n", priv->tnrdmd.sys); 1342 return ret; 1343 } 1344 1345 if (sync == 6) { 1346 *status = FE_HAS_SIGNAL | 1347 FE_HAS_CARRIER; 1348 } 1349 if (lock) 1350 *status |= FE_HAS_VITERBI | 1351 FE_HAS_SYNC | 1352 FE_HAS_LOCK; 1353 } 1354 1355 pr_debug("status %d\n", *status); 1356 1357 if (priv->s == 0 && (*status & FE_HAS_LOCK) && 1358 (*status & FE_HAS_CARRIER)) { 1359 mutex_lock(priv->spi_mutex); 1360 if (c->delivery_system == SYS_DVBT) { 1361 ret = cxd2880_set_ber_per_period_t(fe); 1362 priv->s = *status; 1363 } else if (c->delivery_system == SYS_DVBT2) { 1364 ret = cxd2880_check_l1post_plp(fe); 1365 if (!ret) { 1366 ret = cxd2880_set_ber_per_period_t2(fe); 1367 priv->s = *status; 1368 } 1369 } else { 1370 pr_err("invalid system\n"); 1371 mutex_unlock(priv->spi_mutex); 1372 return -EINVAL; 1373 } 1374 mutex_unlock(priv->spi_mutex); 1375 } 1376 1377 cxd2880_get_stats(fe, *status); 1378 return 0; 1379} 1380 1381static int cxd2880_tune(struct dvb_frontend *fe, 1382 bool retune, 1383 unsigned int mode_flags, 1384 unsigned int *delay, 1385 enum fe_status *status) 1386{ 1387 int ret; 1388 1389 if (!fe || !delay || !status) { 1390 pr_err("invalid arg."); 1391 return -EINVAL; 1392 } 1393 1394 if (retune) { 1395 ret = cxd2880_set_frontend(fe); 1396 if (ret) { 1397 pr_err("cxd2880_set_frontend failed %d\n", ret); 1398 return ret; 1399 } 1400 } 1401 1402 *delay = HZ / 5; 1403 1404 return cxd2880_read_status(fe, status); 1405} 1406 1407static int cxd2880_get_frontend_t(struct dvb_frontend *fe, 1408 struct dtv_frontend_properties *c) 1409{ 1410 int ret; 1411 struct cxd2880_priv *priv = NULL; 1412 enum cxd2880_dvbt_mode mode = CXD2880_DVBT_MODE_2K; 1413 enum cxd2880_dvbt_guard guard = CXD2880_DVBT_GUARD_1_32; 1414 struct cxd2880_dvbt_tpsinfo tps; 1415 enum cxd2880_tnrdmd_spectrum_sense sense; 1416 u16 snr = 0; 1417 int strength = 0; 1418 1419 if (!fe || !c) { 1420 pr_err("invalid arg\n"); 1421 return -EINVAL; 1422 } 1423 1424 priv = fe->demodulator_priv; 1425 1426 mutex_lock(priv->spi_mutex); 1427 ret = cxd2880_tnrdmd_dvbt_mon_mode_guard(&priv->tnrdmd, 1428 &mode, &guard); 1429 mutex_unlock(priv->spi_mutex); 1430 if (!ret) { 1431 switch (mode) { 1432 case CXD2880_DVBT_MODE_2K: 1433 c->transmission_mode = TRANSMISSION_MODE_2K; 1434 break; 1435 case CXD2880_DVBT_MODE_8K: 1436 c->transmission_mode = TRANSMISSION_MODE_8K; 1437 break; 1438 default: 1439 c->transmission_mode = TRANSMISSION_MODE_2K; 1440 pr_debug("transmission mode is invalid %d\n", mode); 1441 break; 1442 } 1443 switch (guard) { 1444 case CXD2880_DVBT_GUARD_1_32: 1445 c->guard_interval = GUARD_INTERVAL_1_32; 1446 break; 1447 case CXD2880_DVBT_GUARD_1_16: 1448 c->guard_interval = GUARD_INTERVAL_1_16; 1449 break; 1450 case CXD2880_DVBT_GUARD_1_8: 1451 c->guard_interval = GUARD_INTERVAL_1_8; 1452 break; 1453 case CXD2880_DVBT_GUARD_1_4: 1454 c->guard_interval = GUARD_INTERVAL_1_4; 1455 break; 1456 default: 1457 c->guard_interval = GUARD_INTERVAL_1_32; 1458 pr_debug("guard interval is invalid %d\n", 1459 guard); 1460 break; 1461 } 1462 } else { 1463 c->transmission_mode = TRANSMISSION_MODE_2K; 1464 c->guard_interval = GUARD_INTERVAL_1_32; 1465 pr_debug("ModeGuard err %d\n", ret); 1466 } 1467 1468 mutex_lock(priv->spi_mutex); 1469 ret = cxd2880_tnrdmd_dvbt_mon_tps_info(&priv->tnrdmd, &tps); 1470 mutex_unlock(priv->spi_mutex); 1471 if (!ret) { 1472 switch (tps.hierarchy) { 1473 case CXD2880_DVBT_HIERARCHY_NON: 1474 c->hierarchy = HIERARCHY_NONE; 1475 break; 1476 case CXD2880_DVBT_HIERARCHY_1: 1477 c->hierarchy = HIERARCHY_1; 1478 break; 1479 case CXD2880_DVBT_HIERARCHY_2: 1480 c->hierarchy = HIERARCHY_2; 1481 break; 1482 case CXD2880_DVBT_HIERARCHY_4: 1483 c->hierarchy = HIERARCHY_4; 1484 break; 1485 default: 1486 c->hierarchy = HIERARCHY_NONE; 1487 pr_debug("TPSInfo hierarchy is invalid %d\n", 1488 tps.hierarchy); 1489 break; 1490 } 1491 1492 switch (tps.rate_hp) { 1493 case CXD2880_DVBT_CODERATE_1_2: 1494 c->code_rate_HP = FEC_1_2; 1495 break; 1496 case CXD2880_DVBT_CODERATE_2_3: 1497 c->code_rate_HP = FEC_2_3; 1498 break; 1499 case CXD2880_DVBT_CODERATE_3_4: 1500 c->code_rate_HP = FEC_3_4; 1501 break; 1502 case CXD2880_DVBT_CODERATE_5_6: 1503 c->code_rate_HP = FEC_5_6; 1504 break; 1505 case CXD2880_DVBT_CODERATE_7_8: 1506 c->code_rate_HP = FEC_7_8; 1507 break; 1508 default: 1509 c->code_rate_HP = FEC_NONE; 1510 pr_debug("TPSInfo rateHP is invalid %d\n", 1511 tps.rate_hp); 1512 break; 1513 } 1514 switch (tps.rate_lp) { 1515 case CXD2880_DVBT_CODERATE_1_2: 1516 c->code_rate_LP = FEC_1_2; 1517 break; 1518 case CXD2880_DVBT_CODERATE_2_3: 1519 c->code_rate_LP = FEC_2_3; 1520 break; 1521 case CXD2880_DVBT_CODERATE_3_4: 1522 c->code_rate_LP = FEC_3_4; 1523 break; 1524 case CXD2880_DVBT_CODERATE_5_6: 1525 c->code_rate_LP = FEC_5_6; 1526 break; 1527 case CXD2880_DVBT_CODERATE_7_8: 1528 c->code_rate_LP = FEC_7_8; 1529 break; 1530 default: 1531 c->code_rate_LP = FEC_NONE; 1532 pr_debug("TPSInfo rateLP is invalid %d\n", 1533 tps.rate_lp); 1534 break; 1535 } 1536 switch (tps.constellation) { 1537 case CXD2880_DVBT_CONSTELLATION_QPSK: 1538 c->modulation = QPSK; 1539 break; 1540 case CXD2880_DVBT_CONSTELLATION_16QAM: 1541 c->modulation = QAM_16; 1542 break; 1543 case CXD2880_DVBT_CONSTELLATION_64QAM: 1544 c->modulation = QAM_64; 1545 break; 1546 default: 1547 c->modulation = QPSK; 1548 pr_debug("TPSInfo constellation is invalid %d\n", 1549 tps.constellation); 1550 break; 1551 } 1552 } else { 1553 c->hierarchy = HIERARCHY_NONE; 1554 c->code_rate_HP = FEC_NONE; 1555 c->code_rate_LP = FEC_NONE; 1556 c->modulation = QPSK; 1557 pr_debug("TPS info err %d\n", ret); 1558 } 1559 1560 mutex_lock(priv->spi_mutex); 1561 ret = cxd2880_tnrdmd_dvbt_mon_spectrum_sense(&priv->tnrdmd, &sense); 1562 mutex_unlock(priv->spi_mutex); 1563 if (!ret) { 1564 switch (sense) { 1565 case CXD2880_TNRDMD_SPECTRUM_NORMAL: 1566 c->inversion = INVERSION_OFF; 1567 break; 1568 case CXD2880_TNRDMD_SPECTRUM_INV: 1569 c->inversion = INVERSION_ON; 1570 break; 1571 default: 1572 c->inversion = INVERSION_OFF; 1573 pr_debug("spectrum sense is invalid %d\n", sense); 1574 break; 1575 } 1576 } else { 1577 c->inversion = INVERSION_OFF; 1578 pr_debug("spectrum_sense %d\n", ret); 1579 } 1580 1581 mutex_lock(priv->spi_mutex); 1582 ret = cxd2880_tnrdmd_mon_rf_lvl(&priv->tnrdmd, &strength); 1583 mutex_unlock(priv->spi_mutex); 1584 if (!ret) { 1585 c->strength.len = 1; 1586 c->strength.stat[0].scale = FE_SCALE_DECIBEL; 1587 c->strength.stat[0].svalue = strength; 1588 } else { 1589 c->strength.len = 1; 1590 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1591 pr_debug("mon_rf_lvl %d\n", ret); 1592 } 1593 1594 ret = cxd2880_read_snr(fe, &snr); 1595 if (!ret) { 1596 c->cnr.len = 1; 1597 c->cnr.stat[0].scale = FE_SCALE_DECIBEL; 1598 c->cnr.stat[0].svalue = snr; 1599 } else { 1600 c->cnr.len = 1; 1601 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1602 pr_debug("read_snr %d\n", ret); 1603 } 1604 1605 return 0; 1606} 1607 1608static int cxd2880_get_frontend_t2(struct dvb_frontend *fe, 1609 struct dtv_frontend_properties *c) 1610{ 1611 int ret; 1612 struct cxd2880_priv *priv = NULL; 1613 struct cxd2880_dvbt2_l1pre l1pre; 1614 enum cxd2880_dvbt2_plp_code_rate coderate; 1615 enum cxd2880_dvbt2_plp_constell qam; 1616 enum cxd2880_tnrdmd_spectrum_sense sense; 1617 u16 snr = 0; 1618 int strength = 0; 1619 1620 if (!fe || !c) { 1621 pr_err("invalid arg.\n"); 1622 return -EINVAL; 1623 } 1624 1625 priv = fe->demodulator_priv; 1626 1627 mutex_lock(priv->spi_mutex); 1628 ret = cxd2880_tnrdmd_dvbt2_mon_l1_pre(&priv->tnrdmd, &l1pre); 1629 mutex_unlock(priv->spi_mutex); 1630 if (!ret) { 1631 switch (l1pre.fft_mode) { 1632 case CXD2880_DVBT2_M2K: 1633 c->transmission_mode = TRANSMISSION_MODE_2K; 1634 break; 1635 case CXD2880_DVBT2_M8K: 1636 c->transmission_mode = TRANSMISSION_MODE_8K; 1637 break; 1638 case CXD2880_DVBT2_M4K: 1639 c->transmission_mode = TRANSMISSION_MODE_4K; 1640 break; 1641 case CXD2880_DVBT2_M1K: 1642 c->transmission_mode = TRANSMISSION_MODE_1K; 1643 break; 1644 case CXD2880_DVBT2_M16K: 1645 c->transmission_mode = TRANSMISSION_MODE_16K; 1646 break; 1647 case CXD2880_DVBT2_M32K: 1648 c->transmission_mode = TRANSMISSION_MODE_32K; 1649 break; 1650 default: 1651 c->transmission_mode = TRANSMISSION_MODE_2K; 1652 pr_debug("L1Pre fft_mode is invalid %d\n", 1653 l1pre.fft_mode); 1654 break; 1655 } 1656 switch (l1pre.gi) { 1657 case CXD2880_DVBT2_G1_32: 1658 c->guard_interval = GUARD_INTERVAL_1_32; 1659 break; 1660 case CXD2880_DVBT2_G1_16: 1661 c->guard_interval = GUARD_INTERVAL_1_16; 1662 break; 1663 case CXD2880_DVBT2_G1_8: 1664 c->guard_interval = GUARD_INTERVAL_1_8; 1665 break; 1666 case CXD2880_DVBT2_G1_4: 1667 c->guard_interval = GUARD_INTERVAL_1_4; 1668 break; 1669 case CXD2880_DVBT2_G1_128: 1670 c->guard_interval = GUARD_INTERVAL_1_128; 1671 break; 1672 case CXD2880_DVBT2_G19_128: 1673 c->guard_interval = GUARD_INTERVAL_19_128; 1674 break; 1675 case CXD2880_DVBT2_G19_256: 1676 c->guard_interval = GUARD_INTERVAL_19_256; 1677 break; 1678 default: 1679 c->guard_interval = GUARD_INTERVAL_1_32; 1680 pr_debug("L1Pre guard interval is invalid %d\n", 1681 l1pre.gi); 1682 break; 1683 } 1684 } else { 1685 c->transmission_mode = TRANSMISSION_MODE_2K; 1686 c->guard_interval = GUARD_INTERVAL_1_32; 1687 pr_debug("L1Pre err %d\n", ret); 1688 } 1689 1690 mutex_lock(priv->spi_mutex); 1691 ret = cxd2880_tnrdmd_dvbt2_mon_code_rate(&priv->tnrdmd, 1692 CXD2880_DVBT2_PLP_DATA, 1693 &coderate); 1694 mutex_unlock(priv->spi_mutex); 1695 if (!ret) { 1696 switch (coderate) { 1697 case CXD2880_DVBT2_R1_2: 1698 c->fec_inner = FEC_1_2; 1699 break; 1700 case CXD2880_DVBT2_R3_5: 1701 c->fec_inner = FEC_3_5; 1702 break; 1703 case CXD2880_DVBT2_R2_3: 1704 c->fec_inner = FEC_2_3; 1705 break; 1706 case CXD2880_DVBT2_R3_4: 1707 c->fec_inner = FEC_3_4; 1708 break; 1709 case CXD2880_DVBT2_R4_5: 1710 c->fec_inner = FEC_4_5; 1711 break; 1712 case CXD2880_DVBT2_R5_6: 1713 c->fec_inner = FEC_5_6; 1714 break; 1715 default: 1716 c->fec_inner = FEC_NONE; 1717 pr_debug("CodeRate is invalid %d\n", coderate); 1718 break; 1719 } 1720 } else { 1721 c->fec_inner = FEC_NONE; 1722 pr_debug("CodeRate %d\n", ret); 1723 } 1724 1725 mutex_lock(priv->spi_mutex); 1726 ret = cxd2880_tnrdmd_dvbt2_mon_qam(&priv->tnrdmd, 1727 CXD2880_DVBT2_PLP_DATA, 1728 &qam); 1729 mutex_unlock(priv->spi_mutex); 1730 if (!ret) { 1731 switch (qam) { 1732 case CXD2880_DVBT2_QPSK: 1733 c->modulation = QPSK; 1734 break; 1735 case CXD2880_DVBT2_QAM16: 1736 c->modulation = QAM_16; 1737 break; 1738 case CXD2880_DVBT2_QAM64: 1739 c->modulation = QAM_64; 1740 break; 1741 case CXD2880_DVBT2_QAM256: 1742 c->modulation = QAM_256; 1743 break; 1744 default: 1745 c->modulation = QPSK; 1746 pr_debug("QAM is invalid %d\n", qam); 1747 break; 1748 } 1749 } else { 1750 c->modulation = QPSK; 1751 pr_debug("QAM %d\n", ret); 1752 } 1753 1754 mutex_lock(priv->spi_mutex); 1755 ret = cxd2880_tnrdmd_dvbt2_mon_spectrum_sense(&priv->tnrdmd, &sense); 1756 mutex_unlock(priv->spi_mutex); 1757 if (!ret) { 1758 switch (sense) { 1759 case CXD2880_TNRDMD_SPECTRUM_NORMAL: 1760 c->inversion = INVERSION_OFF; 1761 break; 1762 case CXD2880_TNRDMD_SPECTRUM_INV: 1763 c->inversion = INVERSION_ON; 1764 break; 1765 default: 1766 c->inversion = INVERSION_OFF; 1767 pr_debug("spectrum sense is invalid %d\n", sense); 1768 break; 1769 } 1770 } else { 1771 c->inversion = INVERSION_OFF; 1772 pr_debug("SpectrumSense %d\n", ret); 1773 } 1774 1775 mutex_lock(priv->spi_mutex); 1776 ret = cxd2880_tnrdmd_mon_rf_lvl(&priv->tnrdmd, &strength); 1777 mutex_unlock(priv->spi_mutex); 1778 if (!ret) { 1779 c->strength.len = 1; 1780 c->strength.stat[0].scale = FE_SCALE_DECIBEL; 1781 c->strength.stat[0].svalue = strength; 1782 } else { 1783 c->strength.len = 1; 1784 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1785 pr_debug("mon_rf_lvl %d\n", ret); 1786 } 1787 1788 ret = cxd2880_read_snr(fe, &snr); 1789 if (!ret) { 1790 c->cnr.len = 1; 1791 c->cnr.stat[0].scale = FE_SCALE_DECIBEL; 1792 c->cnr.stat[0].svalue = snr; 1793 } else { 1794 c->cnr.len = 1; 1795 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 1796 pr_debug("read_snr %d\n", ret); 1797 } 1798 1799 return 0; 1800} 1801 1802static int cxd2880_get_frontend(struct dvb_frontend *fe, 1803 struct dtv_frontend_properties *props) 1804{ 1805 int ret; 1806 1807 if (!fe || !props) { 1808 pr_err("invalid arg."); 1809 return -EINVAL; 1810 } 1811 1812 pr_debug("system=%d\n", fe->dtv_property_cache.delivery_system); 1813 switch (fe->dtv_property_cache.delivery_system) { 1814 case SYS_DVBT: 1815 ret = cxd2880_get_frontend_t(fe, props); 1816 break; 1817 case SYS_DVBT2: 1818 ret = cxd2880_get_frontend_t2(fe, props); 1819 break; 1820 default: 1821 ret = -EINVAL; 1822 break; 1823 } 1824 1825 return ret; 1826} 1827 1828static enum dvbfe_algo cxd2880_get_frontend_algo(struct dvb_frontend *fe) 1829{ 1830 return DVBFE_ALGO_HW; 1831} 1832 1833static struct dvb_frontend_ops cxd2880_dvbt_t2_ops = { 1834 .info = { 1835 .name = "Sony CXD2880", 1836 .frequency_min_hz = 174 * MHz, 1837 .frequency_max_hz = 862 * MHz, 1838 .frequency_stepsize_hz = 1 * kHz, 1839 .caps = FE_CAN_INVERSION_AUTO | 1840 FE_CAN_FEC_1_2 | 1841 FE_CAN_FEC_2_3 | 1842 FE_CAN_FEC_3_4 | 1843 FE_CAN_FEC_4_5 | 1844 FE_CAN_FEC_5_6 | 1845 FE_CAN_FEC_7_8 | 1846 FE_CAN_FEC_AUTO | 1847 FE_CAN_QPSK | 1848 FE_CAN_QAM_16 | 1849 FE_CAN_QAM_32 | 1850 FE_CAN_QAM_64 | 1851 FE_CAN_QAM_128 | 1852 FE_CAN_QAM_256 | 1853 FE_CAN_QAM_AUTO | 1854 FE_CAN_TRANSMISSION_MODE_AUTO | 1855 FE_CAN_GUARD_INTERVAL_AUTO | 1856 FE_CAN_2G_MODULATION | 1857 FE_CAN_RECOVER | 1858 FE_CAN_MUTE_TS, 1859 }, 1860 .delsys = { SYS_DVBT, SYS_DVBT2 }, 1861 1862 .release = cxd2880_release, 1863 .init = cxd2880_init, 1864 .sleep = cxd2880_sleep, 1865 .tune = cxd2880_tune, 1866 .set_frontend = cxd2880_set_frontend, 1867 .get_frontend = cxd2880_get_frontend, 1868 .read_status = cxd2880_read_status, 1869 .read_ber = cxd2880_read_ber, 1870 .read_signal_strength = cxd2880_read_signal_strength, 1871 .read_snr = cxd2880_read_snr, 1872 .read_ucblocks = cxd2880_read_ucblocks, 1873 .get_frontend_algo = cxd2880_get_frontend_algo, 1874}; 1875 1876struct dvb_frontend *cxd2880_attach(struct dvb_frontend *fe, 1877 struct cxd2880_config *cfg) 1878{ 1879 int ret; 1880 enum cxd2880_tnrdmd_chip_id chipid = 1881 CXD2880_TNRDMD_CHIP_ID_UNKNOWN; 1882 static struct cxd2880_priv *priv; 1883 u8 data = 0; 1884 1885 if (!fe) { 1886 pr_err("invalid arg.\n"); 1887 return NULL; 1888 } 1889 1890 priv = kzalloc(sizeof(struct cxd2880_priv), GFP_KERNEL); 1891 if (!priv) 1892 return NULL; 1893 1894 priv->spi = cfg->spi; 1895 priv->spi_mutex = cfg->spi_mutex; 1896 priv->spi_device.spi = cfg->spi; 1897 1898 memcpy(&fe->ops, &cxd2880_dvbt_t2_ops, 1899 sizeof(struct dvb_frontend_ops)); 1900 1901 ret = cxd2880_spi_device_initialize(&priv->spi_device, 1902 CXD2880_SPI_MODE_0, 1903 55000000); 1904 if (ret) { 1905 pr_err("spi_device_initialize failed. %d\n", ret); 1906 kfree(priv); 1907 return NULL; 1908 } 1909 1910 ret = cxd2880_spi_device_create_spi(&priv->cxd2880_spi, 1911 &priv->spi_device); 1912 if (ret) { 1913 pr_err("spi_device_create_spi failed. %d\n", ret); 1914 kfree(priv); 1915 return NULL; 1916 } 1917 1918 ret = cxd2880_io_spi_create(&priv->regio, &priv->cxd2880_spi, 0); 1919 if (ret) { 1920 pr_err("io_spi_create failed. %d\n", ret); 1921 kfree(priv); 1922 return NULL; 1923 } 1924 ret = priv->regio.write_reg(&priv->regio, 1925 CXD2880_IO_TGT_SYS, 0x00, 0x00); 1926 if (ret) { 1927 pr_err("set bank to 0x00 failed.\n"); 1928 kfree(priv); 1929 return NULL; 1930 } 1931 ret = priv->regio.read_regs(&priv->regio, 1932 CXD2880_IO_TGT_SYS, 0xfd, &data, 1); 1933 if (ret) { 1934 pr_err("read chip id failed.\n"); 1935 kfree(priv); 1936 return NULL; 1937 } 1938 1939 chipid = (enum cxd2880_tnrdmd_chip_id)data; 1940 if (chipid != CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_0X && 1941 chipid != CXD2880_TNRDMD_CHIP_ID_CXD2880_ES1_11) { 1942 pr_err("chip id invalid.\n"); 1943 kfree(priv); 1944 return NULL; 1945 } 1946 1947 fe->demodulator_priv = priv; 1948 pr_info("CXD2880 driver version: Ver %s\n", 1949 CXD2880_TNRDMD_DRIVER_VERSION); 1950 1951 return fe; 1952} 1953EXPORT_SYMBOL(cxd2880_attach); 1954 1955MODULE_DESCRIPTION("Sony CXD2880 DVB-T2/T tuner + demod driver"); 1956MODULE_AUTHOR("Sony Semiconductor Solutions Corporation"); 1957MODULE_LICENSE("GPL v2");