Commit fa0bff02 authored by Jean Delvare's avatar Jean Delvare

hwmon: (smsc47m1) Enable device if needed

If the address is set but the device isn't enabled, attempt to enable
it. If it won't work for any reason (resource conflict, no function
enabled) the initial state is restored. The initial state is also
restored on module unloading.
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Tested-by: default avatarSean Fidler <fidlersean@gmail.com>
parent 3ecf44b3
...@@ -136,6 +136,7 @@ struct smsc47m1_data { ...@@ -136,6 +136,7 @@ struct smsc47m1_data {
struct smsc47m1_sio_data { struct smsc47m1_sio_data {
enum chips type; enum chips type;
u8 activate; /* Remember initial device state */
}; };
...@@ -468,17 +469,38 @@ static int __init smsc47m1_find(unsigned short *addr, ...@@ -468,17 +469,38 @@ static int __init smsc47m1_find(unsigned short *addr,
superio_select(); superio_select();
*addr = (superio_inb(SUPERIO_REG_BASE) << 8) *addr = (superio_inb(SUPERIO_REG_BASE) << 8)
| superio_inb(SUPERIO_REG_BASE + 1); | superio_inb(SUPERIO_REG_BASE + 1);
val = superio_inb(SUPERIO_REG_ACT); if (*addr == 0) {
if (*addr == 0 || (val & 0x01) == 0) { pr_info(DRVNAME ": Device address not set, will not use\n");
pr_info(DRVNAME ": Device is disabled, will not use\n");
superio_exit(); superio_exit();
return -ENODEV; return -ENODEV;
} }
/* Enable only if address is set (needed at least on the
* Compaq Presario S4000NX) */
sio_data->activate = superio_inb(SUPERIO_REG_ACT);
if ((sio_data->activate & 0x01) == 0) {
pr_info(DRVNAME ": Enabling device\n");
superio_outb(SUPERIO_REG_ACT, sio_data->activate | 0x01);
}
superio_exit(); superio_exit();
return 0; return 0;
} }
/* Restore device to its initial state */
static void __init smsc47m1_restore(const struct smsc47m1_sio_data *sio_data)
{
if ((sio_data->activate & 0x01) == 0) {
superio_enter();
superio_select();
pr_info(DRVNAME ": Disabling device\n");
superio_outb(SUPERIO_REG_ACT, sio_data->activate);
superio_exit();
}
}
#define CHECK 1 #define CHECK 1
#define REQUEST 2 #define REQUEST 2
#define RELEASE 3 #define RELEASE 3
...@@ -856,6 +878,7 @@ static int __init sm_smsc47m1_init(void) ...@@ -856,6 +878,7 @@ static int __init sm_smsc47m1_init(void)
exit_device: exit_device:
platform_device_unregister(pdev); platform_device_unregister(pdev);
smsc47m1_restore(&sio_data);
exit: exit:
return err; return err;
} }
...@@ -863,6 +886,7 @@ static int __init sm_smsc47m1_init(void) ...@@ -863,6 +886,7 @@ static int __init sm_smsc47m1_init(void)
static void __exit sm_smsc47m1_exit(void) static void __exit sm_smsc47m1_exit(void)
{ {
platform_driver_unregister(&smsc47m1_driver); platform_driver_unregister(&smsc47m1_driver);
smsc47m1_restore(pdev->dev.platform_data);
platform_device_unregister(pdev); platform_device_unregister(pdev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment