aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/acpi/Makefile1
-rw-r--r--drivers/acpi/acpi_cmos_rtc.c92
-rw-r--r--drivers/acpi/battery.c18
-rw-r--r--drivers/acpi/bus.c17
-rw-r--r--drivers/acpi/ec.c4
-rw-r--r--drivers/acpi/ec_sys.c18
-rw-r--r--drivers/acpi/glue.c6
-rw-r--r--drivers/acpi/internal.h5
-rw-r--r--drivers/acpi/scan.c1
-rw-r--r--include/acpi/acpi_bus.h4
10 files changed, 139 insertions, 27 deletions
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index d07771bc3d8c..81dbeb83bb45 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -44,6 +44,7 @@ acpi-y += acpi_platform.o
44acpi-y += power.o 44acpi-y += power.o
45acpi-y += event.o 45acpi-y += event.o
46acpi-y += sysfs.o 46acpi-y += sysfs.o
47acpi-$(CONFIG_X86) += acpi_cmos_rtc.o
47acpi-$(CONFIG_DEBUG_FS) += debugfs.o 48acpi-$(CONFIG_DEBUG_FS) += debugfs.o
48acpi-$(CONFIG_ACPI_NUMA) += numa.o 49acpi-$(CONFIG_ACPI_NUMA) += numa.o
49acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o 50acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o
diff --git a/drivers/acpi/acpi_cmos_rtc.c b/drivers/acpi/acpi_cmos_rtc.c
new file mode 100644
index 000000000000..84190ed89c04
--- /dev/null
+++ b/drivers/acpi/acpi_cmos_rtc.c
@@ -0,0 +1,92 @@
1/*
2 * ACPI support for CMOS RTC Address Space access
3 *
4 * Copyright (C) 2013, Intel Corporation
5 * Authors: Lan Tianyu <tianyu.lan@intel.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/acpi.h>
13#include <linux/device.h>
14#include <linux/err.h>
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <asm-generic/rtc.h>
18
19#include "internal.h"
20
21#define PREFIX "ACPI: "
22
23ACPI_MODULE_NAME("cmos rtc");
24
25static const struct acpi_device_id acpi_cmos_rtc_ids[] = {
26 { "PNP0B00" },
27 { "PNP0B01" },
28 { "PNP0B02" },
29 {}
30};
31
32static acpi_status
33acpi_cmos_rtc_space_handler(u32 function, acpi_physical_address address,
34 u32 bits, u64 *value64,
35 void *handler_context, void *region_context)
36{
37 int i;
38 u8 *value = (u8 *)&value64;
39
40 if (address > 0xff || !value64)
41 return AE_BAD_PARAMETER;
42
43 if (function != ACPI_WRITE && function != ACPI_READ)
44 return AE_BAD_PARAMETER;
45
46 spin_lock_irq(&rtc_lock);
47
48 for (i = 0; i < DIV_ROUND_UP(bits, 8); ++i, ++address, ++value)
49 if (function == ACPI_READ)
50 *value = CMOS_READ(address);
51 else
52 CMOS_WRITE(*value, address);
53
54 spin_unlock_irq(&rtc_lock);
55
56 return AE_OK;
57}
58
59static int acpi_install_cmos_rtc_space_handler(struct acpi_device *adev,
60 const struct acpi_device_id *id)
61{
62 acpi_status status;
63
64 status = acpi_install_address_space_handler(adev->handle,
65 ACPI_ADR_SPACE_CMOS,
66 &acpi_cmos_rtc_space_handler,
67 NULL, NULL);
68 if (ACPI_FAILURE(status)) {
69 pr_err(PREFIX "Error installing CMOS-RTC region handler\n");
70 return -ENODEV;
71 }
72
73 return 0;
74}
75
76static void acpi_remove_cmos_rtc_space_handler(struct acpi_device *adev)
77{
78 if (ACPI_FAILURE(acpi_remove_address_space_handler(adev->handle,
79 ACPI_ADR_SPACE_CMOS, &acpi_cmos_rtc_space_handler)))
80 pr_err(PREFIX "Error removing CMOS-RTC region handler\n");
81}
82
83static struct acpi_scan_handler cmos_rtc_handler = {
84 .ids = acpi_cmos_rtc_ids,
85 .attach = acpi_install_cmos_rtc_space_handler,
86 .detach = acpi_remove_cmos_rtc_space_handler,
87};
88
89void __init acpi_cmos_rtc_init(void)
90{
91 acpi_scan_add_handler(&cmos_rtc_handler);
92}
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index e7100459ac4a..082b4dd252a8 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -425,7 +425,7 @@ static int acpi_battery_get_info(struct acpi_battery *battery)
425{ 425{
426 int result = -EFAULT; 426 int result = -EFAULT;
427 acpi_status status = 0; 427 acpi_status status = 0;
428 char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags)? 428 char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags) ?
429 "_BIX" : "_BIF"; 429 "_BIX" : "_BIF";
430 430
431 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 431 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
@@ -661,11 +661,11 @@ static void find_battery(const struct dmi_header *dm, void *private)
661static void acpi_battery_quirks(struct acpi_battery *battery) 661static void acpi_battery_quirks(struct acpi_battery *battery)
662{ 662{
663 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) 663 if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
664 return ; 664 return;
665 665
666 if (battery->full_charge_capacity == 100 && 666 if (battery->full_charge_capacity == 100 &&
667 battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN && 667 battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN &&
668 battery->capacity_now >=0 && battery->capacity_now <= 100) { 668 battery->capacity_now >= 0 && battery->capacity_now <= 100) {
669 set_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags); 669 set_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags);
670 battery->full_charge_capacity = battery->design_capacity; 670 battery->full_charge_capacity = battery->design_capacity;
671 battery->capacity_now = (battery->capacity_now * 671 battery->capacity_now = (battery->capacity_now *
@@ -673,7 +673,7 @@ static void acpi_battery_quirks(struct acpi_battery *battery)
673 } 673 }
674 674
675 if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags)) 675 if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags))
676 return ; 676 return;
677 677
678 if (battery->power_unit && dmi_name_in_vendors("LENOVO")) { 678 if (battery->power_unit && dmi_name_in_vendors("LENOVO")) {
679 const char *s; 679 const char *s;
@@ -761,7 +761,7 @@ static int acpi_battery_print_info(struct seq_file *seq, int result)
761 goto end; 761 goto end;
762 762
763 seq_printf(seq, "present: %s\n", 763 seq_printf(seq, "present: %s\n",
764 acpi_battery_present(battery)?"yes":"no"); 764 acpi_battery_present(battery) ? "yes" : "no");
765 if (!acpi_battery_present(battery)) 765 if (!acpi_battery_present(battery))
766 goto end; 766 goto end;
767 if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) 767 if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN)
@@ -817,12 +817,12 @@ static int acpi_battery_print_state(struct seq_file *seq, int result)
817 goto end; 817 goto end;
818 818
819 seq_printf(seq, "present: %s\n", 819 seq_printf(seq, "present: %s\n",
820 acpi_battery_present(battery)?"yes":"no"); 820 acpi_battery_present(battery) ? "yes" : "no");
821 if (!acpi_battery_present(battery)) 821 if (!acpi_battery_present(battery))
822 goto end; 822 goto end;
823 823
824 seq_printf(seq, "capacity state: %s\n", 824 seq_printf(seq, "capacity state: %s\n",
825 (battery->state & 0x04)?"critical":"ok"); 825 (battery->state & 0x04) ? "critical" : "ok");
826 if ((battery->state & 0x01) && (battery->state & 0x02)) 826 if ((battery->state & 0x01) && (battery->state & 0x02))
827 seq_printf(seq, 827 seq_printf(seq,
828 "charging state: charging/discharging\n"); 828 "charging state: charging/discharging\n");
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 292de3cab9cc..a5bb33bab448 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -91,8 +91,7 @@ static struct dmi_system_id dsdt_dmi_table[] __initdata = {
91 91
92int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device) 92int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device)
93{ 93{
94 acpi_status status = AE_OK; 94 acpi_status status;
95
96 95
97 if (!device) 96 if (!device)
98 return -EINVAL; 97 return -EINVAL;
@@ -162,7 +161,7 @@ EXPORT_SYMBOL(acpi_bus_private_data_handler);
162 161
163int acpi_bus_get_private_data(acpi_handle handle, void **data) 162int acpi_bus_get_private_data(acpi_handle handle, void **data)
164{ 163{
165 acpi_status status = AE_OK; 164 acpi_status status;
166 165
167 if (!*data) 166 if (!*data)
168 return -EINVAL; 167 return -EINVAL;
@@ -361,7 +360,7 @@ extern int event_is_open;
361int acpi_bus_generate_proc_event4(const char *device_class, const char *bus_id, u8 type, int data) 360int acpi_bus_generate_proc_event4(const char *device_class, const char *bus_id, u8 type, int data)
362{ 361{
363 struct acpi_bus_event *event; 362 struct acpi_bus_event *event;
364 unsigned long flags = 0; 363 unsigned long flags;
365 364
366 /* drop event on the floor if no one's listening */ 365 /* drop event on the floor if no one's listening */
367 if (!event_is_open) 366 if (!event_is_open)
@@ -400,7 +399,7 @@ EXPORT_SYMBOL(acpi_bus_generate_proc_event);
400 399
401int acpi_bus_receive_event(struct acpi_bus_event *event) 400int acpi_bus_receive_event(struct acpi_bus_event *event)
402{ 401{
403 unsigned long flags = 0; 402 unsigned long flags;
404 struct acpi_bus_event *entry = NULL; 403 struct acpi_bus_event *entry = NULL;
405 404
406 DECLARE_WAITQUEUE(wait, current); 405 DECLARE_WAITQUEUE(wait, current);
@@ -593,7 +592,7 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
593 592
594static int __init acpi_bus_init_irq(void) 593static int __init acpi_bus_init_irq(void)
595{ 594{
596 acpi_status status = AE_OK; 595 acpi_status status;
597 union acpi_object arg = { ACPI_TYPE_INTEGER }; 596 union acpi_object arg = { ACPI_TYPE_INTEGER };
598 struct acpi_object_list arg_list = { 1, &arg }; 597 struct acpi_object_list arg_list = { 1, &arg };
599 char *message = NULL; 598 char *message = NULL;
@@ -640,7 +639,7 @@ u8 acpi_gbl_permanent_mmap;
640 639
641void __init acpi_early_init(void) 640void __init acpi_early_init(void)
642{ 641{
643 acpi_status status = AE_OK; 642 acpi_status status;
644 643
645 if (acpi_disabled) 644 if (acpi_disabled)
646 return; 645 return;
@@ -714,8 +713,8 @@ void __init acpi_early_init(void)
714 713
715static int __init acpi_bus_init(void) 714static int __init acpi_bus_init(void)
716{ 715{
717 int result = 0; 716 int result;
718 acpi_status status = AE_OK; 717 acpi_status status;
719 extern acpi_status acpi_os_initialize1(void); 718 extern acpi_status acpi_os_initialize1(void);
720 719
721 acpi_os_initialize1(); 720 acpi_os_initialize1();
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
index edc00818c803..80403c1a89f8 100644
--- a/drivers/acpi/ec.c
+++ b/drivers/acpi/ec.c
@@ -983,6 +983,10 @@ static struct dmi_system_id __initdata ec_dmi_table[] = {
983 ec_enlarge_storm_threshold, "CLEVO hardware", { 983 ec_enlarge_storm_threshold, "CLEVO hardware", {
984 DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."), 984 DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."),
985 DMI_MATCH(DMI_PRODUCT_NAME, "M720T/M730T"),}, NULL}, 985 DMI_MATCH(DMI_PRODUCT_NAME, "M720T/M730T"),}, NULL},
986 {
987 ec_skip_dsdt_scan, "HP Folio 13", {
988 DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
989 DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13"),}, NULL},
986 {}, 990 {},
987}; 991};
988 992
diff --git a/drivers/acpi/ec_sys.c b/drivers/acpi/ec_sys.c
index 7586544fddb4..4e7b798900f2 100644
--- a/drivers/acpi/ec_sys.c
+++ b/drivers/acpi/ec_sys.c
@@ -12,6 +12,7 @@
12#include <linux/acpi.h> 12#include <linux/acpi.h>
13#include <linux/debugfs.h> 13#include <linux/debugfs.h>
14#include <linux/module.h> 14#include <linux/module.h>
15#include <linux/uaccess.h>
15#include "internal.h" 16#include "internal.h"
16 17
17MODULE_AUTHOR("Thomas Renninger <trenn@suse.de>"); 18MODULE_AUTHOR("Thomas Renninger <trenn@suse.de>");
@@ -34,7 +35,6 @@ static ssize_t acpi_ec_read_io(struct file *f, char __user *buf,
34 * struct acpi_ec *ec = ((struct seq_file *)f->private_data)->private; 35 * struct acpi_ec *ec = ((struct seq_file *)f->private_data)->private;
35 */ 36 */
36 unsigned int size = EC_SPACE_SIZE; 37 unsigned int size = EC_SPACE_SIZE;
37 u8 *data = (u8 *) buf;
38 loff_t init_off = *off; 38 loff_t init_off = *off;
39 int err = 0; 39 int err = 0;
40 40
@@ -47,9 +47,15 @@ static ssize_t acpi_ec_read_io(struct file *f, char __user *buf,
47 size = count; 47 size = count;
48 48
49 while (size) { 49 while (size) {
50 err = ec_read(*off, &data[*off - init_off]); 50 u8 byte_read;
51 err = ec_read(*off, &byte_read);
51 if (err) 52 if (err)
52 return err; 53 return err;
54 if (put_user(byte_read, buf + *off - init_off)) {
55 if (*off - init_off)
56 return *off - init_off; /* partial read */
57 return -EFAULT;
58 }
53 *off += 1; 59 *off += 1;
54 size--; 60 size--;
55 } 61 }
@@ -65,7 +71,6 @@ static ssize_t acpi_ec_write_io(struct file *f, const char __user *buf,
65 71
66 unsigned int size = count; 72 unsigned int size = count;
67 loff_t init_off = *off; 73 loff_t init_off = *off;
68 u8 *data = (u8 *) buf;
69 int err = 0; 74 int err = 0;
70 75
71 if (*off >= EC_SPACE_SIZE) 76 if (*off >= EC_SPACE_SIZE)
@@ -76,7 +81,12 @@ static ssize_t acpi_ec_write_io(struct file *f, const char __user *buf,
76 } 81 }
77 82
78 while (size) { 83 while (size) {
79 u8 byte_write = data[*off - init_off]; 84 u8 byte_write;
85 if (get_user(byte_write, buf + *off - init_off)) {
86 if (*off - init_off)
87 return *off - init_off; /* partial write */
88 return -EFAULT;
89 }
80 err = ec_write(*off, byte_write); 90 err = ec_write(*off, byte_write);
81 if (err) 91 if (err)
82 return err; 92 return err;
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c
index 9783f400d857..f68095756fb7 100644
--- a/drivers/acpi/glue.c
+++ b/drivers/acpi/glue.c
@@ -81,13 +81,15 @@ static struct acpi_bus_type *acpi_get_bus_type(struct device *dev)
81static acpi_status do_acpi_find_child(acpi_handle handle, u32 lvl_not_used, 81static acpi_status do_acpi_find_child(acpi_handle handle, u32 lvl_not_used,
82 void *addr_p, void **ret_p) 82 void *addr_p, void **ret_p)
83{ 83{
84 unsigned long long addr; 84 unsigned long long addr, sta;
85 acpi_status status; 85 acpi_status status;
86 86
87 status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &addr); 87 status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL, &addr);
88 if (ACPI_SUCCESS(status) && addr == *((u64 *)addr_p)) { 88 if (ACPI_SUCCESS(status) && addr == *((u64 *)addr_p)) {
89 *ret_p = handle; 89 *ret_p = handle;
90 return AE_CTRL_TERMINATE; 90 status = acpi_bus_get_status_handle(handle, &sta);
91 if (ACPI_SUCCESS(status) && (sta & ACPI_STA_DEVICE_ENABLED))
92 return AE_CTRL_TERMINATE;
91 } 93 }
92 return AE_OK; 94 return AE_OK;
93} 95}
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 520073ba36b4..3a50a34fe176 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -51,6 +51,11 @@ void acpi_memory_hotplug_init(void);
51#else 51#else
52static inline void acpi_memory_hotplug_init(void) {} 52static inline void acpi_memory_hotplug_init(void) {}
53#endif 53#endif
54#ifdef CONFIG_X86
55void acpi_cmos_rtc_init(void);
56#else
57static inline void acpi_cmos_rtc_init(void) {}
58#endif
54 59
55extern bool acpi_force_hot_remove; 60extern bool acpi_force_hot_remove;
56 61
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index e0db2dc42370..dfe76f17cfc4 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -2132,6 +2132,7 @@ int __init acpi_scan_init(void)
2132 acpi_processor_init(); 2132 acpi_processor_init();
2133 acpi_platform_init(); 2133 acpi_platform_init();
2134 acpi_lpss_init(); 2134 acpi_lpss_init();
2135 acpi_cmos_rtc_init();
2135 acpi_container_init(); 2136 acpi_container_init();
2136 acpi_memory_hotplug_init(); 2137 acpi_memory_hotplug_init();
2137 acpi_dock_init(); 2138 acpi_dock_init();
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index cac0dfb2a082..ca081ace2a1d 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -156,12 +156,10 @@ struct acpi_device_flags {
156 u32 dynamic_status:1; 156 u32 dynamic_status:1;
157 u32 removable:1; 157 u32 removable:1;
158 u32 ejectable:1; 158 u32 ejectable:1;
159 u32 suprise_removal_ok:1;
160 u32 power_manageable:1; 159 u32 power_manageable:1;
161 u32 performance_manageable:1;
162 u32 eject_pending:1; 160 u32 eject_pending:1;
163 u32 match_driver:1; 161 u32 match_driver:1;
164 u32 reserved:24; 162 u32 reserved:26;
165}; 163};
166 164
167/* File System */ 165/* File System */