diff options
Diffstat (limited to 'drivers/hwmon/applesmc.c')
-rw-r--r-- | drivers/hwmon/applesmc.c | 186 |
1 files changed, 185 insertions, 1 deletions
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index f085c18d2905..b6598aa557a0 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
@@ -148,6 +148,20 @@ static const char *temperature_sensors_sets[][41] = { | |||
148 | /* Set 18: MacBook Pro 2,2 */ | 148 | /* Set 18: MacBook Pro 2,2 */ |
149 | { "TB0T", "TC0D", "TC0P", "TG0H", "TG0P", "TG0T", "TM0P", "TTF0", | 149 | { "TB0T", "TC0D", "TC0P", "TG0H", "TG0P", "TG0T", "TM0P", "TTF0", |
150 | "Th0H", "Th1H", "Tm0P", "Ts0P", NULL }, | 150 | "Th0H", "Th1H", "Tm0P", "Ts0P", NULL }, |
151 | /* Set 19: Macbook Pro 5,3 */ | ||
152 | { "TB0T", "TB1T", "TB2T", "TB3T", "TC0D", "TC0F", "TC0P", "TG0D", | ||
153 | "TG0F", "TG0H", "TG0P", "TG0T", "TN0D", "TN0P", "TTF0", "Th2H", | ||
154 | "Tm0P", "Ts0P", "Ts0S", NULL }, | ||
155 | /* Set 20: MacBook Pro 5,4 */ | ||
156 | { "TB0T", "TB1T", "TB2T", "TB3T", "TC0D", "TC0F", "TC0P", "TN0D", | ||
157 | "TN0P", "TTF0", "Th2H", "Ts0P", "Ts0S", NULL }, | ||
158 | /* Set 21: MacBook Pro 6,2 */ | ||
159 | { "TB0T", "TB1T", "TB2T", "TC0C", "TC0D", "TC0P", "TC1C", "TG0D", | ||
160 | "TG0P", "TG0T", "TMCD", "TP0P", "TPCD", "Th1H", "Th2H", "Tm0P", | ||
161 | "Ts0P", "Ts0S", NULL }, | ||
162 | /* Set 22: MacBook Pro 7,1 */ | ||
163 | { "TB0T", "TB1T", "TB2T", "TC0D", "TC0P", "TN0D", "TN0P", "TN0S", | ||
164 | "TN1D", "TN1F", "TN1G", "TN1S", "Th1H", "Ts0P", "Ts0S", NULL }, | ||
151 | }; | 165 | }; |
152 | 166 | ||
153 | /* List of keys used to read/write fan speeds */ | 167 | /* List of keys used to read/write fan speeds */ |
@@ -646,6 +660,17 @@ out: | |||
646 | return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", left, right); | 660 | return snprintf(sysfsbuf, PAGE_SIZE, "(%d,%d)\n", left, right); |
647 | } | 661 | } |
648 | 662 | ||
663 | /* Displays sensor key as label */ | ||
664 | static ssize_t applesmc_show_sensor_label(struct device *dev, | ||
665 | struct device_attribute *devattr, char *sysfsbuf) | ||
666 | { | ||
667 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
668 | const char *key = | ||
669 | temperature_sensors_sets[applesmc_temperature_set][attr->index]; | ||
670 | |||
671 | return snprintf(sysfsbuf, PAGE_SIZE, "%s\n", key); | ||
672 | } | ||
673 | |||
649 | /* Displays degree Celsius * 1000 */ | 674 | /* Displays degree Celsius * 1000 */ |
650 | static ssize_t applesmc_show_temperature(struct device *dev, | 675 | static ssize_t applesmc_show_temperature(struct device *dev, |
651 | struct device_attribute *devattr, char *sysfsbuf) | 676 | struct device_attribute *devattr, char *sysfsbuf) |
@@ -1113,6 +1138,86 @@ static const struct attribute_group fan_attribute_groups[] = { | |||
1113 | /* | 1138 | /* |
1114 | * Temperature sensors sysfs entries. | 1139 | * Temperature sensors sysfs entries. |
1115 | */ | 1140 | */ |
1141 | static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, | ||
1142 | applesmc_show_sensor_label, NULL, 0); | ||
1143 | static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, | ||
1144 | applesmc_show_sensor_label, NULL, 1); | ||
1145 | static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, | ||
1146 | applesmc_show_sensor_label, NULL, 2); | ||
1147 | static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, | ||
1148 | applesmc_show_sensor_label, NULL, 3); | ||
1149 | static SENSOR_DEVICE_ATTR(temp5_label, S_IRUGO, | ||
1150 | applesmc_show_sensor_label, NULL, 4); | ||
1151 | static SENSOR_DEVICE_ATTR(temp6_label, S_IRUGO, | ||
1152 | applesmc_show_sensor_label, NULL, 5); | ||
1153 | static SENSOR_DEVICE_ATTR(temp7_label, S_IRUGO, | ||
1154 | applesmc_show_sensor_label, NULL, 6); | ||
1155 | static SENSOR_DEVICE_ATTR(temp8_label, S_IRUGO, | ||
1156 | applesmc_show_sensor_label, NULL, 7); | ||
1157 | static SENSOR_DEVICE_ATTR(temp9_label, S_IRUGO, | ||
1158 | applesmc_show_sensor_label, NULL, 8); | ||
1159 | static SENSOR_DEVICE_ATTR(temp10_label, S_IRUGO, | ||
1160 | applesmc_show_sensor_label, NULL, 9); | ||
1161 | static SENSOR_DEVICE_ATTR(temp11_label, S_IRUGO, | ||
1162 | applesmc_show_sensor_label, NULL, 10); | ||
1163 | static SENSOR_DEVICE_ATTR(temp12_label, S_IRUGO, | ||
1164 | applesmc_show_sensor_label, NULL, 11); | ||
1165 | static SENSOR_DEVICE_ATTR(temp13_label, S_IRUGO, | ||
1166 | applesmc_show_sensor_label, NULL, 12); | ||
1167 | static SENSOR_DEVICE_ATTR(temp14_label, S_IRUGO, | ||
1168 | applesmc_show_sensor_label, NULL, 13); | ||
1169 | static SENSOR_DEVICE_ATTR(temp15_label, S_IRUGO, | ||
1170 | applesmc_show_sensor_label, NULL, 14); | ||
1171 | static SENSOR_DEVICE_ATTR(temp16_label, S_IRUGO, | ||
1172 | applesmc_show_sensor_label, NULL, 15); | ||
1173 | static SENSOR_DEVICE_ATTR(temp17_label, S_IRUGO, | ||
1174 | applesmc_show_sensor_label, NULL, 16); | ||
1175 | static SENSOR_DEVICE_ATTR(temp18_label, S_IRUGO, | ||
1176 | applesmc_show_sensor_label, NULL, 17); | ||
1177 | static SENSOR_DEVICE_ATTR(temp19_label, S_IRUGO, | ||
1178 | applesmc_show_sensor_label, NULL, 18); | ||
1179 | static SENSOR_DEVICE_ATTR(temp20_label, S_IRUGO, | ||
1180 | applesmc_show_sensor_label, NULL, 19); | ||
1181 | static SENSOR_DEVICE_ATTR(temp21_label, S_IRUGO, | ||
1182 | applesmc_show_sensor_label, NULL, 20); | ||
1183 | static SENSOR_DEVICE_ATTR(temp22_label, S_IRUGO, | ||
1184 | applesmc_show_sensor_label, NULL, 21); | ||
1185 | static SENSOR_DEVICE_ATTR(temp23_label, S_IRUGO, | ||
1186 | applesmc_show_sensor_label, NULL, 22); | ||
1187 | static SENSOR_DEVICE_ATTR(temp24_label, S_IRUGO, | ||
1188 | applesmc_show_sensor_label, NULL, 23); | ||
1189 | static SENSOR_DEVICE_ATTR(temp25_label, S_IRUGO, | ||
1190 | applesmc_show_sensor_label, NULL, 24); | ||
1191 | static SENSOR_DEVICE_ATTR(temp26_label, S_IRUGO, | ||
1192 | applesmc_show_sensor_label, NULL, 25); | ||
1193 | static SENSOR_DEVICE_ATTR(temp27_label, S_IRUGO, | ||
1194 | applesmc_show_sensor_label, NULL, 26); | ||
1195 | static SENSOR_DEVICE_ATTR(temp28_label, S_IRUGO, | ||
1196 | applesmc_show_sensor_label, NULL, 27); | ||
1197 | static SENSOR_DEVICE_ATTR(temp29_label, S_IRUGO, | ||
1198 | applesmc_show_sensor_label, NULL, 28); | ||
1199 | static SENSOR_DEVICE_ATTR(temp30_label, S_IRUGO, | ||
1200 | applesmc_show_sensor_label, NULL, 29); | ||
1201 | static SENSOR_DEVICE_ATTR(temp31_label, S_IRUGO, | ||
1202 | applesmc_show_sensor_label, NULL, 30); | ||
1203 | static SENSOR_DEVICE_ATTR(temp32_label, S_IRUGO, | ||
1204 | applesmc_show_sensor_label, NULL, 31); | ||
1205 | static SENSOR_DEVICE_ATTR(temp33_label, S_IRUGO, | ||
1206 | applesmc_show_sensor_label, NULL, 32); | ||
1207 | static SENSOR_DEVICE_ATTR(temp34_label, S_IRUGO, | ||
1208 | applesmc_show_sensor_label, NULL, 33); | ||
1209 | static SENSOR_DEVICE_ATTR(temp35_label, S_IRUGO, | ||
1210 | applesmc_show_sensor_label, NULL, 34); | ||
1211 | static SENSOR_DEVICE_ATTR(temp36_label, S_IRUGO, | ||
1212 | applesmc_show_sensor_label, NULL, 35); | ||
1213 | static SENSOR_DEVICE_ATTR(temp37_label, S_IRUGO, | ||
1214 | applesmc_show_sensor_label, NULL, 36); | ||
1215 | static SENSOR_DEVICE_ATTR(temp38_label, S_IRUGO, | ||
1216 | applesmc_show_sensor_label, NULL, 37); | ||
1217 | static SENSOR_DEVICE_ATTR(temp39_label, S_IRUGO, | ||
1218 | applesmc_show_sensor_label, NULL, 38); | ||
1219 | static SENSOR_DEVICE_ATTR(temp40_label, S_IRUGO, | ||
1220 | applesmc_show_sensor_label, NULL, 39); | ||
1116 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, | 1221 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, |
1117 | applesmc_show_temperature, NULL, 0); | 1222 | applesmc_show_temperature, NULL, 0); |
1118 | static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, | 1223 | static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, |
@@ -1194,6 +1299,50 @@ static SENSOR_DEVICE_ATTR(temp39_input, S_IRUGO, | |||
1194 | static SENSOR_DEVICE_ATTR(temp40_input, S_IRUGO, | 1299 | static SENSOR_DEVICE_ATTR(temp40_input, S_IRUGO, |
1195 | applesmc_show_temperature, NULL, 39); | 1300 | applesmc_show_temperature, NULL, 39); |
1196 | 1301 | ||
1302 | static struct attribute *label_attributes[] = { | ||
1303 | &sensor_dev_attr_temp1_label.dev_attr.attr, | ||
1304 | &sensor_dev_attr_temp2_label.dev_attr.attr, | ||
1305 | &sensor_dev_attr_temp3_label.dev_attr.attr, | ||
1306 | &sensor_dev_attr_temp4_label.dev_attr.attr, | ||
1307 | &sensor_dev_attr_temp5_label.dev_attr.attr, | ||
1308 | &sensor_dev_attr_temp6_label.dev_attr.attr, | ||
1309 | &sensor_dev_attr_temp7_label.dev_attr.attr, | ||
1310 | &sensor_dev_attr_temp8_label.dev_attr.attr, | ||
1311 | &sensor_dev_attr_temp9_label.dev_attr.attr, | ||
1312 | &sensor_dev_attr_temp10_label.dev_attr.attr, | ||
1313 | &sensor_dev_attr_temp11_label.dev_attr.attr, | ||
1314 | &sensor_dev_attr_temp12_label.dev_attr.attr, | ||
1315 | &sensor_dev_attr_temp13_label.dev_attr.attr, | ||
1316 | &sensor_dev_attr_temp14_label.dev_attr.attr, | ||
1317 | &sensor_dev_attr_temp15_label.dev_attr.attr, | ||
1318 | &sensor_dev_attr_temp16_label.dev_attr.attr, | ||
1319 | &sensor_dev_attr_temp17_label.dev_attr.attr, | ||
1320 | &sensor_dev_attr_temp18_label.dev_attr.attr, | ||
1321 | &sensor_dev_attr_temp19_label.dev_attr.attr, | ||
1322 | &sensor_dev_attr_temp20_label.dev_attr.attr, | ||
1323 | &sensor_dev_attr_temp21_label.dev_attr.attr, | ||
1324 | &sensor_dev_attr_temp22_label.dev_attr.attr, | ||
1325 | &sensor_dev_attr_temp23_label.dev_attr.attr, | ||
1326 | &sensor_dev_attr_temp24_label.dev_attr.attr, | ||
1327 | &sensor_dev_attr_temp25_label.dev_attr.attr, | ||
1328 | &sensor_dev_attr_temp26_label.dev_attr.attr, | ||
1329 | &sensor_dev_attr_temp27_label.dev_attr.attr, | ||
1330 | &sensor_dev_attr_temp28_label.dev_attr.attr, | ||
1331 | &sensor_dev_attr_temp29_label.dev_attr.attr, | ||
1332 | &sensor_dev_attr_temp30_label.dev_attr.attr, | ||
1333 | &sensor_dev_attr_temp31_label.dev_attr.attr, | ||
1334 | &sensor_dev_attr_temp32_label.dev_attr.attr, | ||
1335 | &sensor_dev_attr_temp33_label.dev_attr.attr, | ||
1336 | &sensor_dev_attr_temp34_label.dev_attr.attr, | ||
1337 | &sensor_dev_attr_temp35_label.dev_attr.attr, | ||
1338 | &sensor_dev_attr_temp36_label.dev_attr.attr, | ||
1339 | &sensor_dev_attr_temp37_label.dev_attr.attr, | ||
1340 | &sensor_dev_attr_temp38_label.dev_attr.attr, | ||
1341 | &sensor_dev_attr_temp39_label.dev_attr.attr, | ||
1342 | &sensor_dev_attr_temp40_label.dev_attr.attr, | ||
1343 | NULL | ||
1344 | }; | ||
1345 | |||
1197 | static struct attribute *temperature_attributes[] = { | 1346 | static struct attribute *temperature_attributes[] = { |
1198 | &sensor_dev_attr_temp1_input.dev_attr.attr, | 1347 | &sensor_dev_attr_temp1_input.dev_attr.attr, |
1199 | &sensor_dev_attr_temp2_input.dev_attr.attr, | 1348 | &sensor_dev_attr_temp2_input.dev_attr.attr, |
@@ -1241,6 +1390,10 @@ static struct attribute *temperature_attributes[] = { | |||
1241 | static const struct attribute_group temperature_attributes_group = | 1390 | static const struct attribute_group temperature_attributes_group = |
1242 | { .attrs = temperature_attributes }; | 1391 | { .attrs = temperature_attributes }; |
1243 | 1392 | ||
1393 | static const struct attribute_group label_attributes_group = { | ||
1394 | .attrs = label_attributes | ||
1395 | }; | ||
1396 | |||
1244 | /* Module stuff */ | 1397 | /* Module stuff */ |
1245 | 1398 | ||
1246 | /* | 1399 | /* |
@@ -1363,6 +1516,14 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = { | |||
1363 | { .accelerometer = 0, .light = 0, .temperature_set = 17 }, | 1516 | { .accelerometer = 0, .light = 0, .temperature_set = 17 }, |
1364 | /* MacBook Pro 2,2: accelerometer, backlight and temperature set 18 */ | 1517 | /* MacBook Pro 2,2: accelerometer, backlight and temperature set 18 */ |
1365 | { .accelerometer = 1, .light = 1, .temperature_set = 18 }, | 1518 | { .accelerometer = 1, .light = 1, .temperature_set = 18 }, |
1519 | /* MacBook Pro 5,3: accelerometer, backlight and temperature set 19 */ | ||
1520 | { .accelerometer = 1, .light = 1, .temperature_set = 19 }, | ||
1521 | /* MacBook Pro 5,4: accelerometer, backlight and temperature set 20 */ | ||
1522 | { .accelerometer = 1, .light = 1, .temperature_set = 20 }, | ||
1523 | /* MacBook Pro 6,2: accelerometer, backlight and temperature set 21 */ | ||
1524 | { .accelerometer = 1, .light = 1, .temperature_set = 21 }, | ||
1525 | /* MacBook Pro 7,1: accelerometer, backlight and temperature set 22 */ | ||
1526 | { .accelerometer = 1, .light = 1, .temperature_set = 22 }, | ||
1366 | }; | 1527 | }; |
1367 | 1528 | ||
1368 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". | 1529 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". |
@@ -1376,6 +1537,22 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
1376 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | 1537 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), |
1377 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") }, | 1538 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") }, |
1378 | &applesmc_dmi_data[7]}, | 1539 | &applesmc_dmi_data[7]}, |
1540 | { applesmc_dmi_match, "Apple MacBook Pro 7", { | ||
1541 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
1542 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro7") }, | ||
1543 | &applesmc_dmi_data[22]}, | ||
1544 | { applesmc_dmi_match, "Apple MacBook Pro 5,4", { | ||
1545 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
1546 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,4") }, | ||
1547 | &applesmc_dmi_data[20]}, | ||
1548 | { applesmc_dmi_match, "Apple MacBook Pro 5,3", { | ||
1549 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
1550 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,3") }, | ||
1551 | &applesmc_dmi_data[19]}, | ||
1552 | { applesmc_dmi_match, "Apple MacBook Pro 6", { | ||
1553 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | ||
1554 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro6") }, | ||
1555 | &applesmc_dmi_data[21]}, | ||
1379 | { applesmc_dmi_match, "Apple MacBook Pro 5", { | 1556 | { applesmc_dmi_match, "Apple MacBook Pro 5", { |
1380 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), | 1557 | DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), |
1381 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5") }, | 1558 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5") }, |
@@ -1518,7 +1695,8 @@ static int __init applesmc_init(void) | |||
1518 | for (i = 0; | 1695 | for (i = 0; |
1519 | temperature_sensors_sets[applesmc_temperature_set][i] != NULL; | 1696 | temperature_sensors_sets[applesmc_temperature_set][i] != NULL; |
1520 | i++) { | 1697 | i++) { |
1521 | if (temperature_attributes[i] == NULL) { | 1698 | if (temperature_attributes[i] == NULL || |
1699 | label_attributes[i] == NULL) { | ||
1522 | printk(KERN_ERR "applesmc: More temperature sensors " | 1700 | printk(KERN_ERR "applesmc: More temperature sensors " |
1523 | "in temperature_sensors_sets (at least %i)" | 1701 | "in temperature_sensors_sets (at least %i)" |
1524 | "than available sysfs files in " | 1702 | "than available sysfs files in " |
@@ -1530,6 +1708,10 @@ static int __init applesmc_init(void) | |||
1530 | temperature_attributes[i]); | 1708 | temperature_attributes[i]); |
1531 | if (ret) | 1709 | if (ret) |
1532 | goto out_temperature; | 1710 | goto out_temperature; |
1711 | ret = sysfs_create_file(&pdev->dev.kobj, | ||
1712 | label_attributes[i]); | ||
1713 | if (ret) | ||
1714 | goto out_temperature; | ||
1533 | } | 1715 | } |
1534 | 1716 | ||
1535 | if (applesmc_accelerometer) { | 1717 | if (applesmc_accelerometer) { |
@@ -1580,6 +1762,7 @@ out_accelerometer: | |||
1580 | if (applesmc_accelerometer) | 1762 | if (applesmc_accelerometer) |
1581 | applesmc_release_accelerometer(); | 1763 | applesmc_release_accelerometer(); |
1582 | out_temperature: | 1764 | out_temperature: |
1765 | sysfs_remove_group(&pdev->dev.kobj, &label_attributes_group); | ||
1583 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); | 1766 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); |
1584 | out_fans: | 1767 | out_fans: |
1585 | while (fans_handled) | 1768 | while (fans_handled) |
@@ -1609,6 +1792,7 @@ static void __exit applesmc_exit(void) | |||
1609 | } | 1792 | } |
1610 | if (applesmc_accelerometer) | 1793 | if (applesmc_accelerometer) |
1611 | applesmc_release_accelerometer(); | 1794 | applesmc_release_accelerometer(); |
1795 | sysfs_remove_group(&pdev->dev.kobj, &label_attributes_group); | ||
1612 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); | 1796 | sysfs_remove_group(&pdev->dev.kobj, &temperature_attributes_group); |
1613 | while (fans_handled) | 1797 | while (fans_handled) |
1614 | sysfs_remove_group(&pdev->dev.kobj, | 1798 | sysfs_remove_group(&pdev->dev.kobj, |