Commit 76f7d6c0 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branches 'acpi-button', 'acpi-battery' and 'acpi-osi'

Merge updates of the ACPI battery and button drivers and support for
a new OEM _OSI string for 4.19.

* acpi-button:
  ACPI / button: fix defined but not used warning
  ACPI / button: increment wakeup count only when notified

* acpi-battery:
  ACPI / battery: Do not export energy_full[_design] on devices without full_charge_capacity
  ACPI / battery: get rid of negations in conditions
  ACPI / battery: use specialized print macros
  ACPI / battery: reorder headers alphabetically
  ACPI / battery: drop inclusion of init.h
  ACPI: battery: remove redundant old_present check on insertion

* acpi-osi:
  ACPI / OSI: Add OEM _OSI string to enable NVidia HDMI audio
...@@ -23,18 +23,18 @@ ...@@ -23,18 +23,18 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/async.h>
#include <linux/delay.h>
#include <linux/dmi.h>
#include <linux/jiffies.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/jiffies.h>
#include <linux/async.h>
#include <linux/dmi.h>
#include <linux/delay.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/types.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
...@@ -364,6 +364,20 @@ static enum power_supply_property energy_battery_props[] = { ...@@ -364,6 +364,20 @@ static enum power_supply_property energy_battery_props[] = {
POWER_SUPPLY_PROP_SERIAL_NUMBER, POWER_SUPPLY_PROP_SERIAL_NUMBER,
}; };
static enum power_supply_property energy_battery_full_cap_broken_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_CYCLE_COUNT,
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_POWER_NOW,
POWER_SUPPLY_PROP_ENERGY_NOW,
POWER_SUPPLY_PROP_MODEL_NAME,
POWER_SUPPLY_PROP_MANUFACTURER,
POWER_SUPPLY_PROP_SERIAL_NUMBER,
};
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
Battery Management Battery Management
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
...@@ -577,8 +591,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery) ...@@ -577,8 +591,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN && battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN &&
(s16)(battery->rate_now) < 0) { (s16)(battery->rate_now) < 0) {
battery->rate_now = abs((s16)battery->rate_now); battery->rate_now = abs((s16)battery->rate_now);
printk_once(KERN_WARNING FW_BUG pr_warn_once(FW_BUG "battery: (dis)charge rate invalid.\n");
"battery: (dis)charge rate invalid.\n");
} }
if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags) if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)
...@@ -799,6 +812,11 @@ static int sysfs_add_battery(struct acpi_battery *battery) ...@@ -799,6 +812,11 @@ static int sysfs_add_battery(struct acpi_battery *battery)
battery->bat_desc.properties = charge_battery_props; battery->bat_desc.properties = charge_battery_props;
battery->bat_desc.num_properties = battery->bat_desc.num_properties =
ARRAY_SIZE(charge_battery_props); ARRAY_SIZE(charge_battery_props);
} else if (battery->full_charge_capacity == 0) {
battery->bat_desc.properties =
energy_battery_full_cap_broken_props;
battery->bat_desc.num_properties =
ARRAY_SIZE(energy_battery_full_cap_broken_props);
} else { } else {
battery->bat_desc.properties = energy_battery_props; battery->bat_desc.properties = energy_battery_props;
battery->bat_desc.num_properties = battery->bat_desc.num_properties =
...@@ -918,10 +936,11 @@ static void acpi_battery_quirks(struct acpi_battery *battery) ...@@ -918,10 +936,11 @@ static void acpi_battery_quirks(struct acpi_battery *battery)
static int acpi_battery_update(struct acpi_battery *battery, bool resume) static int acpi_battery_update(struct acpi_battery *battery, bool resume)
{ {
int result, old_present = acpi_battery_present(battery); int result = acpi_battery_get_status(battery);
result = acpi_battery_get_status(battery);
if (result) if (result)
return result; return result;
if (!acpi_battery_present(battery)) { if (!acpi_battery_present(battery)) {
sysfs_remove_battery(battery); sysfs_remove_battery(battery);
battery->update_time = 0; battery->update_time = 0;
...@@ -931,8 +950,7 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume) ...@@ -931,8 +950,7 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume)
if (resume) if (resume)
return 0; return 0;
if (!battery->update_time || if (!battery->update_time) {
old_present != acpi_battery_present(battery)) {
result = acpi_battery_get_info(battery); result = acpi_battery_get_info(battery);
if (result) if (result)
return result; return result;
...@@ -1021,7 +1039,7 @@ static int acpi_battery_info_proc_show(struct seq_file *seq, void *offset) ...@@ -1021,7 +1039,7 @@ static int acpi_battery_info_proc_show(struct seq_file *seq, void *offset)
acpi_battery_units(battery)); acpi_battery_units(battery));
seq_printf(seq, "battery technology: %srechargeable\n", seq_printf(seq, "battery technology: %srechargeable\n",
(!battery->technology)?"non-":""); battery->technology ? "" : "non-");
if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN) if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
seq_printf(seq, "design voltage: unknown\n"); seq_printf(seq, "design voltage: unknown\n");
...@@ -1112,11 +1130,12 @@ static int acpi_battery_alarm_proc_show(struct seq_file *seq, void *offset) ...@@ -1112,11 +1130,12 @@ static int acpi_battery_alarm_proc_show(struct seq_file *seq, void *offset)
goto end; goto end;
} }
seq_printf(seq, "alarm: "); seq_printf(seq, "alarm: ");
if (!battery->alarm) if (battery->alarm) {
seq_printf(seq, "unsupported\n");
else
seq_printf(seq, "%u %sh\n", battery->alarm, seq_printf(seq, "%u %sh\n", battery->alarm,
acpi_battery_units(battery)); acpi_battery_units(battery));
} else {
seq_printf(seq, "unsupported\n");
}
end: end:
if (result) if (result)
seq_printf(seq, "ERROR: Unable to read battery alarm\n"); seq_printf(seq, "ERROR: Unable to read battery alarm\n");
...@@ -1149,9 +1168,9 @@ static ssize_t acpi_battery_write_alarm(struct file *file, ...@@ -1149,9 +1168,9 @@ static ssize_t acpi_battery_write_alarm(struct file *file,
} }
result = acpi_battery_set_alarm(battery); result = acpi_battery_set_alarm(battery);
end: end:
if (!result) if (result)
return count; return result;
return result; return count;
} }
static int acpi_battery_alarm_proc_open(struct inode *inode, struct file *file) static int acpi_battery_alarm_proc_open(struct inode *inode, struct file *file)
...@@ -1170,8 +1189,7 @@ static const struct file_operations acpi_battery_alarm_fops = { ...@@ -1170,8 +1189,7 @@ static const struct file_operations acpi_battery_alarm_fops = {
static int acpi_battery_add_fs(struct acpi_device *device) static int acpi_battery_add_fs(struct acpi_device *device)
{ {
printk(KERN_WARNING PREFIX "Deprecated procfs I/F for battery is loaded," pr_warning(PREFIX "Deprecated procfs I/F for battery is loaded, please retry with CONFIG_ACPI_PROCFS_POWER cleared\n");
" please retry with CONFIG_ACPI_PROCFS_POWER cleared\n");
if (!acpi_device_dir(device)) { if (!acpi_device_dir(device)) {
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
acpi_battery_dir); acpi_battery_dir);
...@@ -1247,7 +1265,9 @@ static int battery_notify(struct notifier_block *nb, ...@@ -1247,7 +1265,9 @@ static int battery_notify(struct notifier_block *nb,
if (!acpi_battery_present(battery)) if (!acpi_battery_present(battery))
return 0; return 0;
if (!battery->bat) { if (battery->bat) {
acpi_battery_refresh(battery);
} else {
result = acpi_battery_get_info(battery); result = acpi_battery_get_info(battery);
if (result) if (result)
return result; return result;
...@@ -1255,8 +1275,7 @@ static int battery_notify(struct notifier_block *nb, ...@@ -1255,8 +1275,7 @@ static int battery_notify(struct notifier_block *nb,
result = sysfs_add_battery(battery); result = sysfs_add_battery(battery);
if (result) if (result)
return result; return result;
} else }
acpi_battery_refresh(battery);
acpi_battery_init_alarm(battery); acpi_battery_init_alarm(battery);
acpi_battery_get_state(battery); acpi_battery_get_state(battery);
...@@ -1398,7 +1417,7 @@ static int acpi_battery_add(struct acpi_device *device) ...@@ -1398,7 +1417,7 @@ static int acpi_battery_add(struct acpi_device *device)
} }
#endif #endif
printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", pr_info(PREFIX "%s Slot [%s] (battery %s)\n",
ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device),
device->status.battery_present ? "present" : "absent"); device->status.battery_present ? "present" : "absent");
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#define pr_fmt(fmt) "ACPI: button: " fmt #define pr_fmt(fmt) "ACPI: button: " fmt
#include <linux/compiler.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -235,9 +236,6 @@ static int acpi_lid_notify_state(struct acpi_device *device, int state) ...@@ -235,9 +236,6 @@ static int acpi_lid_notify_state(struct acpi_device *device, int state)
button->last_time = ktime_get(); button->last_time = ktime_get();
} }
if (state)
acpi_pm_wakeup_event(&device->dev);
ret = blocking_notifier_call_chain(&acpi_lid_notifier, state, device); ret = blocking_notifier_call_chain(&acpi_lid_notifier, state, device);
if (ret == NOTIFY_DONE) if (ret == NOTIFY_DONE)
ret = blocking_notifier_call_chain(&acpi_lid_notifier, state, ret = blocking_notifier_call_chain(&acpi_lid_notifier, state,
...@@ -252,7 +250,8 @@ static int acpi_lid_notify_state(struct acpi_device *device, int state) ...@@ -252,7 +250,8 @@ static int acpi_lid_notify_state(struct acpi_device *device, int state)
return ret; return ret;
} }
static int acpi_button_state_seq_show(struct seq_file *seq, void *offset) static int __maybe_unused acpi_button_state_seq_show(struct seq_file *seq,
void *offset)
{ {
struct acpi_device *device = seq->private; struct acpi_device *device = seq->private;
int state; int state;
...@@ -366,7 +365,8 @@ int acpi_lid_open(void) ...@@ -366,7 +365,8 @@ int acpi_lid_open(void)
} }
EXPORT_SYMBOL(acpi_lid_open); EXPORT_SYMBOL(acpi_lid_open);
static int acpi_lid_update_state(struct acpi_device *device) static int acpi_lid_update_state(struct acpi_device *device,
bool signal_wakeup)
{ {
int state; int state;
...@@ -374,6 +374,9 @@ static int acpi_lid_update_state(struct acpi_device *device) ...@@ -374,6 +374,9 @@ static int acpi_lid_update_state(struct acpi_device *device)
if (state < 0) if (state < 0)
return state; return state;
if (state && signal_wakeup)
acpi_pm_wakeup_event(&device->dev);
return acpi_lid_notify_state(device, state); return acpi_lid_notify_state(device, state);
} }
...@@ -384,7 +387,7 @@ static void acpi_lid_initialize_state(struct acpi_device *device) ...@@ -384,7 +387,7 @@ static void acpi_lid_initialize_state(struct acpi_device *device)
(void)acpi_lid_notify_state(device, 1); (void)acpi_lid_notify_state(device, 1);
break; break;
case ACPI_BUTTON_LID_INIT_METHOD: case ACPI_BUTTON_LID_INIT_METHOD:
(void)acpi_lid_update_state(device); (void)acpi_lid_update_state(device, false);
break; break;
case ACPI_BUTTON_LID_INIT_IGNORE: case ACPI_BUTTON_LID_INIT_IGNORE:
default: default:
...@@ -409,7 +412,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event) ...@@ -409,7 +412,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event)
users = button->input->users; users = button->input->users;
mutex_unlock(&button->input->mutex); mutex_unlock(&button->input->mutex);
if (users) if (users)
acpi_lid_update_state(device); acpi_lid_update_state(device, true);
} else { } else {
int keycode; int keycode;
......
...@@ -66,6 +66,14 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = { ...@@ -66,6 +66,14 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
* be removed if both new and old graphics cards are supported. * be removed if both new and old graphics cards are supported.
*/ */
{"Linux-Dell-Video", true}, {"Linux-Dell-Video", true},
/*
* Linux-Lenovo-NV-HDMI-Audio is used by BIOS to power on NVidia's HDMI
* audio device which is turned off for power-saving in Windows OS.
* This power management feature observed on some Lenovo Thinkpad
* systems which will not be able to output audio via HDMI without
* a BIOS workaround.
*/
{"Linux-Lenovo-NV-HDMI-Audio", true},
}; };
static u32 acpi_osi_handler(acpi_string interface, u32 supported) static u32 acpi_osi_handler(acpi_string interface, u32 supported)
......
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