Skip to content

Commit

Permalink
Merge branches 'acpi-general', 'acpi-processor', 'acpi-lpss' and 'acp…
Browse files Browse the repository at this point in the history
…i-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
  • Loading branch information
Rafael J. Wysocki committed Jun 19, 2014
5 parents 12e27b1 + 3d91589 + 92c4d2a + 765bdd4 + f43691c commit cf8116c
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 10 deletions.
15 changes: 15 additions & 0 deletions drivers/acpi/acpi_lpss.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down
39 changes: 36 additions & 3 deletions drivers/acpi/battery.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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"),
},
},
{},
};

Expand Down Expand Up @@ -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();
Expand Down
3 changes: 2 additions & 1 deletion drivers/acpi/osl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion drivers/acpi/tables.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
10 changes: 5 additions & 5 deletions include/acpi/processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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 */
Expand Down Expand Up @@ -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;
Expand All @@ -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; /* */
Expand Down

0 comments on commit cf8116c

Please sign in to comment.