Commit c67fedfa authored by Wolfram Sang's avatar Wolfram Sang Committed by Linus Torvalds

drivers/rtc/rtc-m41t80.c: clean up error paths

There is no cleanup needed when something fails in probe, so no need for
goto.  Directly return when something fails.
Signed-off-by: default avatarWolfram Sang <wsa@sang-engineering.com>
Cc: Jingoo Han <jg1.han@samsung.com>
Acked-by: default avatarAlessandro 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 50285785
...@@ -627,37 +627,28 @@ static int m41t80_probe(struct i2c_client *client, ...@@ -627,37 +627,28 @@ static int m41t80_probe(struct i2c_client *client,
struct m41t80_data *clientdata = NULL; struct m41t80_data *clientdata = NULL;
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C
| I2C_FUNC_SMBUS_BYTE_DATA)) { | I2C_FUNC_SMBUS_BYTE_DATA))
rc = -ENODEV; return -ENODEV;
goto exit;
}
clientdata = devm_kzalloc(&client->dev, sizeof(*clientdata), clientdata = devm_kzalloc(&client->dev, sizeof(*clientdata),
GFP_KERNEL); GFP_KERNEL);
if (!clientdata) { if (!clientdata)
rc = -ENOMEM; return -ENOMEM;
goto exit;
}
clientdata->features = id->driver_data; clientdata->features = id->driver_data;
i2c_set_clientdata(client, clientdata); i2c_set_clientdata(client, clientdata);
rtc = devm_rtc_device_register(&client->dev, client->name, rtc = devm_rtc_device_register(&client->dev, client->name,
&m41t80_rtc_ops, THIS_MODULE); &m41t80_rtc_ops, THIS_MODULE);
if (IS_ERR(rtc)) { if (IS_ERR(rtc))
rc = PTR_ERR(rtc); return PTR_ERR(rtc);
rtc = NULL;
goto exit;
}
clientdata->rtc = rtc; clientdata->rtc = rtc;
/* Make sure HT (Halt Update) bit is cleared */ /* Make sure HT (Halt Update) bit is cleared */
rc = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_HOUR); rc = i2c_smbus_read_byte_data(client, M41T80_REG_ALARM_HOUR);
if (rc < 0)
goto ht_err;
if (rc & M41T80_ALHOUR_HT) { if (rc >= 0 && rc & M41T80_ALHOUR_HT) {
if (clientdata->features & M41T80_FEATURE_HT) { if (clientdata->features & M41T80_FEATURE_HT) {
m41t80_get_datetime(client, &tm); m41t80_get_datetime(client, &tm);
dev_info(&client->dev, "HT bit was set!\n"); dev_info(&client->dev, "HT bit was set!\n");
...@@ -668,53 +659,44 @@ static int m41t80_probe(struct i2c_client *client, ...@@ -668,53 +659,44 @@ static int m41t80_probe(struct i2c_client *client,
tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour,
tm.tm_min, tm.tm_sec); tm.tm_min, tm.tm_sec);
} }
if (i2c_smbus_write_byte_data(client, rc = i2c_smbus_write_byte_data(client, M41T80_REG_ALARM_HOUR,
M41T80_REG_ALARM_HOUR, rc & ~M41T80_ALHOUR_HT);
rc & ~M41T80_ALHOUR_HT) < 0) }
goto ht_err;
if (rc < 0) {
dev_err(&client->dev, "Can't clear HT bit\n");
return -EIO;
} }
/* Make sure ST (stop) bit is cleared */ /* Make sure ST (stop) bit is cleared */
rc = i2c_smbus_read_byte_data(client, M41T80_REG_SEC); rc = i2c_smbus_read_byte_data(client, M41T80_REG_SEC);
if (rc < 0)
goto st_err;
if (rc & M41T80_SEC_ST) { if (rc >= 0 && rc & M41T80_SEC_ST)
if (i2c_smbus_write_byte_data(client, M41T80_REG_SEC, rc = i2c_smbus_write_byte_data(client, M41T80_REG_SEC,
rc & ~M41T80_SEC_ST) < 0) rc & ~M41T80_SEC_ST);
goto st_err; if (rc < 0) {
dev_err(&client->dev, "Can't clear ST bit\n");
return -EIO;
} }
rc = m41t80_sysfs_register(&client->dev); rc = m41t80_sysfs_register(&client->dev);
if (rc) if (rc)
goto exit; return rc;
#ifdef CONFIG_RTC_DRV_M41T80_WDT #ifdef CONFIG_RTC_DRV_M41T80_WDT
if (clientdata->features & M41T80_FEATURE_HT) { if (clientdata->features & M41T80_FEATURE_HT) {
save_client = client; save_client = client;
rc = misc_register(&wdt_dev); rc = misc_register(&wdt_dev);
if (rc) if (rc)
goto exit; return rc;
rc = register_reboot_notifier(&wdt_notifier); rc = register_reboot_notifier(&wdt_notifier);
if (rc) { if (rc) {
misc_deregister(&wdt_dev); misc_deregister(&wdt_dev);
goto exit; return rc;
} }
} }
#endif #endif
return 0; return 0;
st_err:
rc = -EIO;
dev_err(&client->dev, "Can't clear ST bit\n");
goto exit;
ht_err:
rc = -EIO;
dev_err(&client->dev, "Can't clear HT bit\n");
goto exit;
exit:
return rc;
} }
static int m41t80_remove(struct i2c_client *client) static int m41t80_remove(struct i2c_client *client)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment