Merge tag 'platform-drivers-x86-v3.19-1' of git://git.infradead.org/users/dvhart/linux-platform-drivers-x86
Pull x86 platform driver update from Darren Hart: - thinkpad-acpi: Switch to software mute, cleanups - acerhdf: Bang-bang thermal governor, new models, cleanups - dell-laptop: New keyboard backlight support and documentation - toshiba_acpi: Keyboard backlight updates, hotkey handling - dell-wmi: Keypress filtering, WMI event processing - eeepc-laptop: Multiple cleanups, improved error handling, documentation - hp_wireless: Inform the user if hp_wireless_input_setup()/add() fails - misc: Code cleanups, quirks, various new IDs * tag 'platform-drivers-x86-v3.19-1' of git://git.infradead.org/users/dvhart/linux-platform-drivers-x86: (33 commits) platform/x86/acerhdf: Still depends on THERMAL Documentation: Add entry for dell-laptop sysfs interface acpi: Remove _OSI(Linux) for ThinkPads thinkpad-acpi: Try to use full software mute control acerhdf: minor clean up acerhdf: added critical trip point acerhdf: Use bang-bang thermal governor acerhdf: Adding support for new models acerhdf: Adding support for "manual mode" dell-smo8800: Add more ACPI ids and change description of driver platform: x86: dell-laptop: Add support for keyboard backlight toshiba_acpi: Add keyboard backlight mode change event toshiba_acpi: Change notify funtion to handle more events toshiba_acpi: Move hotkey enabling code to its own function dell-wmi: Don't report keypresses on keybord illumination change dell-wmi: Don't report keypresses for radio state changes hp_wireless: Inform the user if hp_wireless_input_setup()/add() fails toshiba-acpi: Add missing ID (TOS6207) Sony-laptop: Deletion of an unnecessary check before the function call "pci_dev_put" platform: x86: Deletion of checks before backlight_device_unregister() ...
This commit is contained in:
@@ -417,8 +417,7 @@ static ssize_t cpufv_disabled_store(struct device *dev,
|
||||
switch (value) {
|
||||
case 0:
|
||||
if (eeepc->cpufv_disabled)
|
||||
pr_warn("cpufv enabled (not officially supported "
|
||||
"on this model)\n");
|
||||
pr_warn("cpufv enabled (not officially supported on this model)\n");
|
||||
eeepc->cpufv_disabled = false;
|
||||
return count;
|
||||
case 1:
|
||||
@@ -580,60 +579,59 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle)
|
||||
mutex_lock(&eeepc->hotplug_lock);
|
||||
pci_lock_rescan_remove();
|
||||
|
||||
if (eeepc->hotplug_slot) {
|
||||
port = acpi_get_pci_dev(handle);
|
||||
if (!port) {
|
||||
pr_warning("Unable to find port\n");
|
||||
goto out_unlock;
|
||||
}
|
||||
if (!eeepc->hotplug_slot)
|
||||
goto out_unlock;
|
||||
|
||||
bus = port->subordinate;
|
||||
|
||||
if (!bus) {
|
||||
pr_warn("Unable to find PCI bus 1?\n");
|
||||
goto out_put_dev;
|
||||
}
|
||||
|
||||
if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
|
||||
pr_err("Unable to read PCI config space?\n");
|
||||
goto out_put_dev;
|
||||
}
|
||||
|
||||
absent = (l == 0xffffffff);
|
||||
|
||||
if (blocked != absent) {
|
||||
pr_warn("BIOS says wireless lan is %s, "
|
||||
"but the pci device is %s\n",
|
||||
blocked ? "blocked" : "unblocked",
|
||||
absent ? "absent" : "present");
|
||||
pr_warn("skipped wireless hotplug as probably "
|
||||
"inappropriate for this model\n");
|
||||
goto out_put_dev;
|
||||
}
|
||||
|
||||
if (!blocked) {
|
||||
dev = pci_get_slot(bus, 0);
|
||||
if (dev) {
|
||||
/* Device already present */
|
||||
pci_dev_put(dev);
|
||||
goto out_put_dev;
|
||||
}
|
||||
dev = pci_scan_single_device(bus, 0);
|
||||
if (dev) {
|
||||
pci_bus_assign_resources(bus);
|
||||
pci_bus_add_device(dev);
|
||||
}
|
||||
} else {
|
||||
dev = pci_get_slot(bus, 0);
|
||||
if (dev) {
|
||||
pci_stop_and_remove_bus_device(dev);
|
||||
pci_dev_put(dev);
|
||||
}
|
||||
}
|
||||
out_put_dev:
|
||||
pci_dev_put(port);
|
||||
port = acpi_get_pci_dev(handle);
|
||||
if (!port) {
|
||||
pr_warning("Unable to find port\n");
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
bus = port->subordinate;
|
||||
|
||||
if (!bus) {
|
||||
pr_warn("Unable to find PCI bus 1?\n");
|
||||
goto out_put_dev;
|
||||
}
|
||||
|
||||
if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
|
||||
pr_err("Unable to read PCI config space?\n");
|
||||
goto out_put_dev;
|
||||
}
|
||||
|
||||
absent = (l == 0xffffffff);
|
||||
|
||||
if (blocked != absent) {
|
||||
pr_warn("BIOS says wireless lan is %s, but the pci device is %s\n",
|
||||
blocked ? "blocked" : "unblocked",
|
||||
absent ? "absent" : "present");
|
||||
pr_warn("skipped wireless hotplug as probably inappropriate for this model\n");
|
||||
goto out_put_dev;
|
||||
}
|
||||
|
||||
if (!blocked) {
|
||||
dev = pci_get_slot(bus, 0);
|
||||
if (dev) {
|
||||
/* Device already present */
|
||||
pci_dev_put(dev);
|
||||
goto out_put_dev;
|
||||
}
|
||||
dev = pci_scan_single_device(bus, 0);
|
||||
if (dev) {
|
||||
pci_bus_assign_resources(bus);
|
||||
pci_bus_add_device(dev);
|
||||
}
|
||||
} else {
|
||||
dev = pci_get_slot(bus, 0);
|
||||
if (dev) {
|
||||
pci_stop_and_remove_bus_device(dev);
|
||||
pci_dev_put(dev);
|
||||
}
|
||||
}
|
||||
out_put_dev:
|
||||
pci_dev_put(port);
|
||||
|
||||
out_unlock:
|
||||
pci_unlock_rescan_remove();
|
||||
mutex_unlock(&eeepc->hotplug_lock);
|
||||
@@ -821,11 +819,15 @@ static int eeepc_new_rfkill(struct eeepc_laptop *eeepc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char EEEPC_RFKILL_NODE_1[] = "\\_SB.PCI0.P0P5";
|
||||
static char EEEPC_RFKILL_NODE_2[] = "\\_SB.PCI0.P0P6";
|
||||
static char EEEPC_RFKILL_NODE_3[] = "\\_SB.PCI0.P0P7";
|
||||
|
||||
static void eeepc_rfkill_exit(struct eeepc_laptop *eeepc)
|
||||
{
|
||||
eeepc_unregister_rfkill_notifier(eeepc, "\\_SB.PCI0.P0P5");
|
||||
eeepc_unregister_rfkill_notifier(eeepc, "\\_SB.PCI0.P0P6");
|
||||
eeepc_unregister_rfkill_notifier(eeepc, "\\_SB.PCI0.P0P7");
|
||||
eeepc_unregister_rfkill_notifier(eeepc, EEEPC_RFKILL_NODE_1);
|
||||
eeepc_unregister_rfkill_notifier(eeepc, EEEPC_RFKILL_NODE_2);
|
||||
eeepc_unregister_rfkill_notifier(eeepc, EEEPC_RFKILL_NODE_3);
|
||||
if (eeepc->wlan_rfkill) {
|
||||
rfkill_unregister(eeepc->wlan_rfkill);
|
||||
rfkill_destroy(eeepc->wlan_rfkill);
|
||||
@@ -897,9 +899,9 @@ static int eeepc_rfkill_init(struct eeepc_laptop *eeepc)
|
||||
if (result == -EBUSY)
|
||||
result = 0;
|
||||
|
||||
eeepc_register_rfkill_notifier(eeepc, "\\_SB.PCI0.P0P5");
|
||||
eeepc_register_rfkill_notifier(eeepc, "\\_SB.PCI0.P0P6");
|
||||
eeepc_register_rfkill_notifier(eeepc, "\\_SB.PCI0.P0P7");
|
||||
eeepc_register_rfkill_notifier(eeepc, EEEPC_RFKILL_NODE_1);
|
||||
eeepc_register_rfkill_notifier(eeepc, EEEPC_RFKILL_NODE_2);
|
||||
eeepc_register_rfkill_notifier(eeepc, EEEPC_RFKILL_NODE_3);
|
||||
|
||||
exit:
|
||||
if (result && result != -ENODEV)
|
||||
@@ -915,7 +917,7 @@ static int eeepc_hotk_thaw(struct device *device)
|
||||
struct eeepc_laptop *eeepc = dev_get_drvdata(device);
|
||||
|
||||
if (eeepc->wlan_rfkill) {
|
||||
bool wlan;
|
||||
int wlan;
|
||||
|
||||
/*
|
||||
* Work around bios bug - acpi _PTS turns off the wireless led
|
||||
@@ -923,7 +925,8 @@ static int eeepc_hotk_thaw(struct device *device)
|
||||
* we should kick it ourselves in case hibernation is aborted.
|
||||
*/
|
||||
wlan = get_acpi(eeepc, CM_ASL_WLAN);
|
||||
set_acpi(eeepc, CM_ASL_WLAN, wlan);
|
||||
if (wlan >= 0)
|
||||
set_acpi(eeepc, CM_ASL_WLAN, wlan);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -935,9 +938,9 @@ static int eeepc_hotk_restore(struct device *device)
|
||||
|
||||
/* Refresh both wlan rfkill state and pci hotplug */
|
||||
if (eeepc->wlan_rfkill) {
|
||||
eeepc_rfkill_hotplug_update(eeepc, "\\_SB.PCI0.P0P5");
|
||||
eeepc_rfkill_hotplug_update(eeepc, "\\_SB.PCI0.P0P6");
|
||||
eeepc_rfkill_hotplug_update(eeepc, "\\_SB.PCI0.P0P7");
|
||||
eeepc_rfkill_hotplug_update(eeepc, EEEPC_RFKILL_NODE_1);
|
||||
eeepc_rfkill_hotplug_update(eeepc, EEEPC_RFKILL_NODE_2);
|
||||
eeepc_rfkill_hotplug_update(eeepc, EEEPC_RFKILL_NODE_3);
|
||||
}
|
||||
|
||||
if (eeepc->bluetooth_rfkill)
|
||||
@@ -977,18 +980,28 @@ static struct platform_driver platform_driver = {
|
||||
#define EEEPC_EC_SFB0 0xD0
|
||||
#define EEEPC_EC_FAN_CTRL (EEEPC_EC_SFB0 + 3) /* Byte containing SF25 */
|
||||
|
||||
static inline int eeepc_pwm_to_lmsensors(int value)
|
||||
{
|
||||
return value * 255 / 100;
|
||||
}
|
||||
|
||||
static inline int eeepc_lmsensors_to_pwm(int value)
|
||||
{
|
||||
value = clamp_val(value, 0, 255);
|
||||
return value * 100 / 255;
|
||||
}
|
||||
|
||||
static int eeepc_get_fan_pwm(void)
|
||||
{
|
||||
u8 value = 0;
|
||||
|
||||
ec_read(EEEPC_EC_FAN_PWM, &value);
|
||||
return value * 255 / 100;
|
||||
return eeepc_pwm_to_lmsensors(value);
|
||||
}
|
||||
|
||||
static void eeepc_set_fan_pwm(int value)
|
||||
{
|
||||
value = clamp_val(value, 0, 255);
|
||||
value = value * 100 / 255;
|
||||
value = eeepc_lmsensors_to_pwm(value);
|
||||
ec_write(EEEPC_EC_FAN_PWM, value);
|
||||
}
|
||||
|
||||
@@ -1002,15 +1015,19 @@ static int eeepc_get_fan_rpm(void)
|
||||
return high << 8 | low;
|
||||
}
|
||||
|
||||
#define EEEPC_EC_FAN_CTRL_BIT 0x02
|
||||
#define EEEPC_FAN_CTRL_MANUAL 1
|
||||
#define EEEPC_FAN_CTRL_AUTO 2
|
||||
|
||||
static int eeepc_get_fan_ctrl(void)
|
||||
{
|
||||
u8 value = 0;
|
||||
|
||||
ec_read(EEEPC_EC_FAN_CTRL, &value);
|
||||
if (value & 0x02)
|
||||
return 1; /* manual */
|
||||
if (value & EEEPC_EC_FAN_CTRL_BIT)
|
||||
return EEEPC_FAN_CTRL_MANUAL;
|
||||
else
|
||||
return 2; /* automatic */
|
||||
return EEEPC_FAN_CTRL_AUTO;
|
||||
}
|
||||
|
||||
static void eeepc_set_fan_ctrl(int manual)
|
||||
@@ -1018,10 +1035,10 @@ static void eeepc_set_fan_ctrl(int manual)
|
||||
u8 value = 0;
|
||||
|
||||
ec_read(EEEPC_EC_FAN_CTRL, &value);
|
||||
if (manual == 1)
|
||||
value |= 0x02;
|
||||
if (manual == EEEPC_FAN_CTRL_MANUAL)
|
||||
value |= EEEPC_EC_FAN_CTRL_BIT;
|
||||
else
|
||||
value &= ~0x02;
|
||||
value &= ~EEEPC_EC_FAN_CTRL_BIT;
|
||||
ec_write(EEEPC_EC_FAN_CTRL, value);
|
||||
}
|
||||
|
||||
@@ -1156,8 +1173,7 @@ static int eeepc_backlight_init(struct eeepc_laptop *eeepc)
|
||||
|
||||
static void eeepc_backlight_exit(struct eeepc_laptop *eeepc)
|
||||
{
|
||||
if (eeepc->backlight_device)
|
||||
backlight_device_unregister(eeepc->backlight_device);
|
||||
backlight_device_unregister(eeepc->backlight_device);
|
||||
eeepc->backlight_device = NULL;
|
||||
}
|
||||
|
||||
@@ -1216,7 +1232,7 @@ static void eeepc_input_exit(struct eeepc_laptop *eeepc)
|
||||
static void eeepc_input_notify(struct eeepc_laptop *eeepc, int event)
|
||||
{
|
||||
if (!eeepc->inputdev)
|
||||
return ;
|
||||
return;
|
||||
if (!sparse_keymap_report_event(eeepc->inputdev, event, 1, true))
|
||||
pr_info("Unknown key %x pressed\n", event);
|
||||
}
|
||||
@@ -1224,6 +1240,7 @@ static void eeepc_input_notify(struct eeepc_laptop *eeepc, int event)
|
||||
static void eeepc_acpi_notify(struct acpi_device *device, u32 event)
|
||||
{
|
||||
struct eeepc_laptop *eeepc = acpi_driver_data(device);
|
||||
int old_brightness, new_brightness;
|
||||
u16 count;
|
||||
|
||||
if (event > ACPI_MAX_SYS_NOTIFY)
|
||||
@@ -1234,34 +1251,32 @@ static void eeepc_acpi_notify(struct acpi_device *device, u32 event)
|
||||
count);
|
||||
|
||||
/* Brightness events are special */
|
||||
if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX) {
|
||||
|
||||
/* Ignore them completely if the acpi video driver is used */
|
||||
if (eeepc->backlight_device != NULL) {
|
||||
int old_brightness, new_brightness;
|
||||
|
||||
/* Update the backlight device. */
|
||||
old_brightness = eeepc_backlight_notify(eeepc);
|
||||
|
||||
/* Convert event to keypress (obsolescent hack) */
|
||||
new_brightness = event - NOTIFY_BRN_MIN;
|
||||
|
||||
if (new_brightness < old_brightness) {
|
||||
event = NOTIFY_BRN_MIN; /* brightness down */
|
||||
} else if (new_brightness > old_brightness) {
|
||||
event = NOTIFY_BRN_MAX; /* brightness up */
|
||||
} else {
|
||||
/*
|
||||
* no change in brightness - already at min/max,
|
||||
* event will be desired value (or else ignored)
|
||||
*/
|
||||
}
|
||||
eeepc_input_notify(eeepc, event);
|
||||
}
|
||||
} else {
|
||||
/* Everything else is a bona-fide keypress event */
|
||||
if (event < NOTIFY_BRN_MIN || event > NOTIFY_BRN_MAX) {
|
||||
eeepc_input_notify(eeepc, event);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ignore them completely if the acpi video driver is used */
|
||||
if (!eeepc->backlight_device)
|
||||
return;
|
||||
|
||||
/* Update the backlight device. */
|
||||
old_brightness = eeepc_backlight_notify(eeepc);
|
||||
|
||||
/* Convert event to keypress (obsolescent hack) */
|
||||
new_brightness = event - NOTIFY_BRN_MIN;
|
||||
|
||||
if (new_brightness < old_brightness) {
|
||||
event = NOTIFY_BRN_MIN; /* brightness down */
|
||||
} else if (new_brightness > old_brightness) {
|
||||
event = NOTIFY_BRN_MAX; /* brightness up */
|
||||
} else {
|
||||
/*
|
||||
* no change in brightness - already at min/max,
|
||||
* event will be desired value (or else ignored)
|
||||
*/
|
||||
}
|
||||
eeepc_input_notify(eeepc, event);
|
||||
}
|
||||
|
||||
static void eeepc_dmi_check(struct eeepc_laptop *eeepc)
|
||||
@@ -1293,8 +1308,8 @@ static void eeepc_dmi_check(struct eeepc_laptop *eeepc)
|
||||
*/
|
||||
if (strcmp(model, "701") == 0 || strcmp(model, "702") == 0) {
|
||||
eeepc->cpufv_disabled = true;
|
||||
pr_info("model %s does not officially support setting cpu "
|
||||
"speed\n", model);
|
||||
pr_info("model %s does not officially support setting cpu speed\n",
|
||||
model);
|
||||
pr_info("cpufv disabled to avoid instability\n");
|
||||
}
|
||||
|
||||
@@ -1320,8 +1335,8 @@ static void cmsg_quirk(struct eeepc_laptop *eeepc, int cm, const char *name)
|
||||
Check if cm_getv[cm] works and, if yes, assume cm should be set. */
|
||||
if (!(eeepc->cm_supported & (1 << cm))
|
||||
&& !read_acpi_int(eeepc->handle, cm_getv[cm], &dummy)) {
|
||||
pr_info("%s (%x) not reported by BIOS,"
|
||||
" enabling anyway\n", name, 1 << cm);
|
||||
pr_info("%s (%x) not reported by BIOS, enabling anyway\n",
|
||||
name, 1 << cm);
|
||||
eeepc->cm_supported |= 1 << cm;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user