summaryrefslogtreecommitdiffstats
path: root/include/i2c
diff options
context:
space:
mode:
authorMarc Kleine-Budde <mkl@pengutronix.de>2009-11-21 20:17:22 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2009-12-03 10:44:42 +0100
commit0d870824a49b8bdd217f644a720b4e75a22adb1a (patch)
tree26b3d3f44ac01ae0b101db700c4ef758e8174aef /include/i2c
parent28948a4b4522667cb61ef2ce2f6299c091cd0416 (diff)
downloadbarebox-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.h124
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 */