aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/tmp401.c
diff options
context:
space:
mode:
authorBartosz Golaszewski <bgolaszewski@baylibre.com>2014-12-04 11:45:53 -0500
committerGuenter Roeck <linux@roeck-us.net>2014-12-04 14:00:44 -0500
commit90652efeba1a05300931b3fad53540b9bca73948 (patch)
tree56808b0109321ced1c6c4142aa90eb2e5d7a4b0b /drivers/hwmon/tmp401.c
parent06adbaec2a7a3d04741557b411e264c7f9c91c85 (diff)
hwmon: (tmp401) Bail out from tmp401_probe() in case of write errors
The return value of i2c_smbus_read_byte_data() is checked in tmp401_init_client(), but only a warning is printed and the device is registered anyway. This leads to devices being registered even if they cannot be physically detected. Bail out from probe in case of write errors and notify the user. Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers/hwmon/tmp401.c')
-rw-r--r--drivers/hwmon/tmp401.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/hwmon/tmp401.c b/drivers/hwmon/tmp401.c
index ccd993880d74..f2182ee80830 100644
--- a/drivers/hwmon/tmp401.c
+++ b/drivers/hwmon/tmp401.c
@@ -615,10 +615,10 @@ static const struct attribute_group tmp432_group = {
615 * Begin non sysfs callback code (aka Real code) 615 * Begin non sysfs callback code (aka Real code)
616 */ 616 */
617 617
618static void tmp401_init_client(struct tmp401_data *data, 618static int tmp401_init_client(struct tmp401_data *data,
619 struct i2c_client *client) 619 struct i2c_client *client)
620{ 620{
621 int config, config_orig; 621 int config, config_orig, status = 0;
622 622
623 /* Set the conversion rate to 2 Hz */ 623 /* Set the conversion rate to 2 Hz */
624 i2c_smbus_write_byte_data(client, TMP401_CONVERSION_RATE_WRITE, 5); 624 i2c_smbus_write_byte_data(client, TMP401_CONVERSION_RATE_WRITE, 5);
@@ -626,16 +626,18 @@ static void tmp401_init_client(struct tmp401_data *data,
626 626
627 /* Start conversions (disable shutdown if necessary) */ 627 /* Start conversions (disable shutdown if necessary) */
628 config = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ); 628 config = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ);
629 if (config < 0) { 629 if (config < 0)
630 dev_warn(&client->dev, "Initialization failed!\n"); 630 return config;
631 return;
632 }
633 631
634 config_orig = config; 632 config_orig = config;
635 config &= ~TMP401_CONFIG_SHUTDOWN; 633 config &= ~TMP401_CONFIG_SHUTDOWN;
636 634
637 if (config != config_orig) 635 if (config != config_orig)
638 i2c_smbus_write_byte_data(client, TMP401_CONFIG_WRITE, config); 636 status = i2c_smbus_write_byte_data(client,
637 TMP401_CONFIG_WRITE,
638 config);
639
640 return status;
639} 641}
640 642
641static int tmp401_detect(struct i2c_client *client, 643static int tmp401_detect(struct i2c_client *client,
@@ -718,7 +720,7 @@ static int tmp401_probe(struct i2c_client *client,
718 struct device *dev = &client->dev; 720 struct device *dev = &client->dev;
719 struct device *hwmon_dev; 721 struct device *hwmon_dev;
720 struct tmp401_data *data; 722 struct tmp401_data *data;
721 int groups = 0; 723 int groups = 0, status;
722 724
723 data = devm_kzalloc(dev, sizeof(struct tmp401_data), GFP_KERNEL); 725 data = devm_kzalloc(dev, sizeof(struct tmp401_data), GFP_KERNEL);
724 if (!data) 726 if (!data)
@@ -729,7 +731,9 @@ static int tmp401_probe(struct i2c_client *client,
729 data->kind = id->driver_data; 731 data->kind = id->driver_data;
730 732
731 /* Initialize the TMP401 chip */ 733 /* Initialize the TMP401 chip */
732 tmp401_init_client(data, client); 734 status = tmp401_init_client(data, client);
735 if (status < 0)
736 return status;
733 737
734 /* Register sysfs hooks */ 738 /* Register sysfs hooks */
735 data->groups[groups++] = &tmp401_group; 739 data->groups[groups++] = &tmp401_group;