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

i2c: take address space into account when checking for used addresses

It is not enough to compare the plain address value, we also need to
check the flags enabling a different address space. E.g. it is valid to
have address 0x50 as a 7-bit address and 0x050 as 10-bit address on the
same bus. Same for addresses when we are the slave.

Tested-by: Andrey Danin <danindrey@mail.ru>
Acked-by: Stephen Warren <swarren@nvidia.com>
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
9bccc70a b4e2f6ac

+4 -4
+4 -4
drivers/i2c/i2c-core.c
··· 839 839 struct i2c_client *client = i2c_verify_client(dev); 840 840 int addr = *(int *)addrp; 841 841 842 - if (client && client->addr == addr) 842 + if (client && i2c_encode_flags_to_addr(client) == addr) 843 843 return -EBUSY; 844 844 return 0; 845 845 } ··· 993 993 } 994 994 995 995 /* Check for address business */ 996 - status = i2c_check_addr_busy(adap, client->addr); 996 + status = i2c_check_addr_busy(adap, i2c_encode_flags_to_addr(client)); 997 997 if (status) 998 998 goto out_err; 999 999 ··· 2315 2315 return err; 2316 2316 } 2317 2317 2318 - /* Skip if already in use */ 2318 + /* Skip if already in use (7 bit, no need to encode flags) */ 2319 2319 if (i2c_check_addr_busy(adapter, addr)) 2320 2320 return 0; 2321 2321 ··· 2431 2431 continue; 2432 2432 } 2433 2433 2434 - /* Check address availability */ 2434 + /* Check address availability (7 bit, no need to encode flags) */ 2435 2435 if (i2c_check_addr_busy(adap, addr_list[i])) { 2436 2436 dev_dbg(&adap->dev, "Address 0x%02x already in " 2437 2437 "use, not probing\n", addr_list[i]);