diff options
| -rw-r--r-- | drivers/platform/x86/msi-laptop.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/drivers/platform/x86/msi-laptop.c b/drivers/platform/x86/msi-laptop.c index 759763d18e4c..323e99460c9f 100644 --- a/drivers/platform/x86/msi-laptop.c +++ b/drivers/platform/x86/msi-laptop.c | |||
| @@ -66,6 +66,11 @@ | |||
| 66 | #define MSI_EC_COMMAND_WIRELESS 0x10 | 66 | #define MSI_EC_COMMAND_WIRELESS 0x10 |
| 67 | #define MSI_EC_COMMAND_LCD_LEVEL 0x11 | 67 | #define MSI_EC_COMMAND_LCD_LEVEL 0x11 |
| 68 | 68 | ||
| 69 | #define MSI_STANDARD_EC_COMMAND_ADDRESS 0x2e | ||
| 70 | #define MSI_STANDARD_EC_BLUETOOTH_MASK (1 << 0) | ||
| 71 | #define MSI_STANDARD_EC_WEBCAM_MASK (1 << 1) | ||
| 72 | #define MSI_STANDARD_EC_WLAN_MASK (1 << 3) | ||
| 73 | |||
| 69 | static int force; | 74 | static int force; |
| 70 | module_param(force, bool, 0); | 75 | module_param(force, bool, 0); |
| 71 | MODULE_PARM_DESC(force, "Force driver load, ignore DMI data"); | 76 | MODULE_PARM_DESC(force, "Force driver load, ignore DMI data"); |
| @@ -74,6 +79,9 @@ static int auto_brightness; | |||
| 74 | module_param(auto_brightness, int, 0); | 79 | module_param(auto_brightness, int, 0); |
| 75 | MODULE_PARM_DESC(auto_brightness, "Enable automatic brightness control (0: disabled; 1: enabled; 2: don't touch)"); | 80 | MODULE_PARM_DESC(auto_brightness, "Enable automatic brightness control (0: disabled; 1: enabled; 2: don't touch)"); |
| 76 | 81 | ||
| 82 | static bool old_ec_model; | ||
| 83 | static int wlan_s, bluetooth_s; | ||
| 84 | |||
| 77 | /* Hardware access */ | 85 | /* Hardware access */ |
| 78 | 86 | ||
| 79 | static int set_lcd_level(int level) | 87 | static int set_lcd_level(int level) |
| @@ -148,6 +156,22 @@ static int get_wireless_state(int *wlan, int *bluetooth) | |||
| 148 | return 0; | 156 | return 0; |
| 149 | } | 157 | } |
| 150 | 158 | ||
| 159 | static int get_wireless_state_ec_standard(void) | ||
| 160 | { | ||
| 161 | u8 rdata; | ||
| 162 | int result; | ||
| 163 | |||
| 164 | result = ec_read(MSI_STANDARD_EC_COMMAND_ADDRESS, &rdata); | ||
| 165 | if (result < 0) | ||
| 166 | return -1; | ||
| 167 | |||
| 168 | wlan_s = !!(rdata & MSI_STANDARD_EC_WLAN_MASK); | ||
| 169 | |||
| 170 | bluetooth_s = !!(rdata & MSI_STANDARD_EC_BLUETOOTH_MASK); | ||
| 171 | |||
| 172 | return 0; | ||
| 173 | } | ||
| 174 | |||
| 151 | /* Backlight device stuff */ | 175 | /* Backlight device stuff */ |
| 152 | 176 | ||
| 153 | static int bl_get_brightness(struct backlight_device *b) | 177 | static int bl_get_brightness(struct backlight_device *b) |
| @@ -176,7 +200,12 @@ static ssize_t show_wlan(struct device *dev, | |||
| 176 | 200 | ||
| 177 | int ret, enabled; | 201 | int ret, enabled; |
| 178 | 202 | ||
| 179 | ret = get_wireless_state(&enabled, NULL); | 203 | if (old_ec_model) { |
| 204 | ret = get_wireless_state(&enabled, NULL); | ||
| 205 | } else { | ||
| 206 | ret = get_wireless_state_ec_standard(); | ||
| 207 | enabled = wlan_s; | ||
| 208 | } | ||
| 180 | if (ret < 0) | 209 | if (ret < 0) |
| 181 | return ret; | 210 | return ret; |
| 182 | 211 | ||
| @@ -189,7 +218,12 @@ static ssize_t show_bluetooth(struct device *dev, | |||
| 189 | 218 | ||
| 190 | int ret, enabled; | 219 | int ret, enabled; |
| 191 | 220 | ||
| 192 | ret = get_wireless_state(NULL, &enabled); | 221 | if (old_ec_model) { |
| 222 | ret = get_wireless_state(NULL, &enabled); | ||
| 223 | } else { | ||
| 224 | ret = get_wireless_state_ec_standard(); | ||
| 225 | enabled = bluetooth_s; | ||
| 226 | } | ||
| 193 | if (ret < 0) | 227 | if (ret < 0) |
| 194 | return ret; | 228 | return ret; |
| 195 | 229 | ||
| @@ -339,8 +373,8 @@ static int __init msi_init(void) | |||
| 339 | if (acpi_disabled) | 373 | if (acpi_disabled) |
| 340 | return -ENODEV; | 374 | return -ENODEV; |
| 341 | 375 | ||
| 342 | if (!force && !dmi_check_system(msi_dmi_table)) | 376 | if (force || dmi_check_system(msi_dmi_table)) |
| 343 | return -ENODEV; | 377 | old_ec_model = 1; |
| 344 | 378 | ||
| 345 | if (auto_brightness < 0 || auto_brightness > 2) | 379 | if (auto_brightness < 0 || auto_brightness > 2) |
| 346 | return -EINVAL; | 380 | return -EINVAL; |
| @@ -435,3 +469,4 @@ MODULE_ALIAS("dmi:*:svnMICRO-STARINT'LCO.,LTD:pnMS-1013:pvr0131*:cvnMICRO-STARIN | |||
| 435 | MODULE_ALIAS("dmi:*:svnMicro-StarInternational:pnMS-1058:pvr0581:rvnMSI:rnMS-1058:*:ct10:*"); | 469 | MODULE_ALIAS("dmi:*:svnMicro-StarInternational:pnMS-1058:pvr0581:rvnMSI:rnMS-1058:*:ct10:*"); |
| 436 | MODULE_ALIAS("dmi:*:svnMicro-StarInternational:pnMS-1412:*:rvnMSI:rnMS-1412:*:cvnMICRO-STARINT'LCO.,LTD:ct10:*"); | 470 | MODULE_ALIAS("dmi:*:svnMicro-StarInternational:pnMS-1412:*:rvnMSI:rnMS-1412:*:cvnMICRO-STARINT'LCO.,LTD:ct10:*"); |
| 437 | MODULE_ALIAS("dmi:*:svnNOTEBOOK:pnSAM2000:pvr0131*:cvnMICRO-STARINT'LCO.,LTD:ct10:*"); | 471 | MODULE_ALIAS("dmi:*:svnNOTEBOOK:pnSAM2000:pvr0131*:cvnMICRO-STARINT'LCO.,LTD:ct10:*"); |
| 472 | MODULE_ALIAS("dmi:*:svnMICRO-STARINTERNATIONAL*:pnMS-N034:*"); | ||
