Change read_bit() to return 0 or -1UL, rather than 0 or 1.
[gpxe.git] / src / include / gpxe / i2c.h
1 #ifndef _GPXE_I2C_H
2 #define _GPXE_I2C_H
3
4 /** @file
5  *
6  * I2C interface
7  *
8  */
9
10 #include <stdint.h>
11
12 /** An I2C device
13  *
14  * An I2C device represents a specific slave device on an I2C bus.  It
15  * is accessed via an I2C interface.
16  */
17 struct i2c_device {
18         /** Address of this device */
19         unsigned int address;
20         /** Flag indicating a ten-bit address format */
21         int tenbit;
22 };
23
24 /** An I2C interface
25  *
26  * An I2C interface provides access to an I2C bus, via which I2C
27  * devices may be reached.
28  */
29 struct i2c_interface {
30         /**
31          * Read data from I2C device
32          *
33          * @v i2c               I2C interface
34          * @v i2cdev            I2C device
35          * @v offset            Starting offset within the device
36          * @v data              Data buffer
37          * @v len               Length of data buffer
38          * @ret rc              Return status code
39          */
40         int ( * read ) ( struct i2c_interface *i2c, struct i2c_device *i2cdev,
41                          unsigned int offset, uint8_t *data,
42                          unsigned int len );
43         /**
44          * Write data to I2C device
45          *
46          * @v i2c               I2C interface
47          * @v i2cdev            I2C device
48          * @v offset            Starting offset within the device
49          * @v data              Data buffer
50          * @v len               Length of data buffer
51          * @ret rc              Return status code
52          */
53         int ( * write ) ( struct i2c_interface *i2c, struct i2c_device *i2cdev,
54                           unsigned int offset, const uint8_t *data,
55                           unsigned int len );
56 };
57
58 /** A bit-bashing I2C interface
59  *
60  * This provides a standardised way to construct I2C buses via a
61  * bit-bashing interface.
62  */
63 struct i2c_bit_basher {
64         /** I2C interface */
65         struct i2c_interface i2c;
66         /** Bit-bashing interface */
67         struct bit_basher basher;
68 };
69
70 /** Ten-bit address marker
71  *
72  * This value is ORed with the I2C device address to indicate a
73  * ten-bit address format on the bus.
74  */
75 #define I2C_TENBIT_ADDRESS 0x7800
76
77 /** An I2C write command */
78 #define I2C_WRITE 0
79
80 /** An I2C read command */
81 #define I2C_READ 1
82
83 /** Bit indices used for I2C bit-bashing interface */
84 enum {
85         /** Serial clock */
86         I2C_BIT_SCL = 0,
87         /** Serial data */
88         I2C_BIT_SDA,
89 };
90
91 /** Delay required for bit-bashing operation */
92 #define I2C_UDELAY 5
93
94 /**
95  * Check presence of I2C device
96  *
97  * @v i2c               I2C interface
98  * @v i2cdev            I2C device
99  * @ret rc              Return status code
100  *
101  * Checks for the presence of the device on the I2C bus by attempting
102  * a zero-length write.
103  */
104 static inline int i2c_check_presence ( struct i2c_interface *i2c,
105                                        struct i2c_device *i2cdev ) {
106         return i2c->write ( i2c, i2cdev, 0, NULL, 0 );
107 }
108
109 extern void init_i2c_bit_basher ( struct i2c_bit_basher *i2cbit );
110
111 #endif /* _GPXE_I2C_H */