Lines Matching +full:period +full:- +full:scale
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Driver for Silicon Labs Si2161 DVB-T and Si2165 DVB-C/-T Demodulator
5 * Copyright (C) 2013-2017 Matthias Schwarzott <zzam@gentoo.org>
8 * https://www.silabs.com/Support%20Documents/TechnicalDocs/Si2165-short.pdf
27 * Hauppauge WinTV-HVR-930C-HD B130 / PCTV QuatroStick 521e 1113xx
30 * Hauppauge WinTV-HVR-930C-HD B131 / PCTV QuatroStick 522e 1114xx
64 dev_dbg(&state->client->dev, "i2c write: reg: 0x%04x, data: %*ph\n", in si2165_write()
67 ret = regmap_bulk_write(state->regmap, reg, src, count); in si2165_write()
70 dev_err(&state->client->dev, "%s: ret == %d\n", __func__, ret); in si2165_write()
78 int ret = regmap_bulk_read(state->regmap, reg, val, count); in si2165_read()
81 dev_err(&state->client->dev, "%s: error (addr %02x reg %04x error (ret == %i)\n", in si2165_read()
82 __func__, state->config.i2c_addr, reg, ret); in si2165_read()
86 dev_dbg(&state->client->dev, "i2c read: reg: 0x%04x, data: %*ph\n", in si2165_read()
96 int ret = regmap_read(state->regmap, reg, &val_tmp); in si2165_readreg8()
98 dev_dbg(&state->client->dev, "reg read: R(0x%04x)=0x%02x\n", reg, *val); in si2165_readreg8()
109 dev_dbg(&state->client->dev, "reg read: R(0x%04x)=0x%04x\n", reg, *val); in si2165_readreg16()
120 dev_dbg(&state->client->dev, "reg read: R(0x%04x)=0x%06x\n", reg, *val); in si2165_readreg24()
126 return regmap_write(state->regmap, reg, val); in si2165_writereg8()
197 s->min_delay_ms = 1000; in si2165_get_tune_settings()
203 u32 ref_freq_hz = state->config.ref_freq_hz; in si2165_init_pll()
242 state->fvco_hz = ref_freq_hz / divr in si2165_init_pll()
244 state->adc_clk = state->fvco_hz / (divm * 4u); in si2165_init_pll()
245 state->sys_clk = state->fvco_hz / (divl * 2u); in si2165_init_pll()
257 state->sys_clk = state->fvco_hz / (divl * 2u); in si2165_adjust_pll_divl()
264 return state->adc_clk; in si2165_get_fe_clk()
281 dev_err(&state->client->dev, "init_done was not set\n"); in si2165_wait_init_done()
282 return -EINVAL; in si2165_wait_init_done()
296 return -EINVAL; in si2165_upload_firmware_block()
298 return -EINVAL; in si2165_upload_firmware_block()
300 dev_dbg(&state->client->dev, in si2165_upload_firmware_block()
304 dev_dbg(&state->client->dev, in si2165_upload_firmware_block()
310 dev_warn(&state->client->dev, in si2165_upload_firmware_block()
313 return -EINVAL; in si2165_upload_firmware_block()
317 dev_warn(&state->client->dev, in si2165_upload_firmware_block()
320 return -EINVAL; in si2165_upload_firmware_block()
323 buf_ctrl[0] = wordcount - 1; in si2165_upload_firmware_block()
339 wordcount--; in si2165_upload_firmware_block()
345 dev_dbg(&state->client->dev, in si2165_upload_firmware_block()
352 dev_dbg(&state->client->dev, in si2165_upload_firmware_block()
377 switch (state->chip_revcode) { in si2165_upload_firmware()
382 dev_info(&state->client->dev, "no firmware file for revision=%d\n", in si2165_upload_firmware()
383 state->chip_revcode); in si2165_upload_firmware()
388 ret = request_firmware(&fw, fw_file, &state->client->dev); in si2165_upload_firmware()
390 dev_warn(&state->client->dev, "firmware file '%s' not found\n", in si2165_upload_firmware()
395 data = fw->data; in si2165_upload_firmware()
396 len = fw->size; in si2165_upload_firmware()
398 dev_info(&state->client->dev, "downloading firmware from file '%s' size=%d\n", in si2165_upload_firmware()
402 dev_warn(&state->client->dev, "firmware size is not multiple of 4\n"); in si2165_upload_firmware()
403 ret = -EINVAL; in si2165_upload_firmware()
409 dev_warn(&state->client->dev, "firmware header is missing\n"); in si2165_upload_firmware()
410 ret = -EINVAL; in si2165_upload_firmware()
415 dev_warn(&state->client->dev, "firmware file version is wrong\n"); in si2165_upload_firmware()
416 ret = -EINVAL; in si2165_upload_firmware()
452 …dev_info(&state->client->dev, "%s: extracted patch_version=0x%02x, block_count=0x%02x, crc_expecte… in si2165_upload_firmware()
471 dev_err(&state->client->dev, in si2165_upload_firmware()
482 dev_err(&state->client->dev, in si2165_upload_firmware()
485 ret = -EINVAL; in si2165_upload_firmware()
494 dev_err(&state->client->dev, in si2165_upload_firmware()
497 ret = -EINVAL; in si2165_upload_firmware()
511 dev_info(&state->client->dev, "fw load finished\n"); in si2165_upload_firmware()
514 state->firmware_loaded = true; in si2165_upload_firmware()
525 struct si2165_state *state = fe->demodulator_priv; in si2165_init()
526 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in si2165_init()
530 dev_dbg(&state->client->dev, "%s: called\n", __func__); in si2165_init()
533 ret = si2165_writereg8(state, REG_CHIP_MODE, state->config.chip_mode); in si2165_init()
544 if (val != state->config.chip_mode) { in si2165_init()
545 dev_err(&state->client->dev, "could not set chip_mode\n"); in si2165_init()
546 return -EINVAL; in si2165_init()
591 /* ber_pkt - default 65535 */ in si2165_init()
637 c = &state->fe.dtv_property_cache; in si2165_init()
638 c->cnr.len = 1; in si2165_init()
639 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; in si2165_init()
640 c->post_bit_error.len = 1; in si2165_init()
641 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; in si2165_init()
642 c->post_bit_count.len = 1; in si2165_init()
643 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; in si2165_init()
653 struct si2165_state *state = fe->demodulator_priv; in si2165_sleep()
671 struct si2165_state *state = fe->demodulator_priv; in si2165_read_status()
672 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in si2165_read_status()
673 u32 delsys = c->delivery_system; in si2165_read_status()
727 * 1000 * 10 * (log10(2^24) - log10(regval)) = in si2165_read_status()
728 * 1000 * 10 * (intlog10(2^24) - intlog10(regval)) / 2^24 in si2165_read_status()
733 u32tmp = (1000 * 10 * (121210686 - (u64)intlog10(u32tmp))) in si2165_read_status()
735 c->cnr.stat[0].scale = FE_SCALE_DECIBEL; in si2165_read_status()
736 c->cnr.stat[0].svalue = u32tmp; in si2165_read_status()
738 c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; in si2165_read_status()
742 if (c->post_bit_error.stat[0].scale == FE_SCALE_NOT_AVAILABLE) { in si2165_read_status()
743 /* start new sampling period to get rid of old data*/ in si2165_read_status()
748 /* set scale to enter read code on next call */ in si2165_read_status()
749 c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; in si2165_read_status()
750 c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; in si2165_read_status()
751 c->post_bit_error.stat[0].uvalue = 0; in si2165_read_status()
752 c->post_bit_count.stat[0].uvalue = 0; in si2165_read_status()
758 state->ber_prev = 0; in si2165_read_status()
773 c->post_bit_error.stat[0].uvalue += in si2165_read_status()
775 c->post_bit_count.stat[0].uvalue += in si2165_read_status()
778 /* start new sampling period */ in si2165_read_status()
784 dev_dbg(&state->client->dev, in si2165_read_status()
790 c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; in si2165_read_status()
791 c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; in si2165_read_status()
799 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in si2165_read_snr()
801 if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL) in si2165_read_snr()
802 *snr = div_s64(c->cnr.stat[0].svalue, 100); in si2165_read_snr()
810 struct si2165_state *state = fe->demodulator_priv; in si2165_read_ber()
811 struct dtv_frontend_properties *c = &fe->dtv_property_cache; in si2165_read_ber()
813 if (c->post_bit_error.stat[0].scale != FE_SCALE_COUNTER) { in si2165_read_ber()
818 *ber = c->post_bit_error.stat[0].uvalue - state->ber_prev; in si2165_read_ber()
819 state->ber_prev = c->post_bit_error.stat[0].uvalue; in si2165_read_ber()
830 return -EINVAL; in si2165_set_oversamp()
837 dev_dbg(&state->client->dev, "Write oversamp=%#x\n", reg_value); in si2165_set_oversamp()
843 struct dvb_frontend *fe = &state->fe; in si2165_set_if_freq_shift()
849 if (!fe->ops.tuner_ops.get_if_frequency) { in si2165_set_if_freq_shift()
850 dev_err(&state->client->dev, in si2165_set_if_freq_shift()
852 return -EINVAL; in si2165_set_if_freq_shift()
856 return -EINVAL; in si2165_set_if_freq_shift()
858 fe->ops.tuner_ops.get_if_frequency(fe, &IF); in si2165_set_if_freq_shift()
865 if (state->config.inversion) in si2165_set_if_freq_shift()
866 reg_value = -reg_value; in si2165_set_if_freq_shift()
875 /* standard = DVB-T */
899 struct dtv_frontend_properties *p = &fe->dtv_property_cache; in si2165_set_frontend_dvbt()
900 struct si2165_state *state = fe->demodulator_priv; in si2165_set_frontend_dvbt()
903 u32 bw_hz = p->bandwidth_hz; in si2165_set_frontend_dvbt()
905 dev_dbg(&state->client->dev, "%s: called\n", __func__); in si2165_set_frontend_dvbt()
907 if (!state->has_dvbt) in si2165_set_frontend_dvbt()
908 return -EINVAL; in si2165_set_frontend_dvbt()
910 /* no bandwidth auto-detection */ in si2165_set_frontend_dvbt()
912 return -EINVAL; in si2165_set_frontend_dvbt()
937 /* standard = DVB-C */
966 struct si2165_state *state = fe->demodulator_priv; in si2165_set_frontend_dvbc()
968 struct dtv_frontend_properties *p = &fe->dtv_property_cache; in si2165_set_frontend_dvbc()
969 const u32 dvb_rate = p->symbol_rate; in si2165_set_frontend_dvbc()
972 if (!state->has_dvbc) in si2165_set_frontend_dvbc()
973 return -EINVAL; in si2165_set_frontend_dvbc()
976 return -EINVAL; in si2165_set_frontend_dvbc()
987 switch (p->modulation) { in si2165_set_frontend_dvbc()
1033 struct si2165_state *state = fe->demodulator_priv; in si2165_set_frontend()
1034 struct dtv_frontend_properties *p = &fe->dtv_property_cache; in si2165_set_frontend()
1035 u32 delsys = p->delivery_system; in si2165_set_frontend()
1056 return -EINVAL; in si2165_set_frontend()
1064 if (fe->ops.tuner_ops.set_params) in si2165_set_frontend()
1065 fe->ops.tuner_ops.set_params(fe); in si2165_set_frontend()
1110 /* For DVB-C */
1113 /* For DVB-T */
1148 struct si2165_platform_data *pdata = client->dev.platform_data; in si2165_probe()
1163 ret = -ENOMEM; in si2165_probe()
1168 state->regmap = devm_regmap_init_i2c(client, ®map_config); in si2165_probe()
1169 if (IS_ERR(state->regmap)) { in si2165_probe()
1170 ret = PTR_ERR(state->regmap); in si2165_probe()
1175 state->client = client; in si2165_probe()
1176 state->config.i2c_addr = client->addr; in si2165_probe()
1177 state->config.chip_mode = pdata->chip_mode; in si2165_probe()
1178 state->config.ref_freq_hz = pdata->ref_freq_hz; in si2165_probe()
1179 state->config.inversion = pdata->inversion; in si2165_probe()
1181 if (state->config.ref_freq_hz < 4000000 || in si2165_probe()
1182 state->config.ref_freq_hz > 27000000) { in si2165_probe()
1183 dev_err(&state->client->dev, "ref_freq of %d Hz not supported by this driver\n", in si2165_probe()
1184 state->config.ref_freq_hz); in si2165_probe()
1185 ret = -EINVAL; in si2165_probe()
1190 memcpy(&state->fe.ops, &si2165_ops, in si2165_probe()
1192 state->fe.ops.release = NULL; in si2165_probe()
1193 state->fe.demodulator_priv = state; in si2165_probe()
1197 ret = si2165_writereg8(state, REG_CHIP_MODE, state->config.chip_mode); in si2165_probe()
1204 if (val != state->config.chip_mode) in si2165_probe()
1207 ret = si2165_readreg8(state, REG_CHIP_REVCODE, &state->chip_revcode); in si2165_probe()
1211 ret = si2165_readreg8(state, REV_CHIP_TYPE, &state->chip_type); in si2165_probe()
1220 if (state->chip_revcode < 26) in si2165_probe()
1221 rev_char = 'A' + state->chip_revcode; in si2165_probe()
1225 switch (state->chip_type) { in si2165_probe()
1228 state->has_dvbt = true; in si2165_probe()
1232 state->has_dvbt = true; in si2165_probe()
1233 state->has_dvbc = true; in si2165_probe()
1236 dev_err(&state->client->dev, "Unsupported Silicon Labs chip (type %d, rev %d)\n", in si2165_probe()
1237 state->chip_type, state->chip_revcode); in si2165_probe()
1241 dev_info(&state->client->dev, in si2165_probe()
1242 "Detected Silicon Labs %s-%c (type %d, rev %d)\n", in si2165_probe()
1243 chip_name, rev_char, state->chip_type, in si2165_probe()
1244 state->chip_revcode); in si2165_probe()
1246 strlcat(state->fe.ops.info.name, chip_name, in si2165_probe()
1247 sizeof(state->fe.ops.info.name)); in si2165_probe()
1250 if (state->has_dvbt) { in si2165_probe()
1251 state->fe.ops.delsys[n++] = SYS_DVBT; in si2165_probe()
1252 strlcat(state->fe.ops.info.name, " DVB-T", in si2165_probe()
1253 sizeof(state->fe.ops.info.name)); in si2165_probe()
1255 if (state->has_dvbc) { in si2165_probe()
1256 state->fe.ops.delsys[n++] = SYS_DVBC_ANNEX_A; in si2165_probe()
1257 strlcat(state->fe.ops.info.name, " DVB-C", in si2165_probe()
1258 sizeof(state->fe.ops.info.name)); in si2165_probe()
1262 *pdata->fe = &state->fe; in si2165_probe()
1267 ret = -ENODEV; in si2165_probe()
1270 dev_dbg(&client->dev, "failed=%d\n", ret); in si2165_probe()
1278 dev_dbg(&client->dev, "\n"); in si2165_remove()
1300 MODULE_DESCRIPTION("Silicon Labs Si2165 DVB-C/-T Demodulator driver");