Commit cbb44514048a250647c6c6b3df27ff62cb71f7d5
Committed by
Jean Delvare
1 parent
cc6bcf7d2e
Exists in
master
and in
6 other branches
i2c: Fix device name for 10-bit slave address
10-bit addresses overlap with traditional 7-bit addresses, leading in device name collisions. Add an arbitrary offset to 10-bit addresses to prevent this collision. The offset was chosen so that the address is still easily recognizable. Signed-off-by: Jean Delvare <khali@linux-fr.org> Acked-by: Wolfram Sang <w.sang@pengutronix.de>
Showing 2 changed files with 22 additions and 18 deletions Side-by-side Diff
Documentation/i2c/ten-bit-addresses
1 | 1 | The I2C protocol knows about two kinds of device addresses: normal 7 bit |
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 | -address 0x10 (though a single device could respond to both of them). You | |
5 | -select a 10 bit address by adding an extra byte after the address | |
6 | -byte: | |
7 | - S Addr7 Rd/Wr .... | |
8 | -becomes | |
9 | - S 11110 Addr10 Rd/Wr | |
10 | -S is the start bit, Rd/Wr the read/write bit, and if you count the number | |
11 | -of bits, you will see the there are 8 after the S bit for 7 bit addresses, | |
12 | -and 16 after the S bit for 10 bit addresses. | |
4 | +address 0x10 (though a single device could respond to both of them). | |
13 | 5 | |
14 | -WARNING! The current 10 bit address support is EXPERIMENTAL. There are | |
15 | -several places in the code that will cause SEVERE PROBLEMS with 10 bit | |
16 | -addresses, even though there is some basic handling and hooks. Also, | |
17 | -almost no supported adapter handles the 10 bit addresses correctly. | |
6 | +I2C messages to and from 10-bit address devices have a different format. | |
7 | +See the I2C specification for the details. | |
18 | 8 | |
19 | -As soon as a real 10 bit address device is spotted 'in the wild', we | |
20 | -can and will add proper support. Right now, 10 bit address devices | |
21 | -are defined by the I2C protocol, but we have never seen a single device | |
22 | -which supports them. | |
9 | +The current 10 bit address support is minimal. It should work, however | |
10 | +you can expect some problems along the way: | |
11 | +* Not all bus drivers support 10-bit addresses. Some don't because the | |
12 | + hardware doesn't support them (SMBus doesn't require 10-bit address | |
13 | + support for example), some don't because nobody bothered adding the | |
14 | + code (or it's there but not working properly.) Software implementation | |
15 | + (i2c-algo-bit) is known to work. | |
16 | +* Some optional features do not support 10-bit addresses. This is the | |
17 | + case of automatic detection and instantiation of devices by their, | |
18 | + drivers, for example. | |
19 | +* Many user-space packages (for example i2c-tools) lack support for | |
20 | + 10-bit addresses. | |
21 | + | |
22 | +Note that 10-bit address devices are still pretty rare, so the limitations | |
23 | +listed above could stay for a long time, maybe even forever if nobody | |
24 | +needs them to be fixed. |
drivers/i2c/i2c-core.c
... | ... | @@ -539,8 +539,10 @@ |
539 | 539 | client->dev.type = &i2c_client_type; |
540 | 540 | client->dev.of_node = info->of_node; |
541 | 541 | |
542 | + /* For 10-bit clients, add an arbitrary offset to avoid collisions */ | |
542 | 543 | dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap), |
543 | - client->addr); | |
544 | + client->addr | ((client->flags & I2C_CLIENT_TEN) | |
545 | + ? 0xa000 : 0)); | |
544 | 546 | status = device_register(&client->dev); |
545 | 547 | if (status) |
546 | 548 | goto out_err; |