diff options
author | Bartosz Golaszewski <brgl@bgdev.pl> | 2018-03-23 11:05:07 +0300 |
---|---|---|
committer | Bartosz Golaszewski <brgl@bgdev.pl> | 2018-05-16 15:42:46 +0300 |
commit | 73b0d922cd5be4219eb5528a961714d740291b0e (patch) | |
tree | a732df59867ffc3d288323f0f2a6480d856de1e3 | |
parent | 39933e0fd501791bda9393c78ed0aece2188acf2 (diff) | |
download | linux-73b0d922cd5be4219eb5528a961714d740291b0e.tar.xz |
eeprom: at24: provide a separate routine for creating dummy i2c clients
Move the code responsible for creating the dummy i2c clients used by
chips taking multiple slave addresses to a separate function.
Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
Reviewed-by: Peter Rosin <peda@axentia.se>
-rw-r--r-- | drivers/misc/eeprom/at24.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 4819e2df591d..f5cc517d1131 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c @@ -540,6 +540,37 @@ static void at24_remove_dummy_clients(struct at24_data *at24) i2c_unregister_device(at24->client[i].client); } +static int at24_make_dummy_client(struct at24_data *at24, unsigned int index, + struct regmap_config *regmap_config) +{ + struct i2c_client *base_client, *dummy_client; + unsigned short int addr; + struct regmap *regmap; + struct device *dev; + + base_client = at24->client[0].client; + dev = &base_client->dev; + addr = base_client->addr + index; + + dummy_client = i2c_new_dummy(base_client->adapter, + base_client->addr + index); + if (!dummy_client) { + dev_err(dev, "address 0x%02x unavailable\n", addr); + return -EADDRINUSE; + } + + regmap = devm_regmap_init_i2c(dummy_client, regmap_config); + if (IS_ERR(regmap)) { + i2c_unregister_device(dummy_client); + return PTR_ERR(regmap); + } + + at24->client[index].client = dummy_client; + at24->client[index].regmap = regmap; + + return 0; +} + static unsigned int at24_get_offset_adj(u8 flags, unsigned int byte_len) { if (flags & AT24_FLAG_MAC) { @@ -645,20 +676,10 @@ static int at24_probe(struct i2c_client *client) /* use dummy devices for multiple-address chips */ for (i = 1; i < num_addresses; i++) { - at24->client[i].client = i2c_new_dummy(client->adapter, - client->addr + i); - if (!at24->client[i].client) { - dev_err(dev, "address 0x%02x unavailable\n", - client->addr + i); - err = -EADDRINUSE; - goto err_clients; - } - at24->client[i].regmap = devm_regmap_init_i2c( - at24->client[i].client, - ®map_config); - if (IS_ERR(at24->client[i].regmap)) { - err = PTR_ERR(at24->client[i].regmap); - goto err_clients; + err = at24_make_dummy_client(at24, i, ®map_config); + if (err) { + at24_remove_dummy_clients(at24); + return err; } } |