/* Program tuner */ if (fe->ops.tuner_ops.set_params &&
fe->ops.tuner_ops.get_if_frequency) {
ret = fe->ops.tuner_ops.set_params(fe); if (ret) goto err;
ret = fe->ops.tuner_ops.get_if_frequency(fe, &if_frequency); if (ret) goto err;
} else {
ret = -EINVAL; goto err;
}
dev_dbg(&pdev->dev, "if_frequency=%u\n", if_frequency); if (if_frequency != 36150000) {
ret = -EINVAL; goto err;
}
switch (c->bandwidth_hz) { case 6000000:
r6a50_val = 0x78; break; case 7000000:
r6a50_val = 0x68; break; case 8000000:
r6a50_val = 0x58; break; default:
ret = -EINVAL; goto err;
}
ret = zd1301_demod_wreg(dev, 0x6a60, 0x11); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a47, 0x46); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a48, 0x46); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a4a, 0x15); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a4b, 0x63); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a5b, 0x99); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a3b, 0x10); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6806, 0x01); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a41, 0x08); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a42, 0x46); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a44, 0x14); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a45, 0x67); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a38, 0x00); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a4c, 0x52); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a49, 0x2a); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6840, 0x2e); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a50, r6a50_val); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a38, 0x07); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a43, 0x70); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x684e, 0x00); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6849, 0x00); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x68e2, 0xd7); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x68e0, 0x39); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6840, 0x21); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6840, 0x26); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x68e0, 0xff); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x68e2, 0xd8); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6849, 0x4e); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x684e, 0x01); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6a43, zd1301_demod_gain); if (ret) goto err;
/* * Interesting registers here are: * 0x6a05: get some gain value * 0x6a06: get about same gain value than set to 0x6a43 * 0x6a07: get some gain value * 0x6a43: set gain value by driver * 0x6a24: get demod lock bits (FSM stage?) * * Driver should implement some kind of algorithm to calculate suitable * value for register 0x6a43, based likely values from register 0x6a05 * and 0x6a07. Looks like gain register 0x6a43 value could be from * range 0x00 - 0x70.
*/
if (dev->gain != zd1301_demod_gain) {
dev->gain = zd1301_demod_gain;
ret = zd1301_demod_wreg(dev, 0x6a43, dev->gain); if (ret) goto err;
}
ret = zd1301_demod_wreg(dev, 0x6811, 0x80); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6812, 0x05); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6813, msg[1].addr << 1); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6801, msg[0].buf[0]); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6802, 0x00); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6803, 0x06); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6805, 0x00); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6804, msg[1].len); if (ret) goto err;
ret = zd1301_demod_rreg(dev, 0x6804, &u8tmp); if (ret) goto err;
}
for (i = 0; i < msg[1].len; i++) {
ret = zd1301_demod_rreg(dev, 0x0600 + i, &msg[1].buf[i]); if (ret) goto err;
}
} elseif (ZD1301_IS_I2C_XFER_WRITE(msg, num)) {
dev_dbg(&pdev->dev, "write msg[0].len=%u\n", msg[0].len); if (msg[0].len > 1 + 8) {
ret = -EOPNOTSUPP; goto err;
}
ret = zd1301_demod_wreg(dev, 0x6811, 0x80); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6812, 0x01); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6813, msg[0].addr << 1); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6800, msg[0].buf[0]); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6802, 0x00); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6803, 0x06); if (ret) goto err;
for (i = 0; i < msg[0].len - 1; i++) {
ret = zd1301_demod_wreg(dev, 0x0600 + i, msg[0].buf[1 + i]); if (ret) goto err;
}
ret = zd1301_demod_wreg(dev, 0x6805, 0x80); if (ret) goto err;
ret = zd1301_demod_wreg(dev, 0x6804, msg[0].len - 1); if (ret) goto err;
if (!pdata) {
ret = -EINVAL;
dev_err(&pdev->dev, "cannot proceed without platform data\n"); goto err;
} if (!pdev->dev.parent->driver) {
ret = -EINVAL;
dev_dbg(&pdev->dev, "no parent device\n"); goto err;
}
dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) {
ret = -ENOMEM; goto err;
}
/* Setup the state */
dev->pdev = pdev;
dev->gain = zd1301_demod_gain;
/* Sleep */
ret = zd1301_demod_wreg(dev, 0x6840, 0x21); if (ret) goto err_kfree;
ret = zd1301_demod_wreg(dev, 0x6a38, 0x07); if (ret) goto err_kfree;
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.