Lines Matching +full:spi +full:- +full:lsb +full:- +full:first

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for the ADT7411 (I2C/SPI 8 channel 10 bit ADC & temperature-sensor)
7 * TODO: SPI, use power-down mode for suspend?, interrupt handling?
18 #include <linux/hwmon-sysfs.h>
63 ? 0x2b + 2 * ((nr)-2) \
66 ? 0x2c + 2 * ((nr)-2) \
111 * When reading a register containing (up to 4) lsb, all associated
112 * msb-registers get locked by the hardware. After _one_ of those msb is read,
113 * _all_ are unlocked. In order to use this locking correctly, reading lsb/msb
122 mutex_lock(&data->device_lock); in adt7411_read_10_bit()
135 mutex_unlock(&data->device_lock); in adt7411_read_10_bit()
146 mutex_lock(&data->device_lock); in adt7411_modify_bit()
160 mutex_unlock(&data->device_lock); in adt7411_modify_bit()
169 struct i2c_client *client = data->client; in adt7411_show_bit()
170 int ret = i2c_smbus_read_byte_data(client, attr2->index); in adt7411_show_bit()
172 return ret < 0 ? ret : sprintf(buf, "%u\n", !!(ret & attr2->nr)); in adt7411_show_bit()
181 struct i2c_client *client = data->client; in adt7411_set_bit()
187 return -EINVAL; in adt7411_set_bit()
189 ret = adt7411_modify_bit(client, s_attr2->index, s_attr2->nr, flag); in adt7411_set_bit()
192 mutex_lock(&data->update_lock); in adt7411_set_bit()
193 data->next_update = jiffies; in adt7411_set_bit()
194 mutex_unlock(&data->update_lock); in adt7411_set_bit()
218 struct i2c_client *client = data->client; in adt7411_read_in_alarm()
231 struct i2c_client *client = data->client; in adt7411_read_in_vdd()
257 return -EOPNOTSUPP; in adt7411_read_in_vdd()
264 struct i2c_client *client = data->client; in adt7411_update_vref()
267 if (time_after_eq(jiffies, data->next_update)) { in adt7411_update_vref()
274 &data->vref_cached); in adt7411_update_vref()
278 data->vref_cached = 2250; in adt7411_update_vref()
281 data->next_update = jiffies + HZ; in adt7411_update_vref()
291 struct i2c_client *client = data->client; in adt7411_read_in_chan()
295 int nr = channel - 1; in adt7411_read_in_chan()
297 mutex_lock(&data->update_lock); in adt7411_read_in_chan()
311 *val = ret * data->vref_cached / 1024; in adt7411_read_in_chan()
322 *val = ret * data->vref_cached / 256; in adt7411_read_in_chan()
329 ret = -EOPNOTSUPP; in adt7411_read_in_chan()
333 mutex_unlock(&data->update_lock); in adt7411_read_in_chan()
351 struct i2c_client *client = data->client; in adt7411_read_temp_alarm()
371 return -EOPNOTSUPP; in adt7411_read_temp_alarm()
382 struct i2c_client *client = data->client; in adt7411_read_temp()
394 ret = ret & 0x200 ? ret - 0x400 : ret; /* 10 bit signed */ in adt7411_read_temp()
405 ret = ret & 0x80 ? ret - 0x100 : ret; /* 8 bit signed */ in adt7411_read_temp()
413 return -EOPNOTSUPP; in adt7411_read_temp()
426 return -EOPNOTSUPP; in adt7411_read()
433 struct i2c_client *client = data->client; in adt7411_write_in_vdd()
447 return -EOPNOTSUPP; in adt7411_write_in_vdd()
457 struct i2c_client *client = data->client; in adt7411_write_in_chan()
460 mutex_lock(&data->update_lock); in adt7411_write_in_chan()
464 val = clamp_val(val, 0, 255 * data->vref_cached / 256); in adt7411_write_in_chan()
465 val = DIV_ROUND_CLOSEST(val * 256, data->vref_cached); in adt7411_write_in_chan()
475 ret = -EOPNOTSUPP; in adt7411_write_in_chan()
481 mutex_unlock(&data->update_lock); in adt7411_write_in_chan()
498 struct i2c_client *client = data->client; in adt7411_write_temp()
501 val = clamp_val(val, -128000, 127000); in adt7411_write_temp()
512 return -EOPNOTSUPP; in adt7411_write_temp()
527 return -EOPNOTSUPP; in adt7411_write()
540 visible = channel == 0 || channel >= 3 || !data->use_ext_temp; in adt7411_is_visible()
551 visible = channel == 0 || data->use_ext_temp; in adt7411_is_visible()
574 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) in adt7411_detect()
575 return -ENODEV; in adt7411_detect()
579 dev_dbg(&client->dev, in adt7411_detect()
582 return -ENODEV; in adt7411_detect()
587 dev_dbg(&client->dev, in adt7411_detect()
590 return -ENODEV; in adt7411_detect()
593 strscpy(info->type, "adt7411", I2C_NAME_SIZE); in adt7411_detect()
603 ret = i2c_smbus_read_byte_data(data->client, ADT7411_REG_CFG3); in adt7411_init_device()
615 ret = i2c_smbus_write_byte_data(data->client, ADT7411_REG_CFG3, val); in adt7411_init_device()
619 ret = i2c_smbus_read_byte_data(data->client, ADT7411_REG_CFG1); in adt7411_init_device()
623 data->use_ext_temp = ret & ADT7411_CFG1_EXT_TDM; in adt7411_init_device()
636 return i2c_smbus_write_byte_data(data->client, ADT7411_REG_CFG1, val); in adt7411_init_device()
671 struct device *dev = &client->dev; in adt7411_probe()
678 return -ENOMEM; in adt7411_probe()
681 data->client = client; in adt7411_probe()
682 mutex_init(&data->device_lock); in adt7411_probe()
683 mutex_init(&data->update_lock); in adt7411_probe()
689 /* force update on first occasion */ in adt7411_probe()
690 data->next_update = jiffies; in adt7411_probe()
692 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, in adt7411_probe()