Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85d77047 authored by Wolfram Sang's avatar Wolfram Sang Committed by Linus Torvalds
Browse files

drivers/rtc/rtc-m41t80.c: propagate error value from smbus functions



Don't replace the value we got from the I2C layer, just pass it on.

Signed-off-by: default avatarWolfram Sang <wsa@sang-engineering.com>
Cc: Jingoo Han <jg1.han@samsung.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent c67fedfa
Loading
Loading
Loading
Loading
+23 −14
Original line number Diff line number Diff line
@@ -230,7 +230,7 @@ static ssize_t m41t80_sysfs_show_flags(struct device *dev,

	val = i2c_smbus_read_byte_data(client, M41T80_REG_FLAGS);
	if (val < 0)
		return -EIO;
		return val;
	return sprintf(buf, "%#x\n", val);
}
static DEVICE_ATTR(flags, S_IRUGO, m41t80_sysfs_show_flags, NULL);
@@ -250,7 +250,7 @@ static ssize_t m41t80_sysfs_show_sqwfreq(struct device *dev,
		reg_sqw = M41T80_REG_WDAY;
	val = i2c_smbus_read_byte_data(client, reg_sqw);
	if (val < 0)
		return -EIO;
		return val;
	val = (val >> 4) & 0xf;
	switch (val) {
	case 0:
@@ -269,7 +269,7 @@ static ssize_t m41t80_sysfs_set_sqwfreq(struct device *dev,
{
	struct i2c_client *client = to_i2c_client(dev);
	struct m41t80_data *clientdata = i2c_get_clientdata(client);
	int almon, sqw, reg_sqw;
	int almon, sqw, reg_sqw, rc;
	int val = simple_strtoul(buf, NULL, 0);

	if (!(clientdata->features & M41T80_FEATURE_SQ))
@@ -289,21 +289,30 @@ static ssize_t m41t80_sysfs_set_sqwfreq(struct device *dev,
	/* disable SQW, set SQW frequency & re-enable */
	almon = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_MON);
	if (almon < 0)
		return -EIO;
		return almon;
	reg_sqw = M41T80_REG_SQW;
	if (clientdata->features & M41T80_FEATURE_SQ_ALT)
		reg_sqw = M41T80_REG_WDAY;
	sqw = i2c_smbus_read_byte_data(client, reg_sqw);
	if (sqw < 0)
		return -EIO;
		return sqw;
	sqw = (sqw & 0x0f) | (val << 4);
	if (i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON,
				      almon & ~M41T80_ALMON_SQWE) < 0 ||
	    i2c_smbus_write_byte_data(client, reg_sqw, sqw) < 0)
		return -EIO;
	if (val && i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON,
					     almon | M41T80_ALMON_SQWE) < 0)
		return -EIO;

	rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON,
				      almon & ~M41T80_ALMON_SQWE);
	if (rc < 0)
		return rc;

	if (val) {
		rc = i2c_smbus_write_byte_data(client, reg_sqw, sqw);
		if (rc < 0)
			return rc;

		rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_MON,
					     almon | M41T80_ALMON_SQWE);
		if (rc <0)
			return rc;
	}
	return count;
}
static DEVICE_ATTR(sqwfreq, S_IRUGO | S_IWUSR,
@@ -665,7 +674,7 @@ static int m41t80_probe(struct i2c_client *client,

	if (rc < 0) {
		dev_err(&client->dev, "Can't clear HT bit\n");
		return -EIO;
		return rc;
	}

	/* Make sure ST (stop) bit is cleared */
@@ -676,7 +685,7 @@ static int m41t80_probe(struct i2c_client *client,
					      rc & ~M41T80_SEC_ST);
	if (rc < 0) {
		dev_err(&client->dev, "Can't clear ST bit\n");
		return -EIO;
		return rc;
	}

	rc = m41t80_sysfs_register(&client->dev);