// SPDX-License-Identifier: GPL-2.0-only /* * Measurements Specialties driver common i2c functions * * Copyright (c) 2015 Measurement-Specialties */ #include <linux/module.h> #include <linux/iio/iio.h> #include <linux/device.h> #include <linux/delay.h> #include "ms_sensors_i2c.h" /* Conversion times in us */ static const u16 ms_sensors_ht_t_conversion_time[] = …; static const u16 ms_sensors_ht_h_conversion_time[] = …; static const u16 ms_sensors_tp_conversion_time[] = …; #define MS_SENSORS_SERIAL_READ_MSB … #define MS_SENSORS_SERIAL_READ_LSB … #define MS_SENSORS_CONFIG_REG_WRITE … #define MS_SENSORS_CONFIG_REG_READ … #define MS_SENSORS_HT_T_CONVERSION_START … #define MS_SENSORS_HT_H_CONVERSION_START … #define MS_SENSORS_TP_PROM_READ … #define MS_SENSORS_TP_T_CONVERSION_START … #define MS_SENSORS_TP_P_CONVERSION_START … #define MS_SENSORS_TP_ADC_READ … #define MS_SENSORS_NO_READ_CMD … /** * ms_sensors_reset() - Reset function * @cli: pointer to device client * @cmd: reset cmd. Depends on device in use * @delay: usleep minimal delay after reset command is issued * * Generic I2C reset function for Measurement Specialties devices. * * Return: 0 on success, negative errno otherwise. */ int ms_sensors_reset(void *cli, u8 cmd, unsigned int delay) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_read_prom_word() - PROM word read function * @cli: pointer to device client * @cmd: PROM read cmd. Depends on device and prom id * @word: pointer to word destination value * * Generic i2c prom word read function for Measurement Specialties devices. * * Return: 0 on success, negative errno otherwise. */ int ms_sensors_read_prom_word(void *cli, int cmd, u16 *word) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_convert_and_read() - ADC conversion & read function * @cli: pointer to device client * @conv: ADC conversion command. Depends on device in use * @rd: ADC read command. Depends on device in use * @delay: usleep minimal delay after conversion command is issued * @adc: pointer to ADC destination value * * Generic ADC conversion & read function for Measurement Specialties * devices. * The function will issue conversion command, sleep appopriate delay, and * issue command to read ADC. * * Return: 0 on success, negative errno otherwise. */ int ms_sensors_convert_and_read(void *cli, u8 conv, u8 rd, unsigned int delay, u32 *adc) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_crc_valid() - CRC check function * @value: input and CRC compare value * * Cyclic Redundancy Check function used in TSYS02D, HTU21, MS8607. * This function performs a x^8 + x^5 + x^4 + 1 polynomial CRC. * The argument contains CRC value in LSB byte while the bytes 1 and 2 * are used for CRC computation. * * Return: 1 if CRC is valid, 0 otherwise. */ static bool ms_sensors_crc_valid(u32 value) { … } /** * ms_sensors_read_serial() - Serial number read function * @client: pointer to i2c client * @sn: pointer to 64-bits destination value * * Generic i2c serial number read function for Measurement Specialties devices. * This function is used for TSYS02d, HTU21, MS8607 chipset. * Refer to datasheet: * http://www.meas-spec.com/downloads/HTU2X_Serial_Number_Reading.pdf * * Sensor raw MSB serial number format is the following : * [ SNB3, CRC, SNB2, CRC, SNB1, CRC, SNB0, CRC] * Sensor raw LSB serial number format is the following : * [ X, X, SNC1, SNC0, CRC, SNA1, SNA0, CRC] * The resulting serial number is following : * [ SNA1, SNA0, SNB3, SNB2, SNB1, SNB0, SNC1, SNC0] * * Return: 0 on success, negative errno otherwise. */ int ms_sensors_read_serial(struct i2c_client *client, u64 *sn) { … } EXPORT_SYMBOL_NS(…); static int ms_sensors_read_config_reg(struct i2c_client *client, u8 *config_reg) { … } /** * ms_sensors_write_resolution() - Set resolution function * @dev_data: pointer to temperature/humidity device data * @i: resolution index to set * * This function will program the appropriate resolution based on the index * provided when user space will set samp_freq channel. * This function is used for TSYS02D, HTU21 and MS8607 chipsets. * * Return: 0 on success, negative errno otherwise. */ ssize_t ms_sensors_write_resolution(struct ms_ht_dev *dev_data, u8 i) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_show_battery_low() - Show device battery low indicator * @dev_data: pointer to temperature/humidity device data * @buf: pointer to char buffer to write result * * This function will read battery indicator value in the device and * return 1 if the device voltage is below 2.25V. * This function is used for TSYS02D, HTU21 and MS8607 chipsets. * * Return: length of sprintf on success, negative errno otherwise. */ ssize_t ms_sensors_show_battery_low(struct ms_ht_dev *dev_data, char *buf) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_show_heater() - Show device heater * @dev_data: pointer to temperature/humidity device data * @buf: pointer to char buffer to write result * * This function will read heater enable value in the device and * return 1 if the heater is enabled. * This function is used for HTU21 and MS8607 chipsets. * * Return: length of sprintf on success, negative errno otherwise. */ ssize_t ms_sensors_show_heater(struct ms_ht_dev *dev_data, char *buf) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_write_heater() - Write device heater * @dev_data: pointer to temperature/humidity device data * @buf: pointer to char buffer from user space * @len: length of buf * * This function will write 1 or 0 value in the device * to enable or disable heater. * This function is used for HTU21 and MS8607 chipsets. * * Return: length of buffer, negative errno otherwise. */ ssize_t ms_sensors_write_heater(struct ms_ht_dev *dev_data, const char *buf, size_t len) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_ht_read_temperature() - Read temperature * @dev_data: pointer to temperature/humidity device data * @temperature:pointer to temperature destination value * * This function will get temperature ADC value from the device, * check the CRC and compute the temperature value. * This function is used for TSYS02D, HTU21 and MS8607 chipsets. * * Return: 0 on success, negative errno otherwise. */ int ms_sensors_ht_read_temperature(struct ms_ht_dev *dev_data, s32 *temperature) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_ht_read_humidity() - Read humidity * @dev_data: pointer to temperature/humidity device data * @humidity: pointer to humidity destination value * * This function will get humidity ADC value from the device, * check the CRC and compute the temperature value. * This function is used for HTU21 and MS8607 chipsets. * * Return: 0 on success, negative errno otherwise. */ int ms_sensors_ht_read_humidity(struct ms_ht_dev *dev_data, u32 *humidity) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_tp_crc4() - Calculate PROM CRC for * Temperature and pressure devices. * This function is only used when reading PROM coefficients * * @prom: pointer to PROM coefficients array * * Return: CRC. */ static u8 ms_sensors_tp_crc4(u16 *prom) { … } /** * ms_sensors_tp_crc_valid_112() - CRC check function for * Temperature and pressure devices for 112bit PROM. * This function is only used when reading PROM coefficients * * @prom: pointer to PROM coefficients array * * Return: True if CRC is ok. */ static bool ms_sensors_tp_crc_valid_112(u16 *prom) { … } /** * ms_sensors_tp_crc_valid_128() - CRC check function for * Temperature and pressure devices for 128bit PROM. * This function is only used when reading PROM coefficients * * @prom: pointer to PROM coefficients array * * Return: True if CRC is ok. */ static bool ms_sensors_tp_crc_valid_128(u16 *prom) { … } /** * ms_sensors_tp_read_prom() - prom coeff read function * @dev_data: pointer to temperature/pressure device data * * This function will read prom coefficients and check CRC. * This function is used for MS5637 and MS8607 chipsets. * * Return: 0 on success, negative errno otherwise. */ int ms_sensors_tp_read_prom(struct ms_tp_dev *dev_data) { … } EXPORT_SYMBOL_NS(…); /** * ms_sensors_read_temp_and_pressure() - read temp and pressure * @dev_data: pointer to temperature/pressure device data * @temperature:pointer to temperature destination value * @pressure: pointer to pressure destination value * * This function will read ADC and compute pressure and temperature value. * This function is used for MS5637 and MS8607 chipsets. * * Return: 0 on success, negative errno otherwise. */ int ms_sensors_read_temp_and_pressure(struct ms_tp_dev *dev_data, int *temperature, unsigned int *pressure) { … } EXPORT_SYMBOL_NS(…); MODULE_DESCRIPTION(…) …; MODULE_AUTHOR(…) …; MODULE_AUTHOR(…) …; MODULE_LICENSE(…) …;