An EEPROM which doesn't have an alias will be registered as "eeprom0". When another EEPROM is probed which has "eeprom0" as alias it will fail to probe due to -EEXIST. Use of_alias_get_highest_id() to reserve namespace for EEPROMs with aliases.
Signed-off-by: Sascha Hauer <[email protected]> --- drivers/eeprom/at24.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/eeprom/at24.c b/drivers/eeprom/at24.c index 667d111b349d6941c757da3c6eb46ad7f2bb422e..5dc19800970093fa8c95f36d58d47d8c1db6dcdc 100644 --- a/drivers/eeprom/at24.c +++ b/drivers/eeprom/at24.c @@ -369,7 +369,7 @@ static int at24_probe(struct device *dev) struct at24_platform_data chip; bool writable; struct at24_data *at24; - int err; + int devid, err; unsigned i, num_addresses; const char *devname; const char *alias; @@ -423,10 +423,14 @@ static int at24_probe(struct device *dev) at24->num_addresses = num_addresses; alias = of_alias_get(dev->of_node); - if (alias) + if (alias) { devname = alias; - else + devid = NVMEM_DEVID_NONE; + } else { devname = "eeprom"; + devid = get_free_deviceid_from(devname, + of_alias_get_highest_id(devname) + 1); + } writable = !(chip.flags & AT24_FLAG_READONLY); @@ -481,7 +485,7 @@ static int at24_probe(struct device *dev) at24->nvmem_config.stride = 1; at24->nvmem_config.word_size = 1; at24->nvmem_config.size = chip.byte_len; - at24->nvmem_config.id = alias ? NVMEM_DEVID_NONE : NVMEM_DEVID_AUTO; + at24->nvmem_config.id = devid; at24->nvmem = nvmem_register(&at24->nvmem_config); err = PTR_ERR_OR_ZERO(at24->nvmem); -- 2.47.3
