/* translates msgs to internal commands for bit-banging */ staticvoid translate(struct pt3_i2cbuf *cbuf, struct i2c_msg *msgs, int num)
{ int i, j; bool rd;
cbuf->num_cmds = 0; for (i = 0; i < num; i++) {
rd = !!(msgs[i].flags & I2C_M_RD);
put_start(cbuf);
put_byte_write(cbuf, msgs[i].addr << 1 | rd); if (rd)
put_byte_read(cbuf, msgs[i].len); else for (j = 0; j < msgs[i].len; j++)
put_byte_write(cbuf, msgs[i].buf[j]);
} if (num > 0) {
put_stop(cbuf);
put_end(cbuf);
}
}
staticint wait_i2c_result(struct pt3_board *pt3, u32 *result, int max_wait)
{ int i;
u32 v;
for (i = 0; i < max_wait; i++) {
v = ioread32(pt3->regs[0] + REG_I2C_R); if (!(v & STAT_SEQ_RUNNING)) break;
usleep_range(500, 750);
} if (i >= max_wait) return -EIO; if (result)
*result = v; return 0;
}
/* make sure that previous transactions had finished */ if (wait_i2c_result(pt3, NULL, 50)) {
dev_warn(&pt3->pdev->dev, "(%s) prev. transaction stalled\n",
__func__); return -EIO;
}
iowrite32(PT3_I2C_RUN | addr, pt3->regs[0] + REG_I2C_W);
usleep_range(200, 300); /* wait for the current transaction to finish */ if (wait_i2c_result(pt3, &ret, 500) || (ret & STAT_SEQ_ERROR)) {
dev_warn(&pt3->pdev->dev, "(%s) failed.\n", __func__); return -EIO;
} return 0;
}
/* init commands for each demod are combined into one transaction * and hidden in ROM with the address PT3_CMD_ADDR_INIT_DEMOD.
*/ int pt3_init_all_demods(struct pt3_board *pt3)
{
ioread32(pt3->regs[0] + REG_I2C_R); return send_i2c_cmd(pt3, PT3_CMD_ADDR_INIT_DEMOD);
}
/* init commands for two ISDB-T tuners are hidden in ROM. */ int pt3_init_all_mxl301rf(struct pt3_board *pt3)
{
usleep_range(1000, 2000); return send_i2c_cmd(pt3, PT3_CMD_ADDR_INIT_TUNER);
}
for (i = 0; i < num; i++) if (msgs[i].flags & I2C_M_RECV_LEN) {
dev_warn(&pt3->pdev->dev, "(%s) I2C_M_RECV_LEN not supported.\n",
__func__); return -EINVAL;
}
if (send_i2c_cmd(pt3, PT3_CMD_ADDR_NORMAL) < 0) return -EIO;
p = pt3->regs[1] + PT3_I2C_BASE; for (i = 0; i < num; i++) if ((msgs[i].flags & I2C_M_RD) && msgs[i].len > 0) {
memcpy_fromio(msgs[i].buf, p, msgs[i].len);
p += msgs[i].len;
}
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.