Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging

Pull hwmon update from Jean Delvare:
"This contains a single thing: a new driver for the temperature sensor
embedded in the Intel 5500/5520/X58 chipsets.

Sorry for the late request, it's been so long since I last sent a pull
request and I've been so busy with other tasks meanwhile that I simply
forgot about these patches. But given that this is a new driver, it
can't introduce any regression so I thought it could still be OK.

This has been in linux-next for months now"

* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging:
hwmon: (i5500_temp) Convert to use ATTRIBUTE_GROUPS macro
hwmon: (i5500_temp) Convert to module_pci_driver
hwmon: (i5500_temp) Don't bind to disabled sensors
hwmon: (i5500_temp) Convert to devm_hwmon_device_register_with_groups
hwmon: (i5500_temp) New driver for the Intel 5500/5520/X58 chipsets

+160
+10
drivers/hwmon/Kconfig
··· 574 574 for those channels specified in the map. This map can be provided 575 575 either via platform data or the device tree bindings. 576 576 577 + config SENSORS_I5500 578 + tristate "Intel 5500/5520/X58 temperature sensor" 579 + depends on X86 && PCI 580 + help 581 + If you say yes here you get support for the temperature 582 + sensor inside the Intel 5500, 5520 and X58 chipsets. 583 + 584 + This driver can also be built as a module. If so, the module 585 + will be called i5500_temp. 586 + 577 587 config SENSORS_CORETEMP 578 588 tristate "Intel Core/Core2/Atom temperature sensor" 579 589 depends on X86
+1
drivers/hwmon/Makefile
··· 68 68 obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o 69 69 obj-$(CONFIG_SENSORS_HTU21) += htu21.o 70 70 obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o 71 + obj-$(CONFIG_SENSORS_I5500) += i5500_temp.o 71 72 obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o 72 73 obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o 73 74 obj-$(CONFIG_SENSORS_IBMPEX) += ibmpex.o
+149
drivers/hwmon/i5500_temp.c
··· 1 + /* 2 + * i5500_temp - Driver for Intel 5500/5520/X58 chipset thermal sensor 3 + * 4 + * Copyright (C) 2012, 2014 Jean Delvare <jdelvare@suse.de> 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; either version 2 of the License, or 9 + * (at your option) any later version. 10 + * 11 + * This program is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + * GNU General Public License for more details. 15 + */ 16 + 17 + #include <linux/module.h> 18 + #include <linux/init.h> 19 + #include <linux/slab.h> 20 + #include <linux/jiffies.h> 21 + #include <linux/device.h> 22 + #include <linux/pci.h> 23 + #include <linux/hwmon.h> 24 + #include <linux/hwmon-sysfs.h> 25 + #include <linux/err.h> 26 + #include <linux/mutex.h> 27 + 28 + /* Register definitions from datasheet */ 29 + #define REG_TSTHRCATA 0xE2 30 + #define REG_TSCTRL 0xE8 31 + #define REG_TSTHRRPEX 0xEB 32 + #define REG_TSTHRLO 0xEC 33 + #define REG_TSTHRHI 0xEE 34 + #define REG_CTHINT 0xF0 35 + #define REG_TSFSC 0xF3 36 + #define REG_CTSTS 0xF4 37 + #define REG_TSTHRRQPI 0xF5 38 + #define REG_CTCTRL 0xF7 39 + #define REG_TSTIMER 0xF8 40 + 41 + /* 42 + * Sysfs stuff 43 + */ 44 + 45 + /* Sensor resolution : 0.5 degree C */ 46 + static ssize_t show_temp(struct device *dev, 47 + struct device_attribute *devattr, char *buf) 48 + { 49 + struct pci_dev *pdev = to_pci_dev(dev->parent); 50 + long temp; 51 + u16 tsthrhi; 52 + s8 tsfsc; 53 + 54 + pci_read_config_word(pdev, REG_TSTHRHI, &tsthrhi); 55 + pci_read_config_byte(pdev, REG_TSFSC, &tsfsc); 56 + temp = ((long)tsthrhi - tsfsc) * 500; 57 + 58 + return sprintf(buf, "%ld\n", temp); 59 + } 60 + 61 + static ssize_t show_thresh(struct device *dev, 62 + struct device_attribute *devattr, char *buf) 63 + { 64 + struct pci_dev *pdev = to_pci_dev(dev->parent); 65 + int reg = to_sensor_dev_attr(devattr)->index; 66 + long temp; 67 + u16 tsthr; 68 + 69 + pci_read_config_word(pdev, reg, &tsthr); 70 + temp = tsthr * 500; 71 + 72 + return sprintf(buf, "%ld\n", temp); 73 + } 74 + 75 + static ssize_t show_alarm(struct device *dev, 76 + struct device_attribute *devattr, char *buf) 77 + { 78 + struct pci_dev *pdev = to_pci_dev(dev->parent); 79 + int nr = to_sensor_dev_attr(devattr)->index; 80 + u8 ctsts; 81 + 82 + pci_read_config_byte(pdev, REG_CTSTS, &ctsts); 83 + return sprintf(buf, "%u\n", (unsigned int)ctsts & (1 << nr)); 84 + } 85 + 86 + static DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL); 87 + static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_thresh, NULL, 0xE2); 88 + static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IRUGO, show_thresh, NULL, 0xEC); 89 + static SENSOR_DEVICE_ATTR(temp1_max, S_IRUGO, show_thresh, NULL, 0xEE); 90 + static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 0); 91 + static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 1); 92 + 93 + static struct attribute *i5500_temp_attrs[] = { 94 + &dev_attr_temp1_input.attr, 95 + &sensor_dev_attr_temp1_crit.dev_attr.attr, 96 + &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, 97 + &sensor_dev_attr_temp1_max.dev_attr.attr, 98 + &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, 99 + &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, 100 + NULL 101 + }; 102 + 103 + ATTRIBUTE_GROUPS(i5500_temp); 104 + 105 + static const struct pci_device_id i5500_temp_ids[] = { 106 + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3438) }, 107 + { 0 }, 108 + }; 109 + 110 + MODULE_DEVICE_TABLE(pci, i5500_temp_ids); 111 + 112 + static int i5500_temp_probe(struct pci_dev *pdev, 113 + const struct pci_device_id *id) 114 + { 115 + int err; 116 + struct device *hwmon_dev; 117 + u32 tstimer; 118 + s8 tsfsc; 119 + 120 + err = pci_enable_device(pdev); 121 + if (err) { 122 + dev_err(&pdev->dev, "Failed to enable device\n"); 123 + return err; 124 + } 125 + 126 + pci_read_config_byte(pdev, REG_TSFSC, &tsfsc); 127 + pci_read_config_dword(pdev, REG_TSTIMER, &tstimer); 128 + if (tsfsc == 0x7F && tstimer == 0x07D30D40) { 129 + dev_notice(&pdev->dev, "Sensor seems to be disabled\n"); 130 + return -ENODEV; 131 + } 132 + 133 + hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev, 134 + "intel5500", NULL, 135 + i5500_temp_groups); 136 + return PTR_ERR_OR_ZERO(hwmon_dev); 137 + } 138 + 139 + static struct pci_driver i5500_temp_driver = { 140 + .name = "i5500_temp", 141 + .id_table = i5500_temp_ids, 142 + .probe = i5500_temp_probe, 143 + }; 144 + 145 + module_pci_driver(i5500_temp_driver); 146 + 147 + MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>"); 148 + MODULE_DESCRIPTION("Intel 5500/5520/X58 chipset thermal sensor driver"); 149 + MODULE_LICENSE("GPL");