/* ADC clk control */ for (i = 0; i < ARRAY_SIZE(clock_adc_lut); i++) { if (clock_adc_lut[i].clock == dev->cfg.clock) break;
} if (i == ARRAY_SIZE(clock_adc_lut)) {
dev_err(&client->dev, "Couldn't find ADC config for clock %d\n",
dev->cfg.clock);
ret = -ENODEV; goto err;
}
/* Config register table */ for (i = 0; i < ARRAY_SIZE(tab); i++) {
ret = regmap_update_bits(dev->regmap, tab[i].reg, tab[i].mask,
tab[i].val); if (ret) goto err;
}
/* Demod clk output */ if (dev->cfg.dyn0_clk) {
ret = regmap_write(dev->regmap, 0x80fba8, 0x00); if (ret) goto err;
}
/* TS interface */ if (dev->cfg.ts_mode == AF9033_TS_MODE_USB) {
ret = regmap_update_bits(dev->regmap, 0x80f9a5, 0x01, 0x00); if (ret) goto err;
ret = regmap_update_bits(dev->regmap, 0x80f9b5, 0x01, 0x01); if (ret) goto err;
} else {
ret = regmap_update_bits(dev->regmap, 0x80f990, 0x01, 0x00); if (ret) goto err;
ret = regmap_update_bits(dev->regmap, 0x80f9b5, 0x01, 0x00); if (ret) goto err;
}
/* Demod core settings */
dev_dbg(&client->dev, "load ofsm settings\n"); switch (dev->cfg.tuner) { case AF9033_TUNER_IT9135_38: case AF9033_TUNER_IT9135_51: case AF9033_TUNER_IT9135_52:
len = ARRAY_SIZE(ofsm_init_it9135_v1);
init = ofsm_init_it9135_v1; break; case AF9033_TUNER_IT9135_60: case AF9033_TUNER_IT9135_61: case AF9033_TUNER_IT9135_62:
len = ARRAY_SIZE(ofsm_init_it9135_v2);
init = ofsm_init_it9135_v2; break; default:
len = ARRAY_SIZE(ofsm_init);
init = ofsm_init; break;
}
ret = af9033_wr_reg_val_tab(dev, init, len); if (ret) goto err;
/* Demod tuner specific settings */
dev_dbg(&client->dev, "load tuner specific settings\n"); switch (dev->cfg.tuner) { case AF9033_TUNER_TUA9001:
len = ARRAY_SIZE(tuner_init_tua9001);
init = tuner_init_tua9001; break; case AF9033_TUNER_FC0011:
len = ARRAY_SIZE(tuner_init_fc0011);
init = tuner_init_fc0011; break; case AF9033_TUNER_MXL5007T:
len = ARRAY_SIZE(tuner_init_mxl5007t);
init = tuner_init_mxl5007t; break; case AF9033_TUNER_TDA18218:
len = ARRAY_SIZE(tuner_init_tda18218);
init = tuner_init_tda18218; break; case AF9033_TUNER_FC2580:
len = ARRAY_SIZE(tuner_init_fc2580);
init = tuner_init_fc2580; break; case AF9033_TUNER_FC0012:
len = ARRAY_SIZE(tuner_init_fc0012);
init = tuner_init_fc0012; break; case AF9033_TUNER_IT9135_38:
len = ARRAY_SIZE(tuner_init_it9135_38);
init = tuner_init_it9135_38; break; case AF9033_TUNER_IT9135_51:
len = ARRAY_SIZE(tuner_init_it9135_51);
init = tuner_init_it9135_51; break; case AF9033_TUNER_IT9135_52:
len = ARRAY_SIZE(tuner_init_it9135_52);
init = tuner_init_it9135_52; break; case AF9033_TUNER_IT9135_60:
len = ARRAY_SIZE(tuner_init_it9135_60);
init = tuner_init_it9135_60; break; case AF9033_TUNER_IT9135_61:
len = ARRAY_SIZE(tuner_init_it9135_61);
init = tuner_init_it9135_61; break; case AF9033_TUNER_IT9135_62:
len = ARRAY_SIZE(tuner_init_it9135_62);
init = tuner_init_it9135_62; break; default:
dev_dbg(&client->dev, "unsupported tuner ID=%d\n",
dev->cfg.tuner);
ret = -ENODEV; goto err;
}
ret = af9033_wr_reg_val_tab(dev, init, len); if (ret) goto err;
if (dev->cfg.ts_mode == AF9033_TS_MODE_SERIAL) {
ret = regmap_update_bits(dev->regmap, 0x00d91c, 0x01, 0x01); if (ret) goto err;
ret = regmap_update_bits(dev->regmap, 0x00d917, 0x01, 0x00); if (ret) goto err;
ret = regmap_update_bits(dev->regmap, 0x00d916, 0x01, 0x00); if (ret) goto err;
}
switch (dev->cfg.tuner) { case AF9033_TUNER_IT9135_60: case AF9033_TUNER_IT9135_61: case AF9033_TUNER_IT9135_62:
ret = regmap_write(dev->regmap, 0x800000, 0x01); if (ret) goto err;
}
dev->bandwidth_hz = 0; /* Force to program all parameters */ /* Init stats here in order signal app which stats are supported */
c->strength.len = 1;
c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
c->cnr.len = 1;
c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
c->block_count.len = 1;
c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
c->block_error.len = 1;
c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
c->post_bit_count.len = 1;
c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
c->post_bit_error.len = 1;
c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE;
/* Check bandwidth */ switch (c->bandwidth_hz) { case 6000000:
bandwidth_reg_val = 0x00; break; case 7000000:
bandwidth_reg_val = 0x01; break; case 8000000:
bandwidth_reg_val = 0x02; break; default:
dev_dbg(&client->dev, "invalid bandwidth_hz\n");
ret = -EINVAL; goto err;
}
/* Program tuner */ if (fe->ops.tuner_ops.set_params)
fe->ops.tuner_ops.set_params(fe);
/* Coefficients */ if (c->bandwidth_hz != dev->bandwidth_hz) { for (i = 0; i < ARRAY_SIZE(coeff_lut); i++) { if (coeff_lut[i].clock == dev->cfg.clock &&
coeff_lut[i].bandwidth_hz == c->bandwidth_hz) { break;
}
} if (i == ARRAY_SIZE(coeff_lut)) {
dev_err(&client->dev, "Couldn't find config for clock %u\n",
dev->cfg.clock);
ret = -EINVAL; goto err;
}
ret = regmap_bulk_write(dev->regmap, 0x800001, coeff_lut[i].val, sizeof(coeff_lut[i].val)); if (ret) goto err;
}
/* IF frequency control */ if (c->bandwidth_hz != dev->bandwidth_hz) { for (i = 0; i < ARRAY_SIZE(clock_adc_lut); i++) { if (clock_adc_lut[i].clock == dev->cfg.clock) break;
} if (i == ARRAY_SIZE(clock_adc_lut)) {
dev_err(&client->dev, "Couldn't find ADC clock for clock %u\n",
dev->cfg.clock);
ret = -EINVAL; goto err;
}
adc_freq = clock_adc_lut[i].adc;
if (dev->cfg.adc_multiplier == AF9033_ADC_MULTIPLIER_2X)
adc_freq = 2 * adc_freq;
/* Get used IF frequency */ if (fe->ops.tuner_ops.get_if_frequency)
fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency); else
if_frequency = 0;
ret = regmap_update_bits(dev->regmap, 0x80f904, 0x03,
bandwidth_reg_val); if (ret) goto err;
ret = regmap_write(dev->regmap, 0x800040, 0x00); if (ret) goto err;
ret = regmap_write(dev->regmap, 0x800047, 0x00); if (ret) goto err;
ret = regmap_update_bits(dev->regmap, 0x80f999, 0x01, 0x00); if (ret) goto err;
ret = regmap_bulk_write(dev->regmap, 0x80f996, wbuf, 2); if (ret) goto err;
ret = regmap_write(dev->regmap, 0x80f994, onoff); if (ret) goto err;
ret = regmap_write(dev->regmap, 0x80f995, index); if (ret) goto err;
/* Allocate memory for the internal state */
dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) {
ret = -ENOMEM; goto err;
}
/* Setup the state */
dev->client = client;
memcpy(&dev->cfg, cfg, sizeof(dev->cfg)); switch (dev->cfg.ts_mode) { case AF9033_TS_MODE_PARALLEL:
dev->ts_mode_parallel = true; break; case AF9033_TS_MODE_SERIAL:
dev->ts_mode_serial = true; break; case AF9033_TS_MODE_USB: /* USB mode for AF9035 */ default: break;
}
if (dev->cfg.clock != 12000000) {
ret = -ENODEV;
dev_err(&client->dev, "Unsupported clock %u Hz. Only 12000000 Hz is supported currently\n",
dev->cfg.clock); goto err_kfree;
}
/* Create regmap */
dev->regmap = regmap_init_i2c(client, ®map_config); if (IS_ERR(dev->regmap)) {
ret = PTR_ERR(dev->regmap); goto err_kfree;
}
/* Firmware version */ switch (dev->cfg.tuner) { case AF9033_TUNER_IT9135_38: case AF9033_TUNER_IT9135_51: case AF9033_TUNER_IT9135_52: case AF9033_TUNER_IT9135_60: case AF9033_TUNER_IT9135_61: case AF9033_TUNER_IT9135_62:
dev->is_it9135 = true;
reg = 0x004bfc; break; default:
dev->is_af9035 = true;
reg = 0x0083e9; break;
}
ret = regmap_bulk_read(dev->regmap, reg, &buf[0], 4); if (ret) goto err_regmap_exit;
ret = regmap_bulk_read(dev->regmap, 0x804191, &buf[4], 4); if (ret) goto err_regmap_exit;
/* Sleep as chip seems to be partly active by default */ /* IT9135 did not like to sleep at that early */ if (dev->is_af9035) {
ret = regmap_write(dev->regmap, 0x80004c, 0x01); if (ret) goto err_regmap_exit;
ret = regmap_write(dev->regmap, 0x800000, 0x00); if (ret) goto err_regmap_exit;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.