Merge branch 'master' of /home/nchip/public_html/qemu into garage-push
[qemu] / hw / i2c.h
index 7a80bcb..26155b5 100644 (file)
--- a/hw/i2c.h
+++ b/hw/i2c.h
@@ -1,6 +1,8 @@
 #ifndef QEMU_I2C_H
 #define QEMU_I2C_H
 
+#include "qdev.h"
+
 /* The QEMU I2C implementation only supports simple transfers that complete
    immediately.  It does not support slave devices that need to be able to
    defer their response (eg. CPU slave interfaces where the data is supplied
@@ -20,21 +22,28 @@ typedef int (*i2c_recv_cb)(i2c_slave *s);
 /* Notify the slave of a bus state change.  */
 typedef void (*i2c_event_cb)(i2c_slave *s, enum i2c_event event);
 
-struct i2c_slave
-{
-    /* Callbacks to be set by the device.  */
+typedef void (*i2c_slave_initfn)(i2c_slave *dev);
+
+typedef struct {
+    DeviceInfo qdev;
+
+    /* Callbacks provided by the device.  */
+    i2c_slave_initfn init;
     i2c_event_cb event;
     i2c_recv_cb recv;
     i2c_send_cb send;
+} I2CSlaveInfo;
+
+struct i2c_slave
+{
+    DeviceState qdev;
+    I2CSlaveInfo *info;
 
     /* Remaining fields for internal use by the I2C code.  */
     int address;
-    void *next;
-    i2c_bus *bus;
 };
 
-i2c_bus *i2c_init_bus(void);
-i2c_slave *i2c_slave_init(i2c_bus *bus, int address, int size);
+i2c_bus *i2c_init_bus(DeviceState *parent, const char *name);
 void i2c_set_slave_address(i2c_slave *dev, int address);
 int i2c_bus_busy(i2c_bus *bus);
 int i2c_start_transfer(i2c_bus *bus, int address, int recv);
@@ -45,24 +54,20 @@ int i2c_recv(i2c_bus *bus);
 void i2c_slave_save(QEMUFile *f, i2c_slave *dev);
 void i2c_slave_load(QEMUFile *f, i2c_slave *dev);
 
-/* max111x.c */
-struct max111x_s;
-uint32_t max111x_read(void *opaque);
-void max111x_write(void *opaque, uint32_t value);
-struct max111x_s *max1110_init(qemu_irq cb);
-struct max111x_s *max1111_init(qemu_irq cb);
-void max111x_set_input(struct max111x_s *s, int line, uint8_t value);
+#define I2C_SLAVE_FROM_QDEV(dev) DO_UPCAST(i2c_slave, qdev, dev)
+#define FROM_I2C_SLAVE(type, dev) DO_UPCAST(type, i2c, dev)
+
+void i2c_register_slave(const char *name, int size, I2CSlaveInfo *type);
+
+DeviceState *i2c_create_slave(i2c_bus *bus, const char *name, int addr);
 
 /* max7310.c */
-i2c_slave *max7310_init(i2c_bus *bus);
 void max7310_reset(i2c_slave *i2c);
 qemu_irq *max7310_gpio_in_get(i2c_slave *i2c);
 void max7310_gpio_out_set(i2c_slave *i2c, int line, qemu_irq handler);
 
 /* wm8750.c */
-i2c_slave *wm8750_init(i2c_bus *bus, AudioState *audio);
-void wm8750_reset(i2c_slave *i2c);
-void wm8750_data_req_set(i2c_slave *i2c,
+void wm8750_data_req_set(DeviceState *dev,
                 void (*data_req)(void *, int, int), void *opaque);
 void wm8750_dac_dat(void *opaque, uint32_t sample);
 uint32_t wm8750_adc_dat(void *opaque);
@@ -70,25 +75,13 @@ void *wm8750_dac_buffer(void *opaque, int samples);
 void wm8750_dac_commit(void *opaque);
 void wm8750_set_bclk_in(void *opaque, int new_hz);
 
-/* ssd0303.c */
-void ssd0303_init(i2c_bus *bus, int address);
-
-/* twl92230.c */
-i2c_slave *twl92230_init(i2c_bus *bus, qemu_irq irq);
-qemu_irq *twl92230_gpio_in_get(i2c_slave *i2c);
-void twl92230_gpio_out_set(i2c_slave *i2c, int line, qemu_irq handler);
-
 /* tmp105.c */
-struct i2c_slave *tmp105_init(i2c_bus *bus, qemu_irq alarm);
-void tmp105_reset(i2c_slave *i2c);
 void tmp105_set(i2c_slave *i2c, int temp);
 
 /* lm832x.c */
-struct i2c_slave *lm8323_init(i2c_bus *bus, qemu_irq nirq);
-void lm832x_key_event(struct i2c_slave *i2c, int key, int state);
+void lm832x_key_event(i2c_slave *i2c, int key, int state);
 
 /* twl4030.c */
-struct twl4030_s;
-struct twl4030_s *twl4030_init(i2c_bus *bus, qemu_irq irq);
+void *twl4030_init(i2c_bus *gp_bus, qemu_irq irq);
 
 #endif