diff options
author | Marc Kleine-Budde <mkl@pengutronix.de> | 2009-11-21 20:17:22 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2009-12-03 10:44:42 +0100 |
commit | 0d870824a49b8bdd217f644a720b4e75a22adb1a (patch) | |
tree | 26b3d3f44ac01ae0b101db700c4ef758e8174aef /include/i2c | |
parent | 28948a4b4522667cb61ef2ce2f6299c091cd0416 (diff) | |
download | barebox-0d870824a49b8bdd217f644a720b4e75a22adb1a.tar.gz barebox-0d870824a49b8bdd217f644a720b4e75a22adb1a.tar.xz |
i2c: new framework
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'include/i2c')
-rw-r--r-- | include/i2c/i2c.h | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/include/i2c/i2c.h b/include/i2c/i2c.h new file mode 100644 index 0000000000..670898ba4a --- /dev/null +++ b/include/i2c/i2c.h @@ -0,0 +1,124 @@ +/* + * i2c.h - definitions for the u-boot-v2 i2c framework + * + * Copyricht (C) 2009 by Marc Kleine-Budde <mkl@pengutronix.de> + * + * This file is released under the GPLv2 + * + * Derived from: + * - i2c.h - i.MX I2C driver header file + * Copyright (c) 2008, Darius Augulis <augulis.darius@gmail.com> + * - i2c.h - definitions for the i2c-bus interface + * Copyright (C) 1995-2000 Simon G. Vogl + * + */ + +#ifndef I2C_I2C_H +#define I2C_I2C_H + +/* + * struct i2c_platform_data - structure of platform data for MXC I2C driver + * @param bitrate Bus speed measured in Hz + * + */ +struct i2c_platform_data { + int bitrate; +}; + +#define I2C_NAME_SIZE 20 + +#define I2C_M_RD 0x0001 /* read data, from slave to master */ + +/** + * struct i2c_msg - an I2C transaction segment beginning with START + * + * An i2c_msg is the low level representation of one segment of an I2C + * transaction. It is visible to drivers in the @i2c_transfer() + * procedure and to I2C adapter drivers through the + * @i2c_adapter.@master_xfer() method. + * + * All I2C adapters implement the standard rules for I2C transactions. + * Each transaction begins with a START. That is followed by the + * slave address, and a bit encoding read versus write. Then follow + * all the data bytes, The transfer terminates with a NAK, or when all + * those bytes have been transferred and ACKed. If this is the last + * message in a group, it is followed by a STOP. Otherwise it is + * followed by the next @i2c_msg transaction segment, beginning with a + * (repeated) START. + * + */ +struct i2c_msg { + __u8 *buf; /**< The buffer into which data is read, or from which it's written. */ + __u16 addr; /**< Slave address, seven bits */ + __u16 flags; /**< I2C_M_RD is handled by all adapters */ + __u16 len; /**< Number of data bytes in @buf being read from or written to the I2C slave address. */ +}; + + +/** + * i2c_adapter is the structure used to identify a physical i2c bus + * along with the access algorithms necessary to access it. + * + */ +struct i2c_adapter { + struct device_d *dev; /* ptr to device */ + int nr; /* bus number */ + int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); +}; + + +struct i2c_client { + struct device_d dev; + struct i2c_adapter *adapter; + unsigned short addr; +}; + +#define to_i2c_client(a) container_of(a, struct i2c_client, dev) + + +/** + * struct i2c_board_info - template for device creation + * + * I2C doesn't actually support hardware probing, Drivers commonly + * need more information than that, such as chip type, configuration, + * and so on. + * + * i2c_board_info is used to build tables of information listing I2C + * devices that are present. This information is used to grow the + * driver model tree. For mainboards this is done statically using + * i2c_register_board_info(); bus numbers identify adapters that + * aren't yet available. For add-on boards, i2c_new_device() does this + * dynamically with the adapter already known. + */ +struct i2c_board_info { + char type[I2C_NAME_SIZE]; /**< name of device */ + unsigned short addr; /**< stored in i2c_client.addr */ +}; + +/** + * I2C_BOARD_INFO - macro used to list an i2c device and its address + * @dev_type: identifies the device type + * @dev_addr: the device's address on the bus. + * + * This macro initializes essential fields of a struct i2c_board_info, + * declaring what has been provided on a particular board. Optional + * fields (such as associated irq, or device-specific platform_data) + * are provided using conventional syntax. + */ +#define I2C_BOARD_INFO(dev_type, dev_addr) \ + .type = dev_type, .addr = (dev_addr) + +extern int i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned n); +extern int i2c_add_numbered_adapter(struct i2c_adapter *adapter); + +extern int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); +extern int i2c_master_send(struct i2c_client *client, const char *buf, int count); +extern int i2c_master_recv(struct i2c_client *client, char *buf, int count); + + +#define I2C_ADDR_16_BIT (1 << 31) + +extern int i2c_read_reg(struct i2c_client *client, u32 addr, u8 *buf, u16 count); +extern int i2c_write_reg(struct i2c_client *client, u32 addr, const u8 *buf, u16 count); + +#endif /* I2C_I2C_H */ |