From 218349eb5c659cf2794e4fbd39e6bbdbc6335f81 Mon Sep 17 00:00:00 2001 From: Kevin Mihelich Date: Sat, 13 Jun 2015 01:18:26 +0000 Subject: [PATCH] removed core/linux-sun4i --- .../0001-Backport-BFP-XOR-operation.patch | 228 -- .../0001-Backport-firmware-loader.patch | 2620 ------------ .../0001-Backport-msdos-partition-UUIDs.patch | 632 --- core/linux-sun4i/PKGBUILD | 261 -- core/linux-sun4i/config | 3626 ----------------- core/linux-sun4i/linux-sun4i.install | 24 - core/linux-sun4i/memset.patch | 204 - 7 files changed, 7595 deletions(-) delete mode 100644 core/linux-sun4i/0001-Backport-BFP-XOR-operation.patch delete mode 100644 core/linux-sun4i/0001-Backport-firmware-loader.patch delete mode 100644 core/linux-sun4i/0001-Backport-msdos-partition-UUIDs.patch delete mode 100644 core/linux-sun4i/PKGBUILD delete mode 100644 core/linux-sun4i/config delete mode 100644 core/linux-sun4i/linux-sun4i.install delete mode 100644 core/linux-sun4i/memset.patch diff --git a/core/linux-sun4i/0001-Backport-BFP-XOR-operation.patch b/core/linux-sun4i/0001-Backport-BFP-XOR-operation.patch deleted file mode 100644 index da8501b07..000000000 --- a/core/linux-sun4i/0001-Backport-BFP-XOR-operation.patch +++ /dev/null @@ -1,228 +0,0 @@ -From 83e230739cb578049f62c626946e04a79b46c85b Mon Sep 17 00:00:00 2001 -From: Kevin Mihelich -Date: Mon, 29 Sep 2014 12:14:00 -0600 -Subject: [PATCH] Backport BFP XOR operation - -Squashed commit of the following: - -commit 210b6dd797945571a92ae1f502be6b885cdeae23 -Author: Daniel Borkmann -Date: Mon Sep 24 02:23:59 2012 +0000 - - filter: add XOR instruction for use with X/K - - SKF_AD_ALU_XOR_X has been added a while ago, but as an 'ancillary' - operation that is invoked through a negative offset in K within BPF - load operations. Since BPF_MOD has recently been added, BPF_XOR should - also be part of the common ALU operations. Removing SKF_AD_ALU_XOR_X - might not be an option since this is exposed to user space. - - Signed-off-by: Daniel Borkmann - Acked-by: Eric Dumazet - Signed-off-by: David S. Miller - -commit 11acc6e3fc94f8b18483af729760b9025d708409 -Author: Eric Dumazet -Date: Fri Sep 7 22:03:35 2012 +0000 - - filter: add MOD operation - - Add a new ALU opcode, to compute a modulus. - - Commit ffe06c17afbbb used an ancillary to implement XOR_X, - but here we reserve one of the available ALU opcode to implement both - MOD_X and MOD_K - - Signed-off-by: Eric Dumazet - Suggested-by: George Bakos - Cc: Jay Schulist - Cc: Jiri Pirko - Cc: Andi Kleen - Signed-off-by: David S. Miller - -commit 3026fca84f0230d96693ba6d3e6089343874ca09 -Author: Daniel Borkmann -Date: Mon Sep 24 07:34:51 2012 +0000 - - x86: bpf_jit_comp: add XOR instruction for BPF JIT - - This patch is a follow-up for patch "filter: add XOR instruction for use - with X/K" that implements BPF x86 JIT parts for the BPF XOR operation. - - Signed-off-by: Daniel Borkmann - Acked-by: Eric Dumazet - Signed-off-by: David S. Miller - -commit cf2f055d4abff198aaa0128aa06e458a6ff767d7 -Author: Eric Dumazet -Date: Mon Jun 4 21:26:30 2012 +0000 - - x86 bpf_jit: support BPF_S_ANC_ALU_XOR_X instruction - - commit ffe06c17afbb (filter: add XOR operation) added generic support - for XOR operation. - - This patch implements the XOR instruction in x86 jit. - - Signed-off-by: Eric Dumazet - Cc: Jiri Pirko - Signed-off-by: David S. Miller - -commit e0d7a646c8684dac88c6ebbeb155313ad7fc624d -Author: Jiri Pirko -Date: Sat Mar 31 11:01:20 2012 +0000 - - filter: add XOR operation - - Add XOR instruction fo BPF machine. Needed for computing packet hashes. - - Signed-off-by: Jiri Pirko - Signed-off-by: David S. Miller ---- - arch/x86/net/bpf_jit_comp.c | 13 +++++++++++++ - include/linux/filter.h | 11 ++++++++++- - net/core/filter.c | 25 +++++++++++++++++++++++++ - 3 files changed, 48 insertions(+), 1 deletion(-) - -diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c -index 0597f95..db99f9a 100644 ---- a/arch/x86/net/bpf_jit_comp.c -+++ b/arch/x86/net/bpf_jit_comp.c -@@ -309,6 +309,19 @@ void bpf_jit_compile(struct sk_filter *fp) - else - EMIT1_off32(0x0d, K); /* or imm32,%eax */ - break; -+ case BPF_S_ANC_ALU_XOR_X: /* A ^= X; */ -+ case BPF_S_ALU_XOR_X: -+ seen |= SEEN_XREG; -+ EMIT2(0x31, 0xd8); /* xor %ebx,%eax */ -+ break; -+ case BPF_S_ALU_XOR_K: /* A ^= K; */ -+ if (K == 0) -+ break; -+ if (is_imm8(K)) -+ EMIT3(0x83, 0xf0, K); /* xor imm8,%eax */ -+ else -+ EMIT1_off32(0x35, K); /* xor imm32,%eax */ -+ break; - case BPF_S_ALU_LSH_X: /* A <<= X; */ - seen |= SEEN_XREG; - EMIT4(0x89, 0xd9, 0xd3, 0xe0); /* mov %ebx,%ecx; shl %cl,%eax */ -diff --git a/include/linux/filter.h b/include/linux/filter.h -index 8eeb205..0031feb 100644 ---- a/include/linux/filter.h -+++ b/include/linux/filter.h -@@ -73,6 +73,9 @@ struct sock_fprog { /* Required for SO_ATTACH_FILTER. */ - #define BPF_LSH 0x60 - #define BPF_RSH 0x70 - #define BPF_NEG 0x80 -+#define BPF_MOD 0x90 -+#define BPF_XOR 0xa0 -+ - #define BPF_JA 0x00 - #define BPF_JEQ 0x10 - #define BPF_JGT 0x20 -@@ -126,7 +129,8 @@ struct sock_fprog { /* Required for SO_ATTACH_FILTER. */ - #define SKF_AD_HATYPE 28 - #define SKF_AD_RXHASH 32 - #define SKF_AD_CPU 36 --#define SKF_AD_MAX 40 -+#define SKF_AD_ALU_XOR_X 40 -+#define SKF_AD_MAX 44 - #define SKF_NET_OFF (-0x100000) - #define SKF_LL_OFF (-0x200000) - -@@ -181,10 +185,14 @@ enum { - BPF_S_ALU_MUL_K, - BPF_S_ALU_MUL_X, - BPF_S_ALU_DIV_X, -+ BPF_S_ALU_MOD_K, -+ BPF_S_ALU_MOD_X, - BPF_S_ALU_AND_K, - BPF_S_ALU_AND_X, - BPF_S_ALU_OR_K, - BPF_S_ALU_OR_X, -+ BPF_S_ALU_XOR_K, -+ BPF_S_ALU_XOR_X, - BPF_S_ALU_LSH_K, - BPF_S_ALU_LSH_X, - BPF_S_ALU_RSH_K, -@@ -228,6 +236,7 @@ enum { - BPF_S_ANC_HATYPE, - BPF_S_ANC_RXHASH, - BPF_S_ANC_CPU, -+ BPF_S_ANC_ALU_XOR_X, - }; - - #endif /* __KERNEL__ */ -diff --git a/net/core/filter.c b/net/core/filter.c -index 3b7398a..26c7bbe 100644 ---- a/net/core/filter.c -+++ b/net/core/filter.c -@@ -158,6 +158,14 @@ unsigned int sk_run_filter(const struct sk_buff *skb, - case BPF_S_ALU_DIV_K: - A = reciprocal_divide(A, K); - continue; -+ case BPF_S_ALU_MOD_X: -+ if (X == 0) -+ return 0; -+ A %= X; -+ continue; -+ case BPF_S_ALU_MOD_K: -+ A %= K; -+ continue; - case BPF_S_ALU_AND_X: - A &= X; - continue; -@@ -170,6 +178,13 @@ unsigned int sk_run_filter(const struct sk_buff *skb, - case BPF_S_ALU_OR_K: - A |= K; - continue; -+ case BPF_S_ANC_ALU_XOR_X: -+ case BPF_S_ALU_XOR_X: -+ A ^= X; -+ continue; -+ case BPF_S_ALU_XOR_K: -+ A ^= K; -+ continue; - case BPF_S_ALU_LSH_X: - A <<= X; - continue; -@@ -456,10 +471,14 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen) - [BPF_ALU|BPF_MUL|BPF_K] = BPF_S_ALU_MUL_K, - [BPF_ALU|BPF_MUL|BPF_X] = BPF_S_ALU_MUL_X, - [BPF_ALU|BPF_DIV|BPF_X] = BPF_S_ALU_DIV_X, -+ [BPF_ALU|BPF_MOD|BPF_K] = BPF_S_ALU_MOD_K, -+ [BPF_ALU|BPF_MOD|BPF_X] = BPF_S_ALU_MOD_X, - [BPF_ALU|BPF_AND|BPF_K] = BPF_S_ALU_AND_K, - [BPF_ALU|BPF_AND|BPF_X] = BPF_S_ALU_AND_X, - [BPF_ALU|BPF_OR|BPF_K] = BPF_S_ALU_OR_K, - [BPF_ALU|BPF_OR|BPF_X] = BPF_S_ALU_OR_X, -+ [BPF_ALU|BPF_XOR|BPF_K] = BPF_S_ALU_XOR_K, -+ [BPF_ALU|BPF_XOR|BPF_X] = BPF_S_ALU_XOR_X, - [BPF_ALU|BPF_LSH|BPF_K] = BPF_S_ALU_LSH_K, - [BPF_ALU|BPF_LSH|BPF_X] = BPF_S_ALU_LSH_X, - [BPF_ALU|BPF_RSH|BPF_K] = BPF_S_ALU_RSH_K, -@@ -518,6 +537,11 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen) - return -EINVAL; - ftest->k = reciprocal_value(ftest->k); - break; -+ case BPF_S_ALU_MOD_K: -+ /* check for division by zero */ -+ if (ftest->k == 0) -+ return -EINVAL; -+ break; - case BPF_S_LD_MEM: - case BPF_S_LDX_MEM: - case BPF_S_ST: -@@ -565,6 +589,7 @@ int sk_chk_filter(struct sock_filter *filter, unsigned int flen) - ANCILLARY(HATYPE); - ANCILLARY(RXHASH); - ANCILLARY(CPU); -+ ANCILLARY(ALU_XOR_X); - } - } - ftest->code = code; --- -2.1.1 - diff --git a/core/linux-sun4i/0001-Backport-firmware-loader.patch b/core/linux-sun4i/0001-Backport-firmware-loader.patch deleted file mode 100644 index f340ebda7..000000000 --- a/core/linux-sun4i/0001-Backport-firmware-loader.patch +++ /dev/null @@ -1,2620 +0,0 @@ -From c1715f7de4f2b7c42f432d4a7eb02f3f954d34ca Mon Sep 17 00:00:00 2001 -From: Kevin Mihelich -Date: Sat, 6 Dec 2014 10:44:46 -0700 -Subject: [PATCH] Backport firmware loader - -commit 390ac45ceb37d70308194820e25b1cb885b67260 -Author: Ming Lei -Date: Fri Aug 17 22:06:59 2012 +0800 - - PM / Sleep: introduce dpm_for_each_dev - - dpm_list and its pm lock provide a good way to iterate all - devices in system. Except this way, there is no other easy - way to iterate devices in system. - - firmware loader need to cache firmware images for devices - before system sleep, so introduce the function to meet its - demand. - - Reported-by: Fengguang Wu - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit 1dc17a9704a49c008a8d4cd8bdf03eccc54bcf84 -Author: Kevin Mihelich -Date: Wed Nov 26 13:03:08 2014 -0700 - - Revert "firmware loader: sync firmware cache by async_synchronize_full_domain" - - This reverts commit d28d3882bd1fdb88ae4e02f11b091a92b0e5068b. - -commit 6cf1b1b3016fb279d6a866151e75c94986be032b -Author: Ming Lei -Date: Sat Aug 4 12:01:26 2012 +0800 - - driver core: devres: introduce devres_for_each_res - - This patch introduces one devres API of devres_for_each_res - so that the device's driver can iterate each resource it has - interest in. - - The firmware loader will use the API to get each firmware name - from the device instance. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit 9373da78351d15876f7508734147c25fa018f512 -Author: Mark Brown -Date: Thu May 3 18:15:13 2012 +0100 - - devres: Add devres_release() - - APIs using devres frequently want to implement a "remove and free the - resource" operation so it seems sensible that they should be able to - just have devres do the freeing for them since that's a big part of what - devres is all about. - - Signed-off-by: Mark Brown - Signed-off-by: Greg Kroah-Hartman - -commit 6183261d20682701b6ddd189060da4f8325e775c -Author: Mark Brown -Date: Thu May 3 18:15:12 2012 +0100 - - devres: Clarify documentation for devres_destroy() - - It's not massively obvious (at least to me) that removing and freeing a - resource does not involve calling the release function for the resource - but rather only removes the management of it. Make the documentation more - explicit. - - Signed-off-by: Mark Brown - Signed-off-by: Greg Kroah-Hartman - -commit bf4725b4926af17c246faf3b6dda250890b3e1ae -Author: Takashi Iwai -Date: Thu Jan 31 11:13:57 2013 +0100 - - firmware: Ignore abort check when no user-helper is used - - FW_STATUS_ABORT can be set only during the user-helper invocation, - thus we can ignore the check when CONFIG_HW_LOADER_USER_HELPER is - disabled. - - Acked-by: Ming Lei - Signed-off-by: Takashi Iwai - Signed-off-by: Greg Kroah-Hartman - -commit 5d5c8b23919037f575fb6370d87b875c86793834 -Author: Takashi Iwai -Date: Thu Jan 31 11:13:56 2013 +0100 - - firmware: Reduce ifdef CONFIG_FW_LOADER_USER_HELPER - - By shuffling the code, reduce a few ifdefs in firmware_class.c. - Also, firmware_buf fmt field is changed to is_pages_buf boolean for - simplification. - - Acked-by: Ming Lei - Signed-off-by: Takashi Iwai - Signed-off-by: Greg Kroah-Hartman - -commit 861d2fc3539af167b5c4c9e81b5bf67300465cef -Author: Takashi Iwai -Date: Thu Jan 31 11:13:55 2013 +0100 - - firmware: Make user-mode helper optional - - This patch adds a new kconfig, CONFIG_FW_LOADER_USER_HELPER, and - guards the user-helper codes in firmware_class.c with ifdefs. - - Yeah, yeah, there are lots of ifdefs in this patch. The further - clean-up with code shuffling follows in the next. - - Acked-by: Ming Lei - Signed-off-by: Takashi Iwai - Signed-off-by: Greg Kroah-Hartman - -commit eb2e7c184b7e7bf2ae1968bd32c4354d28c75e69 -Author: Takashi Iwai -Date: Thu Jan 31 11:13:54 2013 +0100 - - firmware: Refactoring for splitting user-mode helper code - - Since 3.7 kernel, the firmware loader can read the firmware files - directly, and the traditional user-mode helper is invoked only as a - fallback. This seems working pretty well, and the next step would be - to reduce the redundant user-mode helper stuff in future. - - This patch is a preparation for that: refactor the code for splitting - user-mode helper stuff more easily. No functional change. - - Acked-by: Ming Lei - Signed-off-by: Takashi Iwai - Signed-off-by: Greg Kroah-Hartman - -commit 542061e36122107363fcf7c9aeffa957dee8bffc -Author: Luciano Coelho -Date: Tue Jan 15 10:43:43 2013 +0200 - - firmware: make sure the fw file size is not 0 - - If the requested firmware file size is 0 bytes in the filesytem, we - will try to vmalloc(0), which causes a warning: - - vmalloc: allocation failure: 0 bytes - kworker/1:1: page allocation failure: order:0, mode:0xd2 - __vmalloc_node_range+0x164/0x208 - __vmalloc_node+0x4c/0x58 - vmalloc+0x38/0x44 - _request_firmware_load+0x220/0x6b0 - request_firmware+0x64/0xc8 - wl18xx_setup+0xb4/0x570 [wl18xx] - wlcore_nvs_cb+0x64/0x9f8 [wlcore] - request_firmware_work_func+0x94/0x100 - process_one_work+0x1d0/0x750 - worker_thread+0x184/0x4ac - kthread+0xb4/0xc0 - - To fix this, check whether the file size is less than or equal to zero - in fw_read_file_contents(). - - Cc: stable [3.7] - Signed-off-by: Luciano Coelho - Acked-by: Ming Lei - Signed-off-by: Linus Torvalds - -commit 906aa734d888dfeb855d50ebdaa1abafb4e16880 -Author: Ming Lei -Date: Sat Nov 3 17:48:16 2012 +0800 - - firmware loader: document firmware cache mechanism - - This patch documents the firmware cache mechanism so that - users of request_firmware() know that it can be called - safely inside device's suspend and resume callback, and - the device's firmware needn't be cached any more by individual - driver itself to deal with firmware loss during system resume. - - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit 2a2f0be2bb74403c0079a823271e6ff7c2434735 -Author: Ming Lei -Date: Sat Nov 3 17:47:58 2012 +0800 - - firmware loader: introduce module parameter to customize(v4) fw search path - - This patch introduces one module parameter of 'path' in firmware_class - to support customizing firmware image search path, so that people can - use its own firmware path if the default built-in paths can't meet their - demand[1], and the typical usage is passing the below from kernel command - parameter when 'firmware_class' is built in kernel: - - firmware_class.path=$CUSTOMIZED_PATH - - [1], https://lkml.org/lkml/2012/10/11/337 - - Cc: Linus Torvalds - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - - Conflicts: - Documentation/firmware_class/README - -commit d6c6925a1c5091163df48d68ba38d2ec2003302e -Author: Cesar Eduardo Barros -Date: Sat Oct 27 20:37:10 2012 -0200 - - firmware: use noinline_for_stack - - The comment above fw_file_size() suggests it is noinline for stack size - reasons. Use noinline_for_stack to make this more clear. - - Signed-off-by: Cesar Eduardo Barros - Acked-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit f0d798c22f43f008b0b86ff58f2c68b522f1be90 -Author: Chuansheng Liu -Date: Sat Nov 10 01:27:22 2012 +0800 - - firmware loader: Fix the concurrent request_firmware() race for kref_get/put - - There is one race that both request_firmware() with the same - firmware name. - - The race scenerio is as below: - CPU1 CPU2 - request_firmware() --> - _request_firmware_load() return err another request_firmware() is coming --> - _request_firmware_cleanup is called --> _request_firmware_prepare --> - release_firmware ---> fw_lookup_and_allocate_buf --> - spin_lock(&fwc->lock) - ... __fw_lookup_buf() return true - fw_free_buf() will be called --> ... - kref_put --> - decrease the refcount to 0 - kref_get(&tmp->ref) ==> it will trigger warning - due to refcount == 0 - __fw_free_buf() --> - ... spin_unlock(&fwc->lock) - spin_lock(&fwc->lock) - list_del(&buf->list) - spin_unlock(&fwc->lock) - kfree(buf) - After that, the freed buf will be used. - - The key race is decreasing refcount to 0 and list_del is not protected together by - fwc->lock, and it is possible another thread try to get it between refcount==0 - and list_del. - - Fix it here to protect it together. - - Acked-by: Ming Lei - Signed-off-by: liu chuansheng - Cc: stable - Signed-off-by: Greg Kroah-Hartman - -commit 58af61921c9d1f6a8ffa097043bf78a2ff0bc44e -Author: Chuansheng Liu -Date: Thu Nov 8 19:14:40 2012 +0800 - - firmware loader: Fix the race FW_STATUS_DONE is followed by class_timeout - - There is a race as below when calling request_firmware(): - CPU1 CPU2 - write 0 > loading - mutex_lock(&fw_lock) - ... - set_bit FW_STATUS_DONE class_timeout is coming - set_bit FW_STATUS_ABORT - complete_all &completion - ... - mutex_unlock(&fw_lock) - - In this time, the bit FW_STATUS_DONE and FW_STATUS_ABORT are set, - and request_firmware() will return failure due to condition in - _request_firmware_load(): - if (!buf->size || test_bit(FW_STATUS_ABORT, &buf->status)) - retval = -ENOENT; - - But from the above scenerio, it should be a successful requesting. - So we need judge if the bit FW_STATUS_DONE is already set before - calling fw_load_abort() in timeout function. - - As Ming's proposal, we need change the timer into sched_work to - benefit from using &fw_lock mutex also. - - Signed-off-by: liu chuansheng - Acked-by: Ming Lei - Cc: stable - Signed-off-by: Greg Kroah-Hartman - -commit c6a3b74d6c42ca8aead23788768cdd358f672ed3 -Author: Ming Lei -Date: Tue Oct 9 12:01:04 2012 +0800 - - firmware loader: sync firmware cache by async_synchronize_full_domain - - async.c has provided synchronization mechanism on async_schedule_*, - so use async_synchronize_full_domain to sync caching firmware instead - of reinventing the wheel. - - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit 9a27bd527d58a887a65bad24fd864122f860ef79 -Author: Ming Lei -Date: Tue Oct 9 12:01:03 2012 +0800 - - firmware loader: let direct loading back on 'firmware_buf' - - Firstly 'firmware_buf' is introduced to make all loading requests - to share one firmware kernel buffer, so firmware_buf should - be used in direct loading for saving memory and speedup firmware - loading. - - Secondly, the commit below - - abb139e75c2cdbb955e840d6331cb5863e409d0e(firmware:teach - the kernel to load firmware files directly from the filesystem) - - introduces direct loading for fixing udev regression, but it - bypasses the firmware cache meachnism, so this patch enables - caching firmware for direct loading case since it is still needed - to solve drivers' dependency during system resume. - - Cc: Linus Torvalds - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit 451768e107b4bd2beb054f3ec44b666910a8f6ce -Author: Ming Lei -Date: Tue Oct 9 12:01:02 2012 +0800 - - firmware loader: fix one reqeust_firmware race - - Several loading requests may be pending on one same - firmware buf, and this patch moves fw_map_pages_buf() - before complete_all(&fw_buf->completion) and let all - requests see the mapped 'buf->data' once the loading - is completed. - - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit 31159a04875c46fe2f8634479f5c2c07b3ebd6aa -Author: Ming Lei -Date: Tue Oct 9 12:01:01 2012 +0800 - - firmware loader: cancel uncache work before caching firmware - - Under 'Opportunistic sleep' situation, system sleep might be - triggered very frequently, so the uncahce work may not be completed - before caching firmware during next suspend. - - This patch cancels the uncache work before caching firmware to - fix the problem above. - - Also this patch optimizes the cacheing firmware mechanism a bit by - only storing one firmware cache entry for one firmware image. - - So if the firmware is still cached during suspend, it doesn't need - to be loaded from user space any more. - - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit 4c7559d930c34c76a33b51f413c13f27367e95ff -Author: Linus Torvalds -Date: Thu Oct 4 09:19:02 2012 -0700 - - firmware: use 'kernel_read()' to read firmware into kernel buffer - - Fengguang correctly points out that the firmware reading should not use - vfs_read(), since the buffer is in kernel space. - - The vfs_read() just happened to work for kernel threads, but sparse - warns about the incorrect address spaces, and it's definitely incorrect - and could fail for other users of the firmware loading. - - Reported-by: Fengguang Wu - Signed-off-by: Linus Torvalds - -commit 2047dd6d95ac6066e518c26cb5133f4787aefb52 -Author: Linus Torvalds -Date: Wed Oct 3 15:58:32 2012 -0700 - - firmware: teach the kernel to load firmware files directly from the filesystem - - This is a first step in allowing people to by-pass udev for loading - device firmware. Current versions of udev will deadlock (causing us to - block for the 30 second timeout) under some circumstances if the - firmware is loaded as part of the module initialization path, and this - is causing problems for media drivers in particular. - - The current patch hardcodes the firmware path that udev uses by default, - and will fall back to the legacy udev mode if the firmware cannot be - found there. We'd like to add support for both configuring the paths - and the fallback behaviour, but in the meantime this hopefully fixes the - immediate problem, while also giving us a way forward. - - [ v2: Some VFS layer interface cleanups suggested by Al Viro ] - [ v3: use the default udev paths suggested by Kay Sievers ] - - Suggested-by: Ivan Kalvachev - Acked-by: Greg KH - Acked-by: Al Viro - Cc: Mauro Carvalho Chehab - Cc: Kay Sievers - Cc: Ming Lei - Signed-off-by: Linus Torvalds - -commit 7dc9f6ac529be96085a096c440823fe49f95f1cd -Author: Ming Lei -Date: Sat Sep 8 17:32:30 2012 +0800 - - firmware loader: fix compile warning when CONFIG_PM=n - - This patch replaces the previous macro of CONFIG_PM with - CONFIG_PM_SLEEP becasue firmware cache is only used in - system sleep situations. - - Also this patch fixes the below compile warning when - CONFIG_PM=n: - - drivers/base/firmware_class.c:1147: warning: 'device_cache_fw_images' - defined but not used - drivers/base/firmware_class.c:1212: warning: - 'device_uncache_fw_images_delay' defined but not used - - Reported-by: Andrew Morton - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit d4da2957c44390959fea1003188f449b3f38aba3 -Author: Ming Lei -Date: Mon Aug 20 19:04:16 2012 +0800 - - firmware loader: let caching firmware piggyback on loading firmware - - After starting caching firmware, there is still some time left - before devices are suspended, during the period, request_firmware - or its nowait version may still be triggered by the below situations - to load firmware images which can't be cached during suspend/resume - cycle. - - - new devices added - - driver bind - - or device open kind of things - - This patch utilizes the piggyback trick to cache firmware for - this kind of situation: just increase the firmware buf's reference - count and add the fw name entry into cache entry list after starting - caching firmware and before syscore_suspend() is called. - - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit 580eb13b0fb703c49e729d42c313dc901145c278 -Author: Ming Lei -Date: Mon Aug 20 19:04:15 2012 +0800 - - firmware loader: fix firmware -ENOENT situations - - If the requested firmware image doesn't exist, firmware->priv - should be set for the later concurrent requests, otherwise - warning and oops will be triggered inside firmware_free_data(). - - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit 529f2b00940c82abdf17bdc902e2b02d1904a789 -Author: Ming Lei -Date: Fri Aug 17 22:07:00 2012 +0800 - - firmware loader: fix build failure if FW_LOADER is m - - device_cache_fw_images need to iterate devices in system, - so this patch applies the introduced dpm_for_each_dev to - avoid link failure if CONFIG_FW_LOADER is m. - - Reported-by: Fengguang Wu - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit e51f2ca3d0d22b9cd08b6262d6e8423888a339e6 -Author: Ming Lei -Date: Fri Aug 17 22:06:58 2012 +0800 - - firmware loader: fix compile failure if !PM - - 'return 0' should be added to fw_pm_notify if !PM because - return value of the funcion is defined as 'int'. - - Reported-by: Fengguang Wu - Signed-off-by: Ming Lei - Signed-off-by: Greg Kroah-Hartman - -commit 402bbcd0a468c1388fe9fd98a6bd0d4d57f1f5e4 -Author: Ming Lei -Date: Sat Aug 4 12:01:29 2012 +0800 - - firmware loader: cache devices firmware during suspend/resume cycle - - This patch implements caching devices' firmware automatically - during system syspend/resume cycle, so any device drivers can - call request_firmware or request_firmware_nowait inside resume - path to get the cached firmware if they have loaded firmwares - successfully at least once before entering suspend. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit 6b5ef252737d7e46cee1471de1f8f778816ed432 -Author: Ming Lei -Date: Sat Aug 4 12:01:28 2012 +0800 - - firmware loader: use small timeout for cache device firmware - - Because device_cache_fw_images only cache the firmware which has been - loaded sucessfully at leat once, using a small loading timeout should - be reasonable. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit 3a78247eb488608da2dbf2c0b5f312abc7fb36bf -Author: Ming Lei -Date: Sat Aug 4 12:01:27 2012 +0800 - - firmware: introduce device_cache/uncache_fw_images - - This patch introduces the three helpers below: - - void device_cache_fw_images(void) - void device_uncache_fw_images(void) - void device_uncache_fw_images_delay(unsigned long) - - so we can use device_cache_fw_images() to cache firmware for - all devices which need firmware to work, and the device driver - can get the firmware easily from kernel memory when system isn't - ready for completing requests of loading firmware. - - After system is ready for completing firmware loading, driver core - will call device_uncache_fw_images() or its delay version to free - the cached firmware. - - The above helpers will be used to cache device firmware during - system suspend/resume cycle in the following patches. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit fec2fa2ad35e9b5ac3b556b57f2ce0d93d88dad3 -Author: Ming Lei -Date: Sat Aug 4 12:01:25 2012 +0800 - - firmware loader: store firmware name into devres list - - This patch will store firmware name into devres list of the device - which is requesting firmware loading, so that we can implement - auto cache and uncache firmware for devices in need. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit 82502e82fdb519661d280f9a2ff7888a7e11719d -Author: Ming Lei -Date: Sat Aug 4 12:01:24 2012 +0800 - - firmware loader: fix comments on request_firmware_nowait - - request_firmware_nowait is allowed to be called in atomic - context now if @gfp is GFP_ATOMIC, so fix the obsolete - comments and states which situations are suitable for using - it. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit 885f2a4d3e79590a5ac56c600ef21c7f33edf1ff -Author: Ming Lei -Date: Sat Aug 4 12:01:23 2012 +0800 - - firmware loader: fix device lifetime - - Callers of request_firmware* must hold the reference count of - @device, otherwise it is easy to trigger oops since the firmware - loader device is the child of @device. - - This patch adds comments about the usage. In fact, most of drivers - call request_firmware* in its probe() or open(), so the constraint - should be reasonable and can be satisfied. - - Also this patch holds the reference count of @device before - schedule_work() in request_firmware_nowait() to avoid that - the @device is released after request_firmware_nowait returns - and before the worker function is scheduled. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit f8c40c19896e07c5e24596d1c73e0004b83bf564 -Author: Ming Lei -Date: Sat Aug 4 12:01:22 2012 +0800 - - firmware loader: introduce cache_firmware and uncache_firmware - - This patches introduce two kernel APIs of cache_firmware and - uncache_firmware, both of which take the firmware file name - as the only parameter. - - So any drivers can call cache_firmware to cache the specified - firmware file into kernel memory, and can use the cached firmware - in situations which can't request firmware from user space. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit 33f7f4606f2add663f0f055d9e22224b2ed927e6 -Author: Ming Lei -Date: Sat Aug 4 12:01:21 2012 +0800 - - firmware loader: always let firmware_buf own the pages buffer - - This patch always let firmware_buf own the pages buffer allocated - inside firmware_data_write, and add all instances of firmware_buf - into the firmware cache global list. Also introduce one private field - in 'struct firmware', so release_firmware will see the instance of - firmware_buf associated with the current firmware instance, then just - 'free' the instance of firmware_buf. - - The firmware_buf instance represents one pages buffer for one - firmware image, so lots of firmware loading requests can share - the same firmware_buf instance if they request the same firmware - image file. - - This patch will make implementation of the following cache_firmware/ - uncache_firmware very easy and simple. - - In fact, the patch improves request_formware/release_firmware: - - - only request userspace to write firmware image once if - several devices share one same firmware image and its drivers - call request_firmware concurrently. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit 23f444643c50ab3dc66e2cd699ef03d90dbdccc8 -Author: Ming Lei -Date: Sat Aug 4 12:01:20 2012 +0800 - - firmware loader: introduce firmware_buf - - This patch introduces struct firmware_buf to describe the buffer - which holds the firmware data, which will make the following - cache_firmware/uncache_firmware implemented easily. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit c341f46309619686830be4b608c9db06b68bafc1 -Author: Ming Lei -Date: Sat Aug 4 12:01:19 2012 +0800 - - firmware loader: fix creation failure of fw loader device - - If one device driver calls request_firmware_nowait() to request - several different firmwares' loading, device_add() will return - failure since all firmware loader device use same name of the - device who is requesting firmware. - - This patch always use the name of firmware image as the firmware - loader device name to fix the problem since the following patches - for caching firmware will make sure only one loading for same - firmware is alllowd at the same time. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit fca2060e5dac12511c0860878e89e0e5ad8e7a3e -Author: Ming Lei -Date: Sat Aug 4 12:01:18 2012 +0800 - - firmware loader: remove unnecessary wmb() - - The wmb() inside fw_load_abort is not necessary, since - complete() and wait_on_completion() has implied one pair - of memory barrier. - - Also wmb() isn't a correct usage, so just remove it. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit 4eaaa8782ff182e0de3ac050aeb0305879dc89eb -Author: Ming Lei -Date: Sat Aug 4 12:01:17 2012 +0800 - - firmware loader: fix races during loading firmware - - This patch fixes two races in loading firmware: - - 1, FW_STATUS_DONE should be set before waking up the task waitting - on _request_firmware_load, otherwise FW_STATUS_ABORT may be - thought as DONE mistakenly. - - 2, Inside _request_firmware_load(), there is a small window between - wait_for_completion() and mutex_lock(&fw_lock), and 'echo 1 > loading' - still may happen during the period, so this patch checks FW_STATUS_DONE - to prevent pages' buffer completed from being freed in firmware_loading_store. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit dc3ca115481cc50a7d4aa866f607b470280b1e5e -Author: Ming Lei -Date: Sat Aug 4 12:01:16 2012 +0800 - - firmware loader: simplify pages ownership transfer - - This patch doesn't transfer ownership of pages' buffer to the - instance of firmware until the firmware loading is completed, - which will simplify firmware_loading_store a lot, so help - to introduce the following cache_firmware and uncache_firmware - mechanism during system suspend-resume cycle. - - In fact, this patch fixes one bug: if writing data into - firmware loader device is bypassed between writting 1 and 0 to - 'loading', OOPS will be triggered without the patch. - - Also handle the vmap failure case, and add some comments to make - code more readable. - - Signed-off-by: Ming Lei - Cc: Linus Torvalds - Signed-off-by: Greg Kroah-Hartman - -commit e728c819e3666bb37e08a49255b24e6933bb72e5 -Author: Lars-Peter Clausen -Date: Tue Jul 3 18:49:36 2012 +0200 - - driver-core: Use kobj_to_dev instead of re-implementing it - - Signed-off-by: Lars-Peter Clausen - Signed-off-by: Greg Kroah-Hartman ---- - Documentation/firmware_class/README | 7 + - drivers/base/Kconfig | 11 + - drivers/base/core.c | 17 +- - drivers/base/devres.c | 77 +++ - drivers/base/firmware_class.c | 1216 +++++++++++++++++++++++++++++------ - drivers/base/power/main.c | 22 + - include/linux/device.h | 6 + - include/linux/firmware.h | 15 + - include/linux/pm.h | 5 + - 9 files changed, 1177 insertions(+), 199 deletions(-) - -diff --git a/Documentation/firmware_class/README b/Documentation/firmware_class/README -index 7eceaff..5fde1ef 100644 ---- a/Documentation/firmware_class/README -+++ b/Documentation/firmware_class/README -@@ -106,3 +106,10 @@ - on the setup, so I think that the choice on what firmware to make - persistent should be left to userspace. - -+ about firmware cache: -+ -------------------- -+ After firmware cache mechanism is introduced during system sleep, -+ request_firmware can be called safely inside device's suspend and -+ resume callback, and callers need't cache the firmware by -+ themselves any more for dealing with firmware loss during system -+ resume. -diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig -index 7c96a3a..b7af956 100644 ---- a/drivers/base/Kconfig -+++ b/drivers/base/Kconfig -@@ -145,6 +145,17 @@ config EXTRA_FIRMWARE_DIR - this option you can point it elsewhere, such as /lib/firmware/ or - some other directory containing the firmware files. - -+config FW_LOADER_USER_HELPER -+ bool "Fallback user-helper invocation for firmware loading" -+ depends on FW_LOADER -+ default y -+ help -+ This option enables / disables the invocation of user-helper -+ (e.g. udev) for loading firmware files as a fallback after the -+ direct file loading in kernel fails. The user-mode helper is -+ no longer required unless you have a special firmware file that -+ resides in a non-standard path. -+ - config DEBUG_DRIVER - bool "Driver Core verbose debug messages" - depends on DEBUG_KERNEL -diff --git a/drivers/base/core.c b/drivers/base/core.c -index f428321..c360a22 100644 ---- a/drivers/base/core.c -+++ b/drivers/base/core.c -@@ -84,14 +84,13 @@ const char *dev_driver_string(const struct device *dev) - } - EXPORT_SYMBOL(dev_driver_string); - --#define to_dev(obj) container_of(obj, struct device, kobj) - #define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr) - - static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr, - char *buf) - { - struct device_attribute *dev_attr = to_dev_attr(attr); -- struct device *dev = to_dev(kobj); -+ struct device *dev = kobj_to_dev(kobj); - ssize_t ret = -EIO; - - if (dev_attr->show) -@@ -107,7 +106,7 @@ static ssize_t dev_attr_store(struct kobject *kobj, struct attribute *attr, - const char *buf, size_t count) - { - struct device_attribute *dev_attr = to_dev_attr(attr); -- struct device *dev = to_dev(kobj); -+ struct device *dev = kobj_to_dev(kobj); - ssize_t ret = -EIO; - - if (dev_attr->store) -@@ -181,7 +180,7 @@ EXPORT_SYMBOL_GPL(device_show_int); - */ - static void device_release(struct kobject *kobj) - { -- struct device *dev = to_dev(kobj); -+ struct device *dev = kobj_to_dev(kobj); - struct device_private *p = dev->p; - - if (dev->release) -@@ -199,7 +198,7 @@ static void device_release(struct kobject *kobj) - - static const void *device_namespace(struct kobject *kobj) - { -- struct device *dev = to_dev(kobj); -+ struct device *dev = kobj_to_dev(kobj); - const void *ns = NULL; - - if (dev->class && dev->class->ns_type) -@@ -220,7 +219,7 @@ static int dev_uevent_filter(struct kset *kset, struct kobject *kobj) - struct kobj_type *ktype = get_ktype(kobj); - - if (ktype == &device_ktype) { -- struct device *dev = to_dev(kobj); -+ struct device *dev = kobj_to_dev(kobj); - if (dev->bus) - return 1; - if (dev->class) -@@ -231,7 +230,7 @@ static int dev_uevent_filter(struct kset *kset, struct kobject *kobj) - - static const char *dev_uevent_name(struct kset *kset, struct kobject *kobj) - { -- struct device *dev = to_dev(kobj); -+ struct device *dev = kobj_to_dev(kobj); - - if (dev->bus) - return dev->bus->name; -@@ -243,7 +242,7 @@ static const char *dev_uevent_name(struct kset *kset, struct kobject *kobj) - static int dev_uevent(struct kset *kset, struct kobject *kobj, - struct kobj_uevent_env *env) - { -- struct device *dev = to_dev(kobj); -+ struct device *dev = kobj_to_dev(kobj); - int retval = 0; - - /* add device node properties if present */ -@@ -1131,7 +1130,7 @@ int device_register(struct device *dev) - */ - struct device *get_device(struct device *dev) - { -- return dev ? to_dev(kobject_get(&dev->kobj)) : NULL; -+ return dev ? kobj_to_dev(kobject_get(&dev->kobj)) : NULL; - } - - /** -diff --git a/drivers/base/devres.c b/drivers/base/devres.c -index 524bf96..8731979 100644 ---- a/drivers/base/devres.c -+++ b/drivers/base/devres.c -@@ -144,6 +144,48 @@ EXPORT_SYMBOL_GPL(devres_alloc); - #endif - - /** -+ * devres_for_each_res - Resource iterator -+ * @dev: Device to iterate resource from -+ * @release: Look for resources associated with this release function -+ * @match: Match function (optional) -+ * @match_data: Data for the match function -+ * @fn: Function to be called for each matched resource. -+ * @data: Data for @fn, the 3rd parameter of @fn -+ * -+ * Call @fn for each devres of @dev which is associated with @release -+ * and for which @match returns 1. -+ * -+ * RETURNS: -+ * void -+ */ -+void devres_for_each_res(struct device *dev, dr_release_t release, -+ dr_match_t match, void *match_data, -+ void (*fn)(struct device *, void *, void *), -+ void *data) -+{ -+ struct devres_node *node; -+ struct devres_node *tmp; -+ unsigned long flags; -+ -+ if (!fn) -+ return; -+ -+ spin_lock_irqsave(&dev->devres_lock, flags); -+ list_for_each_entry_safe_reverse(node, tmp, -+ &dev->devres_head, entry) { -+ struct devres *dr = container_of(node, struct devres, node); -+ -+ if (node->release != release) -+ continue; -+ if (match && !match(dev, dr->data, match_data)) -+ continue; -+ fn(dev, dr->data, data); -+ } -+ spin_unlock_irqrestore(&dev->devres_lock, flags); -+} -+EXPORT_SYMBOL_GPL(devres_for_each_res); -+ -+/** - * devres_free - Free device resource data - * @res: Pointer to devres data to free - * -@@ -309,6 +351,10 @@ EXPORT_SYMBOL_GPL(devres_remove); - * which @match returns 1. If @match is NULL, it's considered to - * match all. If found, the resource is removed atomically and freed. - * -+ * Note that the release function for the resource will not be called, -+ * only the devres-allocated data will be freed. The caller becomes -+ * responsible for freeing any other data. -+ * - * RETURNS: - * 0 if devres is found and freed, -ENOENT if not found. - */ -@@ -326,6 +372,37 @@ int devres_destroy(struct device *dev, dr_release_t release, - } - EXPORT_SYMBOL_GPL(devres_destroy); - -+ -+/** -+ * devres_release - Find a device resource and destroy it, calling release -+ * @dev: Device to find resource from -+ * @release: Look for resources associated with this release function -+ * @match: Match function (optional) -+ * @match_data: Data for the match function -+ * -+ * Find the latest devres of @dev associated with @release and for -+ * which @match returns 1. If @match is NULL, it's considered to -+ * match all. If found, the resource is removed atomically, the -+ * release function called and the resource freed. -+ * -+ * RETURNS: -+ * 0 if devres is found and freed, -ENOENT if not found. -+ */ -+int devres_release(struct device *dev, dr_release_t release, -+ dr_match_t match, void *match_data) -+{ -+ void *res; -+ -+ res = devres_remove(dev, release, match, match_data); -+ if (unlikely(!res)) -+ return -ENOENT; -+ -+ (*release)(dev, res); -+ devres_free(res); -+ return 0; -+} -+EXPORT_SYMBOL_GPL(devres_release); -+ - static int remove_nodes(struct device *dev, - struct list_head *first, struct list_head *end, - struct list_head *todo) -diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c -index 5401814..15b36b7 100644 ---- a/drivers/base/firmware_class.c -+++ b/drivers/base/firmware_class.c -@@ -21,8 +21,16 @@ - #include - #include - #include -+#include -+#include -+#include -+#include -+#include -+#include - --#define to_dev(obj) container_of(obj, struct device, kobj) -+#include -+ -+#include "base.h" - - MODULE_AUTHOR("Manuel Estrada Sainz"); - MODULE_DESCRIPTION("Multi purpose firmware loading support"); -@@ -87,23 +95,354 @@ static inline long firmware_loading_timeout(void) - return loading_timeout > 0 ? loading_timeout * HZ : MAX_SCHEDULE_TIMEOUT; - } - --/* fw_lock could be moved to 'struct firmware_priv' but since it is just -- * guarding for corner cases a global lock should be OK */ --static DEFINE_MUTEX(fw_lock); -+struct firmware_cache { -+ /* firmware_buf instance will be added into the below list */ -+ spinlock_t lock; -+ struct list_head head; -+ int state; -+ -+#ifdef CONFIG_PM_SLEEP -+ /* -+ * Names of firmware images which have been cached successfully -+ * will be added into the below list so that device uncache -+ * helper can trace which firmware images have been cached -+ * before. -+ */ -+ spinlock_t name_lock; -+ struct list_head fw_names; -+ -+ wait_queue_head_t wait_queue; -+ int cnt; -+ struct delayed_work work; -+ -+ struct notifier_block pm_notify; -+#endif -+}; - --struct firmware_priv { -+struct firmware_buf { -+ struct kref ref; -+ struct list_head list; - struct completion completion; -- struct firmware *fw; -+ struct firmware_cache *fwc; - unsigned long status; -+ void *data; -+ size_t size; -+#ifdef CONFIG_FW_LOADER_USER_HELPER -+ bool is_paged_buf; - struct page **pages; - int nr_pages; - int page_array_size; -- struct timer_list timeout; -- struct device dev; -- bool nowait; -+#endif - char fw_id[]; - }; - -+struct fw_cache_entry { -+ struct list_head list; -+ char name[]; -+}; -+ -+struct fw_name_devm { -+ unsigned long magic; -+ char name[]; -+}; -+ -+#define to_fwbuf(d) container_of(d, struct firmware_buf, ref) -+ -+#define FW_LOADER_NO_CACHE 0 -+#define FW_LOADER_START_CACHE 1 -+ -+static int fw_cache_piggyback_on_request(const char *name); -+ -+/* fw_lock could be moved to 'struct firmware_priv' but since it is just -+ * guarding for corner cases a global lock should be OK */ -+static DEFINE_MUTEX(fw_lock); -+ -+static struct firmware_cache fw_cache; -+ -+static struct firmware_buf *__allocate_fw_buf(const char *fw_name, -+ struct firmware_cache *fwc) -+{ -+ struct firmware_buf *buf; -+ -+ buf = kzalloc(sizeof(*buf) + strlen(fw_name) + 1 , GFP_ATOMIC); -+ -+ if (!buf) -+ return buf; -+ -+ kref_init(&buf->ref); -+ strcpy(buf->fw_id, fw_name); -+ buf->fwc = fwc; -+ init_completion(&buf->completion); -+ -+ pr_debug("%s: fw-%s buf=%p\n", __func__, fw_name, buf); -+ -+ return buf; -+} -+ -+static struct firmware_buf *__fw_lookup_buf(const char *fw_name) -+{ -+ struct firmware_buf *tmp; -+ struct firmware_cache *fwc = &fw_cache; -+ -+ list_for_each_entry(tmp, &fwc->head, list) -+ if (!strcmp(tmp->fw_id, fw_name)) -+ return tmp; -+ return NULL; -+} -+ -+static int fw_lookup_and_allocate_buf(const char *fw_name, -+ struct firmware_cache *fwc, -+ struct firmware_buf **buf) -+{ -+ struct firmware_buf *tmp; -+ -+ spin_lock(&fwc->lock); -+ tmp = __fw_lookup_buf(fw_name); -+ if (tmp) { -+ kref_get(&tmp->ref); -+ spin_unlock(&fwc->lock); -+ *buf = tmp; -+ return 1; -+ } -+ tmp = __allocate_fw_buf(fw_name, fwc); -+ if (tmp) -+ list_add(&tmp->list, &fwc->head); -+ spin_unlock(&fwc->lock); -+ -+ *buf = tmp; -+ -+ return tmp ? 0 : -ENOMEM; -+} -+ -+static struct firmware_buf *fw_lookup_buf(const char *fw_name) -+{ -+ struct firmware_buf *tmp; -+ struct firmware_cache *fwc = &fw_cache; -+ -+ spin_lock(&fwc->lock); -+ tmp = __fw_lookup_buf(fw_name); -+ spin_unlock(&fwc->lock); -+ -+ return tmp; -+} -+ -+static void __fw_free_buf(struct kref *ref) -+{ -+ struct firmware_buf *buf = to_fwbuf(ref); -+ struct firmware_cache *fwc = buf->fwc; -+ -+ pr_debug("%s: fw-%s buf=%p data=%p size=%u\n", -+ __func__, buf->fw_id, buf, buf->data, -+ (unsigned int)buf->size); -+ -+ list_del(&buf->list); -+ spin_unlock(&fwc->lock); -+ -+#ifdef CONFIG_FW_LOADER_USER_HELPER -+ if (buf->is_paged_buf) { -+ int i; -+ vunmap(buf->data); -+ for (i = 0; i < buf->nr_pages; i++) -+ __free_page(buf->pages[i]); -+ kfree(buf->pages); -+ } else -+#endif -+ vfree(buf->data); -+ kfree(buf); -+} -+ -+static void fw_free_buf(struct firmware_buf *buf) -+{ -+ struct firmware_cache *fwc = buf->fwc; -+ spin_lock(&fwc->lock); -+ if (!kref_put(&buf->ref, __fw_free_buf)) -+ spin_unlock(&fwc->lock); -+} -+ -+/* direct firmware loading support */ -+static char fw_path_para[256]; -+static const char * const fw_path[] = { -+ fw_path_para, -+ "/lib/firmware/updates/" UTS_RELEASE, -+ "/lib/firmware/updates", -+ "/lib/firmware/" UTS_RELEASE, -+ "/lib/firmware" -+}; -+ -+/* -+ * Typical usage is that passing 'firmware_class.path=$CUSTOMIZED_PATH' -+ * from kernel command line because firmware_class is generally built in -+ * kernel instead of module. -+ */ -+module_param_string(path, fw_path_para, sizeof(fw_path_para), 0644); -+MODULE_PARM_DESC(path, "customized firmware image search path with a higher priority than default path"); -+ -+/* Don't inline this: 'struct kstat' is biggish */ -+static noinline_for_stack long fw_file_size(struct file *file) -+{ -+ struct kstat st; -+ if (vfs_getattr(file->f_path.mnt, file->f_path.dentry, &st)) -+ return -1; -+ if (!S_ISREG(st.mode)) -+ return -1; -+ if (st.size != (long)st.size) -+ return -1; -+ return st.size; -+} -+ -+static bool fw_read_file_contents(struct file *file, struct firmware_buf *fw_buf) -+{ -+ long size; -+ char *buf; -+ -+ size = fw_file_size(file); -+ if (size <= 0) -+ return false; -+ buf = vmalloc(size); -+ if (!buf) -+ return false; -+ if (kernel_read(file, 0, buf, size) != size) { -+ vfree(buf); -+ return false; -+ } -+ fw_buf->data = buf; -+ fw_buf->size = size; -+ return true; -+} -+ -+static bool fw_get_filesystem_firmware(struct device *device, -+ struct firmware_buf *buf) -+{ -+ int i; -+ bool success = false; -+ char *path = __getname(); -+ -+ for (i = 0; i < ARRAY_SIZE(fw_path); i++) { -+ struct file *file; -+ -+ /* skip the unset customized path */ -+ if (!fw_path[i][0]) -+ continue; -+ -+ snprintf(path, PATH_MAX, "%s/%s", fw_path[i], buf->fw_id); -+ -+ file = filp_open(path, O_RDONLY, 0); -+ if (IS_ERR(file)) -+ continue; -+ success = fw_read_file_contents(file, buf); -+ fput(file); -+ if (success) -+ break; -+ } -+ __putname(path); -+ -+ if (success) { -+ dev_dbg(device, "firmware: direct-loading firmware %s\n", -+ buf->fw_id); -+ mutex_lock(&fw_lock); -+ set_bit(FW_STATUS_DONE, &buf->status); -+ complete_all(&buf->completion); -+ mutex_unlock(&fw_lock); -+ } -+ -+ return success; -+} -+ -+/* firmware holds the ownership of pages */ -+static void firmware_free_data(const struct firmware *fw) -+{ -+ /* Loaded directly? */ -+ if (!fw->priv) { -+ vfree(fw->data); -+ return; -+ } -+ fw_free_buf(fw->priv); -+} -+ -+/* store the pages buffer info firmware from buf */ -+static void fw_set_page_data(struct firmware_buf *buf, struct firmware *fw) -+{ -+ fw->priv = buf; -+#ifdef CONFIG_FW_LOADER_USER_HELPER -+ fw->pages = buf->pages; -+#endif -+ fw->size = buf->size; -+ fw->data = buf->data; -+ -+ pr_debug("%s: fw-%s buf=%p data=%p size=%u\n", -+ __func__, buf->fw_id, buf, buf->data, -+ (unsigned int)buf->size); -+} -+ -+#ifdef CONFIG_PM_SLEEP -+static void fw_name_devm_release(struct device *dev, void *res) -+{ -+ struct fw_name_devm *fwn = res; -+ -+ if (fwn->magic == (unsigned long)&fw_cache) -+ pr_debug("%s: fw_name-%s devm-%p released\n", -+ __func__, fwn->name, res); -+} -+ -+static int fw_devm_match(struct device *dev, void *res, -+ void *match_data) -+{ -+ struct fw_name_devm *fwn = res; -+ -+ return (fwn->magic == (unsigned long)&fw_cache) && -+ !strcmp(fwn->name, match_data); -+} -+ -+static struct fw_name_devm *fw_find_devm_name(struct device *dev, -+ const char *name) -+{ -+ struct fw_name_devm *fwn; -+ -+ fwn = devres_find(dev, fw_name_devm_release, -+ fw_devm_match, (void *)name); -+ return fwn; -+} -+ -+/* add firmware name into devres list */ -+static int fw_add_devm_name(struct device *dev, const char *name) -+{ -+ struct fw_name_devm *fwn; -+ -+ fwn = fw_find_devm_name(dev, name); -+ if (fwn) -+ return 1; -+ -+ fwn = devres_alloc(fw_name_devm_release, sizeof(struct fw_name_devm) + -+ strlen(name) + 1, GFP_KERNEL); -+ if (!fwn) -+ return -ENOMEM; -+ -+ fwn->magic = (unsigned long)&fw_cache; -+ strcpy(fwn->name, name); -+ devres_add(dev, fwn); -+ -+ return 0; -+} -+#else -+static int fw_add_devm_name(struct device *dev, const char *name) -+{ -+ return 0; -+} -+#endif -+ -+ -+/* -+ * user-mode helper code -+ */ -+#ifdef CONFIG_FW_LOADER_USER_HELPER -+struct firmware_priv { -+ struct delayed_work timeout_work; -+ bool nowait; -+ struct device dev; -+ struct firmware_buf *buf; -+ struct firmware *fw; -+}; -+ - static struct firmware_priv *to_firmware_priv(struct device *dev) - { - return container_of(dev, struct firmware_priv, dev); -@@ -111,11 +450,15 @@ static struct firmware_priv *to_firmware_priv(struct device *dev) - - static void fw_load_abort(struct firmware_priv *fw_priv) - { -- set_bit(FW_STATUS_ABORT, &fw_priv->status); -- wmb(); -- complete(&fw_priv->completion); -+ struct firmware_buf *buf = fw_priv->buf; -+ -+ set_bit(FW_STATUS_ABORT, &buf->status); -+ complete_all(&buf->completion); - } - -+#define is_fw_load_aborted(buf) \ -+ test_bit(FW_STATUS_ABORT, &(buf)->status) -+ - static ssize_t firmware_timeout_show(struct class *class, - struct class_attribute *attr, - char *buf) -@@ -156,11 +499,7 @@ static struct class_attribute firmware_class_attrs[] = { - static void fw_dev_release(struct device *dev) - { - struct firmware_priv *fw_priv = to_firmware_priv(dev); -- int i; - -- for (i = 0; i < fw_priv->nr_pages; i++) -- __free_page(fw_priv->pages[i]); -- kfree(fw_priv->pages); - kfree(fw_priv); - - module_put(THIS_MODULE); -@@ -170,7 +509,7 @@ static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env) - { - struct firmware_priv *fw_priv = to_firmware_priv(dev); - -- if (add_uevent_var(env, "FIRMWARE=%s", fw_priv->fw_id)) -+ if (add_uevent_var(env, "FIRMWARE=%s", fw_priv->buf->fw_id)) - return -ENOMEM; - if (add_uevent_var(env, "TIMEOUT=%i", loading_timeout)) - return -ENOMEM; -@@ -191,26 +530,30 @@ static ssize_t firmware_loading_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct firmware_priv *fw_priv = to_firmware_priv(dev); -- int loading = test_bit(FW_STATUS_LOADING, &fw_priv->status); -+ int loading = test_bit(FW_STATUS_LOADING, &fw_priv->buf->status); - - return sprintf(buf, "%d\n", loading); - } - --static void firmware_free_data(const struct firmware *fw) --{ -- int i; -- vunmap(fw->data); -- if (fw->pages) { -- for (i = 0; i < PFN_UP(fw->size); i++) -- __free_page(fw->pages[i]); -- kfree(fw->pages); -- } --} -- - /* Some architectures don't have PAGE_KERNEL_RO */ - #ifndef PAGE_KERNEL_RO - #define PAGE_KERNEL_RO PAGE_KERNEL - #endif -+ -+/* one pages buffer should be mapped/unmapped only once */ -+static int fw_map_pages_buf(struct firmware_buf *buf) -+{ -+ if (!buf->is_paged_buf) -+ return 0; -+ -+ if (buf->data) -+ vunmap(buf->data); -+ buf->data = vmap(buf->pages, buf->nr_pages, 0, PAGE_KERNEL_RO); -+ if (!buf->data) -+ return -ENOMEM; -+ return 0; -+} -+ - /** - * firmware_loading_store - set value in the 'loading' control file - * @dev: device pointer -@@ -229,45 +572,41 @@ static ssize_t firmware_loading_store(struct device *dev, - const char *buf, size_t count) - { - struct firmware_priv *fw_priv = to_firmware_priv(dev); -+ struct firmware_buf *fw_buf = fw_priv->buf; - int loading = simple_strtol(buf, NULL, 10); - int i; - - mutex_lock(&fw_lock); - -- if (!fw_priv->fw) -+ if (!fw_buf) - goto out; - - switch (loading) { - case 1: -- firmware_free_data(fw_priv->fw); -- memset(fw_priv->fw, 0, sizeof(struct firmware)); -- /* If the pages are not owned by 'struct firmware' */ -- for (i = 0; i < fw_priv->nr_pages; i++) -- __free_page(fw_priv->pages[i]); -- kfree(fw_priv->pages); -- fw_priv->pages = NULL; -- fw_priv->page_array_size = 0; -- fw_priv->nr_pages = 0; -- set_bit(FW_STATUS_LOADING, &fw_priv->status); -+ /* discarding any previous partial load */ -+ if (!test_bit(FW_STATUS_DONE, &fw_buf->status)) { -+ for (i = 0; i < fw_buf->nr_pages; i++) -+ __free_page(fw_buf->pages[i]); -+ kfree(fw_buf->pages); -+ fw_buf->pages = NULL; -+ fw_buf->page_array_size = 0; -+ fw_buf->nr_pages = 0; -+ set_bit(FW_STATUS_LOADING, &fw_buf->status); -+ } - break; - case 0: -- if (test_bit(FW_STATUS_LOADING, &fw_priv->status)) { -- vunmap(fw_priv->fw->data); -- fw_priv->fw->data = vmap(fw_priv->pages, -- fw_priv->nr_pages, -- 0, PAGE_KERNEL_RO); -- if (!fw_priv->fw->data) { -- dev_err(dev, "%s: vmap() failed\n", __func__); -- goto err; -- } -- /* Pages are now owned by 'struct firmware' */ -- fw_priv->fw->pages = fw_priv->pages; -- fw_priv->pages = NULL; -- -- fw_priv->page_array_size = 0; -- fw_priv->nr_pages = 0; -- complete(&fw_priv->completion); -- clear_bit(FW_STATUS_LOADING, &fw_priv->status); -+ if (test_bit(FW_STATUS_LOADING, &fw_buf->status)) { -+ set_bit(FW_STATUS_DONE, &fw_buf->status); -+ clear_bit(FW_STATUS_LOADING, &fw_buf->status); -+ -+ /* -+ * Several loading requests may be pending on -+ * one same firmware buf, so let all requests -+ * see the mapped 'buf->data' once the loading -+ * is completed. -+ * */ -+ fw_map_pages_buf(fw_buf); -+ complete_all(&fw_buf->completion); - break; - } - /* fallthrough */ -@@ -275,7 +614,6 @@ static ssize_t firmware_loading_store(struct device *dev, - dev_err(dev, "%s: unexpected value (%d)\n", __func__, loading); - /* fallthrough */ - case -1: -- err: - fw_load_abort(fw_priv); - break; - } -@@ -290,23 +628,23 @@ static ssize_t firmware_data_read(struct file *filp, struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buffer, loff_t offset, size_t count) - { -- struct device *dev = to_dev(kobj); -+ struct device *dev = kobj_to_dev(kobj); - struct firmware_priv *fw_priv = to_firmware_priv(dev); -- struct firmware *fw; -+ struct firmware_buf *buf; - ssize_t ret_count; - - mutex_lock(&fw_lock); -- fw = fw_priv->fw; -- if (!fw || test_bit(FW_STATUS_DONE, &fw_priv->status)) { -+ buf = fw_priv->buf; -+ if (!buf || test_bit(FW_STATUS_DONE, &buf->status)) { - ret_count = -ENODEV; - goto out; - } -- if (offset > fw->size) { -+ if (offset > buf->size) { - ret_count = 0; - goto out; - } -- if (count > fw->size - offset) -- count = fw->size - offset; -+ if (count > buf->size - offset) -+ count = buf->size - offset; - - ret_count = count; - -@@ -316,11 +654,11 @@ static ssize_t firmware_data_read(struct file *filp, struct kobject *kobj, - int page_ofs = offset & (PAGE_SIZE-1); - int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count); - -- page_data = kmap(fw_priv->pages[page_nr]); -+ page_data = kmap(buf->pages[page_nr]); - - memcpy(buffer, page_data + page_ofs, page_cnt); - -- kunmap(fw_priv->pages[page_nr]); -+ kunmap(buf->pages[page_nr]); - buffer += page_cnt; - offset += page_cnt; - count -= page_cnt; -@@ -332,12 +670,13 @@ out: - - static int fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size) - { -+ struct firmware_buf *buf = fw_priv->buf; - int pages_needed = ALIGN(min_size, PAGE_SIZE) >> PAGE_SHIFT; - - /* If the array of pages is too small, grow it... */ -- if (fw_priv->page_array_size < pages_needed) { -+ if (buf->page_array_size < pages_needed) { - int new_array_size = max(pages_needed, -- fw_priv->page_array_size * 2); -+ buf->page_array_size * 2); - struct page **new_pages; - - new_pages = kmalloc(new_array_size * sizeof(void *), -@@ -346,24 +685,24 @@ static int fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size) - fw_load_abort(fw_priv); - return -ENOMEM; - } -- memcpy(new_pages, fw_priv->pages, -- fw_priv->page_array_size * sizeof(void *)); -- memset(&new_pages[fw_priv->page_array_size], 0, sizeof(void *) * -- (new_array_size - fw_priv->page_array_size)); -- kfree(fw_priv->pages); -- fw_priv->pages = new_pages; -- fw_priv->page_array_size = new_array_size; -+ memcpy(new_pages, buf->pages, -+ buf->page_array_size * sizeof(void *)); -+ memset(&new_pages[buf->page_array_size], 0, sizeof(void *) * -+ (new_array_size - buf->page_array_size)); -+ kfree(buf->pages); -+ buf->pages = new_pages; -+ buf->page_array_size = new_array_size; - } - -- while (fw_priv->nr_pages < pages_needed) { -- fw_priv->pages[fw_priv->nr_pages] = -+ while (buf->nr_pages < pages_needed) { -+ buf->pages[buf->nr_pages] = - alloc_page(GFP_KERNEL | __GFP_HIGHMEM); - -- if (!fw_priv->pages[fw_priv->nr_pages]) { -+ if (!buf->pages[buf->nr_pages]) { - fw_load_abort(fw_priv); - return -ENOMEM; - } -- fw_priv->nr_pages++; -+ buf->nr_pages++; - } - return 0; - } -@@ -384,20 +723,21 @@ static ssize_t firmware_data_write(struct file *filp, struct kobject *kobj, - struct bin_attribute *bin_attr, - char *buffer, loff_t offset, size_t count) - { -- struct device *dev = to_dev(kobj); -+ struct device *dev = kobj_to_dev(kobj); - struct firmware_priv *fw_priv = to_firmware_priv(dev); -- struct firmware *fw; -+ struct firmware_buf *buf; - ssize_t retval; - - if (!capable(CAP_SYS_RAWIO)) - return -EPERM; - - mutex_lock(&fw_lock); -- fw = fw_priv->fw; -- if (!fw || test_bit(FW_STATUS_DONE, &fw_priv->status)) { -+ buf = fw_priv->buf; -+ if (!buf || test_bit(FW_STATUS_DONE, &buf->status)) { - retval = -ENODEV; - goto out; - } -+ - retval = fw_realloc_buffer(fw_priv, offset + count); - if (retval) - goto out; -@@ -410,17 +750,17 @@ static ssize_t firmware_data_write(struct file *filp, struct kobject *kobj, - int page_ofs = offset & (PAGE_SIZE - 1); - int page_cnt = min_t(size_t, PAGE_SIZE - page_ofs, count); - -- page_data = kmap(fw_priv->pages[page_nr]); -+ page_data = kmap(buf->pages[page_nr]); - - memcpy(page_data + page_ofs, buffer, page_cnt); - -- kunmap(fw_priv->pages[page_nr]); -+ kunmap(buf->pages[page_nr]); - buffer += page_cnt; - offset += page_cnt; - count -= page_cnt; - } - -- fw->size = max_t(size_t, offset, fw->size); -+ buf->size = max_t(size_t, offset, buf->size); - out: - mutex_unlock(&fw_lock); - return retval; -@@ -433,11 +773,18 @@ static struct bin_attribute firmware_attr_data = { - .write = firmware_data_write, - }; - --static void firmware_class_timeout(u_long data) -+static void firmware_class_timeout_work(struct work_struct *work) - { -- struct firmware_priv *fw_priv = (struct firmware_priv *) data; -+ struct firmware_priv *fw_priv = container_of(work, -+ struct firmware_priv, timeout_work.work); - -+ mutex_lock(&fw_lock); -+ if (test_bit(FW_STATUS_DONE, &(fw_priv->buf->status))) { -+ mutex_unlock(&fw_lock); -+ return; -+ } - fw_load_abort(fw_priv); -+ mutex_unlock(&fw_lock); - } - - static struct firmware_priv * -@@ -447,70 +794,38 @@ fw_create_instance(struct firmware *firmware, const char *fw_name, - struct firmware_priv *fw_priv; - struct device *f_dev; - -- fw_priv = kzalloc(sizeof(*fw_priv) + strlen(fw_name) + 1 , GFP_KERNEL); -+ fw_priv = kzalloc(sizeof(*fw_priv), GFP_KERNEL); - if (!fw_priv) { - dev_err(device, "%s: kmalloc failed\n", __func__); -- return ERR_PTR(-ENOMEM); -+ fw_priv = ERR_PTR(-ENOMEM); -+ goto exit; - } - -- fw_priv->fw = firmware; - fw_priv->nowait = nowait; -- strcpy(fw_priv->fw_id, fw_name); -- init_completion(&fw_priv->completion); -- setup_timer(&fw_priv->timeout, -- firmware_class_timeout, (u_long) fw_priv); -+ fw_priv->fw = firmware; -+ INIT_DELAYED_WORK(&fw_priv->timeout_work, -+ firmware_class_timeout_work); - - f_dev = &fw_priv->dev; - - device_initialize(f_dev); -- dev_set_name(f_dev, "%s", dev_name(device)); -+ dev_set_name(f_dev, "%s", fw_name); - f_dev->parent = device; - f_dev->class = &firmware_class; -- -+exit: - return fw_priv; - } - --static struct firmware_priv * --_request_firmware_prepare(const struct firmware **firmware_p, const char *name, -- struct device *device, bool uevent, bool nowait) --{ -- struct firmware *firmware; -- struct firmware_priv *fw_priv; -- -- if (!firmware_p) -- return ERR_PTR(-EINVAL); -- -- *firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL); -- if (!firmware) { -- dev_err(device, "%s: kmalloc(struct firmware) failed\n", -- __func__); -- return ERR_PTR(-ENOMEM); -- } -- -- if (fw_get_builtin_firmware(firmware, name)) { -- dev_dbg(device, "firmware: using built-in firmware %s\n", name); -- return NULL; -- } -- -- fw_priv = fw_create_instance(firmware, name, device, uevent, nowait); -- if (IS_ERR(fw_priv)) { -- release_firmware(firmware); -- *firmware_p = NULL; -- } -- return fw_priv; --} -- --static void _request_firmware_cleanup(const struct firmware **firmware_p) --{ -- release_firmware(*firmware_p); -- *firmware_p = NULL; --} -- -+/* load a firmware via user helper */ - static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent, - long timeout) - { - int retval = 0; - struct device *f_dev = &fw_priv->dev; -+ struct firmware_buf *buf = fw_priv->buf; -+ -+ /* fall back on userspace loading */ -+ buf->is_paged_buf = true; - - dev_set_uevent_suppress(f_dev, true); - -@@ -537,24 +852,18 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent, - - if (uevent) { - dev_set_uevent_suppress(f_dev, false); -- dev_dbg(f_dev, "firmware: requesting %s\n", fw_priv->fw_id); -+ dev_dbg(f_dev, "firmware: requesting %s\n", buf->fw_id); - if (timeout != MAX_SCHEDULE_TIMEOUT) -- mod_timer(&fw_priv->timeout, -- round_jiffies_up(jiffies + timeout)); -+ schedule_delayed_work(&fw_priv->timeout_work, timeout); - - kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD); - } - -- wait_for_completion(&fw_priv->completion); -+ wait_for_completion(&buf->completion); - -- set_bit(FW_STATUS_DONE, &fw_priv->status); -- del_timer_sync(&fw_priv->timeout); -+ cancel_delayed_work_sync(&fw_priv->timeout_work); - -- mutex_lock(&fw_lock); -- if (!fw_priv->fw->size || test_bit(FW_STATUS_ABORT, &fw_priv->status)) -- retval = -ENOENT; -- fw_priv->fw = NULL; -- mutex_unlock(&fw_lock); -+ fw_priv->buf = NULL; - - device_remove_file(f_dev, &dev_attr_loading); - err_del_bin_attr: -@@ -566,6 +875,186 @@ err_put_dev: - return retval; - } - -+static int fw_load_from_user_helper(struct firmware *firmware, -+ const char *name, struct device *device, -+ bool uevent, bool nowait, long timeout) -+{ -+ struct firmware_priv *fw_priv; -+ -+ fw_priv = fw_create_instance(firmware, name, device, uevent, nowait); -+ if (IS_ERR(fw_priv)) -+ return PTR_ERR(fw_priv); -+ -+ fw_priv->buf = firmware->priv; -+ return _request_firmware_load(fw_priv, uevent, timeout); -+} -+#else /* CONFIG_FW_LOADER_USER_HELPER */ -+static inline int -+fw_load_from_user_helper(struct firmware *firmware, const char *name, -+ struct device *device, bool uevent, bool nowait, -+ long timeout) -+{ -+ return -ENOENT; -+} -+ -+/* No abort during direct loading */ -+#define is_fw_load_aborted(buf) false -+ -+#endif /* CONFIG_FW_LOADER_USER_HELPER */ -+ -+ -+/* wait until the shared firmware_buf becomes ready (or error) */ -+static int sync_cached_firmware_buf(struct firmware_buf *buf) -+{ -+ int ret = 0; -+ -+ mutex_lock(&fw_lock); -+ while (!test_bit(FW_STATUS_DONE, &buf->status)) { -+ if (is_fw_load_aborted(buf)) { -+ ret = -ENOENT; -+ break; -+ } -+ mutex_unlock(&fw_lock); -+ wait_for_completion(&buf->completion); -+ mutex_lock(&fw_lock); -+ } -+ mutex_unlock(&fw_lock); -+ return ret; -+} -+ -+/* prepare firmware and firmware_buf structs; -+ * return 0 if a firmware is already assigned, 1 if need to load one, -+ * or a negative error code -+ */ -+static int -+_request_firmware_prepare(struct firmware **firmware_p, const char *name, -+ struct device *device) -+{ -+ struct firmware *firmware; -+ struct firmware_buf *buf; -+ int ret; -+ -+ *firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL); -+ if (!firmware) { -+ dev_err(device, "%s: kmalloc(struct firmware) failed\n", -+ __func__); -+ return -ENOMEM; -+ } -+ -+ if (fw_get_builtin_firmware(firmware, name)) { -+ dev_dbg(device, "firmware: using built-in firmware %s\n", name); -+ return 0; /* assigned */ -+ } -+ -+ ret = fw_lookup_and_allocate_buf(name, &fw_cache, &buf); -+ -+ /* -+ * bind with 'buf' now to avoid warning in failure path -+ * of requesting firmware. -+ */ -+ firmware->priv = buf; -+ -+ if (ret > 0) { -+ ret = sync_cached_firmware_buf(buf); -+ if (!ret) { -+ fw_set_page_data(buf, firmware); -+ return 0; /* assigned */ -+ } -+ } -+ -+ if (ret < 0) -+ return ret; -+ return 1; /* need to load */ -+} -+ -+static int assign_firmware_buf(struct firmware *fw, struct device *device) -+{ -+ struct firmware_buf *buf = fw->priv; -+ -+ mutex_lock(&fw_lock); -+ if (!buf->size || is_fw_load_aborted(buf)) { -+ mutex_unlock(&fw_lock); -+ return -ENOENT; -+ } -+ -+ /* -+ * add firmware name into devres list so that we can auto cache -+ * and uncache firmware for device. -+ * -+ * device may has been deleted already, but the problem -+ * should be fixed in devres or driver core. -+ */ -+ if (device) -+ fw_add_devm_name(device, buf->fw_id); -+ -+ /* -+ * After caching firmware image is started, let it piggyback -+ * on request firmware. -+ */ -+ if (buf->fwc->state == FW_LOADER_START_CACHE) { -+ if (fw_cache_piggyback_on_request(buf->fw_id)) -+ kref_get(&buf->ref); -+ } -+ -+ /* pass the pages buffer to driver at the last minute */ -+ fw_set_page_data(buf, fw); -+ mutex_unlock(&fw_lock); -+ return 0; -+} -+ -+/* called from request_firmware() and request_firmware_work_func() */ -+static int -+_request_firmware(const struct firmware **firmware_p, const char *name, -+ struct device *device, bool uevent, bool nowait) -+{ -+ struct firmware *fw; -+ long timeout; -+ int ret; -+ -+ if (!firmware_p) -+ return -EINVAL; -+ -+ ret = _request_firmware_prepare(&fw, name, device); -+ if (ret <= 0) /* error or already assigned */ -+ goto out; -+ -+ ret = 0; -+ timeout = firmware_loading_timeout(); -+ if (nowait) { -+ timeout = usermodehelper_read_lock_wait(timeout); -+ if (!timeout) { -+ dev_dbg(device, "firmware: %s loading timed out\n", -+ name); -+ ret = -EBUSY; -+ goto out; -+ } -+ } else { -+ ret = usermodehelper_read_trylock(); -+ if (WARN_ON(ret)) { -+ dev_err(device, "firmware: %s will not be loaded\n", -+ name); -+ goto out; -+ } -+ } -+ -+ if (!fw_get_filesystem_firmware(device, fw->priv)) -+ ret = fw_load_from_user_helper(fw, name, device, -+ uevent, nowait, timeout); -+ if (!ret) -+ ret = assign_firmware_buf(fw, device); -+ -+ usermodehelper_read_unlock(); -+ -+ out: -+ if (ret < 0) { -+ release_firmware(fw); -+ fw = NULL; -+ } -+ -+ *firmware_p = fw; -+ return ret; -+} -+ - /** - * request_firmware: - send firmware request and wait for it - * @firmware_p: pointer to firmware image -@@ -580,31 +1069,17 @@ err_put_dev: - * @name will be used as $FIRMWARE in the uevent environment and - * should be distinctive enough not to be confused with any other - * firmware image for this or any other device. -+ * -+ * Caller must hold the reference count of @device. -+ * -+ * The function can be called safely inside device's suspend and -+ * resume callback. - **/ - int - request_firmware(const struct firmware **firmware_p, const char *name, - struct device *device) - { -- struct firmware_priv *fw_priv; -- int ret; -- -- fw_priv = _request_firmware_prepare(firmware_p, name, device, true, -- false); -- if (IS_ERR_OR_NULL(fw_priv)) -- return PTR_RET(fw_priv); -- -- ret = usermodehelper_read_trylock(); -- if (WARN_ON(ret)) { -- dev_err(device, "firmware: %s will not be loaded\n", name); -- } else { -- ret = _request_firmware_load(fw_priv, true, -- firmware_loading_timeout()); -- usermodehelper_read_unlock(); -- } -- if (ret) -- _request_firmware_cleanup(firmware_p); -- -- return ret; -+ return _request_firmware(firmware_p, name, device, true, false); - } - - /** -@@ -635,32 +1110,13 @@ static void request_firmware_work_func(struct work_struct *work) - { - struct firmware_work *fw_work; - const struct firmware *fw; -- struct firmware_priv *fw_priv; -- long timeout; -- int ret; - - fw_work = container_of(work, struct firmware_work, work); -- fw_priv = _request_firmware_prepare(&fw, fw_work->name, fw_work->device, -- fw_work->uevent, true); -- if (IS_ERR_OR_NULL(fw_priv)) { -- ret = PTR_RET(fw_priv); -- goto out; -- } -- -- timeout = usermodehelper_read_lock_wait(firmware_loading_timeout()); -- if (timeout) { -- ret = _request_firmware_load(fw_priv, fw_work->uevent, timeout); -- usermodehelper_read_unlock(); -- } else { -- dev_dbg(fw_work->device, "firmware: %s loading timed out\n", -- fw_work->name); -- ret = -EAGAIN; -- } -- if (ret) -- _request_firmware_cleanup(&fw); - -- out: -+ _request_firmware(&fw, fw_work->name, fw_work->device, -+ fw_work->uevent, true); - fw_work->cont(fw, fw_work->context); -+ put_device(fw_work->device); /* taken in request_firmware_nowait() */ - - module_put(fw_work->module); - kfree(fw_work); -@@ -679,9 +1135,15 @@ static void request_firmware_work_func(struct work_struct *work) - * @cont: function will be called asynchronously when the firmware - * request is over. - * -- * Asynchronous variant of request_firmware() for user contexts where -- * it is not possible to sleep for long time. It can't be called -- * in atomic contexts. -+ * Caller must hold the reference count of @device. -+ * -+ * Asynchronous variant of request_firmware() for user contexts: -+ * - sleep for as small periods as possible since it may -+ * increase kernel boot time of built-in device drivers -+ * requesting firmware in their ->probe() methods, if -+ * @gfp is GFP_KERNEL. -+ * -+ * - can't sleep at all if @gfp is GFP_ATOMIC. - **/ - int - request_firmware_nowait( -@@ -707,19 +1169,391 @@ request_firmware_nowait( - return -EFAULT; - } - -+ get_device(fw_work->device); - INIT_WORK(&fw_work->work, request_firmware_work_func); - schedule_work(&fw_work->work); - return 0; - } - -+/** -+ * cache_firmware - cache one firmware image in kernel memory space -+ * @fw_name: the firmware image name -+ * -+ * Cache firmware in kernel memory so that drivers can use it when -+ * system isn't ready for them to request firmware image from userspace. -+ * Once it returns successfully, driver can use request_firmware or its -+ * nowait version to get the cached firmware without any interacting -+ * with userspace -+ * -+ * Return 0 if the firmware image has been cached successfully -+ * Return !0 otherwise -+ * -+ */ -+int cache_firmware(const char *fw_name) -+{ -+ int ret; -+ const struct firmware *fw; -+ -+ pr_debug("%s: %s\n", __func__, fw_name); -+ -+ ret = request_firmware(&fw, fw_name, NULL); -+ if (!ret) -+ kfree(fw); -+ -+ pr_debug("%s: %s ret=%d\n", __func__, fw_name, ret); -+ -+ return ret; -+} -+ -+/** -+ * uncache_firmware - remove one cached firmware image -+ * @fw_name: the firmware image name -+ * -+ * Uncache one firmware image which has been cached successfully -+ * before. -+ * -+ * Return 0 if the firmware cache has been removed successfully -+ * Return !0 otherwise -+ * -+ */ -+int uncache_firmware(const char *fw_name) -+{ -+ struct firmware_buf *buf; -+ struct firmware fw; -+ -+ pr_debug("%s: %s\n", __func__, fw_name); -+ -+ if (fw_get_builtin_firmware(&fw, fw_name)) -+ return 0; -+ -+ buf = fw_lookup_buf(fw_name); -+ if (buf) { -+ fw_free_buf(buf); -+ return 0; -+ } -+ -+ return -EINVAL; -+} -+ -+#ifdef CONFIG_PM_SLEEP -+static struct fw_cache_entry *alloc_fw_cache_entry(const char *name) -+{ -+ struct fw_cache_entry *fce; -+ -+ fce = kzalloc(sizeof(*fce) + strlen(name) + 1, GFP_ATOMIC); -+ if (!fce) -+ goto exit; -+ -+ strcpy(fce->name, name); -+exit: -+ return fce; -+} -+ -+static int __fw_entry_found(const char *name) -+{ -+ struct firmware_cache *fwc = &fw_cache; -+ struct fw_cache_entry *fce; -+ -+ list_for_each_entry(fce, &fwc->fw_names, list) { -+ if (!strcmp(fce->name, name)) -+ return 1; -+ } -+ return 0; -+} -+ -+static int fw_cache_piggyback_on_request(const char *name) -+{ -+ struct firmware_cache *fwc = &fw_cache; -+ struct fw_cache_entry *fce; -+ int ret = 0; -+ -+ spin_lock(&fwc->name_lock); -+ if (__fw_entry_found(name)) -+ goto found; -+ -+ fce = alloc_fw_cache_entry(name); -+ if (fce) { -+ ret = 1; -+ list_add(&fce->list, &fwc->fw_names); -+ pr_debug("%s: fw: %s\n", __func__, name); -+ } -+found: -+ spin_unlock(&fwc->name_lock); -+ return ret; -+} -+ -+static void free_fw_cache_entry(struct fw_cache_entry *fce) -+{ -+ kfree(fce); -+} -+ -+static void __async_dev_cache_fw_image(void *fw_entry, -+ async_cookie_t cookie) -+{ -+ struct fw_cache_entry *fce = fw_entry; -+ struct firmware_cache *fwc = &fw_cache; -+ int ret; -+ -+ ret = cache_firmware(fce->name); -+ if (ret) { -+ spin_lock(&fwc->name_lock); -+ list_del(&fce->list); -+ spin_unlock(&fwc->name_lock); -+ -+ free_fw_cache_entry(fce); -+ } -+ -+ spin_lock(&fwc->name_lock); -+ fwc->cnt--; -+ spin_unlock(&fwc->name_lock); -+ -+ wake_up(&fwc->wait_queue); -+} -+ -+/* called with dev->devres_lock held */ -+static void dev_create_fw_entry(struct device *dev, void *res, -+ void *data) -+{ -+ struct fw_name_devm *fwn = res; -+ const char *fw_name = fwn->name; -+ struct list_head *head = data; -+ struct fw_cache_entry *fce; -+ -+ fce = alloc_fw_cache_entry(fw_name); -+ if (fce) -+ list_add(&fce->list, head); -+} -+ -+static int devm_name_match(struct device *dev, void *res, -+ void *match_data) -+{ -+ struct fw_name_devm *fwn = res; -+ return (fwn->magic == (unsigned long)match_data); -+} -+ -+static void dev_cache_fw_image(struct device *dev, void *data) -+{ -+ LIST_HEAD(todo); -+ struct fw_cache_entry *fce; -+ struct fw_cache_entry *fce_next; -+ struct firmware_cache *fwc = &fw_cache; -+ -+ devres_for_each_res(dev, fw_name_devm_release, -+ devm_name_match, &fw_cache, -+ dev_create_fw_entry, &todo); -+ -+ list_for_each_entry_safe(fce, fce_next, &todo, list) { -+ list_del(&fce->list); -+ -+ spin_lock(&fwc->name_lock); -+ /* only one cache entry for one firmware */ -+ if (!__fw_entry_found(fce->name)) { -+ fwc->cnt++; -+ list_add(&fce->list, &fwc->fw_names); -+ } else { -+ free_fw_cache_entry(fce); -+ fce = NULL; -+ } -+ spin_unlock(&fwc->name_lock); -+ -+ if (fce) -+ async_schedule(__async_dev_cache_fw_image, -+ (void *)fce); -+ } -+} -+ -+static void __device_uncache_fw_images(void) -+{ -+ struct firmware_cache *fwc = &fw_cache; -+ struct fw_cache_entry *fce; -+ -+ spin_lock(&fwc->name_lock); -+ while (!list_empty(&fwc->fw_names)) { -+ fce = list_entry(fwc->fw_names.next, -+ struct fw_cache_entry, list); -+ list_del(&fce->list); -+ spin_unlock(&fwc->name_lock); -+ -+ uncache_firmware(fce->name); -+ free_fw_cache_entry(fce); -+ -+ spin_lock(&fwc->name_lock); -+ } -+ spin_unlock(&fwc->name_lock); -+} -+ -+/** -+ * device_cache_fw_images - cache devices' firmware -+ * -+ * If one device called request_firmware or its nowait version -+ * successfully before, the firmware names are recored into the -+ * device's devres link list, so device_cache_fw_images can call -+ * cache_firmware() to cache these firmwares for the device, -+ * then the device driver can load its firmwares easily at -+ * time when system is not ready to complete loading firmware. -+ */ -+static void device_cache_fw_images(void) -+{ -+ struct firmware_cache *fwc = &fw_cache; -+ int old_timeout; -+ DEFINE_WAIT(wait); -+ -+ pr_debug("%s\n", __func__); -+ -+ /* cancel uncache work */ -+ cancel_delayed_work_sync(&fwc->work); -+ -+ /* -+ * use small loading timeout for caching devices' firmware -+ * because all these firmware images have been loaded -+ * successfully at lease once, also system is ready for -+ * completing firmware loading now. The maximum size of -+ * firmware in current distributions is about 2M bytes, -+ * so 10 secs should be enough. -+ */ -+ old_timeout = loading_timeout; -+ loading_timeout = 10; -+ -+ mutex_lock(&fw_lock); -+ fwc->state = FW_LOADER_START_CACHE; -+ dpm_for_each_dev(NULL, dev_cache_fw_image); -+ mutex_unlock(&fw_lock); -+ -+ /* wait for completion of caching firmware for all devices */ -+ spin_lock(&fwc->name_lock); -+ for (;;) { -+ prepare_to_wait(&fwc->wait_queue, &wait, -+ TASK_UNINTERRUPTIBLE); -+ if (!fwc->cnt) -+ break; -+ -+ spin_unlock(&fwc->name_lock); -+ -+ schedule(); -+ -+ spin_lock(&fwc->name_lock); -+ } -+ spin_unlock(&fwc->name_lock); -+ finish_wait(&fwc->wait_queue, &wait); -+ -+ loading_timeout = old_timeout; -+} -+ -+/** -+ * device_uncache_fw_images - uncache devices' firmware -+ * -+ * uncache all firmwares which have been cached successfully -+ * by device_uncache_fw_images earlier -+ */ -+static void device_uncache_fw_images(void) -+{ -+ pr_debug("%s\n", __func__); -+ __device_uncache_fw_images(); -+} -+ -+static void device_uncache_fw_images_work(struct work_struct *work) -+{ -+ device_uncache_fw_images(); -+} -+ -+/** -+ * device_uncache_fw_images_delay - uncache devices firmwares -+ * @delay: number of milliseconds to delay uncache device firmwares -+ * -+ * uncache all devices's firmwares which has been cached successfully -+ * by device_cache_fw_images after @delay milliseconds. -+ */ -+static void device_uncache_fw_images_delay(unsigned long delay) -+{ -+ schedule_delayed_work(&fw_cache.work, -+ msecs_to_jiffies(delay)); -+} -+ -+static int fw_pm_notify(struct notifier_block *notify_block, -+ unsigned long mode, void *unused) -+{ -+ switch (mode) { -+ case PM_HIBERNATION_PREPARE: -+ case PM_SUSPEND_PREPARE: -+ device_cache_fw_images(); -+ break; -+ -+ case PM_POST_SUSPEND: -+ case PM_POST_HIBERNATION: -+ case PM_POST_RESTORE: -+ /* -+ * In case that system sleep failed and syscore_suspend is -+ * not called. -+ */ -+ mutex_lock(&fw_lock); -+ fw_cache.state = FW_LOADER_NO_CACHE; -+ mutex_unlock(&fw_lock); -+ -+ device_uncache_fw_images_delay(10 * MSEC_PER_SEC); -+ break; -+ } -+ -+ return 0; -+} -+ -+/* stop caching firmware once syscore_suspend is reached */ -+static int fw_suspend(void) -+{ -+ fw_cache.state = FW_LOADER_NO_CACHE; -+ return 0; -+} -+ -+static struct syscore_ops fw_syscore_ops = { -+ .suspend = fw_suspend, -+}; -+#else -+static int fw_cache_piggyback_on_request(const char *name) -+{ -+ return 0; -+} -+#endif -+ -+static void __init fw_cache_init(void) -+{ -+ spin_lock_init(&fw_cache.lock); -+ INIT_LIST_HEAD(&fw_cache.head); -+ fw_cache.state = FW_LOADER_NO_CACHE; -+ -+#ifdef CONFIG_PM_SLEEP -+ spin_lock_init(&fw_cache.name_lock); -+ INIT_LIST_HEAD(&fw_cache.fw_names); -+ fw_cache.cnt = 0; -+ -+ init_waitqueue_head(&fw_cache.wait_queue); -+ INIT_DELAYED_WORK(&fw_cache.work, -+ device_uncache_fw_images_work); -+ -+ fw_cache.pm_notify.notifier_call = fw_pm_notify; -+ register_pm_notifier(&fw_cache.pm_notify); -+ -+ register_syscore_ops(&fw_syscore_ops); -+#endif -+} -+ - static int __init firmware_class_init(void) - { -+ fw_cache_init(); -+#ifdef CONFIG_FW_LOADER_USER_HELPER - return class_register(&firmware_class); -+#else -+ return 0; -+#endif - } - - static void __exit firmware_class_exit(void) - { -+#ifdef CONFIG_PM_SLEEP -+ unregister_syscore_ops(&fw_syscore_ops); -+ unregister_pm_notifier(&fw_cache.pm_notify); -+#endif -+#ifdef CONFIG_FW_LOADER_USER_HELPER - class_unregister(&firmware_class); -+#endif - } - - fs_initcall(firmware_class_init); -@@ -728,3 +1562,5 @@ module_exit(firmware_class_exit); - EXPORT_SYMBOL(release_firmware); - EXPORT_SYMBOL(request_firmware); - EXPORT_SYMBOL(request_firmware_nowait); -+EXPORT_SYMBOL_GPL(cache_firmware); -+EXPORT_SYMBOL_GPL(uncache_firmware); -diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c -index 77e3b97..8bde48f 100644 ---- a/drivers/base/power/main.c -+++ b/drivers/base/power/main.c -@@ -1387,3 +1387,25 @@ int device_pm_wait_for_dev(struct device *subordinate, struct device *dev) - return async_error; - } - EXPORT_SYMBOL_GPL(device_pm_wait_for_dev); -+ -+/** -+ * dpm_for_each_dev - device iterator. -+ * @data: data for the callback. -+ * @fn: function to be called for each device. -+ * -+ * Iterate over devices in dpm_list, and call @fn for each device, -+ * passing it @data. -+ */ -+void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *)) -+{ -+ struct device *dev; -+ -+ if (!fn) -+ return; -+ -+ device_pm_lock(); -+ list_for_each_entry(dev, &dpm_list, power.entry) -+ fn(dev, data); -+ device_pm_unlock(); -+} -+EXPORT_SYMBOL_GPL(dpm_for_each_dev); -diff --git a/include/linux/device.h b/include/linux/device.h -index 5ad17cc..ad8904d 100644 ---- a/include/linux/device.h -+++ b/include/linux/device.h -@@ -531,6 +531,10 @@ extern void *__devres_alloc(dr_release_t release, size_t size, gfp_t gfp, - #else - extern void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp); - #endif -+extern void devres_for_each_res(struct device *dev, dr_release_t release, -+ dr_match_t match, void *match_data, -+ void (*fn)(struct device *, void *, void *), -+ void *data); - extern void devres_free(void *res); - extern void devres_add(struct device *dev, void *res); - extern void *devres_find(struct device *dev, dr_release_t release, -@@ -541,6 +545,8 @@ extern void *devres_remove(struct device *dev, dr_release_t release, - dr_match_t match, void *match_data); - extern int devres_destroy(struct device *dev, dr_release_t release, - dr_match_t match, void *match_data); -+extern int devres_release(struct device *dev, dr_release_t release, -+ dr_match_t match, void *match_data); - - /* devres group */ - extern void * __must_check devres_open_group(struct device *dev, void *id, -diff --git a/include/linux/firmware.h b/include/linux/firmware.h -index 1e7c011..e4279fe 100644 ---- a/include/linux/firmware.h -+++ b/include/linux/firmware.h -@@ -12,6 +12,9 @@ struct firmware { - size_t size; - const u8 *data; - struct page **pages; -+ -+ /* firmware loader private fields */ -+ void *priv; - }; - - struct module; -@@ -44,6 +47,8 @@ int request_firmware_nowait( - void (*cont)(const struct firmware *fw, void *context)); - - void release_firmware(const struct firmware *fw); -+int cache_firmware(const char *name); -+int uncache_firmware(const char *name); - #else - static inline int request_firmware(const struct firmware **fw, - const char *name, -@@ -62,6 +67,16 @@ static inline int request_firmware_nowait( - static inline void release_firmware(const struct firmware *fw) - { - } -+ -+static inline int cache_firmware(const char *name) -+{ -+ return -ENOENT; -+} -+ -+static inline int uncache_firmware(const char *name) -+{ -+ return -EINVAL; -+} - #endif - - #endif -diff --git a/include/linux/pm.h b/include/linux/pm.h -index f067e60..88f034a 100644 ---- a/include/linux/pm.h -+++ b/include/linux/pm.h -@@ -638,6 +638,7 @@ extern void __suspend_report_result(const char *function, void *fn, int ret); - } while (0) - - extern int device_pm_wait_for_dev(struct device *sub, struct device *dev); -+extern void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *)); - - extern int pm_generic_prepare(struct device *dev); - extern int pm_generic_suspend_late(struct device *dev); -@@ -677,6 +678,10 @@ static inline int device_pm_wait_for_dev(struct device *a, struct device *b) - return 0; - } - -+static inline void dpm_for_each_dev(void *data, void (*fn)(struct device *, void *)) -+{ -+} -+ - #define pm_generic_prepare NULL - #define pm_generic_suspend NULL - #define pm_generic_resume NULL --- -2.1.3 - diff --git a/core/linux-sun4i/0001-Backport-msdos-partition-UUIDs.patch b/core/linux-sun4i/0001-Backport-msdos-partition-UUIDs.patch deleted file mode 100644 index 13a78d344..000000000 --- a/core/linux-sun4i/0001-Backport-msdos-partition-UUIDs.patch +++ /dev/null @@ -1,632 +0,0 @@ -From dbef9fc3e1410edcd553989a3ddc1120609a5ad3 Mon Sep 17 00:00:00 2001 -From: Kevin Mihelich -Date: Fri, 2 Jan 2015 19:50:37 -0700 -Subject: [PATCH] Backport msdos partition UUIDs - -Squashed commit of the following: - -commit 2819ae1987539215d1ce91d80d831e0350107e1e -Author: Stephen Warren -Date: Thu Nov 8 16:12:28 2012 -0800 - - block: partition: msdos: provide UUIDs for partitions - - The MSDOS/MBR partition table includes a 32-bit unique ID, often referred - to as the NT disk signature. When combined with a partition number within - the table, this can form a unique ID similar in concept to EFI/GPT's - partition UUID. Constructing and recording this value in struct - partition_meta_info allows MSDOS partitions to be referred to on the - kernel command-line using the following syntax: - - root=PARTUUID=0002dd75-01 - - Signed-off-by: Stephen Warren - Cc: Tejun Heo - Cc: Will Drewry - Cc: Kay Sievers - Signed-off-by: Andrew Morton - Signed-off-by: Jens Axboe - -commit a4f7d3032fb20f11722d266f678a004ec0f9f0b1 -Author: Stephen Warren -Date: Thu Nov 8 16:12:27 2012 -0800 - - init: reduce PARTUUID min length to 1 from 36 - - Reduce the minimum length for a root=PARTUUID= parameter to be considered - valid from 36 to 1. EFI/GPT partition UUIDs are always exactly 36 - characters long, hence the previous limit. However, the next patch will - support DOS/MBR UUIDs too, which have a different, shorter, format. - Instead of validating any particular length, just ensure that at least - some non-empty value was given by the user. - - Also, consider a missing UUID value to be a parsing error, in the same - vein as if /PARTNROFF exists and can't be parsed. As such, make both - error cases print a message and disable rootwait. Convert to pr_err while - we're at it. - - Signed-off-by: Stephen Warren - Cc: Tejun Heo - Cc: Will Drewry - Cc: Kay Sievers - Signed-off-by: Andrew Morton - Signed-off-by: Jens Axboe - -commit 0422f1d96772bf35a14bc87f3bb603b9ff825799 -Author: Stephen Warren -Date: Thu Nov 8 16:12:25 2012 -0800 - - block: store partition_meta_info.uuid as a string - - This will allow other types of UUID to be stored here, aside from true - UUIDs. This also simplifies code that uses this field, since it's usually - constructed from a, used as a, or compared to other, strings. - - Note: A simplistic approach here would be to set uuid_str[36]=0 whenever a - /PARTNROFF option was found to be present. However, this modifies the - input string, and causes subsequent calls to devt_from_partuuid() not to - see the /PARTNROFF option, which causes different results. In order to - avoid misleading future maintainers, this parameter is marked const. - - Signed-off-by: Stephen Warren - Cc: Tejun Heo - Cc: Will Drewry - Cc: Kay Sievers - Signed-off-by: Andrew Morton - Signed-off-by: Jens Axboe - -commit 152f0b9a9d1d0ee8c01eaa1dda689bd5d0f9d512 -Author: Vivek Goyal -Date: Wed Aug 1 12:24:18 2012 +0200 - - block: add partition resize function to blkpg ioctl - - Add a new operation code (BLKPG_RESIZE_PARTITION) to the BLKPG ioctl that - allows altering the size of an existing partition, even if it is currently - in use. - - This patch converts hd_struct->nr_sects into sequence counter because - One might extend a partition while IO is happening to it and update of - nr_sects can be non-atomic on 32bit machines with 64bit sector_t. This - can lead to issues like reading inconsistent size of a partition. Sequence - counter have been used so that readers don't have to take bdev mutex lock - as we call sector_in_part() very frequently. - - Now all the access to hd_struct->nr_sects should happen using sequence - counter read/update helper functions part_nr_sects_read/part_nr_sects_write. - There is one exception though, set_capacity()/get_capacity(). I think - theoritically race should exist there too but this patch does not - modify set_capacity()/get_capacity() due to sheer number of call sites - and I am afraid that change might break something. I have left that as a - TODO item. We can handle it later if need be. This patch does not introduce - any new races as such w.r.t set_capacity()/get_capacity(). - - v2: Add CONFIG_LBDAF test to UP preempt case as suggested by Phillip. - - Signed-off-by: Vivek Goyal - Signed-off-by: Phillip Susi - Signed-off-by: Jens Axboe ---- - block/genhd.c | 28 +++++++++++--------- - block/ioctl.c | 59 +++++++++++++++++++++++++++++++++++++++--- - block/partition-generic.c | 4 ++- - block/partitions/efi.c | 7 +---- - block/partitions/msdos.c | 21 +++++++++++++-- - include/linux/blkpg.h | 1 + - include/linux/genhd.h | 65 +++++++++++++++++++++++++++++++++++++++++++++-- - init/do_mounts.c | 61 +++++++++++++++++++++++++++++--------------- - 8 files changed, 199 insertions(+), 47 deletions(-) - -diff --git a/block/genhd.c b/block/genhd.c -index dd44885..3d9d3f59 100644 ---- a/block/genhd.c -+++ b/block/genhd.c -@@ -154,7 +154,7 @@ struct hd_struct *disk_part_iter_next(struct disk_part_iter *piter) - part = rcu_dereference(ptbl->part[piter->idx]); - if (!part) - continue; -- if (!part->nr_sects && -+ if (!part_nr_sects_read(part) && - !(piter->flags & DISK_PITER_INCL_EMPTY) && - !(piter->flags & DISK_PITER_INCL_EMPTY_PART0 && - piter->idx == 0)) -@@ -191,7 +191,7 @@ EXPORT_SYMBOL_GPL(disk_part_iter_exit); - static inline int sector_in_part(struct hd_struct *part, sector_t sector) - { - return part->start_sect <= sector && -- sector < part->start_sect + part->nr_sects; -+ sector < part->start_sect + part_nr_sects_read(part); - } - - /** -@@ -744,7 +744,6 @@ void __init printk_all_partitions(void) - struct hd_struct *part; - char name_buf[BDEVNAME_SIZE]; - char devt_buf[BDEVT_SIZE]; -- char uuid_buf[PARTITION_META_INFO_UUIDLTH * 2 + 5]; - - /* - * Don't show empty devices or things that have been -@@ -763,16 +762,11 @@ void __init printk_all_partitions(void) - while ((part = disk_part_iter_next(&piter))) { - bool is_part0 = part == &disk->part0; - -- uuid_buf[0] = '\0'; -- if (part->info) -- snprintf(uuid_buf, sizeof(uuid_buf), "%pU", -- part->info->uuid); -- - printk("%s%s %10llu %s %s", is_part0 ? "" : " ", - bdevt_str(part_devt(part), devt_buf), -- (unsigned long long)part->nr_sects >> 1, -- disk_name(disk, part->partno, name_buf), -- uuid_buf); -+ (unsigned long long)part_nr_sects_read(part) >> 1 -+ , disk_name(disk, part->partno, name_buf), -+ part->info ? part->info->uuid : ""); - if (is_part0) { - if (disk->driverfs_dev != NULL && - disk->driverfs_dev->driver != NULL) -@@ -863,7 +857,7 @@ static int show_partition(struct seq_file *seqf, void *v) - while ((part = disk_part_iter_next(&piter))) - seq_printf(seqf, "%4d %7d %10llu %s\n", - MAJOR(part_devt(part)), MINOR(part_devt(part)), -- (unsigned long long)part->nr_sects >> 1, -+ (unsigned long long)part_nr_sects_read(part) >> 1, - disk_name(sgp, part->partno, buf)); - disk_part_iter_exit(&piter); - -@@ -1286,6 +1280,16 @@ struct gendisk *alloc_disk_node(int minors, int node_id) - } - disk->part_tbl->part[0] = &disk->part0; - -+ /* -+ * set_capacity() and get_capacity() currently don't use -+ * seqcounter to read/update the part0->nr_sects. Still init -+ * the counter as we can read the sectors in IO submission -+ * patch using seqence counters. -+ * -+ * TODO: Ideally set_capacity() and get_capacity() should be -+ * converted to make use of bd_mutex and sequence counters. -+ */ -+ seqcount_init(&disk->part0.nr_sects_seq); - hd_ref_init(&disk->part0); - - disk->minors = minors; -diff --git a/block/ioctl.c b/block/ioctl.c -index ba15b2d..4476e0e8 100644 ---- a/block/ioctl.c -+++ b/block/ioctl.c -@@ -13,7 +13,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user - { - struct block_device *bdevp; - struct gendisk *disk; -- struct hd_struct *part; -+ struct hd_struct *part, *lpart; - struct blkpg_ioctl_arg a; - struct blkpg_partition p; - struct disk_part_iter piter; -@@ -36,8 +36,8 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user - case BLKPG_ADD_PARTITION: - start = p.start >> 9; - length = p.length >> 9; -- /* check for fit in a hd_struct */ -- if (sizeof(sector_t) == sizeof(long) && -+ /* check for fit in a hd_struct */ -+ if (sizeof(sector_t) == sizeof(long) && - sizeof(long long) > sizeof(long)) { - long pstart = start, plength = length; - if (pstart != start || plength != length -@@ -92,6 +92,59 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user - bdput(bdevp); - - return 0; -+ case BLKPG_RESIZE_PARTITION: -+ start = p.start >> 9; -+ /* new length of partition in bytes */ -+ length = p.length >> 9; -+ /* check for fit in a hd_struct */ -+ if (sizeof(sector_t) == sizeof(long) && -+ sizeof(long long) > sizeof(long)) { -+ long pstart = start, plength = length; -+ if (pstart != start || plength != length -+ || pstart < 0 || plength < 0) -+ return -EINVAL; -+ } -+ part = disk_get_part(disk, partno); -+ if (!part) -+ return -ENXIO; -+ bdevp = bdget(part_devt(part)); -+ if (!bdevp) { -+ disk_put_part(part); -+ return -ENOMEM; -+ } -+ mutex_lock(&bdevp->bd_mutex); -+ mutex_lock_nested(&bdev->bd_mutex, 1); -+ if (start != part->start_sect) { -+ mutex_unlock(&bdevp->bd_mutex); -+ mutex_unlock(&bdev->bd_mutex); -+ bdput(bdevp); -+ disk_put_part(part); -+ return -EINVAL; -+ } -+ /* overlap? */ -+ disk_part_iter_init(&piter, disk, -+ DISK_PITER_INCL_EMPTY); -+ while ((lpart = disk_part_iter_next(&piter))) { -+ if (lpart->partno != partno && -+ !(start + length <= lpart->start_sect || -+ start >= lpart->start_sect + lpart->nr_sects) -+ ) { -+ disk_part_iter_exit(&piter); -+ mutex_unlock(&bdevp->bd_mutex); -+ mutex_unlock(&bdev->bd_mutex); -+ bdput(bdevp); -+ disk_put_part(part); -+ return -EBUSY; -+ } -+ } -+ disk_part_iter_exit(&piter); -+ part_nr_sects_write(part, (sector_t)length); -+ i_size_write(bdevp->bd_inode, p.length); -+ mutex_unlock(&bdevp->bd_mutex); -+ mutex_unlock(&bdev->bd_mutex); -+ bdput(bdevp); -+ disk_put_part(part); -+ return 0; - default: - return -EINVAL; - } -diff --git a/block/partition-generic.c b/block/partition-generic.c -index 8d9281d..d5f9306 100644 ---- a/block/partition-generic.c -+++ b/block/partition-generic.c -@@ -89,7 +89,7 @@ ssize_t part_size_show(struct device *dev, - struct device_attribute *attr, char *buf) - { - struct hd_struct *p = dev_to_part(dev); -- return sprintf(buf, "%llu\n",(unsigned long long)p->nr_sects); -+ return sprintf(buf, "%llu\n",(unsigned long long)part_nr_sects_read(p)); - } - - static ssize_t part_ro_show(struct device *dev, -@@ -310,6 +310,8 @@ struct hd_struct *add_partition(struct gendisk *disk, int partno, - err = -ENOMEM; - goto out_free; - } -+ -+ seqcount_init(&p->nr_sects_seq); - pdev = part_to_dev(p); - - p->start_sect = start; -diff --git a/block/partitions/efi.c b/block/partitions/efi.c -index 6296b40..b62fb88 100644 ---- a/block/partitions/efi.c -+++ b/block/partitions/efi.c -@@ -620,7 +620,6 @@ int efi_partition(struct parsed_partitions *state) - gpt_entry *ptes = NULL; - u32 i; - unsigned ssz = bdev_logical_block_size(state->bdev) / 512; -- u8 unparsed_guid[37]; - - if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { - kfree(gpt); -@@ -649,11 +648,7 @@ int efi_partition(struct parsed_partitions *state) - state->parts[i + 1].flags = ADDPART_FLAG_RAID; - - info = &state->parts[i + 1].info; -- /* Instead of doing a manual swap to big endian, reuse the -- * common ASCII hex format as the interim. -- */ -- efi_guid_unparse(&ptes[i].unique_partition_guid, unparsed_guid); -- part_pack_uuid(unparsed_guid, info->uuid); -+ efi_guid_unparse(&ptes[i].unique_partition_guid, info->uuid); - - /* Naively convert UTF16-LE to 7 bits. */ - label_max = min(sizeof(info->volname) - 1, -diff --git a/block/partitions/msdos.c b/block/partitions/msdos.c -index 5f79a66..8752a5d 100644 ---- a/block/partitions/msdos.c -+++ b/block/partitions/msdos.c -@@ -94,6 +94,17 @@ static int aix_magic_present(struct parsed_partitions *state, unsigned char *p) - return ret; - } - -+static void set_info(struct parsed_partitions *state, int slot, -+ u32 disksig) -+{ -+ struct partition_meta_info *info = &state->parts[slot].info; -+ -+ snprintf(info->uuid, sizeof(info->uuid), "%08x-%02x", disksig, -+ slot); -+ info->volname[0] = 0; -+ state->parts[slot].has_info = true; -+} -+ - /* - * Create devices for each logical partition in an extended partition. - * The logical partitions form a linked list, with each entry being -@@ -106,7 +117,8 @@ static int aix_magic_present(struct parsed_partitions *state, unsigned char *p) - */ - - static void parse_extended(struct parsed_partitions *state, -- sector_t first_sector, sector_t first_size) -+ sector_t first_sector, sector_t first_size, -+ u32 disksig) - { - struct partition *p; - Sector sect; -@@ -166,6 +178,7 @@ static void parse_extended(struct parsed_partitions *state, - } - - put_partition(state, state->next, next, size); -+ set_info(state, state->next, disksig); - if (SYS_IND(p) == LINUX_RAID_PARTITION) - state->parts[state->next].flags = ADDPART_FLAG_RAID; - loopct = 0; -@@ -437,6 +450,7 @@ int msdos_partition(struct parsed_partitions *state) - struct partition *p; - struct fat_boot_sector *fb; - int slot; -+ u32 disksig; - - data = read_part_sector(state, 0, §); - if (!data) -@@ -491,6 +505,8 @@ int msdos_partition(struct parsed_partitions *state) - #endif - p = (struct partition *) (data + 0x1be); - -+ disksig = le32_to_cpup((__le32 *)(data + 0x1b8)); -+ - /* - * Look for partitions in two passes: - * First find the primary and DOS-type extended partitions. -@@ -515,11 +531,12 @@ int msdos_partition(struct parsed_partitions *state) - put_partition(state, slot, start, n); - - strlcat(state->pp_buf, " <", PAGE_SIZE); -- parse_extended(state, start, size); -+ parse_extended(state, start, size, disksig); - strlcat(state->pp_buf, " >", PAGE_SIZE); - continue; - } - put_partition(state, slot, start, size); -+ set_info(state, slot, disksig); - if (SYS_IND(p) == LINUX_RAID_PARTITION) - state->parts[slot].flags = ADDPART_FLAG_RAID; - if (SYS_IND(p) == DM6_PARTITION) -diff --git a/include/linux/blkpg.h b/include/linux/blkpg.h -index faf8a45..a851944 100644 ---- a/include/linux/blkpg.h -+++ b/include/linux/blkpg.h -@@ -40,6 +40,7 @@ struct blkpg_ioctl_arg { - /* The subfunctions (for the op field) */ - #define BLKPG_ADD_PARTITION 1 - #define BLKPG_DEL_PARTITION 2 -+#define BLKPG_RESIZE_PARTITION 3 - - /* Sizes of name fields. Unused at present. */ - #define BLKPG_DEVNAMELTH 64 -diff --git a/include/linux/genhd.h b/include/linux/genhd.h -index 017a7fb..9747efc 100644 ---- a/include/linux/genhd.h -+++ b/include/linux/genhd.h -@@ -89,16 +89,26 @@ struct disk_stats { - }; - - #define PARTITION_META_INFO_VOLNAMELTH 64 --#define PARTITION_META_INFO_UUIDLTH 16 -+/* -+ * Enough for the string representation of any kind of UUID plus NULL. -+ * EFI UUID is 36 characters. MSDOS UUID is 11 characters. -+ */ -+#define PARTITION_META_INFO_UUIDLTH 37 - - struct partition_meta_info { -- u8 uuid[PARTITION_META_INFO_UUIDLTH]; /* always big endian */ -+ char uuid[PARTITION_META_INFO_UUIDLTH]; - u8 volname[PARTITION_META_INFO_VOLNAMELTH]; - }; - - struct hd_struct { - sector_t start_sect; -+ /* -+ * nr_sects is protected by sequence counter. One might extend a -+ * partition while IO is happening to it and update of nr_sects -+ * can be non-atomic on 32bit machines with 64bit sector_t. -+ */ - sector_t nr_sects; -+ seqcount_t nr_sects_seq; - sector_t alignment_offset; - unsigned int discard_alignment; - struct device __dev; -@@ -648,6 +658,57 @@ static inline void hd_struct_put(struct hd_struct *part) - __delete_partition(part); - } - -+/* -+ * Any access of part->nr_sects which is not protected by partition -+ * bd_mutex or gendisk bdev bd_mutex, should be done using this -+ * accessor function. -+ * -+ * Code written along the lines of i_size_read() and i_size_write(). -+ * CONFIG_PREEMPT case optimizes the case of UP kernel with preemption -+ * on. -+ */ -+static inline sector_t part_nr_sects_read(struct hd_struct *part) -+{ -+#if BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_SMP) -+ sector_t nr_sects; -+ unsigned seq; -+ do { -+ seq = read_seqcount_begin(&part->nr_sects_seq); -+ nr_sects = part->nr_sects; -+ } while (read_seqcount_retry(&part->nr_sects_seq, seq)); -+ return nr_sects; -+#elif BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_PREEMPT) -+ sector_t nr_sects; -+ -+ preempt_disable(); -+ nr_sects = part->nr_sects; -+ preempt_enable(); -+ return nr_sects; -+#else -+ return part->nr_sects; -+#endif -+} -+ -+/* -+ * Should be called with mutex lock held (typically bd_mutex) of partition -+ * to provide mutual exlusion among writers otherwise seqcount might be -+ * left in wrong state leaving the readers spinning infinitely. -+ */ -+static inline void part_nr_sects_write(struct hd_struct *part, sector_t size) -+{ -+#if BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_SMP) -+ write_seqcount_begin(&part->nr_sects_seq); -+ part->nr_sects = size; -+ write_seqcount_end(&part->nr_sects_seq); -+#elif BITS_PER_LONG==32 && defined(CONFIG_LBDAF) && defined(CONFIG_PREEMPT) -+ preempt_disable(); -+ part->nr_sects = size; -+ preempt_enable(); -+#else -+ part->nr_sects = size; -+#endif -+} -+ - #else /* CONFIG_BLOCK */ - - static inline void printk_all_partitions(void) { } -diff --git a/init/do_mounts.c b/init/do_mounts.c -index 7b81405..97fb6f0 100644 ---- a/init/do_mounts.c -+++ b/init/do_mounts.c -@@ -59,23 +59,28 @@ __setup("ro", readonly); - __setup("rw", readwrite); - - #ifdef CONFIG_BLOCK -+struct uuidcmp { -+ const char *uuid; -+ int len; -+}; -+ - /** - * match_dev_by_uuid - callback for finding a partition using its uuid - * @dev: device passed in by the caller -- * @data: opaque pointer to a 36 byte char array with a UUID -+ * @data: opaque pointer to the desired struct uuidcmp to match - * - * Returns 1 if the device matches, and 0 otherwise. - */ - static int match_dev_by_uuid(struct device *dev, void *data) - { -- u8 *uuid = data; -+ struct uuidcmp *cmp = data; - struct hd_struct *part = dev_to_part(dev); - - if (!part->info) - goto no_match; - -- if (memcmp(uuid, part->info->uuid, sizeof(part->info->uuid))) -- goto no_match; -+ if (strncasecmp(cmp->uuid, part->info->uuid, cmp->len)) -+ goto no_match; - - return 1; - no_match: -@@ -85,7 +90,7 @@ no_match: - - /** - * devt_from_partuuid - looks up the dev_t of a partition by its UUID -- * @uuid: min 36 byte char array containing a hex ascii UUID -+ * @uuid: char array containing ascii UUID - * - * The function will return the first partition which contains a matching - * UUID value in its partition_meta_info struct. This does not search -@@ -96,38 +101,41 @@ no_match: - * - * Returns the matching dev_t on success or 0 on failure. - */ --static dev_t devt_from_partuuid(char *uuid_str) -+static dev_t devt_from_partuuid(const char *uuid_str) - { - dev_t res = 0; -+ struct uuidcmp cmp; - struct device *dev = NULL; -- u8 uuid[16]; - struct gendisk *disk; - struct hd_struct *part; - int offset = 0; -+ bool clear_root_wait = false; -+ char *slash; - -- if (strlen(uuid_str) < 36) -- goto done; -+ cmp.uuid = uuid_str; - -+ slash = strchr(uuid_str, '/'); - /* Check for optional partition number offset attributes. */ -- if (uuid_str[36]) { -+ if (slash) { - char c = 0; - /* Explicitly fail on poor PARTUUID syntax. */ -- if (sscanf(&uuid_str[36], -- "/PARTNROFF=%d%c", &offset, &c) != 1) { -- printk(KERN_ERR "VFS: PARTUUID= is invalid.\n" -- "Expected PARTUUID=[/PARTNROFF=%%d]\n"); -- if (root_wait) -- printk(KERN_ERR -- "Disabling rootwait; root= is invalid.\n"); -- root_wait = 0; -+ if (sscanf(slash + 1, -+ "PARTNROFF=%d%c", &offset, &c) != 1) { -+ clear_root_wait = true; - goto done; - } -+ cmp.len = slash - uuid_str; -+ } else { -+ cmp.len = strlen(uuid_str); - } - -- /* Pack the requested UUID in the expected format. */ -- part_pack_uuid(uuid_str, uuid); -+ if (!cmp.len) { -+ clear_root_wait = true; -+ goto done; -+ } - -- dev = class_find_device(&block_class, NULL, uuid, &match_dev_by_uuid); -+ dev = class_find_device(&block_class, NULL, &cmp, -+ &match_dev_by_uuid); - if (!dev) - goto done; - -@@ -148,6 +156,13 @@ static dev_t devt_from_partuuid(char *uuid_str) - no_offset: - put_device(dev); - done: -+ if (clear_root_wait) { -+ pr_err("VFS: PARTUUID= is invalid.\n" -+ "Expected PARTUUID=[/PARTNROFF=%%d]\n"); -+ if (root_wait) -+ pr_err("Disabling rootwait; root= is invalid.\n"); -+ root_wait = 0; -+ } - return res; - } - #endif -@@ -164,6 +179,10 @@ done: - * used when disk name of partitioned disk ends on a digit. - * 6) PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF representing the - * unique id of a partition if the partition table provides it. -+ * The UUID may be either an EFI/GPT UUID, or refer to an MSDOS -+ * partition using the format SSSSSSSS-PP, where SSSSSSSS is a zero- -+ * filled hex representation of the 32-bit "NT disk signature", and PP -+ * is a zero-filled hex representation of the 1-based partition number. - * 7) PARTUUID=/PARTNROFF= to select a partition in relation to - * a partition with a known unique id. - * --- -2.2.1 - diff --git a/core/linux-sun4i/PKGBUILD b/core/linux-sun4i/PKGBUILD deleted file mode 100644 index fe0198e53..000000000 --- a/core/linux-sun4i/PKGBUILD +++ /dev/null @@ -1,261 +0,0 @@ -# Maintainer: WarheadsSE -# Maintainer: Kevin Mihelich - -buildarch=4 - -pkgbase=linux-sun4i -_commit=9a1cd034181af628d4145202289e1993c1687db6 -_srcname=linux-sunxi-${_commit} -_kernelname=${pkgname#linux} -_desc="AllWinner A10" -pkgver=3.4.103 -pkgrel=3 -arch=('armv7h') -url="http://www.kernel.org/" -license=('GPL2') -makedepends=('xmlto' 'docbook-xsl' 'uboot-mkimage' 'bc' 'kmod' 'inetutils' 'git') -options=('!strip') -source=("https://github.com/linux-sunxi/linux-sunxi/archive/${_commit}.tar.gz" - '0001-Backport-BFP-XOR-operation.patch' - '0001-Backport-firmware-loader.patch' - '0001-Backport-msdos-partition-UUIDs.patch' - 'config') -md5sums=('6cdd44f9131a854cdbf5ddad86187c57' - 'ca5b466850782493b99e824d6efbea4d' - '520bde63dd6803f3332e9b26cb34cff9' - '743724d560cf34dadefb8e976a31319c' - '4592842f7b5702452815d5601f43ab7a') - -prepare() { - cd "${srcdir}/${_srcname}" - - cat "${srcdir}/config" > ./.config - - git apply ../0001-Backport-BFP-XOR-operation.patch - git apply ../0001-Backport-firmware-loader.patch - git apply ../0001-Backport-msdos-partition-UUIDs.patch - - # add pkgrel to extraversion - sed -ri "s|^(EXTRAVERSION =)(.*)|\1 \2-${pkgrel}|" Makefile - - # don't run depmod on 'make install'. We'll do this ourselves in packaging - sed -i '2iexit 0' scripts/depmod.sh -} - -build() { - cd "${srcdir}/${_srcname}" - - LDFLAGS="" - - # get kernel version - make prepare - - # load configuration - # Configure the kernel. Replace the line below with one of your choice. - #make menuconfig # CLI menu for configuration - #make nconfig # new CLI menu for configuration - #make xconfig # X-based configuration - #make oldconfig # using old config from previous kernel version - # ... or manually edit .config - - # Copy back our configuration (use with new kernel version) - #cp ./.config ../${pkgver}.config - - #################### - # stop here - # this is useful to configure the kernel - #msg "Stopping build" - #return 1 - #################### - - #yes "" | make config - - # build! - make ${MAKEFLAGS} modules uImage -} - -_package() { - pkgdesc="The Linux Kernel and modules - ${_desc}" - depends=('coreutils' 'linux-firmware' 'module-init-tools>=3.16') - optdepends=('crda: to set the correct wireless channels of your country') - provides=("kernel26" "linux=${pkgver}") - conflicts=('kernel26' 'linux') - install=${pkgname}.install - - cd "${srcdir}/${_srcname}" - - KARCH=arm - - # get kernel version - _kernver="$(make kernelrelease)" - - mkdir -p "${pkgdir}"/{lib/modules,lib/firmware,boot} - make INSTALL_MOD_PATH="${pkgdir}" modules_install - #cd arch/$KARCH/boot/ - - cd "${srcdir}/${_srcname}" - #cp arch/$KARCH/boot/kernel.img ${pkgdir}/boot/kernel.img - cp arch/$KARCH/boot/uImage "${pkgdir}/boot/uImage" - - # set correct depmod command for install - sed \ - -e "s/KERNEL_NAME=.*/KERNEL_NAME=${_kernelname}/g" \ - -e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/g" \ - -i "${startdir}/${pkgname}.install" - - # remove build and source links - rm -f "${pkgdir}"/lib/modules/${_kernver}/{source,build} - # remove the firmware - rm -rf "${pkgdir}/lib/firmware" - # gzip -9 all modules to save ~100MB of space - find "${pkgdir}" -name '*.ko' |xargs -P 2 -n 1 gzip -9 - # make room for external modules - ln -s "../extramodules-${pkgver}-${_kernelname:-ARCH}" "${pkgdir}/lib/modules/${_kernver}/extramodules" - # add real version for building modules and running depmod from post_install/upgrade - mkdir -p "${pkgdir}/lib/modules/extramodules-${pkgver}-${_kernelname:-ARCH}" - echo "${_kernver}" > "${pkgdir}/lib/modules/extramodules-${pkgver}-${_kernelname:-ARCH}/version" - - # Now we call depmod... - depmod -b "$pkgdir" -F System.map "$_kernver" - - # move module tree /lib -> /usr/lib - mkdir -p "${pkgdir}/usr" - mv "$pkgdir/lib" "$pkgdir/usr" -} - -_package-headers() { - pkgdesc="Header files and scripts for building modules for linux kernel - ${_desc}" - provides=('kernel26-headers' "linux-headers=${pkgver}") - conflicts=('kernel26-headers') - replaces=('kernel26-headers') - - install -dm755 "${pkgdir}/usr/lib/modules/${_kernver}" - - cd "${pkgdir}/usr/lib/modules/${_kernver}" - ln -sf ../../../src/linux-${_kernver} build - - cd "${srcdir}/${_srcname}" - install -D -m644 Makefile \ - "${pkgdir}/usr/src/linux-${_kernver}/Makefile" - install -D -m644 kernel/Makefile \ - "${pkgdir}/usr/src/linux-${_kernver}/kernel/Makefile" - install -D -m644 .config \ - "${pkgdir}/usr/src/linux-${_kernver}/.config" - - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/include" - - for i in acpi asm-generic config crypto drm generated linux math-emu \ - media net pcmcia scsi sound trace video xen; do - cp -a include/${i} "${pkgdir}/usr/src/linux-${_kernver}/include/" - done - - # copy arch includes for external modules - mkdir -p ${pkgdir}/usr/src/linux-${_kernver}/arch/$KARCH - cp -a arch/$KARCH/include ${pkgdir}/usr/src/linux-${_kernver}/arch/$KARCH/ - mkdir -p ${pkgdir}/usr/src/linux-${_kernver}/arch/$KARCH/mach-sun4i - cp -a arch/$KARCH/mach-sun4i/include ${pkgdir}/usr/src/linux-${_kernver}/arch/$KARCH/mach-sun4i/ - mkdir -p ${pkgdir}/usr/src/linux-${_kernver}/arch/$KARCH/plat-sunxi - cp -a arch/$KARCH/plat-sunxi/include ${pkgdir}/usr/src/linux-${_kernver}/arch/$KARCH/plat-sunxi/ - - # copy files necessary for later builds, like nvidia and vmware - cp Module.symvers "${pkgdir}/usr/src/linux-${_kernver}" - cp -a scripts "${pkgdir}/usr/src/linux-${_kernver}" - - # fix permissions on scripts dir - chmod og-w -R "${pkgdir}/usr/src/linux-${_kernver}/scripts" - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/.tmp_versions" - - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/arch/${KARCH}/kernel" - - cp arch/${KARCH}/Makefile "${pkgdir}/usr/src/linux-${_kernver}/arch/${KARCH}/" - - if [ "${CARCH}" = "i686" ]; then - cp arch/${KARCH}/Makefile_32.cpu "${pkgdir}/usr/src/linux-${_kernver}/arch/${KARCH}/" - fi - - cp arch/${KARCH}/kernel/asm-offsets.s "${pkgdir}/usr/src/linux-${_kernver}/arch/${KARCH}/kernel/" - - # add headers for lirc package - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/video" - - cp drivers/media/video/*.h "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/video/" - - for i in bt8xx cpia2 cx25840 cx88 em28xx et61x251 pwc saa7134 sn9c102; do - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/video/${i}" - cp -a drivers/media/video/${i}/*.h "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/video/${i}" - done - - # add docbook makefile - install -D -m644 Documentation/DocBook/Makefile \ - "${pkgdir}/usr/src/linux-${_kernver}/Documentation/DocBook/Makefile" - - # add dm headers - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/drivers/md" - cp drivers/md/*.h "${pkgdir}/usr/src/linux-${_kernver}/drivers/md" - - # add inotify.h - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/include/linux" - cp include/linux/inotify.h "${pkgdir}/usr/src/linux-${_kernver}/include/linux/" - - # add wireless headers - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/net/mac80211/" - cp net/mac80211/*.h "${pkgdir}/usr/src/linux-${_kernver}/net/mac80211/" - - # add dvb headers for external modules - # in reference to: - # http://bugs.archlinux.org/task/9912 - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/dvb/dvb-core" - cp drivers/media/dvb/dvb-core/*.h "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/dvb/dvb-core/" - # and... - # http://bugs.archlinux.org/task/11194 - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/include/config/dvb/" - cp include/config/dvb/*.h "${pkgdir}/usr/src/linux-${_kernver}/include/config/dvb/" - - # add dvb headers for http://mcentral.de/hg/~mrec/em28xx-new - # in reference to: - # http://bugs.archlinux.org/task/13146 - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/dvb/frontends/" - cp drivers/media/dvb/frontends/lgdt330x.h "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/dvb/frontends/" - cp drivers/media/video/msp3400-driver.h "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/dvb/frontends/" - - # add dvb headers - # in reference to: - # http://bugs.archlinux.org/task/20402 - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/dvb/dvb-usb" - cp drivers/media/dvb/dvb-usb/*.h "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/dvb/dvb-usb/" - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/dvb/frontends" - cp drivers/media/dvb/frontends/*.h "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/dvb/frontends/" - mkdir -p "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/common/tuners" - cp drivers/media/common/tuners/*.h "${pkgdir}/usr/src/linux-${_kernver}/drivers/media/common/tuners/" - - # copy in Kconfig files - for i in `find . -name "Kconfig*"`; do - mkdir -p "${pkgdir}"/usr/src/linux-${_kernver}/`echo ${i} | sed 's|/Kconfig.*||'` - cp ${i} "${pkgdir}/usr/src/linux-${_kernver}/${i}" - done - - chown -R root.root "${pkgdir}/usr/src/linux-${_kernver}" - find "${pkgdir}/usr/src/linux-${_kernver}" -type d -exec chmod 755 {} \; - - # strip scripts directory - find "${pkgdir}/usr/src/linux-${_kernver}/scripts" -type f -perm -u+w 2>/dev/null | while read binary ; do - case "$(file -bi "${binary}")" in - *application/x-sharedlib*) # Libraries (.so) - /usr/bin/strip ${STRIP_SHARED} "${binary}";; - *application/x-archive*) # Libraries (.a) - /usr/bin/strip ${STRIP_STATIC} "${binary}";; - *application/x-executable*) # Binaries - /usr/bin/strip ${STRIP_BINARIES} "${binary}";; - esac - done - - # remove unneeded architectures - rm -rf "${pkgdir}"/usr/src/linux-${_kernver}/arch/{alpha,arm26,avr32,blackfin,cris,frv,h8300,ia64,m32r,m68k,m68knommu,mips,microblaze,mn10300,parisc,powerpc,ppc,s390,sh,sh64,sparc,sparc64,um,v850,x86,xtensa} -} - -pkgname=("${pkgbase}" "${pkgbase}-headers") -for _p in ${pkgname[@]}; do - eval "package_${_p}() { - _package${_p#${pkgbase}} - }" -done diff --git a/core/linux-sun4i/config b/core/linux-sun4i/config deleted file mode 100644 index cdbd6cf86..000000000 --- a/core/linux-sun4i/config +++ /dev/null @@ -1,3626 +0,0 @@ -# -# Automatically generated file; DO NOT EDIT. -# Linux/arm 3.4.90-5 Kernel Configuration -# -CONFIG_ARM=y -CONFIG_SYS_SUPPORTS_APM_EMULATION=y -CONFIG_GENERIC_GPIO=y -# CONFIG_ARCH_USES_GETTIMEOFFSET is not set -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_KTIME_SCALAR=y -CONFIG_HAVE_PROC_CPU=y -CONFIG_STACKTRACE_SUPPORT=y -CONFIG_HAVE_LATENCYTOP_SUPPORT=y -CONFIG_LOCKDEP_SUPPORT=y -CONFIG_TRACE_IRQFLAGS_SUPPORT=y -CONFIG_HARDIRQS_SW_RESEND=y -CONFIG_GENERIC_IRQ_PROBE=y -CONFIG_RWSEM_GENERIC_SPINLOCK=y -CONFIG_ARCH_HAS_CPUFREQ=y -CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y -CONFIG_GENERIC_HWEIGHT=y -CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_ZONE_DMA=y -CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_VECTORS_BASE=0xffff0000 -CONFIG_ARM_PATCH_PHYS_VIRT=y -CONFIG_NEED_MACH_IO_H=y -CONFIG_GENERIC_BUG=y -CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" -CONFIG_HAVE_IRQ_WORK=y -CONFIG_IRQ_WORK=y - -# -# General setup -# -CONFIG_EXPERIMENTAL=y -CONFIG_BROKEN_ON_SMP=y -CONFIG_INIT_ENV_ARG_LIMIT=32 -CONFIG_CROSS_COMPILE="" -CONFIG_LOCALVERSION="-ARCH" -# CONFIG_LOCALVERSION_AUTO is not set -CONFIG_HAVE_KERNEL_GZIP=y -CONFIG_HAVE_KERNEL_LZMA=y -CONFIG_HAVE_KERNEL_XZ=y -CONFIG_HAVE_KERNEL_LZO=y -CONFIG_KERNEL_GZIP=y -# CONFIG_KERNEL_LZMA is not set -# CONFIG_KERNEL_XZ is not set -# CONFIG_KERNEL_LZO is not set -CONFIG_DEFAULT_HOSTNAME="(none)" -CONFIG_SWAP=y -CONFIG_SYSVIPC=y -CONFIG_SYSVIPC_SYSCTL=y -CONFIG_POSIX_MQUEUE=y -CONFIG_POSIX_MQUEUE_SYSCTL=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_BSD_PROCESS_ACCT_V3=y -CONFIG_FHANDLE=y -CONFIG_TASKSTATS=y -CONFIG_TASK_DELAY_ACCT=y -CONFIG_TASK_XACCT=y -CONFIG_TASK_IO_ACCOUNTING=y -# CONFIG_AUDIT is not set -CONFIG_HAVE_GENERIC_HARDIRQS=y - -# -# IRQ subsystem -# -CONFIG_GENERIC_HARDIRQS=y -CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_IRQ_DOMAIN=y - -# -# RCU Subsystem -# -CONFIG_TINY_PREEMPT_RCU=y -CONFIG_PREEMPT_RCU=y -# CONFIG_TREE_RCU_TRACE is not set -# CONFIG_RCU_BOOST is not set -CONFIG_IKCONFIG=y -CONFIG_IKCONFIG_PROC=y -CONFIG_LOG_BUF_SHIFT=19 -CONFIG_CGROUPS=y -# CONFIG_CGROUP_DEBUG is not set -CONFIG_CGROUP_FREEZER=y -CONFIG_CGROUP_DEVICE=y -CONFIG_CPUSETS=y -CONFIG_PROC_PID_CPUSET=y -CONFIG_CGROUP_CPUACCT=y -CONFIG_RESOURCE_COUNTERS=y -CONFIG_CGROUP_MEM_RES_CTLR=y -CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y -CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED=y -CONFIG_CGROUP_MEM_RES_CTLR_KMEM=y -CONFIG_CGROUP_PERF=y -CONFIG_CGROUP_SCHED=y -CONFIG_FAIR_GROUP_SCHED=y -# CONFIG_CFS_BANDWIDTH is not set -CONFIG_RT_GROUP_SCHED=y -CONFIG_BLK_CGROUP=y -# CONFIG_DEBUG_BLK_CGROUP is not set -# CONFIG_CHECKPOINT_RESTORE is not set -CONFIG_NAMESPACES=y -CONFIG_UTS_NS=y -CONFIG_IPC_NS=y -CONFIG_USER_NS=y -CONFIG_PID_NS=y -CONFIG_NET_NS=y -# CONFIG_SCHED_AUTOGROUP is not set -CONFIG_MM_OWNER=y -# CONFIG_SYSFS_DEPRECATED is not set -CONFIG_RELAY=y -CONFIG_BLK_DEV_INITRD=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_RD_GZIP=y -CONFIG_RD_BZIP2=y -CONFIG_RD_LZMA=y -CONFIG_RD_XZ=y -CONFIG_RD_LZO=y -CONFIG_CC_OPTIMIZE_FOR_SIZE=y -CONFIG_SYSCTL=y -CONFIG_ANON_INODES=y -CONFIG_PANIC_TIMEOUT=0 -# CONFIG_EXPERT is not set -CONFIG_UID16=y -# CONFIG_SYSCTL_SYSCALL is not set -CONFIG_KALLSYMS=y -# CONFIG_KALLSYMS_ALL is not set -CONFIG_HOTPLUG=y -CONFIG_PRINTK=y -CONFIG_BUG=y -CONFIG_ELF_CORE=y -CONFIG_BASE_FULL=y -CONFIG_FUTEX=y -CONFIG_EPOLL=y -CONFIG_SIGNALFD=y -CONFIG_TIMERFD=y -CONFIG_EVENTFD=y -CONFIG_SHMEM=y -CONFIG_AIO=y -# CONFIG_EMBEDDED is not set -CONFIG_HAVE_PERF_EVENTS=y -CONFIG_PERF_USE_VMALLOC=y - -# -# Kernel Performance Events And Counters -# -CONFIG_PERF_EVENTS=y -CONFIG_PERF_COUNTERS=y -# CONFIG_DEBUG_PERF_USE_VMALLOC is not set -CONFIG_VM_EVENT_COUNTERS=y -CONFIG_SLUB_DEBUG=y -# CONFIG_COMPAT_BRK is not set -# CONFIG_SLAB is not set -CONFIG_SLUB=y -# CONFIG_PROFILING is not set -CONFIG_HAVE_OPROFILE=y -# CONFIG_KPROBES is not set -# CONFIG_JUMP_LABEL is not set -CONFIG_HAVE_KPROBES=y -CONFIG_HAVE_KRETPROBES=y -CONFIG_HAVE_DMA_ATTRS=y -CONFIG_HAVE_DMA_CONTIGUOUS=y -CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y -CONFIG_HAVE_CLK=y -CONFIG_HAVE_DMA_API_DEBUG=y -CONFIG_HAVE_HW_BREAKPOINT=y -CONFIG_HAVE_ARCH_JUMP_LABEL=y - -# -# GCOV-based kernel profiling -# -CONFIG_HAVE_GENERIC_DMA_COHERENT=y -CONFIG_SLABINFO=y -CONFIG_RT_MUTEXES=y -CONFIG_BASE_SMALL=0 -CONFIG_MODULES=y -# CONFIG_MODULE_FORCE_LOAD is not set -CONFIG_MODULE_UNLOAD=y -# CONFIG_MODULE_FORCE_UNLOAD is not set -CONFIG_MODVERSIONS=y -CONFIG_MODULE_SRCVERSION_ALL=y -CONFIG_BLOCK=y -CONFIG_LBDAF=y -CONFIG_BLK_DEV_BSG=y -CONFIG_BLK_DEV_BSGLIB=y -CONFIG_BLK_DEV_INTEGRITY=y -CONFIG_BLK_DEV_THROTTLING=y - -# -# Partition Types -# -CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -CONFIG_OSF_PARTITION=y -CONFIG_AMIGA_PARTITION=y -# CONFIG_ATARI_PARTITION is not set -CONFIG_MAC_PARTITION=y -CONFIG_MSDOS_PARTITION=y -CONFIG_BSD_DISKLABEL=y -CONFIG_MINIX_SUBPARTITION=y -CONFIG_SOLARIS_X86_PARTITION=y -CONFIG_UNIXWARE_DISKLABEL=y -# CONFIG_LDM_PARTITION is not set -CONFIG_SGI_PARTITION=y -# CONFIG_ULTRIX_PARTITION is not set -CONFIG_SUN_PARTITION=y -CONFIG_KARMA_PARTITION=y -CONFIG_EFI_PARTITION=y -# CONFIG_SYSV68_PARTITION is not set -CONFIG_SUNXI_NAND_PARTITION=y - -# -# IO Schedulers -# -CONFIG_IOSCHED_NOOP=y -CONFIG_IOSCHED_DEADLINE=y -CONFIG_IOSCHED_CFQ=y -CONFIG_CFQ_GROUP_IOSCHED=y -# CONFIG_DEFAULT_DEADLINE is not set -CONFIG_DEFAULT_CFQ=y -# CONFIG_DEFAULT_NOOP is not set -CONFIG_DEFAULT_IOSCHED="cfq" -# CONFIG_INLINE_SPIN_TRYLOCK is not set -# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set -# CONFIG_INLINE_SPIN_LOCK is not set -# CONFIG_INLINE_SPIN_LOCK_BH is not set -# CONFIG_INLINE_SPIN_LOCK_IRQ is not set -# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set -CONFIG_UNINLINE_SPIN_UNLOCK=y -# CONFIG_INLINE_SPIN_UNLOCK_BH is not set -# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set -# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set -# CONFIG_INLINE_READ_TRYLOCK is not set -# CONFIG_INLINE_READ_LOCK is not set -# CONFIG_INLINE_READ_LOCK_BH is not set -# CONFIG_INLINE_READ_LOCK_IRQ is not set -# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set -# CONFIG_INLINE_READ_UNLOCK is not set -# CONFIG_INLINE_READ_UNLOCK_BH is not set -# CONFIG_INLINE_READ_UNLOCK_IRQ is not set -# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set -# CONFIG_INLINE_WRITE_TRYLOCK is not set -# CONFIG_INLINE_WRITE_LOCK is not set -# CONFIG_INLINE_WRITE_LOCK_BH is not set -# CONFIG_INLINE_WRITE_LOCK_IRQ is not set -# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set -# CONFIG_INLINE_WRITE_UNLOCK is not set -# CONFIG_INLINE_WRITE_UNLOCK_BH is not set -# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set -# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set -# CONFIG_MUTEX_SPIN_ON_OWNER is not set -CONFIG_FREEZER=y - -# -# System Type -# -CONFIG_MMU=y -# CONFIG_ARCH_INTEGRATOR is not set -# CONFIG_ARCH_REALVIEW is not set -# CONFIG_ARCH_VERSATILE is not set -# CONFIG_ARCH_VEXPRESS is not set -# CONFIG_ARCH_AT91 is not set -# CONFIG_ARCH_BCMRING is not set -# CONFIG_ARCH_HIGHBANK is not set -# CONFIG_ARCH_CLPS711X is not set -# CONFIG_ARCH_CNS3XXX is not set -# CONFIG_ARCH_GEMINI is not set -# CONFIG_ARCH_PRIMA2 is not set -# CONFIG_ARCH_EBSA110 is not set -# CONFIG_ARCH_EP93XX is not set -# CONFIG_ARCH_FOOTBRIDGE is not set -# CONFIG_ARCH_MXC is not set -# CONFIG_ARCH_MXS is not set -# CONFIG_ARCH_NETX is not set -# CONFIG_ARCH_H720X is not set -# CONFIG_ARCH_IOP13XX is not set -# CONFIG_ARCH_IOP32X is not set -# CONFIG_ARCH_IOP33X is not set -# CONFIG_ARCH_IXP23XX is not set -# CONFIG_ARCH_IXP2000 is not set -# CONFIG_ARCH_IXP4XX is not set -# CONFIG_ARCH_DOVE is not set -# CONFIG_ARCH_KIRKWOOD is not set -# CONFIG_ARCH_LPC32XX is not set -# CONFIG_ARCH_MV78XX0 is not set -# CONFIG_ARCH_ORION5X is not set -# CONFIG_ARCH_MMP is not set -# CONFIG_ARCH_KS8695 is not set -# CONFIG_ARCH_W90X900 is not set -# CONFIG_ARCH_TEGRA is not set -# CONFIG_ARCH_PICOXCELL is not set -CONFIG_ARCH_SUN4I=y -# CONFIG_ARCH_SUN5I is not set -# CONFIG_ARCH_SUN7I is not set -# CONFIG_ARCH_PNX4008 is not set -# CONFIG_ARCH_PXA is not set -# CONFIG_ARCH_MSM is not set -# CONFIG_ARCH_SHMOBILE is not set -# CONFIG_ARCH_RPC is not set -# CONFIG_ARCH_SA1100 is not set -# CONFIG_ARCH_S3C24XX is not set -# CONFIG_ARCH_S3C64XX is not set -# CONFIG_ARCH_S5P64X0 is not set -# CONFIG_ARCH_S5PC100 is not set -# CONFIG_ARCH_S5PV210 is not set -# CONFIG_ARCH_EXYNOS is not set -# CONFIG_ARCH_SHARK is not set -# CONFIG_ARCH_U300 is not set -# CONFIG_ARCH_U8500 is not set -# CONFIG_ARCH_NOMADIK is not set -# CONFIG_ARCH_DAVINCI is not set -# CONFIG_ARCH_OMAP is not set -# CONFIG_PLAT_SPEAR is not set -# CONFIG_ARCH_VT8500 is not set -# CONFIG_ARCH_ZYNQ is not set -# CONFIG_GPIO_PCA953X is not set -# CONFIG_KEYBOARD_GPIO_POLLED is not set - -# -# System MMU -# - -# -# Allwinner's sunxi options -# -CONFIG_SUNXI_MULTIPLATFORM=y -CONFIG_SUNXI_SCALING_MIN=60 -CONFIG_PLAT_SUNXI=y - -# -# Processor Type -# -CONFIG_CPU_V7=y -CONFIG_CPU_32v6K=y -CONFIG_CPU_32v7=y -CONFIG_CPU_ABRT_EV7=y -CONFIG_CPU_PABRT_V7=y -CONFIG_CPU_CACHE_V7=y -CONFIG_CPU_CACHE_VIPT=y -CONFIG_CPU_COPY_V6=y -CONFIG_CPU_TLB_V7=y -CONFIG_CPU_HAS_ASID=y -CONFIG_CPU_CP15=y -CONFIG_CPU_CP15_MMU=y - -# -# Processor Features -# -# CONFIG_ARM_LPAE is not set -# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set -CONFIG_ARM_THUMB=y -# CONFIG_ARM_THUMBEE is not set -CONFIG_SWP_EMULATE=y -# CONFIG_CPU_ICACHE_DISABLE is not set -# CONFIG_CPU_DCACHE_DISABLE is not set -# CONFIG_CPU_BPREDICT_DISABLE is not set -# CONFIG_CACHE_L2X0 is not set -CONFIG_ARM_L1_CACHE_SHIFT_6=y -CONFIG_ARM_L1_CACHE_SHIFT=6 -CONFIG_ARM_DMA_MEM_BUFFERABLE=y -CONFIG_ARM_NR_BANKS=8 -CONFIG_CPU_HAS_PMU=y -# CONFIG_ARM_ERRATA_430973 is not set -# CONFIG_ARM_ERRATA_458693 is not set -# CONFIG_ARM_ERRATA_460075 is not set -# CONFIG_ARM_ERRATA_720789 is not set -# CONFIG_ARM_ERRATA_743622 is not set -# CONFIG_ARM_ERRATA_751472 is not set -# CONFIG_ARM_ERRATA_754322 is not set -# CONFIG_ARM_ERRATA_775420 is not set -# CONFIG_FIQ_DEBUGGER is not set - -# -# Bus support -# -CONFIG_ARM_AMBA=y -# CONFIG_PCI_SYSCALL is not set -# CONFIG_ARCH_SUPPORTS_MSI is not set -# CONFIG_PCCARD is not set - -# -# Kernel Features -# -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y -CONFIG_GENERIC_CLOCKEVENTS_BUILD=y -# CONFIG_ARM_ARCH_TIMER is not set -CONFIG_VMSPLIT_3G=y -# CONFIG_VMSPLIT_2G is not set -# CONFIG_VMSPLIT_1G is not set -CONFIG_PAGE_OFFSET=0xC0000000 -CONFIG_ARCH_NR_GPIO=0 -# CONFIG_PREEMPT_NONE is not set -# CONFIG_PREEMPT_VOLUNTARY is not set -CONFIG_PREEMPT=y -CONFIG_PREEMPT_COUNT=y -CONFIG_HZ=100 -# CONFIG_THUMB2_KERNEL is not set -CONFIG_AEABI=y -# CONFIG_OABI_COMPAT is not set -# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set -# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set -CONFIG_HAVE_ARCH_PFN_VALID=y -CONFIG_HIGHMEM=y -# CONFIG_HIGHPTE is not set -CONFIG_HW_PERF_EVENTS=y -CONFIG_SELECT_MEMORY_MODEL=y -CONFIG_FLATMEM_MANUAL=y -CONFIG_FLATMEM=y -CONFIG_FLAT_NODE_MEM_MAP=y -CONFIG_HAVE_MEMBLOCK=y -CONFIG_PAGEFLAGS_EXTENDED=y -CONFIG_SPLIT_PTLOCK_CPUS=4 -CONFIG_COMPACTION=y -CONFIG_MIGRATION=y -# CONFIG_PHYS_ADDR_T_64BIT is not set -CONFIG_ZONE_DMA_FLAG=1 -CONFIG_BOUNCE=y -CONFIG_VIRT_TO_BUS=y -CONFIG_KSM=y -CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 -CONFIG_NEED_PER_CPU_KM=y -# CONFIG_CLEANCACHE is not set -CONFIG_FORCE_MAX_ZONEORDER=11 -CONFIG_ALIGNMENT_TRAP=y -# CONFIG_UACCESS_WITH_MEMCPY is not set -CONFIG_SECCOMP=y -# CONFIG_CC_STACKPROTECTOR is not set -# CONFIG_DEPRECATED_PARAM_STRUCT is not set -# CONFIG_ARM_FLUSH_CONSOLE_ON_RESTART is not set - -# -# Boot options -# -CONFIG_USE_OF=y -# CONFIG_BUILD_ARM_APPENDED_DTB_IMAGE is not set -CONFIG_ZBOOT_ROM_TEXT=0 -CONFIG_ZBOOT_ROM_BSS=0 -# CONFIG_ARM_APPENDED_DTB is not set -CONFIG_CMDLINE="mem=448M@0x40000000 console=ttyS0,115200" -CONFIG_CMDLINE_FROM_BOOTLOADER=y -# CONFIG_CMDLINE_EXTEND is not set -# CONFIG_CMDLINE_FORCE is not set -# CONFIG_XIP_KERNEL is not set -# CONFIG_KEXEC is not set -# CONFIG_CRASH_DUMP is not set -# CONFIG_AUTO_ZRELADDR is not set - -# -# CPU Power Management -# - -# -# CPU Frequency scaling -# -CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_TABLE=y -CONFIG_CPU_FREQ_STAT=m -# CONFIG_CPU_FREQ_STAT_DETAILS is not set -CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y -# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_INTERACTIVE is not set -# CONFIG_CPU_FREQ_DEFAULT_GOV_FANTASY is not set -CONFIG_CPU_FREQ_GOV_PERFORMANCE=y -CONFIG_CPU_FREQ_GOV_POWERSAVE=y -CONFIG_CPU_FREQ_GOV_USERSPACE=y -CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_INTERACTIVE=y -CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y -# CONFIG_CPU_FREQ_GOV_FANTASY is not set -CONFIG_CPU_FREQ_USR_EVNT_NOTIFY=y -CONFIG_CPU_FREQ_DVFS=y - -# -# ARM CPU frequency scaling drivers -# -# CONFIG_ARM_EXYNOS4210_CPUFREQ is not set -# CONFIG_ARM_EXYNOS4X12_CPUFREQ is not set -# CONFIG_ARM_EXYNOS5250_CPUFREQ is not set -CONFIG_CPU_IDLE=y -CONFIG_CPU_IDLE_GOV_LADDER=y -CONFIG_CPU_IDLE_GOV_MENU=y -# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set - -# -# Floating point emulation -# - -# -# At least one emulation must be selected -# -CONFIG_VFP=y -CONFIG_VFPv3=y -CONFIG_NEON=y - -# -# Userspace binary formats -# -CONFIG_BINFMT_ELF=y -CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y -CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y -# CONFIG_HAVE_AOUT is not set -CONFIG_BINFMT_MISC=y - -# -# Power management options -# -CONFIG_SUSPEND=y -CONFIG_SUSPEND_FREEZER=y -CONFIG_HAS_WAKELOCK=y -CONFIG_WAKELOCK=y -CONFIG_PM_SLEEP=y -# CONFIG_PM_AUTOSLEEP is not set -# CONFIG_PM_WAKELOCKS is not set -CONFIG_PM_RUNTIME=y -CONFIG_PM=y -CONFIG_PM_DEBUG=y -# CONFIG_PM_ADVANCED_DEBUG is not set -# CONFIG_PM_TEST_SUSPEND is not set -CONFIG_CAN_PM_TRACE=y -# CONFIG_APM_EMULATION is not set -CONFIG_PM_CLK=y -CONFIG_CPU_PM=y -# CONFIG_SUSPEND_TIME is not set -CONFIG_ARCH_SUSPEND_POSSIBLE=y -CONFIG_ARM_CPU_SUSPEND=y -CONFIG_NET=y - -# -# Networking options -# -CONFIG_PACKET=y -CONFIG_UNIX=y -# CONFIG_UNIX_DIAG is not set -CONFIG_XFRM=y -CONFIG_XFRM_USER=y -CONFIG_XFRM_SUB_POLICY=y -CONFIG_XFRM_MIGRATE=y -# CONFIG_XFRM_STATISTICS is not set -CONFIG_XFRM_IPCOMP=y -CONFIG_NET_KEY=y -# CONFIG_NET_KEY_MIGRATE is not set -CONFIG_INET=y -CONFIG_IP_MULTICAST=y -# CONFIG_IP_ADVANCED_ROUTER is not set -CONFIG_IP_ROUTE_CLASSID=y -# CONFIG_IP_PNP is not set -CONFIG_NET_IPIP=y -# CONFIG_NET_IPGRE_DEMUX is not set -CONFIG_IP_MROUTE=y -CONFIG_IP_PIMSM_V1=y -CONFIG_IP_PIMSM_V2=y -# CONFIG_ARPD is not set -CONFIG_SYN_COOKIES=y -CONFIG_INET_AH=y -CONFIG_INET_ESP=y -CONFIG_INET_IPCOMP=y -CONFIG_INET_XFRM_TUNNEL=y -CONFIG_INET_TUNNEL=y -CONFIG_INET_XFRM_MODE_TRANSPORT=y -CONFIG_INET_XFRM_MODE_TUNNEL=y -CONFIG_INET_XFRM_MODE_BEET=y -CONFIG_INET_LRO=y -# CONFIG_INET_DIAG is not set -# CONFIG_TCP_CONG_ADVANCED is not set -CONFIG_TCP_CONG_CUBIC=y -CONFIG_DEFAULT_TCP_CONG="cubic" -# CONFIG_TCP_MD5SIG is not set -CONFIG_IPV6=y -# CONFIG_IPV6_PRIVACY is not set -# CONFIG_IPV6_ROUTER_PREF is not set -# CONFIG_IPV6_OPTIMISTIC_DAD is not set -CONFIG_INET6_AH=m -CONFIG_INET6_ESP=m -CONFIG_INET6_IPCOMP=m -CONFIG_IPV6_MIP6=m -CONFIG_INET6_XFRM_TUNNEL=m -CONFIG_INET6_TUNNEL=m -CONFIG_INET6_XFRM_MODE_TRANSPORT=m -CONFIG_INET6_XFRM_MODE_TUNNEL=m -CONFIG_INET6_XFRM_MODE_BEET=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_SIT=m -CONFIG_IPV6_SIT_6RD=y -CONFIG_IPV6_NDISC_NODETYPE=y -CONFIG_IPV6_TUNNEL=m -CONFIG_IPV6_MULTIPLE_TABLES=y -CONFIG_IPV6_SUBTREES=y -CONFIG_IPV6_MROUTE=y -CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y -CONFIG_IPV6_PIMSM_V2=y -# CONFIG_ANDROID_PARANOID_NETWORK is not set -CONFIG_NET_ACTIVITY_STATS=y -CONFIG_NETWORK_SECMARK=y -# CONFIG_NETWORK_PHY_TIMESTAMPING is not set -CONFIG_NETFILTER=y -# CONFIG_NETFILTER_DEBUG is not set -CONFIG_NETFILTER_ADVANCED=y -CONFIG_BRIDGE_NETFILTER=y - -# -# Core Netfilter Configuration -# -CONFIG_NETFILTER_NETLINK=m -# CONFIG_NETFILTER_NETLINK_ACCT is not set -CONFIG_NETFILTER_NETLINK_QUEUE=m -CONFIG_NETFILTER_NETLINK_LOG=m -CONFIG_NF_CONNTRACK=m -CONFIG_NF_CONNTRACK_MARK=y -CONFIG_NF_CONNTRACK_SECMARK=y -# CONFIG_NF_CONNTRACK_ZONES is not set -CONFIG_NF_CONNTRACK_PROCFS=y -CONFIG_NF_CONNTRACK_EVENTS=y -# CONFIG_NF_CONNTRACK_TIMEOUT is not set -CONFIG_NF_CONNTRACK_TIMESTAMP=y -CONFIG_NF_CT_PROTO_DCCP=m -CONFIG_NF_CT_PROTO_GRE=m -CONFIG_NF_CT_PROTO_SCTP=m -CONFIG_NF_CT_PROTO_UDPLITE=m -CONFIG_NF_CONNTRACK_AMANDA=m -CONFIG_NF_CONNTRACK_FTP=m -CONFIG_NF_CONNTRACK_H323=m -CONFIG_NF_CONNTRACK_IRC=m -CONFIG_NF_CONNTRACK_BROADCAST=m -CONFIG_NF_CONNTRACK_NETBIOS_NS=m -CONFIG_NF_CONNTRACK_SNMP=m -CONFIG_NF_CONNTRACK_PPTP=m -CONFIG_NF_CONNTRACK_SANE=m -CONFIG_NF_CONNTRACK_SIP=m -CONFIG_NF_CONNTRACK_TFTP=m -CONFIG_NF_CT_NETLINK=m -# CONFIG_NF_CT_NETLINK_TIMEOUT is not set -# CONFIG_NETFILTER_TPROXY is not set -CONFIG_NETFILTER_XTABLES=m - -# -# Xtables combined modules -# -CONFIG_NETFILTER_XT_MARK=m -CONFIG_NETFILTER_XT_CONNMARK=m -# CONFIG_NETFILTER_XT_SET is not set - -# -# Xtables targets -# -CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m -CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m -CONFIG_NETFILTER_XT_TARGET_CONNMARK=m -CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m -CONFIG_NETFILTER_XT_TARGET_CT=m -CONFIG_NETFILTER_XT_TARGET_DSCP=m -CONFIG_NETFILTER_XT_TARGET_HL=m -CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m -# CONFIG_NETFILTER_XT_TARGET_LED is not set -# CONFIG_NETFILTER_XT_TARGET_LOG is not set -CONFIG_NETFILTER_XT_TARGET_MARK=m -CONFIG_NETFILTER_XT_TARGET_NFLOG=m -CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m -CONFIG_NETFILTER_XT_TARGET_NOTRACK=m -CONFIG_NETFILTER_XT_TARGET_RATEEST=m -CONFIG_NETFILTER_XT_TARGET_TEE=m -# CONFIG_NETFILTER_XT_TARGET_TRACE is not set -CONFIG_NETFILTER_XT_TARGET_SECMARK=m -CONFIG_NETFILTER_XT_TARGET_TCPMSS=m -CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m - -# -# Xtables matches -# -CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m -CONFIG_NETFILTER_XT_MATCH_CLUSTER=m -CONFIG_NETFILTER_XT_MATCH_COMMENT=m -CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m -CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m -CONFIG_NETFILTER_XT_MATCH_CONNMARK=m -CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m -CONFIG_NETFILTER_XT_MATCH_CPU=m -CONFIG_NETFILTER_XT_MATCH_DCCP=m -CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m -CONFIG_NETFILTER_XT_MATCH_DSCP=m -CONFIG_NETFILTER_XT_MATCH_ECN=m -CONFIG_NETFILTER_XT_MATCH_ESP=m -CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m -CONFIG_NETFILTER_XT_MATCH_HELPER=m -CONFIG_NETFILTER_XT_MATCH_HL=m -CONFIG_NETFILTER_XT_MATCH_IPRANGE=m -CONFIG_NETFILTER_XT_MATCH_LENGTH=m -CONFIG_NETFILTER_XT_MATCH_LIMIT=m -CONFIG_NETFILTER_XT_MATCH_MAC=m -CONFIG_NETFILTER_XT_MATCH_MARK=m -CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m -# CONFIG_NETFILTER_XT_MATCH_NFACCT is not set -CONFIG_NETFILTER_XT_MATCH_OSF=m -CONFIG_NETFILTER_XT_MATCH_OWNER=m -CONFIG_NETFILTER_XT_MATCH_POLICY=m -CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m -CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m -CONFIG_NETFILTER_XT_MATCH_QUOTA=m -CONFIG_NETFILTER_XT_MATCH_QUOTA2=m -CONFIG_NETFILTER_XT_MATCH_RATEEST=m -CONFIG_NETFILTER_XT_MATCH_REALM=m -CONFIG_NETFILTER_XT_MATCH_RECENT=m -CONFIG_NETFILTER_XT_MATCH_SCTP=m -CONFIG_NETFILTER_XT_MATCH_STATE=m -CONFIG_NETFILTER_XT_MATCH_STATISTIC=m -CONFIG_NETFILTER_XT_MATCH_STRING=m -CONFIG_NETFILTER_XT_MATCH_TCPMSS=m -CONFIG_NETFILTER_XT_MATCH_TIME=m -CONFIG_NETFILTER_XT_MATCH_U32=m -CONFIG_IP_SET=m -CONFIG_IP_SET_MAX=256 -CONFIG_IP_SET_BITMAP_IP=m -CONFIG_IP_SET_BITMAP_IPMAC=m -CONFIG_IP_SET_BITMAP_PORT=m -CONFIG_IP_SET_HASH_IP=m -CONFIG_IP_SET_HASH_IPPORT=m -CONFIG_IP_SET_HASH_IPPORTIP=m -CONFIG_IP_SET_HASH_IPPORTNET=m -CONFIG_IP_SET_HASH_NET=m -CONFIG_IP_SET_HASH_NETPORT=m -# CONFIG_IP_SET_HASH_NETIFACE is not set -CONFIG_IP_SET_LIST_SET=m -# CONFIG_IP_VS is not set - -# -# IP: Netfilter Configuration -# -CONFIG_NF_DEFRAG_IPV4=m -CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_NF_CONNTRACK_PROC_COMPAT=y -CONFIG_IP_NF_QUEUE=m -CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_AH=m -CONFIG_IP_NF_MATCH_ECN=m -# CONFIG_IP_NF_MATCH_RPFILTER is not set -CONFIG_IP_NF_MATCH_TTL=m -CONFIG_IP_NF_FILTER=m -CONFIG_IP_NF_TARGET_REJECT=m -# CONFIG_IP_NF_TARGET_REJECT_SKERR is not set -CONFIG_IP_NF_TARGET_ULOG=m -CONFIG_NF_NAT=m -CONFIG_NF_NAT_NEEDED=y -CONFIG_IP_NF_TARGET_MASQUERADE=m -CONFIG_IP_NF_TARGET_NETMAP=m -CONFIG_IP_NF_TARGET_REDIRECT=m -CONFIG_NF_NAT_SNMP_BASIC=m -CONFIG_NF_NAT_PROTO_DCCP=m -CONFIG_NF_NAT_PROTO_GRE=m -CONFIG_NF_NAT_PROTO_UDPLITE=m -CONFIG_NF_NAT_PROTO_SCTP=m -CONFIG_NF_NAT_FTP=m -CONFIG_NF_NAT_IRC=m -CONFIG_NF_NAT_TFTP=m -CONFIG_NF_NAT_AMANDA=m -CONFIG_NF_NAT_PPTP=m -CONFIG_NF_NAT_H323=m -CONFIG_NF_NAT_SIP=m -CONFIG_IP_NF_MANGLE=m -CONFIG_IP_NF_TARGET_CLUSTERIP=m -CONFIG_IP_NF_TARGET_ECN=m -CONFIG_IP_NF_TARGET_TTL=m -CONFIG_IP_NF_RAW=m -CONFIG_IP_NF_ARPTABLES=m -CONFIG_IP_NF_ARPFILTER=m -CONFIG_IP_NF_ARP_MANGLE=m - -# -# IPv6: Netfilter Configuration -# -CONFIG_NF_DEFRAG_IPV6=m -CONFIG_NF_CONNTRACK_IPV6=m -CONFIG_IP6_NF_QUEUE=m -CONFIG_IP6_NF_IPTABLES=m -CONFIG_IP6_NF_MATCH_AH=m -CONFIG_IP6_NF_MATCH_EUI64=m -CONFIG_IP6_NF_MATCH_FRAG=m -CONFIG_IP6_NF_MATCH_OPTS=m -CONFIG_IP6_NF_MATCH_HL=m -CONFIG_IP6_NF_MATCH_IPV6HEADER=m -CONFIG_IP6_NF_MATCH_MH=m -# CONFIG_IP6_NF_MATCH_RPFILTER is not set -CONFIG_IP6_NF_MATCH_RT=m -CONFIG_IP6_NF_TARGET_HL=m -CONFIG_IP6_NF_FILTER=m -CONFIG_IP6_NF_TARGET_REJECT=m -# CONFIG_IP6_NF_TARGET_REJECT_SKERR is not set -CONFIG_IP6_NF_MANGLE=m -CONFIG_IP6_NF_RAW=m -CONFIG_BRIDGE_NF_EBTABLES=m -CONFIG_BRIDGE_EBT_BROUTE=m -CONFIG_BRIDGE_EBT_T_FILTER=m -CONFIG_BRIDGE_EBT_T_NAT=m -CONFIG_BRIDGE_EBT_802_3=m -CONFIG_BRIDGE_EBT_AMONG=m -CONFIG_BRIDGE_EBT_ARP=m -CONFIG_BRIDGE_EBT_IP=m -CONFIG_BRIDGE_EBT_IP6=m -CONFIG_BRIDGE_EBT_LIMIT=m -CONFIG_BRIDGE_EBT_MARK=m -CONFIG_BRIDGE_EBT_PKTTYPE=m -CONFIG_BRIDGE_EBT_STP=m -CONFIG_BRIDGE_EBT_VLAN=m -CONFIG_BRIDGE_EBT_ARPREPLY=m -CONFIG_BRIDGE_EBT_DNAT=m -CONFIG_BRIDGE_EBT_MARK_T=m -CONFIG_BRIDGE_EBT_REDIRECT=m -CONFIG_BRIDGE_EBT_SNAT=m -CONFIG_BRIDGE_EBT_LOG=m -CONFIG_BRIDGE_EBT_ULOG=m -CONFIG_BRIDGE_EBT_NFLOG=m -# CONFIG_IP_DCCP is not set -CONFIG_IP_SCTP=m -# CONFIG_SCTP_DBG_MSG is not set -# CONFIG_SCTP_DBG_OBJCNT is not set -# CONFIG_SCTP_HMAC_NONE is not set -# CONFIG_SCTP_HMAC_SHA1 is not set -CONFIG_SCTP_HMAC_MD5=y -# CONFIG_RDS is not set -# CONFIG_TIPC is not set -# CONFIG_ATM is not set -CONFIG_L2TP=m -CONFIG_L2TP_V3=y -CONFIG_L2TP_IP=m -CONFIG_L2TP_ETH=m -CONFIG_STP=y -CONFIG_GARP=y -CONFIG_BRIDGE=m -CONFIG_BRIDGE_IGMP_SNOOPING=y -# CONFIG_NET_DSA is not set -CONFIG_VLAN_8021Q=y -CONFIG_VLAN_8021Q_GVRP=y -# CONFIG_DECNET is not set -CONFIG_LLC=y -# CONFIG_LLC2 is not set -# CONFIG_IPX is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set -# CONFIG_PHONET is not set -# CONFIG_IEEE802154 is not set -# CONFIG_NET_SCHED is not set -# CONFIG_DCB is not set -CONFIG_DNS_RESOLVER=y -# CONFIG_BATMAN_ADV is not set -# CONFIG_OPENVSWITCH is not set -# CONFIG_NETPRIO_CGROUP is not set -CONFIG_BQL=y -CONFIG_HAVE_BPF_JIT=y -# CONFIG_BPF_JIT is not set - -# -# Network testing -# -CONFIG_NET_PKTGEN=m -# CONFIG_HAMRADIO is not set -# CONFIG_CAN is not set -CONFIG_IRDA=m - -# -# IrDA protocols -# -CONFIG_IRLAN=m -CONFIG_IRNET=m -CONFIG_IRCOMM=m -CONFIG_IRDA_ULTRA=y - -# -# IrDA options -# -CONFIG_IRDA_CACHE_LAST_LSAP=y -CONFIG_IRDA_FAST_RR=y -CONFIG_IRDA_DEBUG=y - -# -# Infrared-port device drivers -# - -# -# SIR device drivers -# -CONFIG_IRTTY_SIR=m - -# -# Dongle support -# -CONFIG_DONGLE=y -CONFIG_ESI_DONGLE=m -CONFIG_ACTISYS_DONGLE=m -CONFIG_TEKRAM_DONGLE=m -CONFIG_TOIM3232_DONGLE=m -CONFIG_LITELINK_DONGLE=m -CONFIG_MA600_DONGLE=m -CONFIG_GIRBIL_DONGLE=m -CONFIG_MCP2120_DONGLE=m -CONFIG_OLD_BELKIN_DONGLE=m -CONFIG_ACT200L_DONGLE=m -CONFIG_KINGSUN_DONGLE=m -CONFIG_KSDAZZLE_DONGLE=m -CONFIG_KS959_DONGLE=m - -# -# FIR device drivers -# -CONFIG_USB_IRDA=m -# CONFIG_SIGMATEL_FIR is not set -# CONFIG_MCS_FIR is not set -CONFIG_BT=y -CONFIG_BT_RFCOMM=y -CONFIG_BT_RFCOMM_TTY=y -CONFIG_BT_BNEP=y -CONFIG_BT_BNEP_MC_FILTER=y -CONFIG_BT_BNEP_PROTO_FILTER=y -CONFIG_BT_HIDP=y - -# -# Bluetooth device drivers -# -CONFIG_BT_HCIBTUSB=m -# CONFIG_BT_HCIBTSDIO is not set -CONFIG_BT_HCIUART=y -CONFIG_BT_HCIUART_H4=y -CONFIG_BT_HCIUART_BCSP=y -# CONFIG_BT_HCIUART_ATH3K is not set -CONFIG_BT_HCIUART_LL=y -CONFIG_BT_HCIBCM203X=m -CONFIG_BT_HCIBPA10X=m -CONFIG_BT_HCIBFUSB=m -CONFIG_BT_HCIVHCI=m -CONFIG_BT_MRVL=m -CONFIG_BT_MRVL_SDIO=m -CONFIG_BT_ATH3K=m -CONFIG_BT_WILINK=m -# CONFIG_AF_RXRPC is not set -CONFIG_FIB_RULES=y -CONFIG_WIRELESS=y -CONFIG_WIRELESS_EXT=y -CONFIG_WEXT_CORE=y -CONFIG_WEXT_PROC=y -CONFIG_WEXT_SPY=y -CONFIG_WEXT_PRIV=y -CONFIG_CFG80211=m -CONFIG_NL80211_TESTMODE=y -# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set -# CONFIG_CFG80211_REG_DEBUG is not set -CONFIG_CFG80211_DEFAULT_PS=y -# CONFIG_CFG80211_INTERNAL_REGDB is not set -CONFIG_CFG80211_WEXT=y -CONFIG_WIRELESS_EXT_SYSFS=y -CONFIG_LIB80211=m -CONFIG_LIB80211_CRYPT_WEP=m -CONFIG_LIB80211_CRYPT_CCMP=m -CONFIG_LIB80211_CRYPT_TKIP=m -# CONFIG_LIB80211_DEBUG is not set -# CONFIG_CFG80211_ALLOW_RECONNECT is not set -CONFIG_MAC80211=m -CONFIG_MAC80211_HAS_RC=y -CONFIG_MAC80211_RC_MINSTREL=y -CONFIG_MAC80211_RC_MINSTREL_HT=y -CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y -CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" -# CONFIG_MAC80211_MESH is not set -CONFIG_MAC80211_LEDS=y -# CONFIG_MAC80211_DEBUG_MENU is not set -CONFIG_WIMAX=m -CONFIG_WIMAX_DEBUG_LEVEL=8 -CONFIG_RFKILL=y -CONFIG_RFKILL_PM=y -CONFIG_RFKILL_LEDS=y -CONFIG_RFKILL_INPUT=y -# CONFIG_RFKILL_REGULATOR is not set -CONFIG_RFKILL_GPIO=m -CONFIG_SUNXI_RFKILL=y -# CONFIG_NET_9P is not set -# CONFIG_CAIF is not set -# CONFIG_CEPH_LIB is not set -# CONFIG_NFC is not set - -# -# Device Drivers -# - -# -# Generic Driver Options -# -CONFIG_UEVENT_HELPER_PATH="" -CONFIG_DEVTMPFS=y -CONFIG_DEVTMPFS_MOUNT=y -CONFIG_STANDALONE=y -CONFIG_PREVENT_FIRMWARE_BUILD=y -CONFIG_FW_LOADER=y -CONFIG_FIRMWARE_IN_KERNEL=y -CONFIG_EXTRA_FIRMWARE="" -# CONFIG_FW_LOADER_USER_HELPER is not set -# CONFIG_DEBUG_DRIVER is not set -# CONFIG_DEBUG_DEVRES is not set -# CONFIG_SYS_HYPERVISOR is not set -# CONFIG_GENERIC_CPU_DEVICES is not set -CONFIG_REGMAP=y -CONFIG_REGMAP_I2C=y -CONFIG_REGMAP_SPI=y -CONFIG_DMA_SHARED_BUFFER=y -# CONFIG_SYNC is not set -# CONFIG_CMA is not set -CONFIG_CONNECTOR=y -CONFIG_PROC_EVENTS=y -CONFIG_MTD=y -# CONFIG_MTD_TESTS is not set -# CONFIG_MTD_REDBOOT_PARTS is not set -CONFIG_MTD_CMDLINE_PARTS=y -# CONFIG_MTD_AFS_PARTS is not set -CONFIG_MTD_OF_PARTS=y -# CONFIG_MTD_AR7_PARTS is not set - -# -# User Modules And Translation Layers -# -# CONFIG_MTD_CHAR is not set -# CONFIG_MTD_BLKDEVS is not set -# CONFIG_MTD_BLOCK is not set -# CONFIG_MTD_BLOCK_RO is not set -# CONFIG_FTL is not set -# CONFIG_NFTL is not set -# CONFIG_INFTL is not set -# CONFIG_RFD_FTL is not set -# CONFIG_SSFDC is not set -# CONFIG_SM_FTL is not set -# CONFIG_MTD_OOPS is not set -# CONFIG_MTD_SWAP is not set - -# -# RAM/ROM/Flash chip drivers -# -CONFIG_MTD_CFI=m -# CONFIG_MTD_JEDECPROBE is not set -CONFIG_MTD_GEN_PROBE=m -# CONFIG_MTD_CFI_ADV_OPTIONS is not set -CONFIG_MTD_MAP_BANK_WIDTH_1=y -CONFIG_MTD_MAP_BANK_WIDTH_2=y -CONFIG_MTD_MAP_BANK_WIDTH_4=y -# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set -# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set -# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set -CONFIG_MTD_CFI_I1=y -CONFIG_MTD_CFI_I2=y -# CONFIG_MTD_CFI_I4 is not set -# CONFIG_MTD_CFI_I8 is not set -# CONFIG_MTD_CFI_INTELEXT is not set -# CONFIG_MTD_CFI_AMDSTD is not set -# CONFIG_MTD_CFI_STAA is not set -CONFIG_MTD_CFI_UTIL=m -# CONFIG_MTD_RAM is not set -# CONFIG_MTD_ROM is not set -# CONFIG_MTD_ABSENT is not set - -# -# Mapping drivers for chip access -# -# CONFIG_MTD_COMPLEX_MAPPINGS is not set -# CONFIG_MTD_PHYSMAP is not set -# CONFIG_MTD_PHYSMAP_OF is not set -# CONFIG_MTD_PLATRAM is not set - -# -# Self-contained MTD device drivers -# -# CONFIG_MTD_DATAFLASH is not set -# CONFIG_MTD_M25P80 is not set -# CONFIG_MTD_SST25L is not set -# CONFIG_MTD_SLRAM is not set -# CONFIG_MTD_PHRAM is not set -# CONFIG_MTD_MTDRAM is not set -# CONFIG_MTD_BLOCK2MTD is not set - -# -# Disk-On-Chip Device Drivers -# -# CONFIG_MTD_DOC2000 is not set -# CONFIG_MTD_DOC2001 is not set -# CONFIG_MTD_DOC2001PLUS is not set -# CONFIG_MTD_DOCG3 is not set -CONFIG_MTD_NAND_IDS=y -CONFIG_MTD_NAND_ECC=y -# CONFIG_MTD_NAND_ECC_SMC is not set -CONFIG_MTD_NAND=y -CONFIG_MTD_NAND_VERIFY_WRITE=y -# CONFIG_MTD_NAND_ECC_BCH is not set -# CONFIG_MTD_SM_COMMON is not set -# CONFIG_MTD_NAND_MUSEUM_IDS is not set -# CONFIG_MTD_NAND_GPIO is not set -# CONFIG_MTD_NAND_DISKONCHIP is not set -# CONFIG_MTD_NAND_DOCG4 is not set -# CONFIG_MTD_NAND_NANDSIM is not set -CONFIG_MTD_NAND_PLATFORM=m -# CONFIG_MTD_ALAUDA is not set -CONFIG_MTD_ONENAND=y -CONFIG_MTD_ONENAND_VERIFY_WRITE=y -# CONFIG_MTD_ONENAND_GENERIC is not set -# CONFIG_MTD_ONENAND_OTP is not set -# CONFIG_MTD_ONENAND_2X_PROGRAM is not set -# CONFIG_MTD_ONENAND_SIM is not set - -# -# LPDDR flash memory drivers -# -# CONFIG_MTD_LPDDR is not set -CONFIG_MTD_UBI=y -CONFIG_MTD_UBI_WL_THRESHOLD=4096 -CONFIG_MTD_UBI_BEB_RESERVE=1 -# CONFIG_MTD_UBI_GLUEBI is not set -# CONFIG_MTD_UBI_DEBUG is not set -CONFIG_DTC=y -CONFIG_OF=y - -# -# Device Tree and Open Firmware support -# -CONFIG_PROC_DEVICETREE=y -# CONFIG_OF_SELFTEST is not set -CONFIG_OF_FLATTREE=y -CONFIG_OF_EARLY_FLATTREE=y -CONFIG_OF_ADDRESS=y -CONFIG_OF_IRQ=y -CONFIG_OF_DEVICE=y -CONFIG_OF_GPIO=y -CONFIG_OF_I2C=y -CONFIG_OF_NET=y -CONFIG_OF_SPI=y -CONFIG_OF_MDIO=y -CONFIG_OF_MTD=y -# CONFIG_PARPORT is not set -CONFIG_BLK_DEV=y -# CONFIG_BLK_DEV_COW_COMMON is not set -CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 -CONFIG_BLK_DEV_CRYPTOLOOP=y -# CONFIG_BLK_DEV_DRBD is not set -# CONFIG_BLK_DEV_NBD is not set -# CONFIG_BLK_DEV_UB is not set -CONFIG_BLK_DEV_RAM=y -CONFIG_BLK_DEV_RAM_COUNT=2 -CONFIG_BLK_DEV_RAM_SIZE=4096 -# CONFIG_BLK_DEV_XIP is not set -# CONFIG_CDROM_PKTCDVD is not set -# CONFIG_ATA_OVER_ETH is not set -# CONFIG_MG_DISK is not set -# CONFIG_BLK_DEV_RBD is not set -CONFIG_SUNXI_NAND=y -CONFIG_SUNXI_NAND_COMPAT_DEV=y -# CONFIG_SUNXI_NAND_TEST is not set - -# -# Misc devices -# -# CONFIG_SENSORS_LIS3LV02D is not set -# CONFIG_AD525X_DPOT is not set -CONFIG_SUNXI_DBGREG=m -# CONFIG_ATMEL_PWM is not set -# CONFIG_SUNXI_PWM is not set -# CONFIG_ICS932S401 is not set -# CONFIG_ENCLOSURE_SERVICES is not set -# CONFIG_APDS9802ALS is not set -# CONFIG_ISL29003 is not set -# CONFIG_ISL29020 is not set -# CONFIG_SENSORS_TSL2550 is not set -# CONFIG_SENSORS_BH1780 is not set -# CONFIG_SENSORS_BH1770 is not set -# CONFIG_SENSORS_APDS990X is not set -# CONFIG_HMC6352 is not set -# CONFIG_SENSORS_AK8975 is not set -# CONFIG_DS1682 is not set -# CONFIG_TI_DAC7512 is not set -# CONFIG_UID_STAT is not set -# CONFIG_BMP085 is not set -# CONFIG_USB_SWITCH_FSA9480 is not set -# CONFIG_WL127X_RFKILL is not set -# CONFIG_C2PORT is not set - -# -# EEPROM support -# -# CONFIG_EEPROM_AT24 is not set -# CONFIG_EEPROM_AT25 is not set -# CONFIG_EEPROM_LEGACY is not set -# CONFIG_EEPROM_MAX6875 is not set -CONFIG_EEPROM_93CX6=m -# CONFIG_EEPROM_93XX46 is not set -# CONFIG_IWMC3200TOP is not set - -# -# Texas Instruments shared transport line discipline -# -CONFIG_TI_ST=m -# CONFIG_SENSORS_LIS3_SPI is not set -# CONFIG_SENSORS_LIS3_I2C is not set - -# -# Altera FPGA firmware download module -# -# CONFIG_ALTERA_STAPL is not set - -# -# SCSI device support -# -CONFIG_SCSI_MOD=y -# CONFIG_RAID_ATTRS is not set -CONFIG_SCSI=y -CONFIG_SCSI_DMA=y -# CONFIG_SCSI_TGT is not set -# CONFIG_SCSI_NETLINK is not set -CONFIG_SCSI_PROC_FS=y - -# -# SCSI support type (disk, tape, CD-ROM) -# -CONFIG_BLK_DEV_SD=y -# CONFIG_CHR_DEV_ST is not set -# CONFIG_CHR_DEV_OSST is not set -CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y -# CONFIG_CHR_DEV_SG is not set -# CONFIG_CHR_DEV_SCH is not set -CONFIG_SCSI_MULTI_LUN=y -# CONFIG_SCSI_CONSTANTS is not set -# CONFIG_SCSI_LOGGING is not set -# CONFIG_SCSI_SCAN_ASYNC is not set -CONFIG_SCSI_WAIT_SCAN=m - -# -# SCSI Transports -# -# CONFIG_SCSI_SPI_ATTRS is not set -# CONFIG_SCSI_FC_ATTRS is not set -CONFIG_SCSI_ISCSI_ATTRS=m -# CONFIG_SCSI_SAS_ATTRS is not set -# CONFIG_SCSI_SAS_LIBSAS is not set -# CONFIG_SCSI_SRP_ATTRS is not set -CONFIG_SCSI_LOWLEVEL=y -CONFIG_ISCSI_TCP=m -CONFIG_ISCSI_BOOT_SYSFS=m -# CONFIG_LIBFC is not set -# CONFIG_LIBFCOE is not set -# CONFIG_SCSI_DEBUG is not set -# CONFIG_SCSI_DH is not set -# CONFIG_SCSI_OSD_INITIATOR is not set -CONFIG_ATA=y -# CONFIG_ATA_NONSTANDARD is not set -CONFIG_ATA_VERBOSE_ERROR=y -CONFIG_SATA_PMP=y - -# -# Controllers with non-SFF native interface -# -CONFIG_SATA_AHCI_PLATFORM=y -CONFIG_SW_SATA_AHCI_PLATFORM=y -CONFIG_ATA_SFF=y - -# -# SFF controllers with custom DMA interface -# -CONFIG_ATA_BMDMA=y - -# -# SATA SFF controllers with BMDMA -# -# CONFIG_SATA_MV is not set - -# -# PATA SFF controllers with BMDMA -# - -# -# PIO-only SFF controllers -# - -# -# Generic fallback / legacy drivers -# -CONFIG_MD=y -CONFIG_BLK_DEV_MD=m -CONFIG_MD_LINEAR=m -CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID10=m -CONFIG_MD_RAID456=m -CONFIG_MD_MULTIPATH=m -CONFIG_MD_FAULTY=m -CONFIG_BLK_DEV_DM_BUILTIN=y -CONFIG_BLK_DEV_DM=m -# CONFIG_DM_DEBUG is not set -CONFIG_DM_BUFIO=m -CONFIG_DM_PERSISTENT_DATA=m -CONFIG_DM_CRYPT=m -CONFIG_DM_SNAPSHOT=m -CONFIG_DM_THIN_PROVISIONING=m -CONFIG_DM_DEBUG_BLOCK_STACK_TRACING=y -CONFIG_DM_DEBUG_SPACE_MAPS=y -CONFIG_DM_MIRROR=m -CONFIG_DM_RAID=m -# CONFIG_DM_LOG_USERSPACE is not set -CONFIG_DM_ZERO=m -CONFIG_DM_MULTIPATH=m -CONFIG_DM_MULTIPATH_QL=m -CONFIG_DM_MULTIPATH_ST=m -CONFIG_DM_DELAY=m -CONFIG_DM_UEVENT=y -CONFIG_DM_FLAKEY=m -# CONFIG_DM_VERITY is not set -# CONFIG_TARGET_CORE is not set -CONFIG_NETDEVICES=y -CONFIG_NET_CORE=y -# CONFIG_BONDING is not set -# CONFIG_DUMMY is not set -# CONFIG_EQUALIZER is not set -CONFIG_MII=y -# CONFIG_NET_TEAM is not set -# CONFIG_MACVLAN is not set -# CONFIG_NETCONSOLE is not set -# CONFIG_NETPOLL is not set -# CONFIG_NET_POLL_CONTROLLER is not set -CONFIG_TUN=m -# CONFIG_VETH is not set - -# -# CAIF transport drivers -# -CONFIG_ETHERNET=y -CONFIG_NET_VENDOR_BROADCOM=y -# CONFIG_B44 is not set -# CONFIG_NET_CALXEDA_XGMAC is not set -CONFIG_NET_VENDOR_CHELSIO=y -CONFIG_NET_VENDOR_CIRRUS=y -# CONFIG_CS89x0 is not set -# CONFIG_DM9000 is not set -# CONFIG_DNET is not set -CONFIG_NET_VENDOR_FARADAY=y -# CONFIG_FTMAC100 is not set -# CONFIG_FTGMAC100 is not set -CONFIG_NET_VENDOR_INTEL=y -CONFIG_NET_VENDOR_I825XX=y -CONFIG_NET_VENDOR_MARVELL=y -CONFIG_NET_VENDOR_MICREL=y -# CONFIG_KS8851 is not set -# CONFIG_KS8851_MLL is not set -CONFIG_NET_VENDOR_MICROCHIP=y -# CONFIG_ENC28J60 is not set -CONFIG_NET_VENDOR_NATSEMI=y -CONFIG_NET_VENDOR_8390=y -# CONFIG_AX88796 is not set -# CONFIG_ETHOC is not set -CONFIG_NET_VENDOR_SEEQ=y -# CONFIG_SEEQ8005 is not set -CONFIG_NET_VENDOR_SMSC=y -# CONFIG_SMC91X is not set -# CONFIG_SMC911X is not set -# CONFIG_SMSC911X is not set -CONFIG_NET_VENDOR_STMICRO=y -# CONFIG_STMMAC_ETH is not set -CONFIG_SUNXI_EMAC=y -CONFIG_PHYLIB=y - -# -# MII PHY device drivers -# -# CONFIG_AMD_PHY is not set -# CONFIG_MARVELL_PHY is not set -# CONFIG_DAVICOM_PHY is not set -# CONFIG_QSEMI_PHY is not set -# CONFIG_LXT_PHY is not set -# CONFIG_CICADA_PHY is not set -# CONFIG_VITESSE_PHY is not set -# CONFIG_SMSC_PHY is not set -# CONFIG_BROADCOM_PHY is not set -# CONFIG_ICPLUS_PHY is not set -CONFIG_REALTEK_PHY=m -# CONFIG_NATIONAL_PHY is not set -# CONFIG_STE10XP is not set -# CONFIG_LSI_ET1011C_PHY is not set -# CONFIG_MICREL_PHY is not set -# CONFIG_FIXED_PHY is not set -# CONFIG_MDIO_BITBANG is not set -# CONFIG_MICREL_KS8995MA is not set -CONFIG_PPP=m -CONFIG_PPP_BSDCOMP=m -CONFIG_PPP_DEFLATE=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_MPPE=m -CONFIG_PPP_MULTILINK=y -CONFIG_PPPOE=m -CONFIG_PPPOL2TP=m -CONFIG_PPPOLAC=m -CONFIG_PPPOPNS=m -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -# CONFIG_SLIP is not set -CONFIG_SLHC=m - -# -# USB Network Adapters -# -# CONFIG_USB_CATC is not set -CONFIG_USB_KAWETH=m -CONFIG_USB_PEGASUS=m -CONFIG_USB_RTL8150=m -CONFIG_USB_USBNET=m -CONFIG_USB_NET_AX8817X=m -CONFIG_USB_NET_QF9700=m -CONFIG_USB_NET_CDCETHER=m -CONFIG_USB_NET_CDC_EEM=m -CONFIG_USB_NET_CDC_NCM=m -CONFIG_USB_NET_DM9601=m -CONFIG_USB_NET_SMSC75XX=m -CONFIG_USB_NET_SMSC95XX=m -CONFIG_USB_NET_GL620A=m -CONFIG_USB_NET_NET1080=m -CONFIG_USB_NET_PLUSB=m -CONFIG_USB_NET_MCS7830=m -CONFIG_USB_NET_RNDIS_HOST=m -CONFIG_USB_NET_CDC_SUBSET=m -CONFIG_USB_ALI_M5632=y -CONFIG_USB_AN2720=y -CONFIG_USB_BELKIN=y -CONFIG_USB_ARMLINUX=y -CONFIG_USB_EPSON2888=y -CONFIG_USB_KC2190=y -CONFIG_USB_NET_ZAURUS=m -CONFIG_USB_NET_CX82310_ETH=m -CONFIG_USB_NET_KALMIA=m -# CONFIG_USB_NET_QMI_WWAN is not set -CONFIG_USB_HSO=m -CONFIG_USB_NET_INT51X1=m -CONFIG_USB_IPHETH=m -CONFIG_USB_SIERRA_NET=m -CONFIG_USB_VL600=m -CONFIG_WLAN=y -# CONFIG_LIBERTAS_THINFIRM is not set -CONFIG_AT76C50X_USB=m -CONFIG_USB_ZD1201=m -CONFIG_USB_NET_RNDIS_WLAN=m -CONFIG_RTL8187=m -CONFIG_RTL8187_LEDS=y -# CONFIG_MAC80211_HWSIM is not set -# CONFIG_WIFI_CONTROL_FUNC is not set -CONFIG_ATH_COMMON=m -# CONFIG_ATH_DEBUG is not set -CONFIG_ATH9K_HW=m -CONFIG_ATH9K_COMMON=m -CONFIG_ATH9K_BTCOEX_SUPPORT=y -CONFIG_ATH9K=m -# CONFIG_ATH9K_AHB is not set -# CONFIG_ATH9K_LEGACY_RATE_CONTROL is not set -CONFIG_ATH9K_HTC=m -CONFIG_CARL9170=m -CONFIG_CARL9170_LEDS=y -CONFIG_CARL9170_WPC=y -# CONFIG_ATH6KL is not set -# CONFIG_B43 is not set -# CONFIG_B43LEGACY is not set -CONFIG_BCMDHD=m -# CONFIG_BCM4339 is not set -CONFIG_BCMDHD_FW_PATH="/system/etc/firmware/fw_bcmdhd.bin" -CONFIG_BCMDHD_NVRAM_PATH="/system/etc/wifi/bcmdhd.cal" -# CONFIG_DHD_USE_STATIC_BUF is not set -# CONFIG_DHD_USE_SCHED_SCAN is not set -# CONFIG_BRCMFMAC is not set -CONFIG_BCM4330=m -CONFIG_HOSTAP=m -# CONFIG_HOSTAP_FIRMWARE is not set -# CONFIG_IWM is not set -CONFIG_LIBERTAS=m -CONFIG_LIBERTAS_USB=m -CONFIG_LIBERTAS_SDIO=m -# CONFIG_LIBERTAS_SPI is not set -# CONFIG_LIBERTAS_DEBUG is not set -# CONFIG_LIBERTAS_MESH is not set -# CONFIG_P54_COMMON is not set -CONFIG_RT2X00=m -CONFIG_RT2500USB=m -CONFIG_RT73USB=m -CONFIG_RT2800USB=m -CONFIG_RT2800USB_RT33XX=y -CONFIG_RT2800USB_RT35XX=y -CONFIG_RT2800USB_RT53XX=y -CONFIG_RT2800USB_UNKNOWN=y -CONFIG_RT2800_LIB=m -CONFIG_RT2X00_LIB_USB=m -CONFIG_RT2X00_LIB=m -CONFIG_RT2X00_LIB_FIRMWARE=y -CONFIG_RT2X00_LIB_CRYPTO=y -CONFIG_RT2X00_LIB_LEDS=y -# CONFIG_RT2X00_DEBUG is not set -CONFIG_RTL8192CU=m -CONFIG_RTLWIFI=m -CONFIG_RTLWIFI_DEBUG=y -CONFIG_RTL8192C_COMMON=m -# CONFIG_WL1251 is not set -# CONFIG_WL12XX_MENU is not set -CONFIG_ZD1211RW=m -# CONFIG_ZD1211RW_DEBUG is not set -CONFIG_MWIFIEX=m -CONFIG_MWIFIEX_SDIO=m -CONFIG_RTL8192CU_SW=m -# CONFIG_RTL8188EU is not set -# CONFIG_RTL8189ES is not set -# CONFIG_RTL8723AS is not set -# CONFIG_RTXX7X_SW is not set - -# -# WiMAX Wireless Broadband devices -# -# CONFIG_WIMAX_I2400M_USB is not set -# CONFIG_WIMAX_I2400M_SDIO is not set -# CONFIG_WAN is not set -# CONFIG_ISDN is not set - -# -# Input device support -# -CONFIG_INPUT=y -CONFIG_INPUT_FF_MEMLESS=y -CONFIG_INPUT_POLLDEV=y -# CONFIG_INPUT_SPARSEKMAP is not set - -# -# Userland interfaces -# -CONFIG_INPUT_MOUSEDEV=y -# CONFIG_INPUT_MOUSEDEV_PSAUX is not set -CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 -CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 -CONFIG_INPUT_JOYDEV=y -CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_EVBUG is not set -CONFIG_INPUT_KEYRESET=y - -# -# Input Device Drivers -# -CONFIG_INPUT_KEYBOARD=y -# CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set -CONFIG_KEYBOARD_ATKBD=y -# CONFIG_KEYBOARD_QT1070 is not set -# CONFIG_KEYBOARD_QT2160 is not set -# CONFIG_KEYBOARD_LKKBD is not set -# CONFIG_KEYBOARD_GPIO is not set -# CONFIG_KEYBOARD_TCA6416 is not set -# CONFIG_KEYBOARD_TCA8418 is not set -# CONFIG_KEYBOARD_MATRIX is not set -# CONFIG_KEYBOARD_LM8323 is not set -# CONFIG_KEYBOARD_MAX7359 is not set -# CONFIG_KEYBOARD_MCS is not set -# CONFIG_KEYBOARD_MPR121 is not set -# CONFIG_KEYBOARD_NEWTON is not set -# CONFIG_KEYBOARD_OPENCORES is not set -# CONFIG_KEYBOARD_SAMSUNG is not set -# CONFIG_KEYBOARD_STOWAWAY is not set -# CONFIG_KEYBOARD_SUNKBD is not set -# CONFIG_KEYBOARD_OMAP4 is not set -# CONFIG_KEYBOARD_XTKBD is not set -CONFIG_KEYBOARD_SUN4IKEYPAD=m -CONFIG_KEYBOARD_SUN4I_KEYBOARD=m -# CONFIG_KEYBOARD_SUN4I_KEYBOARD_FEX is not set -CONFIG_KEYBOARD_HV2605_KEYBOARD=m -CONFIG_IR_SUNXI=m -CONFIG_INPUT_MOUSE=y -CONFIG_MOUSE_PS2=y -CONFIG_MOUSE_PS2_ALPS=y -CONFIG_MOUSE_PS2_LOGIPS2PP=y -CONFIG_MOUSE_PS2_SYNAPTICS=y -CONFIG_MOUSE_PS2_TRACKPOINT=y -# CONFIG_MOUSE_PS2_ELANTECH is not set -# CONFIG_MOUSE_PS2_SENTELIC is not set -# CONFIG_MOUSE_PS2_TOUCHKIT is not set -# CONFIG_MOUSE_SERIAL is not set -# CONFIG_MOUSE_APPLETOUCH is not set -# CONFIG_MOUSE_BCM5974 is not set -# CONFIG_MOUSE_VSXXXAA is not set -# CONFIG_MOUSE_GPIO is not set -# CONFIG_MOUSE_SYNAPTICS_I2C is not set -# CONFIG_MOUSE_SYNAPTICS_USB is not set -CONFIG_INPUT_JOYSTICK=y -# CONFIG_JOYSTICK_ANALOG is not set -# CONFIG_JOYSTICK_A3D is not set -# CONFIG_JOYSTICK_ADI is not set -# CONFIG_JOYSTICK_COBRA is not set -# CONFIG_JOYSTICK_GF2K is not set -# CONFIG_JOYSTICK_GRIP is not set -# CONFIG_JOYSTICK_GRIP_MP is not set -# CONFIG_JOYSTICK_GUILLEMOT is not set -# CONFIG_JOYSTICK_INTERACT is not set -# CONFIG_JOYSTICK_SIDEWINDER is not set -# CONFIG_JOYSTICK_TMDC is not set -# CONFIG_JOYSTICK_IFORCE is not set -# CONFIG_JOYSTICK_WARRIOR is not set -# CONFIG_JOYSTICK_MAGELLAN is not set -# CONFIG_JOYSTICK_SPACEORB is not set -# CONFIG_JOYSTICK_SPACEBALL is not set -# CONFIG_JOYSTICK_STINGER is not set -# CONFIG_JOYSTICK_TWIDJOY is not set -# CONFIG_JOYSTICK_ZHENHUA is not set -# CONFIG_JOYSTICK_AS5011 is not set -# CONFIG_JOYSTICK_JOYDUMP is not set -# CONFIG_JOYSTICK_XPAD is not set -# CONFIG_INPUT_TABLET is not set -CONFIG_INPUT_TOUCHSCREEN=y -# CONFIG_TOUCHSCREEN_ADS7846 is not set -# CONFIG_TOUCHSCREEN_AD7877 is not set -# CONFIG_TOUCHSCREEN_AD7879 is not set -# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set -# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set -# CONFIG_TOUCHSCREEN_BU21013 is not set -# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set -# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set -# CONFIG_TOUCHSCREEN_DYNAPRO is not set -# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set -# CONFIG_TOUCHSCREEN_EETI is not set -# CONFIG_TOUCHSCREEN_EGALAX is not set -# CONFIG_TOUCHSCREEN_FUJITSU is not set -# CONFIG_TOUCHSCREEN_ILI210X is not set -# CONFIG_TOUCHSCREEN_GUNZE is not set -# CONFIG_TOUCHSCREEN_ELO is not set -# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set -# CONFIG_TOUCHSCREEN_MAX11801 is not set -# CONFIG_TOUCHSCREEN_MCS5000 is not set -# CONFIG_TOUCHSCREEN_MTOUCH is not set -# CONFIG_TOUCHSCREEN_INEXIO is not set -# CONFIG_TOUCHSCREEN_MK712 is not set -# CONFIG_TOUCHSCREEN_PENMOUNT is not set -# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI is not set -# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set -# CONFIG_TOUCHSCREEN_TOUCHWIN is not set -# CONFIG_TOUCHSCREEN_PIXCIR is not set -# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set -# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set -# CONFIG_TOUCHSCREEN_TSC_SERIO is not set -# CONFIG_TOUCHSCREEN_TSC2005 is not set -# CONFIG_TOUCHSCREEN_TSC2007 is not set -# CONFIG_TOUCHSCREEN_W90X900 is not set -# CONFIG_TOUCHSCREEN_ST1232 is not set -# CONFIG_TOUCHSCREEN_TPS6507X is not set -CONFIG_TOUCHSCREEN_GT801=m -# CONFIG_TOUCHSCREEN_GT801_2PLUS1_TS is not set -CONFIG_TOUCHSCREEN_GT811=m -CONFIG_TOUCHSCREEN_GT818=m -CONFIG_TOUCHSCREEN_SUN4I_TS=m -CONFIG_TOUCHSCREEN_FT5X_TS=m -CONFIG_TOUCHSCREEN_ZT8031=m -# CONFIG_TOUCHSCREEN_COASIA is not set -CONFIG_INPUT_MISC=y -# CONFIG_INPUT_AD714X is not set -# CONFIG_INPUT_BMA150 is not set -# CONFIG_INPUT_MMA8450 is not set -# CONFIG_INPUT_MPU3050 is not set -# CONFIG_INPUT_GP2A is not set -# CONFIG_INPUT_GPIO_TILT_POLLED is not set -# CONFIG_INPUT_ATI_REMOTE2 is not set -# CONFIG_INPUT_KEYCHORD is not set -# CONFIG_INPUT_KEYSPAN_REMOTE is not set -# CONFIG_INPUT_KXTJ9 is not set -# CONFIG_INPUT_POWERMATE is not set -# CONFIG_INPUT_YEALINK is not set -# CONFIG_INPUT_CM109 is not set -CONFIG_INPUT_UINPUT=m -# CONFIG_INPUT_GPIO is not set -# CONFIG_INPUT_PCF8574 is not set -# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set -# CONFIG_INPUT_ADXL34X is not set -# CONFIG_INPUT_CMA3000 is not set - -# -# Hardware I/O ports -# -CONFIG_SERIO=y -CONFIG_SERIO_SERPORT=y -# CONFIG_SERIO_AMBAKMI is not set -CONFIG_SERIO_LIBPS2=y -# CONFIG_SERIO_RAW is not set -# CONFIG_SERIO_ALTERA_PS2 is not set -# CONFIG_SERIO_PS2MULT is not set -# CONFIG_GAMEPORT is not set -CONFIG_GSENSOR=y -CONFIG_SENSORS_BMA250=m -CONFIG_MEMSIC_ECOMPASS=m -CONFIG_SENSORS_MXC622X=m - -# -# Character devices -# -CONFIG_VT=y -CONFIG_CONSOLE_TRANSLATIONS=y -CONFIG_VT_CONSOLE=y -CONFIG_VT_CONSOLE_SLEEP=y -CONFIG_HW_CONSOLE=y -CONFIG_VT_HW_CONSOLE_BINDING=y -CONFIG_UNIX98_PTYS=y -CONFIG_DEVPTS_MULTIPLE_INSTANCES=y -# CONFIG_LEGACY_PTYS is not set -CONFIG_SERIAL_NONSTANDARD=y -# CONFIG_N_HDLC is not set -# CONFIG_N_GSM is not set -# CONFIG_TRACE_SINK is not set -CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set -# CONFIG_STALDRV is not set - -# -# Serial drivers -# -CONFIG_SERIAL_8250=y -CONFIG_SERIAL_8250_CONSOLE=y -CONFIG_SERIAL_8250_SUNXI=y -CONFIG_SERIAL_8250_NR_UARTS=8 -CONFIG_SERIAL_8250_RUNTIME_UARTS=8 -# CONFIG_SERIAL_8250_EXTENDED is not set -# CONFIG_SERIAL_8250_DW is not set - -# -# Non-8250 serial port support -# -# CONFIG_SERIAL_AMBA_PL010 is not set -# CONFIG_SERIAL_AMBA_PL011 is not set -# CONFIG_SERIAL_MAX3100 is not set -# CONFIG_SERIAL_MAX3107 is not set -CONFIG_SERIAL_CORE=y -CONFIG_SERIAL_CORE_CONSOLE=y -# CONFIG_SERIAL_OF_PLATFORM is not set -# CONFIG_SERIAL_TIMBERDALE is not set -# CONFIG_SERIAL_ALTERA_JTAGUART is not set -# CONFIG_SERIAL_ALTERA_UART is not set -# CONFIG_SERIAL_IFX6X60 is not set -# CONFIG_SERIAL_XILINX_PS_UART is not set -# CONFIG_HVC_DCC is not set -# CONFIG_IPMI_HANDLER is not set -# CONFIG_HW_RANDOM is not set -# CONFIG_R3964 is not set -# CONFIG_RAW_DRIVER is not set -# CONFIG_TCG_TPM is not set -# CONFIG_DCC_TTY is not set -# CONFIG_RAMOOPS is not set -CONFIG_SUNXI_G2D=y -CONFIG_I2C=y -CONFIG_I2C_BOARDINFO=y -CONFIG_I2C_COMPAT=y -CONFIG_I2C_CHARDEV=y -# CONFIG_I2C_MUX is not set -CONFIG_I2C_HELPER_AUTO=y -CONFIG_I2C_ALGOBIT=m - -# -# I2C Hardware Bus support -# - -# -# I2C system bus drivers (mostly embedded / system-on-chip) -# -# CONFIG_I2C_DESIGNWARE_PLATFORM is not set -# CONFIG_I2C_GPIO is not set -# CONFIG_I2C_OCORES is not set -# CONFIG_I2C_PCA_PLATFORM is not set -# CONFIG_I2C_PXA_PCI is not set -# CONFIG_I2C_SIMTEC is not set -CONFIG_I2C_SUNXI=y -# CONFIG_SUNXI_IIC_PRINT_TRANSFER_INFO is not set -# CONFIG_I2C_XILINX is not set - -# -# External I2C/SMBus adapter drivers -# -# CONFIG_I2C_DIOLAN_U2C is not set -# CONFIG_I2C_PARPORT_LIGHT is not set -# CONFIG_I2C_TAOS_EVM is not set -# CONFIG_I2C_TINY_USB is not set - -# -# Other I2C/SMBus bus drivers -# -# CONFIG_I2C_STUB is not set -# CONFIG_I2C_DEBUG_CORE is not set -# CONFIG_I2C_DEBUG_ALGO is not set -# CONFIG_I2C_DEBUG_BUS is not set -CONFIG_SPI=y -# CONFIG_SPI_DEBUG is not set -CONFIG_SPI_MASTER=y - -# -# SPI Master Controller Drivers -# -# CONFIG_SPI_ALTERA is not set -CONFIG_SPI_BITBANG=m -CONFIG_SPI_GPIO=m -# CONFIG_SPI_OC_TINY is not set -# CONFIG_SPI_PL022 is not set -# CONFIG_SPI_PXA2XX_PCI is not set -CONFIG_SPI_SUNXI=y -CONFIG_SPI_SUNXI_NDMA=y -# CONFIG_SPI_XILINX is not set -# CONFIG_SPI_DESIGNWARE is not set - -# -# SPI Protocol Masters -# -# CONFIG_SPI_SPIDEV is not set -# CONFIG_SPI_TLE62X0 is not set -# CONFIG_HSI is not set - -# -# PPS support -# -# CONFIG_PPS is not set - -# -# PPS generators support -# - -# -# PTP clock support -# - -# -# Enable Device Drivers -> PPS to see the PTP clock options. -# -CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y -CONFIG_GPIOLIB=y -# CONFIG_DEBUG_GPIO is not set -CONFIG_GPIO_SYSFS=y -CONFIG_GPIO_GENERIC=y - -# -# Memory mapped GPIO drivers: -# -CONFIG_GPIO_GENERIC_PLATFORM=y -# CONFIG_GPIO_PL061 is not set -CONFIG_GPIO_SUNXI=y - -# -# I2C GPIO expanders: -# -# CONFIG_GPIO_MAX7300 is not set -# CONFIG_GPIO_MAX732X is not set -# CONFIG_GPIO_PCF857X is not set -# CONFIG_GPIO_SX150X is not set -# CONFIG_GPIO_ADP5588 is not set - -# -# PCI GPIO expanders: -# - -# -# SPI GPIO expanders: -# -# CONFIG_GPIO_MAX7301 is not set -# CONFIG_GPIO_MCP23S08 is not set -# CONFIG_GPIO_MC33880 is not set -# CONFIG_GPIO_74X164 is not set - -# -# AC97 GPIO expanders: -# - -# -# MODULbus GPIO expanders: -# -# CONFIG_W1 is not set -CONFIG_POWER_SUPPLY=y -CONFIG_AW_AXP=y -# CONFIG_AW_AXP18 is not set -# CONFIG_AW_AXP19 is not set -CONFIG_AW_AXP20=y -CONFIG_AXP_CHARGEINIT=y -CONFIG_AXP_CHGCHANGE=y -CONFIG_AXP_HWMON=y -# CONFIG_POWER_SUPPLY_DEBUG is not set -# CONFIG_AXP152 is not set -# CONFIG_PDA_POWER is not set -# CONFIG_TEST_POWER is not set -# CONFIG_BATTERY_DS2780 is not set -# CONFIG_BATTERY_DS2781 is not set -# CONFIG_BATTERY_DS2782 is not set -# CONFIG_BATTERY_SBS is not set -# CONFIG_BATTERY_BQ27x00 is not set -# CONFIG_BATTERY_MAX17040 is not set -# CONFIG_BATTERY_MAX17042 is not set -# CONFIG_CHARGER_MAX8903 is not set -# CONFIG_CHARGER_LP8727 is not set -# CONFIG_CHARGER_GPIO is not set -# CONFIG_CHARGER_MANAGER is not set -# CONFIG_CHARGER_SMB347 is not set -CONFIG_HWMON=y -# CONFIG_HWMON_VID is not set -# CONFIG_HWMON_DEBUG_CHIP is not set - -# -# Native drivers -# -CONFIG_SENSORS_MMA7660=m -# CONFIG_SENSORS_AD7314 is not set -# CONFIG_SENSORS_AD7414 is not set -# CONFIG_SENSORS_AD7418 is not set -# CONFIG_SENSORS_ADCXX is not set -# CONFIG_SENSORS_ADM1021 is not set -# CONFIG_SENSORS_ADM1025 is not set -# CONFIG_SENSORS_ADM1026 is not set -# CONFIG_SENSORS_ADM1029 is not set -# CONFIG_SENSORS_ADM1031 is not set -# CONFIG_SENSORS_ADM9240 is not set -# CONFIG_SENSORS_ADT7411 is not set -# CONFIG_SENSORS_ADT7462 is not set -# CONFIG_SENSORS_ADT7470 is not set -# CONFIG_SENSORS_ADT7475 is not set -# CONFIG_SENSORS_ASC7621 is not set -# CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_DS620 is not set -# CONFIG_SENSORS_DS1621 is not set -# CONFIG_SENSORS_F71805F is not set -# CONFIG_SENSORS_F71882FG is not set -# CONFIG_SENSORS_F75375S is not set -# CONFIG_SENSORS_G760A is not set -# CONFIG_SENSORS_GL518SM is not set -# CONFIG_SENSORS_GL520SM is not set -# CONFIG_SENSORS_GPIO_FAN is not set -# CONFIG_SENSORS_IT87 is not set -# CONFIG_SENSORS_JC42 is not set -# CONFIG_SENSORS_LINEAGE is not set -# CONFIG_SENSORS_LM63 is not set -# CONFIG_SENSORS_LM70 is not set -# CONFIG_SENSORS_LM73 is not set -# CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM77 is not set -# CONFIG_SENSORS_LM78 is not set -# CONFIG_SENSORS_LM80 is not set -# CONFIG_SENSORS_LM83 is not set -# CONFIG_SENSORS_LM85 is not set -# CONFIG_SENSORS_LM87 is not set -# CONFIG_SENSORS_LM90 is not set -# CONFIG_SENSORS_LM92 is not set -# CONFIG_SENSORS_LM93 is not set -# CONFIG_SENSORS_LTC4151 is not set -# CONFIG_SENSORS_LTC4215 is not set -# CONFIG_SENSORS_LTC4245 is not set -# CONFIG_SENSORS_LTC4261 is not set -# CONFIG_SENSORS_LM95241 is not set -# CONFIG_SENSORS_LM95245 is not set -# CONFIG_SENSORS_MAX1111 is not set -# CONFIG_SENSORS_MAX16065 is not set -# CONFIG_SENSORS_MAX1619 is not set -# CONFIG_SENSORS_MAX1668 is not set -# CONFIG_SENSORS_MAX6639 is not set -# CONFIG_SENSORS_MAX6642 is not set -# CONFIG_SENSORS_MAX6650 is not set -# CONFIG_SENSORS_MCP3021 is not set -# CONFIG_SENSORS_NTC_THERMISTOR is not set -# CONFIG_SENSORS_PC87360 is not set -# CONFIG_SENSORS_PC87427 is not set -# CONFIG_SENSORS_PCF8591 is not set -# CONFIG_PMBUS is not set -# CONFIG_SENSORS_SHT15 is not set -# CONFIG_SENSORS_SHT21 is not set -# CONFIG_SENSORS_SMM665 is not set -# CONFIG_SENSORS_DME1737 is not set -# CONFIG_SENSORS_EMC1403 is not set -# CONFIG_SENSORS_EMC2103 is not set -# CONFIG_SENSORS_EMC6W201 is not set -# CONFIG_SENSORS_SMSC47M1 is not set -# CONFIG_SENSORS_SMSC47M192 is not set -# CONFIG_SENSORS_SMSC47B397 is not set -# CONFIG_SENSORS_SCH56XX_COMMON is not set -# CONFIG_SENSORS_SCH5627 is not set -# CONFIG_SENSORS_SCH5636 is not set -# CONFIG_SENSORS_ADS1015 is not set -# CONFIG_SENSORS_ADS7828 is not set -# CONFIG_SENSORS_ADS7871 is not set -# CONFIG_SENSORS_AMC6821 is not set -# CONFIG_SENSORS_THMC50 is not set -# CONFIG_SENSORS_TMP102 is not set -# CONFIG_SENSORS_TMP401 is not set -# CONFIG_SENSORS_TMP421 is not set -# CONFIG_SENSORS_VT1211 is not set -# CONFIG_SENSORS_W83781D is not set -# CONFIG_SENSORS_W83791D is not set -# CONFIG_SENSORS_W83792D is not set -# CONFIG_SENSORS_W83793 is not set -# CONFIG_SENSORS_W83795 is not set -# CONFIG_SENSORS_W83L785TS is not set -# CONFIG_SENSORS_W83L786NG is not set -# CONFIG_SENSORS_W83627HF is not set -# CONFIG_SENSORS_W83627EHF is not set -# CONFIG_THERMAL is not set -CONFIG_WATCHDOG=y -# CONFIG_WATCHDOG_CORE is not set -# CONFIG_WATCHDOG_NOWAYOUT is not set - -# -# Watchdog Device Drivers -# -# CONFIG_SOFT_WATCHDOG is not set -# CONFIG_ARM_SP805_WATCHDOG is not set -# CONFIG_DW_WATCHDOG is not set -# CONFIG_MAX63XX_WATCHDOG is not set -CONFIG_SUNXI_WDT=m - -# -# USB-based Watchdog Cards -# -# CONFIG_USBPCWATCHDOG is not set -CONFIG_SSB_POSSIBLE=y - -# -# Sonics Silicon Backplane -# -# CONFIG_SSB is not set -CONFIG_BCMA_POSSIBLE=y - -# -# Broadcom specific AMBA -# -# CONFIG_BCMA is not set - -# -# Multifunction device drivers -# -# CONFIG_MFD_CORE is not set -# CONFIG_MFD_88PM860X is not set -# CONFIG_MFD_SM501 is not set -# CONFIG_MFD_ASIC3 is not set -# CONFIG_HTC_EGPIO is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_HTC_I2CPLD is not set -# CONFIG_TPS6105X is not set -# CONFIG_TPS65010 is not set -# CONFIG_TPS6507X is not set -# CONFIG_MFD_TPS65217 is not set -# CONFIG_MFD_TPS6586X is not set -# CONFIG_MFD_TPS65910 is not set -# CONFIG_MFD_TPS65912_I2C is not set -# CONFIG_MFD_TPS65912_SPI is not set -# CONFIG_TWL4030_CORE is not set -# CONFIG_TWL6040_CORE is not set -# CONFIG_MFD_STMPE is not set -# CONFIG_MFD_TC3589X is not set -# CONFIG_MFD_TMIO is not set -# CONFIG_MFD_T7L66XB is not set -# CONFIG_MFD_TC6387XB is not set -# CONFIG_MFD_TC6393XB is not set -# CONFIG_PMIC_DA903X is not set -# CONFIG_MFD_DA9052_SPI is not set -# CONFIG_MFD_DA9052_I2C is not set -# CONFIG_PMIC_ADP5520 is not set -# CONFIG_MFD_MAX8925 is not set -# CONFIG_MFD_MAX8997 is not set -# CONFIG_MFD_MAX8998 is not set -# CONFIG_MFD_S5M_CORE is not set -# CONFIG_MFD_WM8400 is not set -# CONFIG_MFD_WM831X_I2C is not set -# CONFIG_MFD_WM831X_SPI is not set -# CONFIG_MFD_WM8350_I2C is not set -# CONFIG_MFD_WM8994 is not set -# CONFIG_MFD_PCF50633 is not set -# CONFIG_MFD_MC13XXX is not set -# CONFIG_ABX500_CORE is not set -# CONFIG_EZX_PCAP is not set -# CONFIG_MFD_WL1273_CORE is not set -# CONFIG_MFD_TPS65090 is not set -# CONFIG_MFD_AAT2870_CORE is not set -# CONFIG_MFD_RC5T583 is not set -CONFIG_REGULATOR=y -# CONFIG_REGULATOR_DEBUG is not set -# CONFIG_REGULATOR_DUMMY is not set -# CONFIG_REGULATOR_FIXED_VOLTAGE is not set -# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set -CONFIG_REGULATOR_GPIO=y -# CONFIG_REGULATOR_AD5398 is not set -# CONFIG_REGULATOR_ISL6271A is not set -# CONFIG_REGULATOR_MAX1586 is not set -# CONFIG_REGULATOR_MAX8649 is not set -# CONFIG_REGULATOR_MAX8660 is not set -# CONFIG_REGULATOR_MAX8952 is not set -# CONFIG_REGULATOR_LP3971 is not set -# CONFIG_REGULATOR_LP3972 is not set -# CONFIG_REGULATOR_TPS62360 is not set -# CONFIG_REGULATOR_TPS65023 is not set -# CONFIG_REGULATOR_TPS6507X is not set -# CONFIG_REGULATOR_TPS6524X is not set -CONFIG_MEDIA_SUPPORT=y - -# -# Multimedia core support -# -# CONFIG_MEDIA_CONTROLLER is not set -CONFIG_VIDEO_DEV=y -CONFIG_VIDEO_V4L2_COMMON=y -CONFIG_DVB_CORE=y -CONFIG_DVB_NET=y -CONFIG_VIDEO_MEDIA=y - -# -# Multimedia drivers -# -CONFIG_RC_CORE=y -CONFIG_LIRC=y -CONFIG_RC_MAP=y -CONFIG_IR_NEC_DECODER=y -CONFIG_IR_RC5_DECODER=y -CONFIG_IR_RC6_DECODER=y -CONFIG_IR_JVC_DECODER=y -CONFIG_IR_SONY_DECODER=y -CONFIG_IR_RC5_SZ_DECODER=y -CONFIG_IR_SANYO_DECODER=y -CONFIG_IR_MCE_KBD_DECODER=y -CONFIG_IR_LIRC_CODEC=y -CONFIG_RC_ATI_REMOTE=m -CONFIG_IR_IMON=m -CONFIG_IR_MCEUSB=m -CONFIG_IR_REDRAT3=m -CONFIG_IR_STREAMZAP=m -CONFIG_RC_LOOPBACK=m -CONFIG_IR_GPIO_CIR=m -# CONFIG_MEDIA_ATTACH is not set -CONFIG_MEDIA_TUNER=y -CONFIG_MEDIA_TUNER_CUSTOMISE=y - -# -# Customize TV tuners -# -# CONFIG_MEDIA_TUNER_SIMPLE is not set -# CONFIG_MEDIA_TUNER_TDA8290 is not set -# CONFIG_MEDIA_TUNER_TDA827X is not set -# CONFIG_MEDIA_TUNER_TDA18271 is not set -# CONFIG_MEDIA_TUNER_TDA9887 is not set -CONFIG_MEDIA_TUNER_TEA5761=m -# CONFIG_MEDIA_TUNER_TEA5767 is not set -# CONFIG_MEDIA_TUNER_MT20XX is not set -# CONFIG_MEDIA_TUNER_MT2060 is not set -CONFIG_MEDIA_TUNER_MT2063=m -# CONFIG_MEDIA_TUNER_MT2266 is not set -# CONFIG_MEDIA_TUNER_MT2131 is not set -# CONFIG_MEDIA_TUNER_QT1010 is not set -CONFIG_MEDIA_TUNER_XC2028=m -CONFIG_MEDIA_TUNER_XC5000=m -CONFIG_MEDIA_TUNER_XC4000=m -# CONFIG_MEDIA_TUNER_MXL5005S is not set -# CONFIG_MEDIA_TUNER_MXL5007T is not set -# CONFIG_MEDIA_TUNER_MC44S803 is not set -# CONFIG_MEDIA_TUNER_MAX2165 is not set -# CONFIG_MEDIA_TUNER_TDA18218 is not set -# CONFIG_MEDIA_TUNER_TDA18212 is not set -CONFIG_VIDEO_V4L2=y -CONFIG_VIDEOBUF_GEN=m -CONFIG_VIDEOBUF_VMALLOC=m -CONFIG_VIDEOBUF_DMA_CONTIG=m -CONFIG_VIDEOBUF_DVB=m -CONFIG_VIDEO_TVEEPROM=m -CONFIG_VIDEO_TUNER=m -CONFIG_VIDEOBUF2_CORE=m -CONFIG_VIDEOBUF2_MEMOPS=m -CONFIG_VIDEOBUF2_VMALLOC=m -CONFIG_VIDEO_CAPTURE_DRIVERS=y -# CONFIG_VIDEO_ADV_DEBUG is not set -# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set -CONFIG_VIDEO_HELPER_CHIPS_AUTO=y -CONFIG_VIDEO_IR_I2C=y - -# -# Audio decoders, processors and mixers -# -CONFIG_VIDEO_MSP3400=m -CONFIG_VIDEO_CS53L32A=m -CONFIG_VIDEO_WM8775=m - -# -# RDS decoders -# - -# -# Video decoders -# -CONFIG_VIDEO_SAA711X=m -CONFIG_VIDEO_TVP5150=m - -# -# Video and audio decoders -# -CONFIG_VIDEO_CX25840=m - -# -# MPEG video encoders -# -CONFIG_VIDEO_CX2341X=m - -# -# Video encoders -# - -# -# Camera sensor devices -# -CONFIG_VIDEO_MT9V011=m - -# -# Flash devices -# - -# -# Video improvement chips -# - -# -# Miscelaneous helper chips -# -# CONFIG_VIDEO_VIVI is not set -CONFIG_V4L_USB_DRIVERS=y -CONFIG_USB_VIDEO_CLASS=m -CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y -CONFIG_USB_GSPCA=m -CONFIG_USB_M5602=m -CONFIG_USB_STV06XX=m -CONFIG_USB_GL860=m -CONFIG_USB_GSPCA_BENQ=m -CONFIG_USB_GSPCA_CONEX=m -CONFIG_USB_GSPCA_CPIA1=m -CONFIG_USB_GSPCA_ETOMS=m -CONFIG_USB_GSPCA_FINEPIX=m -CONFIG_USB_GSPCA_JEILINJ=m -CONFIG_USB_GSPCA_JL2005BCD=m -CONFIG_USB_GSPCA_KINECT=m -CONFIG_USB_GSPCA_KONICA=m -CONFIG_USB_GSPCA_MARS=m -CONFIG_USB_GSPCA_MR97310A=m -CONFIG_USB_GSPCA_NW80X=m -CONFIG_USB_GSPCA_OV519=m -CONFIG_USB_GSPCA_OV534=m -CONFIG_USB_GSPCA_OV534_9=m -CONFIG_USB_GSPCA_PAC207=m -CONFIG_USB_GSPCA_PAC7302=m -CONFIG_USB_GSPCA_PAC7311=m -CONFIG_USB_GSPCA_SE401=m -CONFIG_USB_GSPCA_SN9C2028=m -CONFIG_USB_GSPCA_SN9C20X=m -CONFIG_USB_GSPCA_SONIXB=m -CONFIG_USB_GSPCA_SONIXJ=m -CONFIG_USB_GSPCA_SPCA500=m -CONFIG_USB_GSPCA_SPCA501=m -CONFIG_USB_GSPCA_SPCA505=m -CONFIG_USB_GSPCA_SPCA506=m -CONFIG_USB_GSPCA_SPCA508=m -CONFIG_USB_GSPCA_SPCA561=m -CONFIG_USB_GSPCA_SPCA1528=m -CONFIG_USB_GSPCA_SQ905=m -CONFIG_USB_GSPCA_SQ905C=m -CONFIG_USB_GSPCA_SQ930X=m -CONFIG_USB_GSPCA_STK014=m -CONFIG_USB_GSPCA_STV0680=m -CONFIG_USB_GSPCA_SUNPLUS=m -CONFIG_USB_GSPCA_T613=m -CONFIG_USB_GSPCA_TOPRO=m -CONFIG_USB_GSPCA_TV8532=m -CONFIG_USB_GSPCA_VC032X=m -CONFIG_USB_GSPCA_VICAM=m -CONFIG_USB_GSPCA_XIRLINK_CIT=m -CONFIG_USB_GSPCA_ZC3XX=m -CONFIG_VIDEO_PVRUSB2=m -CONFIG_VIDEO_PVRUSB2_SYSFS=y -CONFIG_VIDEO_PVRUSB2_DVB=y -# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set -CONFIG_VIDEO_HDPVR=m -CONFIG_VIDEO_EM28XX=m -CONFIG_VIDEO_EM28XX_ALSA=m -CONFIG_VIDEO_EM28XX_DVB=m -CONFIG_VIDEO_EM28XX_RC=y -CONFIG_VIDEO_TLG2300=m -CONFIG_VIDEO_CX231XX=m -CONFIG_VIDEO_CX231XX_RC=y -CONFIG_VIDEO_CX231XX_ALSA=m -CONFIG_VIDEO_CX231XX_DVB=m -CONFIG_VIDEO_TM6000=m -CONFIG_VIDEO_TM6000_ALSA=m -CONFIG_VIDEO_TM6000_DVB=m -CONFIG_VIDEO_USBVISION=m -CONFIG_USB_ET61X251=m -CONFIG_USB_SN9C102=m -CONFIG_USB_PWC=m -# CONFIG_USB_PWC_DEBUG is not set -CONFIG_USB_PWC_INPUT_EVDEV=y -CONFIG_VIDEO_CPIA2=m -CONFIG_USB_ZR364XX=m -CONFIG_USB_STKWEBCAM=m -CONFIG_USB_S2255=m -# CONFIG_V4L_PLATFORM_DRIVERS is not set -# CONFIG_V4L_MEM2MEM_DRIVERS is not set -CONFIG_VIDEO_SUNXI_CEDAR=m -CONFIG_VIDEO_DECODER_SUNXI=m -# CONFIG_VIDEO_AVS_COUNTER is not set -CONFIG_VIDEO_CSI_SUN4I=y -CONFIG_CSI_DEV_SEL=m -CONFIG_CSI0_SUN4I=m -CONFIG_CSI1_SUN4I=m -CONFIG_CSI_OV7670=m -CONFIG_CSI_GT2005=m -CONFIG_CSI_GC0308=m -CONFIG_CSI_HI704=m -CONFIG_CSI_SP0838=m -CONFIG_CSI_MT9M112=m -CONFIG_CSI_MT9M113=m -CONFIG_CSI_OV2655=m -CONFIG_CSI_HI253=m -CONFIG_CSI_MT9D112=m -CONFIG_CSI_GC0307=m -CONFIG_CSI_OV5640=m -CONFIG_RADIO_ADAPTERS=y -# CONFIG_RADIO_SI470X is not set -CONFIG_USB_MR800=m -CONFIG_USB_DSBR=m -# CONFIG_I2C_SI4713 is not set -# CONFIG_RADIO_SI4713 is not set -CONFIG_USB_KEENE=m -# CONFIG_RADIO_TEA5764 is not set -# CONFIG_RADIO_SAA7706H is not set -# CONFIG_RADIO_TEF6862 is not set -# CONFIG_RADIO_WL1273 is not set - -# -# Texas Instruments WL128x FM driver (ST based) -# -CONFIG_RADIO_WL128X=m -CONFIG_AUDIO_ENGINE=y -CONFIG_ACE_CONFIG=y -CONFIG_PA_CONTROL=y -CONFIG_PA_CONFIG=y -CONFIG_DVB_MAX_ADAPTERS=8 -# CONFIG_DVB_DYNAMIC_MINORS is not set -CONFIG_DVB_CAPTURE_DRIVERS=y -# CONFIG_TTPCI_EEPROM is not set - -# -# Supported USB Adapters -# -CONFIG_DVB_USB=m -# CONFIG_DVB_USB_DEBUG is not set -CONFIG_DVB_USB_A800=m -CONFIG_DVB_USB_DIBUSB_MB=m -CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y -CONFIG_DVB_USB_DIBUSB_MC=m -CONFIG_DVB_USB_DIB0700=m -CONFIG_DVB_USB_UMT_010=m -CONFIG_DVB_USB_CXUSB=m -CONFIG_DVB_USB_M920X=m -CONFIG_DVB_USB_GL861=m -CONFIG_DVB_USB_AU6610=m -CONFIG_DVB_USB_DIGITV=m -CONFIG_DVB_USB_VP7045=m -CONFIG_DVB_USB_VP702X=m -CONFIG_DVB_USB_GP8PSK=m -CONFIG_DVB_USB_NOVA_T_USB2=m -CONFIG_DVB_USB_TTUSB2=m -CONFIG_DVB_USB_DTT200U=m -CONFIG_DVB_USB_OPERA1=m -CONFIG_DVB_USB_AF9005=m -CONFIG_DVB_USB_AF9005_REMOTE=m -# CONFIG_DVB_USB_PCTV452E is not set -CONFIG_DVB_USB_DW2102=m -CONFIG_DVB_USB_CINERGY_T2=m -CONFIG_DVB_USB_ANYSEE=m -CONFIG_DVB_USB_DTV5100=m -CONFIG_DVB_USB_AF9015=m -CONFIG_DVB_USB_CE6230=m -CONFIG_DVB_USB_FRIIO=m -CONFIG_DVB_USB_EC168=m -# CONFIG_DVB_USB_AZ6007 is not set -CONFIG_DVB_USB_AZ6027=m -CONFIG_DVB_USB_LME2510=m -CONFIG_DVB_USB_TECHNISAT_USB2=m -# CONFIG_DVB_USB_IT913X is not set -# CONFIG_DVB_USB_MXL111SF is not set -# CONFIG_DVB_USB_RTL28XXU is not set -CONFIG_SMS_SIANO_MDTV=m - -# -# Siano module components -# -CONFIG_SMS_USB_DRV=m -# CONFIG_SMS_SDIO_DRV is not set - -# -# Supported FlexCopII (B2C2) Adapters -# -# CONFIG_DVB_B2C2_FLEXCOP is not set - -# -# Supported DVB Frontends -# -# CONFIG_DVB_FE_CUSTOMISE is not set - -# -# Multistandard (satellite) frontends -# -CONFIG_DVB_STB0899=m -CONFIG_DVB_STB6100=m -CONFIG_DVB_STV090x=m -CONFIG_DVB_STV6110x=m - -# -# Multistandard (cable + terrestrial) frontends -# -CONFIG_DVB_DRXK=m -CONFIG_DVB_TDA18271C2DD=m - -# -# DVB-S (satellite) frontends -# -CONFIG_DVB_MT312=m -CONFIG_DVB_ZL10039=m -CONFIG_DVB_STV0288=m -CONFIG_DVB_STB6000=m -CONFIG_DVB_STV0299=m -CONFIG_DVB_STV6110=m -CONFIG_DVB_STV0900=m -CONFIG_DVB_TDA10086=m -CONFIG_DVB_TDA826X=m -CONFIG_DVB_CX24116=m -CONFIG_DVB_SI21XX=m -CONFIG_DVB_DS3000=m -CONFIG_DVB_TDA10071=m - -# -# DVB-T (terrestrial) frontends -# -CONFIG_DVB_CX22702=m -CONFIG_DVB_DRXD=m -CONFIG_DVB_TDA1004X=m -CONFIG_DVB_NXT6000=m -CONFIG_DVB_MT352=m -CONFIG_DVB_ZL10353=m -CONFIG_DVB_DIB3000MB=m -CONFIG_DVB_DIB3000MC=m -CONFIG_DVB_DIB7000M=m -CONFIG_DVB_DIB7000P=m -CONFIG_DVB_TDA10048=m -CONFIG_DVB_AF9013=m -CONFIG_DVB_EC100=m -CONFIG_DVB_CXD2820R=m - -# -# DVB-C (cable) frontends -# -CONFIG_DVB_TDA10023=m - -# -# ATSC (North American/Korean Terrestrial/Cable DTV) frontends -# -CONFIG_DVB_LGDT330X=m -CONFIG_DVB_LGDT3305=m -CONFIG_DVB_S5H1409=m -CONFIG_DVB_S5H1411=m - -# -# ISDB-T (terrestrial) frontends -# -CONFIG_DVB_S921=m -CONFIG_DVB_DIB8000=m -CONFIG_DVB_MB86A20S=m - -# -# Digital terrestrial only tuners/PLL -# -CONFIG_DVB_PLL=m -CONFIG_DVB_TUNER_DIB0070=m -CONFIG_DVB_TUNER_DIB0090=m - -# -# SEC control devices for DVB-S -# -CONFIG_DVB_LNBP21=m -CONFIG_DVB_ISL6423=m -CONFIG_DVB_A8293=m -CONFIG_DVB_LGS8GXX=m -CONFIG_DVB_ATBM8830=m -CONFIG_DVB_IX2505V=m -CONFIG_DVB_M88RS2000=m - -# -# Tools to develop new frontends -# -# CONFIG_DVB_DUMMY_FE is not set - -# -# Graphics support -# -CONFIG_DRM=m -CONFIG_DRM_MALI=m -# CONFIG_DRM_UDL is not set -# CONFIG_ION is not set -CONFIG_MALI=m -CONFIG_MALI400=m -# CONFIG_MALI400_DEBUG is not set -# CONFIG_MALI400_GPU_UTILIZATION is not set -CONFIG_UMP=m -# CONFIG_UMP_DEBUG is not set -# CONFIG_VGASTATE is not set -# CONFIG_VIDEO_OUTPUT_CONTROL is not set -CONFIG_FB=y -# CONFIG_FIRMWARE_EDID is not set -# CONFIG_FB_DDC is not set -# CONFIG_FB_BOOT_VESA_SUPPORT is not set -CONFIG_FB_CFB_FILLRECT=m -CONFIG_FB_CFB_COPYAREA=m -CONFIG_FB_CFB_IMAGEBLIT=m -# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set -CONFIG_FB_SYS_FILLRECT=m -CONFIG_FB_SYS_COPYAREA=m -CONFIG_FB_SYS_IMAGEBLIT=m -# CONFIG_FB_FOREIGN_ENDIAN is not set -CONFIG_FB_SYS_FOPS=m -# CONFIG_FB_WMT_GE_ROPS is not set -CONFIG_FB_DEFERRED_IO=y -# CONFIG_FB_SVGALIB is not set -# CONFIG_FB_MACMODES is not set -# CONFIG_FB_BACKLIGHT is not set -CONFIG_FB_MODE_HELPERS=y -# CONFIG_FB_TILEBLITTING is not set - -# -# Frame buffer hardware drivers -# -CONFIG_FB_SUNXI=m -CONFIG_FB_SUNXI_RESERVED_MEM=y -CONFIG_FB_SUNXI_UMP=y -CONFIG_FB_SUNXI_LCD=m -CONFIG_FB_SUNXI_HDMI=m -# CONFIG_HDMI_CEC is not set -# CONFIG_FB_ARMCLCD is not set -# CONFIG_FB_UVESA is not set -# CONFIG_FB_S1D13XXX is not set -# CONFIG_FB_SMSCUFX is not set -CONFIG_FB_UDL=m -# CONFIG_FB_VIRTUAL is not set -# CONFIG_FB_METRONOME is not set -# CONFIG_FB_BROADSHEET is not set -# CONFIG_EXYNOS_VIDEO is not set -CONFIG_BACKLIGHT_LCD_SUPPORT=y -CONFIG_LCD_CLASS_DEVICE=m -# CONFIG_LCD_L4F00242T03 is not set -# CONFIG_LCD_LMS283GF05 is not set -# CONFIG_LCD_LTV350QV is not set -# CONFIG_LCD_TDO24M is not set -# CONFIG_LCD_VGG2432A4 is not set -# CONFIG_LCD_PLATFORM is not set -# CONFIG_LCD_S6E63M0 is not set -# CONFIG_LCD_LD9040 is not set -# CONFIG_LCD_AMS369FG06 is not set -CONFIG_BACKLIGHT_CLASS_DEVICE=m -CONFIG_BACKLIGHT_GENERIC=m -# CONFIG_BACKLIGHT_ADP8860 is not set -# CONFIG_BACKLIGHT_ADP8870 is not set -# CONFIG_BACKLIGHT_LP855X is not set - -# -# Console display driver support -# -CONFIG_DUMMY_CONSOLE=y -CONFIG_FRAMEBUFFER_CONSOLE=m -# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set -# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set -# CONFIG_FONTS is not set -CONFIG_FONT_8x8=y -CONFIG_FONT_8x16=y -# CONFIG_LOGO is not set -CONFIG_SOUND=y -CONFIG_SOUND_OSS_CORE=y -CONFIG_SOUND_OSS_CORE_PRECLAIM=y -CONFIG_SND=y -CONFIG_SND_TIMER=y -CONFIG_SND_PCM=y -CONFIG_SND_HWDEP=m -CONFIG_SND_RAWMIDI=m -CONFIG_SND_JACK=y -CONFIG_SND_SEQUENCER=m -# CONFIG_SND_SEQ_DUMMY is not set -CONFIG_SND_OSSEMUL=y -CONFIG_SND_MIXER_OSS=m -CONFIG_SND_PCM_OSS=m -CONFIG_SND_PCM_OSS_PLUGINS=y -# CONFIG_SND_SEQUENCER_OSS is not set -CONFIG_SND_HRTIMER=m -CONFIG_SND_SEQ_HRTIMER_DEFAULT=y -# CONFIG_SND_DYNAMIC_MINORS is not set -CONFIG_SND_SUPPORT_OLD_API=y -CONFIG_SND_VERBOSE_PROCFS=y -# CONFIG_SND_VERBOSE_PRINTK is not set -# CONFIG_SND_DEBUG is not set -CONFIG_SND_VMASTER=y -CONFIG_SND_RAWMIDI_SEQ=m -# CONFIG_SND_OPL3_LIB_SEQ is not set -# CONFIG_SND_OPL4_LIB_SEQ is not set -# CONFIG_SND_SBAWE_SEQ is not set -# CONFIG_SND_EMU10K1_SEQ is not set -CONFIG_SND_DRIVERS=y -# CONFIG_SND_DUMMY is not set -# CONFIG_SND_ALOOP is not set -# CONFIG_SND_VIRMIDI is not set -# CONFIG_SND_MTPAV is not set -# CONFIG_SND_SERIAL_U16550 is not set -# CONFIG_SND_MPU401 is not set -CONFIG_SND_ARM=y -# CONFIG_SND_ARMAACI is not set -CONFIG_SND_SPI=y -CONFIG_SND_USB=y -CONFIG_SND_USB_AUDIO=m -CONFIG_SND_USB_UA101=m -CONFIG_SND_USB_CAIAQ=m -CONFIG_SND_USB_CAIAQ_INPUT=y -CONFIG_SND_USB_6FIRE=m -CONFIG_SND_SOC=y -CONFIG_SOUND_SUNXI=y -CONFIG_SND_SUNXI_SOC_CODEC=y -CONFIG_SND_SUNXI_SOC_HDMIAUDIO=y -CONFIG_SND_SUNXI_SOC_SPDIF=m -CONFIG_SND_SUNXI_SOC_I2S_INTERFACE=m -CONFIG_SND_SOC_I2C_AND_SPI=y -# CONFIG_SND_SOC_ALL_CODECS is not set -# CONFIG_SOUND_PRIME is not set -CONFIG_HID_SUPPORT=y -CONFIG_HID=y -# CONFIG_HID_BATTERY_STRENGTH is not set -CONFIG_HIDRAW=y -CONFIG_UHID=m - -# -# USB Input Devices -# -CONFIG_USB_HID=y -CONFIG_HID_PID=y -CONFIG_USB_HIDDEV=y - -# -# Special HID drivers -# -CONFIG_HID_A4TECH=y -CONFIG_HID_ACRUX=m -CONFIG_HID_ACRUX_FF=y -CONFIG_HID_APPLE=y -CONFIG_HID_BELKIN=y -CONFIG_HID_CHERRY=y -CONFIG_HID_CHICONY=y -CONFIG_HID_PRODIKEYS=m -CONFIG_HID_CYPRESS=y -CONFIG_HID_DRAGONRISE=m -CONFIG_DRAGONRISE_FF=y -CONFIG_HID_EMS_FF=m -CONFIG_HID_ELECOM=m -CONFIG_HID_EZKEY=y -CONFIG_HID_HOLTEK=m -CONFIG_HOLTEK_FF=y -CONFIG_HID_KEYTOUCH=m -CONFIG_HID_KYE=y -CONFIG_HID_UCLOGIC=m -CONFIG_HID_WALTOP=m -CONFIG_HID_GYRATION=m -CONFIG_HID_TWINHAN=m -CONFIG_HID_KENSINGTON=y -CONFIG_HID_LCPOWER=m -CONFIG_HID_LOGITECH=y -CONFIG_HID_LOGITECH_DJ=m -CONFIG_LOGITECH_FF=y -CONFIG_LOGIRUMBLEPAD2_FF=y -CONFIG_LOGIG940_FF=y -CONFIG_LOGIWHEELS_FF=y -CONFIG_HID_MAGICMOUSE=m -CONFIG_HID_MICROSOFT=y -CONFIG_HID_MONTEREY=y -CONFIG_HID_MULTITOUCH=m -CONFIG_HID_NTRIG=m -CONFIG_HID_ORTEK=m -CONFIG_HID_PANTHERLORD=m -CONFIG_PANTHERLORD_FF=y -CONFIG_HID_PETALYNX=m -# CONFIG_HID_PICOLCD is not set -CONFIG_HID_PRIMAX=m -CONFIG_HID_ROCCAT=m -CONFIG_HID_SAITEK=m -CONFIG_HID_SAMSUNG=m -CONFIG_HID_SONY=m -CONFIG_HID_SPEEDLINK=m -CONFIG_HID_SUNPLUS=m -CONFIG_HID_GREENASIA=m -CONFIG_GREENASIA_FF=y -CONFIG_HID_SMARTJOYPLUS=m -CONFIG_SMARTJOYPLUS_FF=y -CONFIG_HID_TIVO=m -CONFIG_HID_TOPSEED=m -CONFIG_HID_THRUSTMASTER=m -CONFIG_THRUSTMASTER_FF=y -CONFIG_HID_WACOM=m -CONFIG_HID_WACOM_POWER_SUPPLY=y -CONFIG_HID_WIIMOTE=m -CONFIG_HID_WIIMOTE_EXT=y -CONFIG_HID_ZEROPLUS=m -CONFIG_ZEROPLUS_FF=y -CONFIG_HID_ZYDACRON=m -CONFIG_USB_ARCH_HAS_OHCI=y -CONFIG_USB_ARCH_HAS_EHCI=y -# CONFIG_USB_ARCH_HAS_XHCI is not set -CONFIG_USB_SUPPORT=y -CONFIG_USB_COMMON=y -CONFIG_USB_ARCH_HAS_HCD=y -CONFIG_USB=y -# CONFIG_USB_DEBUG is not set -# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set - -# -# Miscellaneous USB options -# -# CONFIG_USB_DEVICEFS is not set -CONFIG_USB_DEVICE_CLASS=y -# CONFIG_USB_DYNAMIC_MINORS is not set -# CONFIG_USB_SUSPEND is not set -# CONFIG_USB_DWC3 is not set -# CONFIG_USB_MON is not set -# CONFIG_USB_WUSB_CBAF is not set - -# -# USB Host Controller Drivers -# -# CONFIG_USB_C67X00_HCD is not set -CONFIG_USB_EHCI_HCD=y -CONFIG_USB_EHCI_ROOT_HUB_TT=y -CONFIG_USB_EHCI_TT_NEWSCHED=y -# CONFIG_USB_OXU210HP_HCD is not set -# CONFIG_USB_ISP116X_HCD is not set -# CONFIG_USB_ISP1760_HCD is not set -# CONFIG_USB_ISP1362_HCD is not set -CONFIG_USB_OHCI_HCD=y -# CONFIG_USB_OHCI_HCD_PLATFORM is not set -# CONFIG_USB_EHCI_HCD_PLATFORM is not set -# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set -# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set -CONFIG_USB_OHCI_LITTLE_ENDIAN=y -# CONFIG_USB_U132_HCD is not set -# CONFIG_USB_SL811_HCD is not set -# CONFIG_USB_R8A66597_HCD is not set -CONFIG_USB_SUNXI_EHCI=y -CONFIG_USB_SUNXI_OHCI=y -CONFIG_USB_SUNXI_COMMON=y -# CONFIG_USB_MUSB_HDRC is not set -# CONFIG_USB_RENESAS_USBHS is not set - -# -# USB Device Class drivers -# -CONFIG_USB_ACM=m -CONFIG_USB_PRINTER=m -# CONFIG_USB_WDM is not set -# CONFIG_USB_TMC is not set - -# -# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may -# - -# -# also be needed; see USB_STORAGE Help for more info -# -CONFIG_USB_STORAGE=y -# CONFIG_USB_STORAGE_DEBUG is not set -CONFIG_USB_STORAGE_REALTEK=y -CONFIG_REALTEK_AUTOPM=y -CONFIG_USB_STORAGE_DATAFAB=y -CONFIG_USB_STORAGE_FREECOM=y -CONFIG_USB_STORAGE_ISD200=y -CONFIG_USB_STORAGE_USBAT=y -CONFIG_USB_STORAGE_SDDR09=y -CONFIG_USB_STORAGE_SDDR55=y -CONFIG_USB_STORAGE_JUMPSHOT=y -CONFIG_USB_STORAGE_ALAUDA=y -CONFIG_USB_STORAGE_ONETOUCH=y -CONFIG_USB_STORAGE_KARMA=y -CONFIG_USB_STORAGE_CYPRESS_ATACB=y -CONFIG_USB_STORAGE_ENE_UB6250=y -# CONFIG_USB_LIBUSUAL is not set - -# -# USB Imaging devices -# -# CONFIG_USB_MDC800 is not set -# CONFIG_USB_MICROTEK is not set - -# -# USB port drivers -# -CONFIG_USB_SERIAL=m -CONFIG_USB_EZUSB=y -CONFIG_USB_SERIAL_GENERIC=y -CONFIG_USB_SERIAL_AIRCABLE=m -CONFIG_USB_SERIAL_ARK3116=m -CONFIG_USB_SERIAL_BELKIN=m -CONFIG_USB_SERIAL_CH341=m -CONFIG_USB_SERIAL_WHITEHEAT=m -CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m -CONFIG_USB_SERIAL_CP210X=m -CONFIG_USB_SERIAL_CYPRESS_M8=m -CONFIG_USB_SERIAL_EMPEG=m -CONFIG_USB_SERIAL_FTDI_SIO=m -CONFIG_USB_SERIAL_FUNSOFT=m -CONFIG_USB_SERIAL_VISOR=m -CONFIG_USB_SERIAL_IPAQ=m -CONFIG_USB_SERIAL_IR=m -CONFIG_USB_SERIAL_EDGEPORT=m -CONFIG_USB_SERIAL_EDGEPORT_TI=m -CONFIG_USB_SERIAL_F81232=m -CONFIG_USB_SERIAL_GARMIN=m -CONFIG_USB_SERIAL_IPW=m -CONFIG_USB_SERIAL_IUU=m -CONFIG_USB_SERIAL_KEYSPAN_PDA=m -CONFIG_USB_SERIAL_KEYSPAN=m -CONFIG_USB_SERIAL_KEYSPAN_MPR=y -CONFIG_USB_SERIAL_KEYSPAN_USA28=y -CONFIG_USB_SERIAL_KEYSPAN_USA28X=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y -CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y -CONFIG_USB_SERIAL_KEYSPAN_USA19=y -CONFIG_USB_SERIAL_KEYSPAN_USA18X=y -CONFIG_USB_SERIAL_KEYSPAN_USA19W=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y -CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y -CONFIG_USB_SERIAL_KEYSPAN_USA49W=y -CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y -CONFIG_USB_SERIAL_KLSI=m -CONFIG_USB_SERIAL_KOBIL_SCT=m -CONFIG_USB_SERIAL_MCT_U232=m -CONFIG_USB_SERIAL_METRO=m -CONFIG_USB_SERIAL_MOS7720=m -CONFIG_USB_SERIAL_MOS7840=m -CONFIG_USB_SERIAL_MOTOROLA=m -CONFIG_USB_SERIAL_NAVMAN=m -CONFIG_USB_SERIAL_PL2303=m -CONFIG_USB_SERIAL_OTI6858=m -CONFIG_USB_SERIAL_QCAUX=m -CONFIG_USB_SERIAL_QUALCOMM=m -CONFIG_USB_SERIAL_SPCP8X5=m -CONFIG_USB_SERIAL_HP4X=m -CONFIG_USB_SERIAL_SAFE=m -CONFIG_USB_SERIAL_SAFE_PADDED=y -CONFIG_USB_SERIAL_SIEMENS_MPI=m -CONFIG_USB_SERIAL_SIERRAWIRELESS=m -CONFIG_USB_SERIAL_SYMBOL=m -CONFIG_USB_SERIAL_TI=m -CONFIG_USB_SERIAL_CYBERJACK=m -CONFIG_USB_SERIAL_XIRCOM=m -CONFIG_USB_SERIAL_WWAN=m -CONFIG_USB_SERIAL_OPTION=m -CONFIG_USB_SERIAL_OMNINET=m -CONFIG_USB_SERIAL_OPTICON=m -CONFIG_USB_SERIAL_VIVOPAY_SERIAL=m -CONFIG_USB_SERIAL_ZIO=m -CONFIG_USB_SERIAL_SSU100=m -# CONFIG_USB_SERIAL_DEBUG is not set - -# -# USB Miscellaneous drivers -# -CONFIG_USB_EMI62=m -CONFIG_USB_EMI26=m -CONFIG_USB_ADUTUX=m -CONFIG_USB_SEVSEG=m -CONFIG_USB_RIO500=m -CONFIG_USB_LEGOTOWER=m -CONFIG_USB_LCD=m -CONFIG_USB_LED=m -CONFIG_USB_CYPRESS_CY7C63=m -CONFIG_USB_CYTHERM=m -CONFIG_USB_IDMOUSE=m -CONFIG_USB_FTDI_ELAN=m -CONFIG_USB_APPLEDISPLAY=m -CONFIG_USB_SISUSBVGA=m -CONFIG_USB_SISUSBVGA_CON=y -CONFIG_USB_LD=m -CONFIG_USB_TRANCEVIBRATOR=m -CONFIG_USB_IOWARRIOR=m -# CONFIG_USB_TEST is not set -CONFIG_USB_ISIGHTFW=m -CONFIG_USB_YUREX=m -CONFIG_USB_GADGET=y -# CONFIG_USB_GADGET_DEBUG is not set -# CONFIG_USB_GADGET_DEBUG_FILES is not set -CONFIG_USB_GADGET_VBUS_DRAW=2 -CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 -# CONFIG_USB_FUSB300 is not set -# CONFIG_USB_R8A66597 is not set -# CONFIG_USB_MV_UDC is not set -# CONFIG_USB_M66592 is not set -# CONFIG_USB_NET2272 is not set -# CONFIG_USB_DUMMY_HCD is not set -# CONFIG_USB_ZERO is not set -# CONFIG_USB_AUDIO is not set -# CONFIG_USB_ETH is not set -# CONFIG_USB_G_NCM is not set -# CONFIG_USB_GADGETFS is not set -# CONFIG_USB_FUNCTIONFS is not set -CONFIG_USB_FILE_STORAGE=m -CONFIG_USB_FILE_STORAGE_TEST=y -# CONFIG_USB_MASS_STORAGE is not set -# CONFIG_USB_G_SERIAL is not set -# CONFIG_USB_MIDI_GADGET is not set -# CONFIG_USB_G_PRINTER is not set -# CONFIG_USB_CDC_COMPOSITE is not set -# CONFIG_USB_G_ACM_MS is not set -# CONFIG_USB_G_MULTI is not set -# CONFIG_USB_G_HID is not set -# CONFIG_USB_G_DBGP is not set -# CONFIG_USB_G_WEBCAM is not set - -# -# OTG and related infrastructure -# -# CONFIG_USB_OTG_WAKELOCK is not set -# CONFIG_USB_GPIO_VBUS is not set -# CONFIG_USB_ULPI is not set -# CONFIG_NOP_USB_XCEIV is not set -# CONFIG_USB_SW_SUNXI_USB is not set -CONFIG_MMC=y -# CONFIG_MMC_DEBUG is not set -CONFIG_MMC_UNSAFE_RESUME=y -# CONFIG_MMC_CLKGATE is not set -# CONFIG_MMC_EMBEDDED_SDIO is not set -# CONFIG_MMC_PARANOID_SD_INIT is not set - -# -# MMC/SD/SDIO Card Drivers -# -CONFIG_MMC_BLOCK=y -CONFIG_MMC_BLOCK_MINORS=8 -# CONFIG_MMC_BLOCK_BOUNCE is not set -# CONFIG_MMC_BLOCK_DEFERRED_RESUME is not set -# CONFIG_SDIO_UART is not set -# CONFIG_MMC_TEST is not set - -# -# MMC/SD/SDIO Host Controller Drivers -# -# CONFIG_MMC_ARMMMCI is not set -# CONFIG_MMC_SDHCI is not set -# CONFIG_MMC_DW is not set -CONFIG_MMC_SUNXI_NEW=y -# CONFIG_MMC_DEBUG_SUNXI is not set -CONFIG_MMC_PRE_DBGLVL_SUNXI=0 -# CONFIG_MMC_VUB300 is not set -# CONFIG_MMC_USHC is not set - -# -# MMC/SD/SDIO Card Power Management Drivers -# -CONFIG_MMC_SUNXI_POWER_CONTROL=y - -# -# SUNXI MMC/SD/SDIO Host Controller Drivers -# -# CONFIG_MEMSTICK is not set -CONFIG_NEW_LEDS=y -CONFIG_LEDS_CLASS=y - -# -# LED drivers -# -CONFIG_LEDS_SUNXI=m -# CONFIG_LEDS_LM3530 is not set -# CONFIG_LEDS_PCA9532 is not set -# CONFIG_LEDS_GPIO is not set -# CONFIG_LEDS_LP3944 is not set -# CONFIG_LEDS_LP5521 is not set -# CONFIG_LEDS_LP5523 is not set -# CONFIG_LEDS_PCA955X is not set -# CONFIG_LEDS_PCA9633 is not set -# CONFIG_LEDS_DAC124S085 is not set -# CONFIG_LEDS_REGULATOR is not set -# CONFIG_LEDS_BD2802 is not set -# CONFIG_LEDS_LT3593 is not set -# CONFIG_LEDS_RENESAS_TPU is not set -# CONFIG_LEDS_TCA6507 is not set -# CONFIG_LEDS_OT200 is not set -CONFIG_LEDS_TRIGGERS=y - -# -# LED Triggers -# -CONFIG_LEDS_TRIGGER_TIMER=y -CONFIG_LEDS_TRIGGER_HEARTBEAT=y -CONFIG_LEDS_TRIGGER_BACKLIGHT=y -CONFIG_LEDS_TRIGGER_CPU=y -CONFIG_LEDS_TRIGGER_GPIO=y -CONFIG_LEDS_TRIGGER_DEFAULT_ON=y - -# -# iptables trigger is under Netfilter config (LED target) -# -# CONFIG_SWITCH is not set -# CONFIG_ACCESSIBILITY is not set -CONFIG_RTC_LIB=y -CONFIG_RTC_CLASS=y -CONFIG_RTC_HCTOSYS=y -CONFIG_RTC_HCTOSYS_DEVICE="rtc0" -# CONFIG_RTC_DEBUG is not set - -# -# RTC interfaces -# -CONFIG_RTC_INTF_SYSFS=y -CONFIG_RTC_INTF_PROC=y -CONFIG_RTC_INTF_DEV=y -# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set -# CONFIG_RTC_DRV_TEST is not set - -# -# I2C RTC drivers -# -# CONFIG_RTC_DRV_DS1307 is not set -# CONFIG_RTC_DRV_DS1374 is not set -# CONFIG_RTC_DRV_DS1672 is not set -# CONFIG_RTC_DRV_DS3232 is not set -# CONFIG_RTC_DRV_MAX6900 is not set -# CONFIG_RTC_DRV_RS5C372 is not set -# CONFIG_RTC_DRV_ISL1208 is not set -# CONFIG_RTC_DRV_ISL12022 is not set -# CONFIG_RTC_DRV_X1205 is not set -# CONFIG_RTC_DRV_PCF8563 is not set -# CONFIG_RTC_DRV_PCF8583 is not set -# CONFIG_RTC_DRV_M41T80 is not set -# CONFIG_RTC_DRV_BQ32K is not set -# CONFIG_RTC_DRV_S35390A is not set -# CONFIG_RTC_DRV_FM3130 is not set -# CONFIG_RTC_DRV_RX8581 is not set -# CONFIG_RTC_DRV_RX8025 is not set -# CONFIG_RTC_DRV_EM3027 is not set -# CONFIG_RTC_DRV_RV3029C2 is not set - -# -# SPI RTC drivers -# -# CONFIG_RTC_DRV_M41T93 is not set -# CONFIG_RTC_DRV_M41T94 is not set -# CONFIG_RTC_DRV_DS1305 is not set -# CONFIG_RTC_DRV_DS1390 is not set -# CONFIG_RTC_DRV_MAX6902 is not set -# CONFIG_RTC_DRV_R9701 is not set -# CONFIG_RTC_DRV_RS5C348 is not set -# CONFIG_RTC_DRV_DS3234 is not set -# CONFIG_RTC_DRV_PCF2123 is not set - -# -# Platform RTC drivers -# -# CONFIG_RTC_DRV_CMOS is not set -# CONFIG_RTC_DRV_DS1286 is not set -# CONFIG_RTC_DRV_DS1511 is not set -# CONFIG_RTC_DRV_DS1553 is not set -# CONFIG_RTC_DRV_DS1742 is not set -# CONFIG_RTC_DRV_STK17TA8 is not set -# CONFIG_RTC_DRV_M48T86 is not set -# CONFIG_RTC_DRV_M48T35 is not set -# CONFIG_RTC_DRV_M48T59 is not set -# CONFIG_RTC_DRV_MSM6242 is not set -# CONFIG_RTC_DRV_BQ4802 is not set -# CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_V3020 is not set - -# -# on-CPU RTC drivers -# -# CONFIG_RTC_DRV_PL030 is not set -# CONFIG_RTC_DRV_PL031 is not set -CONFIG_RTC_DRV_SUN4I=y -# CONFIG_DMADEVICES is not set -# CONFIG_AUXDISPLAY is not set -# CONFIG_UIO is not set - -# -# Virtio drivers -# -# CONFIG_VIRTIO_BALLOON is not set -# CONFIG_VIRTIO_MMIO is not set - -# -# Microsoft Hyper-V guest support -# -CONFIG_STAGING=y -CONFIG_USBIP_CORE=m -CONFIG_USBIP_VHCI_HCD=m -CONFIG_USBIP_HOST=m -# CONFIG_USBIP_DEBUG is not set -CONFIG_W35UND=m -CONFIG_PRISM2_USB=m -# CONFIG_ECHO is not set -# CONFIG_ASUS_OLED is not set -# CONFIG_RTLLIB is not set -CONFIG_R8712U=m -# CONFIG_RTS5139 is not set -# CONFIG_TRANZPORT is not set -# CONFIG_LINE6_USB is not set -# CONFIG_USB_SERIAL_QUATECH2 is not set -# CONFIG_USB_SERIAL_QUATECH_USB2 is not set -# CONFIG_VT6656 is not set -# CONFIG_IIO is not set -# CONFIG_FB_SM7XX is not set -# CONFIG_USB_ENESTORAGE is not set -# CONFIG_BCM_WIMAX is not set -# CONFIG_FT1000 is not set - -# -# Speakup console speech -# -# CONFIG_SPEAKUP is not set -# CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set -# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set -CONFIG_STAGING_MEDIA=y -# CONFIG_DVB_AS102 is not set -# CONFIG_EASYCAP is not set -CONFIG_LIRC_STAGING=y -CONFIG_LIRC_IGORPLUGUSB=m -CONFIG_LIRC_IMON=m -CONFIG_LIRC_SASEM=m -CONFIG_LIRC_SERIAL=m -CONFIG_LIRC_SERIAL_TRANSMITTER=y -CONFIG_LIRC_SIR=m -CONFIG_LIRC_TTUSBIR=m -CONFIG_LIRC_ZILOG=m - -# -# Android -# -# CONFIG_ANDROID is not set -CONFIG_PHONE=y -# CONFIG_USB_WPAN_HCD is not set - -# -# Hardware Spinlock drivers -# -CONFIG_IOMMU_SUPPORT=y - -# -# Remoteproc drivers (EXPERIMENTAL) -# - -# -# Rpmsg drivers (EXPERIMENTAL) -# -# CONFIG_VIRT_DRIVERS is not set -# CONFIG_PM_DEVFREQ is not set - -# -# File systems -# -# CONFIG_EXT2_FS is not set -# CONFIG_EXT3_FS is not set -CONFIG_EXT4_FS=y -CONFIG_EXT4_USE_FOR_EXT23=y -CONFIG_EXT4_FS_XATTR=y -CONFIG_EXT4_FS_POSIX_ACL=y -CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_DEBUG is not set -CONFIG_JBD2=y -CONFIG_FS_MBCACHE=y -# CONFIG_REISERFS_FS is not set -# CONFIG_JFS_FS is not set -# CONFIG_XFS_FS is not set -# CONFIG_GFS2_FS is not set -# CONFIG_OCFS2_FS is not set -CONFIG_BTRFS_FS=m -CONFIG_BTRFS_FS_POSIX_ACL=y -# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set -CONFIG_NILFS2_FS=y -CONFIG_FS_POSIX_ACL=y -CONFIG_EXPORTFS=y -CONFIG_FILE_LOCKING=y -CONFIG_FSNOTIFY=y -CONFIG_DNOTIFY=y -CONFIG_INOTIFY_USER=y -CONFIG_FANOTIFY=y -CONFIG_QUOTA=y -CONFIG_QUOTA_NETLINK_INTERFACE=y -# CONFIG_PRINT_QUOTA_WARNING is not set -# CONFIG_QUOTA_DEBUG is not set -CONFIG_QUOTA_TREE=y -CONFIG_QFMT_V1=y -CONFIG_QFMT_V2=y -CONFIG_QUOTACTL=y -CONFIG_AUTOFS4_FS=y -CONFIG_FUSE_FS=y -CONFIG_CUSE=y -CONFIG_GENERIC_ACL=y - -# -# Caches -# -CONFIG_FSCACHE=y -CONFIG_FSCACHE_STATS=y -# CONFIG_FSCACHE_HISTOGRAM is not set -# CONFIG_FSCACHE_DEBUG is not set -# CONFIG_FSCACHE_OBJECT_LIST is not set -CONFIG_CACHEFILES=y -# CONFIG_CACHEFILES_DEBUG is not set -# CONFIG_CACHEFILES_HISTOGRAM is not set - -# -# CD-ROM/DVD Filesystems -# -CONFIG_ISO9660_FS=y -CONFIG_JOLIET=y -CONFIG_ZISOFS=y -CONFIG_UDF_FS=y -CONFIG_UDF_NLS=y - -# -# DOS/FAT/NT Filesystems -# -CONFIG_FAT_FS=y -CONFIG_MSDOS_FS=y -CONFIG_VFAT_FS=y -CONFIG_FAT_DEFAULT_CODEPAGE=437 -CONFIG_FAT_DEFAULT_IOCHARSET="ascii" -# CONFIG_NTFS_FS is not set - -# -# Pseudo filesystems -# -CONFIG_PROC_FS=y -CONFIG_PROC_SYSCTL=y -CONFIG_PROC_PAGE_MONITOR=y -CONFIG_SYSFS=y -CONFIG_TMPFS=y -CONFIG_TMPFS_POSIX_ACL=y -CONFIG_TMPFS_XATTR=y -# CONFIG_HUGETLB_PAGE is not set -CONFIG_CONFIGFS_FS=m -CONFIG_MISC_FILESYSTEMS=y -# CONFIG_ADFS_FS is not set -# CONFIG_AFFS_FS is not set -# CONFIG_ECRYPT_FS is not set -# CONFIG_HFS_FS is not set -# CONFIG_HFSPLUS_FS is not set -# CONFIG_BEFS_FS is not set -# CONFIG_BFS_FS is not set -# CONFIG_EFS_FS is not set -CONFIG_JFFS2_FS=y -CONFIG_JFFS2_FS_DEBUG=0 -CONFIG_JFFS2_FS_WRITEBUFFER=y -# CONFIG_JFFS2_FS_WBUF_VERIFY is not set -# CONFIG_JFFS2_SUMMARY is not set -CONFIG_JFFS2_FS_XATTR=y -CONFIG_JFFS2_FS_POSIX_ACL=y -CONFIG_JFFS2_FS_SECURITY=y -CONFIG_JFFS2_COMPRESSION_OPTIONS=y -CONFIG_JFFS2_ZLIB=y -CONFIG_JFFS2_LZO=y -CONFIG_JFFS2_RTIME=y -# CONFIG_JFFS2_RUBIN is not set -# CONFIG_JFFS2_CMODE_NONE is not set -CONFIG_JFFS2_CMODE_PRIORITY=y -# CONFIG_JFFS2_CMODE_SIZE is not set -# CONFIG_JFFS2_CMODE_FAVOURLZO is not set -CONFIG_UBIFS_FS=y -CONFIG_UBIFS_FS_XATTR=y -CONFIG_UBIFS_FS_ADVANCED_COMPR=y -CONFIG_UBIFS_FS_LZO=y -CONFIG_UBIFS_FS_ZLIB=y -# CONFIG_UBIFS_FS_DEBUG is not set -# CONFIG_LOGFS is not set -# CONFIG_CRAMFS is not set -CONFIG_SQUASHFS=y -CONFIG_SQUASHFS_XATTR=y -CONFIG_SQUASHFS_ZLIB=y -CONFIG_SQUASHFS_LZO=y -CONFIG_SQUASHFS_XZ=y -# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set -# CONFIG_SQUASHFS_EMBEDDED is not set -CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 -# CONFIG_VXFS_FS is not set -# CONFIG_MINIX_FS is not set -# CONFIG_OMFS_FS is not set -# CONFIG_HPFS_FS is not set -# CONFIG_QNX4FS_FS is not set -# CONFIG_QNX6FS_FS is not set -# CONFIG_ROMFS_FS is not set -# CONFIG_PSTORE is not set -# CONFIG_SYSV_FS is not set -# CONFIG_UFS_FS is not set -CONFIG_NETWORK_FILESYSTEMS=y -CONFIG_NFS_FS=y -CONFIG_NFS_V3=y -CONFIG_NFS_V3_ACL=y -CONFIG_NFS_V4=y -# CONFIG_NFS_V4_1 is not set -CONFIG_NFS_FSCACHE=y -# CONFIG_NFS_USE_LEGACY_DNS is not set -CONFIG_NFS_USE_KERNEL_DNS=y -CONFIG_NFSD=m -CONFIG_NFSD_V2_ACL=y -CONFIG_NFSD_V3=y -CONFIG_NFSD_V3_ACL=y -CONFIG_NFSD_V4=y -# CONFIG_NFSD_FAULT_INJECTION is not set -CONFIG_LOCKD=y -CONFIG_LOCKD_V4=y -CONFIG_NFS_ACL_SUPPORT=y -CONFIG_NFS_COMMON=y -CONFIG_SUNRPC=y -CONFIG_SUNRPC_GSS=y -CONFIG_RPCSEC_GSS_KRB5=m -# CONFIG_SUNRPC_DEBUG is not set -# CONFIG_CEPH_FS is not set -CONFIG_CIFS=m -# CONFIG_CIFS_STATS is not set -CONFIG_CIFS_WEAK_PW_HASH=y -CONFIG_CIFS_UPCALL=y -CONFIG_CIFS_XATTR=y -CONFIG_CIFS_POSIX=y -# CONFIG_CIFS_DEBUG2 is not set -# CONFIG_CIFS_DFS_UPCALL is not set -CONFIG_CIFS_FSCACHE=y -CONFIG_CIFS_ACL=y -# CONFIG_NCP_FS is not set -# CONFIG_CODA_FS is not set -# CONFIG_AFS_FS is not set -CONFIG_NLS=y -CONFIG_NLS_DEFAULT="utf8" -CONFIG_NLS_CODEPAGE_437=y -# CONFIG_NLS_CODEPAGE_737 is not set -# CONFIG_NLS_CODEPAGE_775 is not set -# CONFIG_NLS_CODEPAGE_850 is not set -# CONFIG_NLS_CODEPAGE_852 is not set -# CONFIG_NLS_CODEPAGE_855 is not set -# CONFIG_NLS_CODEPAGE_857 is not set -# CONFIG_NLS_CODEPAGE_860 is not set -# CONFIG_NLS_CODEPAGE_861 is not set -# CONFIG_NLS_CODEPAGE_862 is not set -# CONFIG_NLS_CODEPAGE_863 is not set -# CONFIG_NLS_CODEPAGE_864 is not set -# CONFIG_NLS_CODEPAGE_865 is not set -# CONFIG_NLS_CODEPAGE_866 is not set -# CONFIG_NLS_CODEPAGE_869 is not set -CONFIG_NLS_CODEPAGE_936=y -CONFIG_NLS_CODEPAGE_950=y -CONFIG_NLS_CODEPAGE_932=y -CONFIG_NLS_CODEPAGE_949=y -# CONFIG_NLS_CODEPAGE_874 is not set -# CONFIG_NLS_ISO8859_8 is not set -# CONFIG_NLS_CODEPAGE_1250 is not set -# CONFIG_NLS_CODEPAGE_1251 is not set -CONFIG_NLS_ASCII=y -CONFIG_NLS_ISO8859_1=y -# CONFIG_NLS_ISO8859_2 is not set -# CONFIG_NLS_ISO8859_3 is not set -# CONFIG_NLS_ISO8859_4 is not set -# CONFIG_NLS_ISO8859_5 is not set -# CONFIG_NLS_ISO8859_6 is not set -# CONFIG_NLS_ISO8859_7 is not set -# CONFIG_NLS_ISO8859_9 is not set -# CONFIG_NLS_ISO8859_13 is not set -# CONFIG_NLS_ISO8859_14 is not set -# CONFIG_NLS_ISO8859_15 is not set -# CONFIG_NLS_KOI8_R is not set -# CONFIG_NLS_KOI8_U is not set -CONFIG_NLS_UTF8=y -CONFIG_DLM=m -# CONFIG_DLM_DEBUG is not set - -# -# Kernel hacking -# -CONFIG_PRINTK_TIME=y -CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 -# CONFIG_ENABLE_WARN_DEPRECATED is not set -CONFIG_ENABLE_MUST_CHECK=y -CONFIG_FRAME_WARN=2048 -CONFIG_MAGIC_SYSRQ=y -CONFIG_STRIP_ASM_SYMS=y -# CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_DEBUG_FS is not set -# CONFIG_HEADERS_CHECK is not set -# CONFIG_DEBUG_SECTION_MISMATCH is not set -CONFIG_DEBUG_KERNEL=y -# CONFIG_DEBUG_SHIRQ is not set -# CONFIG_LOCKUP_DETECTOR is not set -# CONFIG_HARDLOCKUP_DETECTOR_NMI is not set -# CONFIG_HARDLOCKUP_DETECTOR_OTHER_CPU is not set -# CONFIG_HARDLOCKUP_DETECTOR is not set -# CONFIG_DETECT_HUNG_TASK is not set -CONFIG_SCHED_DEBUG=y -CONFIG_SCHEDSTATS=y -# CONFIG_TIMER_STATS is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SLUB_DEBUG_ON is not set -# CONFIG_SLUB_STATS is not set -# CONFIG_DEBUG_KMEMLEAK is not set -CONFIG_DEBUG_PREEMPT=y -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_RT_MUTEX_TESTER is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_PROVE_LOCKING is not set -# CONFIG_SPARSE_RCU_POINTER is not set -# CONFIG_LOCK_STAT is not set -# CONFIG_DEBUG_ATOMIC_SLEEP is not set -# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set -CONFIG_STACKTRACE=y -# CONFIG_DEBUG_STACK_USAGE is not set -# CONFIG_DEBUG_KOBJECT is not set -# CONFIG_DEBUG_HIGHMEM is not set -CONFIG_DEBUG_BUGVERBOSE=y -# CONFIG_DEBUG_INFO is not set -# CONFIG_DEBUG_VM is not set -# CONFIG_DEBUG_WRITECOUNT is not set -CONFIG_DEBUG_MEMORY_INIT=y -# CONFIG_DEBUG_LIST is not set -# CONFIG_TEST_LIST_SORT is not set -# CONFIG_DEBUG_SG is not set -# CONFIG_DEBUG_NOTIFIERS is not set -# CONFIG_DEBUG_CREDENTIALS is not set -# CONFIG_BOOT_PRINTK_DELAY is not set -# CONFIG_RCU_TORTURE_TEST is not set -# CONFIG_RCU_TRACE is not set -# CONFIG_BACKTRACE_SELF_TEST is not set -# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set -# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set -# CONFIG_FAULT_INJECTION is not set -# CONFIG_LATENCYTOP is not set -# CONFIG_DEBUG_PAGEALLOC is not set -CONFIG_HAVE_FUNCTION_TRACER=y -CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y -CONFIG_HAVE_DYNAMIC_FTRACE=y -CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y -CONFIG_HAVE_C_RECORDMCOUNT=y -CONFIG_TRACING_SUPPORT=y -# CONFIG_FTRACE is not set -# CONFIG_DMA_API_DEBUG is not set -# CONFIG_ATOMIC64_SELFTEST is not set -# CONFIG_ASYNC_RAID6_TEST is not set -# CONFIG_SAMPLES is not set -CONFIG_HAVE_ARCH_KGDB=y -# CONFIG_KGDB is not set -# CONFIG_TEST_KSTRTOX is not set -CONFIG_STRICT_DEVMEM=y -CONFIG_ARM_UNWIND=y -# CONFIG_DEBUG_USER is not set -# CONFIG_DEBUG_RODATA is not set -# CONFIG_DEBUG_LL is not set -# CONFIG_OC_ETM is not set - -# -# Security options -# -CONFIG_KEYS=y -# CONFIG_ENCRYPTED_KEYS is not set -# CONFIG_KEYS_DEBUG_PROC_KEYS is not set -# CONFIG_SECURITY_DMESG_RESTRICT is not set -# CONFIG_SECURITY is not set -CONFIG_SECURITYFS=y -CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_DEFAULT_SECURITY="" -CONFIG_XOR_BLOCKS=m -CONFIG_ASYNC_CORE=m -CONFIG_ASYNC_MEMCPY=m -CONFIG_ASYNC_XOR=m -CONFIG_ASYNC_PQ=m -CONFIG_ASYNC_RAID6_RECOV=m -CONFIG_CRYPTO=y - -# -# Crypto core or helper -# -# CONFIG_CRYPTO_FIPS is not set -CONFIG_CRYPTO_ALGAPI=y -CONFIG_CRYPTO_ALGAPI2=y -CONFIG_CRYPTO_AEAD=y -CONFIG_CRYPTO_AEAD2=y -CONFIG_CRYPTO_BLKCIPHER=y -CONFIG_CRYPTO_BLKCIPHER2=y -CONFIG_CRYPTO_HASH=y -CONFIG_CRYPTO_HASH2=y -CONFIG_CRYPTO_RNG=y -CONFIG_CRYPTO_RNG2=y -CONFIG_CRYPTO_PCOMP=y -CONFIG_CRYPTO_PCOMP2=y -CONFIG_CRYPTO_MANAGER=y -CONFIG_CRYPTO_MANAGER2=y -CONFIG_CRYPTO_USER=m -# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set -CONFIG_CRYPTO_GF128MUL=y -# CONFIG_CRYPTO_NULL is not set -CONFIG_CRYPTO_WORKQUEUE=y -# CONFIG_CRYPTO_CRYPTD is not set -CONFIG_CRYPTO_AUTHENC=y -# CONFIG_CRYPTO_TEST is not set - -# -# Authenticated Encryption with Associated Data -# -# CONFIG_CRYPTO_CCM is not set -# CONFIG_CRYPTO_GCM is not set -CONFIG_CRYPTO_SEQIV=y - -# -# Block modes -# -CONFIG_CRYPTO_CBC=y -CONFIG_CRYPTO_CTR=m -CONFIG_CRYPTO_CTS=m -CONFIG_CRYPTO_ECB=y -# CONFIG_CRYPTO_LRW is not set -CONFIG_CRYPTO_PCBC=m -# CONFIG_CRYPTO_XTS is not set - -# -# Hash modes -# -CONFIG_CRYPTO_HMAC=y -CONFIG_CRYPTO_XCBC=m -# CONFIG_CRYPTO_VMAC is not set - -# -# Digest -# -CONFIG_CRYPTO_CRC32C=y -CONFIG_CRYPTO_GHASH=m -CONFIG_CRYPTO_MD4=y -CONFIG_CRYPTO_MD5=y -CONFIG_CRYPTO_MICHAEL_MIC=m -CONFIG_CRYPTO_RMD128=m -CONFIG_CRYPTO_RMD160=m -CONFIG_CRYPTO_RMD256=m -CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA1=y -CONFIG_CRYPTO_SHA256=m -CONFIG_CRYPTO_SHA512=m -# CONFIG_CRYPTO_TGR192 is not set -# CONFIG_CRYPTO_WP512 is not set - -# -# Ciphers -# -CONFIG_CRYPTO_AES=y -# CONFIG_CRYPTO_ANUBIS is not set -CONFIG_CRYPTO_ARC4=y -CONFIG_CRYPTO_BLOWFISH=m -CONFIG_CRYPTO_BLOWFISH_COMMON=m -# CONFIG_CRYPTO_CAMELLIA is not set -# CONFIG_CRYPTO_CAST5 is not set -# CONFIG_CRYPTO_CAST6 is not set -CONFIG_CRYPTO_DES=y -# CONFIG_CRYPTO_FCRYPT is not set -# CONFIG_CRYPTO_KHAZAD is not set -# CONFIG_CRYPTO_SALSA20 is not set -# CONFIG_CRYPTO_SEED is not set -# CONFIG_CRYPTO_SERPENT is not set -# CONFIG_CRYPTO_TEA is not set -# CONFIG_CRYPTO_TWOFISH is not set - -# -# Compression -# -CONFIG_CRYPTO_DEFLATE=y -CONFIG_CRYPTO_ZLIB=y -CONFIG_CRYPTO_LZO=y - -# -# Random Number Generation -# -CONFIG_CRYPTO_ANSI_CPRNG=m -CONFIG_CRYPTO_USER_API=m -CONFIG_CRYPTO_USER_API_HASH=m -CONFIG_CRYPTO_USER_API_SKCIPHER=m -# CONFIG_CRYPTO_HW is not set -# CONFIG_BINARY_PRINTF is not set - -# -# Library routines -# -CONFIG_RAID6_PQ=m -CONFIG_BITREVERSE=y -CONFIG_GENERIC_PCI_IOMAP=y -CONFIG_GENERIC_IO=y -CONFIG_CRC_CCITT=m -CONFIG_CRC16=y -CONFIG_CRC_T10DIF=y -CONFIG_CRC_ITU_T=y -CONFIG_CRC32=y -# CONFIG_CRC32_SELFTEST is not set -CONFIG_CRC32_SLICEBY8=y -# CONFIG_CRC32_SLICEBY4 is not set -# CONFIG_CRC32_SARWATE is not set -# CONFIG_CRC32_BIT is not set -# CONFIG_CRC7 is not set -CONFIG_LIBCRC32C=y -# CONFIG_CRC8 is not set -CONFIG_ZLIB_INFLATE=y -CONFIG_ZLIB_DEFLATE=y -CONFIG_LZO_COMPRESS=y -CONFIG_LZO_DECOMPRESS=y -CONFIG_XZ_DEC=y -CONFIG_XZ_DEC_X86=y -CONFIG_XZ_DEC_POWERPC=y -CONFIG_XZ_DEC_IA64=y -CONFIG_XZ_DEC_ARM=y -CONFIG_XZ_DEC_ARMTHUMB=y -CONFIG_XZ_DEC_SPARC=y -CONFIG_XZ_DEC_BCJ=y -# CONFIG_XZ_DEC_TEST is not set -CONFIG_DECOMPRESS_GZIP=y -CONFIG_DECOMPRESS_BZIP2=y -CONFIG_DECOMPRESS_LZMA=y -CONFIG_DECOMPRESS_XZ=y -CONFIG_DECOMPRESS_LZO=y -CONFIG_TEXTSEARCH=y -CONFIG_TEXTSEARCH_KMP=m -CONFIG_TEXTSEARCH_BM=m -CONFIG_TEXTSEARCH_FSM=m -CONFIG_HAS_IOMEM=y -CONFIG_HAS_IOPORT=y -CONFIG_HAS_DMA=y -CONFIG_DQL=y -CONFIG_NLATTR=y -CONFIG_AVERAGE=y -# CONFIG_CORDIC is not set diff --git a/core/linux-sun4i/linux-sun4i.install b/core/linux-sun4i/linux-sun4i.install deleted file mode 100644 index 45ee46c7b..000000000 --- a/core/linux-sun4i/linux-sun4i.install +++ /dev/null @@ -1,24 +0,0 @@ -# arg 1: the new package version -# arg 2: the old package version - -KERNEL_NAME= -KERNEL_VERSION=3.4.79-1-ARCH - -post_install () { - # updating module dependencies - echo ">>> Updating module dependencies. Please wait ..." - depmod ${KERNEL_VERSION} -} - -post_upgrade() { - if grep "^[^#]*[[:space:]]/boot" etc/fstab 2>&1 >/dev/null; then - if ! grep "[[:space:]]/boot" etc/mtab 2>&1 >/dev/null; then - echo "WARNING: /boot appears to be a seperate partition but is not mounted." - echo " You probably just broke your system. Congratulations." - fi - fi - - # updating module dependencies - echo ">>> Updating module dependencies. Please wait ..." - depmod ${KERNEL_VERSION} -} diff --git a/core/linux-sun4i/memset.patch b/core/linux-sun4i/memset.patch deleted file mode 100644 index a741741ab..000000000 --- a/core/linux-sun4i/memset.patch +++ /dev/null @@ -1,204 +0,0 @@ ---- a/arch/arm/lib/memset.S -+++ b/arch/arm/lib/memset.S -@@ -19,9 +19,9 @@ - 1: subs r2, r2, #4 @ 1 do we have enough - blt 5f @ 1 bytes to align with? - cmp r3, #2 @ 1 -- strltb r1, [r0], #1 @ 1 -- strleb r1, [r0], #1 @ 1 -- strb r1, [r0], #1 @ 1 -+ strltb r1, [ip], #1 @ 1 -+ strleb r1, [ip], #1 @ 1 -+ strb r1, [ip], #1 @ 1 - add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) - /* - * The pointer is now aligned and the length is adjusted. Try doing the -@@ -29,10 +29,14 @@ - */ - - ENTRY(memset) -- ands r3, r0, #3 @ 1 unaligned? -+/* -+ * Preserve the contents of r0 for the return value. -+ */ -+ mov ip, r0 -+ ands r3, ip, #3 @ 1 unaligned? - bne 1b @ 1 - /* -- * we know that the pointer in r0 is aligned to a word boundary. -+ * we know that the pointer in ip is aligned to a word boundary. - */ - orr r1, r1, r1, lsl #8 - orr r1, r1, r1, lsl #16 -@@ -43,29 +47,28 @@ ENTRY(memset) - #if ! CALGN(1)+0 - - /* -- * We need an extra register for this loop - save the return address and -- * use the LR -+ * We need 2 extra registers for this loop - use r8 and the LR - */ -- str lr, [sp, #-4]! -- mov ip, r1 -+ stmfd sp!, {r8, lr} -+ mov r8, r1 - mov lr, r1 - - 2: subs r2, r2, #64 -- stmgeia r0!, {r1, r3, ip, lr} @ 64 bytes at a time. -- stmgeia r0!, {r1, r3, ip, lr} -- stmgeia r0!, {r1, r3, ip, lr} -- stmgeia r0!, {r1, r3, ip, lr} -+ stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time. -+ stmgeia ip!, {r1, r3, r8, lr} -+ stmgeia ip!, {r1, r3, r8, lr} -+ stmgeia ip!, {r1, r3, r8, lr} - bgt 2b -- ldmeqfd sp!, {pc} @ Now <64 bytes to go. -+ ldmeqfd sp!, {r8, pc} @ Now <64 bytes to go. - /* - * No need to correct the count; we're only testing bits from now on - */ - tst r2, #32 -- stmneia r0!, {r1, r3, ip, lr} -- stmneia r0!, {r1, r3, ip, lr} -+ stmneia ip!, {r1, r3, r8, lr} -+ stmneia ip!, {r1, r3, r8, lr} - tst r2, #16 -- stmneia r0!, {r1, r3, ip, lr} -- ldr lr, [sp], #4 -+ stmneia ip!, {r1, r3, r8, lr} -+ ldmfd sp!, {r8, lr} - - #else - -@@ -74,54 +77,54 @@ ENTRY(memset) - * whole cache lines at once. - */ - -- stmfd sp!, {r4-r7, lr} -+ stmfd sp!, {r4-r8, lr} - mov r4, r1 - mov r5, r1 - mov r6, r1 - mov r7, r1 -- mov ip, r1 -+ mov r8, r1 - mov lr, r1 - - cmp r2, #96 -- tstgt r0, #31 -+ tstgt ip, #31 - ble 3f - -- and ip, r0, #31 -- rsb ip, ip, #32 -- sub r2, r2, ip -- movs ip, ip, lsl #(32 - 4) -- stmcsia r0!, {r4, r5, r6, r7} -- stmmiia r0!, {r4, r5} -- tst ip, #(1 << 30) -- mov ip, r1 -- strne r1, [r0], #4 -+ and r8, ip, #31 -+ rsb r8, r8, #32 -+ sub r2, r2, r8 -+ movs r8, r8, lsl #(32 - 4) -+ stmcsia ip!, {r4, r5, r6, r7} -+ stmmiia ip!, {r4, r5} -+ tst r8, #(1 << 30) -+ mov r8, r1 -+ strne r1, [ip], #4 - - 3: subs r2, r2, #64 -- stmgeia r0!, {r1, r3-r7, ip, lr} -- stmgeia r0!, {r1, r3-r7, ip, lr} -+ stmgeia ip!, {r1, r3-r8, lr} -+ stmgeia ip!, {r1, r3-r8, lr} - bgt 3b -- ldmeqfd sp!, {r4-r7, pc} -+ ldmeqfd sp!, {r4-r8, pc} - - tst r2, #32 -- stmneia r0!, {r1, r3-r7, ip, lr} -+ stmneia ip!, {r1, r3-r8, lr} - tst r2, #16 -- stmneia r0!, {r4-r7} -- ldmfd sp!, {r4-r7, lr} -+ stmneia ip!, {r4-r7} -+ ldmfd sp!, {r4-r8, lr} - - #endif - - 4: tst r2, #8 -- stmneia r0!, {r1, r3} -+ stmneia ip!, {r1, r3} - tst r2, #4 -- strne r1, [r0], #4 -+ strne r1, [ip], #4 - /* - * When we get here, we've got less than 4 bytes to zero. We - * may have an unaligned pointer as well. - */ - 5: tst r2, #2 -- strneb r1, [r0], #1 -- strneb r1, [r0], #1 -+ strneb r1, [ip], #1 -+ strneb r1, [ip], #1 - tst r2, #1 -- strneb r1, [r0], #1 -+ strneb r1, [ip], #1 - mov pc, lr - ENDPROC(memset) ---- a/arch/arm/lib/memset.S -+++ b/arch/arm/lib/memset.S -@@ -14,31 +14,15 @@ - - .text - .align 5 -- .word 0 -- --1: subs r2, r2, #4 @ 1 do we have enough -- blt 5f @ 1 bytes to align with? -- cmp r3, #2 @ 1 -- strltb r1, [ip], #1 @ 1 -- strleb r1, [ip], #1 @ 1 -- strb r1, [ip], #1 @ 1 -- add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) --/* -- * The pointer is now aligned and the length is adjusted. Try doing the -- * memset again. -- */ - - ENTRY(memset) --/* -- * Preserve the contents of r0 for the return value. -- */ -- mov ip, r0 -- ands r3, ip, #3 @ 1 unaligned? -- bne 1b @ 1 -+ ands r3, r0, #3 @ 1 unaligned? -+ mov ip, r0 @ preserve r0 as return value -+ bne 6f @ 1 - /* - * we know that the pointer in ip is aligned to a word boundary. - */ -- orr r1, r1, r1, lsl #8 -+1: orr r1, r1, r1, lsl #8 - orr r1, r1, r1, lsl #16 - mov r3, r1 - cmp r2, #16 -@@ -127,4 +111,13 @@ ENTRY(memset) - tst r2, #1 - strneb r1, [ip], #1 - mov pc, lr -+ -+6: subs r2, r2, #4 @ 1 do we have enough -+ blt 5b @ 1 bytes to align with? -+ cmp r3, #2 @ 1 -+ strltb r1, [ip], #1 @ 1 -+ strleb r1, [ip], #1 @ 1 -+ strb r1, [ip], #1 @ 1 -+ add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) -+ b 1b - ENDPROC(memset)