Lines Matching +full:4 +full:- +full:data
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * emc2103.c - Support for SMSC EMC2103
13 #include <linux/hwmon-sysfs.h>
20 static const u8 REG_TEMP[4] = { 0x00, 0x02, 0x04, 0x06 };
21 static const u8 REG_TEMP_MIN[4] = { 0x3c, 0x38, 0x39, 0x3a };
22 static const u8 REG_TEMP_MAX[4] = { 0x34, 0x30, 0x31, 0x32 };
35 /* equation 4 from datasheet: rpm = (3932160 * multipler) / count */
39 * 2103-2 and 2103-4's 3rd temperature sensor can be connected to two diodes
40 * in anti-parallel mode, and in this configuration both can be read
41 * independently (so we have 4 temperature inputs). The device can't
43 * it. Default is to leave the device in the state it's already in (-1).
46 static int apd = -1;
48 MODULE_PARM_DESC(apd, "Set to zero to disable anti-parallel diode mode");
52 u8 fraction; /* 0-7 multiples of 0.125 */
57 const struct attribute_group *groups[4];
63 struct temperature temp[4]; /* internal + 3 external */
64 s8 temp_min[4]; /* no fractional part */
65 s8 temp_max[4]; /* no fractional part */
77 dev_warn(&client->dev, "reg 0x%02x, err %d\n",
96 temp->degrees = degrees;
97 temp->fraction = (fractional & 0xe0) >> 5;
125 struct emc2103_data *data = i2c_get_clientdata(client);
131 data->fan_multiplier = 1 << ((conf1 & 0x60) >> 5);
132 data->fan_rpm_control = (conf1 & 0x80) != 0;
137 struct emc2103_data *data = dev_get_drvdata(dev);
138 struct i2c_client *client = data->client;
140 mutex_lock(&data->update_lock);
142 if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
143 || !data->valid) {
146 for (i = 0; i < data->temp_count; i++) {
147 read_temp_from_i2c(client, REG_TEMP[i], &data->temp[i]);
149 &data->temp_min[i]);
151 &data->temp_max[i]);
155 &data->temp_min_alarm);
157 &data->temp_max_alarm);
159 read_fan_from_i2c(client, &data->fan_tach,
161 read_fan_from_i2c(client, &data->fan_target,
165 data->last_updated = jiffies;
166 data->valid = true;
169 mutex_unlock(&data->update_lock);
171 return data;
177 int nr = to_sensor_dev_attr(da)->index;
178 struct emc2103_data *data = emc2103_update_device(dev);
179 int millidegrees = data->temp[nr].degrees * 1000
180 + data->temp[nr].fraction * 125;
187 int nr = to_sensor_dev_attr(da)->index;
188 struct emc2103_data *data = emc2103_update_device(dev);
189 int millidegrees = data->temp_min[nr] * 1000;
196 int nr = to_sensor_dev_attr(da)->index;
197 struct emc2103_data *data = emc2103_update_device(dev);
198 int millidegrees = data->temp_max[nr] * 1000;
205 int nr = to_sensor_dev_attr(da)->index;
206 struct emc2103_data *data = emc2103_update_device(dev);
207 bool fault = (data->temp[nr].degrees == -128);
215 int nr = to_sensor_dev_attr(da)->index;
216 struct emc2103_data *data = emc2103_update_device(dev);
217 bool alarm = data->temp_min_alarm & (1 << nr);
225 int nr = to_sensor_dev_attr(da)->index;
226 struct emc2103_data *data = emc2103_update_device(dev);
227 bool alarm = data->temp_max_alarm & (1 << nr);
234 int nr = to_sensor_dev_attr(da)->index;
235 struct emc2103_data *data = dev_get_drvdata(dev);
236 struct i2c_client *client = data->client;
243 val = DIV_ROUND_CLOSEST(clamp_val(val, -63000, 127000), 1000);
245 mutex_lock(&data->update_lock);
246 data->temp_min[nr] = val;
248 mutex_unlock(&data->update_lock);
256 int nr = to_sensor_dev_attr(da)->index;
257 struct emc2103_data *data = dev_get_drvdata(dev);
258 struct i2c_client *client = data->client;
265 val = DIV_ROUND_CLOSEST(clamp_val(val, -63000, 127000), 1000);
267 mutex_lock(&data->update_lock);
268 data->temp_max[nr] = val;
270 mutex_unlock(&data->update_lock);
278 struct emc2103_data *data = emc2103_update_device(dev);
280 mutex_lock(&data->update_lock);
281 if (data->fan_tach != 0)
282 rpm = (FAN_RPM_FACTOR * data->fan_multiplier) / data->fan_tach;
283 mutex_unlock(&data->update_lock);
290 struct emc2103_data *data = emc2103_update_device(dev);
291 int fan_div = 8 / data->fan_multiplier;
304 struct emc2103_data *data = emc2103_update_device(dev);
305 struct i2c_client *client = data->client;
306 int new_range_bits, old_div = 8 / data->fan_multiplier;
323 case 4:
330 return -EINVAL;
333 mutex_lock(&data->update_lock);
337 dev_dbg(&client->dev, "reg 0x%02x, err %d\n",
339 mutex_unlock(&data->update_lock);
346 data->fan_multiplier = 8 / new_div;
349 if ((data->fan_target & 0x1fe0) != 0x1fe0) {
350 u16 new_target = (data->fan_target * old_div) / new_div;
351 data->fan_target = min(new_target, (u16)0x1fff);
352 write_fan_target_to_i2c(client, data->fan_target);
355 /* invalidate data to force re-read from hardware */
356 data->valid = false;
358 mutex_unlock(&data->update_lock);
365 struct emc2103_data *data = emc2103_update_device(dev);
368 mutex_lock(&data->update_lock);
370 if ((data->fan_target != 0) && ((data->fan_target & 0x1fe0) != 0x1fe0))
371 rpm = (FAN_RPM_FACTOR * data->fan_multiplier)
372 / data->fan_target;
373 mutex_unlock(&data->update_lock);
382 struct emc2103_data *data = emc2103_update_device(dev);
383 struct i2c_client *client = data->client;
393 mutex_lock(&data->update_lock);
396 data->fan_target = 0x1fff;
398 data->fan_target = clamp_val(
399 (FAN_RPM_FACTOR * data->fan_multiplier) / rpm_target,
402 write_fan_target_to_i2c(client, data->fan_target);
404 mutex_unlock(&data->update_lock);
411 struct emc2103_data *data = emc2103_update_device(dev);
412 bool fault = ((data->fan_tach & 0x1fe0) == 0x1fe0);
419 struct emc2103_data *data = emc2103_update_device(dev);
420 return sprintf(buf, "%d\n", data->fan_rpm_control ? 3 : 0);
427 struct emc2103_data *data = dev_get_drvdata(dev);
428 struct i2c_client *client = data->client;
436 mutex_lock(&data->update_lock);
439 data->fan_rpm_control = false;
442 data->fan_rpm_control = true;
445 count = -EINVAL;
455 if (data->fan_rpm_control)
462 mutex_unlock(&data->update_lock);
523 /* extra temperature sensors only present on 2103-2 and 2103-4 */
534 /* extra temperature sensors only present on 2103-2 and 2103-4 in APD mode */
560 struct emc2103_data *data;
564 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
565 return -EIO;
567 data = devm_kzalloc(&client->dev, sizeof(struct emc2103_data),
569 if (!data)
570 return -ENOMEM;
572 i2c_set_clientdata(client, data);
573 data->client = client;
574 mutex_init(&data->update_lock);
576 /* 2103-2 and 2103-4 have 3 external diodes, 2103-1 has 1 */
579 /* 2103-1 only has 1 external diode */
580 data->temp_count = 2;
582 /* 2103-2 and 2103-4 have 3 or 4 external diodes */
585 dev_dbg(&client->dev, "reg 0x%02x, err %d\n", REG_CONF1,
591 data->temp_count = (status & 0x01) ? 4 : 3;
596 data->temp_count = 3;
601 data->temp_count = 4;
608 data->groups[idx++] = &emc2103_group;
609 if (data->temp_count >= 3)
610 data->groups[idx++] = &emc2103_temp3_group;
611 if (data->temp_count == 4)
612 data->groups[idx++] = &emc2103_temp4_group;
614 hwmon_dev = devm_hwmon_device_register_with_groups(&client->dev,
615 client->name, data,
616 data->groups);
620 dev_info(&client->dev, "%s: sensor '%s'\n",
621 dev_name(hwmon_dev), client->name);
632 /* Return 0 if detection is successful, -ENODEV otherwise */
636 struct i2c_adapter *adapter = new_client->adapter;
640 return -ENODEV;
644 return -ENODEV;
648 return -ENODEV;
650 strscpy(info->type, "emc2103", I2C_NAME_SIZE);