Commit cf8116c4 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

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
...@@ -34,6 +34,9 @@ ACPI_MODULE_NAME("acpi_lpss"); ...@@ -34,6 +34,9 @@ ACPI_MODULE_NAME("acpi_lpss");
/* Offsets relative to LPSS_PRIVATE_OFFSET */ /* Offsets relative to LPSS_PRIVATE_OFFSET */
#define LPSS_CLK_DIVIDER_DEF_MASK (BIT(1) | BIT(16)) #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 0x08
#define LPSS_GENERAL_LTR_MODE_SW BIT(2) #define LPSS_GENERAL_LTR_MODE_SW BIT(2)
#define LPSS_GENERAL_UART_RTS_OVRD BIT(3) #define LPSS_GENERAL_UART_RTS_OVRD BIT(3)
...@@ -99,6 +102,17 @@ static void lpss_uart_setup(struct lpss_private_data *pdata) ...@@ -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); 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 = { static struct lpss_device_desc lpt_dev_desc = {
.clk_required = true, .clk_required = true,
.prv_offset = 0x800, .prv_offset = 0x800,
...@@ -171,6 +185,7 @@ static struct lpss_device_desc byt_i2c_dev_desc = { ...@@ -171,6 +185,7 @@ static struct lpss_device_desc byt_i2c_dev_desc = {
.prv_offset = 0x800, .prv_offset = 0x800,
.save_ctx = true, .save_ctx = true,
.shared_clock = &i2c_clock, .shared_clock = &i2c_clock,
.setup = lpss_i2c_setup,
}; };
#else #else
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/jiffies.h> #include <linux/jiffies.h>
#include <linux/async.h> #include <linux/async.h>
#include <linux/dmi.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 <asm/unaligned.h> #include <asm/unaligned.h>
...@@ -70,6 +71,7 @@ MODULE_DESCRIPTION("ACPI Battery Driver"); ...@@ -70,6 +71,7 @@ MODULE_DESCRIPTION("ACPI Battery Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static int battery_bix_broken_package; static int battery_bix_broken_package;
static int battery_notification_delay_ms;
static unsigned int cache_time = 1000; static unsigned int cache_time = 1000;
module_param(cache_time, uint, 0644); module_param(cache_time, uint, 0644);
MODULE_PARM_DESC(cache_time, "cache time in milliseconds"); MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
...@@ -930,7 +932,10 @@ static ssize_t acpi_battery_write_alarm(struct file *file, ...@@ -930,7 +932,10 @@ static ssize_t acpi_battery_write_alarm(struct file *file,
goto end; goto end;
} }
alarm_string[count] = '\0'; 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); result = acpi_battery_set_alarm(battery);
end: end:
if (!result) if (!result)
...@@ -1062,6 +1067,14 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event) ...@@ -1062,6 +1067,14 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event)
if (!battery) if (!battery)
return; return;
old = battery->bat.dev; 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) if (event == ACPI_BATTERY_NOTIFY_INFO)
acpi_battery_refresh(battery); acpi_battery_refresh(battery);
acpi_battery_update(battery, false); acpi_battery_update(battery, false);
...@@ -1106,14 +1119,35 @@ static int battery_notify(struct notifier_block *nb, ...@@ -1106,14 +1119,35 @@ static int battery_notify(struct notifier_block *nb,
return 0; 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[] = { static struct dmi_system_id bat_dmi_table[] = {
{ {
.callback = battery_bix_broken_package_quirk,
.ident = "NEC LZ750/LS", .ident = "NEC LZ750/LS",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "NEC"), DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
DMI_MATCH(DMI_PRODUCT_NAME, "PC-LZ750LS"), 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) ...@@ -1227,8 +1261,7 @@ static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
if (acpi_disabled) if (acpi_disabled)
return; return;
if (dmi_check_system(bat_dmi_table)) dmi_check_system(bat_dmi_table);
battery_bix_broken_package = 1;
#ifdef CONFIG_ACPI_PROCFS_POWER #ifdef CONFIG_ACPI_PROCFS_POWER
acpi_battery_dir = acpi_lock_battery_dir(); acpi_battery_dir = acpi_lock_battery_dir();
......
...@@ -235,7 +235,8 @@ void acpi_os_vprintf(const char *fmt, va_list args) ...@@ -235,7 +235,8 @@ void acpi_os_vprintf(const char *fmt, va_list args)
static unsigned long acpi_rsdp; static unsigned long acpi_rsdp;
static int __init setup_acpi_rsdp(char *arg) 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; return 0;
} }
early_param("acpi_rsdp", setup_acpi_rsdp); early_param("acpi_rsdp", setup_acpi_rsdp);
......
...@@ -360,7 +360,8 @@ static int __init acpi_parse_apic_instance(char *str) ...@@ -360,7 +360,8 @@ static int __init acpi_parse_apic_instance(char *str)
if (!str) if (!str)
return -EINVAL; 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); pr_notice("Shall use APIC/MADT table %d\n", acpi_apic_instance);
......
...@@ -53,7 +53,7 @@ struct acpi_power_register { ...@@ -53,7 +53,7 @@ struct acpi_power_register {
u8 bit_offset; u8 bit_offset;
u8 access_size; u8 access_size;
u64 address; u64 address;
} __attribute__ ((packed)); } __packed;
struct acpi_processor_cx { struct acpi_processor_cx {
u8 valid; u8 valid;
...@@ -83,7 +83,7 @@ struct acpi_psd_package { ...@@ -83,7 +83,7 @@ struct acpi_psd_package {
u64 domain; u64 domain;
u64 coord_type; u64 coord_type;
u64 num_processors; u64 num_processors;
} __attribute__ ((packed)); } __packed;
struct acpi_pct_register { struct acpi_pct_register {
u8 descriptor; u8 descriptor;
...@@ -93,7 +93,7 @@ struct acpi_pct_register { ...@@ -93,7 +93,7 @@ struct acpi_pct_register {
u8 bit_offset; u8 bit_offset;
u8 reserved; u8 reserved;
u64 address; u64 address;
} __attribute__ ((packed)); } __packed;
struct acpi_processor_px { struct acpi_processor_px {
u64 core_frequency; /* megahertz */ u64 core_frequency; /* megahertz */
...@@ -124,7 +124,7 @@ struct acpi_tsd_package { ...@@ -124,7 +124,7 @@ struct acpi_tsd_package {
u64 domain; u64 domain;
u64 coord_type; u64 coord_type;
u64 num_processors; u64 num_processors;
} __attribute__ ((packed)); } __packed;
struct acpi_ptc_register { struct acpi_ptc_register {
u8 descriptor; u8 descriptor;
...@@ -134,7 +134,7 @@ struct acpi_ptc_register { ...@@ -134,7 +134,7 @@ struct acpi_ptc_register {
u8 bit_offset; u8 bit_offset;
u8 reserved; u8 reserved;
u64 address; u64 address;
} __attribute__ ((packed)); } __packed;
struct acpi_processor_tx_tss { struct acpi_processor_tx_tss {
u64 freqpercentage; /* */ u64 freqpercentage; /* */
......
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