Commit e3b425361b3787ac1bfc6fec8f7ebae8c37d5d13

Authored by Paul Brook
1 parent 2d9401aa

PXA2xx I2C slave qdev conversion

Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing 1 changed file with 42 additions and 13 deletions
hw/pxa2xx.c
@@ -1256,8 +1256,13 @@ static int pxa2xx_rtc_load(QEMUFile *f, void *opaque, int version_id) @@ -1256,8 +1256,13 @@ static int pxa2xx_rtc_load(QEMUFile *f, void *opaque, int version_id)
1256 } 1256 }
1257 1257
1258 /* I2C Interface */ 1258 /* I2C Interface */
  1259 +typedef struct {
  1260 + i2c_slave i2c;
  1261 + PXA2xxI2CState *host;
  1262 +} PXA2xxI2CSlaveState;
  1263 +
1259 struct PXA2xxI2CState { 1264 struct PXA2xxI2CState {
1260 - i2c_slave slave; 1265 + PXA2xxI2CSlaveState *slave;
1261 i2c_bus *bus; 1266 i2c_bus *bus;
1262 qemu_irq irq; 1267 qemu_irq irq;
1263 target_phys_addr_t offset; 1268 target_phys_addr_t offset;
@@ -1287,7 +1292,8 @@ static void pxa2xx_i2c_update(PXA2xxI2CState *s) @@ -1287,7 +1292,8 @@ static void pxa2xx_i2c_update(PXA2xxI2CState *s)
1287 /* These are only stubs now. */ 1292 /* These are only stubs now. */
1288 static void pxa2xx_i2c_event(i2c_slave *i2c, enum i2c_event event) 1293 static void pxa2xx_i2c_event(i2c_slave *i2c, enum i2c_event event)
1289 { 1294 {
1290 - PXA2xxI2CState *s = (PXA2xxI2CState *) i2c; 1295 + PXA2xxI2CSlaveState *slave = FROM_I2C_SLAVE(PXA2xxI2CSlaveState, i2c);
  1296 + PXA2xxI2CState *s = slave->host;
1291 1297
1292 switch (event) { 1298 switch (event) {
1293 case I2C_START_SEND: 1299 case I2C_START_SEND:
@@ -1310,7 +1316,8 @@ static void pxa2xx_i2c_event(i2c_slave *i2c, enum i2c_event event) @@ -1310,7 +1316,8 @@ static void pxa2xx_i2c_event(i2c_slave *i2c, enum i2c_event event)
1310 1316
1311 static int pxa2xx_i2c_rx(i2c_slave *i2c) 1317 static int pxa2xx_i2c_rx(i2c_slave *i2c)
1312 { 1318 {
1313 - PXA2xxI2CState *s = (PXA2xxI2CState *) i2c; 1319 + PXA2xxI2CSlaveState *slave = FROM_I2C_SLAVE(PXA2xxI2CSlaveState, i2c);
  1320 + PXA2xxI2CState *s = slave->host;
1314 if ((s->control & (1 << 14)) || !(s->control & (1 << 6))) 1321 if ((s->control & (1 << 14)) || !(s->control & (1 << 6)))
1315 return 0; 1322 return 0;
1316 1323
@@ -1324,7 +1331,8 @@ static int pxa2xx_i2c_rx(i2c_slave *i2c) @@ -1324,7 +1331,8 @@ static int pxa2xx_i2c_rx(i2c_slave *i2c)
1324 1331
1325 static int pxa2xx_i2c_tx(i2c_slave *i2c, uint8_t data) 1332 static int pxa2xx_i2c_tx(i2c_slave *i2c, uint8_t data)
1326 { 1333 {
1327 - PXA2xxI2CState *s = (PXA2xxI2CState *) i2c; 1334 + PXA2xxI2CSlaveState *slave = FROM_I2C_SLAVE(PXA2xxI2CSlaveState, i2c);
  1335 + PXA2xxI2CState *s = slave->host;
1328 if ((s->control & (1 << 14)) || !(s->control & (1 << 6))) 1336 if ((s->control & (1 << 14)) || !(s->control & (1 << 6)))
1329 return 1; 1337 return 1;
1330 1338
@@ -1348,7 +1356,7 @@ static uint32_t pxa2xx_i2c_read(void *opaque, target_phys_addr_t addr) @@ -1348,7 +1356,7 @@ static uint32_t pxa2xx_i2c_read(void *opaque, target_phys_addr_t addr)
1348 case ISR: 1356 case ISR:
1349 return s->status | (i2c_bus_busy(s->bus) << 2); 1357 return s->status | (i2c_bus_busy(s->bus) << 2);
1350 case ISAR: 1358 case ISAR:
1351 - return s->slave.address; 1359 + return s->slave->i2c.address;
1352 case IDBR: 1360 case IDBR:
1353 return s->data; 1361 return s->data;
1354 case IBMR: 1362 case IBMR:
@@ -1422,7 +1430,7 @@ static void pxa2xx_i2c_write(void *opaque, target_phys_addr_t addr, @@ -1422,7 +1430,7 @@ static void pxa2xx_i2c_write(void *opaque, target_phys_addr_t addr,
1422 break; 1430 break;
1423 1431
1424 case ISAR: 1432 case ISAR:
1425 - i2c_set_slave_address(&s->slave, value & 0x7f); 1433 + i2c_set_slave_address(&s->slave->i2c, value & 0x7f);
1426 break; 1434 break;
1427 1435
1428 case IDBR: 1436 case IDBR:
@@ -1455,7 +1463,7 @@ static void pxa2xx_i2c_save(QEMUFile *f, void *opaque) @@ -1455,7 +1463,7 @@ static void pxa2xx_i2c_save(QEMUFile *f, void *opaque)
1455 qemu_put_8s(f, &s->ibmr); 1463 qemu_put_8s(f, &s->ibmr);
1456 qemu_put_8s(f, &s->data); 1464 qemu_put_8s(f, &s->data);
1457 1465
1458 - i2c_slave_save(f, &s->slave); 1466 + i2c_slave_save(f, &s->slave->i2c);
1459 } 1467 }
1460 1468
1461 static int pxa2xx_i2c_load(QEMUFile *f, void *opaque, int version_id) 1469 static int pxa2xx_i2c_load(QEMUFile *f, void *opaque, int version_id)
@@ -1470,22 +1478,35 @@ static int pxa2xx_i2c_load(QEMUFile *f, void *opaque, int version_id) @@ -1470,22 +1478,35 @@ static int pxa2xx_i2c_load(QEMUFile *f, void *opaque, int version_id)
1470 qemu_get_8s(f, &s->ibmr); 1478 qemu_get_8s(f, &s->ibmr);
1471 qemu_get_8s(f, &s->data); 1479 qemu_get_8s(f, &s->data);
1472 1480
1473 - i2c_slave_load(f, &s->slave); 1481 + i2c_slave_load(f, &s->slave->i2c);
1474 return 0; 1482 return 0;
1475 } 1483 }
1476 1484
  1485 +static void pxa2xx_i2c_slave_init(i2c_slave *i2c)
  1486 +{
  1487 + /* Nothing to do. */
  1488 +}
  1489 +
  1490 +static I2CSlaveInfo pxa2xx_i2c_slave_info = {
  1491 + .init = pxa2xx_i2c_slave_init,
  1492 + .event = pxa2xx_i2c_event,
  1493 + .recv = pxa2xx_i2c_rx,
  1494 + .send = pxa2xx_i2c_tx
  1495 +};
  1496 +
1477 PXA2xxI2CState *pxa2xx_i2c_init(target_phys_addr_t base, 1497 PXA2xxI2CState *pxa2xx_i2c_init(target_phys_addr_t base,
1478 qemu_irq irq, uint32_t region_size) 1498 qemu_irq irq, uint32_t region_size)
1479 { 1499 {
1480 int iomemtype; 1500 int iomemtype;
  1501 + DeviceState *dev;
  1502 + PXA2xxI2CState *s = qemu_mallocz(sizeof(PXA2xxI2CState));
  1503 +
1481 /* FIXME: Should the slave device really be on a separate bus? */ 1504 /* FIXME: Should the slave device really be on a separate bus? */
1482 - PXA2xxI2CState *s = (PXA2xxI2CState *)  
1483 - i2c_slave_init(i2c_init_bus(), 0, sizeof(PXA2xxI2CState)); 1505 + dev = i2c_create_slave(i2c_init_bus(), "pxa2xx-i2c-slave", 0);
  1506 + s->slave = FROM_I2C_SLAVE(PXA2xxI2CSlaveState, I2C_SLAVE_FROM_QDEV(dev));
  1507 + s->slave->host = s;
1484 1508
1485 s->irq = irq; 1509 s->irq = irq;
1486 - s->slave.event = pxa2xx_i2c_event;  
1487 - s->slave.recv = pxa2xx_i2c_rx;  
1488 - s->slave.send = pxa2xx_i2c_tx;  
1489 s->bus = i2c_init_bus(); 1510 s->bus = i2c_init_bus();
1490 s->offset = base - (base & (~region_size) & TARGET_PAGE_MASK); 1511 s->offset = base - (base & (~region_size) & TARGET_PAGE_MASK);
1491 1512
@@ -2257,3 +2278,11 @@ PXA2xxState *pxa255_init(unsigned int sdram_size) @@ -2257,3 +2278,11 @@ PXA2xxState *pxa255_init(unsigned int sdram_size)
2257 pxa2xx_gpio_out_set(s->gpio, 1, s->reset); 2278 pxa2xx_gpio_out_set(s->gpio, 1, s->reset);
2258 return s; 2279 return s;
2259 } 2280 }
  2281 +
  2282 +static void pxa2xx_register_devices(void)
  2283 +{
  2284 + i2c_register_slave("pxa2xx-i2c-slave", sizeof(PXA2xxI2CSlaveState),
  2285 + &pxa2xx_i2c_slave_info);
  2286 +}
  2287 +
  2288 +device_init(pxa2xx_register_devices)