Commit e3b425361b3787ac1bfc6fec8f7ebae8c37d5d13
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) |