Tizen 2.1 base
[sdk/emulator/qemu.git] / hw / i2c-addressable.h
1 #ifndef QEMU_I2C_ADDRESSABLE_H
2 #define QEMU_I2C_ADDRESSABLE_H
3
4 /*
5  * Interface to support I2C devices with control registers accessed by I2C
6  *
7  * Contributed by Alexey Merkulov <steelart@ispras.ru>
8  *                Dmitry Zhurikhin <zhur@ispras.ru>
9  *                Vladimir Monakhov <vmonakhov@ispras.ru>
10  *
11  * Many I2C devices have common logic which closely corresponds to control
12  * registers.  These devices are first passed with an ID of the needed command
13  * to be performed.  This ID may be considered as control register address.
14  * Then the device is either passed with some data or is awaited to return
15  * some data.  This may be considered as control register write and read
16  * respectively.  This interface provides a generic way to implement such
17  * I2C devices emulation by writing two functions for reading and writing of
18  * control registers similar to iomem interface.  One difference is that
19  * control registers may not have fixed sizes so along with the register
20  * address these functions get another parameter - offset inside this register
21  * data.
22  */
23
24 #include "i2c.h"
25
26 #define I2CADDR_SLAVE_FROM_QDEV(dev) DO_UPCAST(I2CAddressableState, i2c.qdev, dev)
27 #define FROM_I2CADDR_SLAVE(type, dev) DO_UPCAST(type, i2c_addressable, dev)
28
29 typedef struct I2CAddressableState {
30     /* I2C slave for the device */
31     i2c_slave i2c;
32     /* Address of currently processing data */
33     uint32_t addr;
34     /* Number of transferred bytes */
35     uint8_t num;
36 } I2CAddressableState;
37
38 typedef uint8_t (*i2c_addressable_read)  (void *opaque, uint32_t address,
39                                           uint8_t offset);
40 typedef void    (*i2c_addressable_write) (void *opaque, uint32_t address,
41                                           uint8_t offset, uint8_t val);
42 typedef int     (*i2c_addressable_init)  (I2CAddressableState *i2c);
43
44 typedef struct I2CAddressableDeviceInfo {
45     I2CSlaveInfo i2c;
46
47     /* Read, write and init handlers */
48     i2c_addressable_read  read;
49     i2c_addressable_write write;
50     i2c_addressable_init  init;
51
52     /* Size of passed addresses in bytes */
53     int size;
54     /* Byte order: reversed is big-endian (more significant bytes come before
55      * less significant ones) */
56     int rev;
57 } I2CAddressableDeviceInfo;
58
59 void i2c_addressable_register_device(I2CAddressableDeviceInfo *info);
60
61 #endif