All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thierry Reding <thierry.reding@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 13/40] i2c: Add high-level API
Date: Tue, 26 Aug 2014 17:34:01 +0200	[thread overview]
Message-ID: <1409067268-956-14-git-send-email-thierry.reding@gmail.com> (raw)
In-Reply-To: <1409067268-956-1-git-send-email-thierry.reding@gmail.com>

From: Thierry Reding <treding@nvidia.com>

This API operates on I2C adapters or I2C clients (a new type of object
that refers to a particular slave connected to an adapter). This is
useful to avoid having to call i2c_set_bus_num() whenever a device is
being accessed.

Drivers for I2C devices are supposed to embed a struct i2c_client within
a driver-specific data structure and call i2c_client_init() on it,
passing in a pointer to the parent I2C adapter and the slave address of
the device.

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
 drivers/i2c/i2c_core.c | 53 ++++++++++++++++++++++++++++
 include/i2c.h          | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 149 insertions(+)

diff --git a/drivers/i2c/i2c_core.c b/drivers/i2c/i2c_core.c
index f6179a16244b..88c7af546b0b 100644
--- a/drivers/i2c/i2c_core.c
+++ b/drivers/i2c/i2c_core.c
@@ -410,3 +410,56 @@ void __i2c_init(int speed, int slaveaddr)
 }
 void i2c_init(int speed, int slaveaddr)
 	__attribute__((weak, alias("__i2c_init")));
+
+struct i2c_adapter *i2c_adapter_get(unsigned int index)
+{
+	struct i2c_adapter *adapter = ll_entry_start(struct i2c_adapter, i2c);
+	unsigned int num = ll_entry_count(struct i2c_adapter, i2c);
+	unsigned int i;
+
+	if (index >= num)
+		return NULL;
+
+	for (i = 0; i < index; i++)
+		adapter++;
+
+	i2c_adapter_init(adapter, adapter->speed, adapter->slaveaddr);
+	return adapter;
+}
+
+int i2c_adapter_read(struct i2c_adapter *adapter, uint8_t chip,
+		     unsigned int address, size_t alen, void *buffer,
+		     size_t size)
+{
+	return adapter->read(adapter, chip, address, alen, buffer, size);
+}
+
+int i2c_adapter_write(struct i2c_adapter *adapter, uint8_t chip,
+		      unsigned int address, size_t alen, void *buffer,
+		      size_t size)
+{
+	return adapter->write(adapter, chip, address, alen, buffer, size);
+}
+
+int i2c_client_init(struct i2c_client *client, struct i2c_adapter *adapter,
+		    uint8_t address)
+{
+	client->adapter = adapter;
+	client->address = address;
+
+	return 0;
+}
+
+int i2c_client_read(struct i2c_client *client, unsigned int address,
+		    size_t alen, void *buffer, size_t size)
+{
+	return i2c_adapter_read(client->adapter, client->address, address,
+				alen, buffer, size);
+}
+
+int i2c_client_write(struct i2c_client *client, unsigned int address,
+		     size_t alen, void *buffer, size_t size)
+{
+	return i2c_adapter_write(client->adapter, client->address, address,
+				 alen, buffer, size);
+}
diff --git a/include/i2c.h b/include/i2c.h
index 1b4078ed62fe..8f73ba93c614 100644
--- a/include/i2c.h
+++ b/include/i2c.h
@@ -55,6 +55,20 @@
 #define CONFIG_SYS_SPD_BUS_NUM		0
 #endif
 
+/**
+ * struct i2c_adapter - I2C adapter
+ * @init: initialize I2C adapter
+ * @probe: probe for a device on the I2C bus
+ * @read: read data from a device on the I2C bus
+ * @write: write data to a device on the I2C bus
+ * @set_bus_speed: configure the I2C bus speed
+ * @speed: current I2C bus speed
+ * @waitdelay:
+ * @slaveaddr: own address (when used as a slave)
+ * @init_done: flag to indicate whether or not the adapter has been initialized
+ * @hwadapnr: the hardware number of this adapter
+ * @name: name of this adapter
+ */
 struct i2c_adapter {
 	void		(*init)(struct i2c_adapter *adap, int speed,
 				int slaveaddr);
@@ -75,6 +89,16 @@ struct i2c_adapter {
 	char		*name;
 };
 
+/**
+ * struct i2c_client - I2C slave
+ * @adapter: I2C adapter providing the slave's parent bus
+ * address: address of the I2C slave on the parent bus
+ */
+struct i2c_client {
+	struct i2c_adapter *adapter;
+	unsigned int address;
+};
+
 #define U_BOOT_I2C_MKENT_COMPLETE(_init, _probe, _read, _write, \
 		_set_speed, _speed, _slaveaddr, _hwadapnr, _name) \
 	{ \
@@ -271,6 +295,78 @@ unsigned int i2c_get_bus_speed(void);
  * Adjusts I2C pointers after U-Boot is relocated to DRAM
  */
 void i2c_reloc_fixup(void);
+
+/*
+ * i2c_adapter_get() - get the I2C adapter associated with a given index
+ * @index: index of the I2C adapter
+ */
+struct i2c_adapter *i2c_adapter_get(unsigned int index);
+
+/*
+ * i2c_adapter_read() - read data from an I2C slave at a given address
+ * @adapter: I2C adapter
+ * @chip: address of the I2C slave to read from
+ * @address: address within the I2C slave to read from
+ * @alen: length of address
+ * @buffer: buffer to receive data from I2C slave
+ * @size: number of bytes to read
+ */
+int i2c_adapter_read(struct i2c_adapter *adapter, uint8_t chip,
+		     unsigned int address, size_t alen, void *buffer,
+		     size_t size);
+
+/*
+ * i2c_adapter_write() - write data to an I2C slave at a given address
+ * @adapter: I2C adapter
+ * @chip: address of the I2C slave to write to
+ * @address: address within the I2C slave to write to
+ * @alen: length of address
+ * @buffer: buffer containing the data to write
+ * @size: number of bytes to write
+ *
+ * Ideally the function would take a const void * buffer, but the underlying
+ * infrastructure doesn't properly propagate const and adding it here would
+ * cause a lot of build warnings.
+ */
+int i2c_adapter_write(struct i2c_adapter *adapter, uint8_t chip,
+		      unsigned int address, size_t alen, void *buffer,
+		      size_t size);
+
+/*
+ * i2c_client_init() - initialize an I2C slave
+ * @client: I2C slave
+ * @adapter: parent I2C adapter
+ * @address: address of I2C slave
+ */
+int i2c_client_init(struct i2c_client *client, struct i2c_adapter *adapter,
+		    uint8_t address);
+
+/*
+ * i2c_client_read() - read data from an I2C slave
+ * @client: I2C slave
+ * @address: address within the I2C slave to read from
+ * @alen: length of address
+ * @buffer: buffer to receive data from I2C slave
+ * @size: number of bytes to read
+ */
+int i2c_client_read(struct i2c_client *client, unsigned int address,
+		    size_t alen, void *buffer, size_t size);
+
+/*
+ * i2c_client_write() - write data to an I2C slave
+ * @client: I2C slave
+ * @address: address within the I2C slave to write to
+ * @alen: length of address
+ * @buffer: buffer containing the data to write
+ * @size: number of bytes to write
+ *
+ * Ideally the function would take a const void * buffer, but the underlying
+ * infrastructure doesn't properly propagate const and adding it here would
+ * cause a lot of build warnings.
+ */
+int i2c_client_write(struct i2c_client *client, unsigned int address,
+		     size_t alen, void *buffer, size_t size);
+
 #if defined(CONFIG_SYS_I2C_SOFT)
 void i2c_soft_init(void);
 void i2c_soft_active(void);
-- 
2.0.4

  parent reply	other threads:[~2014-08-26 15:34 UTC|newest]

Thread overview: 104+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-26 15:33 [U-Boot] [PATCH v2 00/40] ARM: tegra: Add PCIe support Thierry Reding
2014-08-26 15:33 ` [U-Boot] [PATCH v2 01/40] vsprintf: Add modifier for phys_addr_t Thierry Reding
2014-08-26 17:04   ` Stephen Warren
2014-08-27  7:01     ` Thierry Reding
2014-08-27 17:41       ` Stephen Warren
2014-08-28 10:38         ` Thierry Reding
2014-09-17  0:44           ` [U-Boot] [U-Boot, v2, " Tom Rini
2014-08-26 23:14   ` [U-Boot] [PATCH v2 " Simon Glass
2014-08-27  7:37     ` Thierry Reding
2014-08-27 15:24       ` Simon Glass
2014-08-26 15:33 ` [U-Boot] [PATCH v2 02/40] fdt: Add a function to count strings Thierry Reding
2014-08-27 18:51   ` Simon Glass
2014-09-08 15:01     ` Simon Glass
2014-08-26 15:33 ` [U-Boot] [PATCH v2 03/40] fdt: Add a function to get the index of a string Thierry Reding
2014-08-27 18:51   ` Simon Glass
2014-09-08 15:02     ` Simon Glass
2014-08-26 15:33 ` [U-Boot] [PATCH v2 04/40] fdt: Add functions to retrieve strings Thierry Reding
2014-08-27 18:53   ` Simon Glass
2014-09-08 15:02     ` Simon Glass
2015-03-25 23:23       ` Simon Glass
2015-07-14 19:48         ` Simon Glass
2015-07-15 11:17           ` Thierry Reding
2015-07-15 11:35             ` Albert ARIBAUD
2015-07-15 11:52               ` Thierry Reding
2014-08-26 15:33 ` [U-Boot] [PATCH v2 05/40] fdt: Add resource parsing functions Thierry Reding
2014-08-27 18:53   ` Simon Glass
2014-09-08 15:02   ` Simon Glass
2014-08-26 15:33 ` [U-Boot] [PATCH v2 06/40] fdt: Add a function to return PCI BDF triplet Thierry Reding
2014-09-08 15:03   ` Simon Glass
2014-08-26 15:33 ` [U-Boot] [PATCH v2 07/40] fdt: Add a subnodes iterator macro Thierry Reding
2014-09-08 15:03   ` Simon Glass
2014-08-26 15:33 ` [U-Boot] [PATCH v2 08/40] pci: Abort early if bus does not exist Thierry Reding
2014-08-26 15:33 ` [U-Boot] [PATCH v2 09/40] pci: Honour pci_skip_dev() Thierry Reding
2014-08-26 15:33 ` [U-Boot] [PATCH v2 10/40] Add pr_fmt() macro Thierry Reding
2014-08-26 15:33 ` [U-Boot] [PATCH v2 11/40] i2c: Initialize the correct bus Thierry Reding
2014-08-27  4:52   ` Heiko Schocher
2014-08-27  5:12     ` Thierry Reding
2014-08-27  5:26       ` Heiko Schocher
2014-08-26 15:34 ` [U-Boot] [PATCH v2 12/40] i2c: Refactor adapter initialization Thierry Reding
2014-08-26 15:34 ` Thierry Reding [this message]
2014-08-27  5:21   ` [U-Boot] [PATCH v2 13/40] i2c: Add high-level API Heiko Schocher
2014-08-27  6:21     ` Thierry Reding
2014-08-27  7:07       ` Heiko Schocher
2014-08-27  8:51         ` Thierry Reding
2014-08-27  9:56           ` Heiko Schocher
2014-08-27 11:41             ` Thierry Reding
2014-08-27 19:10               ` Simon Glass
2014-08-28  9:53                 ` Heiko Schocher
2014-08-26 15:34 ` [U-Boot] [PATCH v2 14/40] i2c: tegra: Implement i2c_get_bus_num_fdt() Thierry Reding
2014-09-02 19:24   ` Simon Glass
2014-08-26 15:34 ` [U-Boot] [PATCH v2 15/40] power: Add AMS AS3722 PMIC support Thierry Reding
2014-08-27  5:26   ` Heiko Schocher
2014-08-27  6:28     ` Thierry Reding
2014-08-27  7:18       ` Heiko Schocher
2014-08-26 15:34 ` [U-Boot] [PATCH v2 16/40] ARM: tegra: Implement tegra_plle_enable() Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 17/40] ARM: tegra: Provide PCIEXCLK reset ID Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 18/40] ARM: tegra: Implement powergate support Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 19/40] ARM: tegra: Implement XUSB pad controller Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 20/40] ARM: tegra: Add XUSB pad controller on Tegra124 Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 21/40] ARM: tegra: Enable XUSB pad controller on Jetson TK1 Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 22/40] pci: tegra: Add Tegra PCIe driver Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 23/40] ARM: tegra: Add Tegra20 PCIe device tree node Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 24/40] ARM: tegra: Enable PCIe on TrimSlice Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 25/40] ARM: tegra: Add GIC for Tegra30 Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 26/40] ARM: tegra: Add Tegra30 PCIe device tree node Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 27/40] ARM: tegra: Enable PCIe on Cardhu Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 28/40] ARM: tegra: Enable PCIe on Beaver Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 29/40] ARM: tegra: Add GIC for Tegra124 Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 30/40] ARM: tegra: Add Tegra124 PCIe device tree node Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 31/40] ARM: tegra: Enable PCIe on Jetson TK1 Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 32/40] ARM: cache_v7: Various minor cleanups Thierry Reding
2014-08-27 18:56   ` Simon Glass
2014-11-08  8:30   ` Albert ARIBAUD
2014-08-26 15:34 ` [U-Boot] [PATCH v2 33/40] ARM: cache-cp15: Use more accurate types Thierry Reding
2014-08-27 18:57   ` Simon Glass
2014-11-08  8:31   ` Albert ARIBAUD
2014-08-26 15:34 ` [U-Boot] [PATCH v2 34/40] malloc: Output region when debugging Thierry Reding
2014-08-27 18:58   ` Simon Glass
2014-11-08  8:31   ` Albert ARIBAUD
2014-08-26 15:34 ` [U-Boot] [PATCH v2 35/40] ARM: Implement non-cached memory support Thierry Reding
2014-08-27 19:07   ` Simon Glass
2014-10-24 19:11   ` Stephen Warren
2014-11-12 15:49     ` Simon Glass
2014-08-26 15:34 ` [U-Boot] [PATCH v2 36/40] ARM: tegra: Enable non-cached memory Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 37/40] net: rtl8169: Honor CONFIG_SYS_RX_ETH_BUFFER Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 38/40] net: rtl8169: Properly align buffers Thierry Reding
2014-11-12 23:37   ` Nobuhiro Iwamatsu
2014-08-26 15:34 ` [U-Boot] [PATCH v2 39/40] net: rtl8169: Use non-cached memory if available Thierry Reding
2014-08-26 15:34 ` [U-Boot] [PATCH v2 40/40] net: rtl8169: Add support for RTL-8168/8111g Thierry Reding
2014-09-11 16:00 ` [U-Boot] [PATCH v2 00/40] ARM: tegra: Add PCIe support Albert ARIBAUD
2014-09-11 16:17   ` Stephen Warren
2014-09-11 19:20     ` Simon Glass
2014-09-18  8:43       ` Albert ARIBAUD
2014-09-18 18:01         ` Simon Glass
2014-10-23  3:07   ` Simon Glass
2014-10-23  8:11     ` Thierry Reding
2014-10-23 18:33       ` Simon Glass
2014-09-28 22:48 ` Simon Glass
2014-09-29  8:11   ` Thierry Reding
2014-09-29 13:54     ` Simon Glass
2014-10-06 12:24     ` Heiko Schocher
2014-10-26 19:07 ` Albert ARIBAUD
2014-10-26 19:29   ` Albert ARIBAUD
2014-10-27 23:55   ` Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1409067268-956-14-git-send-email-thierry.reding@gmail.com \
    --to=thierry.reding@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.