Lines Matching +full:reg +full:- +full:names
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * smsc47m1.c - Part of lm_sensors, Linux kernel modules
8 * Super-I/O chips.
11 * Copyright (C) 2004-2007 Jean Delvare <jdelvare@suse.de>
24 #include <linux/hwmon-sysfs.h>
41 /* Super-I/0 registers and commands */
43 #define REG 0x2e /* The register to read/write */ macro
47 superio_outb(int reg, int val) in superio_outb() argument
49 outb(reg, REG); in superio_outb()
54 superio_inb(int reg) in superio_inb() argument
56 outb(reg, REG); in superio_inb()
66 if (!request_muxed_region(REG, 2, DRVNAME)) in superio_enter()
67 return -EBUSY; in superio_enter()
69 outb(0x55, REG); in superio_enter()
76 outb(0xAA, REG); in superio_exit()
77 release_region(REG, 2); in superio_exit()
91 #define SMSC47M1_REG_TPIN(nr) (0x34 - (nr))
92 #define SMSC47M1_REG_PPIN(nr) (0x36 - (nr))
106 #define MIN_FROM_REG(reg, div) ((reg) >= 192 ? 0 : \ argument
107 983040 / ((192 - (reg)) * (div)))
108 #define FAN_FROM_REG(reg, div, preload) ((reg) <= (preload) || (reg) == 255 ? \ argument
110 983040 / (((reg) - (preload)) * (div)))
111 #define DIV_FROM_REG(reg) (1 << (reg)) argument
112 #define PWM_FROM_REG(reg) (((reg) & 0x7E) << 1) argument
113 #define PWM_EN_FROM_REG(reg) ((~(reg)) & 0x01) argument
114 #define PWM_TO_REG(reg) (((reg) >> 1) & 0x7E) argument
137 static inline int smsc47m1_read_value(struct smsc47m1_data *data, u8 reg) in smsc47m1_read_value() argument
139 return inb_p(data->addr + reg); in smsc47m1_read_value()
142 static inline void smsc47m1_write_value(struct smsc47m1_data *data, u8 reg, in smsc47m1_write_value() argument
145 outb_p(value, data->addr + reg); in smsc47m1_write_value()
153 mutex_lock(&data->update_lock); in smsc47m1_update_device()
155 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || init) { in smsc47m1_update_device()
157 fan_nr = data->type == smsc47m2 ? 3 : 2; in smsc47m1_update_device()
160 data->fan[i] = smsc47m1_read_value(data, in smsc47m1_update_device()
162 data->fan_preload[i] = smsc47m1_read_value(data, in smsc47m1_update_device()
164 data->pwm[i] = smsc47m1_read_value(data, in smsc47m1_update_device()
169 data->fan_div[0] = (i >> 4) & 0x03; in smsc47m1_update_device()
170 data->fan_div[1] = i >> 6; in smsc47m1_update_device()
172 data->alarms = smsc47m1_read_value(data, in smsc47m1_update_device()
175 if (data->alarms) in smsc47m1_update_device()
179 data->fan_div[2] = (smsc47m1_read_value(data, in smsc47m1_update_device()
181 data->alarms |= (smsc47m1_read_value(data, in smsc47m1_update_device()
184 if (data->alarms & 0x04) in smsc47m1_update_device()
190 data->last_updated = jiffies; in smsc47m1_update_device()
193 mutex_unlock(&data->update_lock); in smsc47m1_update_device()
202 int nr = attr->index; in fan_show()
209 int rpm = (data->pwm[nr] & 0x7F) == 0x00 ? 0 : in fan_show()
210 FAN_FROM_REG(data->fan[nr], in fan_show()
211 DIV_FROM_REG(data->fan_div[nr]), in fan_show()
212 data->fan_preload[nr]); in fan_show()
221 int nr = attr->index; in fan_min_show()
222 int rpm = MIN_FROM_REG(data->fan_preload[nr], in fan_min_show()
223 DIV_FROM_REG(data->fan_div[nr])); in fan_min_show()
232 return sprintf(buf, "%d\n", DIV_FROM_REG(data->fan_div[attr->index])); in fan_div_show()
238 int bitnr = to_sensor_dev_attr(devattr)->index; in fan_alarm_show()
240 return sprintf(buf, "%u\n", (data->alarms >> bitnr) & 1); in fan_alarm_show()
248 return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[attr->index])); in pwm_show()
256 return sprintf(buf, "%d\n", PWM_EN_FROM_REG(data->pwm[attr->index])); in pwm_en_show()
263 return sprintf(buf, "%d\n", data->alarms); in alarms_show()
272 int nr = attr->index; in fan_min_store()
281 mutex_lock(&data->update_lock); in fan_min_store()
282 rpmdiv = val * DIV_FROM_REG(data->fan_div[nr]); in fan_min_store()
285 mutex_unlock(&data->update_lock); in fan_min_store()
286 return -EINVAL; in fan_min_store()
289 data->fan_preload[nr] = 192 - ((983040 + rpmdiv / 2) / rpmdiv); in fan_min_store()
291 data->fan_preload[nr]); in fan_min_store()
292 mutex_unlock(&data->update_lock); in fan_min_store()
309 int nr = attr->index; in fan_div_store()
313 u8 old_div = DIV_FROM_REG(data->fan_div[nr]); in fan_div_store()
322 mutex_lock(&data->update_lock); in fan_div_store()
325 data->fan_div[nr] = 0; in fan_div_store()
328 data->fan_div[nr] = 1; in fan_div_store()
331 data->fan_div[nr] = 2; in fan_div_store()
334 data->fan_div[nr] = 3; in fan_div_store()
337 mutex_unlock(&data->update_lock); in fan_div_store()
338 return -EINVAL; in fan_div_store()
346 tmp |= data->fan_div[nr] << (4 + 2 * nr); in fan_div_store()
351 tmp |= data->fan_div[2] << 4; in fan_div_store()
359 tmp = 192 - (old_div * (192 - data->fan_preload[nr]) in fan_div_store()
361 data->fan_preload[nr] = clamp_val(tmp, 0, 191); in fan_div_store()
363 data->fan_preload[nr]); in fan_div_store()
364 mutex_unlock(&data->update_lock); in fan_div_store()
374 int nr = attr->index; in pwm_store()
383 return -EINVAL; in pwm_store()
385 mutex_lock(&data->update_lock); in pwm_store()
386 data->pwm[nr] &= 0x81; /* Preserve additional bits */ in pwm_store()
387 data->pwm[nr] |= PWM_TO_REG(val); in pwm_store()
389 data->pwm[nr]); in pwm_store()
390 mutex_unlock(&data->update_lock); in pwm_store()
401 int nr = attr->index; in pwm_en_store()
410 return -EINVAL; in pwm_en_store()
412 mutex_lock(&data->update_lock); in pwm_en_store()
413 data->pwm[nr] &= 0xFE; /* preserve the other bits */ in pwm_en_store()
414 data->pwm[nr] |= !val; in pwm_en_store()
416 data->pwm[nr]); in pwm_en_store()
417 mutex_unlock(&data->update_lock); in pwm_en_store()
448 return sprintf(buf, "%s\n", data->name); in name_show()
557 sio_data->type = smsc47m1; in smsc47m1_find()
561 sio_data->type = smsc47m1; in smsc47m1_find()
565 sio_data->type = smsc47m1; in smsc47m1_find()
569 sio_data->type = smsc47m1; in smsc47m1_find()
575 return -ENODEV; in smsc47m1_find()
579 sio_data->type = smsc47m2; in smsc47m1_find()
583 return -ENODEV; in smsc47m1_find()
592 return -ENODEV; in smsc47m1_find()
599 sio_data->activate = superio_inb(SUPERIO_REG_ACT); in smsc47m1_find()
600 if ((sio_data->activate & 0x01) == 0) { in smsc47m1_find()
602 superio_outb(SUPERIO_REG_ACT, sio_data->activate | 0x01); in smsc47m1_find()
612 if ((sio_data->activate & 0x01) == 0) { in smsc47m1_restore()
616 superio_outb(SUPERIO_REG_ACT, sio_data->activate); in smsc47m1_restore()
629 * - test for resource conflicts with ACPI
630 * - request the resources
685 "Region 0x%hx-0x%hx already in use!\n", in smsc47m1_handle_resources()
687 return -EBUSY; in smsc47m1_handle_resources()
698 sysfs_remove_group(&dev->kobj, &smsc47m1_group); in smsc47m1_remove_files()
699 sysfs_remove_group(&dev->kobj, &smsc47m1_group_fan1); in smsc47m1_remove_files()
700 sysfs_remove_group(&dev->kobj, &smsc47m1_group_fan2); in smsc47m1_remove_files()
701 sysfs_remove_group(&dev->kobj, &smsc47m1_group_fan3); in smsc47m1_remove_files()
702 sysfs_remove_group(&dev->kobj, &smsc47m1_group_pwm1); in smsc47m1_remove_files()
703 sysfs_remove_group(&dev->kobj, &smsc47m1_group_pwm2); in smsc47m1_remove_files()
704 sysfs_remove_group(&dev->kobj, &smsc47m1_group_pwm3); in smsc47m1_remove_files()
709 struct device *dev = &pdev->dev; in smsc47m1_probe()
716 static const char * const names[] = { in smsc47m1_probe() local
722 err = smsc47m1_handle_resources(res->start, sio_data->type, in smsc47m1_probe()
729 return -ENOMEM; in smsc47m1_probe()
731 data->addr = res->start; in smsc47m1_probe()
732 data->type = sio_data->type; in smsc47m1_probe()
733 data->name = names[sio_data->type]; in smsc47m1_probe()
734 mutex_init(&data->update_lock); in smsc47m1_probe()
745 if (data->type == smsc47m2) { in smsc47m1_probe()
764 return -ENODEV; in smsc47m1_probe()
779 err = sysfs_create_group(&dev->kobj, in smsc47m1_probe()
787 err = sysfs_create_group(&dev->kobj, in smsc47m1_probe()
795 err = sysfs_create_group(&dev->kobj, in smsc47m1_probe()
799 } else if (data->type == smsc47m2) in smsc47m1_probe()
803 err = sysfs_create_group(&dev->kobj, in smsc47m1_probe()
811 err = sysfs_create_group(&dev->kobj, in smsc47m1_probe()
819 err = sysfs_create_group(&dev->kobj, in smsc47m1_probe()
823 } else if (data->type == smsc47m2) in smsc47m1_probe()
826 err = sysfs_create_group(&dev->kobj, &smsc47m1_group); in smsc47m1_probe()
830 data->hwmon_dev = hwmon_device_register(dev); in smsc47m1_probe()
831 if (IS_ERR(data->hwmon_dev)) { in smsc47m1_probe()
832 err = PTR_ERR(data->hwmon_dev); in smsc47m1_probe()
847 hwmon_device_unregister(data->hwmon_dev); in smsc47m1_remove()
848 smsc47m1_remove_files(&pdev->dev); in smsc47m1_remove()
865 .end = address + SMSC_EXTENT - 1, in smsc47m1_device_add()
871 err = smsc47m1_handle_resources(address, sio_data->type, CHECK, NULL); in smsc47m1_device_add()
877 err = -ENOMEM; in smsc47m1_device_add()
940 smsc47m1_restore(dev_get_platdata(&pdev->dev)); in sm_smsc47m1_exit()