Lines Matching +full:p +full:- +full:state
1 // SPDX-License-Identifier: GPL-2.0
46 reg_write(struct tc90522_state *state, const struct reg_val *regs, int num) in reg_write() argument
52 msg.addr = state->i2c_client->addr; in reg_write()
57 ret = i2c_transfer(state->i2c_client->adapter, &msg, 1); in reg_write()
59 ret = -EIO; in reg_write()
66 static int reg_read(struct tc90522_state *state, u8 reg, u8 *val, u8 len) in reg_read() argument
70 .addr = state->i2c_client->addr, in reg_read()
76 .addr = state->i2c_client->addr, in reg_read()
84 ret = i2c_transfer(state->i2c_client->adapter, msgs, ARRAY_SIZE(msgs)); in reg_read()
88 ret = -EIO; in reg_read()
105 set_tsid[0].val = (fe->dtv_property_cache.stream_id & 0xff00) >> 8; in tc90522s_set_tsid()
106 set_tsid[1].val = fe->dtv_property_cache.stream_id & 0xff; in tc90522s_set_tsid()
107 return reg_write(fe->demodulator_priv, set_tsid, ARRAY_SIZE(set_tsid)); in tc90522s_set_tsid()
115 laysel = ~fe->dtv_property_cache.isdbt_layer_enabled & 0x07; in tc90522t_set_layers()
119 return reg_write(fe->demodulator_priv, &rv, 1); in tc90522t_set_layers()
126 struct tc90522_state *state; in tc90522s_read_status() local
130 state = fe->demodulator_priv; in tc90522s_read_status()
131 ret = reg_read(state, 0xc3, ®, 1); in tc90522s_read_status()
146 if (reg_read(state, 0xc5, ®, 1) < 0 || !(reg & 0x03)) in tc90522s_read_status()
154 struct tc90522_state *state; in tc90522t_read_status() local
158 state = fe->demodulator_priv; in tc90522t_read_status()
159 ret = reg_read(state, 0x96, ®, 1); in tc90522t_read_status()
170 ret = reg_read(state, 0x80, ®, 1); in tc90522t_read_status()
198 struct tc90522_state *state; in tc90522s_get_frontend() local
205 state = fe->demodulator_priv; in tc90522s_get_frontend()
206 c->delivery_system = SYS_ISDBS; in tc90522s_get_frontend()
207 c->symbol_rate = 28860000; in tc90522s_get_frontend()
210 ret = reg_read(state, 0xe6, val, 5); in tc90522s_get_frontend()
214 c->stream_id = val[0] << 8 | val[1]; in tc90522s_get_frontend()
218 c->modulation = (v == 7) ? PSK_8 : QPSK; in tc90522s_get_frontend()
219 c->fec_inner = fec_conv_sat[v]; in tc90522s_get_frontend()
220 c->layer[0].fec = c->fec_inner; in tc90522s_get_frontend()
221 c->layer[0].modulation = c->modulation; in tc90522s_get_frontend()
222 c->layer[0].segment_count = val[3] & 0x3f; /* slots */ in tc90522s_get_frontend()
226 c->layer[1].fec = fec_conv_sat[v]; in tc90522s_get_frontend()
228 c->layer[1].segment_count = 0; in tc90522s_get_frontend()
230 c->layer[1].segment_count = val[4] & 0x3f; /* slots */ in tc90522s_get_frontend()
235 c->layer[1].modulation = QPSK; in tc90522s_get_frontend()
241 stats = &c->strength; in tc90522s_get_frontend()
242 stats->len = 0; in tc90522s_get_frontend()
244 if (fe->ops.tuner_ops.get_rf_strength) { in tc90522s_get_frontend()
247 fe->ops.tuner_ops.get_rf_strength(fe, &dummy); in tc90522s_get_frontend()
250 stats = &c->cnr; in tc90522s_get_frontend()
251 stats->len = 1; in tc90522s_get_frontend()
252 stats->stat[0].scale = FE_SCALE_NOT_AVAILABLE; in tc90522s_get_frontend()
254 ret = reg_read(state, 0xbc, val, 2); in tc90522s_get_frontend()
258 u32 p, p4; in tc90522s_get_frontend() local
261 cndat -= 3000; /* cndat: 4.12 fixed point float */ in tc90522s_get_frontend()
263 * cnr[mdB] = -1634.6 * P^5 + 14341 * P^4 - 50259 * P^3 in tc90522s_get_frontend()
264 * + 88977 * P^2 - 89565 * P + 58857 in tc90522s_get_frontend()
265 * (P = sqrt(cndat) / 64) in tc90522s_get_frontend()
267 /* p := sqrt(cndat) << 8 = P << 14, 2.14 fixed point float */ in tc90522s_get_frontend()
269 p = int_sqrt(cndat << 16); in tc90522s_get_frontend()
271 cn = div64_s64(-16346LL * p4 * p, 10) >> 35; in tc90522s_get_frontend()
273 cn -= (50259LL * cndat * p) >> 23; in tc90522s_get_frontend()
275 cn -= (89565LL * p) >> 11; in tc90522s_get_frontend()
277 stats->stat[0].svalue = cn >> 3; in tc90522s_get_frontend()
278 stats->stat[0].scale = FE_SCALE_DECIBEL; in tc90522s_get_frontend()
281 /* per-layer post viterbi BER (or PER? config dependent?) */ in tc90522s_get_frontend()
282 stats = &c->post_bit_error; in tc90522s_get_frontend()
284 stats->len = layers; in tc90522s_get_frontend()
285 ret = reg_read(state, 0xeb, val, 10); in tc90522s_get_frontend()
288 stats->stat[i].scale = FE_SCALE_NOT_AVAILABLE; in tc90522s_get_frontend()
291 stats->stat[i].scale = FE_SCALE_COUNTER; in tc90522s_get_frontend()
292 stats->stat[i].uvalue = val[i * 5] << 16 in tc90522s_get_frontend()
296 stats = &c->post_bit_count; in tc90522s_get_frontend()
298 stats->len = layers; in tc90522s_get_frontend()
301 stats->stat[i].scale = FE_SCALE_NOT_AVAILABLE; in tc90522s_get_frontend()
304 stats->stat[i].scale = FE_SCALE_COUNTER; in tc90522s_get_frontend()
305 stats->stat[i].uvalue = in tc90522s_get_frontend()
307 stats->stat[i].uvalue *= 204 * 8; in tc90522s_get_frontend()
333 struct tc90522_state *state; in tc90522t_get_frontend() local
340 state = fe->demodulator_priv; in tc90522t_get_frontend()
341 c->delivery_system = SYS_ISDBT; in tc90522t_get_frontend()
342 c->bandwidth_hz = 6000000; in tc90522t_get_frontend()
344 ret = reg_read(state, 0xb0, val, 1); in tc90522t_get_frontend()
347 c->transmission_mode = tm_conv[mode]; in tc90522t_get_frontend()
348 c->guard_interval = (val[0] & 0x30) >> 4; in tc90522t_get_frontend()
351 ret = reg_read(state, 0xb2, val, 6); in tc90522t_get_frontend()
356 c->isdbt_partial_reception = val[0] & 0x01; in tc90522t_get_frontend()
357 c->isdbt_sb_mode = (val[0] & 0xc0) == 0x40; in tc90522t_get_frontend()
362 c->layer[0].segment_count = 0; in tc90522t_get_frontend()
365 c->layer[0].segment_count = v; in tc90522t_get_frontend()
366 c->layer[0].fec = fec_conv_ter[(val[1] & 0x1c) >> 2]; in tc90522t_get_frontend()
367 c->layer[0].modulation = mod_conv[(val[1] & 0xe0) >> 5]; in tc90522t_get_frontend()
369 c->layer[0].interleaving = v; in tc90522t_get_frontend()
375 c->layer[1].segment_count = 0; in tc90522t_get_frontend()
378 c->layer[1].segment_count = v; in tc90522t_get_frontend()
379 c->layer[1].fec = fec_conv_ter[(val[3] & 0xe0) >> 5]; in tc90522t_get_frontend()
380 c->layer[1].modulation = mod_conv[(val[2] & 0x07)]; in tc90522t_get_frontend()
381 c->layer[1].interleaving = (val[3] & 0x1c) >> 2; in tc90522t_get_frontend()
387 c->layer[2].segment_count = 0; in tc90522t_get_frontend()
390 c->layer[2].segment_count = v; in tc90522t_get_frontend()
391 c->layer[2].fec = fec_conv_ter[(val[4] & 0x07)]; in tc90522t_get_frontend()
392 c->layer[2].modulation = mod_conv[(val[4] & 0x38) >> 3]; in tc90522t_get_frontend()
393 c->layer[2].interleaving = (val[5] & 0xe0) >> 5; in tc90522t_get_frontend()
399 stats = &c->strength; in tc90522t_get_frontend()
400 stats->len = 0; in tc90522t_get_frontend()
402 if (fe->ops.tuner_ops.get_rf_strength) { in tc90522t_get_frontend()
405 fe->ops.tuner_ops.get_rf_strength(fe, &dummy); in tc90522t_get_frontend()
408 stats = &c->cnr; in tc90522t_get_frontend()
409 stats->len = 1; in tc90522t_get_frontend()
410 stats->stat[0].scale = FE_SCALE_NOT_AVAILABLE; in tc90522t_get_frontend()
412 ret = reg_read(state, 0x8b, val, 3); in tc90522t_get_frontend()
416 u32 p, tmp; in tc90522t_get_frontend() local
420 * cnr[mdB] = 0.024 P^4 - 1.6 P^3 + 39.8 P^2 + 549.1 P + 3096.5 in tc90522t_get_frontend()
421 * (P = 10log10(5505024/cndat)) in tc90522t_get_frontend()
424 /* p = 10log10(5505024/cndat) << 24 (8.24 fixed point float)*/ in tc90522t_get_frontend()
425 p = intlog10(5505024) - intlog10(cndat); in tc90522t_get_frontend()
426 p *= 10; in tc90522t_get_frontend()
429 cn += div64_s64(43827LL * p, 10) >> 24; in tc90522t_get_frontend()
430 tmp = p >> 8; in tc90522t_get_frontend()
432 tmp = p >> 13; in tc90522t_get_frontend()
433 cn -= div64_s64(128LL * tmp * tmp * tmp, 10) >> 33; in tc90522t_get_frontend()
434 tmp = p >> 18; in tc90522t_get_frontend()
437 stats->stat[0].svalue = cn >> 3; in tc90522t_get_frontend()
438 stats->stat[0].scale = FE_SCALE_DECIBEL; in tc90522t_get_frontend()
441 /* per-layer post viterbi BER (or PER? config dependent?) */ in tc90522t_get_frontend()
442 stats = &c->post_bit_error; in tc90522t_get_frontend()
444 stats->len = layers; in tc90522t_get_frontend()
445 ret = reg_read(state, 0x9d, val, 15); in tc90522t_get_frontend()
448 stats->stat[i].scale = FE_SCALE_NOT_AVAILABLE; in tc90522t_get_frontend()
451 stats->stat[i].scale = FE_SCALE_COUNTER; in tc90522t_get_frontend()
452 stats->stat[i].uvalue = val[i * 3] << 16 in tc90522t_get_frontend()
456 stats = &c->post_bit_count; in tc90522t_get_frontend()
458 stats->len = layers; in tc90522t_get_frontend()
461 stats->stat[i].scale = FE_SCALE_NOT_AVAILABLE; in tc90522t_get_frontend()
464 stats->stat[i].scale = FE_SCALE_COUNTER; in tc90522t_get_frontend()
465 stats->stat[i].uvalue = in tc90522t_get_frontend()
467 stats->stat[i].uvalue *= 204 * 8; in tc90522t_get_frontend()
479 struct tc90522_state *state; in tc90522_set_frontend() local
482 state = fe->demodulator_priv; in tc90522_set_frontend()
484 if (fe->ops.tuner_ops.set_params) in tc90522_set_frontend()
485 ret = fe->ops.tuner_ops.set_params(fe); in tc90522_set_frontend()
487 ret = -ENODEV; in tc90522_set_frontend()
491 if (fe->ops.delsys[0] == SYS_ISDBS) { in tc90522_set_frontend()
495 ret = reg_write(state, &reset_sat, 1); in tc90522_set_frontend()
500 ret = reg_write(state, &reset_ter, 1); in tc90522_set_frontend()
508 dev_warn(&state->tuner_i2c.dev, "(%s) failed. [adap%d-fe%d]\n", in tc90522_set_frontend()
509 __func__, fe->dvb->num, fe->id); in tc90522_set_frontend()
516 if (fe->ops.delsys[0] == SYS_ISDBS) { in tc90522_get_tune_settings()
517 settings->min_delay_ms = 250; in tc90522_get_tune_settings()
518 settings->step_size = 1000; in tc90522_get_tune_settings()
519 settings->max_drift = settings->step_size * 2; in tc90522_get_tune_settings()
521 settings->min_delay_ms = 400; in tc90522_get_tune_settings()
522 settings->step_size = 142857; in tc90522_get_tune_settings()
523 settings->max_drift = settings->step_size; in tc90522_get_tune_settings()
541 struct tc90522_state *state; in tc90522_set_if_agc() local
545 state = fe->demodulator_priv; in tc90522_set_if_agc()
546 if (fe->ops.delsys[0] == SYS_ISDBS) { in tc90522_set_if_agc()
559 return reg_write(state, rv, num); in tc90522_set_if_agc()
567 struct tc90522_state *state; in tc90522_sleep() local
570 state = fe->demodulator_priv; in tc90522_sleep()
571 if (fe->ops.delsys[0] == SYS_ISDBS) in tc90522_sleep()
572 ret = reg_write(state, &sleep_sat, 1); in tc90522_sleep()
574 ret = reg_write(state, &sleep_ter, 1); in tc90522_sleep()
575 if (ret == 0 && fe->ops.set_lna && in tc90522_sleep()
576 fe->dtv_property_cache.lna == LNA_AUTO) { in tc90522_sleep()
577 fe->dtv_property_cache.lna = 0; in tc90522_sleep()
578 ret = fe->ops.set_lna(fe); in tc90522_sleep()
579 fe->dtv_property_cache.lna = LNA_AUTO; in tc90522_sleep()
583 dev_warn(&state->tuner_i2c.dev, in tc90522_sleep()
584 "(%s) failed. [adap%d-fe%d]\n", in tc90522_sleep()
585 __func__, fe->dvb->num, fe->id); in tc90522_sleep()
594 struct tc90522_state *state; in tc90522_init() local
603 state = fe->demodulator_priv; in tc90522_init()
604 if (fe->ops.delsys[0] == SYS_ISDBS) in tc90522_init()
605 ret = reg_write(state, &wakeup_sat, 1); in tc90522_init()
607 ret = reg_write(state, &wakeup_ter, 1); in tc90522_init()
608 if (ret == 0 && fe->ops.set_lna && in tc90522_init()
609 fe->dtv_property_cache.lna == LNA_AUTO) { in tc90522_init()
610 fe->dtv_property_cache.lna = 1; in tc90522_init()
611 ret = fe->ops.set_lna(fe); in tc90522_init()
612 fe->dtv_property_cache.lna = LNA_AUTO; in tc90522_init()
616 dev_warn(&state->tuner_i2c.dev, in tc90522_init()
617 "(%s) failed. [adap%d-fe%d]\n", in tc90522_init()
618 __func__, fe->dvb->num, fe->id); in tc90522_init()
622 /* prefer 'all-layers' to 'none' as a default */ in tc90522_init()
623 if (fe->dtv_property_cache.isdbt_layer_enabled == 0) in tc90522_init()
624 fe->dtv_property_cache.isdbt_layer_enabled = 7; in tc90522_init()
636 struct tc90522_state *state; in tc90522_master_xfer() local
641 u8 *p, *bufend; in tc90522_master_xfer() local
644 return -EINVAL; in tc90522_master_xfer()
652 return -ENOMEM; in tc90522_master_xfer()
654 state = i2c_get_adapdata(adap); in tc90522_master_xfer()
655 p = wbuf; in tc90522_master_xfer()
658 new_msgs[j].addr = state->i2c_client->addr; in tc90522_master_xfer()
663 if (p + 2 > bufend) in tc90522_master_xfer()
665 p[0] = TC90522_I2C_THRU_REG; in tc90522_master_xfer()
666 p[1] = msgs[i].addr << 1 | 0x01; in tc90522_master_xfer()
667 new_msgs[j].buf = p; in tc90522_master_xfer()
669 p += 2; in tc90522_master_xfer()
671 new_msgs[j].addr = state->i2c_client->addr; in tc90522_master_xfer()
678 if (p + msgs[i].len + 2 > bufend) in tc90522_master_xfer()
680 p[0] = TC90522_I2C_THRU_REG; in tc90522_master_xfer()
681 p[1] = msgs[i].addr << 1; in tc90522_master_xfer()
682 memcpy(p + 2, msgs[i].buf, msgs[i].len); in tc90522_master_xfer()
683 new_msgs[j].buf = p; in tc90522_master_xfer()
685 p += new_msgs[j].len; in tc90522_master_xfer()
689 ret = -ENOMEM; in tc90522_master_xfer()
690 } else if (!state->cfg.split_tuner_read_i2c || rd_num == 0) { in tc90522_master_xfer()
691 ret = i2c_transfer(state->i2c_client->adapter, new_msgs, j); in tc90522_master_xfer()
696 * such as Friio (see. dvb-usb-gl861). in tc90522_master_xfer()
708 r = i2c_transfer(state->i2c_client->adapter, in tc90522_master_xfer()
709 &new_msgs[from], to - from); in tc90522_master_xfer()
716 ret = -EIO; in tc90522_master_xfer()
739 .name = "Toshiba TC90522 ISDB-S module",
759 .name = "Toshiba TC90522 ISDB-T module",
785 struct tc90522_state *state; in tc90522_probe() local
791 state = kzalloc(sizeof(*state), GFP_KERNEL); in tc90522_probe()
792 if (!state) in tc90522_probe()
793 return -ENOMEM; in tc90522_probe()
794 state->i2c_client = client; in tc90522_probe()
796 cfg = client->dev.platform_data; in tc90522_probe()
797 memcpy(&state->cfg, cfg, sizeof(state->cfg)); in tc90522_probe()
798 cfg->fe = state->cfg.fe = &state->fe; in tc90522_probe()
799 ops = id->driver_data == 0 ? &tc90522_ops_sat : &tc90522_ops_ter; in tc90522_probe()
800 memcpy(&state->fe.ops, ops, sizeof(*ops)); in tc90522_probe()
801 state->fe.demodulator_priv = state; in tc90522_probe()
803 adap = &state->tuner_i2c; in tc90522_probe()
804 adap->owner = THIS_MODULE; in tc90522_probe()
805 adap->algo = &tc90522_tuner_i2c_algo; in tc90522_probe()
806 adap->dev.parent = &client->dev; in tc90522_probe()
807 strscpy(adap->name, "tc90522_sub", sizeof(adap->name)); in tc90522_probe()
808 i2c_set_adapdata(adap, state); in tc90522_probe()
812 cfg->tuner_i2c = state->cfg.tuner_i2c = adap; in tc90522_probe()
814 i2c_set_clientdata(client, &state->cfg); in tc90522_probe()
815 dev_info(&client->dev, "Toshiba TC90522 attached.\n"); in tc90522_probe()
818 kfree(state); in tc90522_probe()
824 struct tc90522_state *state; in tc90522_remove() local
826 state = cfg_to_state(i2c_get_clientdata(client)); in tc90522_remove()
827 i2c_del_adapter(&state->tuner_i2c); in tc90522_remove()
828 kfree(state); in tc90522_remove()