summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--RFC-V2-ACPI-Add-_DEP-Operation-Region-Dependencies-support-to-fix-battery-issue-on-the-Asus-T100TA.patch225
-rw-r--r--UEFI-big-arse-revert.patch166
-rw-r--r--config-x86-generic5
-rw-r--r--kernel.spec20
-rw-r--r--support-Dell-OEM-chipset-found-in-Venue-8-Pro-SDIO-I.patch4
5 files changed, 239 insertions, 181 deletions
diff --git a/RFC-V2-ACPI-Add-_DEP-Operation-Region-Dependencies-support-to-fix-battery-issue-on-the-Asus-T100TA.patch b/RFC-V2-ACPI-Add-_DEP-Operation-Region-Dependencies-support-to-fix-battery-issue-on-the-Asus-T100TA.patch
new file mode 100644
index 000000000..55524f9a6
--- /dev/null
+++ b/RFC-V2-ACPI-Add-_DEP-Operation-Region-Dependencies-support-to-fix-battery-issue-on-the-Asus-T100TA.patch
@@ -0,0 +1,225 @@
+From patchwork Mon Oct 27 15:09:44 2014
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [RFC, V2] ACPI: Add _DEP(Operation Region Dependencies) support to fix
+ battery issue on the Asus T100TA
+From: "lan,Tianyu" <tianyu.lan@intel.com>
+X-Patchwork-Id: 5161621
+Message-Id: <1414422584-2638-1-git-send-email-tianyu.lan@intel.com>
+To: rjw@rjwysocki.net, lenb@kernel.org, wsa@the-dreams.de,
+ robert.moore@intel.com, lv.zheng@intel.com
+Cc: Lan Tianyu <tianyu.lan@intel.com>, linux-acpi@vger.kernel.org,
+ linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org, devel@acpica.org
+Date: Mon, 27 Oct 2014 23:09:44 +0800
+
+ACPI 5.0 introduces _DEP to designate device objects that OSPM should
+assign a higher priority in start ordering due to future operation region
+accesses.
+
+On Asus T100TA, ACPI battery info are read from a I2C slave device via
+I2C operation region. Before I2C operation region handler is installed,
+battery _STA always returns 0. There is a _DEP method of designating
+start order under battery device node.
+
+This patch is to implement _DEP feature to fix battery issue on the Asus T100TA.
+Introducing acpi_dep_list and adding dep_unmet count in the struct
+acpi_device. During ACPI namespace scan, create struct acpi_dep_data for a
+valid pair of master (device pointed to by _DEP)/slave(device with _DEP), record
+master's and slave's ACPI handle in it and put it into acpi_dep_list. The dep_unmet
+count will increase by one if there is a device under its _DEP. Driver's probe() should
+return EPROBE_DEFER when find dep_unmet larger than 0. When I2C operation
+region handler is installed, remove all struct acpi_dep_data on the acpi_dep_list
+whose master is pointed to I2C host controller and decrease slave's dep_unmet.
+When dep_unmet decreases to 0, all _DEP conditions are met and then do acpi_bus_attach()
+for the device in order to resolve battery _STA issue on the Asus T100TA.
+
+Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>
+
+---
+Change since V1:
+ Rework struct acpi_dep_data, record master and slave's ACPI handle.
+Rename dep_present with dep_unmet and make it as a count. Increase dep_unmet
+during bootup and decrease it when associated operation region is installed.
+
+ drivers/acpi/scan.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++
+ drivers/i2c/i2c-core.c | 1 +
+ include/acpi/acpi_bus.h | 1 +
+ include/linux/acpi.h | 3 ++
+ 4 files changed, 96 insertions(+)
+
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index 4da55d8..bfa9c77 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -36,6 +36,8 @@ bool acpi_force_hot_remove;
+
+ static const char *dummy_hid = "device";
+
++static LIST_HEAD(acpi_dep_list);
++static DEFINE_MUTEX(acpi_dep_list_lock);
+ static LIST_HEAD(acpi_bus_id_list);
+ static DEFINE_MUTEX(acpi_scan_lock);
+ static LIST_HEAD(acpi_scan_handlers_list);
+@@ -43,6 +45,12 @@ DEFINE_MUTEX(acpi_device_lock);
+ LIST_HEAD(acpi_wakeup_device_list);
+ static DEFINE_MUTEX(acpi_hp_context_lock);
+
++struct acpi_dep_data {
++ struct list_head node;
++ acpi_handle master;
++ acpi_handle slave;
++};
++
+ struct acpi_device_bus_id{
+ char bus_id[15];
+ unsigned int instance_no;
+@@ -2121,6 +2129,63 @@ static void acpi_scan_init_hotplug(struct acpi_device *adev)
+ }
+ }
+
++static void acpi_device_dep_initialize(struct acpi_device *adev)
++{
++ struct acpi_dep_data *dep;
++ struct acpi_handle_list dep_devices;
++ struct acpi_device_info *info;
++ acpi_status status;
++ int i, skip;
++
++ if (!acpi_has_method(adev->handle, "_DEP"))
++ return;
++
++ status = acpi_evaluate_reference(adev->handle, "_DEP", NULL,
++ &dep_devices);
++ if (ACPI_FAILURE(status)) {
++ dev_err(&adev->dev, "Failed to evaluate _DEP.\n");
++ return;
++ }
++
++ for (i = 0; i < dep_devices.count; i++) {
++
++ status = acpi_get_object_info(dep_devices.handles[i], &info);
++ if (ACPI_FAILURE(status)) {
++ dev_err(&adev->dev, "Error reading device info\n");
++ continue;
++ }
++
++ /*
++ * Skip the dependency of Windows System Power
++ * Management Controller
++ */
++ if (info->valid & ACPI_VALID_HID
++ && !strcmp(info->hardware_id.string, "INT3396"))
++ skip = 1;
++ else
++ skip = 0;
++
++ kfree(info);
++
++ if (skip)
++ continue;
++
++ dep = kzalloc(sizeof(struct acpi_dep_data), GFP_KERNEL);
++ if (!dep) {
++ dev_err(&adev->dev, "Not enough memory for _DEP list entry.\n");
++ return;
++ }
++
++ dep->master = dep_devices.handles[i];
++ dep->slave = adev->handle;
++ adev->dep_unmet++;
++
++ mutex_lock(&acpi_dep_list_lock);
++ list_add_tail(&dep->node , &acpi_dep_list);
++ mutex_unlock(&acpi_dep_list_lock);
++ }
++}
++
+ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
+ void *not_used, void **return_value)
+ {
+@@ -2147,6 +2212,7 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
+ return AE_CTRL_DEPTH;
+
+ acpi_scan_init_hotplug(device);
++ acpi_device_dep_initialize(device);
+
+ out:
+ if (!*return_value)
+@@ -2267,6 +2333,31 @@ static void acpi_bus_attach(struct acpi_device *device)
+ device->handler->hotplug.notify_online(device);
+ }
+
++int acpi_walk_dep_device_list(acpi_handle handle)
++{
++ struct acpi_dep_data *dep, *tmp;
++ struct acpi_device *adev;
++
++ mutex_lock(&acpi_dep_list_lock);
++ list_for_each_entry_safe(dep, tmp, &acpi_dep_list, node) {
++ if (dep->master == handle) {
++ acpi_bus_get_device(dep->slave, &adev);
++ if (!adev)
++ continue;
++
++ adev->dep_unmet--;
++ if (!adev->dep_unmet)
++ acpi_bus_attach(adev);
++ list_del(&dep->node);
++ kfree(dep);
++ }
++ }
++ mutex_unlock(&acpi_dep_list_lock);
++
++ return 0;
++}
++EXPORT_SYMBOL_GPL(acpi_walk_dep_device_list);
++
+ /**
+ * acpi_bus_scan - Add ACPI device node objects in a given namespace scope.
+ * @handle: Root of the namespace scope to scan.
+diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
+index 126e182..d5495ca 100644
+--- a/drivers/i2c/i2c-core.c
++++ b/drivers/i2c/i2c-core.c
+@@ -402,6 +402,7 @@ static int acpi_i2c_install_space_handler(struct i2c_adapter *adapter)
+ return -ENOMEM;
+ }
+
++ acpi_walk_dep_device_list(handle);
+ return 0;
+ }
+
+diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
+index 98cd723..269f068 100644
+--- a/include/acpi/acpi_bus.h
++++ b/include/acpi/acpi_bus.h
+@@ -367,6 +367,7 @@ struct acpi_device {
+ void *driver_data;
+ struct device dev;
+ unsigned int physical_node_count;
++ unsigned int dep_unmet;
+ struct list_head physical_node_list;
+ struct mutex physical_node_lock;
+ void (*remove)(struct acpi_device *);
+diff --git a/include/linux/acpi.h b/include/linux/acpi.h
+index 2b9c235..cec5f55 100644
+--- a/include/linux/acpi.h
++++ b/include/linux/acpi.h
+@@ -428,6 +428,7 @@ extern bool acpi_driver_match_device(struct device *dev,
+
+ int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *);
+ int acpi_device_modalias(struct device *, char *, int);
++int acpi_walk_dep_device_list(acpi_handle handle);
+
+ struct platform_device *acpi_create_platform_device(struct acpi_device *);
+ #define ACPI_PTR(_ptr) (_ptr)
+@@ -446,6 +447,8 @@ static inline const char *acpi_dev_name(struct acpi_device *adev)
+
+ static inline void acpi_early_init(void) { }
+
++static inline int acpi_walk_dep_device_list(acpi_handle handle) { }
++
+ static inline int early_acpi_boot_init(void)
+ {
+ return 0;
diff --git a/UEFI-big-arse-revert.patch b/UEFI-big-arse-revert.patch
deleted file mode 100644
index 495ab890a..000000000
--- a/UEFI-big-arse-revert.patch
+++ /dev/null
@@ -1,166 +0,0 @@
-From 8054c405f0acc8ecb74b7e29675a1e6894afedb0 Mon Sep 17 00:00:00 2001
-From: Matt Fleming <matt.fleming@intel.com>
-Date: Tue, 23 Sep 2014 10:37:43 +0100
-Subject: [PATCH] Revert "efi/x86: efistub: Move shared dependencies to
- <asm/efi.h>"
-
-This reverts commit f23cf8bd5c1f ("efi/x86: efistub: Move shared
-dependencies to <asm/efi.h>") as well as the x86 parts of commit
-f4f75ad5741f ("efi: efistub: Convert into static library").
-
-The road leading to these two reverts is long and winding.
-
-The above two commits were merged during the v3.17 merge window and
-turned the common EFI boot stub code into a static library. This
-necessitated making some symbols global in the x86 boot stub which
-introduced new entries into the early boot GOT.
-
-The problem was that we weren't fixing up the newly created GOT entries
-before invoking the EFI boot stub, which sometimes resulted in hangs or
-resets. This failure was reported by Maarten on his Macbook pro.
-
-The proposed fix was commit 9cb0e394234d ("x86/efi: Fixup GOT in all
-boot code paths"). However, that caused issues for Linus when booting
-his Sony Vaio Pro 11. It was subsequently reverted in commit
-f3670394c29f.
-
-So that leaves us back with Maarten's Macbook pro not booting.
-
-At this stage in the release cycle the least risky option is to revert
-the x86 EFI boot stub to the pre-merge window code structure where we
-explicitly #include efi-stub-helper.c instead of linking with the static
-library. The arm64 code remains unaffected.
-
-We can take another swing at the x86 parts for v3.18.
-
-Conflicts:
- arch/x86/include/asm/efi.h
-
-Cc: H. Peter Anvin <hpa@zytor.com>
-Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>,
-Cc: Josh Boyer <jwboyer@fedoraproject.org>
-Cc: Maarten Lankhorst <maarten.lankhorst@canonical.com>
-Cc: Ingo Molnar <mingo@kernel.org>
-Cc: Linus Torvalds <torvalds@linux-foundation.org>
-Signed-off-by: Matt Fleming <matt.fleming@intel.com>
----
- arch/x86/boot/compressed/Makefile | 3 +--
- arch/x86/boot/compressed/eboot.c | 7 ++++++-
- arch/x86/boot/compressed/eboot.h | 16 ++++++++++++++++
- arch/x86/include/asm/efi.h | 24 ------------------------
- drivers/firmware/efi/Makefile | 2 +-
- 5 files changed, 24 insertions(+), 28 deletions(-)
-
-diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
-index 7a801a310e37..0fcd9133790c 100644
---- a/arch/x86/boot/compressed/Makefile
-+++ b/arch/x86/boot/compressed/Makefile
-@@ -33,8 +33,7 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
- $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
-
- ifeq ($(CONFIG_EFI_STUB), y)
-- VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o \
-- $(objtree)/drivers/firmware/efi/libstub/lib.a
-+ VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o
- endif
-
- $(obj)/vmlinux: $(VMLINUX_OBJS) FORCE
-diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
-index dca9842d8f91..b04f1e0e3fab 100644
---- a/arch/x86/boot/compressed/eboot.c
-+++ b/arch/x86/boot/compressed/eboot.c
-@@ -19,7 +19,10 @@
-
- static efi_system_table_t *sys_table;
-
--struct efi_config *efi_early;
-+static struct efi_config *efi_early;
-+
-+#define efi_call_early(f, ...) \
-+ efi_early->call(efi_early->f, __VA_ARGS__);
-
- #define BOOT_SERVICES(bits) \
- static void setup_boot_services##bits(struct efi_config *c) \
-@@ -280,6 +283,8 @@ void efi_char16_printk(efi_system_table_t *table, efi_char16_t *str)
- }
- }
-
-+#include "../../../../drivers/firmware/efi/libstub/efi-stub-helper.c"
-+
- static void find_bits(unsigned long mask, u8 *pos, u8 *size)
- {
- u8 first, len;
-diff --git a/arch/x86/boot/compressed/eboot.h b/arch/x86/boot/compressed/eboot.h
-index d487e727f1ec..c88c31ecad12 100644
---- a/arch/x86/boot/compressed/eboot.h
-+++ b/arch/x86/boot/compressed/eboot.h
-@@ -103,4 +103,20 @@ struct efi_uga_draw_protocol {
- void *blt;
- };
-
-+struct efi_config {
-+ u64 image_handle;
-+ u64 table;
-+ u64 allocate_pool;
-+ u64 allocate_pages;
-+ u64 get_memory_map;
-+ u64 free_pool;
-+ u64 free_pages;
-+ u64 locate_handle;
-+ u64 handle_protocol;
-+ u64 exit_boot_services;
-+ u64 text_output;
-+ efi_status_t (*call)(unsigned long, ...);
-+ bool is64;
-+} __packed;
-+
- #endif /* BOOT_COMPRESSED_EBOOT_H */
-diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h
-index 044a2fd3c5fe..0ec241ede5a2 100644
---- a/arch/x86/include/asm/efi.h
-+++ b/arch/x86/include/asm/efi.h
-@@ -159,30 +159,6 @@ static inline efi_status_t efi_thunk_set_virtual_address_map(
- }
- #endif /* CONFIG_EFI_MIXED */
-
--
--/* arch specific definitions used by the stub code */
--
--struct efi_config {
-- u64 image_handle;
-- u64 table;
-- u64 allocate_pool;
-- u64 allocate_pages;
-- u64 get_memory_map;
-- u64 free_pool;
-- u64 free_pages;
-- u64 locate_handle;
-- u64 handle_protocol;
-- u64 exit_boot_services;
-- u64 text_output;
-- efi_status_t (*call)(unsigned long, ...);
-- bool is64;
--} __packed;
--
--extern struct efi_config *efi_early;
--
--#define efi_call_early(f, ...) \
-- efi_early->call(efi_early->f, __VA_ARGS__);
--
- extern bool efi_reboot_required(void);
-
- #else
-diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile
-index d8be608a9f3b..aef6a95adef5 100644
---- a/drivers/firmware/efi/Makefile
-+++ b/drivers/firmware/efi/Makefile
-@@ -7,4 +7,4 @@ obj-$(CONFIG_EFI_VARS_PSTORE) += efi-pstore.o
- obj-$(CONFIG_UEFI_CPER) += cper.o
- obj-$(CONFIG_EFI_RUNTIME_MAP) += runtime-map.o
- obj-$(CONFIG_EFI_RUNTIME_WRAPPERS) += runtime-wrappers.o
--obj-$(CONFIG_EFI_STUB) += libstub/
-+obj-$(CONFIG_EFI_ARM_STUB) += libstub/
---
-1.9.3
-
-
diff --git a/config-x86-generic b/config-x86-generic
index 917b20d34..e1da139a3 100644
--- a/config-x86-generic
+++ b/config-x86-generic
@@ -258,6 +258,11 @@ CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH=m
# CONFIG_SND_SOC_TAS2552 is not set
# CONFIG_SND_SOC_TLV320AIC31XX is not set
# CONFIG_SND_SOC_WM8770 is not set
+# CONFIG_SND_SOC_CS35L32 is not set
+# CONFIG_SND_SOC_ES8328 is not set
+# CONFIG_SND_SOC_SSM2602_I2C is not set
+# CONFIG_SND_SOC_SSM4567 is not set
+# CONFIG_SND_SOC_WM8978 is not set
# Baytrail other (from pbrobinson)
diff --git a/kernel.spec b/kernel.spec
index 7ad3bcbc4..ce6c3952d 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -628,26 +628,21 @@ Patch30000: kernel-arm64.patch
# AWB PATCH DEFINITIONS (BAYTRAIL)
-# https://lkml.org/lkml/2014/4/16/418
+# https://patchwork.kernel.org/patch/5161621/(minor rediff required)
# https://bugzilla.kernel.org/show_bug.cgi?id=69011
-# The 'permanent' fix for this is under development but current patch doesn't
-# work, see #69011
-Patch31010: 0001-ACPI-temporary-dep-solution-for-battery-support.patch
+# Fixes battery status
+Patch31010: RFC-V2-ACPI-Add-_DEP-Operation-Region-Dependencies-support-to-fix-battery-issue-on-the-Asus-T100TA.patch
# Add SDIO ID for the V8P wireless adapter to ath6kl driver
Patch31011: support-Dell-OEM-chipset-found-in-Venue-8-Pro-SDIO-I.patch
-# UEFI boot fixes from Matt Fleming, try to fix
-# https://bugzilla.kernel.org/show_bug.cgi?id=84241
-Patch31012: UEFI-big-arse-revert.patch
-
# Map 'Home' button on Venue 8 Pro to left meta key (i.e. "Start")
# from Jan-Michael Brummer
-Patch31013: soc_button_use_leftmeta.patch
+Patch31012: soc_button_use_leftmeta.patch
# Enable mic on RT5640 (i.e. lots of Baytrail hardware, we hope)
# from Jan-Michael Brummer
-Patch31014: rt5640_enable_mic.patch
+Patch31013: rt5640_enable_mic.patch
# END OF AWB PATCH DEFINITIONS
@@ -1387,10 +1382,9 @@ ApplyPatch kernel-arm64.patch -R
# END OF FEDORA PATCH APPLICATIONS
# AWB (BAYTRAIL) PATCH APPLICATIONS
-ApplyPatch 0001-ACPI-temporary-dep-solution-for-battery-support.patch
+ApplyPatch RFC-V2-ACPI-Add-_DEP-Operation-Region-Dependencies-support-to-fix-battery-issue-on-the-Asus-T100TA.patch
ApplyPatch support-Dell-OEM-chipset-found-in-Venue-8-Pro-SDIO-I.patch
-ApplyPatch UEFI-big-arse-revert.patch
-ApplyPatch rt5640_enable_mic.patch
+#ApplyPatch rt5640_enable_mic.patch
ApplyPatch soc_button_use_leftmeta.patch
# END OF AWB (BAYTRAIL) PATCH APPLICATIONS
diff --git a/support-Dell-OEM-chipset-found-in-Venue-8-Pro-SDIO-I.patch b/support-Dell-OEM-chipset-found-in-Venue-8-Pro-SDIO-I.patch
index dbcd736b9..a422a2c51 100644
--- a/support-Dell-OEM-chipset-found-in-Venue-8-Pro-SDIO-I.patch
+++ b/support-Dell-OEM-chipset-found-in-Venue-8-Pro-SDIO-I.patch
@@ -12,10 +12,10 @@ diff --git a/drivers/net/wireless/ath/ath6kl/sdio.c b/drivers/net/wireless/ath/a
index 339d89f..5384f14 100644
--- a/drivers/net/wireless/ath/ath6kl/sdio.c
+++ b/drivers/net/wireless/ath/ath6kl/sdio.c
-@@ -1400,6 +1400,7 @@ static const struct sdio_device_id ath6kl_sdio_devices[] = {
- {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6003_BASE | 0x1))},
+@@ -1401,6 +1401,7 @@ static const struct sdio_device_id ath6kl_sdio_devices[] = {
{SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x0))},
{SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x1))},
+ {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x2))},
+ {SDIO_DEVICE(MANUFACTURER_CODE, (MANUFACTURER_ID_AR6004_BASE | 0x18))},
{},
};