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

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

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
Loading
Loading
Loading
Loading
+23 −41
Original line number Original line Diff line number Diff line
@@ -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,
				 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)