1254 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * NXP TDA10071 + Conexant CX24118A DVB-S/S2 demodulator + tuner driver4 *5 * Copyright (C) 2011 Antti Palosaari <crope@iki.fi>6 */7 8#include "tda10071_priv.h"9 10static const struct dvb_frontend_ops tda10071_ops;11 12/*13 * XXX: regmap_update_bits() does not fit our needs as it does not support14 * partially volatile registers. Also it performs register read even mask is as15 * wide as register value.16 */17/* write single register with mask */18static int tda10071_wr_reg_mask(struct tda10071_dev *dev,19 u8 reg, u8 val, u8 mask)20{21 int ret;22 u8 tmp;23 24 /* no need for read if whole reg is written */25 if (mask != 0xff) {26 ret = regmap_bulk_read(dev->regmap, reg, &tmp, 1);27 if (ret)28 return ret;29 30 val &= mask;31 tmp &= ~mask;32 val |= tmp;33 }34 35 return regmap_bulk_write(dev->regmap, reg, &val, 1);36}37 38/* execute firmware command */39static int tda10071_cmd_execute(struct tda10071_dev *dev,40 struct tda10071_cmd *cmd)41{42 struct i2c_client *client = dev->client;43 int ret, i;44 unsigned int uitmp;45 46 if (!dev->warm) {47 ret = -EFAULT;48 goto error;49 }50 51 mutex_lock(&dev->cmd_execute_mutex);52 53 /* write cmd and args for firmware */54 ret = regmap_bulk_write(dev->regmap, 0x00, cmd->args, cmd->len);55 if (ret)56 goto error_mutex_unlock;57 58 /* start cmd execution */59 ret = regmap_write(dev->regmap, 0x1f, 1);60 if (ret)61 goto error_mutex_unlock;62 63 /* wait cmd execution terminate */64 for (i = 1000, uitmp = 1; i && uitmp; i--) {65 ret = regmap_read(dev->regmap, 0x1f, &uitmp);66 if (ret)67 goto error_mutex_unlock;68 69 usleep_range(200, 5000);70 }71 72 mutex_unlock(&dev->cmd_execute_mutex);73 dev_dbg(&client->dev, "loop=%d\n", i);74 75 if (i == 0) {76 ret = -ETIMEDOUT;77 goto error;78 }79 80 return ret;81error_mutex_unlock:82 mutex_unlock(&dev->cmd_execute_mutex);83error:84 dev_dbg(&client->dev, "failed=%d\n", ret);85 return ret;86}87 88static int tda10071_set_tone(struct dvb_frontend *fe,89 enum fe_sec_tone_mode fe_sec_tone_mode)90{91 struct tda10071_dev *dev = fe->demodulator_priv;92 struct i2c_client *client = dev->client;93 struct tda10071_cmd cmd;94 int ret;95 u8 tone;96 97 if (!dev->warm) {98 ret = -EFAULT;99 goto error;100 }101 102 dev_dbg(&client->dev, "tone_mode=%d\n", fe_sec_tone_mode);103 104 switch (fe_sec_tone_mode) {105 case SEC_TONE_ON:106 tone = 1;107 break;108 case SEC_TONE_OFF:109 tone = 0;110 break;111 default:112 dev_dbg(&client->dev, "invalid fe_sec_tone_mode\n");113 ret = -EINVAL;114 goto error;115 }116 117 cmd.args[0] = CMD_LNB_PCB_CONFIG;118 cmd.args[1] = 0;119 cmd.args[2] = 0x00;120 cmd.args[3] = 0x00;121 cmd.args[4] = tone;122 cmd.len = 5;123 ret = tda10071_cmd_execute(dev, &cmd);124 if (ret)125 goto error;126 127 return ret;128error:129 dev_dbg(&client->dev, "failed=%d\n", ret);130 return ret;131}132 133static int tda10071_set_voltage(struct dvb_frontend *fe,134 enum fe_sec_voltage fe_sec_voltage)135{136 struct tda10071_dev *dev = fe->demodulator_priv;137 struct i2c_client *client = dev->client;138 struct tda10071_cmd cmd;139 int ret;140 u8 voltage;141 142 if (!dev->warm) {143 ret = -EFAULT;144 goto error;145 }146 147 dev_dbg(&client->dev, "voltage=%d\n", fe_sec_voltage);148 149 switch (fe_sec_voltage) {150 case SEC_VOLTAGE_13:151 voltage = 0;152 break;153 case SEC_VOLTAGE_18:154 voltage = 1;155 break;156 case SEC_VOLTAGE_OFF:157 voltage = 0;158 break;159 default:160 dev_dbg(&client->dev, "invalid fe_sec_voltage\n");161 ret = -EINVAL;162 goto error;163 }164 165 cmd.args[0] = CMD_LNB_SET_DC_LEVEL;166 cmd.args[1] = 0;167 cmd.args[2] = voltage;168 cmd.len = 3;169 ret = tda10071_cmd_execute(dev, &cmd);170 if (ret)171 goto error;172 173 return ret;174error:175 dev_dbg(&client->dev, "failed=%d\n", ret);176 return ret;177}178 179static int tda10071_diseqc_send_master_cmd(struct dvb_frontend *fe,180 struct dvb_diseqc_master_cmd *diseqc_cmd)181{182 struct tda10071_dev *dev = fe->demodulator_priv;183 struct i2c_client *client = dev->client;184 struct tda10071_cmd cmd;185 int ret, i;186 unsigned int uitmp;187 188 if (!dev->warm) {189 ret = -EFAULT;190 goto error;191 }192 193 dev_dbg(&client->dev, "msg_len=%d\n", diseqc_cmd->msg_len);194 195 if (diseqc_cmd->msg_len < 3 || diseqc_cmd->msg_len > 6) {196 ret = -EINVAL;197 goto error;198 }199 200 /* wait LNB TX */201 for (i = 500, uitmp = 0; i && !uitmp; i--) {202 ret = regmap_read(dev->regmap, 0x47, &uitmp);203 if (ret)204 goto error;205 uitmp = (uitmp >> 0) & 1;206 usleep_range(10000, 20000);207 }208 209 dev_dbg(&client->dev, "loop=%d\n", i);210 211 if (i == 0) {212 ret = -ETIMEDOUT;213 goto error;214 }215 216 ret = regmap_update_bits(dev->regmap, 0x47, 0x01, 0x00);217 if (ret)218 goto error;219 220 cmd.args[0] = CMD_LNB_SEND_DISEQC;221 cmd.args[1] = 0;222 cmd.args[2] = 0;223 cmd.args[3] = 0;224 cmd.args[4] = 2;225 cmd.args[5] = 0;226 cmd.args[6] = diseqc_cmd->msg_len;227 memcpy(&cmd.args[7], diseqc_cmd->msg, diseqc_cmd->msg_len);228 cmd.len = 7 + diseqc_cmd->msg_len;229 ret = tda10071_cmd_execute(dev, &cmd);230 if (ret)231 goto error;232 233 return ret;234error:235 dev_dbg(&client->dev, "failed=%d\n", ret);236 return ret;237}238 239static int tda10071_diseqc_recv_slave_reply(struct dvb_frontend *fe,240 struct dvb_diseqc_slave_reply *reply)241{242 struct tda10071_dev *dev = fe->demodulator_priv;243 struct i2c_client *client = dev->client;244 struct tda10071_cmd cmd;245 int ret, i;246 unsigned int uitmp;247 248 if (!dev->warm) {249 ret = -EFAULT;250 goto error;251 }252 253 dev_dbg(&client->dev, "\n");254 255 /* wait LNB RX */256 for (i = 500, uitmp = 0; i && !uitmp; i--) {257 ret = regmap_read(dev->regmap, 0x47, &uitmp);258 if (ret)259 goto error;260 uitmp = (uitmp >> 1) & 1;261 usleep_range(10000, 20000);262 }263 264 dev_dbg(&client->dev, "loop=%d\n", i);265 266 if (i == 0) {267 ret = -ETIMEDOUT;268 goto error;269 }270 271 /* reply len */272 ret = regmap_read(dev->regmap, 0x46, &uitmp);273 if (ret)274 goto error;275 276 reply->msg_len = uitmp & 0x1f; /* [4:0] */277 if (reply->msg_len > sizeof(reply->msg))278 reply->msg_len = sizeof(reply->msg); /* truncate API max */279 280 /* read reply */281 cmd.args[0] = CMD_LNB_UPDATE_REPLY;282 cmd.args[1] = 0;283 cmd.len = 2;284 ret = tda10071_cmd_execute(dev, &cmd);285 if (ret)286 goto error;287 288 ret = regmap_bulk_read(dev->regmap, cmd.len, reply->msg,289 reply->msg_len);290 if (ret)291 goto error;292 293 return ret;294error:295 dev_dbg(&client->dev, "failed=%d\n", ret);296 return ret;297}298 299static int tda10071_diseqc_send_burst(struct dvb_frontend *fe,300 enum fe_sec_mini_cmd fe_sec_mini_cmd)301{302 struct tda10071_dev *dev = fe->demodulator_priv;303 struct i2c_client *client = dev->client;304 struct tda10071_cmd cmd;305 int ret, i;306 unsigned int uitmp;307 u8 burst;308 309 if (!dev->warm) {310 ret = -EFAULT;311 goto error;312 }313 314 dev_dbg(&client->dev, "fe_sec_mini_cmd=%d\n", fe_sec_mini_cmd);315 316 switch (fe_sec_mini_cmd) {317 case SEC_MINI_A:318 burst = 0;319 break;320 case SEC_MINI_B:321 burst = 1;322 break;323 default:324 dev_dbg(&client->dev, "invalid fe_sec_mini_cmd\n");325 ret = -EINVAL;326 goto error;327 }328 329 /* wait LNB TX */330 for (i = 500, uitmp = 0; i && !uitmp; i--) {331 ret = regmap_read(dev->regmap, 0x47, &uitmp);332 if (ret)333 goto error;334 uitmp = (uitmp >> 0) & 1;335 usleep_range(10000, 20000);336 }337 338 dev_dbg(&client->dev, "loop=%d\n", i);339 340 if (i == 0) {341 ret = -ETIMEDOUT;342 goto error;343 }344 345 ret = regmap_update_bits(dev->regmap, 0x47, 0x01, 0x00);346 if (ret)347 goto error;348 349 cmd.args[0] = CMD_LNB_SEND_TONEBURST;350 cmd.args[1] = 0;351 cmd.args[2] = burst;352 cmd.len = 3;353 ret = tda10071_cmd_execute(dev, &cmd);354 if (ret)355 goto error;356 357 return ret;358error:359 dev_dbg(&client->dev, "failed=%d\n", ret);360 return ret;361}362 363static int tda10071_read_status(struct dvb_frontend *fe, enum fe_status *status)364{365 struct tda10071_dev *dev = fe->demodulator_priv;366 struct i2c_client *client = dev->client;367 struct dtv_frontend_properties *c = &fe->dtv_property_cache;368 struct tda10071_cmd cmd;369 int ret;370 unsigned int uitmp;371 u8 buf[8];372 373 *status = 0;374 375 if (!dev->warm) {376 ret = 0;377 goto error;378 }379 380 ret = regmap_read(dev->regmap, 0x39, &uitmp);381 if (ret)382 goto error;383 384 /* 0x39[0] tuner PLL */385 if (uitmp & 0x02) /* demod PLL */386 *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;387 if (uitmp & 0x04) /* viterbi or LDPC*/388 *status |= FE_HAS_VITERBI;389 if (uitmp & 0x08) /* RS or BCH */390 *status |= FE_HAS_SYNC | FE_HAS_LOCK;391 392 dev->fe_status = *status;393 394 /* signal strength */395 if (dev->fe_status & FE_HAS_SIGNAL) {396 cmd.args[0] = CMD_GET_AGCACC;397 cmd.args[1] = 0;398 cmd.len = 2;399 ret = tda10071_cmd_execute(dev, &cmd);400 if (ret)401 goto error;402 403 /* input power estimate dBm */404 ret = regmap_read(dev->regmap, 0x50, &uitmp);405 if (ret)406 goto error;407 408 c->strength.stat[0].scale = FE_SCALE_DECIBEL;409 c->strength.stat[0].svalue = (int) (uitmp - 256) * 1000;410 } else {411 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;412 }413 414 /* CNR */415 if (dev->fe_status & FE_HAS_VITERBI) {416 /* Es/No */417 ret = regmap_bulk_read(dev->regmap, 0x3a, buf, 2);418 if (ret)419 goto error;420 421 c->cnr.stat[0].scale = FE_SCALE_DECIBEL;422 c->cnr.stat[0].svalue = (buf[0] << 8 | buf[1] << 0) * 100;423 } else {424 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;425 }426 427 /* UCB/PER/BER */428 if (dev->fe_status & FE_HAS_LOCK) {429 /* TODO: report total bits/packets */430 u8 delivery_system, reg, len;431 432 switch (dev->delivery_system) {433 case SYS_DVBS:434 reg = 0x4c;435 len = 8;436 delivery_system = 1;437 break;438 case SYS_DVBS2:439 reg = 0x4d;440 len = 4;441 delivery_system = 0;442 break;443 default:444 ret = -EINVAL;445 goto error;446 }447 448 ret = regmap_read(dev->regmap, reg, &uitmp);449 if (ret)450 goto error;451 452 if (dev->meas_count == uitmp) {453 dev_dbg(&client->dev, "meas not ready=%02x\n", uitmp);454 ret = 0;455 goto error;456 } else {457 dev->meas_count = uitmp;458 }459 460 cmd.args[0] = CMD_BER_UPDATE_COUNTERS;461 cmd.args[1] = 0;462 cmd.args[2] = delivery_system;463 cmd.len = 3;464 ret = tda10071_cmd_execute(dev, &cmd);465 if (ret)466 goto error;467 468 ret = regmap_bulk_read(dev->regmap, cmd.len, buf, len);469 if (ret)470 goto error;471 472 if (dev->delivery_system == SYS_DVBS) {473 u32 bit_error = buf[0] << 24 | buf[1] << 16 |474 buf[2] << 8 | buf[3] << 0;475 476 dev->dvbv3_ber = bit_error;477 dev->post_bit_error += bit_error;478 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;479 c->post_bit_error.stat[0].uvalue = dev->post_bit_error;480 dev->block_error += buf[4] << 8 | buf[5] << 0;481 c->block_error.stat[0].scale = FE_SCALE_COUNTER;482 c->block_error.stat[0].uvalue = dev->block_error;483 } else {484 dev->dvbv3_ber = buf[0] << 8 | buf[1] << 0;485 dev->post_bit_error += buf[0] << 8 | buf[1] << 0;486 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER;487 c->post_bit_error.stat[0].uvalue = dev->post_bit_error;488 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;489 }490 } else {491 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;492 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;493 }494 495 return ret;496error:497 dev_dbg(&client->dev, "failed=%d\n", ret);498 return ret;499}500 501static int tda10071_read_snr(struct dvb_frontend *fe, u16 *snr)502{503 struct dtv_frontend_properties *c = &fe->dtv_property_cache;504 505 if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL)506 *snr = div_s64(c->cnr.stat[0].svalue, 100);507 else508 *snr = 0;509 return 0;510}511 512static int tda10071_read_signal_strength(struct dvb_frontend *fe, u16 *strength)513{514 struct dtv_frontend_properties *c = &fe->dtv_property_cache;515 unsigned int uitmp;516 517 if (c->strength.stat[0].scale == FE_SCALE_DECIBEL) {518 uitmp = div_s64(c->strength.stat[0].svalue, 1000) + 256;519 uitmp = clamp(uitmp, 181U, 236U); /* -75dBm - -20dBm */520 /* scale value to 0x0000-0xffff */521 *strength = (uitmp-181) * 0xffff / (236-181);522 } else {523 *strength = 0;524 }525 return 0;526}527 528static int tda10071_read_ber(struct dvb_frontend *fe, u32 *ber)529{530 struct tda10071_dev *dev = fe->demodulator_priv;531 532 *ber = dev->dvbv3_ber;533 return 0;534}535 536static int tda10071_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)537{538 struct dtv_frontend_properties *c = &fe->dtv_property_cache;539 540 if (c->block_error.stat[0].scale == FE_SCALE_COUNTER)541 *ucblocks = c->block_error.stat[0].uvalue;542 else543 *ucblocks = 0;544 return 0;545}546 547static int tda10071_set_frontend(struct dvb_frontend *fe)548{549 struct tda10071_dev *dev = fe->demodulator_priv;550 struct i2c_client *client = dev->client;551 struct tda10071_cmd cmd;552 struct dtv_frontend_properties *c = &fe->dtv_property_cache;553 int ret, i;554 u8 mode, rolloff, pilot, inversion, div;555 enum fe_modulation modulation;556 557 dev_dbg(&client->dev,558 "delivery_system=%d modulation=%d frequency=%u symbol_rate=%d inversion=%d pilot=%d rolloff=%d\n",559 c->delivery_system, c->modulation, c->frequency, c->symbol_rate,560 c->inversion, c->pilot, c->rolloff);561 562 dev->delivery_system = SYS_UNDEFINED;563 564 if (!dev->warm) {565 ret = -EFAULT;566 goto error;567 }568 569 switch (c->inversion) {570 case INVERSION_OFF:571 inversion = 1;572 break;573 case INVERSION_ON:574 inversion = 0;575 break;576 case INVERSION_AUTO:577 /* 2 = auto; try first on then off578 * 3 = auto; try first off then on */579 inversion = 3;580 break;581 default:582 dev_dbg(&client->dev, "invalid inversion\n");583 ret = -EINVAL;584 goto error;585 }586 587 switch (c->delivery_system) {588 case SYS_DVBS:589 modulation = QPSK;590 rolloff = 0;591 pilot = 2;592 break;593 case SYS_DVBS2:594 modulation = c->modulation;595 596 switch (c->rolloff) {597 case ROLLOFF_20:598 rolloff = 2;599 break;600 case ROLLOFF_25:601 rolloff = 1;602 break;603 case ROLLOFF_35:604 rolloff = 0;605 break;606 case ROLLOFF_AUTO:607 default:608 dev_dbg(&client->dev, "invalid rolloff\n");609 ret = -EINVAL;610 goto error;611 }612 613 switch (c->pilot) {614 case PILOT_OFF:615 pilot = 0;616 break;617 case PILOT_ON:618 pilot = 1;619 break;620 case PILOT_AUTO:621 pilot = 2;622 break;623 default:624 dev_dbg(&client->dev, "invalid pilot\n");625 ret = -EINVAL;626 goto error;627 }628 break;629 default:630 dev_dbg(&client->dev, "invalid delivery_system\n");631 ret = -EINVAL;632 goto error;633 }634 635 for (i = 0, mode = 0xff; i < ARRAY_SIZE(TDA10071_MODCOD); i++) {636 if (c->delivery_system == TDA10071_MODCOD[i].delivery_system &&637 modulation == TDA10071_MODCOD[i].modulation &&638 c->fec_inner == TDA10071_MODCOD[i].fec) {639 mode = TDA10071_MODCOD[i].val;640 dev_dbg(&client->dev, "mode found=%02x\n", mode);641 break;642 }643 }644 645 if (mode == 0xff) {646 dev_dbg(&client->dev, "invalid parameter combination\n");647 ret = -EINVAL;648 goto error;649 }650 651 if (c->symbol_rate <= 5000000)652 div = 14;653 else654 div = 4;655 656 ret = regmap_write(dev->regmap, 0x81, div);657 if (ret)658 goto error;659 660 ret = regmap_write(dev->regmap, 0xe3, div);661 if (ret)662 goto error;663 664 cmd.args[0] = CMD_CHANGE_CHANNEL;665 cmd.args[1] = 0;666 cmd.args[2] = mode;667 cmd.args[3] = (c->frequency >> 16) & 0xff;668 cmd.args[4] = (c->frequency >> 8) & 0xff;669 cmd.args[5] = (c->frequency >> 0) & 0xff;670 cmd.args[6] = ((c->symbol_rate / 1000) >> 8) & 0xff;671 cmd.args[7] = ((c->symbol_rate / 1000) >> 0) & 0xff;672 cmd.args[8] = ((tda10071_ops.info.frequency_tolerance_hz / 1000) >> 8) & 0xff;673 cmd.args[9] = ((tda10071_ops.info.frequency_tolerance_hz / 1000) >> 0) & 0xff;674 cmd.args[10] = rolloff;675 cmd.args[11] = inversion;676 cmd.args[12] = pilot;677 cmd.args[13] = 0x00;678 cmd.args[14] = 0x00;679 cmd.len = 15;680 ret = tda10071_cmd_execute(dev, &cmd);681 if (ret)682 goto error;683 684 dev->delivery_system = c->delivery_system;685 686 return ret;687error:688 dev_dbg(&client->dev, "failed=%d\n", ret);689 return ret;690}691 692static int tda10071_get_frontend(struct dvb_frontend *fe,693 struct dtv_frontend_properties *c)694{695 struct tda10071_dev *dev = fe->demodulator_priv;696 struct i2c_client *client = dev->client;697 int ret, i;698 u8 buf[5], tmp;699 700 if (!dev->warm || !(dev->fe_status & FE_HAS_LOCK)) {701 ret = 0;702 goto error;703 }704 705 ret = regmap_bulk_read(dev->regmap, 0x30, buf, 5);706 if (ret)707 goto error;708 709 tmp = buf[0] & 0x3f;710 for (i = 0; i < ARRAY_SIZE(TDA10071_MODCOD); i++) {711 if (tmp == TDA10071_MODCOD[i].val) {712 c->modulation = TDA10071_MODCOD[i].modulation;713 c->fec_inner = TDA10071_MODCOD[i].fec;714 c->delivery_system = TDA10071_MODCOD[i].delivery_system;715 }716 }717 718 switch ((buf[1] >> 0) & 0x01) {719 case 0:720 c->inversion = INVERSION_ON;721 break;722 case 1:723 c->inversion = INVERSION_OFF;724 break;725 }726 727 switch ((buf[1] >> 7) & 0x01) {728 case 0:729 c->pilot = PILOT_OFF;730 break;731 case 1:732 c->pilot = PILOT_ON;733 break;734 }735 736 c->frequency = (buf[2] << 16) | (buf[3] << 8) | (buf[4] << 0);737 738 ret = regmap_bulk_read(dev->regmap, 0x52, buf, 3);739 if (ret)740 goto error;741 742 c->symbol_rate = ((buf[0] << 16) | (buf[1] << 8) | (buf[2] << 0)) * 1000;743 744 return ret;745error:746 dev_dbg(&client->dev, "failed=%d\n", ret);747 return ret;748}749 750static int tda10071_init(struct dvb_frontend *fe)751{752 struct tda10071_dev *dev = fe->demodulator_priv;753 struct i2c_client *client = dev->client;754 struct dtv_frontend_properties *c = &fe->dtv_property_cache;755 struct tda10071_cmd cmd;756 int ret, i, len, remaining, fw_size;757 unsigned int uitmp;758 const struct firmware *fw;759 u8 *fw_file = TDA10071_FIRMWARE;760 u8 tmp, buf[4];761 struct tda10071_reg_val_mask tab[] = {762 { 0xcd, 0x00, 0x07 },763 { 0x80, 0x00, 0x02 },764 { 0xcd, 0x00, 0xc0 },765 { 0xce, 0x00, 0x1b },766 { 0x9d, 0x00, 0x01 },767 { 0x9d, 0x00, 0x02 },768 { 0x9e, 0x00, 0x01 },769 { 0x87, 0x00, 0x80 },770 { 0xce, 0x00, 0x08 },771 { 0xce, 0x00, 0x10 },772 };773 struct tda10071_reg_val_mask tab2[] = {774 { 0xf1, 0x70, 0xff },775 { 0x88, dev->pll_multiplier, 0x3f },776 { 0x89, 0x00, 0x10 },777 { 0x89, 0x10, 0x10 },778 { 0xc0, 0x01, 0x01 },779 { 0xc0, 0x00, 0x01 },780 { 0xe0, 0xff, 0xff },781 { 0xe0, 0x00, 0xff },782 { 0x96, 0x1e, 0x7e },783 { 0x8b, 0x08, 0x08 },784 { 0x8b, 0x00, 0x08 },785 { 0x8f, 0x1a, 0x7e },786 { 0x8c, 0x68, 0xff },787 { 0x8d, 0x08, 0xff },788 { 0x8e, 0x4c, 0xff },789 { 0x8f, 0x01, 0x01 },790 { 0x8b, 0x04, 0x04 },791 { 0x8b, 0x00, 0x04 },792 { 0x87, 0x05, 0x07 },793 { 0x80, 0x00, 0x20 },794 { 0xc8, 0x01, 0xff },795 { 0xb4, 0x47, 0xff },796 { 0xb5, 0x9c, 0xff },797 { 0xb6, 0x7d, 0xff },798 { 0xba, 0x00, 0x03 },799 { 0xb7, 0x47, 0xff },800 { 0xb8, 0x9c, 0xff },801 { 0xb9, 0x7d, 0xff },802 { 0xba, 0x00, 0x0c },803 { 0xc8, 0x00, 0xff },804 { 0xcd, 0x00, 0x04 },805 { 0xcd, 0x00, 0x20 },806 { 0xe8, 0x02, 0xff },807 { 0xcf, 0x20, 0xff },808 { 0x9b, 0xd7, 0xff },809 { 0x9a, 0x01, 0x03 },810 { 0xa8, 0x05, 0x0f },811 { 0xa8, 0x65, 0xf0 },812 { 0xa6, 0xa0, 0xf0 },813 { 0x9d, 0x50, 0xfc },814 { 0x9e, 0x20, 0xe0 },815 { 0xa3, 0x1c, 0x7c },816 { 0xd5, 0x03, 0x03 },817 };818 819 if (dev->warm) {820 /* warm state - wake up device from sleep */821 822 for (i = 0; i < ARRAY_SIZE(tab); i++) {823 ret = tda10071_wr_reg_mask(dev, tab[i].reg,824 tab[i].val, tab[i].mask);825 if (ret)826 goto error;827 }828 829 cmd.args[0] = CMD_SET_SLEEP_MODE;830 cmd.args[1] = 0;831 cmd.args[2] = 0;832 cmd.len = 3;833 ret = tda10071_cmd_execute(dev, &cmd);834 if (ret)835 goto error;836 } else {837 /* cold state - try to download firmware */838 839 /* request the firmware, this will block and timeout */840 ret = request_firmware(&fw, fw_file, &client->dev);841 if (ret) {842 dev_err(&client->dev,843 "did not find the firmware file '%s' (status %d). You can use <kernel_dir>/scripts/get_dvb_firmware to get the firmware\n",844 fw_file, ret);845 goto error;846 }847 848 /* init */849 for (i = 0; i < ARRAY_SIZE(tab2); i++) {850 ret = tda10071_wr_reg_mask(dev, tab2[i].reg,851 tab2[i].val, tab2[i].mask);852 if (ret)853 goto error_release_firmware;854 }855 856 /* download firmware */857 ret = regmap_write(dev->regmap, 0xe0, 0x7f);858 if (ret)859 goto error_release_firmware;860 861 ret = regmap_write(dev->regmap, 0xf7, 0x81);862 if (ret)863 goto error_release_firmware;864 865 ret = regmap_write(dev->regmap, 0xf8, 0x00);866 if (ret)867 goto error_release_firmware;868 869 ret = regmap_write(dev->regmap, 0xf9, 0x00);870 if (ret)871 goto error_release_firmware;872 873 dev_info(&client->dev,874 "found a '%s' in cold state, will try to load a firmware\n",875 tda10071_ops.info.name);876 dev_info(&client->dev, "downloading firmware from file '%s'\n",877 fw_file);878 879 /* do not download last byte */880 fw_size = fw->size - 1;881 882 for (remaining = fw_size; remaining > 0;883 remaining -= (dev->i2c_wr_max - 1)) {884 len = remaining;885 if (len > (dev->i2c_wr_max - 1))886 len = (dev->i2c_wr_max - 1);887 888 ret = regmap_bulk_write(dev->regmap, 0xfa,889 (u8 *) &fw->data[fw_size - remaining], len);890 if (ret) {891 dev_err(&client->dev,892 "firmware download failed=%d\n", ret);893 goto error_release_firmware;894 }895 }896 release_firmware(fw);897 898 ret = regmap_write(dev->regmap, 0xf7, 0x0c);899 if (ret)900 goto error;901 902 ret = regmap_write(dev->regmap, 0xe0, 0x00);903 if (ret)904 goto error;905 906 /* wait firmware start */907 msleep(250);908 909 /* firmware status */910 ret = regmap_read(dev->regmap, 0x51, &uitmp);911 if (ret)912 goto error;913 914 if (uitmp) {915 dev_info(&client->dev, "firmware did not run\n");916 ret = -EFAULT;917 goto error;918 } else {919 dev->warm = true;920 }921 922 cmd.args[0] = CMD_GET_FW_VERSION;923 cmd.len = 1;924 ret = tda10071_cmd_execute(dev, &cmd);925 if (ret)926 goto error;927 928 ret = regmap_bulk_read(dev->regmap, cmd.len, buf, 4);929 if (ret)930 goto error;931 932 dev_info(&client->dev, "firmware version %d.%d.%d.%d\n",933 buf[0], buf[1], buf[2], buf[3]);934 dev_info(&client->dev, "found a '%s' in warm state\n",935 tda10071_ops.info.name);936 937 ret = regmap_bulk_read(dev->regmap, 0x81, buf, 2);938 if (ret)939 goto error;940 941 cmd.args[0] = CMD_DEMOD_INIT;942 cmd.args[1] = ((dev->clk / 1000) >> 8) & 0xff;943 cmd.args[2] = ((dev->clk / 1000) >> 0) & 0xff;944 cmd.args[3] = buf[0];945 cmd.args[4] = buf[1];946 cmd.args[5] = dev->pll_multiplier;947 cmd.args[6] = dev->spec_inv;948 cmd.args[7] = 0x00;949 cmd.len = 8;950 ret = tda10071_cmd_execute(dev, &cmd);951 if (ret)952 goto error;953 954 if (dev->tuner_i2c_addr)955 tmp = dev->tuner_i2c_addr;956 else957 tmp = 0x14;958 959 cmd.args[0] = CMD_TUNER_INIT;960 cmd.args[1] = 0x00;961 cmd.args[2] = 0x00;962 cmd.args[3] = 0x00;963 cmd.args[4] = 0x00;964 cmd.args[5] = tmp;965 cmd.args[6] = 0x00;966 cmd.args[7] = 0x03;967 cmd.args[8] = 0x02;968 cmd.args[9] = 0x02;969 cmd.args[10] = 0x00;970 cmd.args[11] = 0x00;971 cmd.args[12] = 0x00;972 cmd.args[13] = 0x00;973 cmd.args[14] = 0x00;974 cmd.len = 15;975 ret = tda10071_cmd_execute(dev, &cmd);976 if (ret)977 goto error;978 979 cmd.args[0] = CMD_MPEG_CONFIG;980 cmd.args[1] = 0;981 cmd.args[2] = dev->ts_mode;982 cmd.args[3] = 0x00;983 cmd.args[4] = 0x04;984 cmd.args[5] = 0x00;985 cmd.len = 6;986 ret = tda10071_cmd_execute(dev, &cmd);987 if (ret)988 goto error;989 990 ret = regmap_update_bits(dev->regmap, 0xf0, 0x01, 0x01);991 if (ret)992 goto error;993 994 cmd.args[0] = CMD_LNB_CONFIG;995 cmd.args[1] = 0;996 cmd.args[2] = 150;997 cmd.args[3] = 3;998 cmd.args[4] = 22;999 cmd.args[5] = 1;1000 cmd.args[6] = 1;1001 cmd.args[7] = 30;1002 cmd.args[8] = 30;1003 cmd.args[9] = 30;1004 cmd.args[10] = 30;1005 cmd.len = 11;1006 ret = tda10071_cmd_execute(dev, &cmd);1007 if (ret)1008 goto error;1009 1010 cmd.args[0] = CMD_BER_CONTROL;1011 cmd.args[1] = 0;1012 cmd.args[2] = 14;1013 cmd.args[3] = 14;1014 cmd.len = 4;1015 ret = tda10071_cmd_execute(dev, &cmd);1016 if (ret)1017 goto error;1018 }1019 1020 /* init stats here in order signal app which stats are supported */1021 c->strength.len = 1;1022 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;1023 c->cnr.len = 1;1024 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;1025 c->post_bit_error.len = 1;1026 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;1027 c->block_error.len = 1;1028 c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;1029 1030 return ret;1031error_release_firmware:1032 release_firmware(fw);1033error:1034 dev_dbg(&client->dev, "failed=%d\n", ret);1035 return ret;1036}1037 1038static int tda10071_sleep(struct dvb_frontend *fe)1039{1040 struct tda10071_dev *dev = fe->demodulator_priv;1041 struct i2c_client *client = dev->client;1042 struct tda10071_cmd cmd;1043 int ret, i;1044 struct tda10071_reg_val_mask tab[] = {1045 { 0xcd, 0x07, 0x07 },1046 { 0x80, 0x02, 0x02 },1047 { 0xcd, 0xc0, 0xc0 },1048 { 0xce, 0x1b, 0x1b },1049 { 0x9d, 0x01, 0x01 },1050 { 0x9d, 0x02, 0x02 },1051 { 0x9e, 0x01, 0x01 },1052 { 0x87, 0x80, 0x80 },1053 { 0xce, 0x08, 0x08 },1054 { 0xce, 0x10, 0x10 },1055 };1056 1057 if (!dev->warm) {1058 ret = -EFAULT;1059 goto error;1060 }1061 1062 cmd.args[0] = CMD_SET_SLEEP_MODE;1063 cmd.args[1] = 0;1064 cmd.args[2] = 1;1065 cmd.len = 3;1066 ret = tda10071_cmd_execute(dev, &cmd);1067 if (ret)1068 goto error;1069 1070 for (i = 0; i < ARRAY_SIZE(tab); i++) {1071 ret = tda10071_wr_reg_mask(dev, tab[i].reg, tab[i].val,1072 tab[i].mask);1073 if (ret)1074 goto error;1075 }1076 1077 return ret;1078error:1079 dev_dbg(&client->dev, "failed=%d\n", ret);1080 return ret;1081}1082 1083static int tda10071_get_tune_settings(struct dvb_frontend *fe,1084 struct dvb_frontend_tune_settings *s)1085{1086 s->min_delay_ms = 8000;1087 s->step_size = 0;1088 s->max_drift = 0;1089 1090 return 0;1091}1092 1093static const struct dvb_frontend_ops tda10071_ops = {1094 .delsys = { SYS_DVBS, SYS_DVBS2 },1095 .info = {1096 .name = "NXP TDA10071",1097 .frequency_min_hz = 950 * MHz,1098 .frequency_max_hz = 2150 * MHz,1099 .frequency_tolerance_hz = 5 * MHz,1100 .symbol_rate_min = 1000000,1101 .symbol_rate_max = 45000000,1102 .caps = FE_CAN_INVERSION_AUTO |1103 FE_CAN_FEC_1_2 |1104 FE_CAN_FEC_2_3 |1105 FE_CAN_FEC_3_4 |1106 FE_CAN_FEC_4_5 |1107 FE_CAN_FEC_5_6 |1108 FE_CAN_FEC_6_7 |1109 FE_CAN_FEC_7_8 |1110 FE_CAN_FEC_8_9 |1111 FE_CAN_FEC_AUTO |1112 FE_CAN_QPSK |1113 FE_CAN_RECOVER |1114 FE_CAN_2G_MODULATION1115 },1116 1117 .get_tune_settings = tda10071_get_tune_settings,1118 1119 .init = tda10071_init,1120 .sleep = tda10071_sleep,1121 1122 .set_frontend = tda10071_set_frontend,1123 .get_frontend = tda10071_get_frontend,1124 1125 .read_status = tda10071_read_status,1126 .read_snr = tda10071_read_snr,1127 .read_signal_strength = tda10071_read_signal_strength,1128 .read_ber = tda10071_read_ber,1129 .read_ucblocks = tda10071_read_ucblocks,1130 1131 .diseqc_send_master_cmd = tda10071_diseqc_send_master_cmd,1132 .diseqc_recv_slave_reply = tda10071_diseqc_recv_slave_reply,1133 .diseqc_send_burst = tda10071_diseqc_send_burst,1134 1135 .set_tone = tda10071_set_tone,1136 .set_voltage = tda10071_set_voltage,1137};1138 1139static struct dvb_frontend *tda10071_get_dvb_frontend(struct i2c_client *client)1140{1141 struct tda10071_dev *dev = i2c_get_clientdata(client);1142 1143 dev_dbg(&client->dev, "\n");1144 1145 return &dev->fe;1146}1147 1148static int tda10071_probe(struct i2c_client *client)1149{1150 struct tda10071_dev *dev;1151 struct tda10071_platform_data *pdata = client->dev.platform_data;1152 int ret;1153 unsigned int uitmp;1154 static const struct regmap_config regmap_config = {1155 .reg_bits = 8,1156 .val_bits = 8,1157 };1158 1159 dev = kzalloc(sizeof(*dev), GFP_KERNEL);1160 if (!dev) {1161 ret = -ENOMEM;1162 goto err;1163 }1164 1165 dev->client = client;1166 mutex_init(&dev->cmd_execute_mutex);1167 dev->clk = pdata->clk;1168 dev->i2c_wr_max = pdata->i2c_wr_max;1169 dev->ts_mode = pdata->ts_mode;1170 dev->spec_inv = pdata->spec_inv;1171 dev->pll_multiplier = pdata->pll_multiplier;1172 dev->tuner_i2c_addr = pdata->tuner_i2c_addr;1173 dev->regmap = devm_regmap_init_i2c(client, ®map_config);1174 if (IS_ERR(dev->regmap)) {1175 ret = PTR_ERR(dev->regmap);1176 goto err_kfree;1177 }1178 1179 /* chip ID */1180 ret = regmap_read(dev->regmap, 0xff, &uitmp);1181 if (ret)1182 goto err_kfree;1183 if (uitmp != 0x0f) {1184 ret = -ENODEV;1185 goto err_kfree;1186 }1187 1188 /* chip type */1189 ret = regmap_read(dev->regmap, 0xdd, &uitmp);1190 if (ret)1191 goto err_kfree;1192 if (uitmp != 0x00) {1193 ret = -ENODEV;1194 goto err_kfree;1195 }1196 1197 /* chip version */1198 ret = regmap_read(dev->regmap, 0xfe, &uitmp);1199 if (ret)1200 goto err_kfree;1201 if (uitmp != 0x01) {1202 ret = -ENODEV;1203 goto err_kfree;1204 }1205 1206 /* create dvb_frontend */1207 memcpy(&dev->fe.ops, &tda10071_ops, sizeof(struct dvb_frontend_ops));1208 dev->fe.demodulator_priv = dev;1209 i2c_set_clientdata(client, dev);1210 1211 /* setup callbacks */1212 pdata->get_dvb_frontend = tda10071_get_dvb_frontend;1213 1214 dev_info(&client->dev, "NXP TDA10071 successfully identified\n");1215 return 0;1216err_kfree:1217 kfree(dev);1218err:1219 dev_dbg(&client->dev, "failed=%d\n", ret);1220 return ret;1221}1222 1223static void tda10071_remove(struct i2c_client *client)1224{1225 struct tda10071_dev *dev = i2c_get_clientdata(client);1226 1227 dev_dbg(&client->dev, "\n");1228 1229 kfree(dev);1230}1231 1232static const struct i2c_device_id tda10071_id_table[] = {1233 { "tda10071_cx24118" },1234 {}1235};1236MODULE_DEVICE_TABLE(i2c, tda10071_id_table);1237 1238static struct i2c_driver tda10071_driver = {1239 .driver = {1240 .name = "tda10071",1241 .suppress_bind_attrs = true,1242 },1243 .probe = tda10071_probe,1244 .remove = tda10071_remove,1245 .id_table = tda10071_id_table,1246};1247 1248module_i2c_driver(tda10071_driver);1249 1250MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");1251MODULE_DESCRIPTION("NXP TDA10071 DVB-S/S2 demodulator driver");1252MODULE_LICENSE("GPL");1253MODULE_FIRMWARE(TDA10071_FIRMWARE);1254