Skip to content

Commit cfa0327

Browse files
Wolfram SangWolfram Sang
authored andcommitted
i2c: support 10 bit and slave addresses in sysfs 'new_device'
We now have seperate address spaces for 10 bit and we-are-slave clients. Update the sysfs device instantiation method to support these types by accepting the address offsets that are assigned to the extra address spaces. Update the documentation, too. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
1 parent 9bccc70 commit cfa0327

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

Documentation/i2c/slave-interface

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@ User manual
3131
===========
3232

3333
I2C slave backends behave like standard I2C clients. So, you can instantiate
34-
them as described in the document 'instantiating-devices'. A quick example for
35-
instantiating the slave-eeprom driver from userspace at address 0x64 on bus 1:
34+
them as described in the document 'instantiating-devices'. The only difference
35+
is that i2c slave backends have their own address space. So, you have to add
36+
0x1000 to the address you would originally request. An example for
37+
instantiating the slave-eeprom driver from userspace at the 7 bit address 0x64
38+
on bus 1:
3639

37-
# echo slave-24c02 0x64 > /sys/bus/i2c/devices/i2c-1/new_device
40+
# echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-1/new_device
3841

3942
Each backend should come with separate documentation to describe its specific
4043
behaviour and setup.

Documentation/i2c/ten-bit-addresses

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ The I2C protocol knows about two kinds of device addresses: normal 7 bit
22
addresses, and an extended set of 10 bit addresses. The sets of addresses
33
do not intersect: the 7 bit address 0x10 is not the same as the 10 bit
44
address 0x10 (though a single device could respond to both of them).
5+
To avoid ambiguity, the user sees 10 bit addresses mapped to a different
6+
address space, namely 0xa000-0xa3ff. The leading 0xa (= 10) represents the
7+
10 bit mode. This is used for creating device names in sysfs. It is also
8+
needed when instantiating 10 bit devices via the new_device file in sysfs.
59

610
I2C messages to and from 10-bit address devices have a different format.
711
See the I2C specification for the details.

drivers/i2c/i2c-core.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1158,6 +1158,16 @@ i2c_sysfs_new_device(struct device *dev, struct device_attribute *attr,
11581158
return -EINVAL;
11591159
}
11601160

1161+
if ((info.addr & I2C_ADDR_OFFSET_TEN_BIT) == I2C_ADDR_OFFSET_TEN_BIT) {
1162+
info.addr &= ~I2C_ADDR_OFFSET_TEN_BIT;
1163+
info.flags |= I2C_CLIENT_TEN;
1164+
}
1165+
1166+
if (info.addr & I2C_ADDR_OFFSET_SLAVE) {
1167+
info.addr &= ~I2C_ADDR_OFFSET_SLAVE;
1168+
info.flags |= I2C_CLIENT_SLAVE;
1169+
}
1170+
11611171
client = i2c_new_device(adap, &info);
11621172
if (!client)
11631173
return -EINVAL;
@@ -1209,7 +1219,7 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr,
12091219
i2c_adapter_depth(adap));
12101220
list_for_each_entry_safe(client, next, &adap->userspace_clients,
12111221
detected) {
1212-
if (client->addr == addr) {
1222+
if (i2c_encode_flags_to_addr(client) == addr) {
12131223
dev_info(dev, "%s: Deleting device %s at 0x%02hx\n",
12141224
"delete_device", client->name, client->addr);
12151225

0 commit comments

Comments
 (0)