Path: blob/master/drivers/media/dvb/frontends/af9013.c
15112 views
/*1* Afatech AF9013 demodulator driver2*3* Copyright (C) 2007 Antti Palosaari <[email protected]>4*5* Thanks to Afatech who kindly provided information.6*7* This program is free software; you can redistribute it and/or modify8* it under the terms of the GNU General Public License as published by9* the Free Software Foundation; either version 2 of the License, or10* (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 of14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the15* GNU General Public License for more details.16*17* You should have received a copy of the GNU General Public License18* along with this program; if not, write to the Free Software19* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.20*21*/2223#include <linux/kernel.h>24#include <linux/module.h>25#include <linux/moduleparam.h>26#include <linux/init.h>27#include <linux/delay.h>28#include <linux/string.h>29#include <linux/slab.h>30#include <linux/firmware.h>3132#include "dvb_frontend.h"33#include "af9013_priv.h"34#include "af9013.h"3536int af9013_debug;3738struct af9013_state {39struct i2c_adapter *i2c;40struct dvb_frontend frontend;4142struct af9013_config config;4344/* tuner/demod RF and IF AGC limits used for signal strength calc */45u8 signal_strength_en, rf_50, rf_80, if_50, if_80;46u16 signal_strength;47u32 ber;48u32 ucblocks;49u16 snr;50u32 frequency;51unsigned long next_statistics_check;52};5354static u8 regmask[8] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };5556static int af9013_write_regs(struct af9013_state *state, u8 mbox, u16 reg,57u8 *val, u8 len)58{59u8 buf[3+len];60struct i2c_msg msg = {61.addr = state->config.demod_address,62.flags = 0,63.len = sizeof(buf),64.buf = buf };6566buf[0] = reg >> 8;67buf[1] = reg & 0xff;68buf[2] = mbox;69memcpy(&buf[3], val, len);7071if (i2c_transfer(state->i2c, &msg, 1) != 1) {72warn("I2C write failed reg:%04x len:%d", reg, len);73return -EREMOTEIO;74}75return 0;76}7778static int af9013_write_ofdm_regs(struct af9013_state *state, u16 reg, u8 *val,79u8 len)80{81u8 mbox = (1 << 0)|(1 << 1)|((len - 1) << 2)|(0 << 6)|(0 << 7);82return af9013_write_regs(state, mbox, reg, val, len);83}8485static int af9013_write_ofsm_regs(struct af9013_state *state, u16 reg, u8 *val,86u8 len)87{88u8 mbox = (1 << 0)|(1 << 1)|((len - 1) << 2)|(1 << 6)|(1 << 7);89return af9013_write_regs(state, mbox, reg, val, len);90}9192/* write single register */93static int af9013_write_reg(struct af9013_state *state, u16 reg, u8 val)94{95return af9013_write_ofdm_regs(state, reg, &val, 1);96}9798/* read single register */99static int af9013_read_reg(struct af9013_state *state, u16 reg, u8 *val)100{101u8 obuf[3] = { reg >> 8, reg & 0xff, 0 };102u8 ibuf[1];103struct i2c_msg msg[2] = {104{105.addr = state->config.demod_address,106.flags = 0,107.len = sizeof(obuf),108.buf = obuf109}, {110.addr = state->config.demod_address,111.flags = I2C_M_RD,112.len = sizeof(ibuf),113.buf = ibuf114}115};116117if (i2c_transfer(state->i2c, msg, 2) != 2) {118warn("I2C read failed reg:%04x", reg);119return -EREMOTEIO;120}121*val = ibuf[0];122return 0;123}124125static int af9013_write_reg_bits(struct af9013_state *state, u16 reg, u8 pos,126u8 len, u8 val)127{128int ret;129u8 tmp, mask;130131ret = af9013_read_reg(state, reg, &tmp);132if (ret)133return ret;134135mask = regmask[len - 1] << pos;136tmp = (tmp & ~mask) | ((val << pos) & mask);137138return af9013_write_reg(state, reg, tmp);139}140141static int af9013_read_reg_bits(struct af9013_state *state, u16 reg, u8 pos,142u8 len, u8 *val)143{144int ret;145u8 tmp;146147ret = af9013_read_reg(state, reg, &tmp);148if (ret)149return ret;150*val = (tmp >> pos) & regmask[len - 1];151return 0;152}153154static int af9013_set_gpio(struct af9013_state *state, u8 gpio, u8 gpioval)155{156int ret;157u8 pos;158u16 addr;159deb_info("%s: gpio:%d gpioval:%02x\n", __func__, gpio, gpioval);160161/* GPIO0 & GPIO1 0xd735162GPIO2 & GPIO3 0xd736 */163164switch (gpio) {165case 0:166case 1:167addr = 0xd735;168break;169case 2:170case 3:171addr = 0xd736;172break;173174default:175err("invalid gpio:%d\n", gpio);176ret = -EINVAL;177goto error;178};179180switch (gpio) {181case 0:182case 2:183pos = 0;184break;185case 1:186case 3:187default:188pos = 4;189break;190};191192ret = af9013_write_reg_bits(state, addr, pos, 4, gpioval);193194error:195return ret;196}197198static u32 af913_div(u32 a, u32 b, u32 x)199{200u32 r = 0, c = 0, i;201deb_info("%s: a:%d b:%d x:%d\n", __func__, a, b, x);202203if (a > b) {204c = a / b;205a = a - c * b;206}207208for (i = 0; i < x; i++) {209if (a >= b) {210r += 1;211a -= b;212}213a <<= 1;214r <<= 1;215}216r = (c << (u32)x) + r;217218deb_info("%s: a:%d b:%d x:%d r:%d r:%x\n", __func__, a, b, x, r, r);219return r;220}221222static int af9013_set_coeff(struct af9013_state *state, fe_bandwidth_t bw)223{224int ret, i, j, found;225deb_info("%s: adc_clock:%d bw:%d\n", __func__,226state->config.adc_clock, bw);227228/* lookup coeff from table */229for (i = 0, found = 0; i < ARRAY_SIZE(coeff_table); i++) {230if (coeff_table[i].adc_clock == state->config.adc_clock &&231coeff_table[i].bw == bw) {232found = 1;233break;234}235}236237if (!found) {238err("invalid bw or clock");239ret = -EINVAL;240goto error;241}242243deb_info("%s: coeff: ", __func__);244debug_dump(coeff_table[i].val, sizeof(coeff_table[i].val), deb_info);245246/* program */247for (j = 0; j < sizeof(coeff_table[i].val); j++) {248ret = af9013_write_reg(state, 0xae00 + j,249coeff_table[i].val[j]);250if (ret)251break;252}253254error:255return ret;256}257258static int af9013_set_adc_ctrl(struct af9013_state *state)259{260int ret;261u8 buf[3], tmp, i;262u32 adc_cw;263264deb_info("%s: adc_clock:%d\n", __func__, state->config.adc_clock);265266/* adc frequency type */267switch (state->config.adc_clock) {268case 28800: /* 28.800 MHz */269tmp = 0;270break;271case 20480: /* 20.480 MHz */272tmp = 1;273break;274case 28000: /* 28.000 MHz */275tmp = 2;276break;277case 25000: /* 25.000 MHz */278tmp = 3;279break;280default:281err("invalid xtal");282return -EINVAL;283}284285adc_cw = af913_div(state->config.adc_clock*1000, 1000000ul, 19ul);286287buf[0] = (u8) ((adc_cw & 0x000000ff));288buf[1] = (u8) ((adc_cw & 0x0000ff00) >> 8);289buf[2] = (u8) ((adc_cw & 0x00ff0000) >> 16);290291deb_info("%s: adc_cw:", __func__);292debug_dump(buf, sizeof(buf), deb_info);293294/* program */295for (i = 0; i < sizeof(buf); i++) {296ret = af9013_write_reg(state, 0xd180 + i, buf[i]);297if (ret)298goto error;299}300ret = af9013_write_reg_bits(state, 0x9bd2, 0, 4, tmp);301error:302return ret;303}304305static int af9013_set_freq_ctrl(struct af9013_state *state, fe_bandwidth_t bw)306{307int ret;308u16 addr;309u8 buf[3], i, j;310u32 adc_freq, freq_cw;311s8 bfs_spec_inv;312int if_sample_freq;313314for (j = 0; j < 3; j++) {315if (j == 0) {316addr = 0xd140; /* fcw normal */317bfs_spec_inv = state->config.rf_spec_inv ? -1 : 1;318} else if (j == 1) {319addr = 0x9be7; /* fcw dummy ram */320bfs_spec_inv = state->config.rf_spec_inv ? -1 : 1;321} else {322addr = 0x9bea; /* fcw inverted */323bfs_spec_inv = state->config.rf_spec_inv ? 1 : -1;324}325326adc_freq = state->config.adc_clock * 1000;327if_sample_freq = state->config.tuner_if * 1000;328329/* TDA18271 uses different sampling freq for every bw */330if (state->config.tuner == AF9013_TUNER_TDA18271) {331switch (bw) {332case BANDWIDTH_6_MHZ:333if_sample_freq = 3300000; /* 3.3 MHz */334break;335case BANDWIDTH_7_MHZ:336if_sample_freq = 3500000; /* 3.5 MHz */337break;338case BANDWIDTH_8_MHZ:339default:340if_sample_freq = 4000000; /* 4.0 MHz */341break;342}343} else if (state->config.tuner == AF9013_TUNER_TDA18218) {344switch (bw) {345case BANDWIDTH_6_MHZ:346if_sample_freq = 3000000; /* 3 MHz */347break;348case BANDWIDTH_7_MHZ:349if_sample_freq = 3500000; /* 3.5 MHz */350break;351case BANDWIDTH_8_MHZ:352default:353if_sample_freq = 4000000; /* 4 MHz */354break;355}356}357358while (if_sample_freq > (adc_freq / 2))359if_sample_freq = if_sample_freq - adc_freq;360361if (if_sample_freq >= 0)362bfs_spec_inv = bfs_spec_inv * (-1);363else364if_sample_freq = if_sample_freq * (-1);365366freq_cw = af913_div(if_sample_freq, adc_freq, 23ul);367368if (bfs_spec_inv == -1)369freq_cw = 0x00800000 - freq_cw;370371buf[0] = (u8) ((freq_cw & 0x000000ff));372buf[1] = (u8) ((freq_cw & 0x0000ff00) >> 8);373buf[2] = (u8) ((freq_cw & 0x007f0000) >> 16);374375376deb_info("%s: freq_cw:", __func__);377debug_dump(buf, sizeof(buf), deb_info);378379/* program */380for (i = 0; i < sizeof(buf); i++) {381ret = af9013_write_reg(state, addr++, buf[i]);382if (ret)383goto error;384}385}386error:387return ret;388}389390static int af9013_set_ofdm_params(struct af9013_state *state,391struct dvb_ofdm_parameters *params, u8 *auto_mode)392{393int ret;394u8 i, buf[3] = {0, 0, 0};395*auto_mode = 0; /* set if parameters are requested to auto set */396397/* Try auto-detect transmission parameters in case of AUTO requested or398garbage parameters given by application for compatibility.399MPlayer seems to provide garbage parameters currently. */400401switch (params->transmission_mode) {402case TRANSMISSION_MODE_AUTO:403*auto_mode = 1;404case TRANSMISSION_MODE_2K:405break;406case TRANSMISSION_MODE_8K:407buf[0] |= (1 << 0);408break;409default:410deb_info("%s: invalid transmission_mode\n", __func__);411*auto_mode = 1;412}413414switch (params->guard_interval) {415case GUARD_INTERVAL_AUTO:416*auto_mode = 1;417case GUARD_INTERVAL_1_32:418break;419case GUARD_INTERVAL_1_16:420buf[0] |= (1 << 2);421break;422case GUARD_INTERVAL_1_8:423buf[0] |= (2 << 2);424break;425case GUARD_INTERVAL_1_4:426buf[0] |= (3 << 2);427break;428default:429deb_info("%s: invalid guard_interval\n", __func__);430*auto_mode = 1;431}432433switch (params->hierarchy_information) {434case HIERARCHY_AUTO:435*auto_mode = 1;436case HIERARCHY_NONE:437break;438case HIERARCHY_1:439buf[0] |= (1 << 4);440break;441case HIERARCHY_2:442buf[0] |= (2 << 4);443break;444case HIERARCHY_4:445buf[0] |= (3 << 4);446break;447default:448deb_info("%s: invalid hierarchy_information\n", __func__);449*auto_mode = 1;450};451452switch (params->constellation) {453case QAM_AUTO:454*auto_mode = 1;455case QPSK:456break;457case QAM_16:458buf[1] |= (1 << 6);459break;460case QAM_64:461buf[1] |= (2 << 6);462break;463default:464deb_info("%s: invalid constellation\n", __func__);465*auto_mode = 1;466}467468/* Use HP. How and which case we can switch to LP? */469buf[1] |= (1 << 4);470471switch (params->code_rate_HP) {472case FEC_AUTO:473*auto_mode = 1;474case FEC_1_2:475break;476case FEC_2_3:477buf[2] |= (1 << 0);478break;479case FEC_3_4:480buf[2] |= (2 << 0);481break;482case FEC_5_6:483buf[2] |= (3 << 0);484break;485case FEC_7_8:486buf[2] |= (4 << 0);487break;488default:489deb_info("%s: invalid code_rate_HP\n", __func__);490*auto_mode = 1;491}492493switch (params->code_rate_LP) {494case FEC_AUTO:495/* if HIERARCHY_NONE and FEC_NONE then LP FEC is set to FEC_AUTO496by dvb_frontend.c for compatibility */497if (params->hierarchy_information != HIERARCHY_NONE)498*auto_mode = 1;499case FEC_1_2:500break;501case FEC_2_3:502buf[2] |= (1 << 3);503break;504case FEC_3_4:505buf[2] |= (2 << 3);506break;507case FEC_5_6:508buf[2] |= (3 << 3);509break;510case FEC_7_8:511buf[2] |= (4 << 3);512break;513case FEC_NONE:514if (params->hierarchy_information == HIERARCHY_AUTO)515break;516default:517deb_info("%s: invalid code_rate_LP\n", __func__);518*auto_mode = 1;519}520521switch (params->bandwidth) {522case BANDWIDTH_6_MHZ:523break;524case BANDWIDTH_7_MHZ:525buf[1] |= (1 << 2);526break;527case BANDWIDTH_8_MHZ:528buf[1] |= (2 << 2);529break;530default:531deb_info("%s: invalid bandwidth\n", __func__);532buf[1] |= (2 << 2); /* cannot auto-detect BW, try 8 MHz */533}534535/* program */536for (i = 0; i < sizeof(buf); i++) {537ret = af9013_write_reg(state, 0xd3c0 + i, buf[i]);538if (ret)539break;540}541542return ret;543}544545static int af9013_reset(struct af9013_state *state, u8 sleep)546{547int ret;548u8 tmp, i;549deb_info("%s\n", __func__);550551/* enable OFDM reset */552ret = af9013_write_reg_bits(state, 0xd417, 4, 1, 1);553if (ret)554goto error;555556/* start reset mechanism */557ret = af9013_write_reg(state, 0xaeff, 1);558if (ret)559goto error;560561/* reset is done when bit 1 is set */562for (i = 0; i < 150; i++) {563ret = af9013_read_reg_bits(state, 0xd417, 1, 1, &tmp);564if (ret)565goto error;566if (tmp)567break; /* reset done */568msleep(10);569}570if (!tmp)571return -ETIMEDOUT;572573/* don't clear reset when going to sleep */574if (!sleep) {575/* clear OFDM reset */576ret = af9013_write_reg_bits(state, 0xd417, 1, 1, 0);577if (ret)578goto error;579580/* disable OFDM reset */581ret = af9013_write_reg_bits(state, 0xd417, 4, 1, 0);582}583error:584return ret;585}586587static int af9013_power_ctrl(struct af9013_state *state, u8 onoff)588{589int ret;590deb_info("%s: onoff:%d\n", __func__, onoff);591592if (onoff) {593/* power on */594ret = af9013_write_reg_bits(state, 0xd73a, 3, 1, 0);595if (ret)596goto error;597ret = af9013_write_reg_bits(state, 0xd417, 1, 1, 0);598if (ret)599goto error;600ret = af9013_write_reg_bits(state, 0xd417, 4, 1, 0);601} else {602/* power off */603ret = af9013_reset(state, 1);604if (ret)605goto error;606ret = af9013_write_reg_bits(state, 0xd73a, 3, 1, 1);607}608error:609return ret;610}611612static int af9013_lock_led(struct af9013_state *state, u8 onoff)613{614deb_info("%s: onoff:%d\n", __func__, onoff);615616return af9013_write_reg_bits(state, 0xd730, 0, 1, onoff);617}618619static int af9013_set_frontend(struct dvb_frontend *fe,620struct dvb_frontend_parameters *params)621{622struct af9013_state *state = fe->demodulator_priv;623int ret;624u8 auto_mode; /* auto set TPS */625626deb_info("%s: freq:%d bw:%d\n", __func__, params->frequency,627params->u.ofdm.bandwidth);628629state->frequency = params->frequency;630631/* program tuner */632if (fe->ops.tuner_ops.set_params)633fe->ops.tuner_ops.set_params(fe, params);634635/* program CFOE coefficients */636ret = af9013_set_coeff(state, params->u.ofdm.bandwidth);637if (ret)638goto error;639640/* program frequency control */641ret = af9013_set_freq_ctrl(state, params->u.ofdm.bandwidth);642if (ret)643goto error;644645/* clear TPS lock flag (inverted flag) */646ret = af9013_write_reg_bits(state, 0xd330, 3, 1, 1);647if (ret)648goto error;649650/* clear MPEG2 lock flag */651ret = af9013_write_reg_bits(state, 0xd507, 6, 1, 0);652if (ret)653goto error;654655/* empty channel function */656ret = af9013_write_reg_bits(state, 0x9bfe, 0, 1, 0);657if (ret)658goto error;659660/* empty DVB-T channel function */661ret = af9013_write_reg_bits(state, 0x9bc2, 0, 1, 0);662if (ret)663goto error;664665/* program TPS and bandwidth, check if auto mode needed */666ret = af9013_set_ofdm_params(state, ¶ms->u.ofdm, &auto_mode);667if (ret)668goto error;669670if (auto_mode) {671/* clear easy mode flag */672ret = af9013_write_reg(state, 0xaefd, 0);673deb_info("%s: auto TPS\n", __func__);674} else {675/* set easy mode flag */676ret = af9013_write_reg(state, 0xaefd, 1);677if (ret)678goto error;679ret = af9013_write_reg(state, 0xaefe, 0);680deb_info("%s: manual TPS\n", __func__);681}682if (ret)683goto error;684685/* everything is set, lets try to receive channel - OFSM GO! */686ret = af9013_write_reg(state, 0xffff, 0);687if (ret)688goto error;689690error:691return ret;692}693694static int af9013_get_frontend(struct dvb_frontend *fe,695struct dvb_frontend_parameters *p)696{697struct af9013_state *state = fe->demodulator_priv;698int ret;699u8 i, buf[3];700deb_info("%s\n", __func__);701702/* read TPS registers */703for (i = 0; i < 3; i++) {704ret = af9013_read_reg(state, 0xd3c0 + i, &buf[i]);705if (ret)706goto error;707}708709switch ((buf[1] >> 6) & 3) {710case 0:711p->u.ofdm.constellation = QPSK;712break;713case 1:714p->u.ofdm.constellation = QAM_16;715break;716case 2:717p->u.ofdm.constellation = QAM_64;718break;719}720721switch ((buf[0] >> 0) & 3) {722case 0:723p->u.ofdm.transmission_mode = TRANSMISSION_MODE_2K;724break;725case 1:726p->u.ofdm.transmission_mode = TRANSMISSION_MODE_8K;727}728729switch ((buf[0] >> 2) & 3) {730case 0:731p->u.ofdm.guard_interval = GUARD_INTERVAL_1_32;732break;733case 1:734p->u.ofdm.guard_interval = GUARD_INTERVAL_1_16;735break;736case 2:737p->u.ofdm.guard_interval = GUARD_INTERVAL_1_8;738break;739case 3:740p->u.ofdm.guard_interval = GUARD_INTERVAL_1_4;741break;742}743744switch ((buf[0] >> 4) & 7) {745case 0:746p->u.ofdm.hierarchy_information = HIERARCHY_NONE;747break;748case 1:749p->u.ofdm.hierarchy_information = HIERARCHY_1;750break;751case 2:752p->u.ofdm.hierarchy_information = HIERARCHY_2;753break;754case 3:755p->u.ofdm.hierarchy_information = HIERARCHY_4;756break;757}758759switch ((buf[2] >> 0) & 7) {760case 0:761p->u.ofdm.code_rate_HP = FEC_1_2;762break;763case 1:764p->u.ofdm.code_rate_HP = FEC_2_3;765break;766case 2:767p->u.ofdm.code_rate_HP = FEC_3_4;768break;769case 3:770p->u.ofdm.code_rate_HP = FEC_5_6;771break;772case 4:773p->u.ofdm.code_rate_HP = FEC_7_8;774break;775}776777switch ((buf[2] >> 3) & 7) {778case 0:779p->u.ofdm.code_rate_LP = FEC_1_2;780break;781case 1:782p->u.ofdm.code_rate_LP = FEC_2_3;783break;784case 2:785p->u.ofdm.code_rate_LP = FEC_3_4;786break;787case 3:788p->u.ofdm.code_rate_LP = FEC_5_6;789break;790case 4:791p->u.ofdm.code_rate_LP = FEC_7_8;792break;793}794795switch ((buf[1] >> 2) & 3) {796case 0:797p->u.ofdm.bandwidth = BANDWIDTH_6_MHZ;798break;799case 1:800p->u.ofdm.bandwidth = BANDWIDTH_7_MHZ;801break;802case 2:803p->u.ofdm.bandwidth = BANDWIDTH_8_MHZ;804break;805}806807p->inversion = INVERSION_AUTO;808p->frequency = state->frequency;809810error:811return ret;812}813814static int af9013_update_ber_unc(struct dvb_frontend *fe)815{816struct af9013_state *state = fe->demodulator_priv;817int ret;818u8 buf[3], i;819u32 error_bit_count = 0;820u32 total_bit_count = 0;821u32 abort_packet_count = 0;822823state->ber = 0;824825/* check if error bit count is ready */826ret = af9013_read_reg_bits(state, 0xd391, 4, 1, &buf[0]);827if (ret)828goto error;829if (!buf[0])830goto exit;831832/* get RSD packet abort count */833for (i = 0; i < 2; i++) {834ret = af9013_read_reg(state, 0xd38a + i, &buf[i]);835if (ret)836goto error;837}838abort_packet_count = (buf[1] << 8) + buf[0];839840/* get error bit count */841for (i = 0; i < 3; i++) {842ret = af9013_read_reg(state, 0xd387 + i, &buf[i]);843if (ret)844goto error;845}846error_bit_count = (buf[2] << 16) + (buf[1] << 8) + buf[0];847error_bit_count = error_bit_count - abort_packet_count * 8 * 8;848849/* get used RSD counting period (10000 RSD packets used) */850for (i = 0; i < 2; i++) {851ret = af9013_read_reg(state, 0xd385 + i, &buf[i]);852if (ret)853goto error;854}855total_bit_count = (buf[1] << 8) + buf[0];856total_bit_count = total_bit_count - abort_packet_count;857total_bit_count = total_bit_count * 204 * 8;858859if (total_bit_count)860state->ber = error_bit_count * 1000000000 / total_bit_count;861862state->ucblocks += abort_packet_count;863864deb_info("%s: err bits:%d total bits:%d abort count:%d\n", __func__,865error_bit_count, total_bit_count, abort_packet_count);866867/* set BER counting range */868ret = af9013_write_reg(state, 0xd385, 10000 & 0xff);869if (ret)870goto error;871ret = af9013_write_reg(state, 0xd386, 10000 >> 8);872if (ret)873goto error;874/* reset and start BER counter */875ret = af9013_write_reg_bits(state, 0xd391, 4, 1, 1);876if (ret)877goto error;878879exit:880error:881return ret;882}883884static int af9013_update_snr(struct dvb_frontend *fe)885{886struct af9013_state *state = fe->demodulator_priv;887int ret;888u8 buf[3], i, len;889u32 quant = 0;890struct snr_table *uninitialized_var(snr_table);891892/* check if quantizer ready (for snr) */893ret = af9013_read_reg_bits(state, 0xd2e1, 3, 1, &buf[0]);894if (ret)895goto error;896if (buf[0]) {897/* quantizer ready - read it */898for (i = 0; i < 3; i++) {899ret = af9013_read_reg(state, 0xd2e3 + i, &buf[i]);900if (ret)901goto error;902}903quant = (buf[2] << 16) + (buf[1] << 8) + buf[0];904905/* read current constellation */906ret = af9013_read_reg(state, 0xd3c1, &buf[0]);907if (ret)908goto error;909910switch ((buf[0] >> 6) & 3) {911case 0:912len = ARRAY_SIZE(qpsk_snr_table);913snr_table = qpsk_snr_table;914break;915case 1:916len = ARRAY_SIZE(qam16_snr_table);917snr_table = qam16_snr_table;918break;919case 2:920len = ARRAY_SIZE(qam64_snr_table);921snr_table = qam64_snr_table;922break;923default:924len = 0;925break;926}927928if (len) {929for (i = 0; i < len; i++) {930if (quant < snr_table[i].val) {931state->snr = snr_table[i].snr * 10;932break;933}934}935}936937/* set quantizer super frame count */938ret = af9013_write_reg(state, 0xd2e2, 1);939if (ret)940goto error;941942/* check quantizer availability */943for (i = 0; i < 10; i++) {944msleep(10);945ret = af9013_read_reg_bits(state, 0xd2e6, 0, 1,946&buf[0]);947if (ret)948goto error;949if (!buf[0])950break;951}952953/* reset quantizer */954ret = af9013_write_reg_bits(state, 0xd2e1, 3, 1, 1);955if (ret)956goto error;957}958959error:960return ret;961}962963static int af9013_update_signal_strength(struct dvb_frontend *fe)964{965struct af9013_state *state = fe->demodulator_priv;966int ret = 0;967u8 rf_gain, if_gain;968int signal_strength;969970deb_info("%s\n", __func__);971972if (state->signal_strength_en) {973ret = af9013_read_reg(state, 0xd07c, &rf_gain);974if (ret)975goto error;976ret = af9013_read_reg(state, 0xd07d, &if_gain);977if (ret)978goto error;979signal_strength = (0xffff / \980(9 * (state->rf_50 + state->if_50) - \98111 * (state->rf_80 + state->if_80))) * \982(10 * (rf_gain + if_gain) - \98311 * (state->rf_80 + state->if_80));984if (signal_strength < 0)985signal_strength = 0;986else if (signal_strength > 0xffff)987signal_strength = 0xffff;988989state->signal_strength = signal_strength;990} else {991state->signal_strength = 0;992}993994error:995return ret;996}997998static int af9013_update_statistics(struct dvb_frontend *fe)999{1000struct af9013_state *state = fe->demodulator_priv;1001int ret;10021003if (time_before(jiffies, state->next_statistics_check))1004return 0;10051006/* set minimum statistic update interval */1007state->next_statistics_check = jiffies + msecs_to_jiffies(1200);10081009ret = af9013_update_signal_strength(fe);1010if (ret)1011goto error;1012ret = af9013_update_snr(fe);1013if (ret)1014goto error;1015ret = af9013_update_ber_unc(fe);1016if (ret)1017goto error;10181019error:1020return ret;1021}10221023static int af9013_get_tune_settings(struct dvb_frontend *fe,1024struct dvb_frontend_tune_settings *fesettings)1025{1026fesettings->min_delay_ms = 800;1027fesettings->step_size = 0;1028fesettings->max_drift = 0;10291030return 0;1031}10321033static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status)1034{1035struct af9013_state *state = fe->demodulator_priv;1036int ret = 0;1037u8 tmp;1038*status = 0;10391040/* MPEG2 lock */1041ret = af9013_read_reg_bits(state, 0xd507, 6, 1, &tmp);1042if (ret)1043goto error;1044if (tmp)1045*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI |1046FE_HAS_SYNC | FE_HAS_LOCK;10471048if (!*status) {1049/* TPS lock */1050ret = af9013_read_reg_bits(state, 0xd330, 3, 1, &tmp);1051if (ret)1052goto error;1053if (tmp)1054*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER |1055FE_HAS_VITERBI;1056}10571058if (!*status) {1059/* CFO lock */1060ret = af9013_read_reg_bits(state, 0xd333, 7, 1, &tmp);1061if (ret)1062goto error;1063if (tmp)1064*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;1065}10661067if (!*status) {1068/* SFOE lock */1069ret = af9013_read_reg_bits(state, 0xd334, 6, 1, &tmp);1070if (ret)1071goto error;1072if (tmp)1073*status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;1074}10751076if (!*status) {1077/* AGC lock */1078ret = af9013_read_reg_bits(state, 0xd1a0, 6, 1, &tmp);1079if (ret)1080goto error;1081if (tmp)1082*status |= FE_HAS_SIGNAL;1083}10841085ret = af9013_update_statistics(fe);10861087error:1088return ret;1089}109010911092static int af9013_read_ber(struct dvb_frontend *fe, u32 *ber)1093{1094struct af9013_state *state = fe->demodulator_priv;1095int ret;1096ret = af9013_update_statistics(fe);1097*ber = state->ber;1098return ret;1099}11001101static int af9013_read_signal_strength(struct dvb_frontend *fe, u16 *strength)1102{1103struct af9013_state *state = fe->demodulator_priv;1104int ret;1105ret = af9013_update_statistics(fe);1106*strength = state->signal_strength;1107return ret;1108}11091110static int af9013_read_snr(struct dvb_frontend *fe, u16 *snr)1111{1112struct af9013_state *state = fe->demodulator_priv;1113int ret;1114ret = af9013_update_statistics(fe);1115*snr = state->snr;1116return ret;1117}11181119static int af9013_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)1120{1121struct af9013_state *state = fe->demodulator_priv;1122int ret;1123ret = af9013_update_statistics(fe);1124*ucblocks = state->ucblocks;1125return ret;1126}11271128static int af9013_sleep(struct dvb_frontend *fe)1129{1130struct af9013_state *state = fe->demodulator_priv;1131int ret;1132deb_info("%s\n", __func__);11331134ret = af9013_lock_led(state, 0);1135if (ret)1136goto error;11371138ret = af9013_power_ctrl(state, 0);1139error:1140return ret;1141}11421143static int af9013_init(struct dvb_frontend *fe)1144{1145struct af9013_state *state = fe->demodulator_priv;1146int ret, i, len;1147u8 tmp0, tmp1;1148struct regdesc *init;1149deb_info("%s\n", __func__);11501151/* reset OFDM */1152ret = af9013_reset(state, 0);1153if (ret)1154goto error;11551156/* power on */1157ret = af9013_power_ctrl(state, 1);1158if (ret)1159goto error;11601161/* enable ADC */1162ret = af9013_write_reg(state, 0xd73a, 0xa4);1163if (ret)1164goto error;11651166/* write API version to firmware */1167for (i = 0; i < sizeof(state->config.api_version); i++) {1168ret = af9013_write_reg(state, 0x9bf2 + i,1169state->config.api_version[i]);1170if (ret)1171goto error;1172}11731174/* program ADC control */1175ret = af9013_set_adc_ctrl(state);1176if (ret)1177goto error;11781179/* set I2C master clock */1180ret = af9013_write_reg(state, 0xd416, 0x14);1181if (ret)1182goto error;11831184/* set 16 embx */1185ret = af9013_write_reg_bits(state, 0xd700, 1, 1, 1);1186if (ret)1187goto error;11881189/* set no trigger */1190ret = af9013_write_reg_bits(state, 0xd700, 2, 1, 0);1191if (ret)1192goto error;11931194/* set read-update bit for constellation */1195ret = af9013_write_reg_bits(state, 0xd371, 1, 1, 1);1196if (ret)1197goto error;11981199/* enable FEC monitor */1200ret = af9013_write_reg_bits(state, 0xd392, 1, 1, 1);1201if (ret)1202goto error;12031204/* load OFSM settings */1205deb_info("%s: load ofsm settings\n", __func__);1206len = ARRAY_SIZE(ofsm_init);1207init = ofsm_init;1208for (i = 0; i < len; i++) {1209ret = af9013_write_reg_bits(state, init[i].addr, init[i].pos,1210init[i].len, init[i].val);1211if (ret)1212goto error;1213}12141215/* load tuner specific settings */1216deb_info("%s: load tuner specific settings\n", __func__);1217switch (state->config.tuner) {1218case AF9013_TUNER_MXL5003D:1219len = ARRAY_SIZE(tuner_init_mxl5003d);1220init = tuner_init_mxl5003d;1221break;1222case AF9013_TUNER_MXL5005D:1223case AF9013_TUNER_MXL5005R:1224case AF9013_TUNER_MXL5007T:1225len = ARRAY_SIZE(tuner_init_mxl5005);1226init = tuner_init_mxl5005;1227break;1228case AF9013_TUNER_ENV77H11D5:1229len = ARRAY_SIZE(tuner_init_env77h11d5);1230init = tuner_init_env77h11d5;1231break;1232case AF9013_TUNER_MT2060:1233len = ARRAY_SIZE(tuner_init_mt2060);1234init = tuner_init_mt2060;1235break;1236case AF9013_TUNER_MC44S803:1237len = ARRAY_SIZE(tuner_init_mc44s803);1238init = tuner_init_mc44s803;1239break;1240case AF9013_TUNER_QT1010:1241case AF9013_TUNER_QT1010A:1242len = ARRAY_SIZE(tuner_init_qt1010);1243init = tuner_init_qt1010;1244break;1245case AF9013_TUNER_MT2060_2:1246len = ARRAY_SIZE(tuner_init_mt2060_2);1247init = tuner_init_mt2060_2;1248break;1249case AF9013_TUNER_TDA18271:1250case AF9013_TUNER_TDA18218:1251len = ARRAY_SIZE(tuner_init_tda18271);1252init = tuner_init_tda18271;1253break;1254case AF9013_TUNER_UNKNOWN:1255default:1256len = ARRAY_SIZE(tuner_init_unknown);1257init = tuner_init_unknown;1258break;1259}12601261for (i = 0; i < len; i++) {1262ret = af9013_write_reg_bits(state, init[i].addr, init[i].pos,1263init[i].len, init[i].val);1264if (ret)1265goto error;1266}12671268/* set TS mode */1269deb_info("%s: setting ts mode\n", __func__);1270tmp0 = 0; /* parallel mode */1271tmp1 = 0; /* serial mode */1272switch (state->config.output_mode) {1273case AF9013_OUTPUT_MODE_PARALLEL:1274tmp0 = 1;1275break;1276case AF9013_OUTPUT_MODE_SERIAL:1277tmp1 = 1;1278break;1279case AF9013_OUTPUT_MODE_USB:1280/* usb mode for AF9015 */1281default:1282break;1283}1284ret = af9013_write_reg_bits(state, 0xd500, 1, 1, tmp0); /* parallel */1285if (ret)1286goto error;1287ret = af9013_write_reg_bits(state, 0xd500, 2, 1, tmp1); /* serial */1288if (ret)1289goto error;12901291/* enable lock led */1292ret = af9013_lock_led(state, 1);1293if (ret)1294goto error;12951296/* read values needed for signal strength calculation */1297ret = af9013_read_reg_bits(state, 0x9bee, 0, 1,1298&state->signal_strength_en);1299if (ret)1300goto error;13011302if (state->signal_strength_en) {1303ret = af9013_read_reg(state, 0x9bbd, &state->rf_50);1304if (ret)1305goto error;1306ret = af9013_read_reg(state, 0x9bd0, &state->rf_80);1307if (ret)1308goto error;1309ret = af9013_read_reg(state, 0x9be2, &state->if_50);1310if (ret)1311goto error;1312ret = af9013_read_reg(state, 0x9be4, &state->if_80);1313if (ret)1314goto error;1315}13161317error:1318return ret;1319}13201321static struct dvb_frontend_ops af9013_ops;13221323static int af9013_download_firmware(struct af9013_state *state)1324{1325int i, len, remaining, ret;1326const struct firmware *fw;1327u16 checksum = 0;1328u8 val;1329u8 fw_params[4];1330u8 *fw_file = AF9013_DEFAULT_FIRMWARE;13311332msleep(100);1333/* check whether firmware is already running */1334ret = af9013_read_reg(state, 0x98be, &val);1335if (ret)1336goto error;1337else1338deb_info("%s: firmware status:%02x\n", __func__, val);13391340if (val == 0x0c) /* fw is running, no need for download */1341goto exit;13421343info("found a '%s' in cold state, will try to load a firmware",1344af9013_ops.info.name);13451346/* request the firmware, this will block and timeout */1347ret = request_firmware(&fw, fw_file, state->i2c->dev.parent);1348if (ret) {1349err("did not find the firmware file. (%s) "1350"Please see linux/Documentation/dvb/ for more details" \1351" on firmware-problems. (%d)",1352fw_file, ret);1353goto error;1354}13551356info("downloading firmware from file '%s'", fw_file);13571358/* calc checksum */1359for (i = 0; i < fw->size; i++)1360checksum += fw->data[i];13611362fw_params[0] = checksum >> 8;1363fw_params[1] = checksum & 0xff;1364fw_params[2] = fw->size >> 8;1365fw_params[3] = fw->size & 0xff;13661367/* write fw checksum & size */1368ret = af9013_write_ofsm_regs(state, 0x50fc,1369fw_params, sizeof(fw_params));1370if (ret)1371goto error_release;13721373#define FW_ADDR 0x5100 /* firmware start address */1374#define LEN_MAX 16 /* max packet size */1375for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) {1376len = remaining;1377if (len > LEN_MAX)1378len = LEN_MAX;13791380ret = af9013_write_ofsm_regs(state,1381FW_ADDR + fw->size - remaining,1382(u8 *) &fw->data[fw->size - remaining], len);1383if (ret) {1384err("firmware download failed:%d", ret);1385goto error_release;1386}1387}13881389/* request boot firmware */1390ret = af9013_write_reg(state, 0xe205, 1);1391if (ret)1392goto error_release;13931394for (i = 0; i < 15; i++) {1395msleep(100);13961397/* check firmware status */1398ret = af9013_read_reg(state, 0x98be, &val);1399if (ret)1400goto error_release;14011402deb_info("%s: firmware status:%02x\n", __func__, val);14031404if (val == 0x0c || val == 0x04) /* success or fail */1405break;1406}14071408if (val == 0x04) {1409err("firmware did not run");1410ret = -1;1411} else if (val != 0x0c) {1412err("firmware boot timeout");1413ret = -1;1414}14151416error_release:1417release_firmware(fw);1418error:1419exit:1420if (!ret)1421info("found a '%s' in warm state.", af9013_ops.info.name);1422return ret;1423}14241425static int af9013_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)1426{1427int ret;1428struct af9013_state *state = fe->demodulator_priv;1429deb_info("%s: enable:%d\n", __func__, enable);14301431if (state->config.output_mode == AF9013_OUTPUT_MODE_USB)1432ret = af9013_write_reg_bits(state, 0xd417, 3, 1, enable);1433else1434ret = af9013_write_reg_bits(state, 0xd607, 2, 1, enable);14351436return ret;1437}14381439static void af9013_release(struct dvb_frontend *fe)1440{1441struct af9013_state *state = fe->demodulator_priv;1442kfree(state);1443}14441445static struct dvb_frontend_ops af9013_ops;14461447struct dvb_frontend *af9013_attach(const struct af9013_config *config,1448struct i2c_adapter *i2c)1449{1450int ret;1451struct af9013_state *state = NULL;1452u8 buf[4], i;14531454/* allocate memory for the internal state */1455state = kzalloc(sizeof(struct af9013_state), GFP_KERNEL);1456if (state == NULL)1457goto error;14581459/* setup the state */1460state->i2c = i2c;1461memcpy(&state->config, config, sizeof(struct af9013_config));14621463/* download firmware */1464if (state->config.output_mode != AF9013_OUTPUT_MODE_USB) {1465ret = af9013_download_firmware(state);1466if (ret)1467goto error;1468}14691470/* firmware version */1471for (i = 0; i < 4; i++) {1472ret = af9013_read_reg(state, 0x5103 + i, &buf[i]);1473if (ret)1474goto error;1475}1476info("firmware version:%d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3]);14771478/* chip version */1479ret = af9013_read_reg_bits(state, 0xd733, 4, 4, &buf[2]);1480if (ret)1481goto error;14821483/* ROM version */1484for (i = 0; i < 2; i++) {1485ret = af9013_read_reg(state, 0x116b + i, &buf[i]);1486if (ret)1487goto error;1488}1489deb_info("%s: chip version:%d ROM version:%d.%d\n", __func__,1490buf[2], buf[0], buf[1]);14911492/* settings for mp2if */1493if (state->config.output_mode == AF9013_OUTPUT_MODE_USB) {1494/* AF9015 split PSB to 1.5k + 0.5k */1495ret = af9013_write_reg_bits(state, 0xd50b, 2, 1, 1);1496} else {1497/* AF9013 change the output bit to data7 */1498ret = af9013_write_reg_bits(state, 0xd500, 3, 1, 1);1499if (ret)1500goto error;1501/* AF9013 set mpeg to full speed */1502ret = af9013_write_reg_bits(state, 0xd502, 4, 1, 1);1503}1504if (ret)1505goto error;1506ret = af9013_write_reg_bits(state, 0xd520, 4, 1, 1);1507if (ret)1508goto error;15091510/* set GPIOs */1511for (i = 0; i < sizeof(state->config.gpio); i++) {1512ret = af9013_set_gpio(state, i, state->config.gpio[i]);1513if (ret)1514goto error;1515}15161517/* create dvb_frontend */1518memcpy(&state->frontend.ops, &af9013_ops,1519sizeof(struct dvb_frontend_ops));1520state->frontend.demodulator_priv = state;15211522return &state->frontend;1523error:1524kfree(state);1525return NULL;1526}1527EXPORT_SYMBOL(af9013_attach);15281529static struct dvb_frontend_ops af9013_ops = {1530.info = {1531.name = "Afatech AF9013 DVB-T",1532.type = FE_OFDM,1533.frequency_min = 174000000,1534.frequency_max = 862000000,1535.frequency_stepsize = 250000,1536.frequency_tolerance = 0,1537.caps =1538FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |1539FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |1540FE_CAN_QPSK | FE_CAN_QAM_16 |1541FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |1542FE_CAN_TRANSMISSION_MODE_AUTO |1543FE_CAN_GUARD_INTERVAL_AUTO |1544FE_CAN_HIERARCHY_AUTO |1545FE_CAN_RECOVER |1546FE_CAN_MUTE_TS1547},15481549.release = af9013_release,1550.init = af9013_init,1551.sleep = af9013_sleep,1552.i2c_gate_ctrl = af9013_i2c_gate_ctrl,15531554.set_frontend = af9013_set_frontend,1555.get_frontend = af9013_get_frontend,15561557.get_tune_settings = af9013_get_tune_settings,15581559.read_status = af9013_read_status,1560.read_ber = af9013_read_ber,1561.read_signal_strength = af9013_read_signal_strength,1562.read_snr = af9013_read_snr,1563.read_ucblocks = af9013_read_ucblocks,1564};15651566module_param_named(debug, af9013_debug, int, 0644);1567MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");15681569MODULE_AUTHOR("Antti Palosaari <[email protected]>");1570MODULE_DESCRIPTION("Afatech AF9013 DVB-T demodulator driver");1571MODULE_LICENSE("GPL");157215731574