From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932536AbaLDPXM (ORCPT ); Thu, 4 Dec 2014 10:23:12 -0500 Received: from mail-wi0-f179.google.com ([209.85.212.179]:59656 "EHLO mail-wi0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932503AbaLDPXI (ORCPT ); Thu, 4 Dec 2014 10:23:08 -0500 From: Bartosz Golaszewski To: Guenter Roeck Cc: LKML , Benoit Cousson , Patrick Titiano , LM Sensors , Bartosz Golaszewski Subject: [PATCH v2 3/3] hwmon: tmp401: bail-out from tmp401_probe() in case of write errors Date: Thu, 4 Dec 2014 16:22:54 +0100 Message-Id: <1417706574-1023-4-git-send-email-bgolaszewski@baylibre.com> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1417706574-1023-1-git-send-email-bgolaszewski@baylibre.com> References: <1417706574-1023-1-git-send-email-bgolaszewski@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- drivers/hwmon/tmp401.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/drivers/hwmon/tmp401.c b/drivers/hwmon/tmp401.c index a5f0973..ce7e579 100644 --- a/drivers/hwmon/tmp401.c +++ b/drivers/hwmon/tmp401.c @@ -618,10 +618,10 @@ 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; /* Set the conversion rate to 2 Hz */ i2c_smbus_write_byte_data(client, TMP401_CONVERSION_RATE_WRITE, 5); @@ -629,16 +629,21 @@ static void tmp401_init_client(struct tmp401_data *data, /* 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); + if (config != config_orig) { + status = i2c_smbus_write_byte_data(client, + TMP401_CONFIG_WRITE, + config); + if (status < 0) + return status; + } + + return 0; } static int tmp401_detect(struct i2c_client *client, @@ -721,7 +726,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) @@ -732,7 +737,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; -- 2.1.3