2
0

ssi.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * QEMU Synchronous Serial Interface support
  3. *
  4. * Copyright (c) 2009 CodeSourcery.
  5. * Written by Paul Brook
  6. *
  7. * This code is licensed under the GNU GPL v2.
  8. */
  9. #include "ssi.h"
  10. struct SSIBus {
  11. BusState qbus;
  12. };
  13. static struct BusInfo ssi_bus_info = {
  14. .name = "SSI",
  15. .size = sizeof(SSIBus),
  16. };
  17. static int ssi_slave_init(DeviceState *dev, DeviceInfo *base_info)
  18. {
  19. SSISlaveInfo *info = container_of(base_info, SSISlaveInfo, qdev);
  20. SSISlave *s = SSI_SLAVE_FROM_QDEV(dev);
  21. SSIBus *bus;
  22. bus = FROM_QBUS(SSIBus, qdev_get_parent_bus(dev));
  23. if (QTAILQ_FIRST(&bus->qbus.children) != dev
  24. || QTAILQ_NEXT(dev, sibling) != NULL) {
  25. hw_error("Too many devices on SSI bus");
  26. }
  27. s->info = info;
  28. return info->init(s);
  29. }
  30. void ssi_register_slave(SSISlaveInfo *info)
  31. {
  32. assert(info->qdev.size >= sizeof(SSISlave));
  33. info->qdev.init = ssi_slave_init;
  34. info->qdev.bus_info = &ssi_bus_info;
  35. qdev_register(&info->qdev);
  36. }
  37. DeviceState *ssi_create_slave(SSIBus *bus, const char *name)
  38. {
  39. DeviceState *dev;
  40. dev = qdev_create(&bus->qbus, name);
  41. qdev_init_nofail(dev);
  42. return dev;
  43. }
  44. SSIBus *ssi_create_bus(DeviceState *parent, const char *name)
  45. {
  46. BusState *bus;
  47. bus = qbus_create(&ssi_bus_info, parent, name);
  48. return FROM_QBUS(SSIBus, bus);
  49. }
  50. uint32_t ssi_transfer(SSIBus *bus, uint32_t val)
  51. {
  52. DeviceState *dev;
  53. SSISlave *slave;
  54. dev = QTAILQ_FIRST(&bus->qbus.children);
  55. if (!dev) {
  56. return 0;
  57. }
  58. slave = SSI_SLAVE_FROM_QDEV(dev);
  59. return slave->info->transfer(slave, val);
  60. }