Lines Matching +full:msb +full:- +full:-

1 // SPDX-License-Identifier: GPL-2.0-or-later
10 * Copyright (c) 2013 Guenter Roeck <linux@roeck-us.net>
129 case 0: /* local temp msb */ in tmp401_regmap_is_volatile()
130 case 1: /* remote temp msb */ in tmp401_regmap_is_volatile()
135 case 0x23 ... 0x24: /* remote temp 2 msb / lsb */ in tmp401_regmap_is_volatile()
146 struct i2c_client *client = data->client; in tmp401_reg_read()
150 case 0: /* local temp msb */ in tmp401_reg_read()
151 case 1: /* remote temp msb */ in tmp401_reg_read()
152 case 5: /* local temp high limit msb */ in tmp401_reg_read()
153 case 6: /* local temp low limit msb */ in tmp401_reg_read()
154 case 7: /* remote temp ligh limit msb */ in tmp401_reg_read()
155 case 8: /* remote temp low limit msb */ in tmp401_reg_read()
156 case 0x15: /* remote temp 2 high limit msb */ in tmp401_reg_read()
157 case 0x16: /* remote temp 2 low limit msb */ in tmp401_reg_read()
158 case 0x23: /* remote temp 2 msb */ in tmp401_reg_read()
171 case 0x19: /* critical limits, 8-bit registers */ in tmp401_reg_read()
181 if (data->kind == tmp432) { in tmp401_reg_read()
231 struct i2c_client *client = data->client; in tmp401_reg_write()
234 case 0x05: /* local temp high limit msb */ in tmp401_reg_write()
235 case 0x06: /* local temp low limit msb */ in tmp401_reg_write()
236 case 0x07: /* remote temp ligh limit msb */ in tmp401_reg_write()
237 case 0x08: /* remote temp low limit msb */ in tmp401_reg_write()
240 case 0x15: /* remote temp 2 high limit msb */ in tmp401_reg_write()
241 case 0x16: /* remote temp 2 low limit msb */ in tmp401_reg_write()
243 case 0x19: /* critical limits, 8-bit registers */ in tmp401_reg_write()
272 temp -= 64 * 256; in tmp401_register_to_temp()
280 temp = clamp_val(temp, -64000, 191000); in tmp401_temp_to_register()
286 return DIV_ROUND_CLOSEST(temp * (1 << (8 - zbits)), 1000) << zbits; in tmp401_temp_to_register()
310 struct regmap *regmap = data->regmap; in tmp401_temp_read()
325 *val = tmp401_register_to_temp(regval, data->extended_range); in tmp401_temp_read()
328 mutex_lock(&data->update_lock); in tmp401_temp_read()
333 *val = tmp401_register_to_temp(regval, data->extended_range); in tmp401_temp_read()
337 *val -= regval * 1000; in tmp401_temp_read()
339 mutex_unlock(&data->update_lock); in tmp401_temp_read()
354 return -EOPNOTSUPP; in tmp401_temp_read()
363 struct regmap *regmap = data->regmap; in tmp401_temp_write()
367 mutex_lock(&data->update_lock); in tmp401_temp_write()
373 regval = tmp401_temp_to_register(val, data->extended_range, in tmp401_temp_write()
378 if (data->extended_range) in tmp401_temp_write()
379 val = clamp_val(val, -64000, 191000); in tmp401_temp_write()
387 temp = tmp401_register_to_temp(regval, data->extended_range); in tmp401_temp_write()
388 val = clamp_val(val, temp - 255000, temp); in tmp401_temp_write()
389 regval = ((temp - val) + 500) / 1000; in tmp401_temp_write()
393 ret = -EOPNOTSUPP; in tmp401_temp_write()
396 mutex_unlock(&data->update_lock); in tmp401_temp_write()
408 ret = regmap_read(data->regmap, TMP401_CONVERSION_RATE, &regval); in tmp401_chip_read()
411 *val = (1 << (7 - regval)) * 125; in tmp401_chip_read()
417 return -EOPNOTSUPP; in tmp401_chip_read()
429 * interval = (1 << (7 - rate)) * 125; in tmp401_set_convrate()
431 * rate = 7 - __fls(interval * 4 / (125 * 3)); in tmp401_set_convrate()
436 rate = 7 - __fls(val * 4 / (125 * 3)); in tmp401_set_convrate()
443 struct regmap *regmap = data->regmap; in tmp401_chip_write()
446 mutex_lock(&data->update_lock); in tmp401_chip_write()
453 err = -EINVAL; in tmp401_chip_write()
458 * minimum/maximum registers (0x30-0x37). in tmp401_chip_write()
463 err = -EOPNOTSUPP; in tmp401_chip_write()
466 mutex_unlock(&data->update_lock); in tmp401_chip_write()
480 return -EOPNOTSUPP; in tmp401_read()
493 return -EOPNOTSUPP; in tmp401_write()
545 struct regmap *regmap = data->regmap; in tmp401_init_client()
564 if (of_property_read_bool(data->client->dev.of_node, "ti,extended-range-enable")) { in tmp401_init_client()
569 data->extended_range = !!(config & TMP401_CONFIG_RANGE); in tmp401_init_client()
577 ret = of_property_read_u32(data->client->dev.of_node, "ti,n-factor", &nfactor); in tmp401_init_client()
579 if (data->kind == tmp401) { in tmp401_init_client()
580 dev_err(&data->client->dev, "ti,tmp401 does not support n-factor correction\n"); in tmp401_init_client()
581 return -EINVAL; in tmp401_init_client()
583 if (nfactor < -128 || nfactor > 127) { in tmp401_init_client()
584 dev_err(&data->client->dev, "n-factor is invalid (%d)\n", nfactor); in tmp401_init_client()
585 return -EINVAL; in tmp401_init_client()
592 ret = of_property_read_u32(data->client->dev.of_node, "ti,beta-compensation", &val); in tmp401_init_client()
594 if (data->kind == tmp401 || data->kind == tmp411) { in tmp401_init_client()
595 dev_err(&data->client->dev, "ti,tmp401 or ti,tmp411 does not support beta compensation\n"); in tmp401_init_client()
596 return -EINVAL; in tmp401_init_client()
599 dev_err(&data->client->dev, "beta-compensation is invalid (%u)\n", val); in tmp401_init_client()
600 return -EINVAL; in tmp401_init_client()
614 struct i2c_adapter *adapter = client->adapter; in tmp401_detect()
618 return -ENODEV; in tmp401_detect()
623 return -ENODEV; in tmp401_detect()
629 if (client->addr != 0x4c) in tmp401_detect()
630 return -ENODEV; in tmp401_detect()
634 if (client->addr != 0x4c) in tmp401_detect()
635 return -ENODEV; in tmp401_detect()
639 if (client->addr != 0x4d) in tmp401_detect()
640 return -ENODEV; in tmp401_detect()
644 if (client->addr != 0x4e) in tmp401_detect()
645 return -ENODEV; in tmp401_detect()
649 if (client->addr != 0x4c && client->addr != 0x4d) in tmp401_detect()
650 return -ENODEV; in tmp401_detect()
654 if (client->addr != 0x4c && client->addr != 0x4d) in tmp401_detect()
655 return -ENODEV; in tmp401_detect()
662 return -ENODEV; in tmp401_detect()
667 return -ENODEV; in tmp401_detect()
670 /* Datasheet says: 0x1-0x6 */ in tmp401_detect()
672 return -ENODEV; in tmp401_detect()
674 strscpy(info->type, tmp401_id[kind].name, I2C_NAME_SIZE); in tmp401_detect()
684 struct device *dev = &client->dev; in tmp401_probe()
692 return -ENOMEM; in tmp401_probe()
694 data->client = client; in tmp401_probe()
695 mutex_init(&data->update_lock); in tmp401_probe()
696 data->kind = i2c_match_id(tmp401_id, client)->driver_data; in tmp401_probe()
698 data->regmap = devm_regmap_init(dev, NULL, data, &tmp401_regmap_config); in tmp401_probe()
699 if (IS_ERR(data->regmap)) in tmp401_probe()
700 return PTR_ERR(data->regmap); in tmp401_probe()
703 data->chip.ops = &tmp401_ops; in tmp401_probe()
704 data->chip.info = data->info; in tmp401_probe()
706 data->info[0] = &data->chip_info; in tmp401_probe()
707 data->info[1] = &data->temp_info; in tmp401_probe()
709 info = &data->chip_info; in tmp401_probe()
710 info->type = hwmon_chip; in tmp401_probe()
711 info->config = data->chip_channel_config; in tmp401_probe()
713 data->chip_channel_config[0] = HWMON_C_UPDATE_INTERVAL; in tmp401_probe()
715 info = &data->temp_info; in tmp401_probe()
716 info->type = hwmon_temp; in tmp401_probe()
717 info->config = data->temp_channel_config; in tmp401_probe()
719 data->temp_channel_config[0] = HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX | in tmp401_probe()
722 data->temp_channel_config[1] = HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX | in tmp401_probe()
726 if (data->kind == tmp411) { in tmp401_probe()
727 data->temp_channel_config[0] |= HWMON_T_HIGHEST | HWMON_T_LOWEST; in tmp401_probe()
728 data->temp_channel_config[1] |= HWMON_T_HIGHEST | HWMON_T_LOWEST; in tmp401_probe()
729 data->chip_channel_config[0] |= HWMON_C_TEMP_RESET_HISTORY; in tmp401_probe()
732 if (data->kind == tmp432) { in tmp401_probe()
733 data->temp_channel_config[2] = HWMON_T_INPUT | HWMON_T_MIN | HWMON_T_MAX | in tmp401_probe()
743 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, data, in tmp401_probe()
744 &data->chip, NULL); in tmp401_probe()
748 dev_info(dev, "Detected TI %s chip\n", names[data->kind]); in tmp401_probe()