Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iio: light: veml6030: power off device in probe error paths

Move devm_add_action_or_reset() with a device shut down action to the
hardware initialization function to ensure that any error path after
powering on the device leads to a power off. Add struct device *dev
to the argument list to clarify the device the action is registered
against, and use it wherever &client->dev was used.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Link: https://patch.msgid.link/20241001-veml6035-v3-7-d789f6ff147c@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Javier Carrasco and committed by
Jonathan Cameron
e980726d ed59fc90

+13 -19
+13 -19
drivers/iio/light/veml6030.c
··· 740 740 * interrupt disabled by default. First shutdown the sensor, 741 741 * update registers and then power on the sensor. 742 742 */ 743 - static int veml6030_hw_init(struct iio_dev *indio_dev) 743 + static int veml6030_hw_init(struct iio_dev *indio_dev, struct device *dev) 744 744 { 745 745 int ret, val; 746 746 struct veml6030_data *data = iio_priv(indio_dev); 747 - struct i2c_client *client = data->client; 748 747 749 748 ret = veml6030_als_shut_down(data); 750 749 if (ret) 751 - return dev_err_probe(&client->dev, ret, "can't shutdown als\n"); 750 + return dev_err_probe(dev, ret, "can't shutdown als\n"); 752 751 753 752 ret = regmap_write(data->regmap, VEML6030_REG_ALS_CONF, 0x1001); 754 753 if (ret) 755 - return dev_err_probe(&client->dev, ret, 756 - "can't setup als configs\n"); 754 + return dev_err_probe(dev, ret, "can't setup als configs\n"); 757 755 758 756 ret = regmap_update_bits(data->regmap, VEML6030_REG_ALS_PSM, 759 757 VEML6030_PSM | VEML6030_PSM_EN, 0x03); 760 758 if (ret) 761 - return dev_err_probe(&client->dev, ret, 762 - "can't setup default PSM\n"); 759 + return dev_err_probe(dev, ret, "can't setup default PSM\n"); 763 760 764 761 ret = regmap_write(data->regmap, VEML6030_REG_ALS_WH, 0xFFFF); 765 762 if (ret) 766 - return dev_err_probe(&client->dev, ret, 767 - "can't setup high threshold\n"); 763 + return dev_err_probe(dev, ret, "can't setup high threshold\n"); 768 764 769 765 ret = regmap_write(data->regmap, VEML6030_REG_ALS_WL, 0x0000); 770 766 if (ret) 771 - return dev_err_probe(&client->dev, ret, 772 - "can't setup low threshold\n"); 767 + return dev_err_probe(dev, ret, "can't setup low threshold\n"); 773 768 774 769 ret = veml6030_als_pwr_on(data); 775 770 if (ret) 776 - return dev_err_probe(&client->dev, ret, "can't poweron als\n"); 771 + return dev_err_probe(dev, ret, "can't poweron als\n"); 772 + 773 + ret = devm_add_action_or_reset(dev, veml6030_als_shut_down_action, data); 774 + if (ret < 0) 775 + return ret; 777 776 778 777 /* Clear stale interrupt status bits if any during start */ 779 778 ret = regmap_read(data->regmap, VEML6030_REG_ALS_INT, &val); 780 779 if (ret < 0) 781 - return dev_err_probe(&client->dev, ret, 780 + return dev_err_probe(dev, ret, 782 781 "can't clear als interrupt status\n"); 783 782 784 783 /* Cache currently active measurement parameters */ ··· 838 839 indio_dev->info = &veml6030_info_no_irq; 839 840 } 840 841 841 - ret = veml6030_hw_init(indio_dev); 842 - if (ret < 0) 843 - return ret; 844 - 845 - ret = devm_add_action_or_reset(&client->dev, 846 - veml6030_als_shut_down_action, data); 842 + ret = veml6030_hw_init(indio_dev, &client->dev); 847 843 if (ret < 0) 848 844 return ret; 849 845