Skip to content

Commit

Permalink
hwmon: (tmp401) Bail out from tmp401_probe() in case of write errors
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Bartosz Golaszewski authored and Guenter Roeck committed Dec 4, 2014
1 parent 06adbae commit 90652ef
Showing 1 changed file with 14 additions and 10 deletions.
24 changes: 14 additions & 10 deletions drivers/hwmon/tmp401.c
Original file line number Diff line number Diff line change
Expand Up @@ -615,27 +615,29 @@ static const struct attribute_group tmp432_group = {
* Begin non sysfs callback code (aka Real code)
*/

static void tmp401_init_client(struct tmp401_data *data,
struct i2c_client *client)
static int tmp401_init_client(struct tmp401_data *data,
struct i2c_client *client)
{
int config, config_orig;
int config, config_orig, status = 0;

/* Set the conversion rate to 2 Hz */
i2c_smbus_write_byte_data(client, TMP401_CONVERSION_RATE_WRITE, 5);
data->update_interval = 500;

/* Start conversions (disable shutdown if necessary) */
config = i2c_smbus_read_byte_data(client, TMP401_CONFIG_READ);
if (config < 0) {
dev_warn(&client->dev, "Initialization failed!\n");
return;
}
if (config < 0)
return config;

config_orig = config;
config &= ~TMP401_CONFIG_SHUTDOWN;

if (config != config_orig)
i2c_smbus_write_byte_data(client, TMP401_CONFIG_WRITE, config);
status = i2c_smbus_write_byte_data(client,
TMP401_CONFIG_WRITE,
config);

return status;
}

static int tmp401_detect(struct i2c_client *client,
Expand Down Expand Up @@ -718,7 +720,7 @@ static int tmp401_probe(struct i2c_client *client,
struct device *dev = &client->dev;
struct device *hwmon_dev;
struct tmp401_data *data;
int groups = 0;
int groups = 0, status;

data = devm_kzalloc(dev, sizeof(struct tmp401_data), GFP_KERNEL);
if (!data)
Expand All @@ -729,7 +731,9 @@ static int tmp401_probe(struct i2c_client *client,
data->kind = id->driver_data;

/* Initialize the TMP401 chip */
tmp401_init_client(data, client);
status = tmp401_init_client(data, client);
if (status < 0)
return status;

/* Register sysfs hooks */
data->groups[groups++] = &tmp401_group;
Expand Down

0 comments on commit 90652ef

Please sign in to comment.