diff options
| -rw-r--r-- | drivers/hwmon/smsc47m1.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/drivers/hwmon/smsc47m1.c b/drivers/hwmon/smsc47m1.c index 92cca512b38e..9ca97818bd4b 100644 --- a/drivers/hwmon/smsc47m1.c +++ b/drivers/hwmon/smsc47m1.c | |||
| @@ -136,6 +136,7 @@ struct smsc47m1_data { | |||
| 136 | 136 | ||
| 137 | struct smsc47m1_sio_data { | 137 | struct smsc47m1_sio_data { |
| 138 | enum chips type; | 138 | enum chips type; |
| 139 | u8 activate; /* Remember initial device state */ | ||
| 139 | }; | 140 | }; |
| 140 | 141 | ||
| 141 | 142 | ||
| @@ -468,17 +469,38 @@ static int __init smsc47m1_find(unsigned short *addr, | |||
| 468 | superio_select(); | 469 | superio_select(); |
| 469 | *addr = (superio_inb(SUPERIO_REG_BASE) << 8) | 470 | *addr = (superio_inb(SUPERIO_REG_BASE) << 8) |
| 470 | | superio_inb(SUPERIO_REG_BASE + 1); | 471 | | superio_inb(SUPERIO_REG_BASE + 1); |
| 471 | val = superio_inb(SUPERIO_REG_ACT); | 472 | if (*addr == 0) { |
| 472 | if (*addr == 0 || (val & 0x01) == 0) { | 473 | pr_info(DRVNAME ": Device address not set, will not use\n"); |
| 473 | pr_info(DRVNAME ": Device is disabled, will not use\n"); | ||
| 474 | superio_exit(); | 474 | superio_exit(); |
| 475 | return -ENODEV; | 475 | return -ENODEV; |
| 476 | } | 476 | } |
| 477 | 477 | ||
| 478 | /* Enable only if address is set (needed at least on the | ||
| 479 | * Compaq Presario S4000NX) */ | ||
| 480 | sio_data->activate = superio_inb(SUPERIO_REG_ACT); | ||
| 481 | if ((sio_data->activate & 0x01) == 0) { | ||
| 482 | pr_info(DRVNAME ": Enabling device\n"); | ||
| 483 | superio_outb(SUPERIO_REG_ACT, sio_data->activate | 0x01); | ||
| 484 | } | ||
| 485 | |||
| 478 | superio_exit(); | 486 | superio_exit(); |
| 479 | return 0; | 487 | return 0; |
| 480 | } | 488 | } |
| 481 | 489 | ||
| 490 | /* Restore device to its initial state */ | ||
| 491 | static void __init smsc47m1_restore(const struct smsc47m1_sio_data *sio_data) | ||
| 492 | { | ||
| 493 | if ((sio_data->activate & 0x01) == 0) { | ||
| 494 | superio_enter(); | ||
| 495 | superio_select(); | ||
| 496 | |||
| 497 | pr_info(DRVNAME ": Disabling device\n"); | ||
| 498 | superio_outb(SUPERIO_REG_ACT, sio_data->activate); | ||
| 499 | |||
| 500 | superio_exit(); | ||
| 501 | } | ||
| 502 | } | ||
| 503 | |||
| 482 | #define CHECK 1 | 504 | #define CHECK 1 |
| 483 | #define REQUEST 2 | 505 | #define REQUEST 2 |
| 484 | #define RELEASE 3 | 506 | #define RELEASE 3 |
| @@ -856,6 +878,7 @@ static int __init sm_smsc47m1_init(void) | |||
| 856 | 878 | ||
| 857 | exit_device: | 879 | exit_device: |
| 858 | platform_device_unregister(pdev); | 880 | platform_device_unregister(pdev); |
| 881 | smsc47m1_restore(&sio_data); | ||
| 859 | exit: | 882 | exit: |
| 860 | return err; | 883 | return err; |
| 861 | } | 884 | } |
| @@ -863,6 +886,7 @@ exit: | |||
| 863 | static void __exit sm_smsc47m1_exit(void) | 886 | static void __exit sm_smsc47m1_exit(void) |
| 864 | { | 887 | { |
| 865 | platform_driver_unregister(&smsc47m1_driver); | 888 | platform_driver_unregister(&smsc47m1_driver); |
| 889 | smsc47m1_restore(pdev->dev.platform_data); | ||
| 866 | platform_device_unregister(pdev); | 890 | platform_device_unregister(pdev); |
| 867 | } | 891 | } |
| 868 | 892 | ||
