Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Wolfram Sang and committed by
Wolfram Sang
cfa0327b 9bccc70a

+21 -4
+6 -3
Documentation/i2c/slave-interface
··· 31 31 =========== 32 32 33 33 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: 36 39 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 38 41 39 42 Each backend should come with separate documentation to describe its specific 40 43 behaviour and setup.
+4
Documentation/i2c/ten-bit-addresses
··· 2 2 addresses, and an extended set of 10 bit addresses. The sets of addresses 3 3 do not intersect: the 7 bit address 0x10 is not the same as the 10 bit 4 4 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. 5 9 6 10 I2C messages to and from 10-bit address devices have a different format. 7 11 See the I2C specification for the details.
+11 -1
drivers/i2c/i2c-core.c
··· 1158 1158 return -EINVAL; 1159 1159 } 1160 1160 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 + 1161 1171 client = i2c_new_device(adap, &info); 1162 1172 if (!client) 1163 1173 return -EINVAL; ··· 1219 1209 i2c_adapter_depth(adap)); 1220 1210 list_for_each_entry_safe(client, next, &adap->userspace_clients, 1221 1211 detected) { 1222 - if (client->addr == addr) { 1212 + if (i2c_encode_flags_to_addr(client) == addr) { 1223 1213 dev_info(dev, "%s: Deleting device %s at 0x%02hx\n", 1224 1214 "delete_device", client->name, client->addr); 1225 1215