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
This commit is contained in:
commit
76f7d6c07a
|
@ -23,18 +23,18 @@
|
|||
|
||||
#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/list.h>
|
||||
#include <linux/module.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/suspend.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
|
@ -364,6 +364,20 @@ static enum power_supply_property energy_battery_props[] = {
|
|||
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
|
||||
-------------------------------------------------------------------------- */
|
||||
|
@ -577,8 +591,7 @@ static int acpi_battery_get_state(struct acpi_battery *battery)
|
|||
battery->rate_now != ACPI_BATTERY_VALUE_UNKNOWN &&
|
||||
(s16)(battery->rate_now) < 0) {
|
||||
battery->rate_now = abs((s16)battery->rate_now);
|
||||
printk_once(KERN_WARNING FW_BUG
|
||||
"battery: (dis)charge rate invalid.\n");
|
||||
pr_warn_once(FW_BUG "battery: (dis)charge rate invalid.\n");
|
||||
}
|
||||
|
||||
if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)
|
||||
|
@ -799,6 +812,11 @@ static int sysfs_add_battery(struct acpi_battery *battery)
|
|||
battery->bat_desc.properties = charge_battery_props;
|
||||
battery->bat_desc.num_properties =
|
||||
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 {
|
||||
battery->bat_desc.properties = energy_battery_props;
|
||||
battery->bat_desc.num_properties =
|
||||
|
@ -918,10 +936,11 @@ static void acpi_battery_quirks(struct acpi_battery *battery)
|
|||
|
||||
static int acpi_battery_update(struct acpi_battery *battery, bool resume)
|
||||
{
|
||||
int result, old_present = acpi_battery_present(battery);
|
||||
result = acpi_battery_get_status(battery);
|
||||
int result = acpi_battery_get_status(battery);
|
||||
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
if (!acpi_battery_present(battery)) {
|
||||
sysfs_remove_battery(battery);
|
||||
battery->update_time = 0;
|
||||
|
@ -931,8 +950,7 @@ static int acpi_battery_update(struct acpi_battery *battery, bool resume)
|
|||
if (resume)
|
||||
return 0;
|
||||
|
||||
if (!battery->update_time ||
|
||||
old_present != acpi_battery_present(battery)) {
|
||||
if (!battery->update_time) {
|
||||
result = acpi_battery_get_info(battery);
|
||||
if (result)
|
||||
return result;
|
||||
|
@ -1021,7 +1039,7 @@ static int acpi_battery_info_proc_show(struct seq_file *seq, void *offset)
|
|||
acpi_battery_units(battery));
|
||||
|
||||
seq_printf(seq, "battery technology: %srechargeable\n",
|
||||
(!battery->technology)?"non-":"");
|
||||
battery->technology ? "" : "non-");
|
||||
|
||||
if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN)
|
||||
seq_printf(seq, "design voltage: unknown\n");
|
||||
|
@ -1112,11 +1130,12 @@ static int acpi_battery_alarm_proc_show(struct seq_file *seq, void *offset)
|
|||
goto end;
|
||||
}
|
||||
seq_printf(seq, "alarm: ");
|
||||
if (!battery->alarm)
|
||||
seq_printf(seq, "unsupported\n");
|
||||
else
|
||||
if (battery->alarm) {
|
||||
seq_printf(seq, "%u %sh\n", battery->alarm,
|
||||
acpi_battery_units(battery));
|
||||
} else {
|
||||
seq_printf(seq, "unsupported\n");
|
||||
}
|
||||
end:
|
||||
if (result)
|
||||
seq_printf(seq, "ERROR: Unable to read battery alarm\n");
|
||||
|
@ -1149,9 +1168,9 @@ static ssize_t acpi_battery_write_alarm(struct file *file,
|
|||
}
|
||||
result = acpi_battery_set_alarm(battery);
|
||||
end:
|
||||
if (!result)
|
||||
return count;
|
||||
return result;
|
||||
if (result)
|
||||
return result;
|
||||
return count;
|
||||
}
|
||||
|
||||
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 = {
|
|||
|
||||
static int acpi_battery_add_fs(struct acpi_device *device)
|
||||
{
|
||||
printk(KERN_WARNING PREFIX "Deprecated procfs I/F for battery is loaded,"
|
||||
" please retry with CONFIG_ACPI_PROCFS_POWER cleared\n");
|
||||
pr_warning(PREFIX "Deprecated procfs I/F for battery is loaded, please retry with CONFIG_ACPI_PROCFS_POWER cleared\n");
|
||||
if (!acpi_device_dir(device)) {
|
||||
acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
|
||||
acpi_battery_dir);
|
||||
|
@ -1247,7 +1265,9 @@ static int battery_notify(struct notifier_block *nb,
|
|||
if (!acpi_battery_present(battery))
|
||||
return 0;
|
||||
|
||||
if (!battery->bat) {
|
||||
if (battery->bat) {
|
||||
acpi_battery_refresh(battery);
|
||||
} else {
|
||||
result = acpi_battery_get_info(battery);
|
||||
if (result)
|
||||
return result;
|
||||
|
@ -1255,8 +1275,7 @@ static int battery_notify(struct notifier_block *nb,
|
|||
result = sysfs_add_battery(battery);
|
||||
if (result)
|
||||
return result;
|
||||
} else
|
||||
acpi_battery_refresh(battery);
|
||||
}
|
||||
|
||||
acpi_battery_init_alarm(battery);
|
||||
acpi_battery_get_state(battery);
|
||||
|
@ -1398,7 +1417,7 @@ static int acpi_battery_add(struct acpi_device *device)
|
|||
}
|
||||
#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),
|
||||
device->status.battery_present ? "present" : "absent");
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
#define pr_fmt(fmt) "ACPI: button: " fmt
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
|
@ -235,9 +236,6 @@ static int acpi_lid_notify_state(struct acpi_device *device, int state)
|
|||
button->last_time = ktime_get();
|
||||
}
|
||||
|
||||
if (state)
|
||||
acpi_pm_wakeup_event(&device->dev);
|
||||
|
||||
ret = blocking_notifier_call_chain(&acpi_lid_notifier, state, device);
|
||||
if (ret == NOTIFY_DONE)
|
||||
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)
|
|||
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;
|
||||
int state;
|
||||
|
@ -366,7 +365,8 @@ int acpi_lid_open(void)
|
|||
}
|
||||
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;
|
||||
|
||||
|
@ -374,6 +374,9 @@ static int acpi_lid_update_state(struct acpi_device *device)
|
|||
if (state < 0)
|
||||
return state;
|
||||
|
||||
if (state && signal_wakeup)
|
||||
acpi_pm_wakeup_event(&device->dev);
|
||||
|
||||
return acpi_lid_notify_state(device, state);
|
||||
}
|
||||
|
||||
|
@ -384,7 +387,7 @@ static void acpi_lid_initialize_state(struct acpi_device *device)
|
|||
(void)acpi_lid_notify_state(device, 1);
|
||||
break;
|
||||
case ACPI_BUTTON_LID_INIT_METHOD:
|
||||
(void)acpi_lid_update_state(device);
|
||||
(void)acpi_lid_update_state(device, false);
|
||||
break;
|
||||
case ACPI_BUTTON_LID_INIT_IGNORE:
|
||||
default:
|
||||
|
@ -409,7 +412,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event)
|
|||
users = button->input->users;
|
||||
mutex_unlock(&button->input->mutex);
|
||||
if (users)
|
||||
acpi_lid_update_state(device);
|
||||
acpi_lid_update_state(device, true);
|
||||
} else {
|
||||
int keycode;
|
||||
|
||||
|
|
|
@ -66,6 +66,14 @@ osi_setup_entries[OSI_STRING_ENTRIES_MAX] __initdata = {
|
|||
* be removed if both new and old graphics cards are supported.
|
||||
*/
|
||||
{"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)
|
||||
|
|
Loading…
Reference in New Issue