Merge branches 'acpi-general', 'acpi-processor', 'acpi-lpss' and 'acpi-battery'
* acpi-general: ACPI: use kstrto*() instead of simple_strto*() * acpi-processor: ACPI / processor replace __attribute__((packed)) by __packed * acpi-lpss: ACPI / LPSS: Take I2C host controllers out of reset * acpi-battery: ACPI / battery: add quirk for Acer Aspire V5-573G ACPI / battery: use callback for setting up quirks
This commit is contained in:
Коммит
cf8116c491
|
@ -34,6 +34,9 @@ ACPI_MODULE_NAME("acpi_lpss");
|
|||
|
||||
/* Offsets relative to LPSS_PRIVATE_OFFSET */
|
||||
#define LPSS_CLK_DIVIDER_DEF_MASK (BIT(1) | BIT(16))
|
||||
#define LPSS_RESETS 0x04
|
||||
#define LPSS_RESETS_RESET_FUNC BIT(0)
|
||||
#define LPSS_RESETS_RESET_APB BIT(1)
|
||||
#define LPSS_GENERAL 0x08
|
||||
#define LPSS_GENERAL_LTR_MODE_SW BIT(2)
|
||||
#define LPSS_GENERAL_UART_RTS_OVRD BIT(3)
|
||||
|
@ -99,6 +102,17 @@ static void lpss_uart_setup(struct lpss_private_data *pdata)
|
|||
writel(reg | LPSS_GENERAL_UART_RTS_OVRD, pdata->mmio_base + offset);
|
||||
}
|
||||
|
||||
static void lpss_i2c_setup(struct lpss_private_data *pdata)
|
||||
{
|
||||
unsigned int offset;
|
||||
u32 val;
|
||||
|
||||
offset = pdata->dev_desc->prv_offset + LPSS_RESETS;
|
||||
val = readl(pdata->mmio_base + offset);
|
||||
val |= LPSS_RESETS_RESET_APB | LPSS_RESETS_RESET_FUNC;
|
||||
writel(val, pdata->mmio_base + offset);
|
||||
}
|
||||
|
||||
static struct lpss_device_desc lpt_dev_desc = {
|
||||
.clk_required = true,
|
||||
.prv_offset = 0x800,
|
||||
|
@ -171,6 +185,7 @@ static struct lpss_device_desc byt_i2c_dev_desc = {
|
|||
.prv_offset = 0x800,
|
||||
.save_ctx = true,
|
||||
.shared_clock = &i2c_clock,
|
||||
.setup = lpss_i2c_setup,
|
||||
};
|
||||
|
||||
#else
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#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 <asm/unaligned.h>
|
||||
|
@ -70,6 +71,7 @@ MODULE_DESCRIPTION("ACPI Battery Driver");
|
|||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int battery_bix_broken_package;
|
||||
static int battery_notification_delay_ms;
|
||||
static unsigned int cache_time = 1000;
|
||||
module_param(cache_time, uint, 0644);
|
||||
MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
|
||||
|
@ -930,7 +932,10 @@ static ssize_t acpi_battery_write_alarm(struct file *file,
|
|||
goto end;
|
||||
}
|
||||
alarm_string[count] = '\0';
|
||||
battery->alarm = simple_strtol(alarm_string, NULL, 0);
|
||||
if (kstrtoint(alarm_string, 0, &battery->alarm)) {
|
||||
result = -EINVAL;
|
||||
goto end;
|
||||
}
|
||||
result = acpi_battery_set_alarm(battery);
|
||||
end:
|
||||
if (!result)
|
||||
|
@ -1062,6 +1067,14 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
|
|||
if (!battery)
|
||||
return;
|
||||
old = battery->bat.dev;
|
||||
/*
|
||||
* On Acer Aspire V5-573G notifications are sometimes triggered too
|
||||
* early. For example, when AC is unplugged and notification is
|
||||
* triggered, battery state is still reported as "Full", and changes to
|
||||
* "Discharging" only after short delay, without any notification.
|
||||
*/
|
||||
if (battery_notification_delay_ms > 0)
|
||||
msleep(battery_notification_delay_ms);
|
||||
if (event == ACPI_BATTERY_NOTIFY_INFO)
|
||||
acpi_battery_refresh(battery);
|
||||
acpi_battery_update(battery, false);
|
||||
|
@ -1106,14 +1119,35 @@ static int battery_notify(struct notifier_block *nb,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int battery_bix_broken_package_quirk(const struct dmi_system_id *d)
|
||||
{
|
||||
battery_bix_broken_package = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int battery_notification_delay_quirk(const struct dmi_system_id *d)
|
||||
{
|
||||
battery_notification_delay_ms = 1000;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id bat_dmi_table[] = {
|
||||
{
|
||||
.callback = battery_bix_broken_package_quirk,
|
||||
.ident = "NEC LZ750/LS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PC-LZ750LS"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = battery_notification_delay_quirk,
|
||||
.ident = "Acer Aspire V5-573G",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Aspire V5-573G"),
|
||||
},
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
|
@ -1227,8 +1261,7 @@ static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
|
|||
if (acpi_disabled)
|
||||
return;
|
||||
|
||||
if (dmi_check_system(bat_dmi_table))
|
||||
battery_bix_broken_package = 1;
|
||||
dmi_check_system(bat_dmi_table);
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
acpi_battery_dir = acpi_lock_battery_dir();
|
||||
|
|
|
@ -235,7 +235,8 @@ void acpi_os_vprintf(const char *fmt, va_list args)
|
|||
static unsigned long acpi_rsdp;
|
||||
static int __init setup_acpi_rsdp(char *arg)
|
||||
{
|
||||
acpi_rsdp = simple_strtoul(arg, NULL, 16);
|
||||
if (kstrtoul(arg, 16, &acpi_rsdp))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
early_param("acpi_rsdp", setup_acpi_rsdp);
|
||||
|
|
|
@ -360,7 +360,8 @@ static int __init acpi_parse_apic_instance(char *str)
|
|||
if (!str)
|
||||
return -EINVAL;
|
||||
|
||||
acpi_apic_instance = simple_strtoul(str, NULL, 0);
|
||||
if (kstrtoint(str, 0, &acpi_apic_instance))
|
||||
return -EINVAL;
|
||||
|
||||
pr_notice("Shall use APIC/MADT table %d\n", acpi_apic_instance);
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ struct acpi_power_register {
|
|||
u8 bit_offset;
|
||||
u8 access_size;
|
||||
u64 address;
|
||||
} __attribute__ ((packed));
|
||||
} __packed;
|
||||
|
||||
struct acpi_processor_cx {
|
||||
u8 valid;
|
||||
|
@ -83,7 +83,7 @@ struct acpi_psd_package {
|
|||
u64 domain;
|
||||
u64 coord_type;
|
||||
u64 num_processors;
|
||||
} __attribute__ ((packed));
|
||||
} __packed;
|
||||
|
||||
struct acpi_pct_register {
|
||||
u8 descriptor;
|
||||
|
@ -93,7 +93,7 @@ struct acpi_pct_register {
|
|||
u8 bit_offset;
|
||||
u8 reserved;
|
||||
u64 address;
|
||||
} __attribute__ ((packed));
|
||||
} __packed;
|
||||
|
||||
struct acpi_processor_px {
|
||||
u64 core_frequency; /* megahertz */
|
||||
|
@ -124,7 +124,7 @@ struct acpi_tsd_package {
|
|||
u64 domain;
|
||||
u64 coord_type;
|
||||
u64 num_processors;
|
||||
} __attribute__ ((packed));
|
||||
} __packed;
|
||||
|
||||
struct acpi_ptc_register {
|
||||
u8 descriptor;
|
||||
|
@ -134,7 +134,7 @@ struct acpi_ptc_register {
|
|||
u8 bit_offset;
|
||||
u8 reserved;
|
||||
u64 address;
|
||||
} __attribute__ ((packed));
|
||||
} __packed;
|
||||
|
||||
struct acpi_processor_tx_tss {
|
||||
u64 freqpercentage; /* */
|
||||
|
|
Загрузка…
Ссылка в новой задаче