aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
authorBartosz Golaszewski <bgolaszewski@baylibre.com>2016-08-12 07:32:57 -0400
committerWolfram Sang <wsa@the-dreams.de>2016-08-22 02:19:58 -0400
commit00f0ea70d2b82b7d7afeb1bdedc9169eb8ea6675 (patch)
tree9ff72c2731c936fd922b006edbf421282b8a2c8e /drivers/misc
parent56025e7bc2079cda92643b43bf26991d3d09717d (diff)
eeprom: at24: check if the chip is functional in probe()
The at24 driver doesn't check if the chip is functional in its probe function. This leads to instantiating devices that are not physically present. For example the cape EEPROMs for BeagleBone Black are defined in the device tree at four addresses on i2c2, but normally only one of them is present. If the userspace doesn't know the location in advance, it will need to check if reading the nvmem attributes fails to determine which EEPROM is actually there. Try to read a single byte in probe() and bail-out with -ENODEV if the read fails. Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/eeprom/at24.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
index 3cdf8e1ca0ad..051b14766ef9 100644
--- a/drivers/misc/eeprom/at24.c
+++ b/drivers/misc/eeprom/at24.c
@@ -593,6 +593,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
593 struct at24_data *at24; 593 struct at24_data *at24;
594 int err; 594 int err;
595 unsigned i, num_addresses; 595 unsigned i, num_addresses;
596 u8 test_byte;
596 597
597 if (client->dev.platform_data) { 598 if (client->dev.platform_data) {
598 chip = *(struct at24_platform_data *)client->dev.platform_data; 599 chip = *(struct at24_platform_data *)client->dev.platform_data;
@@ -743,6 +744,18 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
743 } 744 }
744 } 745 }
745 746
747 i2c_set_clientdata(client, at24);
748
749 /*
750 * Perform a one-byte test read to verify that the
751 * chip is functional.
752 */
753 err = at24_read(at24, 0, &test_byte, 1);
754 if (err) {
755 err = -ENODEV;
756 goto err_clients;
757 }
758
746 at24->nvmem_config.name = dev_name(&client->dev); 759 at24->nvmem_config.name = dev_name(&client->dev);
747 at24->nvmem_config.dev = &client->dev; 760 at24->nvmem_config.dev = &client->dev;
748 at24->nvmem_config.read_only = !writable; 761 at24->nvmem_config.read_only = !writable;
@@ -764,8 +777,6 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
764 goto err_clients; 777 goto err_clients;
765 } 778 }
766 779
767 i2c_set_clientdata(client, at24);
768
769 dev_info(&client->dev, "%u byte %s EEPROM, %s, %u bytes/write\n", 780 dev_info(&client->dev, "%u byte %s EEPROM, %s, %u bytes/write\n",
770 chip.byte_len, client->name, 781 chip.byte_len, client->name,
771 writable ? "writable" : "read-only", at24->write_max); 782 writable ? "writable" : "read-only", at24->write_max);