On 11/9/23 00:52, Krzysztof Kozlowski wrote:
On 08/11/2023 16:37, Javier Carrasco wrote:
The Amphenol ChipCap 2 is a capacitive polymer humidity and temperature
sensor with an integrated EEPROM and minimum/maximum humidity alarms.
All device variants offer an I2C interface and depending on the part
number, two different output modes:
- CC2D: digital output
- CC2A: analog (PDM) output
This driver adds support for the digital variant (CC2D part numbers),
which is also divided into two subfamilies [1]:
- CC2DXX: non-sleep measurement mode
- CC2DXXS: sleep measurement mode
...
+
+static int cc2_probe(struct i2c_client *client)
+{
+ struct cc2_data *data;
+ struct device *dev = &client->dev;
+ enum cc2_ids chip;
+ int ret;
+
+ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
+ return -EOPNOTSUPP;
+
+ data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ i2c_set_clientdata(client, data);
+
+ mutex_init(&data->i2c_lock);
+ mutex_init(&data->alarm_lock);
+
+ data->client = client;
+
+ if (client->dev.of_node)
+ chip = (uintptr_t)of_device_get_match_data(&client->dev);
+ else
+ chip = i2c_match_id(cc2_id, client)->driver_data;
+
+ data->config = &cc2_config[chip];
+
+ ret = cc2_request_ready_irq(data, dev);
+ if (ret)
+ return ret;
+
+ data->regulator = devm_regulator_get_optional(dev, "vdd");
+ if (!IS_ERR(data->regulator)) {
+ ret = cc2_retrive_alarm_config(data);
fwiw, s/retrive/retrieve/g
+ if (ret)
+ goto cleanup;
+ } else {
+ /* No access to EEPROM without regulator: no alarm control */
+ goto dev_register;
Nothing improved here.
Do not send new version of patchset before discussion finishes.
This driver will take a while to review due to its complexity.
As for the code above: Error handling goes first. Something like
the above, where the error case is just a goto, is unacceptable and
just increases indentation level for the other code and makes it
more difficult to read. Also, the above code _will_ have to handle
error cases other than -ENODEV. Besides deferred probe, it is
completely inappropriate to ignore -EINVAL or -ENOMEM or any other
error codes other than -ENODEV.
+ }
+
+ ret = cc2_request_alarm_irqs(data, dev);
+ if (ret)
+ goto cleanup;
+
+dev_register:
+ data->hwmon = devm_hwmon_device_register_with_info(dev, client->name,
+ data, &cc2_chip_info,
+ NULL);
+ if (IS_ERR(data->hwmon)) {
+ ret = PTR_ERR(data->hwmon);
+ goto cleanup;
+ }
+
+ return 0;
+
+cleanup:
+ if (cc2_disable(data))
+ dev_dbg(dev, "Failed to disable device");
+
+ return dev_err_probe(dev, ret,
+ "Unable to register hwmon device\n");
Drop or move to each error path.
This actually follows Documentation/process/coding-style.rst, chapter 7
(Centralized exiting of functions).
Guenter