From d2615a1773ae96effa40786bb3fc3faa90c7250c Mon Sep 17 00:00:00 2001 From: Clark Wang Date: Sun, 24 Nov 2019 16:37:05 +0800 Subject: [PATCH] LF-99 hwmon: mag3110: correct processing order after probe error Disable regulator first after an error occurs when probe. Remove the directly return code when probe error occurs. Acked-by: Fugang Duan Signed-off-by: Clark Wang --- drivers/hwmon/mag3110.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/drivers/hwmon/mag3110.c b/drivers/hwmon/mag3110.c index 2e41265659f0..a7f355c8078e 100644 --- a/drivers/hwmon/mag3110.c +++ b/drivers/hwmon/mag3110.c @@ -450,21 +450,27 @@ static int mag3110_probe(struct i2c_client *client, if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_BYTE_DATA | - I2C_FUNC_SMBUS_I2C_BLOCK)) - return -EIO; + I2C_FUNC_SMBUS_I2C_BLOCK)) { + ret = -EIO; + goto error_disable_reg; + } dev_info(&client->dev, "check mag3110 chip ID\n"); ret = mag3110_read_reg(client, MAG3110_WHO_AM_I); - if (MAG3110_ID != ret) { dev_err(&client->dev, "read chip ID 0x%x is not equal to 0x%x!\n", ret, MAG3110_ID); - return -EINVAL; + ret = -EINVAL; + goto error_disable_reg; } + data = kzalloc(sizeof(struct mag3110_data), GFP_KERNEL); - if (!data) - return -ENOMEM; + if (!data) { + ret = -ENOMEM; + goto error_disable_reg; + } + data->client = client; i2c_set_clientdata(client, data); /* Init queue */ @@ -544,15 +550,15 @@ error_rm_poll_dev: error_free_poll_dev: input_free_polled_device(data->poll_dev); error_rm_hwmon_dev: - if (!IS_ERR(vdd)) - regulator_disable(vdd); - if (!IS_ERR(vdd_io)) - regulator_disable(vdd_io); - hwmon_device_unregister(data->hwmon_dev); kfree(data); mag3110_pdata = NULL; +error_disable_reg: + if (!IS_ERR(vdd)) + regulator_disable(vdd); + if (!IS_ERR(vdd_io)) + regulator_disable(vdd_io); return ret; }