struct omap_i2c_s {
qemu_irq irq;
qemu_irq drq[2];
- i2c_slave slave[4];
i2c_bus *bus;
uint8_t revision;
qemu_set_irq(s->drq[1], (s->stat >> 4) & 1); /* XRDY */
}
-/* These are only stubs now. */
-static void omap_i2c_event(i2c_slave *i2c, enum i2c_event event)
-{
- fprintf(stderr, "%s: I^2C slave mode not supported\n", __FUNCTION__);
-
- /* code below is broken, i2c_slave CANNOT be cast to omap_i2c_s! */
-
- //struct omap_i2c_s *s = (struct omap_i2c_s *) i2c;
- //
- //if ((~s->control >> 15) & 1) /* I2C_EN */
- // return;
- //
- //switch (event) {
- // case I2C_START_SEND:
- // case I2C_START_RECV:
- // s->stat |= 1 << 9; /* AAS */
- // break;
- // case I2C_FINISH:
- // s->stat |= 1 << 2; /* ARDY */
- // break;
- // case I2C_NACK:
- // s->stat |= 1 << 1; /* NACK */
- // break;
- // default:
- // break;
- //}
- //
- //omap_i2c_interrupts_update(s);
-}
-
-static int omap_i2c_rx(i2c_slave *i2c)
-{
- fprintf(stderr, "%s: I^2C slave mode not supported\n", __FUNCTION__);
- return 0;
-
- /* code below is broken, i2c_slave CANNOT be cast to omap_i2c_s! */
-
- //struct omap_i2c_s *s = (struct omap_i2c_s *) i2c;
- //uint8_t ret = 0;
- //
- //if ((~s->control >> 15) & 1) /* I2C_EN */
- // return -1;
- //
- //if (s->rxlen < s->txlen)
- // ret = s->fifo[s->rxlen++];
- //else
- // s->stat |= 1 << 10; /* XUDF */
- //s->stat |= 1 << 4; /* XRDY */
- //
- //omap_i2c_interrupts_update(s);
- //return ret;
-}
-
-static int omap_i2c_tx(i2c_slave *i2c, uint8_t data)
-{
- fprintf(stderr, "%s: I^2C slave mode not supported\n", __FUNCTION__);
- return 1;
-
- /* code below is broken, i2c_slave CANNOT be cast to omap_i2c_s! */
-
- //struct omap_i2c_s *s = (struct omap_i2c_s *) i2c;
- //
- //if ((~s->control >> 15) & 1) /* I2C_EN */
- // return 1;
- //
- //if (s->txlen < s->fifosize)
- // s->fifo[s->txlen++] = data;
- //else
- // s->stat |= 1 << 11; /* ROVR */
- //s->stat |= 1 << 3; /* RRDY */
- //
- //omap_i2c_interrupts_update(s);
- //return 1;
-}
-
static void omap_i2c_fifo_run(struct omap_i2c_s *s)
{
int ack = 1, i;
ret = s->fifo[s->fifostart++];
s->fifostart &= I2C_FIFO_SIZE_MASK;
if (--s->fifolen) {
- if (s->fifolen < ((s->dma & 0x3f) >> 8)) {
+ if (s->fifolen <= ((s->dma >> 8) & 0x3f)) {
s->stat &= ~(1 << 3); /* RRDY */
s->stat |= 1 << 13; /* RDR */
}
TRACE("OA0 = %04x", value);
s->own_addr[0] = value & (s->revision < OMAP3_INTR_REV
? 0x3ff : 0xe3ff);
- i2c_set_slave_address(&s->slave[0],
+ /*i2c_set_slave_address(&s->slave[0],
value & (s->revision >= OMAP3_INTR_REV
&& (s->control & 0x80)
- ? 0x3ff: 0x7f));
+ ? 0x3ff: 0x7f));*/
break;
case 0x2c: /* I2C_SA */
TRACE("SA = %04x", value);
addr = (addr >> 2) & 3;
TRACE("OA%d = %04x", (int)addr, value);
s->own_addr[addr] = value & 0x3ff;
- i2c_set_slave_address(&s->slave[addr],
+ /*i2c_set_slave_address(&s->slave[addr],
value & ((s->control & (0x80 >> addr))
- ? 0x3ff: 0x7f));
+ ? 0x3ff: 0x7f));*/
}
break;
case 0x54: /* I2C_SBLOCK */
s->irq = irq;
s->drq[0] = dma[0];
s->drq[1] = dma[1];
- s->slave[0].event = s->slave[1].event = s->slave[2].event =
- s->slave[3].event = omap_i2c_event;
- s->slave[0].recv = s->slave[1].recv = s->slave[2].recv =
- s->slave[3].recv = omap_i2c_rx;
- s->slave[0].send = s->slave[1].send = s->slave[2].send =
- s->slave[3].send = omap_i2c_tx;
- s->bus = i2c_init_bus();
+ s->bus = i2c_init_bus(NULL, "i2c");
s->fifosize = fifosize;
omap_i2c_reset(s);
return s;