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

1 // SPDX-License-Identifier: GPL-2.0-or-later
21 * Alarms 16-bit map of active alarms
26 * Test hardware: Intel SE440BX-2 desktop motherboard --Grant
36 #include <linux/hwmon-sysfs.h>
38 #include <linux/hwmon-vid.h>
74 return (val * mul - div / 2) / div; in SCALE()
93 /* temperature range: -40..125, 127 disables temperature alarm */
96 val = clamp_val(val, -40000, 127000); in TEMP_TO_REG()
104 return -1; in FAN_FROM_REG()
124 /* per client data */
130 u8 fan_div[2]; /* rw fan1_div, read-only accessor */
131 u8 vrm; /* -- vrm set on startup, no accessor */
134 /* write new fan div, callers must hold data->update_lock */
135 static int adm9240_write_fan_div(struct adm9240_data *data, int channel, u8 fan_div) in adm9240_write_fan_div() argument
137 unsigned int reg, old, shift = (channel + 2) * 2; in adm9240_write_fan_div()
140 err = regmap_read(data->regmap, ADM9240_REG_VID_FAN_DIV, &reg); in adm9240_write_fan_div()
146 err = regmap_write(data->regmap, ADM9240_REG_VID_FAN_DIV, reg); in adm9240_write_fan_div()
149 dev_dbg(data->dev, in adm9240_write_fan_div()
151 channel + 1, BIT(old), BIT(fan_div)); in adm9240_write_fan_div()
159 * - value is zero: disable fan speed low limit alarm
161 * - value is below fan speed measurement range: enable fan speed low
164 * - otherwise: select fan clock divider to suit fan speed low limit,
167 static int adm9240_fan_min_write(struct adm9240_data *data, int channel, long val) in adm9240_fan_min_write() argument
173 mutex_lock(&data->update_lock); in adm9240_fan_min_write()
177 new_div = data->fan_div[channel]; in adm9240_fan_min_write()
179 dev_dbg(data->dev, "fan%u low limit set disabled\n", channel + 1); in adm9240_fan_min_write()
184 dev_dbg(data->dev, "fan%u low limit set minimum %u\n", in adm9240_fan_min_write()
185 channel + 1, FAN_FROM_REG(254, BIT(new_div))); in adm9240_fan_min_write()
199 dev_dbg(data->dev, "fan%u low limit set fan speed %u\n", in adm9240_fan_min_write()
200 channel + 1, FAN_FROM_REG(new_min, BIT(new_div))); in adm9240_fan_min_write()
203 if (new_div != data->fan_div[channel]) { in adm9240_fan_min_write()
204 data->fan_div[channel] = new_div; in adm9240_fan_min_write()
205 adm9240_write_fan_div(data, channel, new_div); in adm9240_fan_min_write()
207 err = regmap_write(data->regmap, ADM9240_REG_FAN_MIN(channel), fan_min); in adm9240_fan_min_write()
209 mutex_unlock(&data->update_lock); in adm9240_fan_min_write()
217 struct adm9240_data *data = dev_get_drvdata(dev); in cpu0_vid_show() local
222 err = regmap_read(data->regmap, ADM9240_REG_VID_FAN_DIV, &regval); in cpu0_vid_show()
226 err = regmap_read(data->regmap, ADM9240_REG_VID4, &regval); in cpu0_vid_show()
230 return sprintf(buf, "%d\n", vid_from_reg(vid, data->vrm)); in cpu0_vid_show()
237 struct adm9240_data *data = dev_get_drvdata(dev); in aout_output_show() local
241 err = regmap_read(data->regmap, ADM9240_REG_ANALOG_OUT, &regval); in aout_output_show()
252 struct adm9240_data *data = dev_get_drvdata(dev); in aout_output_store() local
260 err = regmap_write(data->regmap, ADM9240_REG_ANALOG_OUT, AOUT_TO_REG(val)); in aout_output_store()
275 /* Return 0 if detection is successful, -ENODEV otherwise */
279 struct i2c_adapter *adapter = new_client->adapter; in adm9240_detect()
281 int address = new_client->addr; in adm9240_detect()
285 return -ENODEV; in adm9240_detect()
289 return -ENODEV; in adm9240_detect()
300 return -ENODEV; in adm9240_detect()
304 dev_info(&adapter->dev, "found %s revision %u\n", in adm9240_detect()
308 strscpy(info->type, name, I2C_NAME_SIZE); in adm9240_detect()
313 static int adm9240_init_client(struct adm9240_data *data) in adm9240_init_client() argument
319 err = regmap_raw_read(data->regmap, ADM9240_REG_CONFIG, &conf, 1); in adm9240_init_client()
322 err = regmap_raw_read(data->regmap, ADM9240_REG_TEMP_CONF, &mode, 1); in adm9240_init_client()
327 data->vrm = vid_which_vrm(); /* need this to report vid as mV */ in adm9240_init_client()
329 dev_info(data->dev, "Using VRM: %d.%d\n", data->vrm / 10, in adm9240_init_client()
330 data->vrm % 10); in adm9240_init_client()
334 dev_info(data->dev, "status: config 0x%02x mode %u\n", in adm9240_init_client()
341 err = regmap_write(data->regmap, in adm9240_init_client()
345 err = regmap_write(data->regmap, in adm9240_init_client()
351 err = regmap_write(data->regmap, in adm9240_init_client()
357 err = regmap_write(data->regmap, in adm9240_init_client()
364 err = regmap_write(data->regmap, ADM9240_REG_CONFIG, 1); in adm9240_init_client()
368 dev_info(data->dev, in adm9240_init_client()
373 err = regmap_read(data->regmap, ADM9240_REG_VID_FAN_DIV, &regval); in adm9240_init_client()
376 data->fan_div[0] = (regval >> 4) & 3; in adm9240_init_client()
377 data->fan_div[1] = (regval >> 6) & 3; in adm9240_init_client()
383 struct adm9240_data *data = dev_get_drvdata(dev); in adm9240_chip_read() local
389 err = regmap_bulk_read(data->regmap, ADM9240_REG_INT(0), &regs, 2); in adm9240_chip_read()
395 return -EOPNOTSUPP; in adm9240_chip_read()
402 struct adm9240_data *data = dev_get_drvdata(dev); in adm9240_intrusion_read() local
408 err = regmap_read(data->regmap, ADM9240_REG_INT(1), &regval); in adm9240_intrusion_read()
414 return -EOPNOTSUPP; in adm9240_intrusion_read()
421 struct adm9240_data *data = dev_get_drvdata(dev); in adm9240_intrusion_write() local
427 return -EINVAL; in adm9240_intrusion_write()
428 err = regmap_write(data->regmap, ADM9240_REG_CHASSIS_CLEAR, 0x80); in adm9240_intrusion_write()
431 dev_dbg(data->dev, "chassis intrusion latch cleared\n"); in adm9240_intrusion_write()
434 return -EOPNOTSUPP; in adm9240_intrusion_write()
439 static int adm9240_in_read(struct device *dev, u32 attr, int channel, long *val) in adm9240_in_read() argument
441 struct adm9240_data *data = dev_get_drvdata(dev); in adm9240_in_read() local
448 reg = ADM9240_REG_IN(channel); in adm9240_in_read()
451 reg = ADM9240_REG_IN_MIN(channel); in adm9240_in_read()
454 reg = ADM9240_REG_IN_MAX(channel); in adm9240_in_read()
457 if (channel < 4) { in adm9240_in_read()
461 channel -= 4; in adm9240_in_read()
463 err = regmap_read(data->regmap, reg, &regval); in adm9240_in_read()
466 *val = !!(regval & BIT(channel)); in adm9240_in_read()
469 return -EOPNOTSUPP; in adm9240_in_read()
471 err = regmap_read(data->regmap, reg, &regval); in adm9240_in_read()
474 *val = IN_FROM_REG(regval, channel); in adm9240_in_read()
478 static int adm9240_in_write(struct device *dev, u32 attr, int channel, long val) in adm9240_in_write() argument
480 struct adm9240_data *data = dev_get_drvdata(dev); in adm9240_in_write() local
485 reg = ADM9240_REG_IN_MIN(channel); in adm9240_in_write()
488 reg = ADM9240_REG_IN_MAX(channel); in adm9240_in_write()
491 return -EOPNOTSUPP; in adm9240_in_write()
493 return regmap_write(data->regmap, reg, IN_TO_REG(val, channel)); in adm9240_in_write()
496 static int adm9240_fan_read(struct device *dev, u32 attr, int channel, long *val) in adm9240_fan_read() argument
498 struct adm9240_data *data = dev_get_drvdata(dev); in adm9240_fan_read() local
504 mutex_lock(&data->update_lock); in adm9240_fan_read()
505 err = regmap_read(data->regmap, ADM9240_REG_FAN(channel), &regval); in adm9240_fan_read()
507 mutex_unlock(&data->update_lock); in adm9240_fan_read()
510 if (regval == 255 && data->fan_div[channel] < 3) { in adm9240_fan_read()
512 err = adm9240_write_fan_div(data, channel, in adm9240_fan_read()
513 ++data->fan_div[channel]); in adm9240_fan_read()
515 mutex_unlock(&data->update_lock); in adm9240_fan_read()
519 *val = FAN_FROM_REG(regval, BIT(data->fan_div[channel])); in adm9240_fan_read()
520 mutex_unlock(&data->update_lock); in adm9240_fan_read()
523 *val = BIT(data->fan_div[channel]); in adm9240_fan_read()
526 err = regmap_read(data->regmap, ADM9240_REG_FAN_MIN(channel), &regval); in adm9240_fan_read()
529 *val = FAN_FROM_REG(regval, BIT(data->fan_div[channel])); in adm9240_fan_read()
532 err = regmap_read(data->regmap, ADM9240_REG_INT(0), &regval); in adm9240_fan_read()
535 *val = !!(regval & BIT(channel + 6)); in adm9240_fan_read()
538 return -EOPNOTSUPP; in adm9240_fan_read()
543 static int adm9240_fan_write(struct device *dev, u32 attr, int channel, long val) in adm9240_fan_write() argument
545 struct adm9240_data *data = dev_get_drvdata(dev); in adm9240_fan_write() local
550 err = adm9240_fan_min_write(data, channel, val); in adm9240_fan_write()
555 return -EOPNOTSUPP; in adm9240_fan_write()
560 static int adm9240_temp_read(struct device *dev, u32 attr, int channel, long *val) in adm9240_temp_read() argument
562 struct adm9240_data *data = dev_get_drvdata(dev); in adm9240_temp_read() local
568 err = regmap_read(data->regmap, ADM9240_REG_TEMP, &regval); in adm9240_temp_read()
572 err = regmap_read(data->regmap, ADM9240_REG_TEMP_CONF, &regval); in adm9240_temp_read()
579 err = regmap_read(data->regmap, ADM9240_REG_TEMP_MAX(0), &regval); in adm9240_temp_read()
585 err = regmap_read(data->regmap, ADM9240_REG_TEMP_MAX(1), &regval); in adm9240_temp_read()
591 err = regmap_read(data->regmap, ADM9240_REG_INT(0), &regval); in adm9240_temp_read()
597 return -EOPNOTSUPP; in adm9240_temp_read()
602 static int adm9240_temp_write(struct device *dev, u32 attr, int channel, long val) in adm9240_temp_write() argument
604 struct adm9240_data *data = dev_get_drvdata(dev); in adm9240_temp_write() local
615 return -EOPNOTSUPP; in adm9240_temp_write()
617 return regmap_write(data->regmap, reg, TEMP_TO_REG(val)); in adm9240_temp_write()
621 int channel, long *val) in adm9240_read() argument
629 return adm9240_in_read(dev, attr, channel, val); in adm9240_read()
631 return adm9240_fan_read(dev, attr, channel, val); in adm9240_read()
633 return adm9240_temp_read(dev, attr, channel, val); in adm9240_read()
635 return -EOPNOTSUPP; in adm9240_read()
640 int channel, long val) in adm9240_write() argument
646 return adm9240_in_write(dev, attr, channel, val); in adm9240_write()
648 return adm9240_fan_write(dev, attr, channel, val); in adm9240_write()
650 return adm9240_temp_write(dev, attr, channel, val); in adm9240_write()
652 return -EOPNOTSUPP; in adm9240_write()
657 u32 attr, int channel) in adm9240_is_visible() argument
784 struct device *dev = &client->dev; in adm9240_probe()
786 struct adm9240_data *data; in adm9240_probe() local
789 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); in adm9240_probe()
790 if (!data) in adm9240_probe()
791 return -ENOMEM; in adm9240_probe()
793 data->dev = dev; in adm9240_probe()
794 mutex_init(&data->update_lock); in adm9240_probe()
795 data->regmap = devm_regmap_init_i2c(client, &adm9240_regmap_config); in adm9240_probe()
796 if (IS_ERR(data->regmap)) in adm9240_probe()
797 return PTR_ERR(data->regmap); in adm9240_probe()
799 err = adm9240_init_client(data); in adm9240_probe()
803 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, data, in adm9240_probe()