brintos

brintos / linux-shallow public Read only

0
0
Text · 27.2 KiB · e23794b Raw
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, &regmap_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