Documentation/i2c/i2c-address-translators.rst
.. SPDX-License-Identifier: GPL-2.0
Author: Luca Ceresoli [email protected] Author: Tomi Valkeinen [email protected]
An I2C Address Translator (ATR) is a device with an I2C slave parent ("upstream") port and N I2C master child ("downstream") ports, and forwards transactions from upstream to the appropriate downstream port with a modified slave address. The address used on the parent bus is called the "alias" and is (potentially) different from the physical slave address of the child bus. Address translation is done by the hardware.
An ATR looks similar to an i2c-mux except:
The ATR functionality can be provided by a chip with many other features. The kernel i2c-atr provides a helper to implement an ATR within a driver.
The ATR creates a new I2C "child" adapter on each child bus. Adding devices on the child bus ends up in invoking the driver code to select an available alias. Maintaining an appropriate pool of available aliases and picking one for each new device is up to the driver implementer. The ATR maintains a table of currently assigned alias and uses it to modify all I2C transactions directed to devices on the child buses.
A typical example follows.
Topology::
Slave X @ 0x10
.-----. |
.-----. | |---+---- B
| CPU |--A--| ATR |
-----' | |---+---- C -----' |
Slave Y @ 0x10
Alias table:
A, B and C are three physical I2C busses, electrically independent from each other. The ATR receives the transactions initiated on bus A and propagates them on bus B or bus C or none depending on the device address in the transaction and based on the alias table.
Alias table:
.. table::
=============== ===== Client Alias =============== ===== X (bus B, 0x10) 0x20 Y (bus C, 0x10) 0x30 =============== =====
Transaction:
Usage:
.. kernel-doc:: include/linux/i2c-atr.h