Lines Matching +full:per +full:- +full:mille
1 // SPDX-License-Identifier: GPL-2.0+
3 * cc2.c - Support for the Amphenol ChipCap 2 relative humidity, temperature sensor
11 * https://www.amphenol-sensors.com/en/telaire/humidity/527-humidity-sensors/3095-chipcap-2
59 /* ensure clean off -> on transitions */
98 /* %RH as a per cent mille from a register value */
103 return tmp / ((1 << 14) - 1); in cc2_rh_convert()
109 return data * ((1 << 14) - 1) / CC2_RH_MAX; in cc2_rh_to_reg()
115 unsigned long tmp = ((data >> 2) * 165 * 1000U) / ((1 << 14) - 1); in cc2_temp_convert()
117 return tmp - 40 * 1000U; in cc2_temp_convert()
125 if (regulator_is_enabled(data->regulator)) in cc2_enable()
129 try_wait_for_completion(&data->complete); in cc2_enable()
131 ret = regulator_enable(data->regulator); in cc2_enable()
137 data->process_irqs = true; in cc2_enable()
147 data->process_irqs = false; in cc2_disable()
150 if (regulator_is_enabled(data->regulator)) { in cc2_disable()
151 err = regulator_disable(data->regulator); in cc2_disable()
153 dev_dbg(&data->client->dev, "Failed to disable device"); in cc2_disable()
163 return -ETIMEDOUT; in cc2_cmd_response_diagnostic()
171 return -EBUSY; in cc2_cmd_response_diagnostic()
181 return -ENODATA; in cc2_cmd_response_diagnostic()
184 return -EINVAL; in cc2_cmd_response_diagnostic()
195 ret = ret < 0 ? ret : -EIO; in cc2_read_command_status()
199 return cc2_cmd_response_diagnostic(&client->dev, status); in cc2_read_command_status()
204 * first 10 ms after power-up. Only in case the command window is missed,
217 ret = i2c_smbus_write_word_data(data->client, CC2_START_CM, 0); in cc2_command_mode_start()
221 if (data->irq_ready > 0) { in cc2_command_mode_start()
223 ret = wait_for_completion_timeout(&data->complete, in cc2_command_mode_start()
226 return -ETIMEDOUT; in cc2_command_mode_start()
231 ret = cc2_read_command_status(data->client); in cc2_command_mode_start()
232 if (ret != -ETIMEDOUT || i == CC2_CM_RETRIES) in cc2_command_mode_start()
250 ret = i2c_smbus_write_word_data(data->client, CC2_START_NOM, 0); in cc2_command_mode_finish()
267 ret = i2c_smbus_write_word_data(data->client, reg, val); in cc2_write_reg()
271 if (data->irq_ready > 0) { in cc2_write_reg()
273 ret = wait_for_completion_timeout(&data->complete, timeout); in cc2_write_reg()
275 ret = -ETIMEDOUT; in cc2_write_reg()
282 ret = cc2_read_command_status(data->client); in cc2_write_reg()
300 ret = i2c_smbus_write_word_data(data->client, reg, 0); in cc2_read_reg()
304 if (data->irq_ready > 0) { in cc2_read_reg()
306 ret = wait_for_completion_timeout(&data->complete, timeout); in cc2_read_reg()
308 return -ETIMEDOUT; in cc2_read_reg()
313 ret = i2c_master_recv(data->client, buf, CC2_EEPROM_DATA_LEN); in cc2_read_reg()
315 return ret < 0 ? ret : -EIO; in cc2_read_reg()
319 return cc2_read_command_status(data->client); in cc2_read_reg()
345 ret = ret < 0 ? ret : -EIO; in cc2_data_fetch()
350 return -EBUSY; in cc2_data_fetch()
353 return -EIO; in cc2_data_fetch()
363 return -EINVAL; in cc2_data_fetch()
375 if (data->irq_ready > 0) { in cc2_read_measurement()
377 ret = wait_for_completion_timeout(&data->complete, timeout); in cc2_read_measurement()
379 return -ETIMEDOUT; in cc2_read_measurement()
385 ret = cc2_data_fetch(data->client, type, val); in cc2_read_measurement()
415 * exiting the command mode, there is no need to force two power-up sequences.
454 return cc2->rh_alarm.low_alarm_visible ? 0444 : 0; in cc2_is_visible()
456 return cc2->rh_alarm.high_alarm_visible ? 0444 : 0; in cc2_is_visible()
459 return cc2->rh_alarm.low_alarm_visible ? 0644 : 0; in cc2_is_visible()
462 return cc2->rh_alarm.high_alarm_visible ? 0644 : 0; in cc2_is_visible()
484 if (cc2->process_irqs) in cc2_ready_interrupt()
485 complete(&cc2->complete); in cc2_ready_interrupt()
494 if (cc2->process_irqs) { in cc2_low_interrupt()
495 hwmon_notify_event(cc2->hwmon, hwmon_humidity, in cc2_low_interrupt()
497 cc2->rh_alarm.low_alarm = true; in cc2_low_interrupt()
507 if (cc2->process_irqs) { in cc2_high_interrupt()
508 hwmon_notify_event(cc2->hwmon, hwmon_humidity, in cc2_high_interrupt()
510 cc2->rh_alarm.high_alarm = true; in cc2_high_interrupt()
526 if (data->rh_alarm.low_alarm) { in cc2_humidity_min_alarm_status()
528 data->rh_alarm.low_alarm = *val; in cc2_humidity_min_alarm_status()
546 if (data->rh_alarm.high_alarm) { in cc2_humidity_max_alarm_status()
548 data->rh_alarm.high_alarm = *val; in cc2_humidity_max_alarm_status()
561 guard(mutex)(&data->dev_access_lock); in cc2_read()
583 return -EOPNOTSUPP; in cc2_read()
586 return -EOPNOTSUPP; in cc2_read()
598 return -EOPNOTSUPP; in cc2_write()
601 return -EINVAL; in cc2_write()
603 guard(mutex)(&data->dev_access_lock); in cc2_write()
623 return -EOPNOTSUPP; in cc2_write()
631 data->irq_ready = fwnode_irq_get_byname(dev_fwnode(dev), "ready"); in cc2_request_ready_irq()
632 if (data->irq_ready > 0) { in cc2_request_ready_irq()
633 init_completion(&data->complete); in cc2_request_ready_irq()
634 ret = devm_request_threaded_irq(dev, data->irq_ready, NULL, in cc2_request_ready_irq()
648 data->irq_low = fwnode_irq_get_byname(dev_fwnode(dev), "low"); in cc2_request_alarm_irqs()
649 if (data->irq_low > 0) { in cc2_request_alarm_irqs()
650 ret = devm_request_threaded_irq(dev, data->irq_low, NULL, in cc2_request_alarm_irqs()
658 data->rh_alarm.low_alarm_visible = true; in cc2_request_alarm_irqs()
661 data->irq_high = fwnode_irq_get_byname(dev_fwnode(dev), "high"); in cc2_request_alarm_irqs()
662 if (data->irq_high > 0) { in cc2_request_alarm_irqs()
663 ret = devm_request_threaded_irq(dev, data->irq_high, NULL, in cc2_request_alarm_irqs()
671 data->rh_alarm.high_alarm_visible = true; in cc2_request_alarm_irqs()
699 struct device *dev = &client->dev; in cc2_probe()
702 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) in cc2_probe()
703 return -EOPNOTSUPP; in cc2_probe()
707 return -ENOMEM; in cc2_probe()
711 mutex_init(&data->dev_access_lock); in cc2_probe()
713 data->client = client; in cc2_probe()
715 data->regulator = devm_regulator_get_exclusive(dev, "vdd"); in cc2_probe()
716 if (IS_ERR(data->regulator)) in cc2_probe()
717 return dev_err_probe(dev, PTR_ERR(data->regulator), in cc2_probe()
728 data->hwmon = devm_hwmon_device_register_with_info(dev, client->name, in cc2_probe()
731 if (IS_ERR(data->hwmon)) in cc2_probe()
732 return dev_err_probe(dev, PTR_ERR(data->hwmon), in cc2_probe()