aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/applesmc.c
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-11-10 05:58:05 -0500
committerGuenter Roeck <guenter.roeck@ericsson.com>2011-01-08 13:55:41 -0500
commit40ef06f1120bcc0a2ad483b5cd42f58c4df78a5b (patch)
tree02bf60d6d1b3a53fe12da9c41d695a0bae0ef245 /drivers/hwmon/applesmc.c
parentdcdea2614ab9b7864a3ae620419d04e0cc4a65cc (diff)
hwmon: (applesmc) Extract all features generically
With temperature keys being determined automatically, the dmi match data is only used to assign features that can easily be detected from the smc. This patch removes the dmi match data altogether, and reduces the match table to the main machine models. Signed-off-by: Henrik Rydberg <rydberg@euromail.se> Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Diffstat (limited to 'drivers/hwmon/applesmc.c')
-rw-r--r--drivers/hwmon/applesmc.c241
1 files changed, 59 insertions, 182 deletions
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
index 1d7f8aff998..d4d64752233 100644
--- a/drivers/hwmon/applesmc.c
+++ b/drivers/hwmon/applesmc.c
@@ -106,16 +106,6 @@ static const char* fan_speed_keys[] = {
106 106
107#define to_index(attr) (to_sensor_dev_attr(attr)->index) 107#define to_index(attr) (to_sensor_dev_attr(attr)->index)
108 108
109/* Structure to be passed to DMI_MATCH function */
110struct dmi_match_data {
111/* Indicates whether this computer has an accelerometer. */
112 int accelerometer;
113/* Indicates whether this computer has light sensors and keyboard backlight. */
114 int light;
115/* Indicates which temperature sensors set to use. */
116 int temperature_set;
117};
118
119/* Dynamic device node attributes */ 109/* Dynamic device node attributes */
120struct applesmc_dev_attr { 110struct applesmc_dev_attr {
121 struct sensor_device_attribute sda; /* hwmon attributes */ 111 struct sensor_device_attribute sda; /* hwmon attributes */
@@ -146,6 +136,9 @@ static struct applesmc_registers {
146 unsigned int temp_count; /* number of temperature registers */ 136 unsigned int temp_count; /* number of temperature registers */
147 unsigned int temp_begin; /* temperature lower index bound */ 137 unsigned int temp_begin; /* temperature lower index bound */
148 unsigned int temp_end; /* temperature upper index bound */ 138 unsigned int temp_end; /* temperature upper index bound */
139 int num_light_sensors; /* number of light sensors */
140 bool has_accelerometer; /* has motion sensor */
141 bool has_key_backlight; /* has keyboard backlight */
149 bool init_complete; /* true when fully initialized */ 142 bool init_complete; /* true when fully initialized */
150 struct applesmc_entry *cache; /* cached key entries */ 143 struct applesmc_entry *cache; /* cached key entries */
151} smcreg = { 144} smcreg = {
@@ -161,12 +154,6 @@ static u8 backlight_state[2];
161static struct device *hwmon_dev; 154static struct device *hwmon_dev;
162static struct input_polled_dev *applesmc_idev; 155static struct input_polled_dev *applesmc_idev;
163 156
164/* Indicates whether this computer has an accelerometer. */
165static unsigned int applesmc_accelerometer;
166
167/* Indicates whether this computer has light sensors and keyboard backlight. */
168static unsigned int applesmc_light;
169
170/* The number of fans handled by the driver */ 157/* The number of fans handled by the driver */
171static unsigned int fans_handled; 158static unsigned int fans_handled;
172 159
@@ -433,6 +420,18 @@ static int applesmc_write_key(const char *key, const u8 *buffer, u8 len)
433 return applesmc_write_entry(entry, buffer, len); 420 return applesmc_write_entry(entry, buffer, len);
434} 421}
435 422
423static int applesmc_has_key(const char *key, bool *value)
424{
425 const struct applesmc_entry *entry;
426
427 entry = applesmc_get_entry_by_key(key);
428 if (IS_ERR(entry) && PTR_ERR(entry) != -EINVAL)
429 return PTR_ERR(entry);
430
431 *value = !IS_ERR(entry);
432 return 0;
433}
434
436/* 435/*
437 * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z). 436 * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z).
438 */ 437 */
@@ -468,7 +467,7 @@ static void applesmc_device_init(void)
468 int total; 467 int total;
469 u8 buffer[2]; 468 u8 buffer[2];
470 469
471 if (!applesmc_accelerometer) 470 if (!smcreg.has_accelerometer)
472 return; 471 return;
473 472
474 for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) { 473 for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) {
@@ -506,6 +505,7 @@ static int applesmc_get_fan_count(void)
506static int applesmc_init_smcreg_try(void) 505static int applesmc_init_smcreg_try(void)
507{ 506{
508 struct applesmc_registers *s = &smcreg; 507 struct applesmc_registers *s = &smcreg;
508 bool left_light_sensor, right_light_sensor;
509 int ret; 509 int ret;
510 510
511 if (s->init_complete) 511 if (s->init_complete)
@@ -528,9 +528,27 @@ static int applesmc_init_smcreg_try(void)
528 return ret; 528 return ret;
529 s->temp_count = s->temp_end - s->temp_begin; 529 s->temp_count = s->temp_end - s->temp_begin;
530 530
531 ret = applesmc_has_key(LIGHT_SENSOR_LEFT_KEY, &left_light_sensor);
532 if (ret)
533 return ret;
534 ret = applesmc_has_key(LIGHT_SENSOR_RIGHT_KEY, &right_light_sensor);
535 if (ret)
536 return ret;
537 ret = applesmc_has_key(MOTION_SENSOR_KEY, &s->has_accelerometer);
538 if (ret)
539 return ret;
540 ret = applesmc_has_key(BACKLIGHT_KEY, &s->has_key_backlight);
541 if (ret)
542 return ret;
543
544 s->num_light_sensors = left_light_sensor + right_light_sensor;
531 s->init_complete = true; 545 s->init_complete = true;
532 546
533 pr_info("key=%d temp=%d\n", s->key_count, s->temp_count); 547 pr_info("key=%d temp=%d acc=%d lux=%d kbd=%d\n",
548 s->key_count, s->temp_count,
549 s->has_accelerometer,
550 s->num_light_sensors,
551 s->has_key_backlight);
534 552
535 return 0; 553 return 0;
536} 554}
@@ -585,7 +603,7 @@ static int applesmc_probe(struct platform_device *dev)
585/* Synchronize device with memorized backlight state */ 603/* Synchronize device with memorized backlight state */
586static int applesmc_pm_resume(struct device *dev) 604static int applesmc_pm_resume(struct device *dev)
587{ 605{
588 if (applesmc_light) 606 if (smcreg.has_key_backlight)
589 applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2); 607 applesmc_write_key(BACKLIGHT_KEY, backlight_state, 2);
590 return 0; 608 return 0;
591} 609}
@@ -1118,23 +1136,6 @@ static struct applesmc_node_group temp_group[] = {
1118/* Module stuff */ 1136/* Module stuff */
1119 1137
1120/* 1138/*
1121 * applesmc_dmi_match - found a match. return one, short-circuiting the hunt.
1122 */
1123static int applesmc_dmi_match(const struct dmi_system_id *id)
1124{
1125 struct dmi_match_data* dmi_data = id->driver_data;
1126 pr_info("%s detected:\n", id->ident);
1127 applesmc_accelerometer = dmi_data->accelerometer;
1128 pr_info(" - Model %s accelerometer\n",
1129 applesmc_accelerometer ? "with" : "without");
1130 applesmc_light = dmi_data->light;
1131 pr_info(" - Model %s light sensors and backlight\n",
1132 applesmc_light ? "with" : "without");
1133
1134 return 1;
1135}
1136
1137/*
1138 * applesmc_destroy_nodes - remove files and free associated memory 1139 * applesmc_destroy_nodes - remove files and free associated memory
1139 */ 1140 */
1140static void applesmc_destroy_nodes(struct applesmc_node_group *groups) 1141static void applesmc_destroy_nodes(struct applesmc_node_group *groups)
@@ -1248,165 +1249,38 @@ static void applesmc_release_accelerometer(void)
1248 input_free_polled_device(applesmc_idev); 1249 input_free_polled_device(applesmc_idev);
1249 sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group); 1250 sysfs_remove_group(&pdev->dev.kobj, &accelerometer_attributes_group);
1250} 1251}
1251 1252static int applesmc_dmi_match(const struct dmi_system_id *id)
1252static __initdata struct dmi_match_data applesmc_dmi_data[] = { 1253{
1253/* MacBook Pro: accelerometer, backlight and temperature set 0 */ 1254 return 1;
1254 { .accelerometer = 1, .light = 1, .temperature_set = 0 }, 1255}
1255/* MacBook2: accelerometer and temperature set 1 */
1256 { .accelerometer = 1, .light = 0, .temperature_set = 1 },
1257/* MacBook: accelerometer and temperature set 2 */
1258 { .accelerometer = 1, .light = 0, .temperature_set = 2 },
1259/* MacMini: temperature set 3 */
1260 { .accelerometer = 0, .light = 0, .temperature_set = 3 },
1261/* MacPro: temperature set 4 */
1262 { .accelerometer = 0, .light = 0, .temperature_set = 4 },
1263/* iMac: temperature set 5 */
1264 { .accelerometer = 0, .light = 0, .temperature_set = 5 },
1265/* MacBook3, MacBook4: accelerometer and temperature set 6 */
1266 { .accelerometer = 1, .light = 0, .temperature_set = 6 },
1267/* MacBook Air: accelerometer, backlight and temperature set 7 */
1268 { .accelerometer = 1, .light = 1, .temperature_set = 7 },
1269/* MacBook Pro 4: accelerometer, backlight and temperature set 8 */
1270 { .accelerometer = 1, .light = 1, .temperature_set = 8 },
1271/* MacBook Pro 3: accelerometer, backlight and temperature set 9 */
1272 { .accelerometer = 1, .light = 1, .temperature_set = 9 },
1273/* iMac 5: light sensor only, temperature set 10 */
1274 { .accelerometer = 0, .light = 0, .temperature_set = 10 },
1275/* MacBook 5: accelerometer, backlight and temperature set 11 */
1276 { .accelerometer = 1, .light = 1, .temperature_set = 11 },
1277/* MacBook Pro 5: accelerometer, backlight and temperature set 12 */
1278 { .accelerometer = 1, .light = 1, .temperature_set = 12 },
1279/* iMac 8: light sensor only, temperature set 13 */
1280 { .accelerometer = 0, .light = 0, .temperature_set = 13 },
1281/* iMac 6: light sensor only, temperature set 14 */
1282 { .accelerometer = 0, .light = 0, .temperature_set = 14 },
1283/* MacBook Air 2,1: accelerometer, backlight and temperature set 15 */
1284 { .accelerometer = 1, .light = 1, .temperature_set = 15 },
1285/* MacPro3,1: temperature set 16 */
1286 { .accelerometer = 0, .light = 0, .temperature_set = 16 },
1287/* iMac 9,1: light sensor only, temperature set 17 */
1288 { .accelerometer = 0, .light = 0, .temperature_set = 17 },
1289/* MacBook Pro 2,2: accelerometer, backlight and temperature set 18 */
1290 { .accelerometer = 1, .light = 1, .temperature_set = 18 },
1291/* MacBook Pro 5,3: accelerometer, backlight and temperature set 19 */
1292 { .accelerometer = 1, .light = 1, .temperature_set = 19 },
1293/* MacBook Pro 5,4: accelerometer, backlight and temperature set 20 */
1294 { .accelerometer = 1, .light = 1, .temperature_set = 20 },
1295/* MacBook Pro 6,2: accelerometer, backlight and temperature set 21 */
1296 { .accelerometer = 1, .light = 1, .temperature_set = 21 },
1297/* MacBook Pro 7,1: accelerometer, backlight and temperature set 22 */
1298 { .accelerometer = 1, .light = 1, .temperature_set = 22 },
1299/* MacBook Air 3,1: accelerometer, backlight and temperature set 23 */
1300 { .accelerometer = 0, .light = 0, .temperature_set = 23 },
1301};
1302 1256
1303/* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". 1257/* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
1304 * So we need to put "Apple MacBook Pro" before "Apple MacBook". */ 1258 * So we need to put "Apple MacBook Pro" before "Apple MacBook". */
1305static __initdata struct dmi_system_id applesmc_whitelist[] = { 1259static __initdata struct dmi_system_id applesmc_whitelist[] = {
1306 { applesmc_dmi_match, "Apple MacBook Air 3", {
1307 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1308 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3") },
1309 &applesmc_dmi_data[23]},
1310 { applesmc_dmi_match, "Apple MacBook Air 2", {
1311 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1312 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2") },
1313 &applesmc_dmi_data[15]},
1314 { applesmc_dmi_match, "Apple MacBook Air", { 1260 { applesmc_dmi_match, "Apple MacBook Air", {
1315 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), 1261 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1316 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") }, 1262 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") },
1317 &applesmc_dmi_data[7]}, 1263 },
1318 { applesmc_dmi_match, "Apple MacBook Pro 7", {
1319 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1320 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro7") },
1321 &applesmc_dmi_data[22]},
1322 { applesmc_dmi_match, "Apple MacBook Pro 5,4", {
1323 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1324 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,4") },
1325 &applesmc_dmi_data[20]},
1326 { applesmc_dmi_match, "Apple MacBook Pro 5,3", {
1327 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1328 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,3") },
1329 &applesmc_dmi_data[19]},
1330 { applesmc_dmi_match, "Apple MacBook Pro 6", {
1331 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1332 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro6") },
1333 &applesmc_dmi_data[21]},
1334 { applesmc_dmi_match, "Apple MacBook Pro 5", {
1335 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1336 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5") },
1337 &applesmc_dmi_data[12]},
1338 { applesmc_dmi_match, "Apple MacBook Pro 4", {
1339 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1340 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro4") },
1341 &applesmc_dmi_data[8]},
1342 { applesmc_dmi_match, "Apple MacBook Pro 3", {
1343 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1344 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3") },
1345 &applesmc_dmi_data[9]},
1346 { applesmc_dmi_match, "Apple MacBook Pro 2,2", {
1347 DMI_MATCH(DMI_BOARD_VENDOR, "Apple Computer, Inc."),
1348 DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2") },
1349 &applesmc_dmi_data[18]},
1350 { applesmc_dmi_match, "Apple MacBook Pro", { 1264 { applesmc_dmi_match, "Apple MacBook Pro", {
1351 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), 1265 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1352 DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") }, 1266 DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
1353 &applesmc_dmi_data[0]}, 1267 },
1354 { applesmc_dmi_match, "Apple MacBook (v2)", {
1355 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1356 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") },
1357 &applesmc_dmi_data[1]},
1358 { applesmc_dmi_match, "Apple MacBook (v3)", {
1359 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1360 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") },
1361 &applesmc_dmi_data[6]},
1362 { applesmc_dmi_match, "Apple MacBook 4", {
1363 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1364 DMI_MATCH(DMI_PRODUCT_NAME, "MacBook4") },
1365 &applesmc_dmi_data[6]},
1366 { applesmc_dmi_match, "Apple MacBook 5", {
1367 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1368 DMI_MATCH(DMI_PRODUCT_NAME, "MacBook5") },
1369 &applesmc_dmi_data[11]},
1370 { applesmc_dmi_match, "Apple MacBook", { 1268 { applesmc_dmi_match, "Apple MacBook", {
1371 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), 1269 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1372 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") }, 1270 DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") },
1373 &applesmc_dmi_data[2]}, 1271 },
1374 { applesmc_dmi_match, "Apple Macmini", { 1272 { applesmc_dmi_match, "Apple Macmini", {
1375 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), 1273 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1376 DMI_MATCH(DMI_PRODUCT_NAME,"Macmini") }, 1274 DMI_MATCH(DMI_PRODUCT_NAME,"Macmini") },
1377 &applesmc_dmi_data[3]}, 1275 },
1378 { applesmc_dmi_match, "Apple MacPro2", {
1379 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1380 DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") },
1381 &applesmc_dmi_data[4]},
1382 { applesmc_dmi_match, "Apple MacPro3", {
1383 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1384 DMI_MATCH(DMI_PRODUCT_NAME, "MacPro3") },
1385 &applesmc_dmi_data[16]},
1386 { applesmc_dmi_match, "Apple MacPro", { 1276 { applesmc_dmi_match, "Apple MacPro", {
1387 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"), 1277 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1388 DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") }, 1278 DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
1389 &applesmc_dmi_data[4]}, 1279 },
1390 { applesmc_dmi_match, "Apple iMac 9,1", {
1391 DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
1392 DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1") },
1393 &applesmc_dmi_data[17]},
1394 { applesmc_dmi_match, "Apple iMac 8", {
1395 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1396 DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") },
1397 &applesmc_dmi_data[13]},
1398 { applesmc_dmi_match, "Apple iMac 6", {
1399 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1400 DMI_MATCH(DMI_PRODUCT_NAME, "iMac6") },
1401 &applesmc_dmi_data[14]},
1402 { applesmc_dmi_match, "Apple iMac 5", {
1403 DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
1404 DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") },
1405 &applesmc_dmi_data[10]},
1406 { applesmc_dmi_match, "Apple iMac", { 1280 { applesmc_dmi_match, "Apple iMac", {
1407 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), 1281 DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
1408 DMI_MATCH(DMI_PRODUCT_NAME,"iMac") }, 1282 DMI_MATCH(DMI_PRODUCT_NAME,"iMac") },
1409 &applesmc_dmi_data[5]}, 1283 },
1410 { .ident = NULL } 1284 { .ident = NULL }
1411}; 1285};
1412 1286
@@ -1476,18 +1350,20 @@ static int __init applesmc_init(void)
1476 if (ret) 1350 if (ret)
1477 goto out_fans; 1351 goto out_fans;
1478 1352
1479 if (applesmc_accelerometer) { 1353 if (smcreg.has_accelerometer) {
1480 ret = applesmc_create_accelerometer(); 1354 ret = applesmc_create_accelerometer();
1481 if (ret) 1355 if (ret)
1482 goto out_temperature; 1356 goto out_temperature;
1483 } 1357 }
1484 1358
1485 if (applesmc_light) { 1359 if (smcreg.num_light_sensors) {
1486 /* Add light sensor file */ 1360 /* Add light sensor file */
1487 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_light.attr); 1361 ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_light.attr);
1488 if (ret) 1362 if (ret)
1489 goto out_accelerometer; 1363 goto out_accelerometer;
1364 }
1490 1365
1366 if (smcreg.has_key_backlight) {
1491 /* Create the workqueue */ 1367 /* Create the workqueue */
1492 applesmc_led_wq = create_singlethread_workqueue("applesmc-led"); 1368 applesmc_led_wq = create_singlethread_workqueue("applesmc-led");
1493 if (!applesmc_led_wq) { 1369 if (!applesmc_led_wq) {
@@ -1512,16 +1388,16 @@ static int __init applesmc_init(void)
1512 return 0; 1388 return 0;
1513 1389
1514out_light_ledclass: 1390out_light_ledclass:
1515 if (applesmc_light) 1391 if (smcreg.has_key_backlight)
1516 led_classdev_unregister(&applesmc_backlight); 1392 led_classdev_unregister(&applesmc_backlight);
1517out_light_wq: 1393out_light_wq:
1518 if (applesmc_light) 1394 if (smcreg.has_key_backlight)
1519 destroy_workqueue(applesmc_led_wq); 1395 destroy_workqueue(applesmc_led_wq);
1520out_light_sysfs: 1396out_light_sysfs:
1521 if (applesmc_light) 1397 if (smcreg.num_light_sensors)
1522 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr); 1398 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
1523out_accelerometer: 1399out_accelerometer:
1524 if (applesmc_accelerometer) 1400 if (smcreg.has_accelerometer)
1525 applesmc_release_accelerometer(); 1401 applesmc_release_accelerometer();
1526out_temperature: 1402out_temperature:
1527 applesmc_destroy_nodes(temp_group); 1403 applesmc_destroy_nodes(temp_group);
@@ -1548,12 +1424,13 @@ out:
1548static void __exit applesmc_exit(void) 1424static void __exit applesmc_exit(void)
1549{ 1425{
1550 hwmon_device_unregister(hwmon_dev); 1426 hwmon_device_unregister(hwmon_dev);
1551 if (applesmc_light) { 1427 if (smcreg.has_key_backlight) {
1552 led_classdev_unregister(&applesmc_backlight); 1428 led_classdev_unregister(&applesmc_backlight);
1553 destroy_workqueue(applesmc_led_wq); 1429 destroy_workqueue(applesmc_led_wq);
1554 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
1555 } 1430 }
1556 if (applesmc_accelerometer) 1431 if (smcreg.num_light_sensors)
1432 sysfs_remove_file(&pdev->dev.kobj, &dev_attr_light.attr);
1433 if (smcreg.has_accelerometer)
1557 applesmc_release_accelerometer(); 1434 applesmc_release_accelerometer();
1558 applesmc_destroy_nodes(temp_group); 1435 applesmc_destroy_nodes(temp_group);
1559 while (fans_handled) 1436 while (fans_handled)