Lines Matching +full:data +full:- +full:channel

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) \
112 * msb-registers get locked by the hardware. After _one_ of those msb is read,
119 struct adt7411_data *data = i2c_get_clientdata(client); in adt7411_read_10_bit() local
122 mutex_lock(&data->device_lock); in adt7411_read_10_bit()
135 mutex_unlock(&data->device_lock); in adt7411_read_10_bit()
143 struct adt7411_data *data = i2c_get_clientdata(client); in adt7411_modify_bit() local
146 mutex_lock(&data->device_lock); in adt7411_modify_bit()
160 mutex_unlock(&data->device_lock); in adt7411_modify_bit()
168 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_show_bit() local
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()
180 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_set_bit() local
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()
215 static int adt7411_read_in_alarm(struct device *dev, int channel, long *val) in adt7411_read_in_alarm() argument
217 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_read_in_alarm() local
218 struct i2c_client *client = data->client; in adt7411_read_in_alarm()
221 ret = i2c_smbus_read_byte_data(client, adt7411_in_alarm_reg[channel]); in adt7411_read_in_alarm()
224 *val = !!(ret & adt7411_in_alarm_bits[channel]); in adt7411_read_in_alarm()
230 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_read_in_vdd() local
231 struct i2c_client *client = data->client; in adt7411_read_in_vdd()
257 return -EOPNOTSUPP; in adt7411_read_in_vdd()
263 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_update_vref() local
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()
287 static int adt7411_read_in_chan(struct device *dev, u32 attr, int channel, in adt7411_read_in_chan() argument
290 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_read_in_chan() local
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()
317 ? ADT7411_REG_IN_LOW(channel) in adt7411_read_in_chan()
318 : ADT7411_REG_IN_HIGH(channel); in adt7411_read_in_chan()
322 *val = ret * data->vref_cached / 256; in adt7411_read_in_chan()
326 ret = adt7411_read_in_alarm(dev, channel, val); in adt7411_read_in_chan()
329 ret = -EOPNOTSUPP; in adt7411_read_in_chan()
333 mutex_unlock(&data->update_lock); in adt7411_read_in_chan()
337 static int adt7411_read_in(struct device *dev, u32 attr, int channel, in adt7411_read_in() argument
340 if (channel == 0) in adt7411_read_in()
343 return adt7411_read_in_chan(dev, attr, channel, val); in adt7411_read_in()
347 static int adt7411_read_temp_alarm(struct device *dev, u32 attr, int channel, in adt7411_read_temp_alarm() argument
350 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_read_temp_alarm() local
351 struct i2c_client *client = data->client; in adt7411_read_temp_alarm()
360 bit = channel ? ADT7411_STAT_1_EXT_TEMP_LOW in adt7411_read_temp_alarm()
364 bit = channel ? ADT7411_STAT_1_EXT_TEMP_HIGH_AIN1 in adt7411_read_temp_alarm()
371 return -EOPNOTSUPP; in adt7411_read_temp_alarm()
378 static int adt7411_read_temp(struct device *dev, u32 attr, int channel, in adt7411_read_temp() argument
381 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_read_temp() local
382 struct i2c_client *client = data->client; in adt7411_read_temp()
387 regl = channel ? ADT7411_REG_EXT_TEMP_AIN14_LSB : in adt7411_read_temp()
389 regh = channel ? ADT7411_REG_EXT_TEMP_AIN1_MSB : in adt7411_read_temp()
394 ret = ret & 0x200 ? ret - 0x400 : ret; /* 10 bit signed */ in adt7411_read_temp()
400 ? ADT7411_REG_TEMP_LOW(channel) in adt7411_read_temp()
401 : ADT7411_REG_TEMP_HIGH(channel); in adt7411_read_temp()
405 ret = ret & 0x80 ? ret - 0x100 : ret; /* 8 bit signed */ in adt7411_read_temp()
411 return adt7411_read_temp_alarm(dev, attr, channel, val); in adt7411_read_temp()
413 return -EOPNOTSUPP; in adt7411_read_temp()
418 u32 attr, int channel, long *val) in adt7411_read() argument
422 return adt7411_read_in(dev, attr, channel, val); in adt7411_read()
424 return adt7411_read_temp(dev, attr, channel, val); in adt7411_read()
426 return -EOPNOTSUPP; in adt7411_read()
432 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_write_in_vdd() local
433 struct i2c_client *client = data->client; in adt7411_write_in_vdd()
447 return -EOPNOTSUPP; in adt7411_write_in_vdd()
453 static int adt7411_write_in_chan(struct device *dev, u32 attr, int channel, in adt7411_write_in_chan() argument
456 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_write_in_chan() local
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()
469 reg = ADT7411_REG_IN_LOW(channel); in adt7411_write_in_chan()
472 reg = ADT7411_REG_IN_HIGH(channel); in adt7411_write_in_chan()
475 ret = -EOPNOTSUPP; in adt7411_write_in_chan()
481 mutex_unlock(&data->update_lock); in adt7411_write_in_chan()
485 static int adt7411_write_in(struct device *dev, u32 attr, int channel, in adt7411_write_in() argument
488 if (channel == 0) in adt7411_write_in()
491 return adt7411_write_in_chan(dev, attr, channel, val); in adt7411_write_in()
494 static int adt7411_write_temp(struct device *dev, u32 attr, int channel, in adt7411_write_temp() argument
497 struct adt7411_data *data = dev_get_drvdata(dev); in adt7411_write_temp() local
498 struct i2c_client *client = data->client; in adt7411_write_temp()
501 val = clamp_val(val, -128000, 127000); in adt7411_write_temp()
506 reg = ADT7411_REG_TEMP_LOW(channel); in adt7411_write_temp()
509 reg = ADT7411_REG_TEMP_HIGH(channel); in adt7411_write_temp()
512 return -EOPNOTSUPP; in adt7411_write_temp()
519 u32 attr, int channel, long val) in adt7411_write() argument
523 return adt7411_write_in(dev, attr, channel, val); in adt7411_write()
525 return adt7411_write_temp(dev, attr, channel, val); in adt7411_write()
527 return -EOPNOTSUPP; in adt7411_write()
533 u32 attr, int channel) in adt7411_is_visible() argument
535 const struct adt7411_data *data = _data; in adt7411_is_visible() local
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()
598 static int adt7411_init_device(struct adt7411_data *data) in adt7411_init_device() argument
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()
672 struct adt7411_data *data; in adt7411_probe() local
676 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); in adt7411_probe()
677 if (!data) in adt7411_probe()
678 return -ENOMEM; in adt7411_probe()
680 i2c_set_clientdata(client, data); 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()
685 ret = adt7411_init_device(data); 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()
693 data, in adt7411_probe()