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); > + 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. > + } > + > + 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. Best regards, Krzysztof