msi-laptop: Add resume method for set the SCM load again
authorLee, Chun-Yi <jlee@novell.com>
Tue, 26 Jan 2010 16:13:45 +0000 (00:13 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 8 Mar 2010 01:04:53 +0000 (17:04 -0800)
Implement the resume method for set the load SCM flag after system reusme.
Without this patch, the wifi function key on SCM model will back to BIOS
control mode then confuse with the userland software control.
e.g. MSI N034

Signed-off-by: Lee, Chun-Yi <jlee@novell.com>
Cc: Lennart Poettering <mzxreary@0pointer.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/platform/x86/msi-laptop.c

index ff21d1acf3be73225d9de608c86060d62de2adb4..af1b62f761173cc2030a90aa48938286cede8b77 100644 (file)
@@ -77,6 +77,8 @@
 #define MSI_STANDARD_EC_SCM_LOAD_ADDRESS       0x2d
 #define MSI_STANDARD_EC_SCM_LOAD_MASK          (1 << 0)
 
+static int msi_laptop_resume(struct platform_device *device);
+
 static int force;
 module_param(force, bool, 0);
 MODULE_PARM_DESC(force, "Force driver load, ignore DMI data");
@@ -395,7 +397,8 @@ static struct platform_driver msipf_driver = {
        .driver = {
                .name = "msi-laptop-pf",
                .owner = THIS_MODULE,
-       }
+       },
+       .resume = msi_laptop_resume,
 };
 
 static struct platform_device *msipf_device;
@@ -584,6 +587,27 @@ err_bluetooth:
        return retval;
 }
 
+static int msi_laptop_resume(struct platform_device *device)
+{
+       u8 data;
+       int result;
+
+       if (!load_scm_model)
+               return 0;
+
+       /* set load SCM to disable hardware control by fn key */
+       result = ec_read(MSI_STANDARD_EC_SCM_LOAD_ADDRESS, &data);
+       if (result < 0)
+               return result;
+
+       result = ec_write(MSI_STANDARD_EC_SCM_LOAD_ADDRESS,
+               data | MSI_STANDARD_EC_SCM_LOAD_MASK);
+       if (result < 0)
+               return result;
+
+       return 0;
+}
+
 static int load_scm_model_init(struct platform_device *sdev)
 {
        u8 data;