* This file is licensed under GNU GPL.
*/
-#include "vl.h"
+#include "hw.h"
+#include "i2c.h"
struct max7310_s {
i2c_slave i2c;
s->i2c_command_byte = 1;
break;
case I2C_FINISH:
- if (s->len == 1)
#ifdef VERBOSE
+ if (s->len == 1)
printf("%s: message too short (%i bytes)\n", __FUNCTION__, s->len);
#endif
break;
}
}
+static void max7310_save(QEMUFile *f, void *opaque)
+{
+ struct max7310_s *s = (struct max7310_s *) opaque;
+
+ qemu_put_be32(f, s->i2c_command_byte);
+ qemu_put_be32(f, s->len);
+
+ qemu_put_8s(f, &s->level);
+ qemu_put_8s(f, &s->direction);
+ qemu_put_8s(f, &s->polarity);
+ qemu_put_8s(f, &s->status);
+ qemu_put_8s(f, &s->command);
+
+ i2c_slave_save(f, &s->i2c);
+}
+
+static int max7310_load(QEMUFile *f, void *opaque, int version_id)
+{
+ struct max7310_s *s = (struct max7310_s *) opaque;
+
+ s->i2c_command_byte = qemu_get_be32(f);
+ s->len = qemu_get_be32(f);
+
+ qemu_get_8s(f, &s->level);
+ qemu_get_8s(f, &s->direction);
+ qemu_get_8s(f, &s->polarity);
+ qemu_get_8s(f, &s->status);
+ qemu_get_8s(f, &s->command);
+
+ i2c_slave_load(f, &s->i2c);
+ return 0;
+}
+
static void max7310_gpio_set(void *opaque, int line, int level)
{
struct max7310_s *s = (struct max7310_s *) opaque;
- if (line >= sizeof(s->handler) / sizeof(*s->handler) || line < 0)
- cpu_abort(cpu_single_env, "bad GPIO line");
+ if (line >= ARRAY_SIZE(s->handler) || line < 0)
+ hw_error("bad GPIO line");
if (level)
s->level |= s->direction & (1 << line);
s->i2c.recv = max7310_rx;
s->i2c.send = max7310_tx;
s->gpio_in = qemu_allocate_irqs(max7310_gpio_set, s,
- sizeof(s->handler) / sizeof(*s->handler));
+ ARRAY_SIZE(s->handler));
max7310_reset(&s->i2c);
+ register_savevm("max7310", -1, 0, max7310_save, max7310_load, s);
+
return &s->i2c;
}
void max7310_gpio_out_set(i2c_slave *i2c, int line, qemu_irq handler)
{
struct max7310_s *s = (struct max7310_s *) i2c;
- if (line >= sizeof(s->handler) / sizeof(*s->handler) || line < 0)
- cpu_abort(cpu_single_env, "bad GPIO line");
+ if (line >= ARRAY_SIZE(s->handler) || line < 0)
+ hw_error("bad GPIO line");
s->handler[line] = handler;
}