diff options
299 files changed, 11289 insertions, 9265 deletions
diff --git a/Documentation/ABI/testing/sysfs-platform-ideapad-laptop b/Documentation/ABI/testing/sysfs-platform-ideapad-laptop index 807fca2ae2a4..ff53183c3848 100644 --- a/Documentation/ABI/testing/sysfs-platform-ideapad-laptop +++ b/Documentation/ABI/testing/sysfs-platform-ideapad-laptop | |||
@@ -4,3 +4,20 @@ KernelVersion: 2.6.37 | |||
4 | Contact: "Ike Panhc <ike.pan@canonical.com>" | 4 | Contact: "Ike Panhc <ike.pan@canonical.com>" |
5 | Description: | 5 | Description: |
6 | Control the power of camera module. 1 means on, 0 means off. | 6 | Control the power of camera module. 1 means on, 0 means off. |
7 | |||
8 | What: /sys/devices/platform/ideapad/cfg | ||
9 | Date: Jun 2011 | ||
10 | KernelVersion: 3.1 | ||
11 | Contact: "Ike Panhc <ike.pan@canonical.com>" | ||
12 | Description: | ||
13 | Ideapad capability bits. | ||
14 | Bit 8-10: 1 - Intel graphic only | ||
15 | 2 - ATI graphic only | ||
16 | 3 - Nvidia graphic only | ||
17 | 4 - Intel and ATI graphic | ||
18 | 5 - Intel and Nvidia graphic | ||
19 | Bit 16: Bluetooth exist (1 for exist) | ||
20 | Bit 17: 3G exist (1 for exist) | ||
21 | Bit 18: Wifi exist (1 for exist) | ||
22 | Bit 19: Camera exist (1 for exist) | ||
23 | |||
diff --git a/Documentation/CodingStyle b/Documentation/CodingStyle index fa6e25b94a54..c940239d9678 100644 --- a/Documentation/CodingStyle +++ b/Documentation/CodingStyle | |||
@@ -80,22 +80,13 @@ available tools. | |||
80 | The limit on the length of lines is 80 columns and this is a strongly | 80 | The limit on the length of lines is 80 columns and this is a strongly |
81 | preferred limit. | 81 | preferred limit. |
82 | 82 | ||
83 | Statements longer than 80 columns will be broken into sensible chunks. | 83 | Statements longer than 80 columns will be broken into sensible chunks, unless |
84 | Descendants are always substantially shorter than the parent and are placed | 84 | exceeding 80 columns significantly increases readability and does not hide |
85 | substantially to the right. The same applies to function headers with a long | 85 | information. Descendants are always substantially shorter than the parent and |
86 | argument list. Long strings are as well broken into shorter strings. The | 86 | are placed substantially to the right. The same applies to function headers |
87 | only exception to this is where exceeding 80 columns significantly increases | 87 | with a long argument list. However, never break user-visible strings such as |
88 | readability and does not hide information. | 88 | printk messages, because that breaks the ability to grep for them. |
89 | 89 | ||
90 | void fun(int a, int b, int c) | ||
91 | { | ||
92 | if (condition) | ||
93 | printk(KERN_WARNING "Warning this is a long printk with " | ||
94 | "3 parameters a: %u b: %u " | ||
95 | "c: %u \n", a, b, c); | ||
96 | else | ||
97 | next_statement; | ||
98 | } | ||
99 | 90 | ||
100 | Chapter 3: Placing Braces and Spaces | 91 | Chapter 3: Placing Braces and Spaces |
101 | 92 | ||
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 43f48098220d..c4a6e148732a 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
@@ -581,3 +581,14 @@ Why: This driver has been superseded by g_mass_storage. | |||
581 | Who: Alan Stern <stern@rowland.harvard.edu> | 581 | Who: Alan Stern <stern@rowland.harvard.edu> |
582 | 582 | ||
583 | ---------------------------- | 583 | ---------------------------- |
584 | |||
585 | What: threeg and interface sysfs files in /sys/devices/platform/acer-wmi | ||
586 | When: 2012 | ||
587 | Why: In 3.0, we can now autodetect internal 3G device and already have | ||
588 | the threeg rfkill device. So, we plan to remove threeg sysfs support | ||
589 | for it's no longer necessary. | ||
590 | |||
591 | We also plan to remove interface sysfs file that exposed which ACPI-WMI | ||
592 | interface that was used by acer-wmi driver. It will replaced by | ||
593 | information log when acer-wmi initial. | ||
594 | Who: Lee, Chun-Yi <jlee@novell.com> | ||
diff --git a/Documentation/networking/bonding.txt b/Documentation/networking/bonding.txt index 675612ff41ae..5dd960d75174 100644 --- a/Documentation/networking/bonding.txt +++ b/Documentation/networking/bonding.txt | |||
@@ -599,7 +599,7 @@ num_unsol_na | |||
599 | affect only the active-backup mode. These options were added for | 599 | affect only the active-backup mode. These options were added for |
600 | bonding versions 3.3.0 and 3.4.0 respectively. | 600 | bonding versions 3.3.0 and 3.4.0 respectively. |
601 | 601 | ||
602 | From Linux 2.6.40 and bonding version 3.7.1, these notifications | 602 | From Linux 3.0 and bonding version 3.7.1, these notifications |
603 | are generated by the ipv4 and ipv6 code and the numbers of | 603 | are generated by the ipv4 and ipv6 code and the numbers of |
604 | repetitions cannot be set independently. | 604 | repetitions cannot be set independently. |
605 | 605 | ||
diff --git a/Documentation/power/runtime_pm.txt b/Documentation/power/runtime_pm.txt index 14dd3c6ad97e..4ce5450ab6e8 100644 --- a/Documentation/power/runtime_pm.txt +++ b/Documentation/power/runtime_pm.txt | |||
@@ -54,11 +54,10 @@ referred to as subsystem-level callbacks in what follows. | |||
54 | By default, the callbacks are always invoked in process context with interrupts | 54 | By default, the callbacks are always invoked in process context with interrupts |
55 | enabled. However, subsystems can use the pm_runtime_irq_safe() helper function | 55 | enabled. However, subsystems can use the pm_runtime_irq_safe() helper function |
56 | to tell the PM core that a device's ->runtime_suspend() and ->runtime_resume() | 56 | to tell the PM core that a device's ->runtime_suspend() and ->runtime_resume() |
57 | callbacks should be invoked in atomic context with interrupts disabled | 57 | callbacks should be invoked in atomic context with interrupts disabled. |
58 | (->runtime_idle() is still invoked the default way). This implies that these | 58 | This implies that these callback routines must not block or sleep, but it also |
59 | callback routines must not block or sleep, but it also means that the | 59 | means that the synchronous helper functions listed at the end of Section 4 can |
60 | synchronous helper functions listed at the end of Section 4 can be used within | 60 | be used within an interrupt handler or in an atomic context. |
61 | an interrupt handler or in an atomic context. | ||
62 | 61 | ||
63 | The subsystem-level suspend callback is _entirely_ _responsible_ for handling | 62 | The subsystem-level suspend callback is _entirely_ _responsible_ for handling |
64 | the suspend of the device as appropriate, which may, but need not include | 63 | the suspend of the device as appropriate, which may, but need not include |
@@ -483,6 +482,7 @@ pm_runtime_suspend() | |||
483 | pm_runtime_autosuspend() | 482 | pm_runtime_autosuspend() |
484 | pm_runtime_resume() | 483 | pm_runtime_resume() |
485 | pm_runtime_get_sync() | 484 | pm_runtime_get_sync() |
485 | pm_runtime_put_sync() | ||
486 | pm_runtime_put_sync_suspend() | 486 | pm_runtime_put_sync_suspend() |
487 | 487 | ||
488 | 5. Runtime PM Initialization, Device Probing and Removal | 488 | 5. Runtime PM Initialization, Device Probing and Removal |
diff --git a/MAINTAINERS b/MAINTAINERS index 2c1bc6ea22ea..1f8267f1a2ab 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -2643,9 +2643,8 @@ S: Maintained | |||
2643 | F: arch/x86/math-emu/ | 2643 | F: arch/x86/math-emu/ |
2644 | 2644 | ||
2645 | FRAME RELAY DLCI/FRAD (Sangoma drivers too) | 2645 | FRAME RELAY DLCI/FRAD (Sangoma drivers too) |
2646 | M: Mike McLagan <mike.mclagan@linux.org> | ||
2647 | L: netdev@vger.kernel.org | 2646 | L: netdev@vger.kernel.org |
2648 | S: Maintained | 2647 | S: Orphan |
2649 | F: drivers/net/wan/dlci.c | 2648 | F: drivers/net/wan/dlci.c |
2650 | F: drivers/net/wan/sdla.c | 2649 | F: drivers/net/wan/sdla.c |
2651 | 2650 | ||
@@ -4415,10 +4414,10 @@ F: net/*/netfilter/ | |||
4415 | F: net/netfilter/ | 4414 | F: net/netfilter/ |
4416 | 4415 | ||
4417 | NETLABEL | 4416 | NETLABEL |
4418 | M: Paul Moore <paul.moore@hp.com> | 4417 | M: Paul Moore <paul@paul-moore.com> |
4419 | W: http://netlabel.sf.net | 4418 | W: http://netlabel.sf.net |
4420 | L: netdev@vger.kernel.org | 4419 | L: netdev@vger.kernel.org |
4421 | S: Supported | 4420 | S: Maintained |
4422 | F: Documentation/netlabel/ | 4421 | F: Documentation/netlabel/ |
4423 | F: include/net/netlabel.h | 4422 | F: include/net/netlabel.h |
4424 | F: net/netlabel/ | 4423 | F: net/netlabel/ |
@@ -4463,7 +4462,6 @@ F: include/linux/netdevice.h | |||
4463 | NETWORKING [IPv4/IPv6] | 4462 | NETWORKING [IPv4/IPv6] |
4464 | M: "David S. Miller" <davem@davemloft.net> | 4463 | M: "David S. Miller" <davem@davemloft.net> |
4465 | M: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> | 4464 | M: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> |
4466 | M: "Pekka Savola (ipv6)" <pekkas@netcore.fi> | ||
4467 | M: James Morris <jmorris@namei.org> | 4465 | M: James Morris <jmorris@namei.org> |
4468 | M: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org> | 4466 | M: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org> |
4469 | M: Patrick McHardy <kaber@trash.net> | 4467 | M: Patrick McHardy <kaber@trash.net> |
@@ -4476,7 +4474,7 @@ F: include/net/ip* | |||
4476 | F: arch/x86/net/* | 4474 | F: arch/x86/net/* |
4477 | 4475 | ||
4478 | NETWORKING [LABELED] (NetLabel, CIPSO, Labeled IPsec, SECMARK) | 4476 | NETWORKING [LABELED] (NetLabel, CIPSO, Labeled IPsec, SECMARK) |
4479 | M: Paul Moore <paul.moore@hp.com> | 4477 | M: Paul Moore <paul@paul-moore.com> |
4480 | L: netdev@vger.kernel.org | 4478 | L: netdev@vger.kernel.org |
4481 | S: Maintained | 4479 | S: Maintained |
4482 | 4480 | ||
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 0 | 2 | PATCHLEVEL = 1 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = | 4 | EXTRAVERSION = -rc1 |
5 | NAME = Sneaky Weasel | 5 | NAME = Sneaky Weasel |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index acca35aebe28..aeef960ff795 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
@@ -112,9 +112,6 @@ EXPORT_SYMBOL(__put_user_4); | |||
112 | EXPORT_SYMBOL(__put_user_8); | 112 | EXPORT_SYMBOL(__put_user_8); |
113 | #endif | 113 | #endif |
114 | 114 | ||
115 | /* crypto hash */ | ||
116 | EXPORT_SYMBOL(sha_transform); | ||
117 | |||
118 | /* gcc lib functions */ | 115 | /* gcc lib functions */ |
119 | EXPORT_SYMBOL(__ashldi3); | 116 | EXPORT_SYMBOL(__ashldi3); |
120 | EXPORT_SYMBOL(__ashrdi3); | 117 | EXPORT_SYMBOL(__ashrdi3); |
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index d7ee0d4c072d..1a347f481e5e 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -197,7 +197,7 @@ void cpu_idle(void) | |||
197 | cpu_relax(); | 197 | cpu_relax(); |
198 | } else { | 198 | } else { |
199 | stop_critical_timings(); | 199 | stop_critical_timings(); |
200 | if (cpuidle_call_idle()) | 200 | if (cpuidle_idle_call()) |
201 | pm_idle(); | 201 | pm_idle(); |
202 | start_critical_timings(); | 202 | start_critical_timings(); |
203 | /* | 203 | /* |
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 59ff42ddf0ae..cf73a7f742dd 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile | |||
@@ -12,7 +12,7 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \ | |||
12 | strchr.o strrchr.o \ | 12 | strchr.o strrchr.o \ |
13 | testchangebit.o testclearbit.o testsetbit.o \ | 13 | testchangebit.o testclearbit.o testsetbit.o \ |
14 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ | 14 | ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ |
15 | ucmpdi2.o lib1funcs.o div64.o sha1.o \ | 15 | ucmpdi2.o lib1funcs.o div64.o \ |
16 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o | 16 | io-readsb.o io-writesb.o io-readsl.o io-writesl.o |
17 | 17 | ||
18 | mmu-y := clear_user.o copy_page.o getuser.o putuser.o | 18 | mmu-y := clear_user.o copy_page.o getuser.o putuser.o |
diff --git a/arch/arm/lib/sha1.S b/arch/arm/lib/sha1.S deleted file mode 100644 index eb0edb80d7b8..000000000000 --- a/arch/arm/lib/sha1.S +++ /dev/null | |||
@@ -1,211 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/sha1.S | ||
3 | * | ||
4 | * SHA transform optimized for ARM | ||
5 | * | ||
6 | * Copyright: (C) 2005 by Nicolas Pitre <nico@fluxnic.net> | ||
7 | * Created: September 17, 2005 | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * The reference implementation for this code is linux/lib/sha1.c | ||
14 | */ | ||
15 | |||
16 | #include <linux/linkage.h> | ||
17 | |||
18 | .text | ||
19 | |||
20 | |||
21 | /* | ||
22 | * void sha_transform(__u32 *digest, const char *in, __u32 *W) | ||
23 | * | ||
24 | * Note: the "in" ptr may be unaligned. | ||
25 | */ | ||
26 | |||
27 | ENTRY(sha_transform) | ||
28 | |||
29 | stmfd sp!, {r4 - r8, lr} | ||
30 | |||
31 | @ for (i = 0; i < 16; i++) | ||
32 | @ W[i] = be32_to_cpu(in[i]); | ||
33 | |||
34 | #ifdef __ARMEB__ | ||
35 | mov r4, r0 | ||
36 | mov r0, r2 | ||
37 | mov r2, #64 | ||
38 | bl memcpy | ||
39 | mov r2, r0 | ||
40 | mov r0, r4 | ||
41 | #else | ||
42 | mov r3, r2 | ||
43 | mov lr, #16 | ||
44 | 1: ldrb r4, [r1], #1 | ||
45 | ldrb r5, [r1], #1 | ||
46 | ldrb r6, [r1], #1 | ||
47 | ldrb r7, [r1], #1 | ||
48 | subs lr, lr, #1 | ||
49 | orr r5, r5, r4, lsl #8 | ||
50 | orr r6, r6, r5, lsl #8 | ||
51 | orr r7, r7, r6, lsl #8 | ||
52 | str r7, [r3], #4 | ||
53 | bne 1b | ||
54 | #endif | ||
55 | |||
56 | @ for (i = 0; i < 64; i++) | ||
57 | @ W[i+16] = ror(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i], 31); | ||
58 | |||
59 | sub r3, r2, #4 | ||
60 | mov lr, #64 | ||
61 | 2: ldr r4, [r3, #4]! | ||
62 | subs lr, lr, #1 | ||
63 | ldr r5, [r3, #8] | ||
64 | ldr r6, [r3, #32] | ||
65 | ldr r7, [r3, #52] | ||
66 | eor r4, r4, r5 | ||
67 | eor r4, r4, r6 | ||
68 | eor r4, r4, r7 | ||
69 | mov r4, r4, ror #31 | ||
70 | str r4, [r3, #64] | ||
71 | bne 2b | ||
72 | |||
73 | /* | ||
74 | * The SHA functions are: | ||
75 | * | ||
76 | * f1(B,C,D) = (D ^ (B & (C ^ D))) | ||
77 | * f2(B,C,D) = (B ^ C ^ D) | ||
78 | * f3(B,C,D) = ((B & C) | (D & (B | C))) | ||
79 | * | ||
80 | * Then the sub-blocks are processed as follows: | ||
81 | * | ||
82 | * A' = ror(A, 27) + f(B,C,D) + E + K + *W++ | ||
83 | * B' = A | ||
84 | * C' = ror(B, 2) | ||
85 | * D' = C | ||
86 | * E' = D | ||
87 | * | ||
88 | * We therefore unroll each loop 5 times to avoid register shuffling. | ||
89 | * Also the ror for C (and also D and E which are successivelyderived | ||
90 | * from it) is applied in place to cut on an additional mov insn for | ||
91 | * each round. | ||
92 | */ | ||
93 | |||
94 | .macro sha_f1, A, B, C, D, E | ||
95 | ldr r3, [r2], #4 | ||
96 | eor ip, \C, \D | ||
97 | add \E, r1, \E, ror #2 | ||
98 | and ip, \B, ip, ror #2 | ||
99 | add \E, \E, \A, ror #27 | ||
100 | eor ip, ip, \D, ror #2 | ||
101 | add \E, \E, r3 | ||
102 | add \E, \E, ip | ||
103 | .endm | ||
104 | |||
105 | .macro sha_f2, A, B, C, D, E | ||
106 | ldr r3, [r2], #4 | ||
107 | add \E, r1, \E, ror #2 | ||
108 | eor ip, \B, \C, ror #2 | ||
109 | add \E, \E, \A, ror #27 | ||
110 | eor ip, ip, \D, ror #2 | ||
111 | add \E, \E, r3 | ||
112 | add \E, \E, ip | ||
113 | .endm | ||
114 | |||
115 | .macro sha_f3, A, B, C, D, E | ||
116 | ldr r3, [r2], #4 | ||
117 | add \E, r1, \E, ror #2 | ||
118 | orr ip, \B, \C, ror #2 | ||
119 | add \E, \E, \A, ror #27 | ||
120 | and ip, ip, \D, ror #2 | ||
121 | add \E, \E, r3 | ||
122 | and r3, \B, \C, ror #2 | ||
123 | orr ip, ip, r3 | ||
124 | add \E, \E, ip | ||
125 | .endm | ||
126 | |||
127 | ldmia r0, {r4 - r8} | ||
128 | |||
129 | mov lr, #4 | ||
130 | ldr r1, .L_sha_K + 0 | ||
131 | |||
132 | /* adjust initial values */ | ||
133 | mov r6, r6, ror #30 | ||
134 | mov r7, r7, ror #30 | ||
135 | mov r8, r8, ror #30 | ||
136 | |||
137 | 3: subs lr, lr, #1 | ||
138 | sha_f1 r4, r5, r6, r7, r8 | ||
139 | sha_f1 r8, r4, r5, r6, r7 | ||
140 | sha_f1 r7, r8, r4, r5, r6 | ||
141 | sha_f1 r6, r7, r8, r4, r5 | ||
142 | sha_f1 r5, r6, r7, r8, r4 | ||
143 | bne 3b | ||
144 | |||
145 | ldr r1, .L_sha_K + 4 | ||
146 | mov lr, #4 | ||
147 | |||
148 | 4: subs lr, lr, #1 | ||
149 | sha_f2 r4, r5, r6, r7, r8 | ||
150 | sha_f2 r8, r4, r5, r6, r7 | ||
151 | sha_f2 r7, r8, r4, r5, r6 | ||
152 | sha_f2 r6, r7, r8, r4, r5 | ||
153 | sha_f2 r5, r6, r7, r8, r4 | ||
154 | bne 4b | ||
155 | |||
156 | ldr r1, .L_sha_K + 8 | ||
157 | mov lr, #4 | ||
158 | |||
159 | 5: subs lr, lr, #1 | ||
160 | sha_f3 r4, r5, r6, r7, r8 | ||
161 | sha_f3 r8, r4, r5, r6, r7 | ||
162 | sha_f3 r7, r8, r4, r5, r6 | ||
163 | sha_f3 r6, r7, r8, r4, r5 | ||
164 | sha_f3 r5, r6, r7, r8, r4 | ||
165 | bne 5b | ||
166 | |||
167 | ldr r1, .L_sha_K + 12 | ||
168 | mov lr, #4 | ||
169 | |||
170 | 6: subs lr, lr, #1 | ||
171 | sha_f2 r4, r5, r6, r7, r8 | ||
172 | sha_f2 r8, r4, r5, r6, r7 | ||
173 | sha_f2 r7, r8, r4, r5, r6 | ||
174 | sha_f2 r6, r7, r8, r4, r5 | ||
175 | sha_f2 r5, r6, r7, r8, r4 | ||
176 | bne 6b | ||
177 | |||
178 | ldmia r0, {r1, r2, r3, ip, lr} | ||
179 | add r4, r1, r4 | ||
180 | add r5, r2, r5 | ||
181 | add r6, r3, r6, ror #2 | ||
182 | add r7, ip, r7, ror #2 | ||
183 | add r8, lr, r8, ror #2 | ||
184 | stmia r0, {r4 - r8} | ||
185 | |||
186 | ldmfd sp!, {r4 - r8, pc} | ||
187 | |||
188 | ENDPROC(sha_transform) | ||
189 | |||
190 | .align 2 | ||
191 | .L_sha_K: | ||
192 | .word 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6 | ||
193 | |||
194 | |||
195 | /* | ||
196 | * void sha_init(__u32 *buf) | ||
197 | */ | ||
198 | |||
199 | .align 2 | ||
200 | .L_sha_initial_digest: | ||
201 | .word 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 | ||
202 | |||
203 | ENTRY(sha_init) | ||
204 | |||
205 | str lr, [sp, #-4]! | ||
206 | adr r1, .L_sha_initial_digest | ||
207 | ldmia r1, {r1, r2, r3, ip, lr} | ||
208 | stmia r0, {r1, r2, r3, ip, lr} | ||
209 | ldr pc, [sp], #4 | ||
210 | |||
211 | ENDPROC(sha_init) | ||
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index 9026249233ad..af0c2fe1ea37 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c | |||
@@ -65,7 +65,7 @@ | |||
65 | #include <plat/iic.h> | 65 | #include <plat/iic.h> |
66 | #include <plat/pm.h> | 66 | #include <plat/pm.h> |
67 | 67 | ||
68 | #include <sound/wm8915.h> | 68 | #include <sound/wm8996.h> |
69 | #include <sound/wm8962.h> | 69 | #include <sound/wm8962.h> |
70 | #include <sound/wm9081.h> | 70 | #include <sound/wm9081.h> |
71 | 71 | ||
@@ -614,7 +614,7 @@ static struct wm831x_pdata glenfarclas_pmic_pdata __initdata = { | |||
614 | .disable_touch = true, | 614 | .disable_touch = true, |
615 | }; | 615 | }; |
616 | 616 | ||
617 | static struct wm8915_retune_mobile_config wm8915_retune[] = { | 617 | static struct wm8996_retune_mobile_config wm8996_retune[] = { |
618 | { | 618 | { |
619 | .name = "Sub LPF", | 619 | .name = "Sub LPF", |
620 | .rate = 48000, | 620 | .rate = 48000, |
@@ -635,12 +635,12 @@ static struct wm8915_retune_mobile_config wm8915_retune[] = { | |||
635 | }, | 635 | }, |
636 | }; | 636 | }; |
637 | 637 | ||
638 | static struct wm8915_pdata wm8915_pdata __initdata = { | 638 | static struct wm8996_pdata wm8996_pdata __initdata = { |
639 | .ldo_ena = S3C64XX_GPN(7), | 639 | .ldo_ena = S3C64XX_GPN(7), |
640 | .gpio_base = CODEC_GPIO_BASE, | 640 | .gpio_base = CODEC_GPIO_BASE, |
641 | .micdet_def = 1, | 641 | .micdet_def = 1, |
642 | .inl_mode = WM8915_DIFFERRENTIAL_1, | 642 | .inl_mode = WM8996_DIFFERRENTIAL_1, |
643 | .inr_mode = WM8915_DIFFERRENTIAL_1, | 643 | .inr_mode = WM8996_DIFFERRENTIAL_1, |
644 | 644 | ||
645 | .irq_flags = IRQF_TRIGGER_RISING, | 645 | .irq_flags = IRQF_TRIGGER_RISING, |
646 | 646 | ||
@@ -652,8 +652,8 @@ static struct wm8915_pdata wm8915_pdata __initdata = { | |||
652 | 0x020e, /* GPIO5 == CLKOUT */ | 652 | 0x020e, /* GPIO5 == CLKOUT */ |
653 | }, | 653 | }, |
654 | 654 | ||
655 | .retune_mobile_cfgs = wm8915_retune, | 655 | .retune_mobile_cfgs = wm8996_retune, |
656 | .num_retune_mobile_cfgs = ARRAY_SIZE(wm8915_retune), | 656 | .num_retune_mobile_cfgs = ARRAY_SIZE(wm8996_retune), |
657 | }; | 657 | }; |
658 | 658 | ||
659 | static struct wm8962_pdata wm8962_pdata __initdata = { | 659 | static struct wm8962_pdata wm8962_pdata __initdata = { |
@@ -679,8 +679,8 @@ static struct i2c_board_info i2c_devs1[] __initdata = { | |||
679 | .platform_data = &glenfarclas_pmic_pdata }, | 679 | .platform_data = &glenfarclas_pmic_pdata }, |
680 | 680 | ||
681 | { I2C_BOARD_INFO("wm1250-ev1", 0x27) }, | 681 | { I2C_BOARD_INFO("wm1250-ev1", 0x27) }, |
682 | { I2C_BOARD_INFO("wm8915", 0x1a), | 682 | { I2C_BOARD_INFO("wm8996", 0x1a), |
683 | .platform_data = &wm8915_pdata, | 683 | .platform_data = &wm8996_pdata, |
684 | .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2, | 684 | .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2, |
685 | }, | 685 | }, |
686 | { I2C_BOARD_INFO("wm9081", 0x6c), | 686 | { I2C_BOARD_INFO("wm9081", 0x6c), |
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index 6fc03aff046c..c38d22e5e902 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c | |||
@@ -156,7 +156,7 @@ prefix##_get_next_variable (unsigned long *name_size, efi_char16_t *name, \ | |||
156 | #define STUB_SET_VARIABLE(prefix, adjust_arg) \ | 156 | #define STUB_SET_VARIABLE(prefix, adjust_arg) \ |
157 | static efi_status_t \ | 157 | static efi_status_t \ |
158 | prefix##_set_variable (efi_char16_t *name, efi_guid_t *vendor, \ | 158 | prefix##_set_variable (efi_char16_t *name, efi_guid_t *vendor, \ |
159 | unsigned long attr, unsigned long data_size, \ | 159 | u32 attr, unsigned long data_size, \ |
160 | void *data) \ | 160 | void *data) \ |
161 | { \ | 161 | { \ |
162 | struct ia64_fpreg fr[6]; \ | 162 | struct ia64_fpreg fr[6]; \ |
diff --git a/arch/sh/kernel/idle.c b/arch/sh/kernel/idle.c index 3c45de1db716..32114e0941ae 100644 --- a/arch/sh/kernel/idle.c +++ b/arch/sh/kernel/idle.c | |||
@@ -101,7 +101,7 @@ void cpu_idle(void) | |||
101 | local_irq_disable(); | 101 | local_irq_disable(); |
102 | /* Don't trace irqs off for idle */ | 102 | /* Don't trace irqs off for idle */ |
103 | stop_critical_timings(); | 103 | stop_critical_timings(); |
104 | if (cpuidle_call_idle()) | 104 | if (cpuidle_idle_call()) |
105 | pm_idle(); | 105 | pm_idle(); |
106 | /* | 106 | /* |
107 | * Sanity check to ensure that pm_idle() returns | 107 | * Sanity check to ensure that pm_idle() returns |
diff --git a/arch/sparc/include/asm/Kbuild b/arch/sparc/include/asm/Kbuild index 3c93f08ce187..2c2e38821f60 100644 --- a/arch/sparc/include/asm/Kbuild +++ b/arch/sparc/include/asm/Kbuild | |||
@@ -16,3 +16,8 @@ header-y += traps.h | |||
16 | header-y += uctx.h | 16 | header-y += uctx.h |
17 | header-y += utrap.h | 17 | header-y += utrap.h |
18 | header-y += watchdog.h | 18 | header-y += watchdog.h |
19 | |||
20 | generic-y += div64.h | ||
21 | generic-y += local64.h | ||
22 | generic-y += irq_regs.h | ||
23 | generic-y += local.h | ||
diff --git a/arch/sparc/include/asm/bitops_64.h b/arch/sparc/include/asm/bitops_64.h index 325e295d60de..29011cc0e4be 100644 --- a/arch/sparc/include/asm/bitops_64.h +++ b/arch/sparc/include/asm/bitops_64.h | |||
@@ -26,61 +26,28 @@ extern void change_bit(unsigned long nr, volatile unsigned long *addr); | |||
26 | #define smp_mb__before_clear_bit() barrier() | 26 | #define smp_mb__before_clear_bit() barrier() |
27 | #define smp_mb__after_clear_bit() barrier() | 27 | #define smp_mb__after_clear_bit() barrier() |
28 | 28 | ||
29 | #include <asm-generic/bitops/ffz.h> | ||
30 | #include <asm-generic/bitops/__ffs.h> | ||
31 | #include <asm-generic/bitops/fls.h> | 29 | #include <asm-generic/bitops/fls.h> |
32 | #include <asm-generic/bitops/__fls.h> | 30 | #include <asm-generic/bitops/__fls.h> |
33 | #include <asm-generic/bitops/fls64.h> | 31 | #include <asm-generic/bitops/fls64.h> |
34 | 32 | ||
35 | #ifdef __KERNEL__ | 33 | #ifdef __KERNEL__ |
36 | 34 | ||
35 | extern int ffs(int x); | ||
36 | extern unsigned long __ffs(unsigned long); | ||
37 | |||
38 | #include <asm-generic/bitops/ffz.h> | ||
37 | #include <asm-generic/bitops/sched.h> | 39 | #include <asm-generic/bitops/sched.h> |
38 | #include <asm-generic/bitops/ffs.h> | ||
39 | 40 | ||
40 | /* | 41 | /* |
41 | * hweightN: returns the hamming weight (i.e. the number | 42 | * hweightN: returns the hamming weight (i.e. the number |
42 | * of bits set) of a N-bit word | 43 | * of bits set) of a N-bit word |
43 | */ | 44 | */ |
44 | 45 | ||
45 | #ifdef ULTRA_HAS_POPULATION_COUNT | 46 | extern unsigned long __arch_hweight64(__u64 w); |
46 | 47 | extern unsigned int __arch_hweight32(unsigned int w); | |
47 | static inline unsigned int __arch_hweight64(unsigned long w) | 48 | extern unsigned int __arch_hweight16(unsigned int w); |
48 | { | 49 | extern unsigned int __arch_hweight8(unsigned int w); |
49 | unsigned int res; | ||
50 | |||
51 | __asm__ ("popc %1,%0" : "=r" (res) : "r" (w)); | ||
52 | return res; | ||
53 | } | ||
54 | |||
55 | static inline unsigned int __arch_hweight32(unsigned int w) | ||
56 | { | ||
57 | unsigned int res; | ||
58 | |||
59 | __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xffffffff)); | ||
60 | return res; | ||
61 | } | ||
62 | 50 | ||
63 | static inline unsigned int __arch_hweight16(unsigned int w) | ||
64 | { | ||
65 | unsigned int res; | ||
66 | |||
67 | __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xffff)); | ||
68 | return res; | ||
69 | } | ||
70 | |||
71 | static inline unsigned int __arch_hweight8(unsigned int w) | ||
72 | { | ||
73 | unsigned int res; | ||
74 | |||
75 | __asm__ ("popc %1,%0" : "=r" (res) : "r" (w & 0xff)); | ||
76 | return res; | ||
77 | } | ||
78 | |||
79 | #else | ||
80 | |||
81 | #include <asm-generic/bitops/arch_hweight.h> | ||
82 | |||
83 | #endif | ||
84 | #include <asm-generic/bitops/const_hweight.h> | 51 | #include <asm-generic/bitops/const_hweight.h> |
85 | #include <asm-generic/bitops/lock.h> | 52 | #include <asm-generic/bitops/lock.h> |
86 | #endif /* __KERNEL__ */ | 53 | #endif /* __KERNEL__ */ |
diff --git a/arch/sparc/include/asm/div64.h b/arch/sparc/include/asm/div64.h deleted file mode 100644 index 6cd978cefb28..000000000000 --- a/arch/sparc/include/asm/div64.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #include <asm-generic/div64.h> | ||
diff --git a/arch/sparc/include/asm/elf_64.h b/arch/sparc/include/asm/elf_64.h index 64f7a00b3747..7df8b7f544d4 100644 --- a/arch/sparc/include/asm/elf_64.h +++ b/arch/sparc/include/asm/elf_64.h | |||
@@ -59,15 +59,33 @@ | |||
59 | #define R_SPARC_6 45 | 59 | #define R_SPARC_6 45 |
60 | 60 | ||
61 | /* Bits present in AT_HWCAP, primarily for Sparc32. */ | 61 | /* Bits present in AT_HWCAP, primarily for Sparc32. */ |
62 | 62 | #define HWCAP_SPARC_FLUSH 0x00000001 | |
63 | #define HWCAP_SPARC_FLUSH 1 /* CPU supports flush instruction. */ | 63 | #define HWCAP_SPARC_STBAR 0x00000002 |
64 | #define HWCAP_SPARC_STBAR 2 | 64 | #define HWCAP_SPARC_SWAP 0x00000004 |
65 | #define HWCAP_SPARC_SWAP 4 | 65 | #define HWCAP_SPARC_MULDIV 0x00000008 |
66 | #define HWCAP_SPARC_MULDIV 8 | 66 | #define HWCAP_SPARC_V9 0x00000010 |
67 | #define HWCAP_SPARC_V9 16 | 67 | #define HWCAP_SPARC_ULTRA3 0x00000020 |
68 | #define HWCAP_SPARC_ULTRA3 32 | 68 | #define HWCAP_SPARC_BLKINIT 0x00000040 |
69 | #define HWCAP_SPARC_BLKINIT 64 | 69 | #define HWCAP_SPARC_N2 0x00000080 |
70 | #define HWCAP_SPARC_N2 128 | 70 | |
71 | /* Solaris compatible AT_HWCAP bits. */ | ||
72 | #define AV_SPARC_MUL32 0x00000100 /* 32x32 multiply is efficient */ | ||
73 | #define AV_SPARC_DIV32 0x00000200 /* 32x32 divide is efficient */ | ||
74 | #define AV_SPARC_FSMULD 0x00000400 /* 'fsmuld' is efficient */ | ||
75 | #define AV_SPARC_V8PLUS 0x00000800 /* v9 insn available to 32bit */ | ||
76 | #define AV_SPARC_POPC 0x00001000 /* 'popc' is efficient */ | ||
77 | #define AV_SPARC_VIS 0x00002000 /* VIS insns available */ | ||
78 | #define AV_SPARC_VIS2 0x00004000 /* VIS2 insns available */ | ||
79 | #define AV_SPARC_ASI_BLK_INIT 0x00008000 /* block init ASIs available */ | ||
80 | #define AV_SPARC_FMAF 0x00010000 /* fused multiply-add */ | ||
81 | #define AV_SPARC_VIS3 0x00020000 /* VIS3 insns available */ | ||
82 | #define AV_SPARC_HPC 0x00040000 /* HPC insns available */ | ||
83 | #define AV_SPARC_RANDOM 0x00080000 /* 'random' insn available */ | ||
84 | #define AV_SPARC_TRANS 0x00100000 /* transaction insns available */ | ||
85 | #define AV_SPARC_FJFMAU 0x00200000 /* unfused multiply-add */ | ||
86 | #define AV_SPARC_IMA 0x00400000 /* integer multiply-add */ | ||
87 | #define AV_SPARC_ASI_CACHE_SPARING \ | ||
88 | 0x00800000 /* cache sparing ASIs available */ | ||
71 | 89 | ||
72 | #define CORE_DUMP_USE_REGSET | 90 | #define CORE_DUMP_USE_REGSET |
73 | 91 | ||
@@ -162,33 +180,8 @@ typedef struct { | |||
162 | #define ELF_ET_DYN_BASE 0x0000010000000000UL | 180 | #define ELF_ET_DYN_BASE 0x0000010000000000UL |
163 | #define COMPAT_ELF_ET_DYN_BASE 0x0000000070000000UL | 181 | #define COMPAT_ELF_ET_DYN_BASE 0x0000000070000000UL |
164 | 182 | ||
165 | 183 | extern unsigned long sparc64_elf_hwcap; | |
166 | /* This yields a mask that user programs can use to figure out what | 184 | #define ELF_HWCAP sparc64_elf_hwcap |
167 | instruction set this cpu supports. */ | ||
168 | |||
169 | /* On Ultra, we support all of the v8 capabilities. */ | ||
170 | static inline unsigned int sparc64_elf_hwcap(void) | ||
171 | { | ||
172 | unsigned int cap = (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | | ||
173 | HWCAP_SPARC_SWAP | HWCAP_SPARC_MULDIV | | ||
174 | HWCAP_SPARC_V9); | ||
175 | |||
176 | if (tlb_type == cheetah || tlb_type == cheetah_plus) | ||
177 | cap |= HWCAP_SPARC_ULTRA3; | ||
178 | else if (tlb_type == hypervisor) { | ||
179 | if (sun4v_chip_type == SUN4V_CHIP_NIAGARA1 || | ||
180 | sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || | ||
181 | sun4v_chip_type == SUN4V_CHIP_NIAGARA3) | ||
182 | cap |= HWCAP_SPARC_BLKINIT; | ||
183 | if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || | ||
184 | sun4v_chip_type == SUN4V_CHIP_NIAGARA3) | ||
185 | cap |= HWCAP_SPARC_N2; | ||
186 | } | ||
187 | |||
188 | return cap; | ||
189 | } | ||
190 | |||
191 | #define ELF_HWCAP sparc64_elf_hwcap() | ||
192 | 185 | ||
193 | /* This yields a string that ld.so will use to load implementation | 186 | /* This yields a string that ld.so will use to load implementation |
194 | specific libraries for optimization. This is more specific in | 187 | specific libraries for optimization. This is more specific in |
diff --git a/arch/sparc/include/asm/hypervisor.h b/arch/sparc/include/asm/hypervisor.h index 7a5f80df15d0..015a761eaa32 100644 --- a/arch/sparc/include/asm/hypervisor.h +++ b/arch/sparc/include/asm/hypervisor.h | |||
@@ -2927,6 +2927,13 @@ extern unsigned long sun4v_ncs_request(unsigned long request, | |||
2927 | #define HV_FAST_FIRE_GET_PERFREG 0x120 | 2927 | #define HV_FAST_FIRE_GET_PERFREG 0x120 |
2928 | #define HV_FAST_FIRE_SET_PERFREG 0x121 | 2928 | #define HV_FAST_FIRE_SET_PERFREG 0x121 |
2929 | 2929 | ||
2930 | #define HV_FAST_REBOOT_DATA_SET 0x172 | ||
2931 | |||
2932 | #ifndef __ASSEMBLY__ | ||
2933 | extern unsigned long sun4v_reboot_data_set(unsigned long ra, | ||
2934 | unsigned long len); | ||
2935 | #endif | ||
2936 | |||
2930 | /* Function numbers for HV_CORE_TRAP. */ | 2937 | /* Function numbers for HV_CORE_TRAP. */ |
2931 | #define HV_CORE_SET_VER 0x00 | 2938 | #define HV_CORE_SET_VER 0x00 |
2932 | #define HV_CORE_PUTCHAR 0x01 | 2939 | #define HV_CORE_PUTCHAR 0x01 |
@@ -2940,11 +2947,17 @@ extern unsigned long sun4v_ncs_request(unsigned long request, | |||
2940 | #define HV_GRP_CORE 0x0001 | 2947 | #define HV_GRP_CORE 0x0001 |
2941 | #define HV_GRP_INTR 0x0002 | 2948 | #define HV_GRP_INTR 0x0002 |
2942 | #define HV_GRP_SOFT_STATE 0x0003 | 2949 | #define HV_GRP_SOFT_STATE 0x0003 |
2950 | #define HV_GRP_TM 0x0080 | ||
2943 | #define HV_GRP_PCI 0x0100 | 2951 | #define HV_GRP_PCI 0x0100 |
2944 | #define HV_GRP_LDOM 0x0101 | 2952 | #define HV_GRP_LDOM 0x0101 |
2945 | #define HV_GRP_SVC_CHAN 0x0102 | 2953 | #define HV_GRP_SVC_CHAN 0x0102 |
2946 | #define HV_GRP_NCS 0x0103 | 2954 | #define HV_GRP_NCS 0x0103 |
2947 | #define HV_GRP_RNG 0x0104 | 2955 | #define HV_GRP_RNG 0x0104 |
2956 | #define HV_GRP_PBOOT 0x0105 | ||
2957 | #define HV_GRP_TPM 0x0107 | ||
2958 | #define HV_GRP_SDIO 0x0108 | ||
2959 | #define HV_GRP_SDIO_ERR 0x0109 | ||
2960 | #define HV_GRP_REBOOT_DATA 0x0110 | ||
2948 | #define HV_GRP_NIAG_PERF 0x0200 | 2961 | #define HV_GRP_NIAG_PERF 0x0200 |
2949 | #define HV_GRP_FIRE_PERF 0x0201 | 2962 | #define HV_GRP_FIRE_PERF 0x0201 |
2950 | #define HV_GRP_N2_CPU 0x0202 | 2963 | #define HV_GRP_N2_CPU 0x0202 |
diff --git a/arch/sparc/include/asm/irq_regs.h b/arch/sparc/include/asm/irq_regs.h deleted file mode 100644 index 3dd9c0b70270..000000000000 --- a/arch/sparc/include/asm/irq_regs.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #include <asm-generic/irq_regs.h> | ||
diff --git a/arch/sparc/include/asm/local.h b/arch/sparc/include/asm/local.h deleted file mode 100644 index bc80815a435c..000000000000 --- a/arch/sparc/include/asm/local.h +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | #ifndef _SPARC_LOCAL_H | ||
2 | #define _SPARC_LOCAL_H | ||
3 | |||
4 | #include <asm-generic/local.h> | ||
5 | |||
6 | #endif | ||
diff --git a/arch/sparc/include/asm/local64.h b/arch/sparc/include/asm/local64.h deleted file mode 100644 index 36c93b5cc239..000000000000 --- a/arch/sparc/include/asm/local64.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | #include <asm-generic/local64.h> | ||
diff --git a/arch/sparc/include/asm/tsb.h b/arch/sparc/include/asm/tsb.h index 83c571d8c8a7..1a8afd1ad04f 100644 --- a/arch/sparc/include/asm/tsb.h +++ b/arch/sparc/include/asm/tsb.h | |||
@@ -133,29 +133,6 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | |||
133 | sub TSB, 0x8, TSB; \ | 133 | sub TSB, 0x8, TSB; \ |
134 | TSB_STORE(TSB, TAG); | 134 | TSB_STORE(TSB, TAG); |
135 | 135 | ||
136 | #define KTSB_LOAD_QUAD(TSB, REG) \ | ||
137 | ldda [TSB] ASI_NUCLEUS_QUAD_LDD, REG; | ||
138 | |||
139 | #define KTSB_STORE(ADDR, VAL) \ | ||
140 | stxa VAL, [ADDR] ASI_N; | ||
141 | |||
142 | #define KTSB_LOCK_TAG(TSB, REG1, REG2) \ | ||
143 | 99: lduwa [TSB] ASI_N, REG1; \ | ||
144 | sethi %hi(TSB_TAG_LOCK_HIGH), REG2;\ | ||
145 | andcc REG1, REG2, %g0; \ | ||
146 | bne,pn %icc, 99b; \ | ||
147 | nop; \ | ||
148 | casa [TSB] ASI_N, REG1, REG2;\ | ||
149 | cmp REG1, REG2; \ | ||
150 | bne,pn %icc, 99b; \ | ||
151 | nop; \ | ||
152 | |||
153 | #define KTSB_WRITE(TSB, TTE, TAG) \ | ||
154 | add TSB, 0x8, TSB; \ | ||
155 | stxa TTE, [TSB] ASI_N; \ | ||
156 | sub TSB, 0x8, TSB; \ | ||
157 | stxa TAG, [TSB] ASI_N; | ||
158 | |||
159 | /* Do a kernel page table walk. Leaves physical PTE pointer in | 136 | /* Do a kernel page table walk. Leaves physical PTE pointer in |
160 | * REG1. Jumps to FAIL_LABEL on early page table walk termination. | 137 | * REG1. Jumps to FAIL_LABEL on early page table walk termination. |
161 | * VADDR will not be clobbered, but REG2 will. | 138 | * VADDR will not be clobbered, but REG2 will. |
@@ -239,6 +216,8 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | |||
239 | (KERNEL_TSB_SIZE_BYTES / 16) | 216 | (KERNEL_TSB_SIZE_BYTES / 16) |
240 | #define KERNEL_TSB4M_NENTRIES 4096 | 217 | #define KERNEL_TSB4M_NENTRIES 4096 |
241 | 218 | ||
219 | #define KTSB_PHYS_SHIFT 15 | ||
220 | |||
242 | /* Do a kernel TSB lookup at tl>0 on VADDR+TAG, branch to OK_LABEL | 221 | /* Do a kernel TSB lookup at tl>0 on VADDR+TAG, branch to OK_LABEL |
243 | * on TSB hit. REG1, REG2, REG3, and REG4 are used as temporaries | 222 | * on TSB hit. REG1, REG2, REG3, and REG4 are used as temporaries |
244 | * and the found TTE will be left in REG1. REG3 and REG4 must | 223 | * and the found TTE will be left in REG1. REG3 and REG4 must |
@@ -247,13 +226,22 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | |||
247 | * VADDR and TAG will be preserved and not clobbered by this macro. | 226 | * VADDR and TAG will be preserved and not clobbered by this macro. |
248 | */ | 227 | */ |
249 | #define KERN_TSB_LOOKUP_TL1(VADDR, TAG, REG1, REG2, REG3, REG4, OK_LABEL) \ | 228 | #define KERN_TSB_LOOKUP_TL1(VADDR, TAG, REG1, REG2, REG3, REG4, OK_LABEL) \ |
250 | sethi %hi(swapper_tsb), REG1; \ | 229 | 661: sethi %hi(swapper_tsb), REG1; \ |
251 | or REG1, %lo(swapper_tsb), REG1; \ | 230 | or REG1, %lo(swapper_tsb), REG1; \ |
231 | .section .swapper_tsb_phys_patch, "ax"; \ | ||
232 | .word 661b; \ | ||
233 | .previous; \ | ||
234 | 661: nop; \ | ||
235 | .section .tsb_ldquad_phys_patch, "ax"; \ | ||
236 | .word 661b; \ | ||
237 | sllx REG1, KTSB_PHYS_SHIFT, REG1; \ | ||
238 | sllx REG1, KTSB_PHYS_SHIFT, REG1; \ | ||
239 | .previous; \ | ||
252 | srlx VADDR, PAGE_SHIFT, REG2; \ | 240 | srlx VADDR, PAGE_SHIFT, REG2; \ |
253 | and REG2, (KERNEL_TSB_NENTRIES - 1), REG2; \ | 241 | and REG2, (KERNEL_TSB_NENTRIES - 1), REG2; \ |
254 | sllx REG2, 4, REG2; \ | 242 | sllx REG2, 4, REG2; \ |
255 | add REG1, REG2, REG2; \ | 243 | add REG1, REG2, REG2; \ |
256 | KTSB_LOAD_QUAD(REG2, REG3); \ | 244 | TSB_LOAD_QUAD(REG2, REG3); \ |
257 | cmp REG3, TAG; \ | 245 | cmp REG3, TAG; \ |
258 | be,a,pt %xcc, OK_LABEL; \ | 246 | be,a,pt %xcc, OK_LABEL; \ |
259 | mov REG4, REG1; | 247 | mov REG4, REG1; |
@@ -263,12 +251,21 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | |||
263 | * we can make use of that for the index computation. | 251 | * we can make use of that for the index computation. |
264 | */ | 252 | */ |
265 | #define KERN_TSB4M_LOOKUP_TL1(TAG, REG1, REG2, REG3, REG4, OK_LABEL) \ | 253 | #define KERN_TSB4M_LOOKUP_TL1(TAG, REG1, REG2, REG3, REG4, OK_LABEL) \ |
266 | sethi %hi(swapper_4m_tsb), REG1; \ | 254 | 661: sethi %hi(swapper_4m_tsb), REG1; \ |
267 | or REG1, %lo(swapper_4m_tsb), REG1; \ | 255 | or REG1, %lo(swapper_4m_tsb), REG1; \ |
256 | .section .swapper_4m_tsb_phys_patch, "ax"; \ | ||
257 | .word 661b; \ | ||
258 | .previous; \ | ||
259 | 661: nop; \ | ||
260 | .section .tsb_ldquad_phys_patch, "ax"; \ | ||
261 | .word 661b; \ | ||
262 | sllx REG1, KTSB_PHYS_SHIFT, REG1; \ | ||
263 | sllx REG1, KTSB_PHYS_SHIFT, REG1; \ | ||
264 | .previous; \ | ||
268 | and TAG, (KERNEL_TSB4M_NENTRIES - 1), REG2; \ | 265 | and TAG, (KERNEL_TSB4M_NENTRIES - 1), REG2; \ |
269 | sllx REG2, 4, REG2; \ | 266 | sllx REG2, 4, REG2; \ |
270 | add REG1, REG2, REG2; \ | 267 | add REG1, REG2, REG2; \ |
271 | KTSB_LOAD_QUAD(REG2, REG3); \ | 268 | TSB_LOAD_QUAD(REG2, REG3); \ |
272 | cmp REG3, TAG; \ | 269 | cmp REG3, TAG; \ |
273 | be,a,pt %xcc, OK_LABEL; \ | 270 | be,a,pt %xcc, OK_LABEL; \ |
274 | mov REG4, REG1; | 271 | mov REG4, REG1; |
diff --git a/arch/sparc/kernel/cpu.c b/arch/sparc/kernel/cpu.c index 17cf290dc2bc..9810fd881058 100644 --- a/arch/sparc/kernel/cpu.c +++ b/arch/sparc/kernel/cpu.c | |||
@@ -396,6 +396,7 @@ static int show_cpuinfo(struct seq_file *m, void *__unused) | |||
396 | , cpu_data(0).clock_tick | 396 | , cpu_data(0).clock_tick |
397 | #endif | 397 | #endif |
398 | ); | 398 | ); |
399 | cpucap_info(m); | ||
399 | #ifdef CONFIG_SMP | 400 | #ifdef CONFIG_SMP |
400 | smp_bogo(m); | 401 | smp_bogo(m); |
401 | #endif | 402 | #endif |
diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c index dd1342c0a3be..490e5418740d 100644 --- a/arch/sparc/kernel/ds.c +++ b/arch/sparc/kernel/ds.c | |||
@@ -15,12 +15,15 @@ | |||
15 | #include <linux/reboot.h> | 15 | #include <linux/reboot.h> |
16 | #include <linux/cpu.h> | 16 | #include <linux/cpu.h> |
17 | 17 | ||
18 | #include <asm/hypervisor.h> | ||
18 | #include <asm/ldc.h> | 19 | #include <asm/ldc.h> |
19 | #include <asm/vio.h> | 20 | #include <asm/vio.h> |
20 | #include <asm/mdesc.h> | 21 | #include <asm/mdesc.h> |
21 | #include <asm/head.h> | 22 | #include <asm/head.h> |
22 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
23 | 24 | ||
25 | #include "kernel.h" | ||
26 | |||
24 | #define DRV_MODULE_NAME "ds" | 27 | #define DRV_MODULE_NAME "ds" |
25 | #define PFX DRV_MODULE_NAME ": " | 28 | #define PFX DRV_MODULE_NAME ": " |
26 | #define DRV_MODULE_VERSION "1.0" | 29 | #define DRV_MODULE_VERSION "1.0" |
@@ -828,18 +831,32 @@ void ldom_set_var(const char *var, const char *value) | |||
828 | } | 831 | } |
829 | } | 832 | } |
830 | 833 | ||
834 | static char full_boot_str[256] __attribute__((aligned(32))); | ||
835 | static int reboot_data_supported; | ||
836 | |||
831 | void ldom_reboot(const char *boot_command) | 837 | void ldom_reboot(const char *boot_command) |
832 | { | 838 | { |
833 | /* Don't bother with any of this if the boot_command | 839 | /* Don't bother with any of this if the boot_command |
834 | * is empty. | 840 | * is empty. |
835 | */ | 841 | */ |
836 | if (boot_command && strlen(boot_command)) { | 842 | if (boot_command && strlen(boot_command)) { |
837 | char full_boot_str[256]; | 843 | unsigned long len; |
838 | 844 | ||
839 | strcpy(full_boot_str, "boot "); | 845 | strcpy(full_boot_str, "boot "); |
840 | strcpy(full_boot_str + strlen("boot "), boot_command); | 846 | strcpy(full_boot_str + strlen("boot "), boot_command); |
847 | len = strlen(full_boot_str); | ||
841 | 848 | ||
842 | ldom_set_var("reboot-command", full_boot_str); | 849 | if (reboot_data_supported) { |
850 | unsigned long ra = kimage_addr_to_ra(full_boot_str); | ||
851 | unsigned long hv_ret; | ||
852 | |||
853 | hv_ret = sun4v_reboot_data_set(ra, len); | ||
854 | if (hv_ret != HV_EOK) | ||
855 | pr_err("SUN4V: Unable to set reboot data " | ||
856 | "hv_ret=%lu\n", hv_ret); | ||
857 | } else { | ||
858 | ldom_set_var("reboot-command", full_boot_str); | ||
859 | } | ||
843 | } | 860 | } |
844 | sun4v_mach_sir(); | 861 | sun4v_mach_sir(); |
845 | } | 862 | } |
@@ -1237,6 +1254,15 @@ static struct vio_driver ds_driver = { | |||
1237 | 1254 | ||
1238 | static int __init ds_init(void) | 1255 | static int __init ds_init(void) |
1239 | { | 1256 | { |
1257 | unsigned long hv_ret, major, minor; | ||
1258 | |||
1259 | hv_ret = sun4v_get_version(HV_GRP_REBOOT_DATA, &major, &minor); | ||
1260 | if (hv_ret == HV_EOK) { | ||
1261 | pr_info("SUN4V: Reboot data supported (maj=%lu,min=%lu).\n", | ||
1262 | major, minor); | ||
1263 | reboot_data_supported = 1; | ||
1264 | } | ||
1265 | |||
1240 | kthread_run(ds_thread, NULL, "kldomd"); | 1266 | kthread_run(ds_thread, NULL, "kldomd"); |
1241 | 1267 | ||
1242 | return vio_register_driver(&ds_driver); | 1268 | return vio_register_driver(&ds_driver); |
diff --git a/arch/sparc/kernel/entry.h b/arch/sparc/kernel/entry.h index d1f1361c4167..e27f8ea8656e 100644 --- a/arch/sparc/kernel/entry.h +++ b/arch/sparc/kernel/entry.h | |||
@@ -42,6 +42,20 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr, | |||
42 | extern void fpload(unsigned long *fpregs, unsigned long *fsr); | 42 | extern void fpload(unsigned long *fpregs, unsigned long *fsr); |
43 | 43 | ||
44 | #else /* CONFIG_SPARC32 */ | 44 | #else /* CONFIG_SPARC32 */ |
45 | struct popc_3insn_patch_entry { | ||
46 | unsigned int addr; | ||
47 | unsigned int insns[3]; | ||
48 | }; | ||
49 | extern struct popc_3insn_patch_entry __popc_3insn_patch, | ||
50 | __popc_3insn_patch_end; | ||
51 | |||
52 | struct popc_6insn_patch_entry { | ||
53 | unsigned int addr; | ||
54 | unsigned int insns[6]; | ||
55 | }; | ||
56 | extern struct popc_6insn_patch_entry __popc_6insn_patch, | ||
57 | __popc_6insn_patch_end; | ||
58 | |||
45 | extern void __init per_cpu_patch(void); | 59 | extern void __init per_cpu_patch(void); |
46 | extern void __init sun4v_patch(void); | 60 | extern void __init sun4v_patch(void); |
47 | extern void __init boot_cpu_id_too_large(int cpu); | 61 | extern void __init boot_cpu_id_too_large(int cpu); |
diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S index c752603a7c0d..0eac1b2fc53d 100644 --- a/arch/sparc/kernel/head_64.S +++ b/arch/sparc/kernel/head_64.S | |||
@@ -559,7 +559,7 @@ niagara2_patch: | |||
559 | nop | 559 | nop |
560 | call niagara_patch_bzero | 560 | call niagara_patch_bzero |
561 | nop | 561 | nop |
562 | call niagara2_patch_pageops | 562 | call niagara_patch_pageops |
563 | nop | 563 | nop |
564 | 564 | ||
565 | ba,a,pt %xcc, 80f | 565 | ba,a,pt %xcc, 80f |
diff --git a/arch/sparc/kernel/hvapi.c b/arch/sparc/kernel/hvapi.c index d306e648c33c..c2d055d8ba9e 100644 --- a/arch/sparc/kernel/hvapi.c +++ b/arch/sparc/kernel/hvapi.c | |||
@@ -28,11 +28,17 @@ static struct api_info api_table[] = { | |||
28 | { .group = HV_GRP_CORE, .flags = FLAG_PRE_API }, | 28 | { .group = HV_GRP_CORE, .flags = FLAG_PRE_API }, |
29 | { .group = HV_GRP_INTR, }, | 29 | { .group = HV_GRP_INTR, }, |
30 | { .group = HV_GRP_SOFT_STATE, }, | 30 | { .group = HV_GRP_SOFT_STATE, }, |
31 | { .group = HV_GRP_TM, }, | ||
31 | { .group = HV_GRP_PCI, .flags = FLAG_PRE_API }, | 32 | { .group = HV_GRP_PCI, .flags = FLAG_PRE_API }, |
32 | { .group = HV_GRP_LDOM, }, | 33 | { .group = HV_GRP_LDOM, }, |
33 | { .group = HV_GRP_SVC_CHAN, .flags = FLAG_PRE_API }, | 34 | { .group = HV_GRP_SVC_CHAN, .flags = FLAG_PRE_API }, |
34 | { .group = HV_GRP_NCS, .flags = FLAG_PRE_API }, | 35 | { .group = HV_GRP_NCS, .flags = FLAG_PRE_API }, |
35 | { .group = HV_GRP_RNG, }, | 36 | { .group = HV_GRP_RNG, }, |
37 | { .group = HV_GRP_PBOOT, }, | ||
38 | { .group = HV_GRP_TPM, }, | ||
39 | { .group = HV_GRP_SDIO, }, | ||
40 | { .group = HV_GRP_SDIO_ERR, }, | ||
41 | { .group = HV_GRP_REBOOT_DATA, }, | ||
36 | { .group = HV_GRP_NIAG_PERF, .flags = FLAG_PRE_API }, | 42 | { .group = HV_GRP_NIAG_PERF, .flags = FLAG_PRE_API }, |
37 | { .group = HV_GRP_FIRE_PERF, }, | 43 | { .group = HV_GRP_FIRE_PERF, }, |
38 | { .group = HV_GRP_N2_CPU, }, | 44 | { .group = HV_GRP_N2_CPU, }, |
diff --git a/arch/sparc/kernel/hvcalls.S b/arch/sparc/kernel/hvcalls.S index 8a5f35ffb15e..58d60de4d65b 100644 --- a/arch/sparc/kernel/hvcalls.S +++ b/arch/sparc/kernel/hvcalls.S | |||
@@ -798,3 +798,10 @@ ENTRY(sun4v_niagara2_setperf) | |||
798 | retl | 798 | retl |
799 | nop | 799 | nop |
800 | ENDPROC(sun4v_niagara2_setperf) | 800 | ENDPROC(sun4v_niagara2_setperf) |
801 | |||
802 | ENTRY(sun4v_reboot_data_set) | ||
803 | mov HV_FAST_REBOOT_DATA_SET, %o5 | ||
804 | ta HV_FAST_TRAP | ||
805 | retl | ||
806 | nop | ||
807 | ENDPROC(sun4v_reboot_data_set) | ||
diff --git a/arch/sparc/kernel/kernel.h b/arch/sparc/kernel/kernel.h index 6f6544cfa0ef..fd6c36b1df74 100644 --- a/arch/sparc/kernel/kernel.h +++ b/arch/sparc/kernel/kernel.h | |||
@@ -4,12 +4,27 @@ | |||
4 | #include <linux/interrupt.h> | 4 | #include <linux/interrupt.h> |
5 | 5 | ||
6 | #include <asm/traps.h> | 6 | #include <asm/traps.h> |
7 | #include <asm/head.h> | ||
8 | #include <asm/io.h> | ||
7 | 9 | ||
8 | /* cpu.c */ | 10 | /* cpu.c */ |
9 | extern const char *sparc_pmu_type; | 11 | extern const char *sparc_pmu_type; |
10 | extern unsigned int fsr_storage; | 12 | extern unsigned int fsr_storage; |
11 | extern int ncpus_probed; | 13 | extern int ncpus_probed; |
12 | 14 | ||
15 | #ifdef CONFIG_SPARC64 | ||
16 | /* setup_64.c */ | ||
17 | struct seq_file; | ||
18 | extern void cpucap_info(struct seq_file *); | ||
19 | |||
20 | static inline unsigned long kimage_addr_to_ra(const char *p) | ||
21 | { | ||
22 | unsigned long val = (unsigned long) p; | ||
23 | |||
24 | return kern_base + (val - KERNBASE); | ||
25 | } | ||
26 | #endif | ||
27 | |||
13 | #ifdef CONFIG_SPARC32 | 28 | #ifdef CONFIG_SPARC32 |
14 | /* cpu.c */ | 29 | /* cpu.c */ |
15 | extern void cpu_probe(void); | 30 | extern void cpu_probe(void); |
diff --git a/arch/sparc/kernel/ktlb.S b/arch/sparc/kernel/ktlb.S index 1d361477d7d6..79f310364849 100644 --- a/arch/sparc/kernel/ktlb.S +++ b/arch/sparc/kernel/ktlb.S | |||
@@ -47,16 +47,16 @@ kvmap_itlb_tsb_miss: | |||
47 | kvmap_itlb_vmalloc_addr: | 47 | kvmap_itlb_vmalloc_addr: |
48 | KERN_PGTABLE_WALK(%g4, %g5, %g2, kvmap_itlb_longpath) | 48 | KERN_PGTABLE_WALK(%g4, %g5, %g2, kvmap_itlb_longpath) |
49 | 49 | ||
50 | KTSB_LOCK_TAG(%g1, %g2, %g7) | 50 | TSB_LOCK_TAG(%g1, %g2, %g7) |
51 | 51 | ||
52 | /* Load and check PTE. */ | 52 | /* Load and check PTE. */ |
53 | ldxa [%g5] ASI_PHYS_USE_EC, %g5 | 53 | ldxa [%g5] ASI_PHYS_USE_EC, %g5 |
54 | mov 1, %g7 | 54 | mov 1, %g7 |
55 | sllx %g7, TSB_TAG_INVALID_BIT, %g7 | 55 | sllx %g7, TSB_TAG_INVALID_BIT, %g7 |
56 | brgez,a,pn %g5, kvmap_itlb_longpath | 56 | brgez,a,pn %g5, kvmap_itlb_longpath |
57 | KTSB_STORE(%g1, %g7) | 57 | TSB_STORE(%g1, %g7) |
58 | 58 | ||
59 | KTSB_WRITE(%g1, %g5, %g6) | 59 | TSB_WRITE(%g1, %g5, %g6) |
60 | 60 | ||
61 | /* fallthrough to TLB load */ | 61 | /* fallthrough to TLB load */ |
62 | 62 | ||
@@ -102,9 +102,9 @@ kvmap_itlb_longpath: | |||
102 | kvmap_itlb_obp: | 102 | kvmap_itlb_obp: |
103 | OBP_TRANS_LOOKUP(%g4, %g5, %g2, %g3, kvmap_itlb_longpath) | 103 | OBP_TRANS_LOOKUP(%g4, %g5, %g2, %g3, kvmap_itlb_longpath) |
104 | 104 | ||
105 | KTSB_LOCK_TAG(%g1, %g2, %g7) | 105 | TSB_LOCK_TAG(%g1, %g2, %g7) |
106 | 106 | ||
107 | KTSB_WRITE(%g1, %g5, %g6) | 107 | TSB_WRITE(%g1, %g5, %g6) |
108 | 108 | ||
109 | ba,pt %xcc, kvmap_itlb_load | 109 | ba,pt %xcc, kvmap_itlb_load |
110 | nop | 110 | nop |
@@ -112,17 +112,17 @@ kvmap_itlb_obp: | |||
112 | kvmap_dtlb_obp: | 112 | kvmap_dtlb_obp: |
113 | OBP_TRANS_LOOKUP(%g4, %g5, %g2, %g3, kvmap_dtlb_longpath) | 113 | OBP_TRANS_LOOKUP(%g4, %g5, %g2, %g3, kvmap_dtlb_longpath) |
114 | 114 | ||
115 | KTSB_LOCK_TAG(%g1, %g2, %g7) | 115 | TSB_LOCK_TAG(%g1, %g2, %g7) |
116 | 116 | ||
117 | KTSB_WRITE(%g1, %g5, %g6) | 117 | TSB_WRITE(%g1, %g5, %g6) |
118 | 118 | ||
119 | ba,pt %xcc, kvmap_dtlb_load | 119 | ba,pt %xcc, kvmap_dtlb_load |
120 | nop | 120 | nop |
121 | 121 | ||
122 | .align 32 | 122 | .align 32 |
123 | kvmap_dtlb_tsb4m_load: | 123 | kvmap_dtlb_tsb4m_load: |
124 | KTSB_LOCK_TAG(%g1, %g2, %g7) | 124 | TSB_LOCK_TAG(%g1, %g2, %g7) |
125 | KTSB_WRITE(%g1, %g5, %g6) | 125 | TSB_WRITE(%g1, %g5, %g6) |
126 | ba,pt %xcc, kvmap_dtlb_load | 126 | ba,pt %xcc, kvmap_dtlb_load |
127 | nop | 127 | nop |
128 | 128 | ||
@@ -222,16 +222,16 @@ kvmap_linear_patch: | |||
222 | kvmap_dtlb_vmalloc_addr: | 222 | kvmap_dtlb_vmalloc_addr: |
223 | KERN_PGTABLE_WALK(%g4, %g5, %g2, kvmap_dtlb_longpath) | 223 | KERN_PGTABLE_WALK(%g4, %g5, %g2, kvmap_dtlb_longpath) |
224 | 224 | ||
225 | KTSB_LOCK_TAG(%g1, %g2, %g7) | 225 | TSB_LOCK_TAG(%g1, %g2, %g7) |
226 | 226 | ||
227 | /* Load and check PTE. */ | 227 | /* Load and check PTE. */ |
228 | ldxa [%g5] ASI_PHYS_USE_EC, %g5 | 228 | ldxa [%g5] ASI_PHYS_USE_EC, %g5 |
229 | mov 1, %g7 | 229 | mov 1, %g7 |
230 | sllx %g7, TSB_TAG_INVALID_BIT, %g7 | 230 | sllx %g7, TSB_TAG_INVALID_BIT, %g7 |
231 | brgez,a,pn %g5, kvmap_dtlb_longpath | 231 | brgez,a,pn %g5, kvmap_dtlb_longpath |
232 | KTSB_STORE(%g1, %g7) | 232 | TSB_STORE(%g1, %g7) |
233 | 233 | ||
234 | KTSB_WRITE(%g1, %g5, %g6) | 234 | TSB_WRITE(%g1, %g5, %g6) |
235 | 235 | ||
236 | /* fallthrough to TLB load */ | 236 | /* fallthrough to TLB load */ |
237 | 237 | ||
diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c index 42f28c7420e1..acaebb63c4fd 100644 --- a/arch/sparc/kernel/mdesc.c +++ b/arch/sparc/kernel/mdesc.c | |||
@@ -508,6 +508,8 @@ const char *mdesc_node_name(struct mdesc_handle *hp, u64 node) | |||
508 | } | 508 | } |
509 | EXPORT_SYMBOL(mdesc_node_name); | 509 | EXPORT_SYMBOL(mdesc_node_name); |
510 | 510 | ||
511 | static u64 max_cpus = 64; | ||
512 | |||
511 | static void __init report_platform_properties(void) | 513 | static void __init report_platform_properties(void) |
512 | { | 514 | { |
513 | struct mdesc_handle *hp = mdesc_grab(); | 515 | struct mdesc_handle *hp = mdesc_grab(); |
@@ -543,8 +545,10 @@ static void __init report_platform_properties(void) | |||
543 | if (v) | 545 | if (v) |
544 | printk("PLATFORM: watchdog-max-timeout [%llu ms]\n", *v); | 546 | printk("PLATFORM: watchdog-max-timeout [%llu ms]\n", *v); |
545 | v = mdesc_get_property(hp, pn, "max-cpus", NULL); | 547 | v = mdesc_get_property(hp, pn, "max-cpus", NULL); |
546 | if (v) | 548 | if (v) { |
547 | printk("PLATFORM: max-cpus [%llu]\n", *v); | 549 | max_cpus = *v; |
550 | printk("PLATFORM: max-cpus [%llu]\n", max_cpus); | ||
551 | } | ||
548 | 552 | ||
549 | #ifdef CONFIG_SMP | 553 | #ifdef CONFIG_SMP |
550 | { | 554 | { |
@@ -715,7 +719,7 @@ static void __cpuinit set_proc_ids(struct mdesc_handle *hp) | |||
715 | } | 719 | } |
716 | 720 | ||
717 | static void __cpuinit get_one_mondo_bits(const u64 *p, unsigned int *mask, | 721 | static void __cpuinit get_one_mondo_bits(const u64 *p, unsigned int *mask, |
718 | unsigned char def) | 722 | unsigned long def, unsigned long max) |
719 | { | 723 | { |
720 | u64 val; | 724 | u64 val; |
721 | 725 | ||
@@ -726,6 +730,9 @@ static void __cpuinit get_one_mondo_bits(const u64 *p, unsigned int *mask, | |||
726 | if (!val || val >= 64) | 730 | if (!val || val >= 64) |
727 | goto use_default; | 731 | goto use_default; |
728 | 732 | ||
733 | if (val > max) | ||
734 | val = max; | ||
735 | |||
729 | *mask = ((1U << val) * 64U) - 1U; | 736 | *mask = ((1U << val) * 64U) - 1U; |
730 | return; | 737 | return; |
731 | 738 | ||
@@ -736,19 +743,28 @@ use_default: | |||
736 | static void __cpuinit get_mondo_data(struct mdesc_handle *hp, u64 mp, | 743 | static void __cpuinit get_mondo_data(struct mdesc_handle *hp, u64 mp, |
737 | struct trap_per_cpu *tb) | 744 | struct trap_per_cpu *tb) |
738 | { | 745 | { |
746 | static int printed; | ||
739 | const u64 *val; | 747 | const u64 *val; |
740 | 748 | ||
741 | val = mdesc_get_property(hp, mp, "q-cpu-mondo-#bits", NULL); | 749 | val = mdesc_get_property(hp, mp, "q-cpu-mondo-#bits", NULL); |
742 | get_one_mondo_bits(val, &tb->cpu_mondo_qmask, 7); | 750 | get_one_mondo_bits(val, &tb->cpu_mondo_qmask, 7, ilog2(max_cpus * 2)); |
743 | 751 | ||
744 | val = mdesc_get_property(hp, mp, "q-dev-mondo-#bits", NULL); | 752 | val = mdesc_get_property(hp, mp, "q-dev-mondo-#bits", NULL); |
745 | get_one_mondo_bits(val, &tb->dev_mondo_qmask, 7); | 753 | get_one_mondo_bits(val, &tb->dev_mondo_qmask, 7, 8); |
746 | 754 | ||
747 | val = mdesc_get_property(hp, mp, "q-resumable-#bits", NULL); | 755 | val = mdesc_get_property(hp, mp, "q-resumable-#bits", NULL); |
748 | get_one_mondo_bits(val, &tb->resum_qmask, 6); | 756 | get_one_mondo_bits(val, &tb->resum_qmask, 6, 7); |
749 | 757 | ||
750 | val = mdesc_get_property(hp, mp, "q-nonresumable-#bits", NULL); | 758 | val = mdesc_get_property(hp, mp, "q-nonresumable-#bits", NULL); |
751 | get_one_mondo_bits(val, &tb->nonresum_qmask, 2); | 759 | get_one_mondo_bits(val, &tb->nonresum_qmask, 2, 2); |
760 | if (!printed++) { | ||
761 | pr_info("SUN4V: Mondo queue sizes " | ||
762 | "[cpu(%u) dev(%u) r(%u) nr(%u)]\n", | ||
763 | tb->cpu_mondo_qmask + 1, | ||
764 | tb->dev_mondo_qmask + 1, | ||
765 | tb->resum_qmask + 1, | ||
766 | tb->nonresum_qmask + 1); | ||
767 | } | ||
752 | } | 768 | } |
753 | 769 | ||
754 | static void * __cpuinit mdesc_iterate_over_cpus(void *(*func)(struct mdesc_handle *, u64, int, void *), void *arg, cpumask_t *mask) | 770 | static void * __cpuinit mdesc_iterate_over_cpus(void *(*func)(struct mdesc_handle *, u64, int, void *), void *arg, cpumask_t *mask) |
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index c4dd0999da86..3e9daea1653d 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
30 | #include <linux/cpu.h> | 30 | #include <linux/cpu.h> |
31 | #include <linux/initrd.h> | 31 | #include <linux/initrd.h> |
32 | #include <linux/module.h> | ||
32 | 33 | ||
33 | #include <asm/system.h> | 34 | #include <asm/system.h> |
34 | #include <asm/io.h> | 35 | #include <asm/io.h> |
@@ -46,6 +47,8 @@ | |||
46 | #include <asm/mmu.h> | 47 | #include <asm/mmu.h> |
47 | #include <asm/ns87303.h> | 48 | #include <asm/ns87303.h> |
48 | #include <asm/btext.h> | 49 | #include <asm/btext.h> |
50 | #include <asm/elf.h> | ||
51 | #include <asm/mdesc.h> | ||
49 | 52 | ||
50 | #ifdef CONFIG_IP_PNP | 53 | #ifdef CONFIG_IP_PNP |
51 | #include <net/ipconfig.h> | 54 | #include <net/ipconfig.h> |
@@ -269,6 +272,40 @@ void __init sun4v_patch(void) | |||
269 | sun4v_hvapi_init(); | 272 | sun4v_hvapi_init(); |
270 | } | 273 | } |
271 | 274 | ||
275 | static void __init popc_patch(void) | ||
276 | { | ||
277 | struct popc_3insn_patch_entry *p3; | ||
278 | struct popc_6insn_patch_entry *p6; | ||
279 | |||
280 | p3 = &__popc_3insn_patch; | ||
281 | while (p3 < &__popc_3insn_patch_end) { | ||
282 | unsigned long i, addr = p3->addr; | ||
283 | |||
284 | for (i = 0; i < 3; i++) { | ||
285 | *(unsigned int *) (addr + (i * 4)) = p3->insns[i]; | ||
286 | wmb(); | ||
287 | __asm__ __volatile__("flush %0" | ||
288 | : : "r" (addr + (i * 4))); | ||
289 | } | ||
290 | |||
291 | p3++; | ||
292 | } | ||
293 | |||
294 | p6 = &__popc_6insn_patch; | ||
295 | while (p6 < &__popc_6insn_patch_end) { | ||
296 | unsigned long i, addr = p6->addr; | ||
297 | |||
298 | for (i = 0; i < 6; i++) { | ||
299 | *(unsigned int *) (addr + (i * 4)) = p6->insns[i]; | ||
300 | wmb(); | ||
301 | __asm__ __volatile__("flush %0" | ||
302 | : : "r" (addr + (i * 4))); | ||
303 | } | ||
304 | |||
305 | p6++; | ||
306 | } | ||
307 | } | ||
308 | |||
272 | #ifdef CONFIG_SMP | 309 | #ifdef CONFIG_SMP |
273 | void __init boot_cpu_id_too_large(int cpu) | 310 | void __init boot_cpu_id_too_large(int cpu) |
274 | { | 311 | { |
@@ -278,6 +315,154 @@ void __init boot_cpu_id_too_large(int cpu) | |||
278 | } | 315 | } |
279 | #endif | 316 | #endif |
280 | 317 | ||
318 | /* On Ultra, we support all of the v8 capabilities. */ | ||
319 | unsigned long sparc64_elf_hwcap = (HWCAP_SPARC_FLUSH | HWCAP_SPARC_STBAR | | ||
320 | HWCAP_SPARC_SWAP | HWCAP_SPARC_MULDIV | | ||
321 | HWCAP_SPARC_V9); | ||
322 | EXPORT_SYMBOL(sparc64_elf_hwcap); | ||
323 | |||
324 | static const char *hwcaps[] = { | ||
325 | "flush", "stbar", "swap", "muldiv", "v9", | ||
326 | "ultra3", "blkinit", "n2", | ||
327 | |||
328 | /* These strings are as they appear in the machine description | ||
329 | * 'hwcap-list' property for cpu nodes. | ||
330 | */ | ||
331 | "mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2", | ||
332 | "ASIBlkInit", "fmaf", "vis3", "hpc", "random", "trans", "fjfmau", | ||
333 | "ima", "cspare", | ||
334 | }; | ||
335 | |||
336 | void cpucap_info(struct seq_file *m) | ||
337 | { | ||
338 | unsigned long caps = sparc64_elf_hwcap; | ||
339 | int i, printed = 0; | ||
340 | |||
341 | seq_puts(m, "cpucaps\t\t: "); | ||
342 | for (i = 0; i < ARRAY_SIZE(hwcaps); i++) { | ||
343 | unsigned long bit = 1UL << i; | ||
344 | if (caps & bit) { | ||
345 | seq_printf(m, "%s%s", | ||
346 | printed ? "," : "", hwcaps[i]); | ||
347 | printed++; | ||
348 | } | ||
349 | } | ||
350 | seq_putc(m, '\n'); | ||
351 | } | ||
352 | |||
353 | static void __init report_hwcaps(unsigned long caps) | ||
354 | { | ||
355 | int i, printed = 0; | ||
356 | |||
357 | printk(KERN_INFO "CPU CAPS: ["); | ||
358 | for (i = 0; i < ARRAY_SIZE(hwcaps); i++) { | ||
359 | unsigned long bit = 1UL << i; | ||
360 | if (caps & bit) { | ||
361 | printk(KERN_CONT "%s%s", | ||
362 | printed ? "," : "", hwcaps[i]); | ||
363 | if (++printed == 8) { | ||
364 | printk(KERN_CONT "]\n"); | ||
365 | printk(KERN_INFO "CPU CAPS: ["); | ||
366 | printed = 0; | ||
367 | } | ||
368 | } | ||
369 | } | ||
370 | printk(KERN_CONT "]\n"); | ||
371 | } | ||
372 | |||
373 | static unsigned long __init mdesc_cpu_hwcap_list(void) | ||
374 | { | ||
375 | struct mdesc_handle *hp; | ||
376 | unsigned long caps = 0; | ||
377 | const char *prop; | ||
378 | int len; | ||
379 | u64 pn; | ||
380 | |||
381 | hp = mdesc_grab(); | ||
382 | if (!hp) | ||
383 | return 0; | ||
384 | |||
385 | pn = mdesc_node_by_name(hp, MDESC_NODE_NULL, "cpu"); | ||
386 | if (pn == MDESC_NODE_NULL) | ||
387 | goto out; | ||
388 | |||
389 | prop = mdesc_get_property(hp, pn, "hwcap-list", &len); | ||
390 | if (!prop) | ||
391 | goto out; | ||
392 | |||
393 | while (len) { | ||
394 | int i, plen; | ||
395 | |||
396 | for (i = 0; i < ARRAY_SIZE(hwcaps); i++) { | ||
397 | unsigned long bit = 1UL << i; | ||
398 | |||
399 | if (!strcmp(prop, hwcaps[i])) { | ||
400 | caps |= bit; | ||
401 | break; | ||
402 | } | ||
403 | } | ||
404 | |||
405 | plen = strlen(prop) + 1; | ||
406 | prop += plen; | ||
407 | len -= plen; | ||
408 | } | ||
409 | |||
410 | out: | ||
411 | mdesc_release(hp); | ||
412 | return caps; | ||
413 | } | ||
414 | |||
415 | /* This yields a mask that user programs can use to figure out what | ||
416 | * instruction set this cpu supports. | ||
417 | */ | ||
418 | static void __init init_sparc64_elf_hwcap(void) | ||
419 | { | ||
420 | unsigned long cap = sparc64_elf_hwcap; | ||
421 | unsigned long mdesc_caps; | ||
422 | |||
423 | if (tlb_type == cheetah || tlb_type == cheetah_plus) | ||
424 | cap |= HWCAP_SPARC_ULTRA3; | ||
425 | else if (tlb_type == hypervisor) { | ||
426 | if (sun4v_chip_type == SUN4V_CHIP_NIAGARA1 || | ||
427 | sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || | ||
428 | sun4v_chip_type == SUN4V_CHIP_NIAGARA3) | ||
429 | cap |= HWCAP_SPARC_BLKINIT; | ||
430 | if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || | ||
431 | sun4v_chip_type == SUN4V_CHIP_NIAGARA3) | ||
432 | cap |= HWCAP_SPARC_N2; | ||
433 | } | ||
434 | |||
435 | cap |= (AV_SPARC_MUL32 | AV_SPARC_DIV32 | AV_SPARC_V8PLUS); | ||
436 | |||
437 | mdesc_caps = mdesc_cpu_hwcap_list(); | ||
438 | if (!mdesc_caps) { | ||
439 | if (tlb_type == spitfire) | ||
440 | cap |= AV_SPARC_VIS; | ||
441 | if (tlb_type == cheetah || tlb_type == cheetah_plus) | ||
442 | cap |= AV_SPARC_VIS | AV_SPARC_VIS2; | ||
443 | if (tlb_type == cheetah_plus) | ||
444 | cap |= AV_SPARC_POPC; | ||
445 | if (tlb_type == hypervisor) { | ||
446 | if (sun4v_chip_type == SUN4V_CHIP_NIAGARA1) | ||
447 | cap |= AV_SPARC_ASI_BLK_INIT; | ||
448 | if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || | ||
449 | sun4v_chip_type == SUN4V_CHIP_NIAGARA3) | ||
450 | cap |= (AV_SPARC_VIS | AV_SPARC_VIS2 | | ||
451 | AV_SPARC_ASI_BLK_INIT | | ||
452 | AV_SPARC_POPC); | ||
453 | if (sun4v_chip_type == SUN4V_CHIP_NIAGARA3) | ||
454 | cap |= (AV_SPARC_VIS3 | AV_SPARC_HPC | | ||
455 | AV_SPARC_FMAF); | ||
456 | } | ||
457 | } | ||
458 | sparc64_elf_hwcap = cap | mdesc_caps; | ||
459 | |||
460 | report_hwcaps(sparc64_elf_hwcap); | ||
461 | |||
462 | if (sparc64_elf_hwcap & AV_SPARC_POPC) | ||
463 | popc_patch(); | ||
464 | } | ||
465 | |||
281 | void __init setup_arch(char **cmdline_p) | 466 | void __init setup_arch(char **cmdline_p) |
282 | { | 467 | { |
283 | /* Initialize PROM console and command line. */ | 468 | /* Initialize PROM console and command line. */ |
@@ -337,6 +522,7 @@ void __init setup_arch(char **cmdline_p) | |||
337 | init_cur_cpu_trap(current_thread_info()); | 522 | init_cur_cpu_trap(current_thread_info()); |
338 | 523 | ||
339 | paging_init(); | 524 | paging_init(); |
525 | init_sparc64_elf_hwcap(); | ||
340 | } | 526 | } |
341 | 527 | ||
342 | extern int stop_a_enabled; | 528 | extern int stop_a_enabled; |
diff --git a/arch/sparc/kernel/sparc_ksyms_64.c b/arch/sparc/kernel/sparc_ksyms_64.c index 372ad59c4cba..83b47ab02d96 100644 --- a/arch/sparc/kernel/sparc_ksyms_64.c +++ b/arch/sparc/kernel/sparc_ksyms_64.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
9 | #include <linux/pci.h> | 9 | #include <linux/pci.h> |
10 | #include <linux/init.h> | 10 | #include <linux/init.h> |
11 | #include <linux/bitops.h> | ||
11 | 12 | ||
12 | #include <asm/system.h> | 13 | #include <asm/system.h> |
13 | #include <asm/cpudata.h> | 14 | #include <asm/cpudata.h> |
@@ -38,5 +39,15 @@ EXPORT_SYMBOL(sun4v_niagara_setperf); | |||
38 | EXPORT_SYMBOL(sun4v_niagara2_getperf); | 39 | EXPORT_SYMBOL(sun4v_niagara2_getperf); |
39 | EXPORT_SYMBOL(sun4v_niagara2_setperf); | 40 | EXPORT_SYMBOL(sun4v_niagara2_setperf); |
40 | 41 | ||
42 | /* from hweight.S */ | ||
43 | EXPORT_SYMBOL(__arch_hweight8); | ||
44 | EXPORT_SYMBOL(__arch_hweight16); | ||
45 | EXPORT_SYMBOL(__arch_hweight32); | ||
46 | EXPORT_SYMBOL(__arch_hweight64); | ||
47 | |||
48 | /* from ffs_ffz.S */ | ||
49 | EXPORT_SYMBOL(ffs); | ||
50 | EXPORT_SYMBOL(__ffs); | ||
51 | |||
41 | /* Exporting a symbol from /init/main.c */ | 52 | /* Exporting a symbol from /init/main.c */ |
42 | EXPORT_SYMBOL(saved_command_line); | 53 | EXPORT_SYMBOL(saved_command_line); |
diff --git a/arch/sparc/kernel/sstate.c b/arch/sparc/kernel/sstate.c index 8cdbe5946b43..c59af546f522 100644 --- a/arch/sparc/kernel/sstate.c +++ b/arch/sparc/kernel/sstate.c | |||
@@ -14,14 +14,9 @@ | |||
14 | #include <asm/head.h> | 14 | #include <asm/head.h> |
15 | #include <asm/io.h> | 15 | #include <asm/io.h> |
16 | 16 | ||
17 | static int hv_supports_soft_state; | 17 | #include "kernel.h" |
18 | |||
19 | static unsigned long kimage_addr_to_ra(const char *p) | ||
20 | { | ||
21 | unsigned long val = (unsigned long) p; | ||
22 | 18 | ||
23 | return kern_base + (val - KERNBASE); | 19 | static int hv_supports_soft_state; |
24 | } | ||
25 | 20 | ||
26 | static void do_set_sstate(unsigned long state, const char *msg) | 21 | static void do_set_sstate(unsigned long state, const char *msg) |
27 | { | 22 | { |
diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c index 35cff1673aa4..76e4ac1a13e1 100644 --- a/arch/sparc/kernel/unaligned_64.c +++ b/arch/sparc/kernel/unaligned_64.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <linux/bitops.h> | 22 | #include <linux/bitops.h> |
23 | #include <linux/perf_event.h> | 23 | #include <linux/perf_event.h> |
24 | #include <linux/ratelimit.h> | 24 | #include <linux/ratelimit.h> |
25 | #include <linux/bitops.h> | ||
25 | #include <asm/fpumacro.h> | 26 | #include <asm/fpumacro.h> |
26 | 27 | ||
27 | enum direction { | 28 | enum direction { |
@@ -373,16 +374,11 @@ asmlinkage void kernel_unaligned_trap(struct pt_regs *regs, unsigned int insn) | |||
373 | } | 374 | } |
374 | } | 375 | } |
375 | 376 | ||
376 | static char popc_helper[] = { | ||
377 | 0, 1, 1, 2, 1, 2, 2, 3, | ||
378 | 1, 2, 2, 3, 2, 3, 3, 4, | ||
379 | }; | ||
380 | |||
381 | int handle_popc(u32 insn, struct pt_regs *regs) | 377 | int handle_popc(u32 insn, struct pt_regs *regs) |
382 | { | 378 | { |
383 | u64 value; | ||
384 | int ret, i, rd = ((insn >> 25) & 0x1f); | ||
385 | int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; | 379 | int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; |
380 | int ret, rd = ((insn >> 25) & 0x1f); | ||
381 | u64 value; | ||
386 | 382 | ||
387 | perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); | 383 | perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, 1, regs, 0); |
388 | if (insn & 0x2000) { | 384 | if (insn & 0x2000) { |
@@ -392,10 +388,7 @@ int handle_popc(u32 insn, struct pt_regs *regs) | |||
392 | maybe_flush_windows(0, insn & 0x1f, rd, from_kernel); | 388 | maybe_flush_windows(0, insn & 0x1f, rd, from_kernel); |
393 | value = fetch_reg(insn & 0x1f, regs); | 389 | value = fetch_reg(insn & 0x1f, regs); |
394 | } | 390 | } |
395 | for (ret = 0, i = 0; i < 16; i++) { | 391 | ret = hweight64(value); |
396 | ret += popc_helper[value & 0xf]; | ||
397 | value >>= 4; | ||
398 | } | ||
399 | if (rd < 16) { | 392 | if (rd < 16) { |
400 | if (rd) | 393 | if (rd) |
401 | regs->u_regs[rd] = ret; | 394 | regs->u_regs[rd] = ret; |
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S index c0220759003e..0e1605697b49 100644 --- a/arch/sparc/kernel/vmlinux.lds.S +++ b/arch/sparc/kernel/vmlinux.lds.S | |||
@@ -107,7 +107,26 @@ SECTIONS | |||
107 | *(.sun4v_2insn_patch) | 107 | *(.sun4v_2insn_patch) |
108 | __sun4v_2insn_patch_end = .; | 108 | __sun4v_2insn_patch_end = .; |
109 | } | 109 | } |
110 | 110 | .swapper_tsb_phys_patch : { | |
111 | __swapper_tsb_phys_patch = .; | ||
112 | *(.swapper_tsb_phys_patch) | ||
113 | __swapper_tsb_phys_patch_end = .; | ||
114 | } | ||
115 | .swapper_4m_tsb_phys_patch : { | ||
116 | __swapper_4m_tsb_phys_patch = .; | ||
117 | *(.swapper_4m_tsb_phys_patch) | ||
118 | __swapper_4m_tsb_phys_patch_end = .; | ||
119 | } | ||
120 | .popc_3insn_patch : { | ||
121 | __popc_3insn_patch = .; | ||
122 | *(.popc_3insn_patch) | ||
123 | __popc_3insn_patch_end = .; | ||
124 | } | ||
125 | .popc_6insn_patch : { | ||
126 | __popc_6insn_patch = .; | ||
127 | *(.popc_6insn_patch) | ||
128 | __popc_6insn_patch_end = .; | ||
129 | } | ||
111 | PERCPU_SECTION(SMP_CACHE_BYTES) | 130 | PERCPU_SECTION(SMP_CACHE_BYTES) |
112 | 131 | ||
113 | . = ALIGN(PAGE_SIZE); | 132 | . = ALIGN(PAGE_SIZE); |
diff --git a/arch/sparc/lib/Makefile b/arch/sparc/lib/Makefile index 7f01b8fce8bc..a3fc4375a150 100644 --- a/arch/sparc/lib/Makefile +++ b/arch/sparc/lib/Makefile | |||
@@ -31,13 +31,13 @@ lib-$(CONFIG_SPARC64) += NGmemcpy.o NGcopy_from_user.o NGcopy_to_user.o | |||
31 | lib-$(CONFIG_SPARC64) += NGpatch.o NGpage.o NGbzero.o | 31 | lib-$(CONFIG_SPARC64) += NGpatch.o NGpage.o NGbzero.o |
32 | 32 | ||
33 | lib-$(CONFIG_SPARC64) += NG2memcpy.o NG2copy_from_user.o NG2copy_to_user.o | 33 | lib-$(CONFIG_SPARC64) += NG2memcpy.o NG2copy_from_user.o NG2copy_to_user.o |
34 | lib-$(CONFIG_SPARC64) += NG2patch.o NG2page.o | 34 | lib-$(CONFIG_SPARC64) += NG2patch.o |
35 | 35 | ||
36 | lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o | 36 | lib-$(CONFIG_SPARC64) += GENmemcpy.o GENcopy_from_user.o GENcopy_to_user.o |
37 | lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o | 37 | lib-$(CONFIG_SPARC64) += GENpatch.o GENpage.o GENbzero.o |
38 | 38 | ||
39 | lib-$(CONFIG_SPARC64) += copy_in_user.o user_fixup.o memmove.o | 39 | lib-$(CONFIG_SPARC64) += copy_in_user.o user_fixup.o memmove.o |
40 | lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o | 40 | lib-$(CONFIG_SPARC64) += mcount.o ipcsum.o xor.o hweight.o ffs.o |
41 | 41 | ||
42 | obj-y += iomap.o | 42 | obj-y += iomap.o |
43 | obj-$(CONFIG_SPARC32) += atomic32.o | 43 | obj-$(CONFIG_SPARC32) += atomic32.o |
diff --git a/arch/sparc/lib/NG2page.S b/arch/sparc/lib/NG2page.S deleted file mode 100644 index 73b6b7c72cbf..000000000000 --- a/arch/sparc/lib/NG2page.S +++ /dev/null | |||
@@ -1,61 +0,0 @@ | |||
1 | /* NG2page.S: Niagara-2 optimized clear and copy page. | ||
2 | * | ||
3 | * Copyright (C) 2007 (davem@davemloft.net) | ||
4 | */ | ||
5 | |||
6 | #include <asm/asi.h> | ||
7 | #include <asm/page.h> | ||
8 | #include <asm/visasm.h> | ||
9 | |||
10 | .text | ||
11 | .align 32 | ||
12 | |||
13 | /* This is heavily simplified from the sun4u variants | ||
14 | * because Niagara-2 does not have any D-cache aliasing issues. | ||
15 | */ | ||
16 | NG2copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */ | ||
17 | prefetch [%o1 + 0x00], #one_read | ||
18 | prefetch [%o1 + 0x40], #one_read | ||
19 | VISEntryHalf | ||
20 | set PAGE_SIZE, %g7 | ||
21 | sub %o0, %o1, %g3 | ||
22 | 1: stxa %g0, [%o1 + %g3] ASI_BLK_INIT_QUAD_LDD_P | ||
23 | subcc %g7, 64, %g7 | ||
24 | ldda [%o1] ASI_BLK_P, %f0 | ||
25 | stda %f0, [%o1 + %g3] ASI_BLK_P | ||
26 | add %o1, 64, %o1 | ||
27 | bne,pt %xcc, 1b | ||
28 | prefetch [%o1 + 0x40], #one_read | ||
29 | membar #Sync | ||
30 | VISExitHalf | ||
31 | retl | ||
32 | nop | ||
33 | |||
34 | #define BRANCH_ALWAYS 0x10680000 | ||
35 | #define NOP 0x01000000 | ||
36 | #define NG_DO_PATCH(OLD, NEW) \ | ||
37 | sethi %hi(NEW), %g1; \ | ||
38 | or %g1, %lo(NEW), %g1; \ | ||
39 | sethi %hi(OLD), %g2; \ | ||
40 | or %g2, %lo(OLD), %g2; \ | ||
41 | sub %g1, %g2, %g1; \ | ||
42 | sethi %hi(BRANCH_ALWAYS), %g3; \ | ||
43 | sll %g1, 11, %g1; \ | ||
44 | srl %g1, 11 + 2, %g1; \ | ||
45 | or %g3, %lo(BRANCH_ALWAYS), %g3; \ | ||
46 | or %g3, %g1, %g3; \ | ||
47 | stw %g3, [%g2]; \ | ||
48 | sethi %hi(NOP), %g3; \ | ||
49 | or %g3, %lo(NOP), %g3; \ | ||
50 | stw %g3, [%g2 + 0x4]; \ | ||
51 | flush %g2; | ||
52 | |||
53 | .globl niagara2_patch_pageops | ||
54 | .type niagara2_patch_pageops,#function | ||
55 | niagara2_patch_pageops: | ||
56 | NG_DO_PATCH(copy_user_page, NG2copy_user_page) | ||
57 | NG_DO_PATCH(_clear_page, NGclear_page) | ||
58 | NG_DO_PATCH(clear_user_page, NGclear_user_page) | ||
59 | retl | ||
60 | nop | ||
61 | .size niagara2_patch_pageops,.-niagara2_patch_pageops | ||
diff --git a/arch/sparc/lib/NGpage.S b/arch/sparc/lib/NGpage.S index 428920de05ba..b9e790b9c6b8 100644 --- a/arch/sparc/lib/NGpage.S +++ b/arch/sparc/lib/NGpage.S | |||
@@ -16,55 +16,91 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | NGcopy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */ | 18 | NGcopy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */ |
19 | prefetch [%o1 + 0x00], #one_read | 19 | save %sp, -192, %sp |
20 | mov 8, %g1 | 20 | rd %asi, %g3 |
21 | mov 16, %g2 | 21 | wr %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi |
22 | mov 24, %g3 | ||
23 | set PAGE_SIZE, %g7 | 22 | set PAGE_SIZE, %g7 |
23 | prefetch [%i1 + 0x00], #one_read | ||
24 | prefetch [%i1 + 0x40], #one_read | ||
24 | 25 | ||
25 | 1: ldda [%o1 + %g0] ASI_BLK_INIT_QUAD_LDD_P, %o2 | 26 | 1: prefetch [%i1 + 0x80], #one_read |
26 | ldda [%o1 + %g2] ASI_BLK_INIT_QUAD_LDD_P, %o4 | 27 | prefetch [%i1 + 0xc0], #one_read |
27 | prefetch [%o1 + 0x40], #one_read | 28 | ldda [%i1 + 0x00] %asi, %o2 |
28 | add %o1, 32, %o1 | 29 | ldda [%i1 + 0x10] %asi, %o4 |
29 | stxa %o2, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P | 30 | ldda [%i1 + 0x20] %asi, %l2 |
30 | stxa %o3, [%o0 + %g1] ASI_BLK_INIT_QUAD_LDD_P | 31 | ldda [%i1 + 0x30] %asi, %l4 |
31 | ldda [%o1 + %g0] ASI_BLK_INIT_QUAD_LDD_P, %o2 | 32 | stxa %o2, [%i0 + 0x00] %asi |
32 | stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P | 33 | stxa %o3, [%i0 + 0x08] %asi |
33 | stxa %o5, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P | 34 | stxa %o4, [%i0 + 0x10] %asi |
34 | ldda [%o1 + %g2] ASI_BLK_INIT_QUAD_LDD_P, %o4 | 35 | stxa %o5, [%i0 + 0x18] %asi |
35 | add %o1, 32, %o1 | 36 | stxa %l2, [%i0 + 0x20] %asi |
36 | add %o0, 32, %o0 | 37 | stxa %l3, [%i0 + 0x28] %asi |
37 | stxa %o2, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P | 38 | stxa %l4, [%i0 + 0x30] %asi |
38 | stxa %o3, [%o0 + %g1] ASI_BLK_INIT_QUAD_LDD_P | 39 | stxa %l5, [%i0 + 0x38] %asi |
39 | stxa %o4, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P | 40 | ldda [%i1 + 0x40] %asi, %o2 |
40 | stxa %o5, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P | 41 | ldda [%i1 + 0x50] %asi, %o4 |
41 | subcc %g7, 64, %g7 | 42 | ldda [%i1 + 0x60] %asi, %l2 |
43 | ldda [%i1 + 0x70] %asi, %l4 | ||
44 | stxa %o2, [%i0 + 0x40] %asi | ||
45 | stxa %o3, [%i0 + 0x48] %asi | ||
46 | stxa %o4, [%i0 + 0x50] %asi | ||
47 | stxa %o5, [%i0 + 0x58] %asi | ||
48 | stxa %l2, [%i0 + 0x60] %asi | ||
49 | stxa %l3, [%i0 + 0x68] %asi | ||
50 | stxa %l4, [%i0 + 0x70] %asi | ||
51 | stxa %l5, [%i0 + 0x78] %asi | ||
52 | add %i1, 128, %i1 | ||
53 | subcc %g7, 128, %g7 | ||
42 | bne,pt %xcc, 1b | 54 | bne,pt %xcc, 1b |
43 | add %o0, 32, %o0 | 55 | add %i0, 128, %i0 |
56 | wr %g3, 0x0, %asi | ||
44 | membar #Sync | 57 | membar #Sync |
45 | retl | 58 | ret |
46 | nop | 59 | restore |
47 | 60 | ||
48 | .globl NGclear_page, NGclear_user_page | 61 | .align 32 |
49 | NGclear_page: /* %o0=dest */ | 62 | NGclear_page: /* %o0=dest */ |
50 | NGclear_user_page: /* %o0=dest, %o1=vaddr */ | 63 | NGclear_user_page: /* %o0=dest, %o1=vaddr */ |
51 | mov 8, %g1 | 64 | rd %asi, %g3 |
52 | mov 16, %g2 | 65 | wr %g0, ASI_BLK_INIT_QUAD_LDD_P, %asi |
53 | mov 24, %g3 | ||
54 | set PAGE_SIZE, %g7 | 66 | set PAGE_SIZE, %g7 |
55 | 67 | ||
56 | 1: stxa %g0, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P | 68 | 1: stxa %g0, [%o0 + 0x00] %asi |
57 | stxa %g0, [%o0 + %g1] ASI_BLK_INIT_QUAD_LDD_P | 69 | stxa %g0, [%o0 + 0x08] %asi |
58 | stxa %g0, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P | 70 | stxa %g0, [%o0 + 0x10] %asi |
59 | stxa %g0, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P | 71 | stxa %g0, [%o0 + 0x18] %asi |
60 | add %o0, 32, %o0 | 72 | stxa %g0, [%o0 + 0x20] %asi |
61 | stxa %g0, [%o0 + %g0] ASI_BLK_INIT_QUAD_LDD_P | 73 | stxa %g0, [%o0 + 0x28] %asi |
62 | stxa %g0, [%o0 + %g1] ASI_BLK_INIT_QUAD_LDD_P | 74 | stxa %g0, [%o0 + 0x30] %asi |
63 | stxa %g0, [%o0 + %g2] ASI_BLK_INIT_QUAD_LDD_P | 75 | stxa %g0, [%o0 + 0x38] %asi |
64 | stxa %g0, [%o0 + %g3] ASI_BLK_INIT_QUAD_LDD_P | 76 | stxa %g0, [%o0 + 0x40] %asi |
65 | subcc %g7, 64, %g7 | 77 | stxa %g0, [%o0 + 0x48] %asi |
78 | stxa %g0, [%o0 + 0x50] %asi | ||
79 | stxa %g0, [%o0 + 0x58] %asi | ||
80 | stxa %g0, [%o0 + 0x60] %asi | ||
81 | stxa %g0, [%o0 + 0x68] %asi | ||
82 | stxa %g0, [%o0 + 0x70] %asi | ||
83 | stxa %g0, [%o0 + 0x78] %asi | ||
84 | stxa %g0, [%o0 + 0x80] %asi | ||
85 | stxa %g0, [%o0 + 0x88] %asi | ||
86 | stxa %g0, [%o0 + 0x90] %asi | ||
87 | stxa %g0, [%o0 + 0x98] %asi | ||
88 | stxa %g0, [%o0 + 0xa0] %asi | ||
89 | stxa %g0, [%o0 + 0xa8] %asi | ||
90 | stxa %g0, [%o0 + 0xb0] %asi | ||
91 | stxa %g0, [%o0 + 0xb8] %asi | ||
92 | stxa %g0, [%o0 + 0xc0] %asi | ||
93 | stxa %g0, [%o0 + 0xc8] %asi | ||
94 | stxa %g0, [%o0 + 0xd0] %asi | ||
95 | stxa %g0, [%o0 + 0xd8] %asi | ||
96 | stxa %g0, [%o0 + 0xe0] %asi | ||
97 | stxa %g0, [%o0 + 0xe8] %asi | ||
98 | stxa %g0, [%o0 + 0xf0] %asi | ||
99 | stxa %g0, [%o0 + 0xf8] %asi | ||
100 | subcc %g7, 256, %g7 | ||
66 | bne,pt %xcc, 1b | 101 | bne,pt %xcc, 1b |
67 | add %o0, 32, %o0 | 102 | add %o0, 256, %o0 |
103 | wr %g3, 0x0, %asi | ||
68 | membar #Sync | 104 | membar #Sync |
69 | retl | 105 | retl |
70 | nop | 106 | nop |
diff --git a/arch/sparc/lib/atomic32.c b/arch/sparc/lib/atomic32.c index 8600eb2461b5..1d32b54089aa 100644 --- a/arch/sparc/lib/atomic32.c +++ b/arch/sparc/lib/atomic32.c | |||
@@ -65,7 +65,7 @@ int __atomic_add_unless(atomic_t *v, int a, int u) | |||
65 | if (ret != u) | 65 | if (ret != u) |
66 | v->counter += a; | 66 | v->counter += a; |
67 | spin_unlock_irqrestore(ATOMIC_HASH(v), flags); | 67 | spin_unlock_irqrestore(ATOMIC_HASH(v), flags); |
68 | return ret != u; | 68 | return ret; |
69 | } | 69 | } |
70 | EXPORT_SYMBOL(__atomic_add_unless); | 70 | EXPORT_SYMBOL(__atomic_add_unless); |
71 | 71 | ||
diff --git a/arch/sparc/lib/ffs.S b/arch/sparc/lib/ffs.S new file mode 100644 index 000000000000..b39389f69899 --- /dev/null +++ b/arch/sparc/lib/ffs.S | |||
@@ -0,0 +1,84 @@ | |||
1 | #include <linux/linkage.h> | ||
2 | |||
3 | .register %g2,#scratch | ||
4 | |||
5 | .text | ||
6 | .align 32 | ||
7 | |||
8 | ENTRY(ffs) | ||
9 | brnz,pt %o0, 1f | ||
10 | mov 1, %o1 | ||
11 | retl | ||
12 | clr %o0 | ||
13 | nop | ||
14 | nop | ||
15 | ENTRY(__ffs) | ||
16 | sllx %o0, 32, %g1 /* 1 */ | ||
17 | srlx %o0, 32, %g2 | ||
18 | |||
19 | clr %o1 /* 2 */ | ||
20 | movrz %g1, %g2, %o0 | ||
21 | |||
22 | movrz %g1, 32, %o1 /* 3 */ | ||
23 | 1: clr %o2 | ||
24 | |||
25 | sllx %o0, (64 - 16), %g1 /* 4 */ | ||
26 | srlx %o0, 16, %g2 | ||
27 | |||
28 | movrz %g1, %g2, %o0 /* 5 */ | ||
29 | clr %o3 | ||
30 | |||
31 | movrz %g1, 16, %o2 /* 6 */ | ||
32 | clr %o4 | ||
33 | |||
34 | and %o0, 0xff, %g1 /* 7 */ | ||
35 | srlx %o0, 8, %g2 | ||
36 | |||
37 | movrz %g1, %g2, %o0 /* 8 */ | ||
38 | clr %o5 | ||
39 | |||
40 | movrz %g1, 8, %o3 /* 9 */ | ||
41 | add %o2, %o1, %o2 | ||
42 | |||
43 | and %o0, 0xf, %g1 /* 10 */ | ||
44 | srlx %o0, 4, %g2 | ||
45 | |||
46 | movrz %g1, %g2, %o0 /* 11 */ | ||
47 | add %o2, %o3, %o2 | ||
48 | |||
49 | movrz %g1, 4, %o4 /* 12 */ | ||
50 | |||
51 | and %o0, 0x3, %g1 /* 13 */ | ||
52 | srlx %o0, 2, %g2 | ||
53 | |||
54 | movrz %g1, %g2, %o0 /* 14 */ | ||
55 | add %o2, %o4, %o2 | ||
56 | |||
57 | movrz %g1, 2, %o5 /* 15 */ | ||
58 | |||
59 | and %o0, 0x1, %g1 /* 16 */ | ||
60 | |||
61 | add %o2, %o5, %o2 /* 17 */ | ||
62 | xor %g1, 0x1, %g1 | ||
63 | |||
64 | retl /* 18 */ | ||
65 | add %o2, %g1, %o0 | ||
66 | ENDPROC(ffs) | ||
67 | ENDPROC(__ffs) | ||
68 | |||
69 | .section .popc_6insn_patch, "ax" | ||
70 | .word ffs | ||
71 | brz,pn %o0, 98f | ||
72 | neg %o0, %g1 | ||
73 | xnor %o0, %g1, %o1 | ||
74 | popc %o1, %o0 | ||
75 | 98: retl | ||
76 | nop | ||
77 | .word __ffs | ||
78 | neg %o0, %g1 | ||
79 | xnor %o0, %g1, %o1 | ||
80 | popc %o1, %o0 | ||
81 | retl | ||
82 | sub %o0, 1, %o0 | ||
83 | nop | ||
84 | .previous | ||
diff --git a/arch/sparc/lib/hweight.S b/arch/sparc/lib/hweight.S new file mode 100644 index 000000000000..95414e0a6808 --- /dev/null +++ b/arch/sparc/lib/hweight.S | |||
@@ -0,0 +1,51 @@ | |||
1 | #include <linux/linkage.h> | ||
2 | |||
3 | .text | ||
4 | .align 32 | ||
5 | ENTRY(__arch_hweight8) | ||
6 | ba,pt %xcc, __sw_hweight8 | ||
7 | nop | ||
8 | nop | ||
9 | ENDPROC(__arch_hweight8) | ||
10 | .section .popc_3insn_patch, "ax" | ||
11 | .word __arch_hweight8 | ||
12 | sllx %o0, 64-8, %g1 | ||
13 | retl | ||
14 | popc %g1, %o0 | ||
15 | .previous | ||
16 | |||
17 | ENTRY(__arch_hweight16) | ||
18 | ba,pt %xcc, __sw_hweight16 | ||
19 | nop | ||
20 | nop | ||
21 | ENDPROC(__arch_hweight16) | ||
22 | .section .popc_3insn_patch, "ax" | ||
23 | .word __arch_hweight16 | ||
24 | sllx %o0, 64-16, %g1 | ||
25 | retl | ||
26 | popc %g1, %o0 | ||
27 | .previous | ||
28 | |||
29 | ENTRY(__arch_hweight32) | ||
30 | ba,pt %xcc, __sw_hweight32 | ||
31 | nop | ||
32 | nop | ||
33 | ENDPROC(__arch_hweight32) | ||
34 | .section .popc_3insn_patch, "ax" | ||
35 | .word __arch_hweight32 | ||
36 | sllx %o0, 64-32, %g1 | ||
37 | retl | ||
38 | popc %g1, %o0 | ||
39 | .previous | ||
40 | |||
41 | ENTRY(__arch_hweight64) | ||
42 | ba,pt %xcc, __sw_hweight64 | ||
43 | nop | ||
44 | nop | ||
45 | ENDPROC(__arch_hweight64) | ||
46 | .section .popc_3insn_patch, "ax" | ||
47 | .word __arch_hweight64 | ||
48 | retl | ||
49 | popc %o0, %o0 | ||
50 | nop | ||
51 | .previous | ||
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 3fd8e18bed80..581531dbc8b5 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -1597,6 +1597,44 @@ static void __init tsb_phys_patch(void) | |||
1597 | static struct hv_tsb_descr ktsb_descr[NUM_KTSB_DESCR]; | 1597 | static struct hv_tsb_descr ktsb_descr[NUM_KTSB_DESCR]; |
1598 | extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES]; | 1598 | extern struct tsb swapper_tsb[KERNEL_TSB_NENTRIES]; |
1599 | 1599 | ||
1600 | static void patch_one_ktsb_phys(unsigned int *start, unsigned int *end, unsigned long pa) | ||
1601 | { | ||
1602 | pa >>= KTSB_PHYS_SHIFT; | ||
1603 | |||
1604 | while (start < end) { | ||
1605 | unsigned int *ia = (unsigned int *)(unsigned long)*start; | ||
1606 | |||
1607 | ia[0] = (ia[0] & ~0x3fffff) | (pa >> 10); | ||
1608 | __asm__ __volatile__("flush %0" : : "r" (ia)); | ||
1609 | |||
1610 | ia[1] = (ia[1] & ~0x3ff) | (pa & 0x3ff); | ||
1611 | __asm__ __volatile__("flush %0" : : "r" (ia + 1)); | ||
1612 | |||
1613 | start++; | ||
1614 | } | ||
1615 | } | ||
1616 | |||
1617 | static void ktsb_phys_patch(void) | ||
1618 | { | ||
1619 | extern unsigned int __swapper_tsb_phys_patch; | ||
1620 | extern unsigned int __swapper_tsb_phys_patch_end; | ||
1621 | unsigned long ktsb_pa; | ||
1622 | |||
1623 | ktsb_pa = kern_base + ((unsigned long)&swapper_tsb[0] - KERNBASE); | ||
1624 | patch_one_ktsb_phys(&__swapper_tsb_phys_patch, | ||
1625 | &__swapper_tsb_phys_patch_end, ktsb_pa); | ||
1626 | #ifndef CONFIG_DEBUG_PAGEALLOC | ||
1627 | { | ||
1628 | extern unsigned int __swapper_4m_tsb_phys_patch; | ||
1629 | extern unsigned int __swapper_4m_tsb_phys_patch_end; | ||
1630 | ktsb_pa = (kern_base + | ||
1631 | ((unsigned long)&swapper_4m_tsb[0] - KERNBASE)); | ||
1632 | patch_one_ktsb_phys(&__swapper_4m_tsb_phys_patch, | ||
1633 | &__swapper_4m_tsb_phys_patch_end, ktsb_pa); | ||
1634 | } | ||
1635 | #endif | ||
1636 | } | ||
1637 | |||
1600 | static void __init sun4v_ktsb_init(void) | 1638 | static void __init sun4v_ktsb_init(void) |
1601 | { | 1639 | { |
1602 | unsigned long ktsb_pa; | 1640 | unsigned long ktsb_pa; |
@@ -1716,8 +1754,10 @@ void __init paging_init(void) | |||
1716 | sun4u_pgprot_init(); | 1754 | sun4u_pgprot_init(); |
1717 | 1755 | ||
1718 | if (tlb_type == cheetah_plus || | 1756 | if (tlb_type == cheetah_plus || |
1719 | tlb_type == hypervisor) | 1757 | tlb_type == hypervisor) { |
1720 | tsb_phys_patch(); | 1758 | tsb_phys_patch(); |
1759 | ktsb_phys_patch(); | ||
1760 | } | ||
1721 | 1761 | ||
1722 | if (tlb_type == hypervisor) { | 1762 | if (tlb_type == hypervisor) { |
1723 | sun4v_patch_tlb_handlers(); | 1763 | sun4v_patch_tlb_handlers(); |
diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile index 45e94aca5bce..3326204e251f 100644 --- a/arch/x86/xen/Makefile +++ b/arch/x86/xen/Makefile | |||
@@ -15,7 +15,7 @@ obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ | |||
15 | grant-table.o suspend.o platform-pci-unplug.o \ | 15 | grant-table.o suspend.o platform-pci-unplug.o \ |
16 | p2m.o | 16 | p2m.o |
17 | 17 | ||
18 | obj-$(CONFIG_FUNCTION_TRACER) += trace.o | 18 | obj-$(CONFIG_FTRACE) += trace.o |
19 | 19 | ||
20 | obj-$(CONFIG_SMP) += smp.o | 20 | obj-$(CONFIG_SMP) += smp.o |
21 | obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o | 21 | obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index a9627e2e3295..df118a825f39 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -93,8 +93,6 @@ static unsigned long __init xen_release_chunk(phys_addr_t start_addr, | |||
93 | if (end <= start) | 93 | if (end <= start) |
94 | return 0; | 94 | return 0; |
95 | 95 | ||
96 | printk(KERN_INFO "xen_release_chunk: looking at area pfn %lx-%lx: ", | ||
97 | start, end); | ||
98 | for(pfn = start; pfn < end; pfn++) { | 96 | for(pfn = start; pfn < end; pfn++) { |
99 | unsigned long mfn = pfn_to_mfn(pfn); | 97 | unsigned long mfn = pfn_to_mfn(pfn); |
100 | 98 | ||
@@ -107,14 +105,14 @@ static unsigned long __init xen_release_chunk(phys_addr_t start_addr, | |||
107 | 105 | ||
108 | ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, | 106 | ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, |
109 | &reservation); | 107 | &reservation); |
110 | WARN(ret != 1, "Failed to release memory %lx-%lx err=%d\n", | 108 | WARN(ret != 1, "Failed to release pfn %lx err=%d\n", pfn, ret); |
111 | start, end, ret); | ||
112 | if (ret == 1) { | 109 | if (ret == 1) { |
113 | __set_phys_to_machine(pfn, INVALID_P2M_ENTRY); | 110 | __set_phys_to_machine(pfn, INVALID_P2M_ENTRY); |
114 | len++; | 111 | len++; |
115 | } | 112 | } |
116 | } | 113 | } |
117 | printk(KERN_CONT "%ld pages freed\n", len); | 114 | printk(KERN_INFO "Freeing %lx-%lx pfn range: %lu pages freed\n", |
115 | start, end, len); | ||
118 | 116 | ||
119 | return len; | 117 | return len; |
120 | } | 118 | } |
@@ -140,7 +138,7 @@ static unsigned long __init xen_return_unused_memory(unsigned long max_pfn, | |||
140 | if (last_end < max_addr) | 138 | if (last_end < max_addr) |
141 | released += xen_release_chunk(last_end, max_addr); | 139 | released += xen_release_chunk(last_end, max_addr); |
142 | 140 | ||
143 | printk(KERN_INFO "released %ld pages of unused memory\n", released); | 141 | printk(KERN_INFO "released %lu pages of unused memory\n", released); |
144 | return released; | 142 | return released; |
145 | } | 143 | } |
146 | 144 | ||
diff --git a/arch/x86/xen/trace.c b/arch/x86/xen/trace.c index 734beba2a08c..520022d1a181 100644 --- a/arch/x86/xen/trace.c +++ b/arch/x86/xen/trace.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <linux/ftrace.h> | 1 | #include <linux/ftrace.h> |
2 | #include <xen/interface/xen.h> | ||
2 | 3 | ||
3 | #define N(x) [__HYPERVISOR_##x] = "("#x")" | 4 | #define N(x) [__HYPERVISOR_##x] = "("#x")" |
4 | static const char *xen_hypercall_names[] = { | 5 | static const char *xen_hypercall_names[] = { |
diff --git a/crypto/md5.c b/crypto/md5.c index 30efc7dad891..7febeaab923b 100644 --- a/crypto/md5.c +++ b/crypto/md5.c | |||
@@ -21,99 +21,9 @@ | |||
21 | #include <linux/module.h> | 21 | #include <linux/module.h> |
22 | #include <linux/string.h> | 22 | #include <linux/string.h> |
23 | #include <linux/types.h> | 23 | #include <linux/types.h> |
24 | #include <linux/cryptohash.h> | ||
24 | #include <asm/byteorder.h> | 25 | #include <asm/byteorder.h> |
25 | 26 | ||
26 | #define F1(x, y, z) (z ^ (x & (y ^ z))) | ||
27 | #define F2(x, y, z) F1(z, x, y) | ||
28 | #define F3(x, y, z) (x ^ y ^ z) | ||
29 | #define F4(x, y, z) (y ^ (x | ~z)) | ||
30 | |||
31 | #define MD5STEP(f, w, x, y, z, in, s) \ | ||
32 | (w += f(x, y, z) + in, w = (w<<s | w>>(32-s)) + x) | ||
33 | |||
34 | static void md5_transform(u32 *hash, u32 const *in) | ||
35 | { | ||
36 | u32 a, b, c, d; | ||
37 | |||
38 | a = hash[0]; | ||
39 | b = hash[1]; | ||
40 | c = hash[2]; | ||
41 | d = hash[3]; | ||
42 | |||
43 | MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); | ||
44 | MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); | ||
45 | MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); | ||
46 | MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); | ||
47 | MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); | ||
48 | MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); | ||
49 | MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); | ||
50 | MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); | ||
51 | MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); | ||
52 | MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); | ||
53 | MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); | ||
54 | MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); | ||
55 | MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); | ||
56 | MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); | ||
57 | MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); | ||
58 | MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); | ||
59 | |||
60 | MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); | ||
61 | MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); | ||
62 | MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); | ||
63 | MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); | ||
64 | MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); | ||
65 | MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); | ||
66 | MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); | ||
67 | MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); | ||
68 | MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); | ||
69 | MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); | ||
70 | MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); | ||
71 | MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); | ||
72 | MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); | ||
73 | MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); | ||
74 | MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); | ||
75 | MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); | ||
76 | |||
77 | MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); | ||
78 | MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); | ||
79 | MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); | ||
80 | MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); | ||
81 | MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); | ||
82 | MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); | ||
83 | MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); | ||
84 | MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); | ||
85 | MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); | ||
86 | MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); | ||
87 | MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); | ||
88 | MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); | ||
89 | MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); | ||
90 | MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); | ||
91 | MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); | ||
92 | MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); | ||
93 | |||
94 | MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); | ||
95 | MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); | ||
96 | MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); | ||
97 | MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); | ||
98 | MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); | ||
99 | MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); | ||
100 | MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); | ||
101 | MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); | ||
102 | MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); | ||
103 | MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); | ||
104 | MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); | ||
105 | MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); | ||
106 | MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); | ||
107 | MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); | ||
108 | MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); | ||
109 | MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); | ||
110 | |||
111 | hash[0] += a; | ||
112 | hash[1] += b; | ||
113 | hash[2] += c; | ||
114 | hash[3] += d; | ||
115 | } | ||
116 | |||
117 | /* XXX: this stuff can be optimized */ | 27 | /* XXX: this stuff can be optimized */ |
118 | static inline void le32_to_cpu_array(u32 *buf, unsigned int words) | 28 | static inline void le32_to_cpu_array(u32 *buf, unsigned int words) |
119 | { | 29 | { |
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index 87c0a8daa99a..7711d94a0409 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c | |||
@@ -99,6 +99,7 @@ enum { | |||
99 | 99 | ||
100 | struct acpi_battery { | 100 | struct acpi_battery { |
101 | struct mutex lock; | 101 | struct mutex lock; |
102 | struct mutex sysfs_lock; | ||
102 | struct power_supply bat; | 103 | struct power_supply bat; |
103 | struct acpi_device *device; | 104 | struct acpi_device *device; |
104 | struct notifier_block pm_nb; | 105 | struct notifier_block pm_nb; |
@@ -573,16 +574,16 @@ static int sysfs_add_battery(struct acpi_battery *battery) | |||
573 | 574 | ||
574 | static void sysfs_remove_battery(struct acpi_battery *battery) | 575 | static void sysfs_remove_battery(struct acpi_battery *battery) |
575 | { | 576 | { |
576 | mutex_lock(&battery->lock); | 577 | mutex_lock(&battery->sysfs_lock); |
577 | if (!battery->bat.dev) { | 578 | if (!battery->bat.dev) { |
578 | mutex_unlock(&battery->lock); | 579 | mutex_unlock(&battery->sysfs_lock); |
579 | return; | 580 | return; |
580 | } | 581 | } |
581 | 582 | ||
582 | device_remove_file(battery->bat.dev, &alarm_attr); | 583 | device_remove_file(battery->bat.dev, &alarm_attr); |
583 | power_supply_unregister(&battery->bat); | 584 | power_supply_unregister(&battery->bat); |
584 | battery->bat.dev = NULL; | 585 | battery->bat.dev = NULL; |
585 | mutex_unlock(&battery->lock); | 586 | mutex_unlock(&battery->sysfs_lock); |
586 | } | 587 | } |
587 | 588 | ||
588 | /* | 589 | /* |
@@ -982,6 +983,7 @@ static int acpi_battery_add(struct acpi_device *device) | |||
982 | strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS); | 983 | strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS); |
983 | device->driver_data = battery; | 984 | device->driver_data = battery; |
984 | mutex_init(&battery->lock); | 985 | mutex_init(&battery->lock); |
986 | mutex_init(&battery->sysfs_lock); | ||
985 | if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, | 987 | if (ACPI_SUCCESS(acpi_get_handle(battery->device->handle, |
986 | "_BIX", &handle))) | 988 | "_BIX", &handle))) |
987 | set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); | 989 | set_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags); |
@@ -1010,6 +1012,7 @@ static int acpi_battery_add(struct acpi_device *device) | |||
1010 | fail: | 1012 | fail: |
1011 | sysfs_remove_battery(battery); | 1013 | sysfs_remove_battery(battery); |
1012 | mutex_destroy(&battery->lock); | 1014 | mutex_destroy(&battery->lock); |
1015 | mutex_destroy(&battery->sysfs_lock); | ||
1013 | kfree(battery); | 1016 | kfree(battery); |
1014 | return result; | 1017 | return result; |
1015 | } | 1018 | } |
@@ -1027,6 +1030,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type) | |||
1027 | #endif | 1030 | #endif |
1028 | sysfs_remove_battery(battery); | 1031 | sysfs_remove_battery(battery); |
1029 | mutex_destroy(&battery->lock); | 1032 | mutex_destroy(&battery->lock); |
1033 | mutex_destroy(&battery->sysfs_lock); | ||
1030 | kfree(battery); | 1034 | kfree(battery); |
1031 | return 0; | 1035 | return 0; |
1032 | } | 1036 | } |
diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index be8714aa9dd6..e18566a0fedd 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c | |||
@@ -80,7 +80,6 @@ static void genpd_set_active(struct generic_pm_domain *genpd) | |||
80 | int pm_genpd_poweron(struct generic_pm_domain *genpd) | 80 | int pm_genpd_poweron(struct generic_pm_domain *genpd) |
81 | { | 81 | { |
82 | struct generic_pm_domain *parent = genpd->parent; | 82 | struct generic_pm_domain *parent = genpd->parent; |
83 | DEFINE_WAIT(wait); | ||
84 | int ret = 0; | 83 | int ret = 0; |
85 | 84 | ||
86 | start: | 85 | start: |
@@ -112,7 +111,7 @@ int pm_genpd_poweron(struct generic_pm_domain *genpd) | |||
112 | } | 111 | } |
113 | 112 | ||
114 | if (genpd->power_on) { | 113 | if (genpd->power_on) { |
115 | int ret = genpd->power_on(genpd); | 114 | ret = genpd->power_on(genpd); |
116 | if (ret) | 115 | if (ret) |
117 | goto out; | 116 | goto out; |
118 | } | 117 | } |
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 8dc247c974af..acb3f83b8079 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c | |||
@@ -226,11 +226,17 @@ static int rpm_idle(struct device *dev, int rpmflags) | |||
226 | callback = NULL; | 226 | callback = NULL; |
227 | 227 | ||
228 | if (callback) { | 228 | if (callback) { |
229 | spin_unlock_irq(&dev->power.lock); | 229 | if (dev->power.irq_safe) |
230 | spin_unlock(&dev->power.lock); | ||
231 | else | ||
232 | spin_unlock_irq(&dev->power.lock); | ||
230 | 233 | ||
231 | callback(dev); | 234 | callback(dev); |
232 | 235 | ||
233 | spin_lock_irq(&dev->power.lock); | 236 | if (dev->power.irq_safe) |
237 | spin_lock(&dev->power.lock); | ||
238 | else | ||
239 | spin_lock_irq(&dev->power.lock); | ||
234 | } | 240 | } |
235 | 241 | ||
236 | dev->power.idle_notification = false; | 242 | dev->power.idle_notification = false; |
diff --git a/drivers/char/random.c b/drivers/char/random.c index 729281961f22..c35a785005b0 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -1300,345 +1300,14 @@ ctl_table random_table[] = { | |||
1300 | }; | 1300 | }; |
1301 | #endif /* CONFIG_SYSCTL */ | 1301 | #endif /* CONFIG_SYSCTL */ |
1302 | 1302 | ||
1303 | /******************************************************************** | 1303 | static u32 random_int_secret[MD5_MESSAGE_BYTES / 4] ____cacheline_aligned; |
1304 | * | ||
1305 | * Random functions for networking | ||
1306 | * | ||
1307 | ********************************************************************/ | ||
1308 | |||
1309 | /* | ||
1310 | * TCP initial sequence number picking. This uses the random number | ||
1311 | * generator to pick an initial secret value. This value is hashed | ||
1312 | * along with the TCP endpoint information to provide a unique | ||
1313 | * starting point for each pair of TCP endpoints. This defeats | ||
1314 | * attacks which rely on guessing the initial TCP sequence number. | ||
1315 | * This algorithm was suggested by Steve Bellovin. | ||
1316 | * | ||
1317 | * Using a very strong hash was taking an appreciable amount of the total | ||
1318 | * TCP connection establishment time, so this is a weaker hash, | ||
1319 | * compensated for by changing the secret periodically. | ||
1320 | */ | ||
1321 | |||
1322 | /* F, G and H are basic MD4 functions: selection, majority, parity */ | ||
1323 | #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) | ||
1324 | #define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) | ||
1325 | #define H(x, y, z) ((x) ^ (y) ^ (z)) | ||
1326 | |||
1327 | /* | ||
1328 | * The generic round function. The application is so specific that | ||
1329 | * we don't bother protecting all the arguments with parens, as is generally | ||
1330 | * good macro practice, in favor of extra legibility. | ||
1331 | * Rotation is separate from addition to prevent recomputation | ||
1332 | */ | ||
1333 | #define ROUND(f, a, b, c, d, x, s) \ | ||
1334 | (a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s))) | ||
1335 | #define K1 0 | ||
1336 | #define K2 013240474631UL | ||
1337 | #define K3 015666365641UL | ||
1338 | |||
1339 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
1340 | |||
1341 | static __u32 twothirdsMD4Transform(__u32 const buf[4], __u32 const in[12]) | ||
1342 | { | ||
1343 | __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; | ||
1344 | |||
1345 | /* Round 1 */ | ||
1346 | ROUND(F, a, b, c, d, in[ 0] + K1, 3); | ||
1347 | ROUND(F, d, a, b, c, in[ 1] + K1, 7); | ||
1348 | ROUND(F, c, d, a, b, in[ 2] + K1, 11); | ||
1349 | ROUND(F, b, c, d, a, in[ 3] + K1, 19); | ||
1350 | ROUND(F, a, b, c, d, in[ 4] + K1, 3); | ||
1351 | ROUND(F, d, a, b, c, in[ 5] + K1, 7); | ||
1352 | ROUND(F, c, d, a, b, in[ 6] + K1, 11); | ||
1353 | ROUND(F, b, c, d, a, in[ 7] + K1, 19); | ||
1354 | ROUND(F, a, b, c, d, in[ 8] + K1, 3); | ||
1355 | ROUND(F, d, a, b, c, in[ 9] + K1, 7); | ||
1356 | ROUND(F, c, d, a, b, in[10] + K1, 11); | ||
1357 | ROUND(F, b, c, d, a, in[11] + K1, 19); | ||
1358 | |||
1359 | /* Round 2 */ | ||
1360 | ROUND(G, a, b, c, d, in[ 1] + K2, 3); | ||
1361 | ROUND(G, d, a, b, c, in[ 3] + K2, 5); | ||
1362 | ROUND(G, c, d, a, b, in[ 5] + K2, 9); | ||
1363 | ROUND(G, b, c, d, a, in[ 7] + K2, 13); | ||
1364 | ROUND(G, a, b, c, d, in[ 9] + K2, 3); | ||
1365 | ROUND(G, d, a, b, c, in[11] + K2, 5); | ||
1366 | ROUND(G, c, d, a, b, in[ 0] + K2, 9); | ||
1367 | ROUND(G, b, c, d, a, in[ 2] + K2, 13); | ||
1368 | ROUND(G, a, b, c, d, in[ 4] + K2, 3); | ||
1369 | ROUND(G, d, a, b, c, in[ 6] + K2, 5); | ||
1370 | ROUND(G, c, d, a, b, in[ 8] + K2, 9); | ||
1371 | ROUND(G, b, c, d, a, in[10] + K2, 13); | ||
1372 | |||
1373 | /* Round 3 */ | ||
1374 | ROUND(H, a, b, c, d, in[ 3] + K3, 3); | ||
1375 | ROUND(H, d, a, b, c, in[ 7] + K3, 9); | ||
1376 | ROUND(H, c, d, a, b, in[11] + K3, 11); | ||
1377 | ROUND(H, b, c, d, a, in[ 2] + K3, 15); | ||
1378 | ROUND(H, a, b, c, d, in[ 6] + K3, 3); | ||
1379 | ROUND(H, d, a, b, c, in[10] + K3, 9); | ||
1380 | ROUND(H, c, d, a, b, in[ 1] + K3, 11); | ||
1381 | ROUND(H, b, c, d, a, in[ 5] + K3, 15); | ||
1382 | ROUND(H, a, b, c, d, in[ 9] + K3, 3); | ||
1383 | ROUND(H, d, a, b, c, in[ 0] + K3, 9); | ||
1384 | ROUND(H, c, d, a, b, in[ 4] + K3, 11); | ||
1385 | ROUND(H, b, c, d, a, in[ 8] + K3, 15); | ||
1386 | |||
1387 | return buf[1] + b; /* "most hashed" word */ | ||
1388 | /* Alternative: return sum of all words? */ | ||
1389 | } | ||
1390 | #endif | ||
1391 | |||
1392 | #undef ROUND | ||
1393 | #undef F | ||
1394 | #undef G | ||
1395 | #undef H | ||
1396 | #undef K1 | ||
1397 | #undef K2 | ||
1398 | #undef K3 | ||
1399 | |||
1400 | /* This should not be decreased so low that ISNs wrap too fast. */ | ||
1401 | #define REKEY_INTERVAL (300 * HZ) | ||
1402 | /* | ||
1403 | * Bit layout of the tcp sequence numbers (before adding current time): | ||
1404 | * bit 24-31: increased after every key exchange | ||
1405 | * bit 0-23: hash(source,dest) | ||
1406 | * | ||
1407 | * The implementation is similar to the algorithm described | ||
1408 | * in the Appendix of RFC 1185, except that | ||
1409 | * - it uses a 1 MHz clock instead of a 250 kHz clock | ||
1410 | * - it performs a rekey every 5 minutes, which is equivalent | ||
1411 | * to a (source,dest) tulple dependent forward jump of the | ||
1412 | * clock by 0..2^(HASH_BITS+1) | ||
1413 | * | ||
1414 | * Thus the average ISN wraparound time is 68 minutes instead of | ||
1415 | * 4.55 hours. | ||
1416 | * | ||
1417 | * SMP cleanup and lock avoidance with poor man's RCU. | ||
1418 | * Manfred Spraul <manfred@colorfullife.com> | ||
1419 | * | ||
1420 | */ | ||
1421 | #define COUNT_BITS 8 | ||
1422 | #define COUNT_MASK ((1 << COUNT_BITS) - 1) | ||
1423 | #define HASH_BITS 24 | ||
1424 | #define HASH_MASK ((1 << HASH_BITS) - 1) | ||
1425 | 1304 | ||
1426 | static struct keydata { | 1305 | static int __init random_int_secret_init(void) |
1427 | __u32 count; /* already shifted to the final position */ | ||
1428 | __u32 secret[12]; | ||
1429 | } ____cacheline_aligned ip_keydata[2]; | ||
1430 | |||
1431 | static unsigned int ip_cnt; | ||
1432 | |||
1433 | static void rekey_seq_generator(struct work_struct *work); | ||
1434 | |||
1435 | static DECLARE_DELAYED_WORK(rekey_work, rekey_seq_generator); | ||
1436 | |||
1437 | /* | ||
1438 | * Lock avoidance: | ||
1439 | * The ISN generation runs lockless - it's just a hash over random data. | ||
1440 | * State changes happen every 5 minutes when the random key is replaced. | ||
1441 | * Synchronization is performed by having two copies of the hash function | ||
1442 | * state and rekey_seq_generator always updates the inactive copy. | ||
1443 | * The copy is then activated by updating ip_cnt. | ||
1444 | * The implementation breaks down if someone blocks the thread | ||
1445 | * that processes SYN requests for more than 5 minutes. Should never | ||
1446 | * happen, and even if that happens only a not perfectly compliant | ||
1447 | * ISN is generated, nothing fatal. | ||
1448 | */ | ||
1449 | static void rekey_seq_generator(struct work_struct *work) | ||
1450 | { | 1306 | { |
1451 | struct keydata *keyptr = &ip_keydata[1 ^ (ip_cnt & 1)]; | 1307 | get_random_bytes(random_int_secret, sizeof(random_int_secret)); |
1452 | |||
1453 | get_random_bytes(keyptr->secret, sizeof(keyptr->secret)); | ||
1454 | keyptr->count = (ip_cnt & COUNT_MASK) << HASH_BITS; | ||
1455 | smp_wmb(); | ||
1456 | ip_cnt++; | ||
1457 | schedule_delayed_work(&rekey_work, | ||
1458 | round_jiffies_relative(REKEY_INTERVAL)); | ||
1459 | } | ||
1460 | |||
1461 | static inline struct keydata *get_keyptr(void) | ||
1462 | { | ||
1463 | struct keydata *keyptr = &ip_keydata[ip_cnt & 1]; | ||
1464 | |||
1465 | smp_rmb(); | ||
1466 | |||
1467 | return keyptr; | ||
1468 | } | ||
1469 | |||
1470 | static __init int seqgen_init(void) | ||
1471 | { | ||
1472 | rekey_seq_generator(NULL); | ||
1473 | return 0; | 1308 | return 0; |
1474 | } | 1309 | } |
1475 | late_initcall(seqgen_init); | 1310 | late_initcall(random_int_secret_init); |
1476 | |||
1477 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
1478 | __u32 secure_tcpv6_sequence_number(__be32 *saddr, __be32 *daddr, | ||
1479 | __be16 sport, __be16 dport) | ||
1480 | { | ||
1481 | __u32 seq; | ||
1482 | __u32 hash[12]; | ||
1483 | struct keydata *keyptr = get_keyptr(); | ||
1484 | |||
1485 | /* The procedure is the same as for IPv4, but addresses are longer. | ||
1486 | * Thus we must use twothirdsMD4Transform. | ||
1487 | */ | ||
1488 | |||
1489 | memcpy(hash, saddr, 16); | ||
1490 | hash[4] = ((__force u16)sport << 16) + (__force u16)dport; | ||
1491 | memcpy(&hash[5], keyptr->secret, sizeof(__u32) * 7); | ||
1492 | |||
1493 | seq = twothirdsMD4Transform((const __u32 *)daddr, hash) & HASH_MASK; | ||
1494 | seq += keyptr->count; | ||
1495 | |||
1496 | seq += ktime_to_ns(ktime_get_real()); | ||
1497 | |||
1498 | return seq; | ||
1499 | } | ||
1500 | EXPORT_SYMBOL(secure_tcpv6_sequence_number); | ||
1501 | #endif | ||
1502 | |||
1503 | /* The code below is shamelessly stolen from secure_tcp_sequence_number(). | ||
1504 | * All blames to Andrey V. Savochkin <saw@msu.ru>. | ||
1505 | */ | ||
1506 | __u32 secure_ip_id(__be32 daddr) | ||
1507 | { | ||
1508 | struct keydata *keyptr; | ||
1509 | __u32 hash[4]; | ||
1510 | |||
1511 | keyptr = get_keyptr(); | ||
1512 | |||
1513 | /* | ||
1514 | * Pick a unique starting offset for each IP destination. | ||
1515 | * The dest ip address is placed in the starting vector, | ||
1516 | * which is then hashed with random data. | ||
1517 | */ | ||
1518 | hash[0] = (__force __u32)daddr; | ||
1519 | hash[1] = keyptr->secret[9]; | ||
1520 | hash[2] = keyptr->secret[10]; | ||
1521 | hash[3] = keyptr->secret[11]; | ||
1522 | |||
1523 | return half_md4_transform(hash, keyptr->secret); | ||
1524 | } | ||
1525 | |||
1526 | __u32 secure_ipv6_id(const __be32 daddr[4]) | ||
1527 | { | ||
1528 | const struct keydata *keyptr; | ||
1529 | __u32 hash[4]; | ||
1530 | |||
1531 | keyptr = get_keyptr(); | ||
1532 | |||
1533 | hash[0] = (__force __u32)daddr[0]; | ||
1534 | hash[1] = (__force __u32)daddr[1]; | ||
1535 | hash[2] = (__force __u32)daddr[2]; | ||
1536 | hash[3] = (__force __u32)daddr[3]; | ||
1537 | |||
1538 | return half_md4_transform(hash, keyptr->secret); | ||
1539 | } | ||
1540 | |||
1541 | #ifdef CONFIG_INET | ||
1542 | |||
1543 | __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr, | ||
1544 | __be16 sport, __be16 dport) | ||
1545 | { | ||
1546 | __u32 seq; | ||
1547 | __u32 hash[4]; | ||
1548 | struct keydata *keyptr = get_keyptr(); | ||
1549 | |||
1550 | /* | ||
1551 | * Pick a unique starting offset for each TCP connection endpoints | ||
1552 | * (saddr, daddr, sport, dport). | ||
1553 | * Note that the words are placed into the starting vector, which is | ||
1554 | * then mixed with a partial MD4 over random data. | ||
1555 | */ | ||
1556 | hash[0] = (__force u32)saddr; | ||
1557 | hash[1] = (__force u32)daddr; | ||
1558 | hash[2] = ((__force u16)sport << 16) + (__force u16)dport; | ||
1559 | hash[3] = keyptr->secret[11]; | ||
1560 | |||
1561 | seq = half_md4_transform(hash, keyptr->secret) & HASH_MASK; | ||
1562 | seq += keyptr->count; | ||
1563 | /* | ||
1564 | * As close as possible to RFC 793, which | ||
1565 | * suggests using a 250 kHz clock. | ||
1566 | * Further reading shows this assumes 2 Mb/s networks. | ||
1567 | * For 10 Mb/s Ethernet, a 1 MHz clock is appropriate. | ||
1568 | * For 10 Gb/s Ethernet, a 1 GHz clock should be ok, but | ||
1569 | * we also need to limit the resolution so that the u32 seq | ||
1570 | * overlaps less than one time per MSL (2 minutes). | ||
1571 | * Choosing a clock of 64 ns period is OK. (period of 274 s) | ||
1572 | */ | ||
1573 | seq += ktime_to_ns(ktime_get_real()) >> 6; | ||
1574 | |||
1575 | return seq; | ||
1576 | } | ||
1577 | |||
1578 | /* Generate secure starting point for ephemeral IPV4 transport port search */ | ||
1579 | u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport) | ||
1580 | { | ||
1581 | struct keydata *keyptr = get_keyptr(); | ||
1582 | u32 hash[4]; | ||
1583 | |||
1584 | /* | ||
1585 | * Pick a unique starting offset for each ephemeral port search | ||
1586 | * (saddr, daddr, dport) and 48bits of random data. | ||
1587 | */ | ||
1588 | hash[0] = (__force u32)saddr; | ||
1589 | hash[1] = (__force u32)daddr; | ||
1590 | hash[2] = (__force u32)dport ^ keyptr->secret[10]; | ||
1591 | hash[3] = keyptr->secret[11]; | ||
1592 | |||
1593 | return half_md4_transform(hash, keyptr->secret); | ||
1594 | } | ||
1595 | EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral); | ||
1596 | |||
1597 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
1598 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | ||
1599 | __be16 dport) | ||
1600 | { | ||
1601 | struct keydata *keyptr = get_keyptr(); | ||
1602 | u32 hash[12]; | ||
1603 | |||
1604 | memcpy(hash, saddr, 16); | ||
1605 | hash[4] = (__force u32)dport; | ||
1606 | memcpy(&hash[5], keyptr->secret, sizeof(__u32) * 7); | ||
1607 | |||
1608 | return twothirdsMD4Transform((const __u32 *)daddr, hash); | ||
1609 | } | ||
1610 | #endif | ||
1611 | |||
1612 | #if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE) | ||
1613 | /* Similar to secure_tcp_sequence_number but generate a 48 bit value | ||
1614 | * bit's 32-47 increase every key exchange | ||
1615 | * 0-31 hash(source, dest) | ||
1616 | */ | ||
1617 | u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, | ||
1618 | __be16 sport, __be16 dport) | ||
1619 | { | ||
1620 | u64 seq; | ||
1621 | __u32 hash[4]; | ||
1622 | struct keydata *keyptr = get_keyptr(); | ||
1623 | |||
1624 | hash[0] = (__force u32)saddr; | ||
1625 | hash[1] = (__force u32)daddr; | ||
1626 | hash[2] = ((__force u16)sport << 16) + (__force u16)dport; | ||
1627 | hash[3] = keyptr->secret[11]; | ||
1628 | |||
1629 | seq = half_md4_transform(hash, keyptr->secret); | ||
1630 | seq |= ((u64)keyptr->count) << (32 - HASH_BITS); | ||
1631 | |||
1632 | seq += ktime_to_ns(ktime_get_real()); | ||
1633 | seq &= (1ull << 48) - 1; | ||
1634 | |||
1635 | return seq; | ||
1636 | } | ||
1637 | EXPORT_SYMBOL(secure_dccp_sequence_number); | ||
1638 | #endif | ||
1639 | |||
1640 | #endif /* CONFIG_INET */ | ||
1641 | |||
1642 | 1311 | ||
1643 | /* | 1312 | /* |
1644 | * Get a random word for internal kernel use only. Similar to urandom but | 1313 | * Get a random word for internal kernel use only. Similar to urandom but |
@@ -1646,17 +1315,15 @@ EXPORT_SYMBOL(secure_dccp_sequence_number); | |||
1646 | * value is not cryptographically secure but for several uses the cost of | 1315 | * value is not cryptographically secure but for several uses the cost of |
1647 | * depleting entropy is too high | 1316 | * depleting entropy is too high |
1648 | */ | 1317 | */ |
1649 | DEFINE_PER_CPU(__u32 [4], get_random_int_hash); | 1318 | DEFINE_PER_CPU(__u32 [MD5_DIGEST_WORDS], get_random_int_hash); |
1650 | unsigned int get_random_int(void) | 1319 | unsigned int get_random_int(void) |
1651 | { | 1320 | { |
1652 | struct keydata *keyptr; | ||
1653 | __u32 *hash = get_cpu_var(get_random_int_hash); | 1321 | __u32 *hash = get_cpu_var(get_random_int_hash); |
1654 | int ret; | 1322 | unsigned int ret; |
1655 | 1323 | ||
1656 | keyptr = get_keyptr(); | ||
1657 | hash[0] += current->pid + jiffies + get_cycles(); | 1324 | hash[0] += current->pid + jiffies + get_cycles(); |
1658 | 1325 | md5_transform(hash, random_int_secret); | |
1659 | ret = half_md4_transform(hash, keyptr->secret); | 1326 | ret = hash[0]; |
1660 | put_cpu_var(get_random_int_hash); | 1327 | put_cpu_var(get_random_int_hash); |
1661 | 1328 | ||
1662 | return ret; | 1329 | return ret; |
diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index 3ee1fdb31ea7..e55814bc0d06 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c | |||
@@ -57,6 +57,7 @@ void proc_fork_connector(struct task_struct *task) | |||
57 | struct proc_event *ev; | 57 | struct proc_event *ev; |
58 | __u8 buffer[CN_PROC_MSG_SIZE]; | 58 | __u8 buffer[CN_PROC_MSG_SIZE]; |
59 | struct timespec ts; | 59 | struct timespec ts; |
60 | struct task_struct *parent; | ||
60 | 61 | ||
61 | if (atomic_read(&proc_event_num_listeners) < 1) | 62 | if (atomic_read(&proc_event_num_listeners) < 1) |
62 | return; | 63 | return; |
@@ -67,8 +68,11 @@ void proc_fork_connector(struct task_struct *task) | |||
67 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ | 68 | ktime_get_ts(&ts); /* get high res monotonic timestamp */ |
68 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); | 69 | put_unaligned(timespec_to_ns(&ts), (__u64 *)&ev->timestamp_ns); |
69 | ev->what = PROC_EVENT_FORK; | 70 | ev->what = PROC_EVENT_FORK; |
70 | ev->event_data.fork.parent_pid = task->real_parent->pid; | 71 | rcu_read_lock(); |
71 | ev->event_data.fork.parent_tgid = task->real_parent->tgid; | 72 | parent = rcu_dereference(task->real_parent); |
73 | ev->event_data.fork.parent_pid = parent->pid; | ||
74 | ev->event_data.fork.parent_tgid = parent->tgid; | ||
75 | rcu_read_unlock(); | ||
72 | ev->event_data.fork.child_pid = task->pid; | 76 | ev->event_data.fork.child_pid = task->pid; |
73 | ev->event_data.fork.child_tgid = task->tgid; | 77 | ev->event_data.fork.child_tgid = task->tgid; |
74 | 78 | ||
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 26374b2a55a2..b48967b499da 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
@@ -62,9 +62,9 @@ | |||
62 | #include <linux/slab.h> | 62 | #include <linux/slab.h> |
63 | 63 | ||
64 | static DEFINE_MUTEX(dma_list_mutex); | 64 | static DEFINE_MUTEX(dma_list_mutex); |
65 | static DEFINE_IDR(dma_idr); | ||
65 | static LIST_HEAD(dma_device_list); | 66 | static LIST_HEAD(dma_device_list); |
66 | static long dmaengine_ref_count; | 67 | static long dmaengine_ref_count; |
67 | static struct idr dma_idr; | ||
68 | 68 | ||
69 | /* --- sysfs implementation --- */ | 69 | /* --- sysfs implementation --- */ |
70 | 70 | ||
@@ -1050,8 +1050,6 @@ EXPORT_SYMBOL_GPL(dma_run_dependencies); | |||
1050 | 1050 | ||
1051 | static int __init dma_bus_init(void) | 1051 | static int __init dma_bus_init(void) |
1052 | { | 1052 | { |
1053 | idr_init(&dma_idr); | ||
1054 | mutex_init(&dma_list_mutex); | ||
1055 | return class_register(&dma_devclass); | 1053 | return class_register(&dma_devclass); |
1056 | } | 1054 | } |
1057 | arch_initcall(dma_bus_init); | 1055 | arch_initcall(dma_bus_init); |
diff --git a/drivers/dma/ioat/dma_v3.c b/drivers/dma/ioat/dma_v3.c index d845dc4b7103..f519c93a61e7 100644 --- a/drivers/dma/ioat/dma_v3.c +++ b/drivers/dma/ioat/dma_v3.c | |||
@@ -73,10 +73,10 @@ | |||
73 | /* provide a lookup table for setting the source address in the base or | 73 | /* provide a lookup table for setting the source address in the base or |
74 | * extended descriptor of an xor or pq descriptor | 74 | * extended descriptor of an xor or pq descriptor |
75 | */ | 75 | */ |
76 | static const u8 xor_idx_to_desc __read_mostly = 0xd0; | 76 | static const u8 xor_idx_to_desc = 0xe0; |
77 | static const u8 xor_idx_to_field[] __read_mostly = { 1, 4, 5, 6, 7, 0, 1, 2 }; | 77 | static const u8 xor_idx_to_field[] = { 1, 4, 5, 6, 7, 0, 1, 2 }; |
78 | static const u8 pq_idx_to_desc __read_mostly = 0xf8; | 78 | static const u8 pq_idx_to_desc = 0xf8; |
79 | static const u8 pq_idx_to_field[] __read_mostly = { 1, 4, 5, 0, 1, 2, 4, 5 }; | 79 | static const u8 pq_idx_to_field[] = { 1, 4, 5, 0, 1, 2, 4, 5 }; |
80 | 80 | ||
81 | static dma_addr_t xor_get_src(struct ioat_raw_descriptor *descs[2], int idx) | 81 | static dma_addr_t xor_get_src(struct ioat_raw_descriptor *descs[2], int idx) |
82 | { | 82 | { |
diff --git a/drivers/dma/ioat/pci.c b/drivers/dma/ioat/pci.c index fab37d1cf48d..5e3a40f79945 100644 --- a/drivers/dma/ioat/pci.c +++ b/drivers/dma/ioat/pci.c | |||
@@ -72,6 +72,17 @@ static struct pci_device_id ioat_pci_tbl[] = { | |||
72 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF8) }, | 72 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF8) }, |
73 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF9) }, | 73 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_JSF9) }, |
74 | 74 | ||
75 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB0) }, | ||
76 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB1) }, | ||
77 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB2) }, | ||
78 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB3) }, | ||
79 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB4) }, | ||
80 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB5) }, | ||
81 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB6) }, | ||
82 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB7) }, | ||
83 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB8) }, | ||
84 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB9) }, | ||
85 | |||
75 | { 0, } | 86 | { 0, } |
76 | }; | 87 | }; |
77 | MODULE_DEVICE_TABLE(pci, ioat_pci_tbl); | 88 | MODULE_DEVICE_TABLE(pci, ioat_pci_tbl); |
diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig index af1a17d42bd7..c422fead0855 100644 --- a/drivers/edac/Kconfig +++ b/drivers/edac/Kconfig | |||
@@ -41,7 +41,7 @@ config EDAC_DEBUG | |||
41 | 41 | ||
42 | config EDAC_DECODE_MCE | 42 | config EDAC_DECODE_MCE |
43 | tristate "Decode MCEs in human-readable form (only on AMD for now)" | 43 | tristate "Decode MCEs in human-readable form (only on AMD for now)" |
44 | depends on CPU_SUP_AMD && X86_MCE | 44 | depends on CPU_SUP_AMD && X86_MCE_AMD |
45 | default y | 45 | default y |
46 | ---help--- | 46 | ---help--- |
47 | Enable this option if you want to decode Machine Check Exceptions | 47 | Enable this option if you want to decode Machine Check Exceptions |
@@ -173,8 +173,7 @@ config EDAC_I5400 | |||
173 | 173 | ||
174 | config EDAC_I7CORE | 174 | config EDAC_I7CORE |
175 | tristate "Intel i7 Core (Nehalem) processors" | 175 | tristate "Intel i7 Core (Nehalem) processors" |
176 | depends on EDAC_MM_EDAC && PCI && X86 | 176 | depends on EDAC_MM_EDAC && PCI && X86 && X86_MCE_INTEL |
177 | select EDAC_MCE | ||
178 | help | 177 | help |
179 | Support for error detection and correction the Intel | 178 | Support for error detection and correction the Intel |
180 | i7 Core (Nehalem) Integrated Memory Controller that exists on | 179 | i7 Core (Nehalem) Integrated Memory Controller that exists on |
diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index 9d8c892d07c9..9d2668a50872 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c | |||
@@ -90,7 +90,6 @@ int drm_debugfs_create_files(struct drm_info_list *files, int count, | |||
90 | struct drm_device *dev = minor->dev; | 90 | struct drm_device *dev = minor->dev; |
91 | struct dentry *ent; | 91 | struct dentry *ent; |
92 | struct drm_info_node *tmp; | 92 | struct drm_info_node *tmp; |
93 | char name[64]; | ||
94 | int i, ret; | 93 | int i, ret; |
95 | 94 | ||
96 | for (i = 0; i < count; i++) { | 95 | for (i = 0; i < count; i++) { |
@@ -108,6 +107,9 @@ int drm_debugfs_create_files(struct drm_info_list *files, int count, | |||
108 | ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO, | 107 | ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO, |
109 | root, tmp, &drm_debugfs_fops); | 108 | root, tmp, &drm_debugfs_fops); |
110 | if (!ent) { | 109 | if (!ent) { |
110 | char name[64]; | ||
111 | strncpy(name, root->d_name.name, | ||
112 | min(root->d_name.len, 64U)); | ||
111 | DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s/%s\n", | 113 | DRM_ERROR("Cannot create /sys/kernel/debug/dri/%s/%s\n", |
112 | name, files[i].name); | 114 | name, files[i].name); |
113 | kfree(tmp); | 115 | kfree(tmp); |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 756af4d7ec74..7425e5c9bd75 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -127,6 +127,23 @@ static const u8 edid_header[] = { | |||
127 | 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 | 127 | 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 |
128 | }; | 128 | }; |
129 | 129 | ||
130 | /* | ||
131 | * Sanity check the header of the base EDID block. Return 8 if the header | ||
132 | * is perfect, down to 0 if it's totally wrong. | ||
133 | */ | ||
134 | int drm_edid_header_is_valid(const u8 *raw_edid) | ||
135 | { | ||
136 | int i, score = 0; | ||
137 | |||
138 | for (i = 0; i < sizeof(edid_header); i++) | ||
139 | if (raw_edid[i] == edid_header[i]) | ||
140 | score++; | ||
141 | |||
142 | return score; | ||
143 | } | ||
144 | EXPORT_SYMBOL(drm_edid_header_is_valid); | ||
145 | |||
146 | |||
130 | /* | 147 | /* |
131 | * Sanity check the EDID block (base or extension). Return 0 if the block | 148 | * Sanity check the EDID block (base or extension). Return 0 if the block |
132 | * doesn't check out, or 1 if it's valid. | 149 | * doesn't check out, or 1 if it's valid. |
@@ -139,12 +156,7 @@ drm_edid_block_valid(u8 *raw_edid) | |||
139 | struct edid *edid = (struct edid *)raw_edid; | 156 | struct edid *edid = (struct edid *)raw_edid; |
140 | 157 | ||
141 | if (raw_edid[0] == 0x00) { | 158 | if (raw_edid[0] == 0x00) { |
142 | int score = 0; | 159 | int score = drm_edid_header_is_valid(raw_edid); |
143 | |||
144 | for (i = 0; i < sizeof(edid_header); i++) | ||
145 | if (raw_edid[i] == edid_header[i]) | ||
146 | score++; | ||
147 | |||
148 | if (score == 8) ; | 160 | if (score == 8) ; |
149 | else if (score >= 6) { | 161 | else if (score >= 6) { |
150 | DRM_DEBUG("Fixing EDID header, your hardware may be failing\n"); | 162 | DRM_DEBUG("Fixing EDID header, your hardware may be failing\n"); |
@@ -1439,6 +1451,8 @@ EXPORT_SYMBOL(drm_detect_monitor_audio); | |||
1439 | static void drm_add_display_info(struct edid *edid, | 1451 | static void drm_add_display_info(struct edid *edid, |
1440 | struct drm_display_info *info) | 1452 | struct drm_display_info *info) |
1441 | { | 1453 | { |
1454 | u8 *edid_ext; | ||
1455 | |||
1442 | info->width_mm = edid->width_cm * 10; | 1456 | info->width_mm = edid->width_cm * 10; |
1443 | info->height_mm = edid->height_cm * 10; | 1457 | info->height_mm = edid->height_cm * 10; |
1444 | 1458 | ||
@@ -1483,6 +1497,13 @@ static void drm_add_display_info(struct edid *edid, | |||
1483 | info->color_formats = DRM_COLOR_FORMAT_YCRCB444; | 1497 | info->color_formats = DRM_COLOR_FORMAT_YCRCB444; |
1484 | if (info->color_formats & DRM_EDID_FEATURE_RGB_YCRCB422) | 1498 | if (info->color_formats & DRM_EDID_FEATURE_RGB_YCRCB422) |
1485 | info->color_formats = DRM_COLOR_FORMAT_YCRCB422; | 1499 | info->color_formats = DRM_COLOR_FORMAT_YCRCB422; |
1500 | |||
1501 | /* Get data from CEA blocks if present */ | ||
1502 | edid_ext = drm_find_cea_extension(edid); | ||
1503 | if (!edid_ext) | ||
1504 | return; | ||
1505 | |||
1506 | info->cea_rev = edid_ext[1]; | ||
1486 | } | 1507 | } |
1487 | 1508 | ||
1488 | /** | 1509 | /** |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index 2022a5c966bb..3830e9e478c0 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -291,11 +291,14 @@ static void drm_irq_vgaarb_nokms(void *cookie, bool state) | |||
291 | if (!dev->irq_enabled) | 291 | if (!dev->irq_enabled) |
292 | return; | 292 | return; |
293 | 293 | ||
294 | if (state) | 294 | if (state) { |
295 | dev->driver->irq_uninstall(dev); | 295 | if (dev->driver->irq_uninstall) |
296 | else { | 296 | dev->driver->irq_uninstall(dev); |
297 | dev->driver->irq_preinstall(dev); | 297 | } else { |
298 | dev->driver->irq_postinstall(dev); | 298 | if (dev->driver->irq_preinstall) |
299 | dev->driver->irq_preinstall(dev); | ||
300 | if (dev->driver->irq_postinstall) | ||
301 | dev->driver->irq_postinstall(dev); | ||
299 | } | 302 | } |
300 | } | 303 | } |
301 | 304 | ||
@@ -338,7 +341,8 @@ int drm_irq_install(struct drm_device *dev) | |||
338 | DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev)); | 341 | DRM_DEBUG("irq=%d\n", drm_dev_to_irq(dev)); |
339 | 342 | ||
340 | /* Before installing handler */ | 343 | /* Before installing handler */ |
341 | dev->driver->irq_preinstall(dev); | 344 | if (dev->driver->irq_preinstall) |
345 | dev->driver->irq_preinstall(dev); | ||
342 | 346 | ||
343 | /* Install handler */ | 347 | /* Install handler */ |
344 | if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED)) | 348 | if (drm_core_check_feature(dev, DRIVER_IRQ_SHARED)) |
@@ -363,11 +367,16 @@ int drm_irq_install(struct drm_device *dev) | |||
363 | vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL); | 367 | vga_client_register(dev->pdev, (void *)dev, drm_irq_vgaarb_nokms, NULL); |
364 | 368 | ||
365 | /* After installing handler */ | 369 | /* After installing handler */ |
366 | ret = dev->driver->irq_postinstall(dev); | 370 | if (dev->driver->irq_postinstall) |
371 | ret = dev->driver->irq_postinstall(dev); | ||
372 | |||
367 | if (ret < 0) { | 373 | if (ret < 0) { |
368 | mutex_lock(&dev->struct_mutex); | 374 | mutex_lock(&dev->struct_mutex); |
369 | dev->irq_enabled = 0; | 375 | dev->irq_enabled = 0; |
370 | mutex_unlock(&dev->struct_mutex); | 376 | mutex_unlock(&dev->struct_mutex); |
377 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
378 | vga_client_register(dev->pdev, NULL, NULL, NULL); | ||
379 | free_irq(drm_dev_to_irq(dev), dev); | ||
371 | } | 380 | } |
372 | 381 | ||
373 | return ret; | 382 | return ret; |
@@ -413,7 +422,8 @@ int drm_irq_uninstall(struct drm_device *dev) | |||
413 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 422 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
414 | vga_client_register(dev->pdev, NULL, NULL, NULL); | 423 | vga_client_register(dev->pdev, NULL, NULL, NULL); |
415 | 424 | ||
416 | dev->driver->irq_uninstall(dev); | 425 | if (dev->driver->irq_uninstall) |
426 | dev->driver->irq_uninstall(dev); | ||
417 | 427 | ||
418 | free_irq(drm_dev_to_irq(dev), dev); | 428 | free_irq(drm_dev_to_irq(dev), dev); |
419 | 429 | ||
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index e2662497d50f..a8ab6263e0d7 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -1338,6 +1338,155 @@ static const struct file_operations i915_wedged_fops = { | |||
1338 | .llseek = default_llseek, | 1338 | .llseek = default_llseek, |
1339 | }; | 1339 | }; |
1340 | 1340 | ||
1341 | static int | ||
1342 | i915_max_freq_open(struct inode *inode, | ||
1343 | struct file *filp) | ||
1344 | { | ||
1345 | filp->private_data = inode->i_private; | ||
1346 | return 0; | ||
1347 | } | ||
1348 | |||
1349 | static ssize_t | ||
1350 | i915_max_freq_read(struct file *filp, | ||
1351 | char __user *ubuf, | ||
1352 | size_t max, | ||
1353 | loff_t *ppos) | ||
1354 | { | ||
1355 | struct drm_device *dev = filp->private_data; | ||
1356 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
1357 | char buf[80]; | ||
1358 | int len; | ||
1359 | |||
1360 | len = snprintf(buf, sizeof (buf), | ||
1361 | "max freq: %d\n", dev_priv->max_delay * 50); | ||
1362 | |||
1363 | if (len > sizeof (buf)) | ||
1364 | len = sizeof (buf); | ||
1365 | |||
1366 | return simple_read_from_buffer(ubuf, max, ppos, buf, len); | ||
1367 | } | ||
1368 | |||
1369 | static ssize_t | ||
1370 | i915_max_freq_write(struct file *filp, | ||
1371 | const char __user *ubuf, | ||
1372 | size_t cnt, | ||
1373 | loff_t *ppos) | ||
1374 | { | ||
1375 | struct drm_device *dev = filp->private_data; | ||
1376 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1377 | char buf[20]; | ||
1378 | int val = 1; | ||
1379 | |||
1380 | if (cnt > 0) { | ||
1381 | if (cnt > sizeof (buf) - 1) | ||
1382 | return -EINVAL; | ||
1383 | |||
1384 | if (copy_from_user(buf, ubuf, cnt)) | ||
1385 | return -EFAULT; | ||
1386 | buf[cnt] = 0; | ||
1387 | |||
1388 | val = simple_strtoul(buf, NULL, 0); | ||
1389 | } | ||
1390 | |||
1391 | DRM_DEBUG_DRIVER("Manually setting max freq to %d\n", val); | ||
1392 | |||
1393 | /* | ||
1394 | * Turbo will still be enabled, but won't go above the set value. | ||
1395 | */ | ||
1396 | dev_priv->max_delay = val / 50; | ||
1397 | |||
1398 | gen6_set_rps(dev, val / 50); | ||
1399 | |||
1400 | return cnt; | ||
1401 | } | ||
1402 | |||
1403 | static const struct file_operations i915_max_freq_fops = { | ||
1404 | .owner = THIS_MODULE, | ||
1405 | .open = i915_max_freq_open, | ||
1406 | .read = i915_max_freq_read, | ||
1407 | .write = i915_max_freq_write, | ||
1408 | .llseek = default_llseek, | ||
1409 | }; | ||
1410 | |||
1411 | static int | ||
1412 | i915_cache_sharing_open(struct inode *inode, | ||
1413 | struct file *filp) | ||
1414 | { | ||
1415 | filp->private_data = inode->i_private; | ||
1416 | return 0; | ||
1417 | } | ||
1418 | |||
1419 | static ssize_t | ||
1420 | i915_cache_sharing_read(struct file *filp, | ||
1421 | char __user *ubuf, | ||
1422 | size_t max, | ||
1423 | loff_t *ppos) | ||
1424 | { | ||
1425 | struct drm_device *dev = filp->private_data; | ||
1426 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
1427 | char buf[80]; | ||
1428 | u32 snpcr; | ||
1429 | int len; | ||
1430 | |||
1431 | mutex_lock(&dev_priv->dev->struct_mutex); | ||
1432 | snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); | ||
1433 | mutex_unlock(&dev_priv->dev->struct_mutex); | ||
1434 | |||
1435 | len = snprintf(buf, sizeof (buf), | ||
1436 | "%d\n", (snpcr & GEN6_MBC_SNPCR_MASK) >> | ||
1437 | GEN6_MBC_SNPCR_SHIFT); | ||
1438 | |||
1439 | if (len > sizeof (buf)) | ||
1440 | len = sizeof (buf); | ||
1441 | |||
1442 | return simple_read_from_buffer(ubuf, max, ppos, buf, len); | ||
1443 | } | ||
1444 | |||
1445 | static ssize_t | ||
1446 | i915_cache_sharing_write(struct file *filp, | ||
1447 | const char __user *ubuf, | ||
1448 | size_t cnt, | ||
1449 | loff_t *ppos) | ||
1450 | { | ||
1451 | struct drm_device *dev = filp->private_data; | ||
1452 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1453 | char buf[20]; | ||
1454 | u32 snpcr; | ||
1455 | int val = 1; | ||
1456 | |||
1457 | if (cnt > 0) { | ||
1458 | if (cnt > sizeof (buf) - 1) | ||
1459 | return -EINVAL; | ||
1460 | |||
1461 | if (copy_from_user(buf, ubuf, cnt)) | ||
1462 | return -EFAULT; | ||
1463 | buf[cnt] = 0; | ||
1464 | |||
1465 | val = simple_strtoul(buf, NULL, 0); | ||
1466 | } | ||
1467 | |||
1468 | if (val < 0 || val > 3) | ||
1469 | return -EINVAL; | ||
1470 | |||
1471 | DRM_DEBUG_DRIVER("Manually setting uncore sharing to %d\n", val); | ||
1472 | |||
1473 | /* Update the cache sharing policy here as well */ | ||
1474 | snpcr = I915_READ(GEN6_MBCUNIT_SNPCR); | ||
1475 | snpcr &= ~GEN6_MBC_SNPCR_MASK; | ||
1476 | snpcr |= (val << GEN6_MBC_SNPCR_SHIFT); | ||
1477 | I915_WRITE(GEN6_MBCUNIT_SNPCR, snpcr); | ||
1478 | |||
1479 | return cnt; | ||
1480 | } | ||
1481 | |||
1482 | static const struct file_operations i915_cache_sharing_fops = { | ||
1483 | .owner = THIS_MODULE, | ||
1484 | .open = i915_cache_sharing_open, | ||
1485 | .read = i915_cache_sharing_read, | ||
1486 | .write = i915_cache_sharing_write, | ||
1487 | .llseek = default_llseek, | ||
1488 | }; | ||
1489 | |||
1341 | /* As the drm_debugfs_init() routines are called before dev->dev_private is | 1490 | /* As the drm_debugfs_init() routines are called before dev->dev_private is |
1342 | * allocated we need to hook into the minor for release. */ | 1491 | * allocated we need to hook into the minor for release. */ |
1343 | static int | 1492 | static int |
@@ -1437,6 +1586,36 @@ static int i915_forcewake_create(struct dentry *root, struct drm_minor *minor) | |||
1437 | return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops); | 1586 | return drm_add_fake_info_node(minor, ent, &i915_forcewake_fops); |
1438 | } | 1587 | } |
1439 | 1588 | ||
1589 | static int i915_max_freq_create(struct dentry *root, struct drm_minor *minor) | ||
1590 | { | ||
1591 | struct drm_device *dev = minor->dev; | ||
1592 | struct dentry *ent; | ||
1593 | |||
1594 | ent = debugfs_create_file("i915_max_freq", | ||
1595 | S_IRUGO | S_IWUSR, | ||
1596 | root, dev, | ||
1597 | &i915_max_freq_fops); | ||
1598 | if (IS_ERR(ent)) | ||
1599 | return PTR_ERR(ent); | ||
1600 | |||
1601 | return drm_add_fake_info_node(minor, ent, &i915_max_freq_fops); | ||
1602 | } | ||
1603 | |||
1604 | static int i915_cache_sharing_create(struct dentry *root, struct drm_minor *minor) | ||
1605 | { | ||
1606 | struct drm_device *dev = minor->dev; | ||
1607 | struct dentry *ent; | ||
1608 | |||
1609 | ent = debugfs_create_file("i915_cache_sharing", | ||
1610 | S_IRUGO | S_IWUSR, | ||
1611 | root, dev, | ||
1612 | &i915_cache_sharing_fops); | ||
1613 | if (IS_ERR(ent)) | ||
1614 | return PTR_ERR(ent); | ||
1615 | |||
1616 | return drm_add_fake_info_node(minor, ent, &i915_cache_sharing_fops); | ||
1617 | } | ||
1618 | |||
1440 | static struct drm_info_list i915_debugfs_list[] = { | 1619 | static struct drm_info_list i915_debugfs_list[] = { |
1441 | {"i915_capabilities", i915_capabilities, 0}, | 1620 | {"i915_capabilities", i915_capabilities, 0}, |
1442 | {"i915_gem_objects", i915_gem_object_info, 0}, | 1621 | {"i915_gem_objects", i915_gem_object_info, 0}, |
@@ -1490,6 +1669,12 @@ int i915_debugfs_init(struct drm_minor *minor) | |||
1490 | ret = i915_forcewake_create(minor->debugfs_root, minor); | 1669 | ret = i915_forcewake_create(minor->debugfs_root, minor); |
1491 | if (ret) | 1670 | if (ret) |
1492 | return ret; | 1671 | return ret; |
1672 | ret = i915_max_freq_create(minor->debugfs_root, minor); | ||
1673 | if (ret) | ||
1674 | return ret; | ||
1675 | ret = i915_cache_sharing_create(minor->debugfs_root, minor); | ||
1676 | if (ret) | ||
1677 | return ret; | ||
1493 | 1678 | ||
1494 | return drm_debugfs_create_files(i915_debugfs_list, | 1679 | return drm_debugfs_create_files(i915_debugfs_list, |
1495 | I915_DEBUGFS_ENTRIES, | 1680 | I915_DEBUGFS_ENTRIES, |
@@ -1504,6 +1689,10 @@ void i915_debugfs_cleanup(struct drm_minor *minor) | |||
1504 | 1, minor); | 1689 | 1, minor); |
1505 | drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops, | 1690 | drm_debugfs_remove_files((struct drm_info_list *) &i915_wedged_fops, |
1506 | 1, minor); | 1691 | 1, minor); |
1692 | drm_debugfs_remove_files((struct drm_info_list *) &i915_max_freq_fops, | ||
1693 | 1, minor); | ||
1694 | drm_debugfs_remove_files((struct drm_info_list *) &i915_cache_sharing_fops, | ||
1695 | 1, minor); | ||
1507 | } | 1696 | } |
1508 | 1697 | ||
1509 | #endif /* CONFIG_DEBUG_FS */ | 1698 | #endif /* CONFIG_DEBUG_FS */ |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 12712824a6d2..8a3942c4f099 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -61,7 +61,6 @@ static void i915_write_hws_pga(struct drm_device *dev) | |||
61 | static int i915_init_phys_hws(struct drm_device *dev) | 61 | static int i915_init_phys_hws(struct drm_device *dev) |
62 | { | 62 | { |
63 | drm_i915_private_t *dev_priv = dev->dev_private; | 63 | drm_i915_private_t *dev_priv = dev->dev_private; |
64 | struct intel_ring_buffer *ring = LP_RING(dev_priv); | ||
65 | 64 | ||
66 | /* Program Hardware Status Page */ | 65 | /* Program Hardware Status Page */ |
67 | dev_priv->status_page_dmah = | 66 | dev_priv->status_page_dmah = |
@@ -71,10 +70,9 @@ static int i915_init_phys_hws(struct drm_device *dev) | |||
71 | DRM_ERROR("Can not allocate hardware status page\n"); | 70 | DRM_ERROR("Can not allocate hardware status page\n"); |
72 | return -ENOMEM; | 71 | return -ENOMEM; |
73 | } | 72 | } |
74 | ring->status_page.page_addr = | ||
75 | (void __force __iomem *)dev_priv->status_page_dmah->vaddr; | ||
76 | 73 | ||
77 | memset_io(ring->status_page.page_addr, 0, PAGE_SIZE); | 74 | memset_io((void __force __iomem *)dev_priv->status_page_dmah->vaddr, |
75 | 0, PAGE_SIZE); | ||
78 | 76 | ||
79 | i915_write_hws_pga(dev); | 77 | i915_write_hws_pga(dev); |
80 | 78 | ||
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 6867e193d85e..feb4f164fd1b 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -544,6 +544,7 @@ typedef struct drm_i915_private { | |||
544 | u32 savePIPEB_LINK_M1; | 544 | u32 savePIPEB_LINK_M1; |
545 | u32 savePIPEB_LINK_N1; | 545 | u32 savePIPEB_LINK_N1; |
546 | u32 saveMCHBAR_RENDER_STANDBY; | 546 | u32 saveMCHBAR_RENDER_STANDBY; |
547 | u32 savePCH_PORT_HOTPLUG; | ||
547 | 548 | ||
548 | struct { | 549 | struct { |
549 | /** Bridge to intel-gtt-ko */ | 550 | /** Bridge to intel-gtt-ko */ |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index d1cd8b89f47d..a546a71fb060 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -3112,7 +3112,7 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj, | |||
3112 | 3112 | ||
3113 | if (pipelined != obj->ring) { | 3113 | if (pipelined != obj->ring) { |
3114 | ret = i915_gem_object_wait_rendering(obj); | 3114 | ret = i915_gem_object_wait_rendering(obj); |
3115 | if (ret) | 3115 | if (ret == -ERESTARTSYS) |
3116 | return ret; | 3116 | return ret; |
3117 | } | 3117 | } |
3118 | 3118 | ||
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 23d1ae67d279..02f96fd0d52d 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -306,12 +306,15 @@ static void i915_hotplug_work_func(struct work_struct *work) | |||
306 | struct drm_mode_config *mode_config = &dev->mode_config; | 306 | struct drm_mode_config *mode_config = &dev->mode_config; |
307 | struct intel_encoder *encoder; | 307 | struct intel_encoder *encoder; |
308 | 308 | ||
309 | mutex_lock(&mode_config->mutex); | ||
309 | DRM_DEBUG_KMS("running encoder hotplug functions\n"); | 310 | DRM_DEBUG_KMS("running encoder hotplug functions\n"); |
310 | 311 | ||
311 | list_for_each_entry(encoder, &mode_config->encoder_list, base.head) | 312 | list_for_each_entry(encoder, &mode_config->encoder_list, base.head) |
312 | if (encoder->hot_plug) | 313 | if (encoder->hot_plug) |
313 | encoder->hot_plug(encoder); | 314 | encoder->hot_plug(encoder); |
314 | 315 | ||
316 | mutex_unlock(&mode_config->mutex); | ||
317 | |||
315 | /* Just fire off a uevent and let userspace tell us what to do */ | 318 | /* Just fire off a uevent and let userspace tell us what to do */ |
316 | drm_helper_hpd_irq_event(dev); | 319 | drm_helper_hpd_irq_event(dev); |
317 | } | 320 | } |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 02db299f621a..d1331f771e2f 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -78,6 +78,14 @@ | |||
78 | #define GRDOM_RENDER (1<<2) | 78 | #define GRDOM_RENDER (1<<2) |
79 | #define GRDOM_MEDIA (3<<2) | 79 | #define GRDOM_MEDIA (3<<2) |
80 | 80 | ||
81 | #define GEN6_MBCUNIT_SNPCR 0x900c /* for LLC config */ | ||
82 | #define GEN6_MBC_SNPCR_SHIFT 21 | ||
83 | #define GEN6_MBC_SNPCR_MASK (3<<21) | ||
84 | #define GEN6_MBC_SNPCR_MAX (0<<21) | ||
85 | #define GEN6_MBC_SNPCR_MED (1<<21) | ||
86 | #define GEN6_MBC_SNPCR_LOW (2<<21) | ||
87 | #define GEN6_MBC_SNPCR_MIN (3<<21) /* only 1/16th of the cache is shared */ | ||
88 | |||
81 | #define GEN6_GDRST 0x941c | 89 | #define GEN6_GDRST 0x941c |
82 | #define GEN6_GRDOM_FULL (1 << 0) | 90 | #define GEN6_GRDOM_FULL (1 << 0) |
83 | #define GEN6_GRDOM_RENDER (1 << 1) | 91 | #define GEN6_GRDOM_RENDER (1 << 1) |
@@ -1506,6 +1514,7 @@ | |||
1506 | #define VIDEO_DIP_SELECT_AVI (0 << 19) | 1514 | #define VIDEO_DIP_SELECT_AVI (0 << 19) |
1507 | #define VIDEO_DIP_SELECT_VENDOR (1 << 19) | 1515 | #define VIDEO_DIP_SELECT_VENDOR (1 << 19) |
1508 | #define VIDEO_DIP_SELECT_SPD (3 << 19) | 1516 | #define VIDEO_DIP_SELECT_SPD (3 << 19) |
1517 | #define VIDEO_DIP_SELECT_MASK (3 << 19) | ||
1509 | #define VIDEO_DIP_FREQ_ONCE (0 << 16) | 1518 | #define VIDEO_DIP_FREQ_ONCE (0 << 16) |
1510 | #define VIDEO_DIP_FREQ_VSYNC (1 << 16) | 1519 | #define VIDEO_DIP_FREQ_VSYNC (1 << 16) |
1511 | #define VIDEO_DIP_FREQ_2VSYNC (2 << 16) | 1520 | #define VIDEO_DIP_FREQ_2VSYNC (2 << 16) |
@@ -2084,9 +2093,6 @@ | |||
2084 | #define DP_PIPEB_SELECT (1 << 30) | 2093 | #define DP_PIPEB_SELECT (1 << 30) |
2085 | #define DP_PIPE_MASK (1 << 30) | 2094 | #define DP_PIPE_MASK (1 << 30) |
2086 | 2095 | ||
2087 | #define DP_PIPE_ENABLED(V, P) \ | ||
2088 | (((V) & (DP_PIPE_MASK | DP_PORT_EN)) == ((P) << 30 | DP_PORT_EN)) | ||
2089 | |||
2090 | /* Link training mode - select a suitable mode for each stage */ | 2096 | /* Link training mode - select a suitable mode for each stage */ |
2091 | #define DP_LINK_TRAIN_PAT_1 (0 << 28) | 2097 | #define DP_LINK_TRAIN_PAT_1 (0 << 28) |
2092 | #define DP_LINK_TRAIN_PAT_2 (1 << 28) | 2098 | #define DP_LINK_TRAIN_PAT_2 (1 << 28) |
@@ -3024,6 +3030,20 @@ | |||
3024 | #define _TRANSA_DP_LINK_M2 0xe0048 | 3030 | #define _TRANSA_DP_LINK_M2 0xe0048 |
3025 | #define _TRANSA_DP_LINK_N2 0xe004c | 3031 | #define _TRANSA_DP_LINK_N2 0xe004c |
3026 | 3032 | ||
3033 | /* Per-transcoder DIP controls */ | ||
3034 | |||
3035 | #define _VIDEO_DIP_CTL_A 0xe0200 | ||
3036 | #define _VIDEO_DIP_DATA_A 0xe0208 | ||
3037 | #define _VIDEO_DIP_GCP_A 0xe0210 | ||
3038 | |||
3039 | #define _VIDEO_DIP_CTL_B 0xe1200 | ||
3040 | #define _VIDEO_DIP_DATA_B 0xe1208 | ||
3041 | #define _VIDEO_DIP_GCP_B 0xe1210 | ||
3042 | |||
3043 | #define TVIDEO_DIP_CTL(pipe) _PIPE(pipe, _VIDEO_DIP_CTL_A, _VIDEO_DIP_CTL_B) | ||
3044 | #define TVIDEO_DIP_DATA(pipe) _PIPE(pipe, _VIDEO_DIP_DATA_A, _VIDEO_DIP_DATA_B) | ||
3045 | #define TVIDEO_DIP_GCP(pipe) _PIPE(pipe, _VIDEO_DIP_GCP_A, _VIDEO_DIP_GCP_B) | ||
3046 | |||
3027 | #define _TRANS_HTOTAL_B 0xe1000 | 3047 | #define _TRANS_HTOTAL_B 0xe1000 |
3028 | #define _TRANS_HBLANK_B 0xe1004 | 3048 | #define _TRANS_HBLANK_B 0xe1004 |
3029 | #define _TRANS_HSYNC_B 0xe1008 | 3049 | #define _TRANS_HSYNC_B 0xe1008 |
@@ -3076,6 +3096,16 @@ | |||
3076 | #define TRANS_6BPC (2<<5) | 3096 | #define TRANS_6BPC (2<<5) |
3077 | #define TRANS_12BPC (3<<5) | 3097 | #define TRANS_12BPC (3<<5) |
3078 | 3098 | ||
3099 | #define _TRANSA_CHICKEN2 0xf0064 | ||
3100 | #define _TRANSB_CHICKEN2 0xf1064 | ||
3101 | #define TRANS_CHICKEN2(pipe) _PIPE(pipe, _TRANSA_CHICKEN2, _TRANSB_CHICKEN2) | ||
3102 | #define TRANS_AUTOTRAIN_GEN_STALL_DIS (1<<31) | ||
3103 | |||
3104 | #define SOUTH_CHICKEN1 0xc2000 | ||
3105 | #define FDIA_PHASE_SYNC_SHIFT_OVR 19 | ||
3106 | #define FDIA_PHASE_SYNC_SHIFT_EN 18 | ||
3107 | #define FDI_PHASE_SYNC_OVR(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_OVR - ((pipe) * 2))) | ||
3108 | #define FDI_PHASE_SYNC_EN(pipe) (1<<(FDIA_PHASE_SYNC_SHIFT_EN - ((pipe) * 2))) | ||
3079 | #define SOUTH_CHICKEN2 0xc2004 | 3109 | #define SOUTH_CHICKEN2 0xc2004 |
3080 | #define DPLS_EDP_PPS_FIX_DIS (1<<0) | 3110 | #define DPLS_EDP_PPS_FIX_DIS (1<<0) |
3081 | 3111 | ||
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index 285758603ac8..87677d60d0df 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
@@ -812,6 +812,7 @@ int i915_save_state(struct drm_device *dev) | |||
812 | dev_priv->saveFDI_RXB_IMR = I915_READ(_FDI_RXB_IMR); | 812 | dev_priv->saveFDI_RXB_IMR = I915_READ(_FDI_RXB_IMR); |
813 | dev_priv->saveMCHBAR_RENDER_STANDBY = | 813 | dev_priv->saveMCHBAR_RENDER_STANDBY = |
814 | I915_READ(RSTDBYCTL); | 814 | I915_READ(RSTDBYCTL); |
815 | dev_priv->savePCH_PORT_HOTPLUG = I915_READ(PCH_PORT_HOTPLUG); | ||
815 | } else { | 816 | } else { |
816 | dev_priv->saveIER = I915_READ(IER); | 817 | dev_priv->saveIER = I915_READ(IER); |
817 | dev_priv->saveIMR = I915_READ(IMR); | 818 | dev_priv->saveIMR = I915_READ(IMR); |
@@ -863,6 +864,7 @@ int i915_restore_state(struct drm_device *dev) | |||
863 | I915_WRITE(GTIMR, dev_priv->saveGTIMR); | 864 | I915_WRITE(GTIMR, dev_priv->saveGTIMR); |
864 | I915_WRITE(_FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); | 865 | I915_WRITE(_FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); |
865 | I915_WRITE(_FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); | 866 | I915_WRITE(_FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); |
867 | I915_WRITE(PCH_PORT_HOTPLUG, dev_priv->savePCH_PORT_HOTPLUG); | ||
866 | } else { | 868 | } else { |
867 | I915_WRITE(IER, dev_priv->saveIER); | 869 | I915_WRITE(IER, dev_priv->saveIER); |
868 | I915_WRITE(IMR, dev_priv->saveIMR); | 870 | I915_WRITE(IMR, dev_priv->saveIMR); |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 393a39922e53..35364e68a091 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -980,11 +980,29 @@ static void assert_transcoder_disabled(struct drm_i915_private *dev_priv, | |||
980 | pipe_name(pipe)); | 980 | pipe_name(pipe)); |
981 | } | 981 | } |
982 | 982 | ||
983 | static bool dp_pipe_enabled(struct drm_i915_private *dev_priv, enum pipe pipe, | ||
984 | int reg, u32 port_sel, u32 val) | ||
985 | { | ||
986 | if ((val & DP_PORT_EN) == 0) | ||
987 | return false; | ||
988 | |||
989 | if (HAS_PCH_CPT(dev_priv->dev)) { | ||
990 | u32 trans_dp_ctl_reg = TRANS_DP_CTL(pipe); | ||
991 | u32 trans_dp_ctl = I915_READ(trans_dp_ctl_reg); | ||
992 | if ((trans_dp_ctl & TRANS_DP_PORT_SEL_MASK) != port_sel) | ||
993 | return false; | ||
994 | } else { | ||
995 | if ((val & DP_PIPE_MASK) != (pipe << 30)) | ||
996 | return false; | ||
997 | } | ||
998 | return true; | ||
999 | } | ||
1000 | |||
983 | static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv, | 1001 | static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv, |
984 | enum pipe pipe, int reg) | 1002 | enum pipe pipe, int reg, u32 port_sel) |
985 | { | 1003 | { |
986 | u32 val = I915_READ(reg); | 1004 | u32 val = I915_READ(reg); |
987 | WARN(DP_PIPE_ENABLED(val, pipe), | 1005 | WARN(dp_pipe_enabled(dev_priv, pipe, reg, port_sel, val), |
988 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", | 1006 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", |
989 | reg, pipe_name(pipe)); | 1007 | reg, pipe_name(pipe)); |
990 | } | 1008 | } |
@@ -1004,9 +1022,9 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv, | |||
1004 | int reg; | 1022 | int reg; |
1005 | u32 val; | 1023 | u32 val; |
1006 | 1024 | ||
1007 | assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_B); | 1025 | assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_B, TRANS_DP_PORT_SEL_B); |
1008 | assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_C); | 1026 | assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_C, TRANS_DP_PORT_SEL_C); |
1009 | assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_D); | 1027 | assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_D, TRANS_DP_PORT_SEL_D); |
1010 | 1028 | ||
1011 | reg = PCH_ADPA; | 1029 | reg = PCH_ADPA; |
1012 | val = I915_READ(reg); | 1030 | val = I915_READ(reg); |
@@ -1276,6 +1294,17 @@ static void intel_disable_pipe(struct drm_i915_private *dev_priv, | |||
1276 | intel_wait_for_pipe_off(dev_priv->dev, pipe); | 1294 | intel_wait_for_pipe_off(dev_priv->dev, pipe); |
1277 | } | 1295 | } |
1278 | 1296 | ||
1297 | /* | ||
1298 | * Plane regs are double buffered, going from enabled->disabled needs a | ||
1299 | * trigger in order to latch. The display address reg provides this. | ||
1300 | */ | ||
1301 | static void intel_flush_display_plane(struct drm_i915_private *dev_priv, | ||
1302 | enum plane plane) | ||
1303 | { | ||
1304 | I915_WRITE(DSPADDR(plane), I915_READ(DSPADDR(plane))); | ||
1305 | I915_WRITE(DSPSURF(plane), I915_READ(DSPSURF(plane))); | ||
1306 | } | ||
1307 | |||
1279 | /** | 1308 | /** |
1280 | * intel_enable_plane - enable a display plane on a given pipe | 1309 | * intel_enable_plane - enable a display plane on a given pipe |
1281 | * @dev_priv: i915 private structure | 1310 | * @dev_priv: i915 private structure |
@@ -1299,20 +1328,10 @@ static void intel_enable_plane(struct drm_i915_private *dev_priv, | |||
1299 | return; | 1328 | return; |
1300 | 1329 | ||
1301 | I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE); | 1330 | I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE); |
1331 | intel_flush_display_plane(dev_priv, plane); | ||
1302 | intel_wait_for_vblank(dev_priv->dev, pipe); | 1332 | intel_wait_for_vblank(dev_priv->dev, pipe); |
1303 | } | 1333 | } |
1304 | 1334 | ||
1305 | /* | ||
1306 | * Plane regs are double buffered, going from enabled->disabled needs a | ||
1307 | * trigger in order to latch. The display address reg provides this. | ||
1308 | */ | ||
1309 | static void intel_flush_display_plane(struct drm_i915_private *dev_priv, | ||
1310 | enum plane plane) | ||
1311 | { | ||
1312 | u32 reg = DSPADDR(plane); | ||
1313 | I915_WRITE(reg, I915_READ(reg)); | ||
1314 | } | ||
1315 | |||
1316 | /** | 1335 | /** |
1317 | * intel_disable_plane - disable a display plane | 1336 | * intel_disable_plane - disable a display plane |
1318 | * @dev_priv: i915 private structure | 1337 | * @dev_priv: i915 private structure |
@@ -1338,19 +1357,24 @@ static void intel_disable_plane(struct drm_i915_private *dev_priv, | |||
1338 | } | 1357 | } |
1339 | 1358 | ||
1340 | static void disable_pch_dp(struct drm_i915_private *dev_priv, | 1359 | static void disable_pch_dp(struct drm_i915_private *dev_priv, |
1341 | enum pipe pipe, int reg) | 1360 | enum pipe pipe, int reg, u32 port_sel) |
1342 | { | 1361 | { |
1343 | u32 val = I915_READ(reg); | 1362 | u32 val = I915_READ(reg); |
1344 | if (DP_PIPE_ENABLED(val, pipe)) | 1363 | if (dp_pipe_enabled(dev_priv, pipe, reg, port_sel, val)) { |
1364 | DRM_DEBUG_KMS("Disabling pch dp %x on pipe %d\n", reg, pipe); | ||
1345 | I915_WRITE(reg, val & ~DP_PORT_EN); | 1365 | I915_WRITE(reg, val & ~DP_PORT_EN); |
1366 | } | ||
1346 | } | 1367 | } |
1347 | 1368 | ||
1348 | static void disable_pch_hdmi(struct drm_i915_private *dev_priv, | 1369 | static void disable_pch_hdmi(struct drm_i915_private *dev_priv, |
1349 | enum pipe pipe, int reg) | 1370 | enum pipe pipe, int reg) |
1350 | { | 1371 | { |
1351 | u32 val = I915_READ(reg); | 1372 | u32 val = I915_READ(reg); |
1352 | if (HDMI_PIPE_ENABLED(val, pipe)) | 1373 | if (HDMI_PIPE_ENABLED(val, pipe)) { |
1374 | DRM_DEBUG_KMS("Disabling pch HDMI %x on pipe %d\n", | ||
1375 | reg, pipe); | ||
1353 | I915_WRITE(reg, val & ~PORT_ENABLE); | 1376 | I915_WRITE(reg, val & ~PORT_ENABLE); |
1377 | } | ||
1354 | } | 1378 | } |
1355 | 1379 | ||
1356 | /* Disable any ports connected to this transcoder */ | 1380 | /* Disable any ports connected to this transcoder */ |
@@ -1362,9 +1386,9 @@ static void intel_disable_pch_ports(struct drm_i915_private *dev_priv, | |||
1362 | val = I915_READ(PCH_PP_CONTROL); | 1386 | val = I915_READ(PCH_PP_CONTROL); |
1363 | I915_WRITE(PCH_PP_CONTROL, val | PANEL_UNLOCK_REGS); | 1387 | I915_WRITE(PCH_PP_CONTROL, val | PANEL_UNLOCK_REGS); |
1364 | 1388 | ||
1365 | disable_pch_dp(dev_priv, pipe, PCH_DP_B); | 1389 | disable_pch_dp(dev_priv, pipe, PCH_DP_B, TRANS_DP_PORT_SEL_B); |
1366 | disable_pch_dp(dev_priv, pipe, PCH_DP_C); | 1390 | disable_pch_dp(dev_priv, pipe, PCH_DP_C, TRANS_DP_PORT_SEL_C); |
1367 | disable_pch_dp(dev_priv, pipe, PCH_DP_D); | 1391 | disable_pch_dp(dev_priv, pipe, PCH_DP_D, TRANS_DP_PORT_SEL_D); |
1368 | 1392 | ||
1369 | reg = PCH_ADPA; | 1393 | reg = PCH_ADPA; |
1370 | val = I915_READ(reg); | 1394 | val = I915_READ(reg); |
@@ -2096,7 +2120,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
2096 | 2120 | ||
2097 | /* no fb bound */ | 2121 | /* no fb bound */ |
2098 | if (!crtc->fb) { | 2122 | if (!crtc->fb) { |
2099 | DRM_DEBUG_KMS("No FB bound\n"); | 2123 | DRM_ERROR("No FB bound\n"); |
2100 | return 0; | 2124 | return 0; |
2101 | } | 2125 | } |
2102 | 2126 | ||
@@ -2105,6 +2129,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
2105 | case 1: | 2129 | case 1: |
2106 | break; | 2130 | break; |
2107 | default: | 2131 | default: |
2132 | DRM_ERROR("no plane for crtc\n"); | ||
2108 | return -EINVAL; | 2133 | return -EINVAL; |
2109 | } | 2134 | } |
2110 | 2135 | ||
@@ -2114,6 +2139,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
2114 | NULL); | 2139 | NULL); |
2115 | if (ret != 0) { | 2140 | if (ret != 0) { |
2116 | mutex_unlock(&dev->struct_mutex); | 2141 | mutex_unlock(&dev->struct_mutex); |
2142 | DRM_ERROR("pin & fence failed\n"); | ||
2117 | return ret; | 2143 | return ret; |
2118 | } | 2144 | } |
2119 | 2145 | ||
@@ -2142,6 +2168,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
2142 | if (ret) { | 2168 | if (ret) { |
2143 | i915_gem_object_unpin(to_intel_framebuffer(crtc->fb)->obj); | 2169 | i915_gem_object_unpin(to_intel_framebuffer(crtc->fb)->obj); |
2144 | mutex_unlock(&dev->struct_mutex); | 2170 | mutex_unlock(&dev->struct_mutex); |
2171 | DRM_ERROR("failed to update base address\n"); | ||
2145 | return ret; | 2172 | return ret; |
2146 | } | 2173 | } |
2147 | 2174 | ||
@@ -2248,6 +2275,18 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc) | |||
2248 | FDI_FE_ERRC_ENABLE); | 2275 | FDI_FE_ERRC_ENABLE); |
2249 | } | 2276 | } |
2250 | 2277 | ||
2278 | static void cpt_phase_pointer_enable(struct drm_device *dev, int pipe) | ||
2279 | { | ||
2280 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2281 | u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
2282 | |||
2283 | flags |= FDI_PHASE_SYNC_OVR(pipe); | ||
2284 | I915_WRITE(SOUTH_CHICKEN1, flags); /* once to unlock... */ | ||
2285 | flags |= FDI_PHASE_SYNC_EN(pipe); | ||
2286 | I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to enable */ | ||
2287 | POSTING_READ(SOUTH_CHICKEN1); | ||
2288 | } | ||
2289 | |||
2251 | /* The FDI link training functions for ILK/Ibexpeak. */ | 2290 | /* The FDI link training functions for ILK/Ibexpeak. */ |
2252 | static void ironlake_fdi_link_train(struct drm_crtc *crtc) | 2291 | static void ironlake_fdi_link_train(struct drm_crtc *crtc) |
2253 | { | 2292 | { |
@@ -2398,6 +2437,9 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc) | |||
2398 | POSTING_READ(reg); | 2437 | POSTING_READ(reg); |
2399 | udelay(150); | 2438 | udelay(150); |
2400 | 2439 | ||
2440 | if (HAS_PCH_CPT(dev)) | ||
2441 | cpt_phase_pointer_enable(dev, pipe); | ||
2442 | |||
2401 | for (i = 0; i < 4; i++ ) { | 2443 | for (i = 0; i < 4; i++ ) { |
2402 | reg = FDI_TX_CTL(pipe); | 2444 | reg = FDI_TX_CTL(pipe); |
2403 | temp = I915_READ(reg); | 2445 | temp = I915_READ(reg); |
@@ -2514,6 +2556,9 @@ static void ivb_manual_fdi_link_train(struct drm_crtc *crtc) | |||
2514 | POSTING_READ(reg); | 2556 | POSTING_READ(reg); |
2515 | udelay(150); | 2557 | udelay(150); |
2516 | 2558 | ||
2559 | if (HAS_PCH_CPT(dev)) | ||
2560 | cpt_phase_pointer_enable(dev, pipe); | ||
2561 | |||
2517 | for (i = 0; i < 4; i++ ) { | 2562 | for (i = 0; i < 4; i++ ) { |
2518 | reg = FDI_TX_CTL(pipe); | 2563 | reg = FDI_TX_CTL(pipe); |
2519 | temp = I915_READ(reg); | 2564 | temp = I915_READ(reg); |
@@ -2623,6 +2668,17 @@ static void ironlake_fdi_pll_enable(struct drm_crtc *crtc) | |||
2623 | } | 2668 | } |
2624 | } | 2669 | } |
2625 | 2670 | ||
2671 | static void cpt_phase_pointer_disable(struct drm_device *dev, int pipe) | ||
2672 | { | ||
2673 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2674 | u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
2675 | |||
2676 | flags &= ~(FDI_PHASE_SYNC_EN(pipe)); | ||
2677 | I915_WRITE(SOUTH_CHICKEN1, flags); /* once to disable... */ | ||
2678 | flags &= ~(FDI_PHASE_SYNC_OVR(pipe)); | ||
2679 | I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to lock */ | ||
2680 | POSTING_READ(SOUTH_CHICKEN1); | ||
2681 | } | ||
2626 | static void ironlake_fdi_disable(struct drm_crtc *crtc) | 2682 | static void ironlake_fdi_disable(struct drm_crtc *crtc) |
2627 | { | 2683 | { |
2628 | struct drm_device *dev = crtc->dev; | 2684 | struct drm_device *dev = crtc->dev; |
@@ -2652,6 +2708,8 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc) | |||
2652 | I915_WRITE(FDI_RX_CHICKEN(pipe), | 2708 | I915_WRITE(FDI_RX_CHICKEN(pipe), |
2653 | I915_READ(FDI_RX_CHICKEN(pipe) & | 2709 | I915_READ(FDI_RX_CHICKEN(pipe) & |
2654 | ~FDI_RX_PHASE_SYNC_POINTER_EN)); | 2710 | ~FDI_RX_PHASE_SYNC_POINTER_EN)); |
2711 | } else if (HAS_PCH_CPT(dev)) { | ||
2712 | cpt_phase_pointer_disable(dev, pipe); | ||
2655 | } | 2713 | } |
2656 | 2714 | ||
2657 | /* still set train pattern 1 */ | 2715 | /* still set train pattern 1 */ |
@@ -2862,14 +2920,18 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc) | |||
2862 | I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size); | 2920 | I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size); |
2863 | } | 2921 | } |
2864 | 2922 | ||
2923 | /* | ||
2924 | * On ILK+ LUT must be loaded before the pipe is running but with | ||
2925 | * clocks enabled | ||
2926 | */ | ||
2927 | intel_crtc_load_lut(crtc); | ||
2928 | |||
2865 | intel_enable_pipe(dev_priv, pipe, is_pch_port); | 2929 | intel_enable_pipe(dev_priv, pipe, is_pch_port); |
2866 | intel_enable_plane(dev_priv, plane, pipe); | 2930 | intel_enable_plane(dev_priv, plane, pipe); |
2867 | 2931 | ||
2868 | if (is_pch_port) | 2932 | if (is_pch_port) |
2869 | ironlake_pch_enable(crtc); | 2933 | ironlake_pch_enable(crtc); |
2870 | 2934 | ||
2871 | intel_crtc_load_lut(crtc); | ||
2872 | |||
2873 | mutex_lock(&dev->struct_mutex); | 2935 | mutex_lock(&dev->struct_mutex); |
2874 | intel_update_fbc(dev); | 2936 | intel_update_fbc(dev); |
2875 | mutex_unlock(&dev->struct_mutex); | 2937 | mutex_unlock(&dev->struct_mutex); |
@@ -4538,7 +4600,9 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, | |||
4538 | if (connector->encoder != encoder) | 4600 | if (connector->encoder != encoder) |
4539 | continue; | 4601 | continue; |
4540 | 4602 | ||
4541 | if (connector->display_info.bpc < display_bpc) { | 4603 | /* Don't use an invalid EDID bpc value */ |
4604 | if (connector->display_info.bpc && | ||
4605 | connector->display_info.bpc < display_bpc) { | ||
4542 | DRM_DEBUG_DRIVER("clamping display bpc (was %d) to EDID reported max of %d\n", display_bpc, connector->display_info.bpc); | 4606 | DRM_DEBUG_DRIVER("clamping display bpc (was %d) to EDID reported max of %d\n", display_bpc, connector->display_info.bpc); |
4543 | display_bpc = connector->display_info.bpc; | 4607 | display_bpc = connector->display_info.bpc; |
4544 | } | 4608 | } |
@@ -5153,7 +5217,8 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
5153 | temp |= PIPE_12BPC; | 5217 | temp |= PIPE_12BPC; |
5154 | break; | 5218 | break; |
5155 | default: | 5219 | default: |
5156 | WARN(1, "intel_choose_pipe_bpp returned invalid value\n"); | 5220 | WARN(1, "intel_choose_pipe_bpp returned invalid value %d\n", |
5221 | pipe_bpp); | ||
5157 | temp |= PIPE_8BPC; | 5222 | temp |= PIPE_8BPC; |
5158 | pipe_bpp = 24; | 5223 | pipe_bpp = 24; |
5159 | break; | 5224 | break; |
@@ -5238,7 +5303,7 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
5238 | } else if (is_sdvo && is_tv) | 5303 | } else if (is_sdvo && is_tv) |
5239 | factor = 20; | 5304 | factor = 20; |
5240 | 5305 | ||
5241 | if (clock.m1 < factor * clock.n) | 5306 | if (clock.m < factor * clock.n) |
5242 | fp |= FP_CB_TUNE; | 5307 | fp |= FP_CB_TUNE; |
5243 | 5308 | ||
5244 | dpll = 0; | 5309 | dpll = 0; |
@@ -5516,6 +5581,8 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
5516 | 5581 | ||
5517 | drm_vblank_post_modeset(dev, pipe); | 5582 | drm_vblank_post_modeset(dev, pipe); |
5518 | 5583 | ||
5584 | intel_crtc->dpms_mode = DRM_MODE_DPMS_ON; | ||
5585 | |||
5519 | return ret; | 5586 | return ret; |
5520 | } | 5587 | } |
5521 | 5588 | ||
@@ -7714,10 +7781,12 @@ static void gen6_init_clock_gating(struct drm_device *dev) | |||
7714 | ILK_DPARB_CLK_GATE | | 7781 | ILK_DPARB_CLK_GATE | |
7715 | ILK_DPFD_CLK_GATE); | 7782 | ILK_DPFD_CLK_GATE); |
7716 | 7783 | ||
7717 | for_each_pipe(pipe) | 7784 | for_each_pipe(pipe) { |
7718 | I915_WRITE(DSPCNTR(pipe), | 7785 | I915_WRITE(DSPCNTR(pipe), |
7719 | I915_READ(DSPCNTR(pipe)) | | 7786 | I915_READ(DSPCNTR(pipe)) | |
7720 | DISPPLANE_TRICKLE_FEED_DISABLE); | 7787 | DISPPLANE_TRICKLE_FEED_DISABLE); |
7788 | intel_flush_display_plane(dev_priv, pipe); | ||
7789 | } | ||
7721 | } | 7790 | } |
7722 | 7791 | ||
7723 | static void ivybridge_init_clock_gating(struct drm_device *dev) | 7792 | static void ivybridge_init_clock_gating(struct drm_device *dev) |
@@ -7734,10 +7803,12 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) | |||
7734 | 7803 | ||
7735 | I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); | 7804 | I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); |
7736 | 7805 | ||
7737 | for_each_pipe(pipe) | 7806 | for_each_pipe(pipe) { |
7738 | I915_WRITE(DSPCNTR(pipe), | 7807 | I915_WRITE(DSPCNTR(pipe), |
7739 | I915_READ(DSPCNTR(pipe)) | | 7808 | I915_READ(DSPCNTR(pipe)) | |
7740 | DISPPLANE_TRICKLE_FEED_DISABLE); | 7809 | DISPPLANE_TRICKLE_FEED_DISABLE); |
7810 | intel_flush_display_plane(dev_priv, pipe); | ||
7811 | } | ||
7741 | } | 7812 | } |
7742 | 7813 | ||
7743 | static void g4x_init_clock_gating(struct drm_device *dev) | 7814 | static void g4x_init_clock_gating(struct drm_device *dev) |
@@ -7820,6 +7891,7 @@ static void ibx_init_clock_gating(struct drm_device *dev) | |||
7820 | static void cpt_init_clock_gating(struct drm_device *dev) | 7891 | static void cpt_init_clock_gating(struct drm_device *dev) |
7821 | { | 7892 | { |
7822 | struct drm_i915_private *dev_priv = dev->dev_private; | 7893 | struct drm_i915_private *dev_priv = dev->dev_private; |
7894 | int pipe; | ||
7823 | 7895 | ||
7824 | /* | 7896 | /* |
7825 | * On Ibex Peak and Cougar Point, we need to disable clock | 7897 | * On Ibex Peak and Cougar Point, we need to disable clock |
@@ -7829,6 +7901,9 @@ static void cpt_init_clock_gating(struct drm_device *dev) | |||
7829 | I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); | 7901 | I915_WRITE(SOUTH_DSPCLK_GATE_D, PCH_DPLSUNIT_CLOCK_GATE_DISABLE); |
7830 | I915_WRITE(SOUTH_CHICKEN2, I915_READ(SOUTH_CHICKEN2) | | 7902 | I915_WRITE(SOUTH_CHICKEN2, I915_READ(SOUTH_CHICKEN2) | |
7831 | DPLS_EDP_PPS_FIX_DIS); | 7903 | DPLS_EDP_PPS_FIX_DIS); |
7904 | /* Without this, mode sets may fail silently on FDI */ | ||
7905 | for_each_pipe(pipe) | ||
7906 | I915_WRITE(TRANS_CHICKEN2(pipe), TRANS_AUTOTRAIN_GEN_STALL_DIS); | ||
7832 | } | 7907 | } |
7833 | 7908 | ||
7834 | static void ironlake_teardown_rc6(struct drm_device *dev) | 7909 | static void ironlake_teardown_rc6(struct drm_device *dev) |
@@ -8178,6 +8253,9 @@ struct intel_quirk intel_quirks[] = { | |||
8178 | 8253 | ||
8179 | /* Lenovo U160 cannot use SSC on LVDS */ | 8254 | /* Lenovo U160 cannot use SSC on LVDS */ |
8180 | { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable }, | 8255 | { 0x0046, 0x17aa, 0x3920, quirk_ssc_force_disable }, |
8256 | |||
8257 | /* Sony Vaio Y cannot use SSC on LVDS */ | ||
8258 | { 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable }, | ||
8181 | }; | 8259 | }; |
8182 | 8260 | ||
8183 | static void intel_init_quirks(struct drm_device *dev) | 8261 | static void intel_init_quirks(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index f797fb58ba9c..0feae908bb37 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -50,9 +50,10 @@ struct intel_dp { | |||
50 | bool has_audio; | 50 | bool has_audio; |
51 | int force_audio; | 51 | int force_audio; |
52 | uint32_t color_range; | 52 | uint32_t color_range; |
53 | int dpms_mode; | ||
53 | uint8_t link_bw; | 54 | uint8_t link_bw; |
54 | uint8_t lane_count; | 55 | uint8_t lane_count; |
55 | uint8_t dpcd[4]; | 56 | uint8_t dpcd[8]; |
56 | struct i2c_adapter adapter; | 57 | struct i2c_adapter adapter; |
57 | struct i2c_algo_dp_aux_data algo; | 58 | struct i2c_algo_dp_aux_data algo; |
58 | bool is_pch_edp; | 59 | bool is_pch_edp; |
@@ -316,9 +317,17 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, | |||
316 | else | 317 | else |
317 | precharge = 5; | 318 | precharge = 5; |
318 | 319 | ||
319 | if (I915_READ(ch_ctl) & DP_AUX_CH_CTL_SEND_BUSY) { | 320 | /* Try to wait for any previous AUX channel activity */ |
320 | DRM_ERROR("dp_aux_ch not started status 0x%08x\n", | 321 | for (try = 0; try < 3; try++) { |
321 | I915_READ(ch_ctl)); | 322 | status = I915_READ(ch_ctl); |
323 | if ((status & DP_AUX_CH_CTL_SEND_BUSY) == 0) | ||
324 | break; | ||
325 | msleep(1); | ||
326 | } | ||
327 | |||
328 | if (try == 3) { | ||
329 | WARN(1, "dp_aux_ch not started status 0x%08x\n", | ||
330 | I915_READ(ch_ctl)); | ||
322 | return -EBUSY; | 331 | return -EBUSY; |
323 | } | 332 | } |
324 | 333 | ||
@@ -770,6 +779,7 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, | |||
770 | memset(intel_dp->link_configuration, 0, DP_LINK_CONFIGURATION_SIZE); | 779 | memset(intel_dp->link_configuration, 0, DP_LINK_CONFIGURATION_SIZE); |
771 | intel_dp->link_configuration[0] = intel_dp->link_bw; | 780 | intel_dp->link_configuration[0] = intel_dp->link_bw; |
772 | intel_dp->link_configuration[1] = intel_dp->lane_count; | 781 | intel_dp->link_configuration[1] = intel_dp->lane_count; |
782 | intel_dp->link_configuration[8] = DP_SET_ANSI_8B10B; | ||
773 | 783 | ||
774 | /* | 784 | /* |
775 | * Check for DPCD version > 1.1 and enhanced framing support | 785 | * Check for DPCD version > 1.1 and enhanced framing support |
@@ -1011,6 +1021,8 @@ static void intel_dp_commit(struct drm_encoder *encoder) | |||
1011 | 1021 | ||
1012 | if (is_edp(intel_dp)) | 1022 | if (is_edp(intel_dp)) |
1013 | ironlake_edp_backlight_on(dev); | 1023 | ironlake_edp_backlight_on(dev); |
1024 | |||
1025 | intel_dp->dpms_mode = DRM_MODE_DPMS_ON; | ||
1014 | } | 1026 | } |
1015 | 1027 | ||
1016 | static void | 1028 | static void |
@@ -1045,6 +1057,7 @@ intel_dp_dpms(struct drm_encoder *encoder, int mode) | |||
1045 | if (is_edp(intel_dp)) | 1057 | if (is_edp(intel_dp)) |
1046 | ironlake_edp_backlight_on(dev); | 1058 | ironlake_edp_backlight_on(dev); |
1047 | } | 1059 | } |
1060 | intel_dp->dpms_mode = mode; | ||
1048 | } | 1061 | } |
1049 | 1062 | ||
1050 | /* | 1063 | /* |
@@ -1334,10 +1347,16 @@ intel_dp_start_link_train(struct intel_dp *intel_dp) | |||
1334 | u32 reg; | 1347 | u32 reg; |
1335 | uint32_t DP = intel_dp->DP; | 1348 | uint32_t DP = intel_dp->DP; |
1336 | 1349 | ||
1337 | /* Enable output, wait for it to become active */ | 1350 | /* |
1338 | I915_WRITE(intel_dp->output_reg, intel_dp->DP); | 1351 | * On CPT we have to enable the port in training pattern 1, which |
1339 | POSTING_READ(intel_dp->output_reg); | 1352 | * will happen below in intel_dp_set_link_train. Otherwise, enable |
1340 | intel_wait_for_vblank(dev, intel_crtc->pipe); | 1353 | * the port and wait for it to become active. |
1354 | */ | ||
1355 | if (!HAS_PCH_CPT(dev)) { | ||
1356 | I915_WRITE(intel_dp->output_reg, intel_dp->DP); | ||
1357 | POSTING_READ(intel_dp->output_reg); | ||
1358 | intel_wait_for_vblank(dev, intel_crtc->pipe); | ||
1359 | } | ||
1341 | 1360 | ||
1342 | /* Write the link configuration data */ | 1361 | /* Write the link configuration data */ |
1343 | intel_dp_aux_native_write(intel_dp, DP_LINK_BW_SET, | 1362 | intel_dp_aux_native_write(intel_dp, DP_LINK_BW_SET, |
@@ -1370,7 +1389,8 @@ intel_dp_start_link_train(struct intel_dp *intel_dp) | |||
1370 | reg = DP | DP_LINK_TRAIN_PAT_1; | 1389 | reg = DP | DP_LINK_TRAIN_PAT_1; |
1371 | 1390 | ||
1372 | if (!intel_dp_set_link_train(intel_dp, reg, | 1391 | if (!intel_dp_set_link_train(intel_dp, reg, |
1373 | DP_TRAINING_PATTERN_1)) | 1392 | DP_TRAINING_PATTERN_1 | |
1393 | DP_LINK_SCRAMBLING_DISABLE)) | ||
1374 | break; | 1394 | break; |
1375 | /* Set training pattern 1 */ | 1395 | /* Set training pattern 1 */ |
1376 | 1396 | ||
@@ -1445,7 +1465,8 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp) | |||
1445 | 1465 | ||
1446 | /* channel eq pattern */ | 1466 | /* channel eq pattern */ |
1447 | if (!intel_dp_set_link_train(intel_dp, reg, | 1467 | if (!intel_dp_set_link_train(intel_dp, reg, |
1448 | DP_TRAINING_PATTERN_2)) | 1468 | DP_TRAINING_PATTERN_2 | |
1469 | DP_LINK_SCRAMBLING_DISABLE)) | ||
1449 | break; | 1470 | break; |
1450 | 1471 | ||
1451 | udelay(400); | 1472 | udelay(400); |
@@ -1559,6 +1580,18 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
1559 | POSTING_READ(intel_dp->output_reg); | 1580 | POSTING_READ(intel_dp->output_reg); |
1560 | } | 1581 | } |
1561 | 1582 | ||
1583 | static bool | ||
1584 | intel_dp_get_dpcd(struct intel_dp *intel_dp) | ||
1585 | { | ||
1586 | if (intel_dp_aux_native_read_retry(intel_dp, 0x000, intel_dp->dpcd, | ||
1587 | sizeof (intel_dp->dpcd)) && | ||
1588 | (intel_dp->dpcd[DP_DPCD_REV] != 0)) { | ||
1589 | return true; | ||
1590 | } | ||
1591 | |||
1592 | return false; | ||
1593 | } | ||
1594 | |||
1562 | /* | 1595 | /* |
1563 | * According to DP spec | 1596 | * According to DP spec |
1564 | * 5.1.2: | 1597 | * 5.1.2: |
@@ -1571,36 +1604,44 @@ intel_dp_link_down(struct intel_dp *intel_dp) | |||
1571 | static void | 1604 | static void |
1572 | intel_dp_check_link_status(struct intel_dp *intel_dp) | 1605 | intel_dp_check_link_status(struct intel_dp *intel_dp) |
1573 | { | 1606 | { |
1574 | int ret; | 1607 | if (intel_dp->dpms_mode != DRM_MODE_DPMS_ON) |
1608 | return; | ||
1575 | 1609 | ||
1576 | if (!intel_dp->base.base.crtc) | 1610 | if (!intel_dp->base.base.crtc) |
1577 | return; | 1611 | return; |
1578 | 1612 | ||
1613 | /* Try to read receiver status if the link appears to be up */ | ||
1579 | if (!intel_dp_get_link_status(intel_dp)) { | 1614 | if (!intel_dp_get_link_status(intel_dp)) { |
1580 | intel_dp_link_down(intel_dp); | 1615 | intel_dp_link_down(intel_dp); |
1581 | return; | 1616 | return; |
1582 | } | 1617 | } |
1583 | 1618 | ||
1584 | /* Try to read receiver status if the link appears to be up */ | 1619 | /* Now read the DPCD to see if it's actually running */ |
1585 | ret = intel_dp_aux_native_read(intel_dp, | 1620 | if (!intel_dp_get_dpcd(intel_dp)) { |
1586 | 0x000, intel_dp->dpcd, | ||
1587 | sizeof (intel_dp->dpcd)); | ||
1588 | if (ret != sizeof(intel_dp->dpcd)) { | ||
1589 | intel_dp_link_down(intel_dp); | 1621 | intel_dp_link_down(intel_dp); |
1590 | return; | 1622 | return; |
1591 | } | 1623 | } |
1592 | 1624 | ||
1593 | if (!intel_channel_eq_ok(intel_dp)) { | 1625 | if (!intel_channel_eq_ok(intel_dp)) { |
1626 | DRM_DEBUG_KMS("%s: channel EQ not ok, retraining\n", | ||
1627 | drm_get_encoder_name(&intel_dp->base.base)); | ||
1594 | intel_dp_start_link_train(intel_dp); | 1628 | intel_dp_start_link_train(intel_dp); |
1595 | intel_dp_complete_link_train(intel_dp); | 1629 | intel_dp_complete_link_train(intel_dp); |
1596 | } | 1630 | } |
1597 | } | 1631 | } |
1598 | 1632 | ||
1599 | static enum drm_connector_status | 1633 | static enum drm_connector_status |
1634 | intel_dp_detect_dpcd(struct intel_dp *intel_dp) | ||
1635 | { | ||
1636 | if (intel_dp_get_dpcd(intel_dp)) | ||
1637 | return connector_status_connected; | ||
1638 | return connector_status_disconnected; | ||
1639 | } | ||
1640 | |||
1641 | static enum drm_connector_status | ||
1600 | ironlake_dp_detect(struct intel_dp *intel_dp) | 1642 | ironlake_dp_detect(struct intel_dp *intel_dp) |
1601 | { | 1643 | { |
1602 | enum drm_connector_status status; | 1644 | enum drm_connector_status status; |
1603 | bool ret; | ||
1604 | 1645 | ||
1605 | /* Can't disconnect eDP, but you can close the lid... */ | 1646 | /* Can't disconnect eDP, but you can close the lid... */ |
1606 | if (is_edp(intel_dp)) { | 1647 | if (is_edp(intel_dp)) { |
@@ -1610,15 +1651,7 @@ ironlake_dp_detect(struct intel_dp *intel_dp) | |||
1610 | return status; | 1651 | return status; |
1611 | } | 1652 | } |
1612 | 1653 | ||
1613 | status = connector_status_disconnected; | 1654 | return intel_dp_detect_dpcd(intel_dp); |
1614 | ret = intel_dp_aux_native_read_retry(intel_dp, | ||
1615 | 0x000, intel_dp->dpcd, | ||
1616 | sizeof (intel_dp->dpcd)); | ||
1617 | if (ret && intel_dp->dpcd[DP_DPCD_REV] != 0) | ||
1618 | status = connector_status_connected; | ||
1619 | DRM_DEBUG_KMS("DPCD: %hx%hx%hx%hx\n", intel_dp->dpcd[0], | ||
1620 | intel_dp->dpcd[1], intel_dp->dpcd[2], intel_dp->dpcd[3]); | ||
1621 | return status; | ||
1622 | } | 1655 | } |
1623 | 1656 | ||
1624 | static enum drm_connector_status | 1657 | static enum drm_connector_status |
@@ -1626,7 +1659,6 @@ g4x_dp_detect(struct intel_dp *intel_dp) | |||
1626 | { | 1659 | { |
1627 | struct drm_device *dev = intel_dp->base.base.dev; | 1660 | struct drm_device *dev = intel_dp->base.base.dev; |
1628 | struct drm_i915_private *dev_priv = dev->dev_private; | 1661 | struct drm_i915_private *dev_priv = dev->dev_private; |
1629 | enum drm_connector_status status; | ||
1630 | uint32_t temp, bit; | 1662 | uint32_t temp, bit; |
1631 | 1663 | ||
1632 | switch (intel_dp->output_reg) { | 1664 | switch (intel_dp->output_reg) { |
@@ -1648,15 +1680,7 @@ g4x_dp_detect(struct intel_dp *intel_dp) | |||
1648 | if ((temp & bit) == 0) | 1680 | if ((temp & bit) == 0) |
1649 | return connector_status_disconnected; | 1681 | return connector_status_disconnected; |
1650 | 1682 | ||
1651 | status = connector_status_disconnected; | 1683 | return intel_dp_detect_dpcd(intel_dp); |
1652 | if (intel_dp_aux_native_read(intel_dp, 0x000, intel_dp->dpcd, | ||
1653 | sizeof (intel_dp->dpcd)) == sizeof (intel_dp->dpcd)) | ||
1654 | { | ||
1655 | if (intel_dp->dpcd[DP_DPCD_REV] != 0) | ||
1656 | status = connector_status_connected; | ||
1657 | } | ||
1658 | |||
1659 | return status; | ||
1660 | } | 1684 | } |
1661 | 1685 | ||
1662 | /** | 1686 | /** |
@@ -1679,6 +1703,12 @@ intel_dp_detect(struct drm_connector *connector, bool force) | |||
1679 | status = ironlake_dp_detect(intel_dp); | 1703 | status = ironlake_dp_detect(intel_dp); |
1680 | else | 1704 | else |
1681 | status = g4x_dp_detect(intel_dp); | 1705 | status = g4x_dp_detect(intel_dp); |
1706 | |||
1707 | DRM_DEBUG_KMS("DPCD: %02hx%02hx%02hx%02hx%02hx%02hx%02hx%02hx\n", | ||
1708 | intel_dp->dpcd[0], intel_dp->dpcd[1], intel_dp->dpcd[2], | ||
1709 | intel_dp->dpcd[3], intel_dp->dpcd[4], intel_dp->dpcd[5], | ||
1710 | intel_dp->dpcd[6], intel_dp->dpcd[7]); | ||
1711 | |||
1682 | if (status != connector_status_connected) | 1712 | if (status != connector_status_connected) |
1683 | return status; | 1713 | return status; |
1684 | 1714 | ||
@@ -1924,6 +1954,7 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
1924 | return; | 1954 | return; |
1925 | 1955 | ||
1926 | intel_dp->output_reg = output_reg; | 1956 | intel_dp->output_reg = output_reg; |
1957 | intel_dp->dpms_mode = -1; | ||
1927 | 1958 | ||
1928 | intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL); | 1959 | intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL); |
1929 | if (!intel_connector) { | 1960 | if (!intel_connector) { |
@@ -2000,7 +2031,7 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
2000 | 2031 | ||
2001 | /* Cache some DPCD data in the eDP case */ | 2032 | /* Cache some DPCD data in the eDP case */ |
2002 | if (is_edp(intel_dp)) { | 2033 | if (is_edp(intel_dp)) { |
2003 | int ret; | 2034 | bool ret; |
2004 | u32 pp_on, pp_div; | 2035 | u32 pp_on, pp_div; |
2005 | 2036 | ||
2006 | pp_on = I915_READ(PCH_PP_ON_DELAYS); | 2037 | pp_on = I915_READ(PCH_PP_ON_DELAYS); |
@@ -2013,11 +2044,9 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
2013 | dev_priv->panel_t12 *= 100; /* t12 in 100ms units */ | 2044 | dev_priv->panel_t12 *= 100; /* t12 in 100ms units */ |
2014 | 2045 | ||
2015 | ironlake_edp_panel_vdd_on(intel_dp); | 2046 | ironlake_edp_panel_vdd_on(intel_dp); |
2016 | ret = intel_dp_aux_native_read(intel_dp, DP_DPCD_REV, | 2047 | ret = intel_dp_get_dpcd(intel_dp); |
2017 | intel_dp->dpcd, | ||
2018 | sizeof(intel_dp->dpcd)); | ||
2019 | ironlake_edp_panel_vdd_off(intel_dp); | 2048 | ironlake_edp_panel_vdd_off(intel_dp); |
2020 | if (ret == sizeof(intel_dp->dpcd)) { | 2049 | if (ret) { |
2021 | if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) | 2050 | if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) |
2022 | dev_priv->no_aux_handshake = | 2051 | dev_priv->no_aux_handshake = |
2023 | intel_dp->dpcd[DP_MAX_DOWNSPREAD] & | 2052 | intel_dp->dpcd[DP_MAX_DOWNSPREAD] & |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 6e990f9760ef..7b330e76a435 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
@@ -178,10 +178,28 @@ struct intel_crtc { | |||
178 | #define to_intel_encoder(x) container_of(x, struct intel_encoder, base) | 178 | #define to_intel_encoder(x) container_of(x, struct intel_encoder, base) |
179 | #define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base) | 179 | #define to_intel_framebuffer(x) container_of(x, struct intel_framebuffer, base) |
180 | 180 | ||
181 | #define DIP_HEADER_SIZE 5 | ||
182 | |||
181 | #define DIP_TYPE_AVI 0x82 | 183 | #define DIP_TYPE_AVI 0x82 |
182 | #define DIP_VERSION_AVI 0x2 | 184 | #define DIP_VERSION_AVI 0x2 |
183 | #define DIP_LEN_AVI 13 | 185 | #define DIP_LEN_AVI 13 |
184 | 186 | ||
187 | #define DIP_TYPE_SPD 0x3 | ||
188 | #define DIP_VERSION_SPD 0x1 | ||
189 | #define DIP_LEN_SPD 25 | ||
190 | #define DIP_SPD_UNKNOWN 0 | ||
191 | #define DIP_SPD_DSTB 0x1 | ||
192 | #define DIP_SPD_DVDP 0x2 | ||
193 | #define DIP_SPD_DVHS 0x3 | ||
194 | #define DIP_SPD_HDDVR 0x4 | ||
195 | #define DIP_SPD_DVC 0x5 | ||
196 | #define DIP_SPD_DSC 0x6 | ||
197 | #define DIP_SPD_VCD 0x7 | ||
198 | #define DIP_SPD_GAME 0x8 | ||
199 | #define DIP_SPD_PC 0x9 | ||
200 | #define DIP_SPD_BD 0xa | ||
201 | #define DIP_SPD_SCD 0xb | ||
202 | |||
185 | struct dip_infoframe { | 203 | struct dip_infoframe { |
186 | uint8_t type; /* HB0 */ | 204 | uint8_t type; /* HB0 */ |
187 | uint8_t ver; /* HB1 */ | 205 | uint8_t ver; /* HB1 */ |
@@ -206,6 +224,11 @@ struct dip_infoframe { | |||
206 | uint16_t left_bar_end; | 224 | uint16_t left_bar_end; |
207 | uint16_t right_bar_start; | 225 | uint16_t right_bar_start; |
208 | } avi; | 226 | } avi; |
227 | struct { | ||
228 | uint8_t vn[8]; | ||
229 | uint8_t pd[16]; | ||
230 | uint8_t sdi; | ||
231 | } spd; | ||
209 | uint8_t payload[27]; | 232 | uint8_t payload[27]; |
210 | } __attribute__ ((packed)) body; | 233 | } __attribute__ ((packed)) body; |
211 | } __attribute__((packed)); | 234 | } __attribute__((packed)); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 1ed8e6903915..226ba830f383 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
@@ -45,6 +45,8 @@ struct intel_hdmi { | |||
45 | bool has_hdmi_sink; | 45 | bool has_hdmi_sink; |
46 | bool has_audio; | 46 | bool has_audio; |
47 | int force_audio; | 47 | int force_audio; |
48 | void (*write_infoframe)(struct drm_encoder *encoder, | ||
49 | struct dip_infoframe *frame); | ||
48 | }; | 50 | }; |
49 | 51 | ||
50 | static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder) | 52 | static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder) |
@@ -58,37 +60,70 @@ static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector) | |||
58 | struct intel_hdmi, base); | 60 | struct intel_hdmi, base); |
59 | } | 61 | } |
60 | 62 | ||
61 | void intel_dip_infoframe_csum(struct dip_infoframe *avi_if) | 63 | void intel_dip_infoframe_csum(struct dip_infoframe *frame) |
62 | { | 64 | { |
63 | uint8_t *data = (uint8_t *)avi_if; | 65 | uint8_t *data = (uint8_t *)frame; |
64 | uint8_t sum = 0; | 66 | uint8_t sum = 0; |
65 | unsigned i; | 67 | unsigned i; |
66 | 68 | ||
67 | avi_if->checksum = 0; | 69 | frame->checksum = 0; |
68 | avi_if->ecc = 0; | 70 | frame->ecc = 0; |
69 | 71 | ||
70 | for (i = 0; i < sizeof(*avi_if); i++) | 72 | /* Header isn't part of the checksum */ |
73 | for (i = 5; i < frame->len; i++) | ||
71 | sum += data[i]; | 74 | sum += data[i]; |
72 | 75 | ||
73 | avi_if->checksum = 0x100 - sum; | 76 | frame->checksum = 0x100 - sum; |
74 | } | 77 | } |
75 | 78 | ||
76 | static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder) | 79 | static u32 intel_infoframe_index(struct dip_infoframe *frame) |
77 | { | 80 | { |
78 | struct dip_infoframe avi_if = { | 81 | u32 flags = 0; |
79 | .type = DIP_TYPE_AVI, | 82 | |
80 | .ver = DIP_VERSION_AVI, | 83 | switch (frame->type) { |
81 | .len = DIP_LEN_AVI, | 84 | case DIP_TYPE_AVI: |
82 | }; | 85 | flags |= VIDEO_DIP_SELECT_AVI; |
83 | uint32_t *data = (uint32_t *)&avi_if; | 86 | break; |
87 | case DIP_TYPE_SPD: | ||
88 | flags |= VIDEO_DIP_SELECT_SPD; | ||
89 | break; | ||
90 | default: | ||
91 | DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type); | ||
92 | break; | ||
93 | } | ||
94 | |||
95 | return flags; | ||
96 | } | ||
97 | |||
98 | static u32 intel_infoframe_flags(struct dip_infoframe *frame) | ||
99 | { | ||
100 | u32 flags = 0; | ||
101 | |||
102 | switch (frame->type) { | ||
103 | case DIP_TYPE_AVI: | ||
104 | flags |= VIDEO_DIP_ENABLE_AVI | VIDEO_DIP_FREQ_VSYNC; | ||
105 | break; | ||
106 | case DIP_TYPE_SPD: | ||
107 | flags |= VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_FREQ_2VSYNC; | ||
108 | break; | ||
109 | default: | ||
110 | DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type); | ||
111 | break; | ||
112 | } | ||
113 | |||
114 | return flags; | ||
115 | } | ||
116 | |||
117 | static void i9xx_write_infoframe(struct drm_encoder *encoder, | ||
118 | struct dip_infoframe *frame) | ||
119 | { | ||
120 | uint32_t *data = (uint32_t *)frame; | ||
84 | struct drm_device *dev = encoder->dev; | 121 | struct drm_device *dev = encoder->dev; |
85 | struct drm_i915_private *dev_priv = dev->dev_private; | 122 | struct drm_i915_private *dev_priv = dev->dev_private; |
86 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); | 123 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); |
87 | u32 port; | 124 | u32 port, flags, val = I915_READ(VIDEO_DIP_CTL); |
88 | unsigned i; | 125 | unsigned i, len = DIP_HEADER_SIZE + frame->len; |
89 | 126 | ||
90 | if (!intel_hdmi->has_hdmi_sink) | ||
91 | return; | ||
92 | 127 | ||
93 | /* XXX first guess at handling video port, is this corrent? */ | 128 | /* XXX first guess at handling video port, is this corrent? */ |
94 | if (intel_hdmi->sdvox_reg == SDVOB) | 129 | if (intel_hdmi->sdvox_reg == SDVOB) |
@@ -98,18 +133,87 @@ static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder) | |||
98 | else | 133 | else |
99 | return; | 134 | return; |
100 | 135 | ||
101 | I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | port | | 136 | flags = intel_infoframe_index(frame); |
102 | VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC); | 137 | |
138 | val &= ~VIDEO_DIP_SELECT_MASK; | ||
103 | 139 | ||
104 | intel_dip_infoframe_csum(&avi_if); | 140 | I915_WRITE(VIDEO_DIP_CTL, val | port | flags); |
105 | for (i = 0; i < sizeof(avi_if); i += 4) { | 141 | |
142 | for (i = 0; i < len; i += 4) { | ||
106 | I915_WRITE(VIDEO_DIP_DATA, *data); | 143 | I915_WRITE(VIDEO_DIP_DATA, *data); |
107 | data++; | 144 | data++; |
108 | } | 145 | } |
109 | 146 | ||
110 | I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | port | | 147 | flags |= intel_infoframe_flags(frame); |
111 | VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC | | 148 | |
112 | VIDEO_DIP_ENABLE_AVI); | 149 | I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | val | port | flags); |
150 | } | ||
151 | |||
152 | static void ironlake_write_infoframe(struct drm_encoder *encoder, | ||
153 | struct dip_infoframe *frame) | ||
154 | { | ||
155 | uint32_t *data = (uint32_t *)frame; | ||
156 | struct drm_device *dev = encoder->dev; | ||
157 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
158 | struct drm_crtc *crtc = encoder->crtc; | ||
159 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||
160 | int reg = TVIDEO_DIP_CTL(intel_crtc->pipe); | ||
161 | unsigned i, len = DIP_HEADER_SIZE + frame->len; | ||
162 | u32 flags, val = I915_READ(reg); | ||
163 | |||
164 | intel_wait_for_vblank(dev, intel_crtc->pipe); | ||
165 | |||
166 | flags = intel_infoframe_index(frame); | ||
167 | |||
168 | val &= ~VIDEO_DIP_SELECT_MASK; | ||
169 | |||
170 | I915_WRITE(reg, val | flags); | ||
171 | |||
172 | for (i = 0; i < len; i += 4) { | ||
173 | I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data); | ||
174 | data++; | ||
175 | } | ||
176 | |||
177 | flags |= intel_infoframe_flags(frame); | ||
178 | |||
179 | I915_WRITE(reg, VIDEO_DIP_ENABLE | val | flags); | ||
180 | } | ||
181 | static void intel_set_infoframe(struct drm_encoder *encoder, | ||
182 | struct dip_infoframe *frame) | ||
183 | { | ||
184 | struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); | ||
185 | |||
186 | if (!intel_hdmi->has_hdmi_sink) | ||
187 | return; | ||
188 | |||
189 | intel_dip_infoframe_csum(frame); | ||
190 | intel_hdmi->write_infoframe(encoder, frame); | ||
191 | } | ||
192 | |||
193 | static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder) | ||
194 | { | ||
195 | struct dip_infoframe avi_if = { | ||
196 | .type = DIP_TYPE_AVI, | ||
197 | .ver = DIP_VERSION_AVI, | ||
198 | .len = DIP_LEN_AVI, | ||
199 | }; | ||
200 | |||
201 | intel_set_infoframe(encoder, &avi_if); | ||
202 | } | ||
203 | |||
204 | static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder) | ||
205 | { | ||
206 | struct dip_infoframe spd_if; | ||
207 | |||
208 | memset(&spd_if, 0, sizeof(spd_if)); | ||
209 | spd_if.type = DIP_TYPE_SPD; | ||
210 | spd_if.ver = DIP_VERSION_SPD; | ||
211 | spd_if.len = DIP_LEN_SPD; | ||
212 | strcpy(spd_if.body.spd.vn, "Intel"); | ||
213 | strcpy(spd_if.body.spd.pd, "Integrated gfx"); | ||
214 | spd_if.body.spd.sdi = DIP_SPD_PC; | ||
215 | |||
216 | intel_set_infoframe(encoder, &spd_if); | ||
113 | } | 217 | } |
114 | 218 | ||
115 | static void intel_hdmi_mode_set(struct drm_encoder *encoder, | 219 | static void intel_hdmi_mode_set(struct drm_encoder *encoder, |
@@ -156,6 +260,7 @@ static void intel_hdmi_mode_set(struct drm_encoder *encoder, | |||
156 | POSTING_READ(intel_hdmi->sdvox_reg); | 260 | POSTING_READ(intel_hdmi->sdvox_reg); |
157 | 261 | ||
158 | intel_hdmi_set_avi_infoframe(encoder); | 262 | intel_hdmi_set_avi_infoframe(encoder); |
263 | intel_hdmi_set_spd_infoframe(encoder); | ||
159 | } | 264 | } |
160 | 265 | ||
161 | static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) | 266 | static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) |
@@ -433,6 +538,11 @@ void intel_hdmi_init(struct drm_device *dev, int sdvox_reg) | |||
433 | 538 | ||
434 | intel_hdmi->sdvox_reg = sdvox_reg; | 539 | intel_hdmi->sdvox_reg = sdvox_reg; |
435 | 540 | ||
541 | if (!HAS_PCH_SPLIT(dev)) | ||
542 | intel_hdmi->write_infoframe = i9xx_write_infoframe; | ||
543 | else | ||
544 | intel_hdmi->write_infoframe = ironlake_write_infoframe; | ||
545 | |||
436 | drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs); | 546 | drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs); |
437 | 547 | ||
438 | intel_hdmi_add_properties(intel_hdmi, connector); | 548 | intel_hdmi_add_properties(intel_hdmi, connector); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index b28f7bd9f88a..2e8ddfcba40c 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -690,6 +690,14 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
690 | }, | 690 | }, |
691 | { | 691 | { |
692 | .callback = intel_no_lvds_dmi_callback, | 692 | .callback = intel_no_lvds_dmi_callback, |
693 | .ident = "Dell OptiPlex FX170", | ||
694 | .matches = { | ||
695 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
696 | DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex FX170"), | ||
697 | }, | ||
698 | }, | ||
699 | { | ||
700 | .callback = intel_no_lvds_dmi_callback, | ||
693 | .ident = "AOpen Mini PC", | 701 | .ident = "AOpen Mini PC", |
694 | .matches = { | 702 | .matches = { |
695 | DMI_MATCH(DMI_SYS_VENDOR, "AOpen"), | 703 | DMI_MATCH(DMI_SYS_VENDOR, "AOpen"), |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index a06ff07a4d3b..05f500cd9c24 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
@@ -83,11 +83,15 @@ intel_pch_panel_fitting(struct drm_device *dev, | |||
83 | u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay; | 83 | u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay; |
84 | if (scaled_width > scaled_height) { /* pillar */ | 84 | if (scaled_width > scaled_height) { /* pillar */ |
85 | width = scaled_height / mode->vdisplay; | 85 | width = scaled_height / mode->vdisplay; |
86 | if (width & 1) | ||
87 | width++; | ||
86 | x = (adjusted_mode->hdisplay - width + 1) / 2; | 88 | x = (adjusted_mode->hdisplay - width + 1) / 2; |
87 | y = 0; | 89 | y = 0; |
88 | height = adjusted_mode->vdisplay; | 90 | height = adjusted_mode->vdisplay; |
89 | } else if (scaled_width < scaled_height) { /* letter */ | 91 | } else if (scaled_width < scaled_height) { /* letter */ |
90 | height = scaled_width / mode->hdisplay; | 92 | height = scaled_width / mode->hdisplay; |
93 | if (height & 1) | ||
94 | height++; | ||
91 | y = (adjusted_mode->vdisplay - height + 1) / 2; | 95 | y = (adjusted_mode->vdisplay - height + 1) / 2; |
92 | x = 0; | 96 | x = 0; |
93 | width = adjusted_mode->hdisplay; | 97 | width = adjusted_mode->hdisplay; |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index e9615685a39c..47b9b2777038 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -1321,6 +1321,9 @@ int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size) | |||
1321 | ring->get_seqno = pc_render_get_seqno; | 1321 | ring->get_seqno = pc_render_get_seqno; |
1322 | } | 1322 | } |
1323 | 1323 | ||
1324 | if (!I915_NEED_GFX_HWS(dev)) | ||
1325 | ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr; | ||
1326 | |||
1324 | ring->dev = dev; | 1327 | ring->dev = dev; |
1325 | INIT_LIST_HEAD(&ring->active_list); | 1328 | INIT_LIST_HEAD(&ring->active_list); |
1326 | INIT_LIST_HEAD(&ring->request_list); | 1329 | INIT_LIST_HEAD(&ring->request_list); |
diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile index 3896ef811102..9f363e0c4b60 100644 --- a/drivers/gpu/drm/radeon/Makefile +++ b/drivers/gpu/drm/radeon/Makefile | |||
@@ -5,6 +5,7 @@ | |||
5 | ccflags-y := -Iinclude/drm | 5 | ccflags-y := -Iinclude/drm |
6 | 6 | ||
7 | hostprogs-y := mkregtable | 7 | hostprogs-y := mkregtable |
8 | clean-files := rn50_reg_safe.h r100_reg_safe.h r200_reg_safe.h rv515_reg_safe.h r300_reg_safe.h r420_reg_safe.h rs600_reg_safe.h r600_reg_safe.h evergreen_reg_safe.h cayman_reg_safe.h | ||
8 | 9 | ||
9 | quiet_cmd_mkregtable = MKREGTABLE $@ | 10 | quiet_cmd_mkregtable = MKREGTABLE $@ |
10 | cmd_mkregtable = $(obj)/mkregtable $< > $@ | 11 | cmd_mkregtable = $(obj)/mkregtable $< > $@ |
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index ebdb0fdb8348..e88c64417a8a 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c | |||
@@ -1245,6 +1245,9 @@ struct atom_context *atom_parse(struct card_info *card, void *bios) | |||
1245 | char name[512]; | 1245 | char name[512]; |
1246 | int i; | 1246 | int i; |
1247 | 1247 | ||
1248 | if (!ctx) | ||
1249 | return NULL; | ||
1250 | |||
1248 | ctx->card = card; | 1251 | ctx->card = card; |
1249 | ctx->bios = bios; | 1252 | ctx->bios = bios; |
1250 | 1253 | ||
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index 189e86522b5b..a134790903d3 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
@@ -428,7 +428,7 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3 | |||
428 | last_reg = ARRAY_SIZE(evergreen_reg_safe_bm); | 428 | last_reg = ARRAY_SIZE(evergreen_reg_safe_bm); |
429 | 429 | ||
430 | i = (reg >> 7); | 430 | i = (reg >> 7); |
431 | if (i > last_reg) { | 431 | if (i >= last_reg) { |
432 | dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); | 432 | dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); |
433 | return -EINVAL; | 433 | return -EINVAL; |
434 | } | 434 | } |
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index db8ef1905d5f..cf83aa05a684 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
@@ -915,12 +915,11 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx | |||
915 | { | 915 | { |
916 | struct r600_cs_track *track = (struct r600_cs_track *)p->track; | 916 | struct r600_cs_track *track = (struct r600_cs_track *)p->track; |
917 | struct radeon_cs_reloc *reloc; | 917 | struct radeon_cs_reloc *reloc; |
918 | u32 last_reg = ARRAY_SIZE(r600_reg_safe_bm); | ||
919 | u32 m, i, tmp, *ib; | 918 | u32 m, i, tmp, *ib; |
920 | int r; | 919 | int r; |
921 | 920 | ||
922 | i = (reg >> 7); | 921 | i = (reg >> 7); |
923 | if (i > last_reg) { | 922 | if (i >= ARRAY_SIZE(r600_reg_safe_bm)) { |
924 | dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); | 923 | dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); |
925 | return -EINVAL; | 924 | return -EINVAL; |
926 | } | 925 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index a74217cd192f..e0138b674aca 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
@@ -2557,6 +2557,7 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev) | |||
2557 | u16 offset, misc, misc2 = 0; | 2557 | u16 offset, misc, misc2 = 0; |
2558 | u8 rev, blocks, tmp; | 2558 | u8 rev, blocks, tmp; |
2559 | int state_index = 0; | 2559 | int state_index = 0; |
2560 | struct radeon_i2c_bus_rec i2c_bus; | ||
2560 | 2561 | ||
2561 | rdev->pm.default_power_state_index = -1; | 2562 | rdev->pm.default_power_state_index = -1; |
2562 | 2563 | ||
@@ -2575,7 +2576,6 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev) | |||
2575 | offset = combios_get_table_offset(dev, COMBIOS_OVERDRIVE_INFO_TABLE); | 2576 | offset = combios_get_table_offset(dev, COMBIOS_OVERDRIVE_INFO_TABLE); |
2576 | if (offset) { | 2577 | if (offset) { |
2577 | u8 thermal_controller = 0, gpio = 0, i2c_addr = 0, clk_bit = 0, data_bit = 0; | 2578 | u8 thermal_controller = 0, gpio = 0, i2c_addr = 0, clk_bit = 0, data_bit = 0; |
2578 | struct radeon_i2c_bus_rec i2c_bus; | ||
2579 | 2579 | ||
2580 | rev = RBIOS8(offset); | 2580 | rev = RBIOS8(offset); |
2581 | 2581 | ||
@@ -2617,6 +2617,25 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev) | |||
2617 | i2c_new_device(&rdev->pm.i2c_bus->adapter, &info); | 2617 | i2c_new_device(&rdev->pm.i2c_bus->adapter, &info); |
2618 | } | 2618 | } |
2619 | } | 2619 | } |
2620 | } else { | ||
2621 | /* boards with a thermal chip, but no overdrive table */ | ||
2622 | |||
2623 | /* Asus 9600xt has an f75375 on the monid bus */ | ||
2624 | if ((dev->pdev->device == 0x4152) && | ||
2625 | (dev->pdev->subsystem_vendor == 0x1043) && | ||
2626 | (dev->pdev->subsystem_device == 0xc002)) { | ||
2627 | i2c_bus = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0); | ||
2628 | rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus); | ||
2629 | if (rdev->pm.i2c_bus) { | ||
2630 | struct i2c_board_info info = { }; | ||
2631 | const char *name = "f75375"; | ||
2632 | info.addr = 0x28; | ||
2633 | strlcpy(info.type, name, sizeof(info.type)); | ||
2634 | i2c_new_device(&rdev->pm.i2c_bus->adapter, &info); | ||
2635 | DRM_INFO("Possible %s thermal controller at 0x%02x\n", | ||
2636 | name, info.addr); | ||
2637 | } | ||
2638 | } | ||
2620 | } | 2639 | } |
2621 | 2640 | ||
2622 | if (rdev->flags & RADEON_IS_MOBILITY) { | 2641 | if (rdev->flags & RADEON_IS_MOBILITY) { |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 9792d4ffdc86..6d6b5f16bc09 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -430,6 +430,45 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr | |||
430 | return 0; | 430 | return 0; |
431 | } | 431 | } |
432 | 432 | ||
433 | /* | ||
434 | * Some integrated ATI Radeon chipset implementations (e. g. | ||
435 | * Asus M2A-VM HDMI) may indicate the availability of a DDC, | ||
436 | * even when there's no monitor connected. For these connectors | ||
437 | * following DDC probe extension will be applied: check also for the | ||
438 | * availability of EDID with at least a correct EDID header. Only then, | ||
439 | * DDC is assumed to be available. This prevents drm_get_edid() and | ||
440 | * drm_edid_block_valid() from periodically dumping data and kernel | ||
441 | * errors into the logs and onto the terminal. | ||
442 | */ | ||
443 | static bool radeon_connector_needs_extended_probe(struct radeon_device *dev, | ||
444 | uint32_t supported_device, | ||
445 | int connector_type) | ||
446 | { | ||
447 | /* Asus M2A-VM HDMI board sends data to i2c bus even, | ||
448 | * if HDMI add-on card is not plugged in or HDMI is disabled in | ||
449 | * BIOS. Valid DDC can only be assumed, if also a valid EDID header | ||
450 | * can be retrieved via i2c bus during DDC probe */ | ||
451 | if ((dev->pdev->device == 0x791e) && | ||
452 | (dev->pdev->subsystem_vendor == 0x1043) && | ||
453 | (dev->pdev->subsystem_device == 0x826d)) { | ||
454 | if ((connector_type == DRM_MODE_CONNECTOR_HDMIA) && | ||
455 | (supported_device == ATOM_DEVICE_DFP2_SUPPORT)) | ||
456 | return true; | ||
457 | } | ||
458 | /* ECS A740GM-M with ATI RADEON 2100 sends data to i2c bus | ||
459 | * for a DVI connector that is not implemented */ | ||
460 | if ((dev->pdev->device == 0x796e) && | ||
461 | (dev->pdev->subsystem_vendor == 0x1019) && | ||
462 | (dev->pdev->subsystem_device == 0x2615)) { | ||
463 | if ((connector_type == DRM_MODE_CONNECTOR_DVID) && | ||
464 | (supported_device == ATOM_DEVICE_DFP2_SUPPORT)) | ||
465 | return true; | ||
466 | } | ||
467 | |||
468 | /* Default: no EDID header probe required for DDC probing */ | ||
469 | return false; | ||
470 | } | ||
471 | |||
433 | static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder, | 472 | static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder, |
434 | struct drm_connector *connector) | 473 | struct drm_connector *connector) |
435 | { | 474 | { |
@@ -661,7 +700,8 @@ radeon_vga_detect(struct drm_connector *connector, bool force) | |||
661 | ret = connector_status_disconnected; | 700 | ret = connector_status_disconnected; |
662 | 701 | ||
663 | if (radeon_connector->ddc_bus) | 702 | if (radeon_connector->ddc_bus) |
664 | dret = radeon_ddc_probe(radeon_connector); | 703 | dret = radeon_ddc_probe(radeon_connector, |
704 | radeon_connector->requires_extended_probe); | ||
665 | if (dret) { | 705 | if (dret) { |
666 | if (radeon_connector->edid) { | 706 | if (radeon_connector->edid) { |
667 | kfree(radeon_connector->edid); | 707 | kfree(radeon_connector->edid); |
@@ -833,7 +873,8 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | |||
833 | bool dret = false; | 873 | bool dret = false; |
834 | 874 | ||
835 | if (radeon_connector->ddc_bus) | 875 | if (radeon_connector->ddc_bus) |
836 | dret = radeon_ddc_probe(radeon_connector); | 876 | dret = radeon_ddc_probe(radeon_connector, |
877 | radeon_connector->requires_extended_probe); | ||
837 | if (dret) { | 878 | if (dret) { |
838 | if (radeon_connector->edid) { | 879 | if (radeon_connector->edid) { |
839 | kfree(radeon_connector->edid); | 880 | kfree(radeon_connector->edid); |
@@ -1251,7 +1292,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | |||
1251 | if (radeon_dp_getdpcd(radeon_connector)) | 1292 | if (radeon_dp_getdpcd(radeon_connector)) |
1252 | ret = connector_status_connected; | 1293 | ret = connector_status_connected; |
1253 | } else { | 1294 | } else { |
1254 | if (radeon_ddc_probe(radeon_connector)) | 1295 | if (radeon_ddc_probe(radeon_connector, |
1296 | radeon_connector->requires_extended_probe)) | ||
1255 | ret = connector_status_connected; | 1297 | ret = connector_status_connected; |
1256 | } | 1298 | } |
1257 | } | 1299 | } |
@@ -1406,6 +1448,9 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1406 | radeon_connector->shared_ddc = shared_ddc; | 1448 | radeon_connector->shared_ddc = shared_ddc; |
1407 | radeon_connector->connector_object_id = connector_object_id; | 1449 | radeon_connector->connector_object_id = connector_object_id; |
1408 | radeon_connector->hpd = *hpd; | 1450 | radeon_connector->hpd = *hpd; |
1451 | radeon_connector->requires_extended_probe = | ||
1452 | radeon_connector_needs_extended_probe(rdev, supported_device, | ||
1453 | connector_type); | ||
1409 | radeon_connector->router = *router; | 1454 | radeon_connector->router = *router; |
1410 | if (router->ddc_valid || router->cd_valid) { | 1455 | if (router->ddc_valid || router->cd_valid) { |
1411 | radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info); | 1456 | radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info); |
@@ -1752,6 +1797,9 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
1752 | radeon_connector->devices = supported_device; | 1797 | radeon_connector->devices = supported_device; |
1753 | radeon_connector->connector_object_id = connector_object_id; | 1798 | radeon_connector->connector_object_id = connector_object_id; |
1754 | radeon_connector->hpd = *hpd; | 1799 | radeon_connector->hpd = *hpd; |
1800 | radeon_connector->requires_extended_probe = | ||
1801 | radeon_connector_needs_extended_probe(rdev, supported_device, | ||
1802 | connector_type); | ||
1755 | switch (connector_type) { | 1803 | switch (connector_type) { |
1756 | case DRM_MODE_CONNECTOR_VGA: | 1804 | case DRM_MODE_CONNECTOR_VGA: |
1757 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); | 1805 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 7cfaa7e2f3b5..440e6ecccc40 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -704,8 +704,9 @@ int radeon_device_init(struct radeon_device *rdev, | |||
704 | rdev->gpu_lockup = false; | 704 | rdev->gpu_lockup = false; |
705 | rdev->accel_working = false; | 705 | rdev->accel_working = false; |
706 | 706 | ||
707 | DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X).\n", | 707 | DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X).\n", |
708 | radeon_family_name[rdev->family], pdev->vendor, pdev->device); | 708 | radeon_family_name[rdev->family], pdev->vendor, pdev->device, |
709 | pdev->subsystem_vendor, pdev->subsystem_device); | ||
709 | 710 | ||
710 | /* mutex initialization are all done here so we | 711 | /* mutex initialization are all done here so we |
711 | * can recall function without having locking issues */ | 712 | * can recall function without having locking issues */ |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 28f4655905bc..1a858944e4f3 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -751,8 +751,17 @@ static int radeon_ddc_dump(struct drm_connector *connector) | |||
751 | if (!radeon_connector->ddc_bus) | 751 | if (!radeon_connector->ddc_bus) |
752 | return -1; | 752 | return -1; |
753 | edid = drm_get_edid(connector, &radeon_connector->ddc_bus->adapter); | 753 | edid = drm_get_edid(connector, &radeon_connector->ddc_bus->adapter); |
754 | /* Log EDID retrieval status here. In particular with regard to | ||
755 | * connectors with requires_extended_probe flag set, that will prevent | ||
756 | * function radeon_dvi_detect() to fetch EDID on this connector, | ||
757 | * as long as there is no valid EDID header found */ | ||
754 | if (edid) { | 758 | if (edid) { |
759 | DRM_INFO("Radeon display connector %s: Found valid EDID", | ||
760 | drm_get_connector_name(connector)); | ||
755 | kfree(edid); | 761 | kfree(edid); |
762 | } else { | ||
763 | DRM_INFO("Radeon display connector %s: No monitor connected or invalid EDID", | ||
764 | drm_get_connector_name(connector)); | ||
756 | } | 765 | } |
757 | return ret; | 766 | return ret; |
758 | } | 767 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 85f033f19a8a..e71d2ed7fa11 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
@@ -50,8 +50,8 @@ | |||
50 | * 2.7.0 - fixups for r600 2D tiling support. (no external ABI change), add eg dyn gpr regs | 50 | * 2.7.0 - fixups for r600 2D tiling support. (no external ABI change), add eg dyn gpr regs |
51 | * 2.8.0 - pageflip support, r500 US_FORMAT regs. r500 ARGB2101010 colorbuf, r300->r500 CMASK, clock crystal query | 51 | * 2.8.0 - pageflip support, r500 US_FORMAT regs. r500 ARGB2101010 colorbuf, r300->r500 CMASK, clock crystal query |
52 | * 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on r600 + eg, backend query | 52 | * 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on r600 + eg, backend query |
53 | * 2.10.0 - fusion 2D tiling, initial compute support for the CS checker | 53 | * 2.10.0 - fusion 2D tiling |
54 | * 2.11.0 - backend map | 54 | * 2.11.0 - backend map, initial compute support for the CS checker |
55 | */ | 55 | */ |
56 | #define KMS_DRIVER_MAJOR 2 | 56 | #define KMS_DRIVER_MAJOR 2 |
57 | #define KMS_DRIVER_MINOR 11 | 57 | #define KMS_DRIVER_MINOR 11 |
diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c index 781196db792f..6c111c1fa3f9 100644 --- a/drivers/gpu/drm/radeon/radeon_i2c.c +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | |||
@@ -32,17 +32,17 @@ | |||
32 | * radeon_ddc_probe | 32 | * radeon_ddc_probe |
33 | * | 33 | * |
34 | */ | 34 | */ |
35 | bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | 35 | bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool requires_extended_probe) |
36 | { | 36 | { |
37 | u8 out_buf[] = { 0x0, 0x0}; | 37 | u8 out = 0x0; |
38 | u8 buf[2]; | 38 | u8 buf[8]; |
39 | int ret; | 39 | int ret; |
40 | struct i2c_msg msgs[] = { | 40 | struct i2c_msg msgs[] = { |
41 | { | 41 | { |
42 | .addr = 0x50, | 42 | .addr = 0x50, |
43 | .flags = 0, | 43 | .flags = 0, |
44 | .len = 1, | 44 | .len = 1, |
45 | .buf = out_buf, | 45 | .buf = &out, |
46 | }, | 46 | }, |
47 | { | 47 | { |
48 | .addr = 0x50, | 48 | .addr = 0x50, |
@@ -52,15 +52,31 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | |||
52 | } | 52 | } |
53 | }; | 53 | }; |
54 | 54 | ||
55 | /* Read 8 bytes from i2c for extended probe of EDID header */ | ||
56 | if (requires_extended_probe) | ||
57 | msgs[1].len = 8; | ||
58 | |||
55 | /* on hw with routers, select right port */ | 59 | /* on hw with routers, select right port */ |
56 | if (radeon_connector->router.ddc_valid) | 60 | if (radeon_connector->router.ddc_valid) |
57 | radeon_router_select_ddc_port(radeon_connector); | 61 | radeon_router_select_ddc_port(radeon_connector); |
58 | 62 | ||
59 | ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); | 63 | ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); |
60 | if (ret == 2) | 64 | if (ret != 2) |
61 | return true; | 65 | /* Couldn't find an accessible DDC on this connector */ |
62 | 66 | return false; | |
63 | return false; | 67 | if (requires_extended_probe) { |
68 | /* Probe also for valid EDID header | ||
69 | * EDID header starts with: | ||
70 | * 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00. | ||
71 | * Only the first 6 bytes must be valid as | ||
72 | * drm_edid_block_valid() can fix the last 2 bytes */ | ||
73 | if (drm_edid_header_is_valid(buf) < 6) { | ||
74 | /* Couldn't find an accessible EDID on this | ||
75 | * connector */ | ||
76 | return false; | ||
77 | } | ||
78 | } | ||
79 | return true; | ||
64 | } | 80 | } |
65 | 81 | ||
66 | /* bit banging i2c */ | 82 | /* bit banging i2c */ |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 6df4e3cec0c2..d09031c03e26 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -438,6 +438,9 @@ struct radeon_connector { | |||
438 | struct radeon_i2c_chan *ddc_bus; | 438 | struct radeon_i2c_chan *ddc_bus; |
439 | /* some systems have an hdmi and vga port with a shared ddc line */ | 439 | /* some systems have an hdmi and vga port with a shared ddc line */ |
440 | bool shared_ddc; | 440 | bool shared_ddc; |
441 | /* for some Radeon chip families we apply an additional EDID header | ||
442 | check as part of the DDC probe */ | ||
443 | bool requires_extended_probe; | ||
441 | bool use_digital; | 444 | bool use_digital; |
442 | /* we need to mind the EDID between detect | 445 | /* we need to mind the EDID between detect |
443 | and get modes due to analog/digital/tvencoder */ | 446 | and get modes due to analog/digital/tvencoder */ |
@@ -514,7 +517,8 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c, | |||
514 | u8 val); | 517 | u8 val); |
515 | extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); | 518 | extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); |
516 | extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); | 519 | extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); |
517 | extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector); | 520 | extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, |
521 | bool requires_extended_probe); | ||
518 | extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); | 522 | extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); |
519 | 523 | ||
520 | extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); | 524 | extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); |
diff --git a/drivers/ide/cy82c693.c b/drivers/ide/cy82c693.c index 3be60da52123..67cbcfa35122 100644 --- a/drivers/ide/cy82c693.c +++ b/drivers/ide/cy82c693.c | |||
@@ -141,6 +141,8 @@ static void cy82c693_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive) | |||
141 | pci_write_config_byte(dev, CY82_IDE_SLAVE_IOW, time_16); | 141 | pci_write_config_byte(dev, CY82_IDE_SLAVE_IOW, time_16); |
142 | pci_write_config_byte(dev, CY82_IDE_SLAVE_8BIT, time_8); | 142 | pci_write_config_byte(dev, CY82_IDE_SLAVE_8BIT, time_8); |
143 | } | 143 | } |
144 | if (hwif->index > 0) | ||
145 | pci_dev_put(dev); | ||
144 | } | 146 | } |
145 | 147 | ||
146 | static void __devinit init_iops_cy82c693(ide_hwif_t *hwif) | 148 | static void __devinit init_iops_cy82c693(ide_hwif_t *hwif) |
diff --git a/drivers/ide/ide_platform.c b/drivers/ide/ide_platform.c index 542603b394e4..962693b10a1c 100644 --- a/drivers/ide/ide_platform.c +++ b/drivers/ide/ide_platform.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/ata_platform.h> | 20 | #include <linux/ata_platform.h> |
21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
22 | #include <linux/interrupt.h> | ||
22 | #include <linux/io.h> | 23 | #include <linux/io.h> |
23 | 24 | ||
24 | static void __devinit plat_ide_setup_ports(struct ide_hw *hw, | 25 | static void __devinit plat_ide_setup_ports(struct ide_hw *hw, |
@@ -95,7 +96,10 @@ static int __devinit plat_ide_probe(struct platform_device *pdev) | |||
95 | plat_ide_setup_ports(&hw, base, alt_base, pdata, res_irq->start); | 96 | plat_ide_setup_ports(&hw, base, alt_base, pdata, res_irq->start); |
96 | hw.dev = &pdev->dev; | 97 | hw.dev = &pdev->dev; |
97 | 98 | ||
98 | d.irq_flags = res_irq->flags; | 99 | d.irq_flags = res_irq->flags & IRQF_TRIGGER_MASK; |
100 | if (res_irq->flags & IORESOURCE_IRQ_SHAREABLE) | ||
101 | d.irq_flags |= IRQF_SHARED; | ||
102 | |||
99 | if (mmio) | 103 | if (mmio) |
100 | d.host_flags |= IDE_HFLAG_MMIO; | 104 | d.host_flags |= IDE_HFLAG_MMIO; |
101 | 105 | ||
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c index 5b0dba6d4efa..d724a18b5285 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.c +++ b/drivers/net/bnx2x/bnx2x_cmn.c | |||
@@ -1989,14 +1989,20 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode) | |||
1989 | return -EINVAL; | 1989 | return -EINVAL; |
1990 | } | 1990 | } |
1991 | 1991 | ||
1992 | /* | ||
1993 | * It's important to set the bp->state to the value different from | ||
1994 | * BNX2X_STATE_OPEN and only then stop the Tx. Otherwise bnx2x_tx_int() | ||
1995 | * may restart the Tx from the NAPI context (see bnx2x_tx_int()). | ||
1996 | */ | ||
1997 | bp->state = BNX2X_STATE_CLOSING_WAIT4_HALT; | ||
1998 | smp_mb(); | ||
1999 | |||
1992 | /* Stop Tx */ | 2000 | /* Stop Tx */ |
1993 | bnx2x_tx_disable(bp); | 2001 | bnx2x_tx_disable(bp); |
1994 | 2002 | ||
1995 | #ifdef BCM_CNIC | 2003 | #ifdef BCM_CNIC |
1996 | bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); | 2004 | bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD); |
1997 | #endif | 2005 | #endif |
1998 | bp->state = BNX2X_STATE_CLOSING_WAIT4_HALT; | ||
1999 | smp_mb(); | ||
2000 | 2006 | ||
2001 | bp->rx_mode = BNX2X_RX_MODE_NONE; | 2007 | bp->rx_mode = BNX2X_RX_MODE_NONE; |
2002 | 2008 | ||
diff --git a/drivers/net/bnx2x/bnx2x_hsi.h b/drivers/net/bnx2x/bnx2x_hsi.h index 06727f32e505..dc24de40e336 100644 --- a/drivers/net/bnx2x/bnx2x_hsi.h +++ b/drivers/net/bnx2x/bnx2x_hsi.h | |||
@@ -1204,6 +1204,8 @@ struct drv_port_mb { | |||
1204 | 1204 | ||
1205 | #define LINK_STATUS_PFC_ENABLED 0x20000000 | 1205 | #define LINK_STATUS_PFC_ENABLED 0x20000000 |
1206 | 1206 | ||
1207 | #define LINK_STATUS_PHYSICAL_LINK_FLAG 0x40000000 | ||
1208 | |||
1207 | u32 port_stx; | 1209 | u32 port_stx; |
1208 | 1210 | ||
1209 | u32 stat_nig_timer; | 1211 | u32 stat_nig_timer; |
diff --git a/drivers/net/bnx2x/bnx2x_link.c b/drivers/net/bnx2x/bnx2x_link.c index bcd8f0038628..d45b1555a602 100644 --- a/drivers/net/bnx2x/bnx2x_link.c +++ b/drivers/net/bnx2x/bnx2x_link.c | |||
@@ -1546,6 +1546,12 @@ static void bnx2x_umac_enable(struct link_params *params, | |||
1546 | vars->line_speed); | 1546 | vars->line_speed); |
1547 | break; | 1547 | break; |
1548 | } | 1548 | } |
1549 | if (!(vars->flow_ctrl & BNX2X_FLOW_CTRL_TX)) | ||
1550 | val |= UMAC_COMMAND_CONFIG_REG_IGNORE_TX_PAUSE; | ||
1551 | |||
1552 | if (!(vars->flow_ctrl & BNX2X_FLOW_CTRL_RX)) | ||
1553 | val |= UMAC_COMMAND_CONFIG_REG_PAUSE_IGNORE; | ||
1554 | |||
1549 | REG_WR(bp, umac_base + UMAC_REG_COMMAND_CONFIG, val); | 1555 | REG_WR(bp, umac_base + UMAC_REG_COMMAND_CONFIG, val); |
1550 | udelay(50); | 1556 | udelay(50); |
1551 | 1557 | ||
@@ -1661,10 +1667,20 @@ static void bnx2x_xmac_disable(struct link_params *params) | |||
1661 | { | 1667 | { |
1662 | u8 port = params->port; | 1668 | u8 port = params->port; |
1663 | struct bnx2x *bp = params->bp; | 1669 | struct bnx2x *bp = params->bp; |
1664 | u32 xmac_base = (port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; | 1670 | u32 pfc_ctrl, xmac_base = (port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; |
1665 | 1671 | ||
1666 | if (REG_RD(bp, MISC_REG_RESET_REG_2) & | 1672 | if (REG_RD(bp, MISC_REG_RESET_REG_2) & |
1667 | MISC_REGISTERS_RESET_REG_2_XMAC) { | 1673 | MISC_REGISTERS_RESET_REG_2_XMAC) { |
1674 | /* | ||
1675 | * Send an indication to change the state in the NIG back to XON | ||
1676 | * Clearing this bit enables the next set of this bit to get | ||
1677 | * rising edge | ||
1678 | */ | ||
1679 | pfc_ctrl = REG_RD(bp, xmac_base + XMAC_REG_PFC_CTRL_HI); | ||
1680 | REG_WR(bp, xmac_base + XMAC_REG_PFC_CTRL_HI, | ||
1681 | (pfc_ctrl & ~(1<<1))); | ||
1682 | REG_WR(bp, xmac_base + XMAC_REG_PFC_CTRL_HI, | ||
1683 | (pfc_ctrl | (1<<1))); | ||
1668 | DP(NETIF_MSG_LINK, "Disable XMAC on port %x\n", port); | 1684 | DP(NETIF_MSG_LINK, "Disable XMAC on port %x\n", port); |
1669 | REG_WR(bp, xmac_base + XMAC_REG_CTRL, 0); | 1685 | REG_WR(bp, xmac_base + XMAC_REG_CTRL, 0); |
1670 | usleep_range(1000, 1000); | 1686 | usleep_range(1000, 1000); |
@@ -1729,6 +1745,10 @@ static int bnx2x_emac_enable(struct link_params *params, | |||
1729 | 1745 | ||
1730 | DP(NETIF_MSG_LINK, "enabling EMAC\n"); | 1746 | DP(NETIF_MSG_LINK, "enabling EMAC\n"); |
1731 | 1747 | ||
1748 | /* Disable BMAC */ | ||
1749 | REG_WR(bp, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_2_CLEAR, | ||
1750 | (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << port)); | ||
1751 | |||
1732 | /* enable emac and not bmac */ | 1752 | /* enable emac and not bmac */ |
1733 | REG_WR(bp, NIG_REG_EGRESS_EMAC0_PORT + port*4, 1); | 1753 | REG_WR(bp, NIG_REG_EGRESS_EMAC0_PORT + port*4, 1); |
1734 | 1754 | ||
@@ -2583,12 +2603,6 @@ static int bnx2x_bmac1_enable(struct link_params *params, | |||
2583 | REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_RX_LLFC_MSG_FLDS, | 2603 | REG_WR_DMAE(bp, bmac_addr + BIGMAC_REGISTER_RX_LLFC_MSG_FLDS, |
2584 | wb_data, 2); | 2604 | wb_data, 2); |
2585 | 2605 | ||
2586 | if (vars->phy_flags & PHY_TX_ERROR_CHECK_FLAG) { | ||
2587 | REG_RD_DMAE(bp, bmac_addr + BIGMAC_REGISTER_RX_LSS_STATUS, | ||
2588 | wb_data, 2); | ||
2589 | if (wb_data[0] > 0) | ||
2590 | return -ESRCH; | ||
2591 | } | ||
2592 | return 0; | 2606 | return 0; |
2593 | } | 2607 | } |
2594 | 2608 | ||
@@ -2654,16 +2668,6 @@ static int bnx2x_bmac2_enable(struct link_params *params, | |||
2654 | udelay(30); | 2668 | udelay(30); |
2655 | bnx2x_update_pfc_bmac2(params, vars, is_lb); | 2669 | bnx2x_update_pfc_bmac2(params, vars, is_lb); |
2656 | 2670 | ||
2657 | if (vars->phy_flags & PHY_TX_ERROR_CHECK_FLAG) { | ||
2658 | REG_RD_DMAE(bp, bmac_addr + BIGMAC2_REGISTER_RX_LSS_STAT, | ||
2659 | wb_data, 2); | ||
2660 | if (wb_data[0] > 0) { | ||
2661 | DP(NETIF_MSG_LINK, "Got bad LSS status 0x%x\n", | ||
2662 | wb_data[0]); | ||
2663 | return -ESRCH; | ||
2664 | } | ||
2665 | } | ||
2666 | |||
2667 | return 0; | 2671 | return 0; |
2668 | } | 2672 | } |
2669 | 2673 | ||
@@ -2949,7 +2953,9 @@ static int bnx2x_cl45_read(struct bnx2x *bp, struct bnx2x_phy *phy, | |||
2949 | u32 val; | 2953 | u32 val; |
2950 | u16 i; | 2954 | u16 i; |
2951 | int rc = 0; | 2955 | int rc = 0; |
2952 | 2956 | if (phy->flags & FLAGS_MDC_MDIO_WA_B0) | |
2957 | bnx2x_bits_en(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS, | ||
2958 | EMAC_MDIO_STATUS_10MB); | ||
2953 | /* address */ | 2959 | /* address */ |
2954 | val = ((phy->addr << 21) | (devad << 16) | reg | | 2960 | val = ((phy->addr << 21) | (devad << 16) | reg | |
2955 | EMAC_MDIO_COMM_COMMAND_ADDRESS | | 2961 | EMAC_MDIO_COMM_COMMAND_ADDRESS | |
@@ -3003,6 +3009,9 @@ static int bnx2x_cl45_read(struct bnx2x *bp, struct bnx2x_phy *phy, | |||
3003 | } | 3009 | } |
3004 | } | 3010 | } |
3005 | 3011 | ||
3012 | if (phy->flags & FLAGS_MDC_MDIO_WA_B0) | ||
3013 | bnx2x_bits_dis(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS, | ||
3014 | EMAC_MDIO_STATUS_10MB); | ||
3006 | return rc; | 3015 | return rc; |
3007 | } | 3016 | } |
3008 | 3017 | ||
@@ -3012,6 +3021,9 @@ static int bnx2x_cl45_write(struct bnx2x *bp, struct bnx2x_phy *phy, | |||
3012 | u32 tmp; | 3021 | u32 tmp; |
3013 | u8 i; | 3022 | u8 i; |
3014 | int rc = 0; | 3023 | int rc = 0; |
3024 | if (phy->flags & FLAGS_MDC_MDIO_WA_B0) | ||
3025 | bnx2x_bits_en(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS, | ||
3026 | EMAC_MDIO_STATUS_10MB); | ||
3015 | 3027 | ||
3016 | /* address */ | 3028 | /* address */ |
3017 | 3029 | ||
@@ -3065,7 +3077,9 @@ static int bnx2x_cl45_write(struct bnx2x *bp, struct bnx2x_phy *phy, | |||
3065 | bnx2x_cl45_read(bp, phy, devad, 0xf, &temp_val); | 3077 | bnx2x_cl45_read(bp, phy, devad, 0xf, &temp_val); |
3066 | } | 3078 | } |
3067 | } | 3079 | } |
3068 | 3080 | if (phy->flags & FLAGS_MDC_MDIO_WA_B0) | |
3081 | bnx2x_bits_dis(bp, phy->mdio_ctrl + EMAC_REG_EMAC_MDIO_STATUS, | ||
3082 | EMAC_MDIO_STATUS_10MB); | ||
3069 | return rc; | 3083 | return rc; |
3070 | } | 3084 | } |
3071 | 3085 | ||
@@ -4353,6 +4367,9 @@ void bnx2x_link_status_update(struct link_params *params, | |||
4353 | 4367 | ||
4354 | vars->link_up = (vars->link_status & LINK_STATUS_LINK_UP); | 4368 | vars->link_up = (vars->link_status & LINK_STATUS_LINK_UP); |
4355 | vars->phy_flags = PHY_XGXS_FLAG; | 4369 | vars->phy_flags = PHY_XGXS_FLAG; |
4370 | if (vars->link_status & LINK_STATUS_PHYSICAL_LINK_FLAG) | ||
4371 | vars->phy_flags |= PHY_PHYSICAL_LINK_FLAG; | ||
4372 | |||
4356 | if (vars->link_up) { | 4373 | if (vars->link_up) { |
4357 | DP(NETIF_MSG_LINK, "phy link up\n"); | 4374 | DP(NETIF_MSG_LINK, "phy link up\n"); |
4358 | 4375 | ||
@@ -4444,6 +4461,8 @@ void bnx2x_link_status_update(struct link_params *params, | |||
4444 | 4461 | ||
4445 | /* indicate no mac active */ | 4462 | /* indicate no mac active */ |
4446 | vars->mac_type = MAC_TYPE_NONE; | 4463 | vars->mac_type = MAC_TYPE_NONE; |
4464 | if (vars->link_status & LINK_STATUS_PHYSICAL_LINK_FLAG) | ||
4465 | vars->phy_flags |= PHY_HALF_OPEN_CONN_FLAG; | ||
4447 | } | 4466 | } |
4448 | 4467 | ||
4449 | /* Sync media type */ | 4468 | /* Sync media type */ |
@@ -5903,20 +5922,30 @@ int bnx2x_set_led(struct link_params *params, | |||
5903 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); | 5922 | tmp = EMAC_RD(bp, EMAC_REG_EMAC_LED); |
5904 | EMAC_WR(bp, EMAC_REG_EMAC_LED, | 5923 | EMAC_WR(bp, EMAC_REG_EMAC_LED, |
5905 | (tmp | EMAC_LED_OVERRIDE)); | 5924 | (tmp | EMAC_LED_OVERRIDE)); |
5906 | return rc; | 5925 | /* |
5926 | * return here without enabling traffic | ||
5927 | * LED blink andsetting rate in ON mode. | ||
5928 | * In oper mode, enabling LED blink | ||
5929 | * and setting rate is needed. | ||
5930 | */ | ||
5931 | if (mode == LED_MODE_ON) | ||
5932 | return rc; | ||
5907 | } | 5933 | } |
5908 | } else if (SINGLE_MEDIA_DIRECT(params) && | 5934 | } else if (SINGLE_MEDIA_DIRECT(params)) { |
5909 | (CHIP_IS_E1x(bp) || | ||
5910 | CHIP_IS_E2(bp))) { | ||
5911 | /* | 5935 | /* |
5912 | * This is a work-around for HW issue found when link | 5936 | * This is a work-around for HW issue found when link |
5913 | * is up in CL73 | 5937 | * is up in CL73 |
5914 | */ | 5938 | */ |
5915 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0); | ||
5916 | REG_WR(bp, NIG_REG_LED_10G_P0 + port*4, 1); | 5939 | REG_WR(bp, NIG_REG_LED_10G_P0 + port*4, 1); |
5917 | } else { | 5940 | if (CHIP_IS_E1x(bp) || |
5941 | CHIP_IS_E2(bp) || | ||
5942 | (mode == LED_MODE_ON)) | ||
5943 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, 0); | ||
5944 | else | ||
5945 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, | ||
5946 | hw_led_mode); | ||
5947 | } else | ||
5918 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, hw_led_mode); | 5948 | REG_WR(bp, NIG_REG_LED_MODE_P0 + port*4, hw_led_mode); |
5919 | } | ||
5920 | 5949 | ||
5921 | REG_WR(bp, NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0 + port*4, 0); | 5950 | REG_WR(bp, NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0 + port*4, 0); |
5922 | /* Set blinking rate to ~15.9Hz */ | 5951 | /* Set blinking rate to ~15.9Hz */ |
@@ -6160,6 +6189,7 @@ static int bnx2x_update_link_down(struct link_params *params, | |||
6160 | /* update shared memory */ | 6189 | /* update shared memory */ |
6161 | vars->link_status &= ~(LINK_STATUS_SPEED_AND_DUPLEX_MASK | | 6190 | vars->link_status &= ~(LINK_STATUS_SPEED_AND_DUPLEX_MASK | |
6162 | LINK_STATUS_LINK_UP | | 6191 | LINK_STATUS_LINK_UP | |
6192 | LINK_STATUS_PHYSICAL_LINK_FLAG | | ||
6163 | LINK_STATUS_AUTO_NEGOTIATE_COMPLETE | | 6193 | LINK_STATUS_AUTO_NEGOTIATE_COMPLETE | |
6164 | LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK | | 6194 | LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK | |
6165 | LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK | | 6195 | LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK | |
@@ -6197,7 +6227,8 @@ static int bnx2x_update_link_up(struct link_params *params, | |||
6197 | u8 port = params->port; | 6227 | u8 port = params->port; |
6198 | int rc = 0; | 6228 | int rc = 0; |
6199 | 6229 | ||
6200 | vars->link_status |= LINK_STATUS_LINK_UP; | 6230 | vars->link_status |= (LINK_STATUS_LINK_UP | |
6231 | LINK_STATUS_PHYSICAL_LINK_FLAG); | ||
6201 | vars->phy_flags |= PHY_PHYSICAL_LINK_FLAG; | 6232 | vars->phy_flags |= PHY_PHYSICAL_LINK_FLAG; |
6202 | 6233 | ||
6203 | if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX) | 6234 | if (vars->flow_ctrl & BNX2X_FLOW_CTRL_TX) |
@@ -7998,6 +8029,9 @@ static void bnx2x_warpcore_set_limiting_mode(struct link_params *params, | |||
7998 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, | 8029 | bnx2x_cl45_read(bp, phy, MDIO_WC_DEVAD, |
7999 | MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE, &val); | 8030 | MDIO_WC_REG_UC_INFO_B1_FIRMWARE_MODE, &val); |
8000 | 8031 | ||
8032 | /* Restart microcode to re-read the new mode */ | ||
8033 | bnx2x_warpcore_reset_lane(bp, phy, 1); | ||
8034 | bnx2x_warpcore_reset_lane(bp, phy, 0); | ||
8001 | 8035 | ||
8002 | } | 8036 | } |
8003 | 8037 | ||
@@ -8116,7 +8150,6 @@ void bnx2x_handle_module_detect_int(struct link_params *params) | |||
8116 | offsetof(struct shmem_region, dev_info. | 8150 | offsetof(struct shmem_region, dev_info. |
8117 | port_feature_config[params->port]. | 8151 | port_feature_config[params->port]. |
8118 | config)); | 8152 | config)); |
8119 | |||
8120 | bnx2x_set_gpio_int(bp, gpio_num, | 8153 | bnx2x_set_gpio_int(bp, gpio_num, |
8121 | MISC_REGISTERS_GPIO_INT_OUTPUT_SET, | 8154 | MISC_REGISTERS_GPIO_INT_OUTPUT_SET, |
8122 | gpio_port); | 8155 | gpio_port); |
@@ -8125,8 +8158,9 @@ void bnx2x_handle_module_detect_int(struct link_params *params) | |||
8125 | * Disable transmit for this module | 8158 | * Disable transmit for this module |
8126 | */ | 8159 | */ |
8127 | phy->media_type = ETH_PHY_NOT_PRESENT; | 8160 | phy->media_type = ETH_PHY_NOT_PRESENT; |
8128 | if ((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) == | 8161 | if (((val & PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK) == |
8129 | PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER) | 8162 | PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER) || |
8163 | CHIP_IS_E3(bp)) | ||
8130 | bnx2x_sfp_set_transmitter(params, phy, 0); | 8164 | bnx2x_sfp_set_transmitter(params, phy, 0); |
8131 | } | 8165 | } |
8132 | } | 8166 | } |
@@ -8228,9 +8262,6 @@ static u8 bnx2x_8706_config_init(struct bnx2x_phy *phy, | |||
8228 | u16 cnt, val, tmp1; | 8262 | u16 cnt, val, tmp1; |
8229 | struct bnx2x *bp = params->bp; | 8263 | struct bnx2x *bp = params->bp; |
8230 | 8264 | ||
8231 | /* SPF+ PHY: Set flag to check for Tx error */ | ||
8232 | vars->phy_flags = PHY_TX_ERROR_CHECK_FLAG; | ||
8233 | |||
8234 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, | 8265 | bnx2x_set_gpio(bp, MISC_REGISTERS_GPIO_2, |
8235 | MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); | 8266 | MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); |
8236 | /* HW reset */ | 8267 | /* HW reset */ |
@@ -8414,9 +8445,6 @@ static int bnx2x_8726_config_init(struct bnx2x_phy *phy, | |||
8414 | struct bnx2x *bp = params->bp; | 8445 | struct bnx2x *bp = params->bp; |
8415 | DP(NETIF_MSG_LINK, "Initializing BCM8726\n"); | 8446 | DP(NETIF_MSG_LINK, "Initializing BCM8726\n"); |
8416 | 8447 | ||
8417 | /* SPF+ PHY: Set flag to check for Tx error */ | ||
8418 | vars->phy_flags = PHY_TX_ERROR_CHECK_FLAG; | ||
8419 | |||
8420 | bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 1<<15); | 8448 | bnx2x_cl45_write(bp, phy, MDIO_PMA_DEVAD, MDIO_PMA_REG_CTRL, 1<<15); |
8421 | bnx2x_wait_reset_complete(bp, phy, params); | 8449 | bnx2x_wait_reset_complete(bp, phy, params); |
8422 | 8450 | ||
@@ -8585,9 +8613,6 @@ static int bnx2x_8727_config_init(struct bnx2x_phy *phy, | |||
8585 | struct bnx2x *bp = params->bp; | 8613 | struct bnx2x *bp = params->bp; |
8586 | /* Enable PMD link, MOD_ABS_FLT, and 1G link alarm */ | 8614 | /* Enable PMD link, MOD_ABS_FLT, and 1G link alarm */ |
8587 | 8615 | ||
8588 | /* SPF+ PHY: Set flag to check for Tx error */ | ||
8589 | vars->phy_flags = PHY_TX_ERROR_CHECK_FLAG; | ||
8590 | |||
8591 | bnx2x_wait_reset_complete(bp, phy, params); | 8616 | bnx2x_wait_reset_complete(bp, phy, params); |
8592 | rx_alarm_ctrl_val = (1<<2) | (1<<5) ; | 8617 | rx_alarm_ctrl_val = (1<<2) | (1<<5) ; |
8593 | /* Should be 0x6 to enable XS on Tx side. */ | 8618 | /* Should be 0x6 to enable XS on Tx side. */ |
@@ -9243,7 +9268,13 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy, | |||
9243 | if (phy->req_duplex == DUPLEX_FULL) | 9268 | if (phy->req_duplex == DUPLEX_FULL) |
9244 | autoneg_val |= (1<<8); | 9269 | autoneg_val |= (1<<8); |
9245 | 9270 | ||
9246 | bnx2x_cl45_write(bp, phy, | 9271 | /* |
9272 | * Always write this if this is not 84833. | ||
9273 | * For 84833, write it only when it's a forced speed. | ||
9274 | */ | ||
9275 | if ((phy->type != PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833) || | ||
9276 | ((autoneg_val & (1<<12)) == 0)) | ||
9277 | bnx2x_cl45_write(bp, phy, | ||
9247 | MDIO_AN_DEVAD, | 9278 | MDIO_AN_DEVAD, |
9248 | MDIO_AN_REG_8481_LEGACY_MII_CTRL, autoneg_val); | 9279 | MDIO_AN_REG_8481_LEGACY_MII_CTRL, autoneg_val); |
9249 | 9280 | ||
@@ -9257,13 +9288,12 @@ static int bnx2x_848xx_cmn_config_init(struct bnx2x_phy *phy, | |||
9257 | bnx2x_cl45_write(bp, phy, | 9288 | bnx2x_cl45_write(bp, phy, |
9258 | MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, | 9289 | MDIO_AN_DEVAD, MDIO_AN_REG_CTRL, |
9259 | 0x3200); | 9290 | 0x3200); |
9260 | } else if (phy->req_line_speed != SPEED_10 && | 9291 | } else |
9261 | phy->req_line_speed != SPEED_100) { | ||
9262 | bnx2x_cl45_write(bp, phy, | 9292 | bnx2x_cl45_write(bp, phy, |
9263 | MDIO_AN_DEVAD, | 9293 | MDIO_AN_DEVAD, |
9264 | MDIO_AN_REG_8481_10GBASE_T_AN_CTRL, | 9294 | MDIO_AN_REG_8481_10GBASE_T_AN_CTRL, |
9265 | 1); | 9295 | 1); |
9266 | } | 9296 | |
9267 | /* Save spirom version */ | 9297 | /* Save spirom version */ |
9268 | bnx2x_save_848xx_spirom_version(phy, params); | 9298 | bnx2x_save_848xx_spirom_version(phy, params); |
9269 | 9299 | ||
@@ -9756,11 +9786,9 @@ static void bnx2x_848x3_link_reset(struct bnx2x_phy *phy, | |||
9756 | bnx2x_cl45_read(bp, phy, | 9786 | bnx2x_cl45_read(bp, phy, |
9757 | MDIO_CTL_DEVAD, | 9787 | MDIO_CTL_DEVAD, |
9758 | 0x400f, &val16); | 9788 | 0x400f, &val16); |
9759 | /* Put to low power mode on newer FW */ | 9789 | bnx2x_cl45_write(bp, phy, |
9760 | if ((val16 & 0x303f) > 0x1009) | 9790 | MDIO_PMA_DEVAD, |
9761 | bnx2x_cl45_write(bp, phy, | 9791 | MDIO_PMA_REG_CTRL, 0x800); |
9762 | MDIO_PMA_DEVAD, | ||
9763 | MDIO_PMA_REG_CTRL, 0x800); | ||
9764 | } | 9792 | } |
9765 | } | 9793 | } |
9766 | 9794 | ||
@@ -10191,8 +10219,15 @@ static void bnx2x_54618se_link_reset(struct bnx2x_phy *phy, | |||
10191 | u32 cfg_pin; | 10219 | u32 cfg_pin; |
10192 | u8 port; | 10220 | u8 port; |
10193 | 10221 | ||
10194 | /* This works with E3 only, no need to check the chip | 10222 | /* |
10195 | before determining the port. */ | 10223 | * In case of no EPIO routed to reset the GPHY, put it |
10224 | * in low power mode. | ||
10225 | */ | ||
10226 | bnx2x_cl22_write(bp, phy, MDIO_PMA_REG_CTRL, 0x800); | ||
10227 | /* | ||
10228 | * This works with E3 only, no need to check the chip | ||
10229 | * before determining the port. | ||
10230 | */ | ||
10196 | port = params->port; | 10231 | port = params->port; |
10197 | cfg_pin = (REG_RD(bp, params->shmem_base + | 10232 | cfg_pin = (REG_RD(bp, params->shmem_base + |
10198 | offsetof(struct shmem_region, | 10233 | offsetof(struct shmem_region, |
@@ -10603,7 +10638,8 @@ static struct bnx2x_phy phy_warpcore = { | |||
10603 | .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT, | 10638 | .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT, |
10604 | .addr = 0xff, | 10639 | .addr = 0xff, |
10605 | .def_md_devad = 0, | 10640 | .def_md_devad = 0, |
10606 | .flags = FLAGS_HW_LOCK_REQUIRED, | 10641 | .flags = (FLAGS_HW_LOCK_REQUIRED | |
10642 | FLAGS_TX_ERROR_CHECK), | ||
10607 | .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, | 10643 | .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, |
10608 | .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, | 10644 | .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, |
10609 | .mdio_ctrl = 0, | 10645 | .mdio_ctrl = 0, |
@@ -10729,7 +10765,8 @@ static struct bnx2x_phy phy_8706 = { | |||
10729 | .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706, | 10765 | .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706, |
10730 | .addr = 0xff, | 10766 | .addr = 0xff, |
10731 | .def_md_devad = 0, | 10767 | .def_md_devad = 0, |
10732 | .flags = FLAGS_INIT_XGXS_FIRST, | 10768 | .flags = (FLAGS_INIT_XGXS_FIRST | |
10769 | FLAGS_TX_ERROR_CHECK), | ||
10733 | .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, | 10770 | .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, |
10734 | .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, | 10771 | .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, |
10735 | .mdio_ctrl = 0, | 10772 | .mdio_ctrl = 0, |
@@ -10760,7 +10797,8 @@ static struct bnx2x_phy phy_8726 = { | |||
10760 | .addr = 0xff, | 10797 | .addr = 0xff, |
10761 | .def_md_devad = 0, | 10798 | .def_md_devad = 0, |
10762 | .flags = (FLAGS_HW_LOCK_REQUIRED | | 10799 | .flags = (FLAGS_HW_LOCK_REQUIRED | |
10763 | FLAGS_INIT_XGXS_FIRST), | 10800 | FLAGS_INIT_XGXS_FIRST | |
10801 | FLAGS_TX_ERROR_CHECK), | ||
10764 | .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, | 10802 | .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, |
10765 | .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, | 10803 | .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, |
10766 | .mdio_ctrl = 0, | 10804 | .mdio_ctrl = 0, |
@@ -10791,7 +10829,8 @@ static struct bnx2x_phy phy_8727 = { | |||
10791 | .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, | 10829 | .type = PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727, |
10792 | .addr = 0xff, | 10830 | .addr = 0xff, |
10793 | .def_md_devad = 0, | 10831 | .def_md_devad = 0, |
10794 | .flags = FLAGS_FAN_FAILURE_DET_REQ, | 10832 | .flags = (FLAGS_FAN_FAILURE_DET_REQ | |
10833 | FLAGS_TX_ERROR_CHECK), | ||
10795 | .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, | 10834 | .rx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, |
10796 | .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, | 10835 | .tx_preemphasis = {0xffff, 0xffff, 0xffff, 0xffff}, |
10797 | .mdio_ctrl = 0, | 10836 | .mdio_ctrl = 0, |
@@ -11112,6 +11151,8 @@ static int bnx2x_populate_int_phy(struct bnx2x *bp, u32 shmem_base, u8 port, | |||
11112 | */ | 11151 | */ |
11113 | if (CHIP_REV(bp) == CHIP_REV_Ax) | 11152 | if (CHIP_REV(bp) == CHIP_REV_Ax) |
11114 | phy->flags |= FLAGS_MDC_MDIO_WA; | 11153 | phy->flags |= FLAGS_MDC_MDIO_WA; |
11154 | else | ||
11155 | phy->flags |= FLAGS_MDC_MDIO_WA_B0; | ||
11115 | } else { | 11156 | } else { |
11116 | switch (switch_cfg) { | 11157 | switch (switch_cfg) { |
11117 | case SWITCH_CFG_1G: | 11158 | case SWITCH_CFG_1G: |
@@ -11500,13 +11541,12 @@ void bnx2x_init_xmac_loopback(struct link_params *params, | |||
11500 | * Set WC to loopback mode since link is required to provide clock | 11541 | * Set WC to loopback mode since link is required to provide clock |
11501 | * to the XMAC in 20G mode | 11542 | * to the XMAC in 20G mode |
11502 | */ | 11543 | */ |
11503 | if (vars->line_speed == SPEED_20000) { | 11544 | bnx2x_set_aer_mmd(params, ¶ms->phy[0]); |
11504 | bnx2x_set_aer_mmd(params, ¶ms->phy[0]); | 11545 | bnx2x_warpcore_reset_lane(bp, ¶ms->phy[0], 0); |
11505 | bnx2x_warpcore_reset_lane(bp, ¶ms->phy[0], 0); | 11546 | params->phy[INT_PHY].config_loopback( |
11506 | params->phy[INT_PHY].config_loopback( | ||
11507 | ¶ms->phy[INT_PHY], | 11547 | ¶ms->phy[INT_PHY], |
11508 | params); | 11548 | params); |
11509 | } | 11549 | |
11510 | bnx2x_xmac_enable(params, vars, 1); | 11550 | bnx2x_xmac_enable(params, vars, 1); |
11511 | REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); | 11551 | REG_WR(bp, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); |
11512 | } | 11552 | } |
@@ -11684,12 +11724,16 @@ int bnx2x_link_reset(struct link_params *params, struct link_vars *vars, | |||
11684 | bnx2x_set_led(params, vars, LED_MODE_OFF, 0); | 11724 | bnx2x_set_led(params, vars, LED_MODE_OFF, 0); |
11685 | 11725 | ||
11686 | if (reset_ext_phy) { | 11726 | if (reset_ext_phy) { |
11727 | bnx2x_set_mdio_clk(bp, params->chip_id, port); | ||
11687 | for (phy_index = EXT_PHY1; phy_index < params->num_phys; | 11728 | for (phy_index = EXT_PHY1; phy_index < params->num_phys; |
11688 | phy_index++) { | 11729 | phy_index++) { |
11689 | if (params->phy[phy_index].link_reset) | 11730 | if (params->phy[phy_index].link_reset) { |
11731 | bnx2x_set_aer_mmd(params, | ||
11732 | ¶ms->phy[phy_index]); | ||
11690 | params->phy[phy_index].link_reset( | 11733 | params->phy[phy_index].link_reset( |
11691 | ¶ms->phy[phy_index], | 11734 | ¶ms->phy[phy_index], |
11692 | params); | 11735 | params); |
11736 | } | ||
11693 | if (params->phy[phy_index].flags & | 11737 | if (params->phy[phy_index].flags & |
11694 | FLAGS_REARM_LATCH_SIGNAL) | 11738 | FLAGS_REARM_LATCH_SIGNAL) |
11695 | clear_latch_ind = 1; | 11739 | clear_latch_ind = 1; |
@@ -12178,10 +12222,6 @@ static void bnx2x_analyze_link_error(struct link_params *params, | |||
12178 | u8 led_mode; | 12222 | u8 led_mode; |
12179 | u32 half_open_conn = (vars->phy_flags & PHY_HALF_OPEN_CONN_FLAG) > 0; | 12223 | u32 half_open_conn = (vars->phy_flags & PHY_HALF_OPEN_CONN_FLAG) > 0; |
12180 | 12224 | ||
12181 | /*DP(NETIF_MSG_LINK, "CHECK LINK: %x half_open:%x-> lss:%x\n", | ||
12182 | vars->link_up, | ||
12183 | half_open_conn, lss_status);*/ | ||
12184 | |||
12185 | if ((lss_status ^ half_open_conn) == 0) | 12225 | if ((lss_status ^ half_open_conn) == 0) |
12186 | return; | 12226 | return; |
12187 | 12227 | ||
@@ -12194,6 +12234,7 @@ static void bnx2x_analyze_link_error(struct link_params *params, | |||
12194 | * b. Update link_vars->link_up | 12234 | * b. Update link_vars->link_up |
12195 | */ | 12235 | */ |
12196 | if (lss_status) { | 12236 | if (lss_status) { |
12237 | DP(NETIF_MSG_LINK, "Remote Fault detected !!!\n"); | ||
12197 | vars->link_status &= ~LINK_STATUS_LINK_UP; | 12238 | vars->link_status &= ~LINK_STATUS_LINK_UP; |
12198 | vars->link_up = 0; | 12239 | vars->link_up = 0; |
12199 | vars->phy_flags |= PHY_HALF_OPEN_CONN_FLAG; | 12240 | vars->phy_flags |= PHY_HALF_OPEN_CONN_FLAG; |
@@ -12203,6 +12244,7 @@ static void bnx2x_analyze_link_error(struct link_params *params, | |||
12203 | */ | 12244 | */ |
12204 | led_mode = LED_MODE_OFF; | 12245 | led_mode = LED_MODE_OFF; |
12205 | } else { | 12246 | } else { |
12247 | DP(NETIF_MSG_LINK, "Remote Fault cleared\n"); | ||
12206 | vars->link_status |= LINK_STATUS_LINK_UP; | 12248 | vars->link_status |= LINK_STATUS_LINK_UP; |
12207 | vars->link_up = 1; | 12249 | vars->link_up = 1; |
12208 | vars->phy_flags &= ~PHY_HALF_OPEN_CONN_FLAG; | 12250 | vars->phy_flags &= ~PHY_HALF_OPEN_CONN_FLAG; |
@@ -12219,6 +12261,15 @@ static void bnx2x_analyze_link_error(struct link_params *params, | |||
12219 | bnx2x_notify_link_changed(bp); | 12261 | bnx2x_notify_link_changed(bp); |
12220 | } | 12262 | } |
12221 | 12263 | ||
12264 | /****************************************************************************** | ||
12265 | * Description: | ||
12266 | * This function checks for half opened connection change indication. | ||
12267 | * When such change occurs, it calls the bnx2x_analyze_link_error | ||
12268 | * to check if Remote Fault is set or cleared. Reception of remote fault | ||
12269 | * status message in the MAC indicates that the peer's MAC has detected | ||
12270 | * a fault, for example, due to break in the TX side of fiber. | ||
12271 | * | ||
12272 | ******************************************************************************/ | ||
12222 | static void bnx2x_check_half_open_conn(struct link_params *params, | 12273 | static void bnx2x_check_half_open_conn(struct link_params *params, |
12223 | struct link_vars *vars) | 12274 | struct link_vars *vars) |
12224 | { | 12275 | { |
@@ -12229,9 +12280,28 @@ static void bnx2x_check_half_open_conn(struct link_params *params, | |||
12229 | if ((vars->phy_flags & PHY_PHYSICAL_LINK_FLAG) == 0) | 12280 | if ((vars->phy_flags & PHY_PHYSICAL_LINK_FLAG) == 0) |
12230 | return; | 12281 | return; |
12231 | 12282 | ||
12232 | if (!CHIP_IS_E3(bp) && | 12283 | if (CHIP_IS_E3(bp) && |
12233 | (REG_RD(bp, MISC_REG_RESET_REG_2) & | 12284 | (REG_RD(bp, MISC_REG_RESET_REG_2) & |
12234 | (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port))) { | 12285 | (MISC_REGISTERS_RESET_REG_2_XMAC))) { |
12286 | /* Check E3 XMAC */ | ||
12287 | /* | ||
12288 | * Note that link speed cannot be queried here, since it may be | ||
12289 | * zero while link is down. In case UMAC is active, LSS will | ||
12290 | * simply not be set | ||
12291 | */ | ||
12292 | mac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; | ||
12293 | |||
12294 | /* Clear stick bits (Requires rising edge) */ | ||
12295 | REG_WR(bp, mac_base + XMAC_REG_CLEAR_RX_LSS_STATUS, 0); | ||
12296 | REG_WR(bp, mac_base + XMAC_REG_CLEAR_RX_LSS_STATUS, | ||
12297 | XMAC_CLEAR_RX_LSS_STATUS_REG_CLEAR_LOCAL_FAULT_STATUS | | ||
12298 | XMAC_CLEAR_RX_LSS_STATUS_REG_CLEAR_REMOTE_FAULT_STATUS); | ||
12299 | if (REG_RD(bp, mac_base + XMAC_REG_RX_LSS_STATUS)) | ||
12300 | lss_status = 1; | ||
12301 | |||
12302 | bnx2x_analyze_link_error(params, vars, lss_status); | ||
12303 | } else if (REG_RD(bp, MISC_REG_RESET_REG_2) & | ||
12304 | (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port)) { | ||
12235 | /* Check E1X / E2 BMAC */ | 12305 | /* Check E1X / E2 BMAC */ |
12236 | u32 lss_status_reg; | 12306 | u32 lss_status_reg; |
12237 | u32 wb_data[2]; | 12307 | u32 wb_data[2]; |
@@ -12253,14 +12323,20 @@ static void bnx2x_check_half_open_conn(struct link_params *params, | |||
12253 | void bnx2x_period_func(struct link_params *params, struct link_vars *vars) | 12323 | void bnx2x_period_func(struct link_params *params, struct link_vars *vars) |
12254 | { | 12324 | { |
12255 | struct bnx2x *bp = params->bp; | 12325 | struct bnx2x *bp = params->bp; |
12326 | u16 phy_idx; | ||
12256 | if (!params) { | 12327 | if (!params) { |
12257 | DP(NETIF_MSG_LINK, "Ininitliazed params !\n"); | 12328 | DP(NETIF_MSG_LINK, "Uninitialized params !\n"); |
12258 | return; | 12329 | return; |
12259 | } | 12330 | } |
12260 | /* DP(NETIF_MSG_LINK, "Periodic called vars->phy_flags 0x%x speed 0x%x | 12331 | |
12261 | RESET_REG_2 0x%x\n", vars->phy_flags, vars->line_speed, | 12332 | for (phy_idx = INT_PHY; phy_idx < MAX_PHYS; phy_idx++) { |
12262 | REG_RD(bp, MISC_REG_RESET_REG_2)); */ | 12333 | if (params->phy[phy_idx].flags & FLAGS_TX_ERROR_CHECK) { |
12263 | bnx2x_check_half_open_conn(params, vars); | 12334 | bnx2x_set_aer_mmd(params, ¶ms->phy[phy_idx]); |
12335 | bnx2x_check_half_open_conn(params, vars); | ||
12336 | break; | ||
12337 | } | ||
12338 | } | ||
12339 | |||
12264 | if (CHIP_IS_E3(bp)) | 12340 | if (CHIP_IS_E3(bp)) |
12265 | bnx2x_check_over_curr(params, vars); | 12341 | bnx2x_check_over_curr(params, vars); |
12266 | } | 12342 | } |
diff --git a/drivers/net/bnx2x/bnx2x_link.h b/drivers/net/bnx2x/bnx2x_link.h index 6a7708d5da37..c12db6da213e 100644 --- a/drivers/net/bnx2x/bnx2x_link.h +++ b/drivers/net/bnx2x/bnx2x_link.h | |||
@@ -145,6 +145,8 @@ struct bnx2x_phy { | |||
145 | #define FLAGS_SFP_NOT_APPROVED (1<<7) | 145 | #define FLAGS_SFP_NOT_APPROVED (1<<7) |
146 | #define FLAGS_MDC_MDIO_WA (1<<8) | 146 | #define FLAGS_MDC_MDIO_WA (1<<8) |
147 | #define FLAGS_DUMMY_READ (1<<9) | 147 | #define FLAGS_DUMMY_READ (1<<9) |
148 | #define FLAGS_MDC_MDIO_WA_B0 (1<<10) | ||
149 | #define FLAGS_TX_ERROR_CHECK (1<<12) | ||
148 | 150 | ||
149 | /* preemphasis values for the rx side */ | 151 | /* preemphasis values for the rx side */ |
150 | u16 rx_preemphasis[4]; | 152 | u16 rx_preemphasis[4]; |
@@ -276,7 +278,6 @@ struct link_vars { | |||
276 | #define PHY_PHYSICAL_LINK_FLAG (1<<2) | 278 | #define PHY_PHYSICAL_LINK_FLAG (1<<2) |
277 | #define PHY_HALF_OPEN_CONN_FLAG (1<<3) | 279 | #define PHY_HALF_OPEN_CONN_FLAG (1<<3) |
278 | #define PHY_OVER_CURRENT_FLAG (1<<4) | 280 | #define PHY_OVER_CURRENT_FLAG (1<<4) |
279 | #define PHY_TX_ERROR_CHECK_FLAG (1<<5) | ||
280 | 281 | ||
281 | u8 mac_type; | 282 | u8 mac_type; |
282 | #define MAC_TYPE_NONE 0 | 283 | #define MAC_TYPE_NONE 0 |
diff --git a/drivers/net/bnx2x/bnx2x_reg.h b/drivers/net/bnx2x/bnx2x_reg.h index 02461fef8751..27b5ecb11830 100644 --- a/drivers/net/bnx2x/bnx2x_reg.h +++ b/drivers/net/bnx2x/bnx2x_reg.h | |||
@@ -4771,9 +4771,11 @@ | |||
4771 | The fields are: [4:0] - tail pointer; 10:5] - Link List size; 15:11] - | 4771 | The fields are: [4:0] - tail pointer; 10:5] - Link List size; 15:11] - |
4772 | header pointer. */ | 4772 | header pointer. */ |
4773 | #define UCM_REG_XX_TABLE 0xe0300 | 4773 | #define UCM_REG_XX_TABLE 0xe0300 |
4774 | #define UMAC_COMMAND_CONFIG_REG_IGNORE_TX_PAUSE (0x1<<28) | ||
4774 | #define UMAC_COMMAND_CONFIG_REG_LOOP_ENA (0x1<<15) | 4775 | #define UMAC_COMMAND_CONFIG_REG_LOOP_ENA (0x1<<15) |
4775 | #define UMAC_COMMAND_CONFIG_REG_NO_LGTH_CHECK (0x1<<24) | 4776 | #define UMAC_COMMAND_CONFIG_REG_NO_LGTH_CHECK (0x1<<24) |
4776 | #define UMAC_COMMAND_CONFIG_REG_PAD_EN (0x1<<5) | 4777 | #define UMAC_COMMAND_CONFIG_REG_PAD_EN (0x1<<5) |
4778 | #define UMAC_COMMAND_CONFIG_REG_PAUSE_IGNORE (0x1<<8) | ||
4777 | #define UMAC_COMMAND_CONFIG_REG_PROMIS_EN (0x1<<4) | 4779 | #define UMAC_COMMAND_CONFIG_REG_PROMIS_EN (0x1<<4) |
4778 | #define UMAC_COMMAND_CONFIG_REG_RX_ENA (0x1<<1) | 4780 | #define UMAC_COMMAND_CONFIG_REG_RX_ENA (0x1<<1) |
4779 | #define UMAC_COMMAND_CONFIG_REG_SW_RESET (0x1<<13) | 4781 | #define UMAC_COMMAND_CONFIG_REG_SW_RESET (0x1<<13) |
@@ -5622,8 +5624,9 @@ | |||
5622 | #define EMAC_MDIO_COMM_START_BUSY (1L<<29) | 5624 | #define EMAC_MDIO_COMM_START_BUSY (1L<<29) |
5623 | #define EMAC_MDIO_MODE_AUTO_POLL (1L<<4) | 5625 | #define EMAC_MDIO_MODE_AUTO_POLL (1L<<4) |
5624 | #define EMAC_MDIO_MODE_CLAUSE_45 (1L<<31) | 5626 | #define EMAC_MDIO_MODE_CLAUSE_45 (1L<<31) |
5625 | #define EMAC_MDIO_MODE_CLOCK_CNT (0x3fL<<16) | 5627 | #define EMAC_MDIO_MODE_CLOCK_CNT (0x3ffL<<16) |
5626 | #define EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT 16 | 5628 | #define EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT 16 |
5629 | #define EMAC_MDIO_STATUS_10MB (1L<<1) | ||
5627 | #define EMAC_MODE_25G_MODE (1L<<5) | 5630 | #define EMAC_MODE_25G_MODE (1L<<5) |
5628 | #define EMAC_MODE_HALF_DUPLEX (1L<<1) | 5631 | #define EMAC_MODE_HALF_DUPLEX (1L<<1) |
5629 | #define EMAC_MODE_PORT_GMII (2L<<2) | 5632 | #define EMAC_MODE_PORT_GMII (2L<<2) |
@@ -5634,6 +5637,7 @@ | |||
5634 | #define EMAC_REG_EMAC_MAC_MATCH 0x10 | 5637 | #define EMAC_REG_EMAC_MAC_MATCH 0x10 |
5635 | #define EMAC_REG_EMAC_MDIO_COMM 0xac | 5638 | #define EMAC_REG_EMAC_MDIO_COMM 0xac |
5636 | #define EMAC_REG_EMAC_MDIO_MODE 0xb4 | 5639 | #define EMAC_REG_EMAC_MDIO_MODE 0xb4 |
5640 | #define EMAC_REG_EMAC_MDIO_STATUS 0xb0 | ||
5637 | #define EMAC_REG_EMAC_MODE 0x0 | 5641 | #define EMAC_REG_EMAC_MODE 0x0 |
5638 | #define EMAC_REG_EMAC_RX_MODE 0xc8 | 5642 | #define EMAC_REG_EMAC_RX_MODE 0xc8 |
5639 | #define EMAC_REG_EMAC_RX_MTU_SIZE 0x9c | 5643 | #define EMAC_REG_EMAC_RX_MTU_SIZE 0x9c |
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index c5f0f04219f3..5548d464261a 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
@@ -838,6 +838,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
838 | 838 | ||
839 | /* Disable all the interrupts */ | 839 | /* Disable all the interrupts */ |
840 | ew32(IMC, 0xFFFFFFFF); | 840 | ew32(IMC, 0xFFFFFFFF); |
841 | E1000_WRITE_FLUSH(); | ||
841 | msleep(10); | 842 | msleep(10); |
842 | 843 | ||
843 | /* Test each interrupt */ | 844 | /* Test each interrupt */ |
@@ -856,6 +857,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
856 | adapter->test_icr = 0; | 857 | adapter->test_icr = 0; |
857 | ew32(IMC, mask); | 858 | ew32(IMC, mask); |
858 | ew32(ICS, mask); | 859 | ew32(ICS, mask); |
860 | E1000_WRITE_FLUSH(); | ||
859 | msleep(10); | 861 | msleep(10); |
860 | 862 | ||
861 | if (adapter->test_icr & mask) { | 863 | if (adapter->test_icr & mask) { |
@@ -873,6 +875,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
873 | adapter->test_icr = 0; | 875 | adapter->test_icr = 0; |
874 | ew32(IMS, mask); | 876 | ew32(IMS, mask); |
875 | ew32(ICS, mask); | 877 | ew32(ICS, mask); |
878 | E1000_WRITE_FLUSH(); | ||
876 | msleep(10); | 879 | msleep(10); |
877 | 880 | ||
878 | if (!(adapter->test_icr & mask)) { | 881 | if (!(adapter->test_icr & mask)) { |
@@ -890,6 +893,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
890 | adapter->test_icr = 0; | 893 | adapter->test_icr = 0; |
891 | ew32(IMC, ~mask & 0x00007FFF); | 894 | ew32(IMC, ~mask & 0x00007FFF); |
892 | ew32(ICS, ~mask & 0x00007FFF); | 895 | ew32(ICS, ~mask & 0x00007FFF); |
896 | E1000_WRITE_FLUSH(); | ||
893 | msleep(10); | 897 | msleep(10); |
894 | 898 | ||
895 | if (adapter->test_icr) { | 899 | if (adapter->test_icr) { |
@@ -901,6 +905,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
901 | 905 | ||
902 | /* Disable all the interrupts */ | 906 | /* Disable all the interrupts */ |
903 | ew32(IMC, 0xFFFFFFFF); | 907 | ew32(IMC, 0xFFFFFFFF); |
908 | E1000_WRITE_FLUSH(); | ||
904 | msleep(10); | 909 | msleep(10); |
905 | 910 | ||
906 | /* Unhook test interrupt handler */ | 911 | /* Unhook test interrupt handler */ |
@@ -1394,6 +1399,7 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter) | |||
1394 | if (unlikely(++k == txdr->count)) k = 0; | 1399 | if (unlikely(++k == txdr->count)) k = 0; |
1395 | } | 1400 | } |
1396 | ew32(TDT, k); | 1401 | ew32(TDT, k); |
1402 | E1000_WRITE_FLUSH(); | ||
1397 | msleep(200); | 1403 | msleep(200); |
1398 | time = jiffies; /* set the start time for the receive */ | 1404 | time = jiffies; /* set the start time for the receive */ |
1399 | good_cnt = 0; | 1405 | good_cnt = 0; |
diff --git a/drivers/net/e1000/e1000_hw.c b/drivers/net/e1000/e1000_hw.c index 1698622af434..8545c7aa93eb 100644 --- a/drivers/net/e1000/e1000_hw.c +++ b/drivers/net/e1000/e1000_hw.c | |||
@@ -446,6 +446,7 @@ s32 e1000_reset_hw(struct e1000_hw *hw) | |||
446 | /* Must reset the PHY before resetting the MAC */ | 446 | /* Must reset the PHY before resetting the MAC */ |
447 | if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { | 447 | if ((hw->mac_type == e1000_82541) || (hw->mac_type == e1000_82547)) { |
448 | ew32(CTRL, (ctrl | E1000_CTRL_PHY_RST)); | 448 | ew32(CTRL, (ctrl | E1000_CTRL_PHY_RST)); |
449 | E1000_WRITE_FLUSH(); | ||
449 | msleep(5); | 450 | msleep(5); |
450 | } | 451 | } |
451 | 452 | ||
@@ -3752,6 +3753,7 @@ static s32 e1000_acquire_eeprom(struct e1000_hw *hw) | |||
3752 | /* Clear SK and CS */ | 3753 | /* Clear SK and CS */ |
3753 | eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); | 3754 | eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); |
3754 | ew32(EECD, eecd); | 3755 | ew32(EECD, eecd); |
3756 | E1000_WRITE_FLUSH(); | ||
3755 | udelay(1); | 3757 | udelay(1); |
3756 | } | 3758 | } |
3757 | 3759 | ||
@@ -3824,6 +3826,7 @@ static void e1000_release_eeprom(struct e1000_hw *hw) | |||
3824 | eecd &= ~E1000_EECD_SK; /* Lower SCK */ | 3826 | eecd &= ~E1000_EECD_SK; /* Lower SCK */ |
3825 | 3827 | ||
3826 | ew32(EECD, eecd); | 3828 | ew32(EECD, eecd); |
3829 | E1000_WRITE_FLUSH(); | ||
3827 | 3830 | ||
3828 | udelay(hw->eeprom.delay_usec); | 3831 | udelay(hw->eeprom.delay_usec); |
3829 | } else if (hw->eeprom.type == e1000_eeprom_microwire) { | 3832 | } else if (hw->eeprom.type == e1000_eeprom_microwire) { |
diff --git a/drivers/net/e1000e/es2lan.c b/drivers/net/e1000e/es2lan.c index c0ecb2d9fdb7..e4f42257c24c 100644 --- a/drivers/net/e1000e/es2lan.c +++ b/drivers/net/e1000e/es2lan.c | |||
@@ -1313,6 +1313,7 @@ static s32 e1000_read_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset, | |||
1313 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & | 1313 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & |
1314 | E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; | 1314 | E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; |
1315 | ew32(KMRNCTRLSTA, kmrnctrlsta); | 1315 | ew32(KMRNCTRLSTA, kmrnctrlsta); |
1316 | e1e_flush(); | ||
1316 | 1317 | ||
1317 | udelay(2); | 1318 | udelay(2); |
1318 | 1319 | ||
@@ -1347,6 +1348,7 @@ static s32 e1000_write_kmrn_reg_80003es2lan(struct e1000_hw *hw, u32 offset, | |||
1347 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & | 1348 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & |
1348 | E1000_KMRNCTRLSTA_OFFSET) | data; | 1349 | E1000_KMRNCTRLSTA_OFFSET) | data; |
1349 | ew32(KMRNCTRLSTA, kmrnctrlsta); | 1350 | ew32(KMRNCTRLSTA, kmrnctrlsta); |
1351 | e1e_flush(); | ||
1350 | 1352 | ||
1351 | udelay(2); | 1353 | udelay(2); |
1352 | 1354 | ||
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index cb1a3623253e..06d88f316dce 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -28,8 +28,8 @@ | |||
28 | 28 | ||
29 | /* ethtool support for e1000 */ | 29 | /* ethtool support for e1000 */ |
30 | 30 | ||
31 | #include <linux/interrupt.h> | ||
32 | #include <linux/netdevice.h> | 31 | #include <linux/netdevice.h> |
32 | #include <linux/interrupt.h> | ||
33 | #include <linux/ethtool.h> | 33 | #include <linux/ethtool.h> |
34 | #include <linux/pci.h> | 34 | #include <linux/pci.h> |
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
@@ -964,6 +964,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
964 | 964 | ||
965 | /* Disable all the interrupts */ | 965 | /* Disable all the interrupts */ |
966 | ew32(IMC, 0xFFFFFFFF); | 966 | ew32(IMC, 0xFFFFFFFF); |
967 | e1e_flush(); | ||
967 | usleep_range(10000, 20000); | 968 | usleep_range(10000, 20000); |
968 | 969 | ||
969 | /* Test each interrupt */ | 970 | /* Test each interrupt */ |
@@ -996,6 +997,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
996 | adapter->test_icr = 0; | 997 | adapter->test_icr = 0; |
997 | ew32(IMC, mask); | 998 | ew32(IMC, mask); |
998 | ew32(ICS, mask); | 999 | ew32(ICS, mask); |
1000 | e1e_flush(); | ||
999 | usleep_range(10000, 20000); | 1001 | usleep_range(10000, 20000); |
1000 | 1002 | ||
1001 | if (adapter->test_icr & mask) { | 1003 | if (adapter->test_icr & mask) { |
@@ -1014,6 +1016,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
1014 | adapter->test_icr = 0; | 1016 | adapter->test_icr = 0; |
1015 | ew32(IMS, mask); | 1017 | ew32(IMS, mask); |
1016 | ew32(ICS, mask); | 1018 | ew32(ICS, mask); |
1019 | e1e_flush(); | ||
1017 | usleep_range(10000, 20000); | 1020 | usleep_range(10000, 20000); |
1018 | 1021 | ||
1019 | if (!(adapter->test_icr & mask)) { | 1022 | if (!(adapter->test_icr & mask)) { |
@@ -1032,6 +1035,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
1032 | adapter->test_icr = 0; | 1035 | adapter->test_icr = 0; |
1033 | ew32(IMC, ~mask & 0x00007FFF); | 1036 | ew32(IMC, ~mask & 0x00007FFF); |
1034 | ew32(ICS, ~mask & 0x00007FFF); | 1037 | ew32(ICS, ~mask & 0x00007FFF); |
1038 | e1e_flush(); | ||
1035 | usleep_range(10000, 20000); | 1039 | usleep_range(10000, 20000); |
1036 | 1040 | ||
1037 | if (adapter->test_icr) { | 1041 | if (adapter->test_icr) { |
@@ -1043,6 +1047,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
1043 | 1047 | ||
1044 | /* Disable all the interrupts */ | 1048 | /* Disable all the interrupts */ |
1045 | ew32(IMC, 0xFFFFFFFF); | 1049 | ew32(IMC, 0xFFFFFFFF); |
1050 | e1e_flush(); | ||
1046 | usleep_range(10000, 20000); | 1051 | usleep_range(10000, 20000); |
1047 | 1052 | ||
1048 | /* Unhook test interrupt handler */ | 1053 | /* Unhook test interrupt handler */ |
@@ -1276,6 +1281,7 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) | |||
1276 | E1000_CTRL_FD); /* Force Duplex to FULL */ | 1281 | E1000_CTRL_FD); /* Force Duplex to FULL */ |
1277 | 1282 | ||
1278 | ew32(CTRL, ctrl_reg); | 1283 | ew32(CTRL, ctrl_reg); |
1284 | e1e_flush(); | ||
1279 | udelay(500); | 1285 | udelay(500); |
1280 | 1286 | ||
1281 | return 0; | 1287 | return 0; |
@@ -1418,6 +1424,7 @@ static int e1000_set_82571_fiber_loopback(struct e1000_adapter *adapter) | |||
1418 | */ | 1424 | */ |
1419 | #define E1000_SERDES_LB_ON 0x410 | 1425 | #define E1000_SERDES_LB_ON 0x410 |
1420 | ew32(SCTL, E1000_SERDES_LB_ON); | 1426 | ew32(SCTL, E1000_SERDES_LB_ON); |
1427 | e1e_flush(); | ||
1421 | usleep_range(10000, 20000); | 1428 | usleep_range(10000, 20000); |
1422 | 1429 | ||
1423 | return 0; | 1430 | return 0; |
@@ -1513,6 +1520,7 @@ static void e1000_loopback_cleanup(struct e1000_adapter *adapter) | |||
1513 | hw->phy.media_type == e1000_media_type_internal_serdes) { | 1520 | hw->phy.media_type == e1000_media_type_internal_serdes) { |
1514 | #define E1000_SERDES_LB_OFF 0x400 | 1521 | #define E1000_SERDES_LB_OFF 0x400 |
1515 | ew32(SCTL, E1000_SERDES_LB_OFF); | 1522 | ew32(SCTL, E1000_SERDES_LB_OFF); |
1523 | e1e_flush(); | ||
1516 | usleep_range(10000, 20000); | 1524 | usleep_range(10000, 20000); |
1517 | break; | 1525 | break; |
1518 | } | 1526 | } |
@@ -1592,6 +1600,7 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter) | |||
1592 | k = 0; | 1600 | k = 0; |
1593 | } | 1601 | } |
1594 | ew32(TDT, k); | 1602 | ew32(TDT, k); |
1603 | e1e_flush(); | ||
1595 | msleep(200); | 1604 | msleep(200); |
1596 | time = jiffies; /* set the start time for the receive */ | 1605 | time = jiffies; /* set the start time for the receive */ |
1597 | good_cnt = 0; | 1606 | good_cnt = 0; |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index c1752124f3cd..4e36978b8fd8 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
@@ -283,6 +283,7 @@ static void e1000_toggle_lanphypc_value_ich8lan(struct e1000_hw *hw) | |||
283 | ctrl |= E1000_CTRL_LANPHYPC_OVERRIDE; | 283 | ctrl |= E1000_CTRL_LANPHYPC_OVERRIDE; |
284 | ctrl &= ~E1000_CTRL_LANPHYPC_VALUE; | 284 | ctrl &= ~E1000_CTRL_LANPHYPC_VALUE; |
285 | ew32(CTRL, ctrl); | 285 | ew32(CTRL, ctrl); |
286 | e1e_flush(); | ||
286 | udelay(10); | 287 | udelay(10); |
287 | ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE; | 288 | ctrl &= ~E1000_CTRL_LANPHYPC_OVERRIDE; |
288 | ew32(CTRL, ctrl); | 289 | ew32(CTRL, ctrl); |
@@ -1230,9 +1231,11 @@ s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable) | |||
1230 | ew32(CTRL, reg); | 1231 | ew32(CTRL, reg); |
1231 | 1232 | ||
1232 | ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_SPD_BYPS); | 1233 | ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_SPD_BYPS); |
1234 | e1e_flush(); | ||
1233 | udelay(20); | 1235 | udelay(20); |
1234 | ew32(CTRL, ctrl_reg); | 1236 | ew32(CTRL, ctrl_reg); |
1235 | ew32(CTRL_EXT, ctrl_ext); | 1237 | ew32(CTRL_EXT, ctrl_ext); |
1238 | e1e_flush(); | ||
1236 | udelay(20); | 1239 | udelay(20); |
1237 | 1240 | ||
1238 | out: | 1241 | out: |
@@ -2134,8 +2137,7 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, | |||
2134 | 2137 | ||
2135 | ret_val = 0; | 2138 | ret_val = 0; |
2136 | for (i = 0; i < words; i++) { | 2139 | for (i = 0; i < words; i++) { |
2137 | if ((dev_spec->shadow_ram) && | 2140 | if (dev_spec->shadow_ram[offset+i].modified) { |
2138 | (dev_spec->shadow_ram[offset+i].modified)) { | ||
2139 | data[i] = dev_spec->shadow_ram[offset+i].value; | 2141 | data[i] = dev_spec->shadow_ram[offset+i].value; |
2140 | } else { | 2142 | } else { |
2141 | ret_val = e1000_read_flash_word_ich8lan(hw, | 2143 | ret_val = e1000_read_flash_word_ich8lan(hw, |
@@ -3090,6 +3092,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
3090 | ret_val = e1000_acquire_swflag_ich8lan(hw); | 3092 | ret_val = e1000_acquire_swflag_ich8lan(hw); |
3091 | e_dbg("Issuing a global reset to ich8lan\n"); | 3093 | e_dbg("Issuing a global reset to ich8lan\n"); |
3092 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); | 3094 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); |
3095 | /* cannot issue a flush here because it hangs the hardware */ | ||
3093 | msleep(20); | 3096 | msleep(20); |
3094 | 3097 | ||
3095 | if (!ret_val) | 3098 | if (!ret_val) |
diff --git a/drivers/net/e1000e/lib.c b/drivers/net/e1000e/lib.c index 65580b405942..7898a67d6505 100644 --- a/drivers/net/e1000e/lib.c +++ b/drivers/net/e1000e/lib.c | |||
@@ -1986,6 +1986,7 @@ static s32 e1000_ready_nvm_eeprom(struct e1000_hw *hw) | |||
1986 | /* Clear SK and CS */ | 1986 | /* Clear SK and CS */ |
1987 | eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); | 1987 | eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); |
1988 | ew32(EECD, eecd); | 1988 | ew32(EECD, eecd); |
1989 | e1e_flush(); | ||
1989 | udelay(1); | 1990 | udelay(1); |
1990 | 1991 | ||
1991 | /* | 1992 | /* |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 4353ad56cf16..ab4be80f7ab5 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -31,12 +31,12 @@ | |||
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/types.h> | 32 | #include <linux/types.h> |
33 | #include <linux/init.h> | 33 | #include <linux/init.h> |
34 | #include <linux/interrupt.h> | ||
35 | #include <linux/pci.h> | 34 | #include <linux/pci.h> |
36 | #include <linux/vmalloc.h> | 35 | #include <linux/vmalloc.h> |
37 | #include <linux/pagemap.h> | 36 | #include <linux/pagemap.h> |
38 | #include <linux/delay.h> | 37 | #include <linux/delay.h> |
39 | #include <linux/netdevice.h> | 38 | #include <linux/netdevice.h> |
39 | #include <linux/interrupt.h> | ||
40 | #include <linux/tcp.h> | 40 | #include <linux/tcp.h> |
41 | #include <linux/ipv6.h> | 41 | #include <linux/ipv6.h> |
42 | #include <linux/slab.h> | 42 | #include <linux/slab.h> |
diff --git a/drivers/net/e1000e/phy.c b/drivers/net/e1000e/phy.c index 2a6ee13285b1..8666476cb9be 100644 --- a/drivers/net/e1000e/phy.c +++ b/drivers/net/e1000e/phy.c | |||
@@ -537,6 +537,7 @@ static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data, | |||
537 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & | 537 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & |
538 | E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; | 538 | E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; |
539 | ew32(KMRNCTRLSTA, kmrnctrlsta); | 539 | ew32(KMRNCTRLSTA, kmrnctrlsta); |
540 | e1e_flush(); | ||
540 | 541 | ||
541 | udelay(2); | 542 | udelay(2); |
542 | 543 | ||
@@ -609,6 +610,7 @@ static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data, | |||
609 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & | 610 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & |
610 | E1000_KMRNCTRLSTA_OFFSET) | data; | 611 | E1000_KMRNCTRLSTA_OFFSET) | data; |
611 | ew32(KMRNCTRLSTA, kmrnctrlsta); | 612 | ew32(KMRNCTRLSTA, kmrnctrlsta); |
613 | e1e_flush(); | ||
612 | 614 | ||
613 | udelay(2); | 615 | udelay(2); |
614 | 616 | ||
diff --git a/drivers/net/igb/e1000_nvm.c b/drivers/net/igb/e1000_nvm.c index 7dcd65cede56..40407124e722 100644 --- a/drivers/net/igb/e1000_nvm.c +++ b/drivers/net/igb/e1000_nvm.c | |||
@@ -285,6 +285,7 @@ static s32 igb_ready_nvm_eeprom(struct e1000_hw *hw) | |||
285 | /* Clear SK and CS */ | 285 | /* Clear SK and CS */ |
286 | eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); | 286 | eecd &= ~(E1000_EECD_CS | E1000_EECD_SK); |
287 | wr32(E1000_EECD, eecd); | 287 | wr32(E1000_EECD, eecd); |
288 | wrfl(); | ||
288 | udelay(1); | 289 | udelay(1); |
289 | timeout = NVM_MAX_RETRY_SPI; | 290 | timeout = NVM_MAX_RETRY_SPI; |
290 | 291 | ||
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c index ff244ce803ce..414b0225be89 100644 --- a/drivers/net/igb/igb_ethtool.c +++ b/drivers/net/igb/igb_ethtool.c | |||
@@ -1225,6 +1225,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data) | |||
1225 | 1225 | ||
1226 | /* Disable all the interrupts */ | 1226 | /* Disable all the interrupts */ |
1227 | wr32(E1000_IMC, ~0); | 1227 | wr32(E1000_IMC, ~0); |
1228 | wrfl(); | ||
1228 | msleep(10); | 1229 | msleep(10); |
1229 | 1230 | ||
1230 | /* Define all writable bits for ICS */ | 1231 | /* Define all writable bits for ICS */ |
@@ -1268,6 +1269,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data) | |||
1268 | 1269 | ||
1269 | wr32(E1000_IMC, mask); | 1270 | wr32(E1000_IMC, mask); |
1270 | wr32(E1000_ICS, mask); | 1271 | wr32(E1000_ICS, mask); |
1272 | wrfl(); | ||
1271 | msleep(10); | 1273 | msleep(10); |
1272 | 1274 | ||
1273 | if (adapter->test_icr & mask) { | 1275 | if (adapter->test_icr & mask) { |
@@ -1289,6 +1291,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data) | |||
1289 | 1291 | ||
1290 | wr32(E1000_IMS, mask); | 1292 | wr32(E1000_IMS, mask); |
1291 | wr32(E1000_ICS, mask); | 1293 | wr32(E1000_ICS, mask); |
1294 | wrfl(); | ||
1292 | msleep(10); | 1295 | msleep(10); |
1293 | 1296 | ||
1294 | if (!(adapter->test_icr & mask)) { | 1297 | if (!(adapter->test_icr & mask)) { |
@@ -1310,6 +1313,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data) | |||
1310 | 1313 | ||
1311 | wr32(E1000_IMC, ~mask); | 1314 | wr32(E1000_IMC, ~mask); |
1312 | wr32(E1000_ICS, ~mask); | 1315 | wr32(E1000_ICS, ~mask); |
1316 | wrfl(); | ||
1313 | msleep(10); | 1317 | msleep(10); |
1314 | 1318 | ||
1315 | if (adapter->test_icr & mask) { | 1319 | if (adapter->test_icr & mask) { |
@@ -1321,6 +1325,7 @@ static int igb_intr_test(struct igb_adapter *adapter, u64 *data) | |||
1321 | 1325 | ||
1322 | /* Disable all the interrupts */ | 1326 | /* Disable all the interrupts */ |
1323 | wr32(E1000_IMC, ~0); | 1327 | wr32(E1000_IMC, ~0); |
1328 | wrfl(); | ||
1324 | msleep(10); | 1329 | msleep(10); |
1325 | 1330 | ||
1326 | /* Unhook test interrupt handler */ | 1331 | /* Unhook test interrupt handler */ |
diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c index dc599059512a..40d4c405fd7e 100644 --- a/drivers/net/igb/igb_main.c +++ b/drivers/net/igb/igb_main.c | |||
@@ -1052,6 +1052,7 @@ msi_only: | |||
1052 | kfree(adapter->vf_data); | 1052 | kfree(adapter->vf_data); |
1053 | adapter->vf_data = NULL; | 1053 | adapter->vf_data = NULL; |
1054 | wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ); | 1054 | wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ); |
1055 | wrfl(); | ||
1055 | msleep(100); | 1056 | msleep(100); |
1056 | dev_info(&adapter->pdev->dev, "IOV Disabled\n"); | 1057 | dev_info(&adapter->pdev->dev, "IOV Disabled\n"); |
1057 | } | 1058 | } |
@@ -2022,7 +2023,7 @@ static int __devinit igb_probe(struct pci_dev *pdev, | |||
2022 | 2023 | ||
2023 | if (hw->bus.func == 0) | 2024 | if (hw->bus.func == 0) |
2024 | hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); | 2025 | hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A, 1, &eeprom_data); |
2025 | else if (hw->mac.type == e1000_82580) | 2026 | else if (hw->mac.type >= e1000_82580) |
2026 | hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A + | 2027 | hw->nvm.ops.read(hw, NVM_INIT_CONTROL3_PORT_A + |
2027 | NVM_82580_LAN_FUNC_OFFSET(hw->bus.func), 1, | 2028 | NVM_82580_LAN_FUNC_OFFSET(hw->bus.func), 1, |
2028 | &eeprom_data); | 2029 | &eeprom_data); |
@@ -2198,6 +2199,7 @@ static void __devexit igb_remove(struct pci_dev *pdev) | |||
2198 | kfree(adapter->vf_data); | 2199 | kfree(adapter->vf_data); |
2199 | adapter->vf_data = NULL; | 2200 | adapter->vf_data = NULL; |
2200 | wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ); | 2201 | wr32(E1000_IOVCTL, E1000_IOVCTL_REUSE_VFQ); |
2202 | wrfl(); | ||
2201 | msleep(100); | 2203 | msleep(100); |
2202 | dev_info(&pdev->dev, "IOV Disabled\n"); | 2204 | dev_info(&pdev->dev, "IOV Disabled\n"); |
2203 | } | 2205 | } |
diff --git a/drivers/net/igbvf/netdev.c b/drivers/net/igbvf/netdev.c index 1330c8e932da..40ed066e3ef4 100644 --- a/drivers/net/igbvf/netdev.c +++ b/drivers/net/igbvf/netdev.c | |||
@@ -1226,6 +1226,7 @@ static void igbvf_configure_tx(struct igbvf_adapter *adapter) | |||
1226 | /* disable transmits */ | 1226 | /* disable transmits */ |
1227 | txdctl = er32(TXDCTL(0)); | 1227 | txdctl = er32(TXDCTL(0)); |
1228 | ew32(TXDCTL(0), txdctl & ~E1000_TXDCTL_QUEUE_ENABLE); | 1228 | ew32(TXDCTL(0), txdctl & ~E1000_TXDCTL_QUEUE_ENABLE); |
1229 | e1e_flush(); | ||
1229 | msleep(10); | 1230 | msleep(10); |
1230 | 1231 | ||
1231 | /* Setup the HW Tx Head and Tail descriptor pointers */ | 1232 | /* Setup the HW Tx Head and Tail descriptor pointers */ |
@@ -1306,6 +1307,7 @@ static void igbvf_configure_rx(struct igbvf_adapter *adapter) | |||
1306 | /* disable receives */ | 1307 | /* disable receives */ |
1307 | rxdctl = er32(RXDCTL(0)); | 1308 | rxdctl = er32(RXDCTL(0)); |
1308 | ew32(RXDCTL(0), rxdctl & ~E1000_RXDCTL_QUEUE_ENABLE); | 1309 | ew32(RXDCTL(0), rxdctl & ~E1000_RXDCTL_QUEUE_ENABLE); |
1310 | e1e_flush(); | ||
1309 | msleep(10); | 1311 | msleep(10); |
1310 | 1312 | ||
1311 | rdlen = rx_ring->count * sizeof(union e1000_adv_rx_desc); | 1313 | rdlen = rx_ring->count * sizeof(union e1000_adv_rx_desc); |
diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c index 954f6e938fb7..8b1c3484d271 100644 --- a/drivers/net/irda/smsc-ircc2.c +++ b/drivers/net/irda/smsc-ircc2.c | |||
@@ -2405,8 +2405,6 @@ static int __init smsc_superio_lpc(unsigned short cfg_base) | |||
2405 | * addresses making a subsystem device table necessary. | 2405 | * addresses making a subsystem device table necessary. |
2406 | */ | 2406 | */ |
2407 | #ifdef CONFIG_PCI | 2407 | #ifdef CONFIG_PCI |
2408 | #define PCIID_VENDOR_INTEL 0x8086 | ||
2409 | #define PCIID_VENDOR_ALI 0x10b9 | ||
2410 | static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = { | 2408 | static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __initdata = { |
2411 | /* | 2409 | /* |
2412 | * Subsystems needing entries: | 2410 | * Subsystems needing entries: |
@@ -2416,7 +2414,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini | |||
2416 | */ | 2414 | */ |
2417 | { | 2415 | { |
2418 | /* Guessed entry */ | 2416 | /* Guessed entry */ |
2419 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */ | 2417 | .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */ |
2420 | .device = 0x24cc, | 2418 | .device = 0x24cc, |
2421 | .subvendor = 0x103c, | 2419 | .subvendor = 0x103c, |
2422 | .subdevice = 0x08bc, | 2420 | .subdevice = 0x08bc, |
@@ -2429,7 +2427,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini | |||
2429 | .name = "HP nx5000 family", | 2427 | .name = "HP nx5000 family", |
2430 | }, | 2428 | }, |
2431 | { | 2429 | { |
2432 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */ | 2430 | .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */ |
2433 | .device = 0x24cc, | 2431 | .device = 0x24cc, |
2434 | .subvendor = 0x103c, | 2432 | .subvendor = 0x103c, |
2435 | .subdevice = 0x088c, | 2433 | .subdevice = 0x088c, |
@@ -2443,7 +2441,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini | |||
2443 | .name = "HP nc8000 family", | 2441 | .name = "HP nc8000 family", |
2444 | }, | 2442 | }, |
2445 | { | 2443 | { |
2446 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */ | 2444 | .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */ |
2447 | .device = 0x24cc, | 2445 | .device = 0x24cc, |
2448 | .subvendor = 0x103c, | 2446 | .subvendor = 0x103c, |
2449 | .subdevice = 0x0890, | 2447 | .subdevice = 0x0890, |
@@ -2456,7 +2454,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini | |||
2456 | .name = "HP nc6000 family", | 2454 | .name = "HP nc6000 family", |
2457 | }, | 2455 | }, |
2458 | { | 2456 | { |
2459 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DBM LPC bridge */ | 2457 | .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801DBM LPC bridge */ |
2460 | .device = 0x24cc, | 2458 | .device = 0x24cc, |
2461 | .subvendor = 0x0e11, | 2459 | .subvendor = 0x0e11, |
2462 | .subdevice = 0x0860, | 2460 | .subdevice = 0x0860, |
@@ -2471,7 +2469,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini | |||
2471 | }, | 2469 | }, |
2472 | { | 2470 | { |
2473 | /* Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge */ | 2471 | /* Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge */ |
2474 | .vendor = PCIID_VENDOR_INTEL, | 2472 | .vendor = PCI_VENDOR_ID_INTEL, |
2475 | .device = 0x24c0, | 2473 | .device = 0x24c0, |
2476 | .subvendor = 0x1179, | 2474 | .subvendor = 0x1179, |
2477 | .subdevice = 0xffff, /* 0xffff is "any" */ | 2475 | .subdevice = 0xffff, /* 0xffff is "any" */ |
@@ -2484,7 +2482,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini | |||
2484 | .name = "Toshiba laptop with Intel 82801DB/DBL LPC bridge", | 2482 | .name = "Toshiba laptop with Intel 82801DB/DBL LPC bridge", |
2485 | }, | 2483 | }, |
2486 | { | 2484 | { |
2487 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801CAM ISA bridge */ | 2485 | .vendor = PCI_VENDOR_ID_INTEL, /* Intel 82801CAM ISA bridge */ |
2488 | .device = 0x248c, | 2486 | .device = 0x248c, |
2489 | .subvendor = 0x1179, | 2487 | .subvendor = 0x1179, |
2490 | .subdevice = 0xffff, /* 0xffff is "any" */ | 2488 | .subdevice = 0xffff, /* 0xffff is "any" */ |
@@ -2498,7 +2496,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini | |||
2498 | }, | 2496 | }, |
2499 | { | 2497 | { |
2500 | /* 82801DBM (ICH4-M) LPC Interface Bridge */ | 2498 | /* 82801DBM (ICH4-M) LPC Interface Bridge */ |
2501 | .vendor = PCIID_VENDOR_INTEL, | 2499 | .vendor = PCI_VENDOR_ID_INTEL, |
2502 | .device = 0x24cc, | 2500 | .device = 0x24cc, |
2503 | .subvendor = 0x1179, | 2501 | .subvendor = 0x1179, |
2504 | .subdevice = 0xffff, /* 0xffff is "any" */ | 2502 | .subdevice = 0xffff, /* 0xffff is "any" */ |
@@ -2512,7 +2510,7 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __ini | |||
2512 | }, | 2510 | }, |
2513 | { | 2511 | { |
2514 | /* ALi M1533/M1535 PCI to ISA Bridge [Aladdin IV/V/V+] */ | 2512 | /* ALi M1533/M1535 PCI to ISA Bridge [Aladdin IV/V/V+] */ |
2515 | .vendor = PCIID_VENDOR_ALI, | 2513 | .vendor = PCI_VENDOR_ID_AL, |
2516 | .device = 0x1533, | 2514 | .device = 0x1533, |
2517 | .subvendor = 0x1179, | 2515 | .subvendor = 0x1179, |
2518 | .subdevice = 0xffff, /* 0xffff is "any" */ | 2516 | .subdevice = 0xffff, /* 0xffff is "any" */ |
diff --git a/drivers/net/ixgb/ixgb_ee.c b/drivers/net/ixgb/ixgb_ee.c index c982ab9f9005..38b362b67857 100644 --- a/drivers/net/ixgb/ixgb_ee.c +++ b/drivers/net/ixgb/ixgb_ee.c | |||
@@ -57,6 +57,7 @@ ixgb_raise_clock(struct ixgb_hw *hw, | |||
57 | */ | 57 | */ |
58 | *eecd_reg = *eecd_reg | IXGB_EECD_SK; | 58 | *eecd_reg = *eecd_reg | IXGB_EECD_SK; |
59 | IXGB_WRITE_REG(hw, EECD, *eecd_reg); | 59 | IXGB_WRITE_REG(hw, EECD, *eecd_reg); |
60 | IXGB_WRITE_FLUSH(hw); | ||
60 | udelay(50); | 61 | udelay(50); |
61 | } | 62 | } |
62 | 63 | ||
@@ -75,6 +76,7 @@ ixgb_lower_clock(struct ixgb_hw *hw, | |||
75 | */ | 76 | */ |
76 | *eecd_reg = *eecd_reg & ~IXGB_EECD_SK; | 77 | *eecd_reg = *eecd_reg & ~IXGB_EECD_SK; |
77 | IXGB_WRITE_REG(hw, EECD, *eecd_reg); | 78 | IXGB_WRITE_REG(hw, EECD, *eecd_reg); |
79 | IXGB_WRITE_FLUSH(hw); | ||
78 | udelay(50); | 80 | udelay(50); |
79 | } | 81 | } |
80 | 82 | ||
@@ -112,6 +114,7 @@ ixgb_shift_out_bits(struct ixgb_hw *hw, | |||
112 | eecd_reg |= IXGB_EECD_DI; | 114 | eecd_reg |= IXGB_EECD_DI; |
113 | 115 | ||
114 | IXGB_WRITE_REG(hw, EECD, eecd_reg); | 116 | IXGB_WRITE_REG(hw, EECD, eecd_reg); |
117 | IXGB_WRITE_FLUSH(hw); | ||
115 | 118 | ||
116 | udelay(50); | 119 | udelay(50); |
117 | 120 | ||
@@ -206,21 +209,25 @@ ixgb_standby_eeprom(struct ixgb_hw *hw) | |||
206 | /* Deselect EEPROM */ | 209 | /* Deselect EEPROM */ |
207 | eecd_reg &= ~(IXGB_EECD_CS | IXGB_EECD_SK); | 210 | eecd_reg &= ~(IXGB_EECD_CS | IXGB_EECD_SK); |
208 | IXGB_WRITE_REG(hw, EECD, eecd_reg); | 211 | IXGB_WRITE_REG(hw, EECD, eecd_reg); |
212 | IXGB_WRITE_FLUSH(hw); | ||
209 | udelay(50); | 213 | udelay(50); |
210 | 214 | ||
211 | /* Clock high */ | 215 | /* Clock high */ |
212 | eecd_reg |= IXGB_EECD_SK; | 216 | eecd_reg |= IXGB_EECD_SK; |
213 | IXGB_WRITE_REG(hw, EECD, eecd_reg); | 217 | IXGB_WRITE_REG(hw, EECD, eecd_reg); |
218 | IXGB_WRITE_FLUSH(hw); | ||
214 | udelay(50); | 219 | udelay(50); |
215 | 220 | ||
216 | /* Select EEPROM */ | 221 | /* Select EEPROM */ |
217 | eecd_reg |= IXGB_EECD_CS; | 222 | eecd_reg |= IXGB_EECD_CS; |
218 | IXGB_WRITE_REG(hw, EECD, eecd_reg); | 223 | IXGB_WRITE_REG(hw, EECD, eecd_reg); |
224 | IXGB_WRITE_FLUSH(hw); | ||
219 | udelay(50); | 225 | udelay(50); |
220 | 226 | ||
221 | /* Clock low */ | 227 | /* Clock low */ |
222 | eecd_reg &= ~IXGB_EECD_SK; | 228 | eecd_reg &= ~IXGB_EECD_SK; |
223 | IXGB_WRITE_REG(hw, EECD, eecd_reg); | 229 | IXGB_WRITE_REG(hw, EECD, eecd_reg); |
230 | IXGB_WRITE_FLUSH(hw); | ||
224 | udelay(50); | 231 | udelay(50); |
225 | } | 232 | } |
226 | 233 | ||
@@ -239,11 +246,13 @@ ixgb_clock_eeprom(struct ixgb_hw *hw) | |||
239 | /* Rising edge of clock */ | 246 | /* Rising edge of clock */ |
240 | eecd_reg |= IXGB_EECD_SK; | 247 | eecd_reg |= IXGB_EECD_SK; |
241 | IXGB_WRITE_REG(hw, EECD, eecd_reg); | 248 | IXGB_WRITE_REG(hw, EECD, eecd_reg); |
249 | IXGB_WRITE_FLUSH(hw); | ||
242 | udelay(50); | 250 | udelay(50); |
243 | 251 | ||
244 | /* Falling edge of clock */ | 252 | /* Falling edge of clock */ |
245 | eecd_reg &= ~IXGB_EECD_SK; | 253 | eecd_reg &= ~IXGB_EECD_SK; |
246 | IXGB_WRITE_REG(hw, EECD, eecd_reg); | 254 | IXGB_WRITE_REG(hw, EECD, eecd_reg); |
255 | IXGB_WRITE_FLUSH(hw); | ||
247 | udelay(50); | 256 | udelay(50); |
248 | } | 257 | } |
249 | 258 | ||
diff --git a/drivers/net/ixgb/ixgb_hw.c b/drivers/net/ixgb/ixgb_hw.c index 6cb2e42ff4c1..3d61a9e4faf7 100644 --- a/drivers/net/ixgb/ixgb_hw.c +++ b/drivers/net/ixgb/ixgb_hw.c | |||
@@ -149,6 +149,7 @@ ixgb_adapter_stop(struct ixgb_hw *hw) | |||
149 | */ | 149 | */ |
150 | IXGB_WRITE_REG(hw, RCTL, IXGB_READ_REG(hw, RCTL) & ~IXGB_RCTL_RXEN); | 150 | IXGB_WRITE_REG(hw, RCTL, IXGB_READ_REG(hw, RCTL) & ~IXGB_RCTL_RXEN); |
151 | IXGB_WRITE_REG(hw, TCTL, IXGB_READ_REG(hw, TCTL) & ~IXGB_TCTL_TXEN); | 151 | IXGB_WRITE_REG(hw, TCTL, IXGB_READ_REG(hw, TCTL) & ~IXGB_TCTL_TXEN); |
152 | IXGB_WRITE_FLUSH(hw); | ||
152 | msleep(IXGB_DELAY_BEFORE_RESET); | 153 | msleep(IXGB_DELAY_BEFORE_RESET); |
153 | 154 | ||
154 | /* Issue a global reset to the MAC. This will reset the chip's | 155 | /* Issue a global reset to the MAC. This will reset the chip's |
@@ -1220,6 +1221,7 @@ ixgb_optics_reset_bcm(struct ixgb_hw *hw) | |||
1220 | ctrl &= ~IXGB_CTRL0_SDP2; | 1221 | ctrl &= ~IXGB_CTRL0_SDP2; |
1221 | ctrl |= IXGB_CTRL0_SDP3; | 1222 | ctrl |= IXGB_CTRL0_SDP3; |
1222 | IXGB_WRITE_REG(hw, CTRL0, ctrl); | 1223 | IXGB_WRITE_REG(hw, CTRL0, ctrl); |
1224 | IXGB_WRITE_FLUSH(hw); | ||
1223 | 1225 | ||
1224 | /* SerDes needs extra delay */ | 1226 | /* SerDes needs extra delay */ |
1225 | msleep(IXGB_SUN_PHY_RESET_DELAY); | 1227 | msleep(IXGB_SUN_PHY_RESET_DELAY); |
diff --git a/drivers/net/ixgbe/ixgbe_82599.c b/drivers/net/ixgbe/ixgbe_82599.c index 3b3dd4df4c5c..34f30ec79c2e 100644 --- a/drivers/net/ixgbe/ixgbe_82599.c +++ b/drivers/net/ixgbe/ixgbe_82599.c | |||
@@ -213,6 +213,7 @@ static s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw) | |||
213 | switch (hw->phy.type) { | 213 | switch (hw->phy.type) { |
214 | case ixgbe_phy_tn: | 214 | case ixgbe_phy_tn: |
215 | phy->ops.check_link = &ixgbe_check_phy_link_tnx; | 215 | phy->ops.check_link = &ixgbe_check_phy_link_tnx; |
216 | phy->ops.setup_link = &ixgbe_setup_phy_link_tnx; | ||
216 | phy->ops.get_firmware_version = | 217 | phy->ops.get_firmware_version = |
217 | &ixgbe_get_phy_firmware_version_tnx; | 218 | &ixgbe_get_phy_firmware_version_tnx; |
218 | break; | 219 | break; |
diff --git a/drivers/net/ixgbe/ixgbe_common.c b/drivers/net/ixgbe/ixgbe_common.c index 777051f54e53..fc1375f26fe5 100644 --- a/drivers/net/ixgbe/ixgbe_common.c +++ b/drivers/net/ixgbe/ixgbe_common.c | |||
@@ -2632,6 +2632,7 @@ s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index) | |||
2632 | autoc_reg |= IXGBE_AUTOC_AN_RESTART; | 2632 | autoc_reg |= IXGBE_AUTOC_AN_RESTART; |
2633 | autoc_reg |= IXGBE_AUTOC_FLU; | 2633 | autoc_reg |= IXGBE_AUTOC_FLU; |
2634 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); | 2634 | IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg); |
2635 | IXGBE_WRITE_FLUSH(hw); | ||
2635 | usleep_range(10000, 20000); | 2636 | usleep_range(10000, 20000); |
2636 | } | 2637 | } |
2637 | 2638 | ||
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index dc649553a0a6..82d4244c6e10 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c | |||
@@ -1378,6 +1378,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data) | |||
1378 | 1378 | ||
1379 | /* Disable all the interrupts */ | 1379 | /* Disable all the interrupts */ |
1380 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF); | 1380 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF); |
1381 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1381 | usleep_range(10000, 20000); | 1382 | usleep_range(10000, 20000); |
1382 | 1383 | ||
1383 | /* Test each interrupt */ | 1384 | /* Test each interrupt */ |
@@ -1398,6 +1399,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data) | |||
1398 | ~mask & 0x00007FFF); | 1399 | ~mask & 0x00007FFF); |
1399 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, | 1400 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, |
1400 | ~mask & 0x00007FFF); | 1401 | ~mask & 0x00007FFF); |
1402 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1401 | usleep_range(10000, 20000); | 1403 | usleep_range(10000, 20000); |
1402 | 1404 | ||
1403 | if (adapter->test_icr & mask) { | 1405 | if (adapter->test_icr & mask) { |
@@ -1415,6 +1417,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data) | |||
1415 | adapter->test_icr = 0; | 1417 | adapter->test_icr = 0; |
1416 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); | 1418 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask); |
1417 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask); | 1419 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask); |
1420 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1418 | usleep_range(10000, 20000); | 1421 | usleep_range(10000, 20000); |
1419 | 1422 | ||
1420 | if (!(adapter->test_icr &mask)) { | 1423 | if (!(adapter->test_icr &mask)) { |
@@ -1435,6 +1438,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data) | |||
1435 | ~mask & 0x00007FFF); | 1438 | ~mask & 0x00007FFF); |
1436 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, | 1439 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, |
1437 | ~mask & 0x00007FFF); | 1440 | ~mask & 0x00007FFF); |
1441 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1438 | usleep_range(10000, 20000); | 1442 | usleep_range(10000, 20000); |
1439 | 1443 | ||
1440 | if (adapter->test_icr) { | 1444 | if (adapter->test_icr) { |
@@ -1446,6 +1450,7 @@ static int ixgbe_intr_test(struct ixgbe_adapter *adapter, u64 *data) | |||
1446 | 1450 | ||
1447 | /* Disable all the interrupts */ | 1451 | /* Disable all the interrupts */ |
1448 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF); | 1452 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFFFFFF); |
1453 | IXGBE_WRITE_FLUSH(&adapter->hw); | ||
1449 | usleep_range(10000, 20000); | 1454 | usleep_range(10000, 20000); |
1450 | 1455 | ||
1451 | /* Unhook test interrupt handler */ | 1456 | /* Unhook test interrupt handler */ |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 1be617545dc9..e86297b32733 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -184,6 +184,7 @@ static inline void ixgbe_disable_sriov(struct ixgbe_adapter *adapter) | |||
184 | vmdctl = IXGBE_READ_REG(hw, IXGBE_VT_CTL); | 184 | vmdctl = IXGBE_READ_REG(hw, IXGBE_VT_CTL); |
185 | vmdctl &= ~IXGBE_VT_CTL_POOL_MASK; | 185 | vmdctl &= ~IXGBE_VT_CTL_POOL_MASK; |
186 | IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vmdctl); | 186 | IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vmdctl); |
187 | IXGBE_WRITE_FLUSH(hw); | ||
187 | 188 | ||
188 | /* take a breather then clean up driver data */ | 189 | /* take a breather then clean up driver data */ |
189 | msleep(100); | 190 | msleep(100); |
@@ -1005,7 +1006,7 @@ static int __ixgbe_notify_dca(struct device *dev, void *data) | |||
1005 | struct ixgbe_adapter *adapter = dev_get_drvdata(dev); | 1006 | struct ixgbe_adapter *adapter = dev_get_drvdata(dev); |
1006 | unsigned long event = *(unsigned long *)data; | 1007 | unsigned long event = *(unsigned long *)data; |
1007 | 1008 | ||
1008 | if (!(adapter->flags & IXGBE_FLAG_DCA_ENABLED)) | 1009 | if (!(adapter->flags & IXGBE_FLAG_DCA_CAPABLE)) |
1009 | return 0; | 1010 | return 0; |
1010 | 1011 | ||
1011 | switch (event) { | 1012 | switch (event) { |
diff --git a/drivers/net/ixgbe/ixgbe_phy.c b/drivers/net/ixgbe/ixgbe_phy.c index 735f686c3b36..f7ca3511b9fe 100644 --- a/drivers/net/ixgbe/ixgbe_phy.c +++ b/drivers/net/ixgbe/ixgbe_phy.c | |||
@@ -1585,6 +1585,7 @@ static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) | |||
1585 | *i2cctl |= IXGBE_I2C_CLK_OUT; | 1585 | *i2cctl |= IXGBE_I2C_CLK_OUT; |
1586 | 1586 | ||
1587 | IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); | 1587 | IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); |
1588 | IXGBE_WRITE_FLUSH(hw); | ||
1588 | 1589 | ||
1589 | /* SCL rise time (1000ns) */ | 1590 | /* SCL rise time (1000ns) */ |
1590 | udelay(IXGBE_I2C_T_RISE); | 1591 | udelay(IXGBE_I2C_T_RISE); |
@@ -1605,6 +1606,7 @@ static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) | |||
1605 | *i2cctl &= ~IXGBE_I2C_CLK_OUT; | 1606 | *i2cctl &= ~IXGBE_I2C_CLK_OUT; |
1606 | 1607 | ||
1607 | IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); | 1608 | IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); |
1609 | IXGBE_WRITE_FLUSH(hw); | ||
1608 | 1610 | ||
1609 | /* SCL fall time (300ns) */ | 1611 | /* SCL fall time (300ns) */ |
1610 | udelay(IXGBE_I2C_T_FALL); | 1612 | udelay(IXGBE_I2C_T_FALL); |
@@ -1628,6 +1630,7 @@ static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data) | |||
1628 | *i2cctl &= ~IXGBE_I2C_DATA_OUT; | 1630 | *i2cctl &= ~IXGBE_I2C_DATA_OUT; |
1629 | 1631 | ||
1630 | IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); | 1632 | IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); |
1633 | IXGBE_WRITE_FLUSH(hw); | ||
1631 | 1634 | ||
1632 | /* Data rise/fall (1000ns/300ns) and set-up time (250ns) */ | 1635 | /* Data rise/fall (1000ns/300ns) and set-up time (250ns) */ |
1633 | udelay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA); | 1636 | udelay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA); |
diff --git a/drivers/net/ixgbe/ixgbe_x540.c b/drivers/net/ixgbe/ixgbe_x540.c index bec30ed91adc..2696c78e9f46 100644 --- a/drivers/net/ixgbe/ixgbe_x540.c +++ b/drivers/net/ixgbe/ixgbe_x540.c | |||
@@ -162,6 +162,7 @@ mac_reset_top: | |||
162 | ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT); | 162 | ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT); |
163 | ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD; | 163 | ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD; |
164 | IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext); | 164 | IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext); |
165 | IXGBE_WRITE_FLUSH(hw); | ||
165 | 166 | ||
166 | msleep(50); | 167 | msleep(50); |
167 | 168 | ||
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 0fcdc25699d8..dc4e305a1087 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c | |||
@@ -322,6 +322,9 @@ static void macb_tx(struct macb *bp) | |||
322 | for (i = 0; i < TX_RING_SIZE; i++) | 322 | for (i = 0; i < TX_RING_SIZE; i++) |
323 | bp->tx_ring[i].ctrl = MACB_BIT(TX_USED); | 323 | bp->tx_ring[i].ctrl = MACB_BIT(TX_USED); |
324 | 324 | ||
325 | /* Add wrap bit */ | ||
326 | bp->tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP); | ||
327 | |||
325 | /* free transmit buffer in upper layer*/ | 328 | /* free transmit buffer in upper layer*/ |
326 | for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(tail)) { | 329 | for (tail = bp->tx_tail; tail != head; tail = NEXT_TX(tail)) { |
327 | struct ring_info *rp = &bp->tx_skb[tail]; | 330 | struct ring_info *rp = &bp->tx_skb[tail]; |
diff --git a/drivers/net/mlx4/en_port.c b/drivers/net/mlx4/en_port.c index 5e7109178061..5ada5b469112 100644 --- a/drivers/net/mlx4/en_port.c +++ b/drivers/net/mlx4/en_port.c | |||
@@ -128,7 +128,7 @@ int mlx4_SET_PORT_qpn_calc(struct mlx4_dev *dev, u8 port, u32 base_qpn, | |||
128 | memset(context, 0, sizeof *context); | 128 | memset(context, 0, sizeof *context); |
129 | 129 | ||
130 | context->base_qpn = cpu_to_be32(base_qpn); | 130 | context->base_qpn = cpu_to_be32(base_qpn); |
131 | context->n_mac = 0x7; | 131 | context->n_mac = 0x2; |
132 | context->promisc = cpu_to_be32(promisc << SET_PORT_PROMISC_SHIFT | | 132 | context->promisc = cpu_to_be32(promisc << SET_PORT_PROMISC_SHIFT | |
133 | base_qpn); | 133 | base_qpn); |
134 | context->mcast = cpu_to_be32(m_promisc << SET_PORT_MC_PROMISC_SHIFT | | 134 | context->mcast = cpu_to_be32(m_promisc << SET_PORT_MC_PROMISC_SHIFT | |
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index c94b3426d355..f0ee35df4dd7 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c | |||
@@ -1117,6 +1117,8 @@ static int mlx4_init_port_info(struct mlx4_dev *dev, int port) | |||
1117 | info->port = port; | 1117 | info->port = port; |
1118 | mlx4_init_mac_table(dev, &info->mac_table); | 1118 | mlx4_init_mac_table(dev, &info->mac_table); |
1119 | mlx4_init_vlan_table(dev, &info->vlan_table); | 1119 | mlx4_init_vlan_table(dev, &info->vlan_table); |
1120 | info->base_qpn = dev->caps.reserved_qps_base[MLX4_QP_REGION_ETH_ADDR] + | ||
1121 | (port - 1) * (1 << log_num_mac); | ||
1120 | 1122 | ||
1121 | sprintf(info->dev_name, "mlx4_port%d", port); | 1123 | sprintf(info->dev_name, "mlx4_port%d", port); |
1122 | info->port_attr.attr.name = info->dev_name; | 1124 | info->port_attr.attr.name = info->dev_name; |
diff --git a/drivers/net/mlx4/port.c b/drivers/net/mlx4/port.c index 1f95afda6841..609e0ec14cee 100644 --- a/drivers/net/mlx4/port.c +++ b/drivers/net/mlx4/port.c | |||
@@ -258,9 +258,12 @@ void mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, int qpn) | |||
258 | if (validate_index(dev, table, index)) | 258 | if (validate_index(dev, table, index)) |
259 | goto out; | 259 | goto out; |
260 | 260 | ||
261 | table->entries[index] = 0; | 261 | /* Check whether this address has reference count */ |
262 | mlx4_set_port_mac_table(dev, port, table->entries); | 262 | if (!(--table->refs[index])) { |
263 | --table->total; | 263 | table->entries[index] = 0; |
264 | mlx4_set_port_mac_table(dev, port, table->entries); | ||
265 | --table->total; | ||
266 | } | ||
264 | out: | 267 | out: |
265 | mutex_unlock(&table->mutex); | 268 | mutex_unlock(&table->mutex); |
266 | } | 269 | } |
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index cd6c2317e29e..ed47585a6862 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
@@ -9201,7 +9201,7 @@ static int __devinit niu_ldg_init(struct niu *np) | |||
9201 | 9201 | ||
9202 | first_chan = 0; | 9202 | first_chan = 0; |
9203 | for (i = 0; i < port; i++) | 9203 | for (i = 0; i < port; i++) |
9204 | first_chan += parent->rxchan_per_port[port]; | 9204 | first_chan += parent->rxchan_per_port[i]; |
9205 | num_chan = parent->rxchan_per_port[port]; | 9205 | num_chan = parent->rxchan_per_port[port]; |
9206 | 9206 | ||
9207 | for (i = first_chan; i < (first_chan + num_chan); i++) { | 9207 | for (i = first_chan; i < (first_chan + num_chan); i++) { |
@@ -9217,7 +9217,7 @@ static int __devinit niu_ldg_init(struct niu *np) | |||
9217 | 9217 | ||
9218 | first_chan = 0; | 9218 | first_chan = 0; |
9219 | for (i = 0; i < port; i++) | 9219 | for (i = 0; i < port; i++) |
9220 | first_chan += parent->txchan_per_port[port]; | 9220 | first_chan += parent->txchan_per_port[i]; |
9221 | num_chan = parent->txchan_per_port[port]; | 9221 | num_chan = parent->txchan_per_port[port]; |
9222 | for (i = first_chan; i < (first_chan + num_chan); i++) { | 9222 | for (i = first_chan; i < (first_chan + num_chan); i++) { |
9223 | err = niu_ldg_assign_ldn(np, parent, | 9223 | err = niu_ldg_assign_ldn(np, parent, |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 7d9c650f395e..02339b3352e7 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -239,6 +239,7 @@ static DEFINE_PCI_DEVICE_TABLE(rtl8169_pci_tbl) = { | |||
239 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), 0, 0, RTL_CFG_1 }, | 239 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), 0, 0, RTL_CFG_1 }, |
240 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), 0, 0, RTL_CFG_0 }, | 240 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), 0, 0, RTL_CFG_0 }, |
241 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4300), 0, 0, RTL_CFG_0 }, | 241 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4300), 0, 0, RTL_CFG_0 }, |
242 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4302), 0, 0, RTL_CFG_0 }, | ||
242 | { PCI_DEVICE(PCI_VENDOR_ID_AT, 0xc107), 0, 0, RTL_CFG_0 }, | 243 | { PCI_DEVICE(PCI_VENDOR_ID_AT, 0xc107), 0, 0, RTL_CFG_0 }, |
243 | { PCI_DEVICE(0x16ec, 0x0116), 0, 0, RTL_CFG_0 }, | 244 | { PCI_DEVICE(0x16ec, 0x0116), 0, 0, RTL_CFG_0 }, |
244 | { PCI_VENDOR_ID_LINKSYS, 0x1032, | 245 | { PCI_VENDOR_ID_LINKSYS, 0x1032, |
@@ -1091,6 +1092,21 @@ rtl_w1w0_eri(void __iomem *ioaddr, int addr, u32 mask, u32 p, u32 m, int type) | |||
1091 | rtl_eri_write(ioaddr, addr, mask, (val & ~m) | p, type); | 1092 | rtl_eri_write(ioaddr, addr, mask, (val & ~m) | p, type); |
1092 | } | 1093 | } |
1093 | 1094 | ||
1095 | struct exgmac_reg { | ||
1096 | u16 addr; | ||
1097 | u16 mask; | ||
1098 | u32 val; | ||
1099 | }; | ||
1100 | |||
1101 | static void rtl_write_exgmac_batch(void __iomem *ioaddr, | ||
1102 | const struct exgmac_reg *r, int len) | ||
1103 | { | ||
1104 | while (len-- > 0) { | ||
1105 | rtl_eri_write(ioaddr, r->addr, r->mask, r->val, ERIAR_EXGMAC); | ||
1106 | r++; | ||
1107 | } | ||
1108 | } | ||
1109 | |||
1094 | static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr) | 1110 | static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr) |
1095 | { | 1111 | { |
1096 | u8 value = 0xff; | 1112 | u8 value = 0xff; |
@@ -3116,6 +3132,18 @@ static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr) | |||
3116 | RTL_W32(MAC0, low); | 3132 | RTL_W32(MAC0, low); |
3117 | RTL_R32(MAC0); | 3133 | RTL_R32(MAC0); |
3118 | 3134 | ||
3135 | if (tp->mac_version == RTL_GIGA_MAC_VER_34) { | ||
3136 | const struct exgmac_reg e[] = { | ||
3137 | { .addr = 0xe0, ERIAR_MASK_1111, .val = low }, | ||
3138 | { .addr = 0xe4, ERIAR_MASK_1111, .val = high }, | ||
3139 | { .addr = 0xf0, ERIAR_MASK_1111, .val = low << 16 }, | ||
3140 | { .addr = 0xf4, ERIAR_MASK_1111, .val = high << 16 | | ||
3141 | low >> 16 }, | ||
3142 | }; | ||
3143 | |||
3144 | rtl_write_exgmac_batch(ioaddr, e, ARRAY_SIZE(e)); | ||
3145 | } | ||
3146 | |||
3119 | RTL_W8(Cfg9346, Cfg9346_Lock); | 3147 | RTL_W8(Cfg9346, Cfg9346_Lock); |
3120 | 3148 | ||
3121 | spin_unlock_irq(&tp->lock); | 3149 | spin_unlock_irq(&tp->lock); |
diff --git a/drivers/net/sis190.c b/drivers/net/sis190.c index 8ad7bfbaa3af..3c0f1312b391 100644 --- a/drivers/net/sis190.c +++ b/drivers/net/sis190.c | |||
@@ -1825,6 +1825,16 @@ static int sis190_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
1825 | generic_mii_ioctl(&tp->mii_if, if_mii(ifr), cmd, NULL); | 1825 | generic_mii_ioctl(&tp->mii_if, if_mii(ifr), cmd, NULL); |
1826 | } | 1826 | } |
1827 | 1827 | ||
1828 | static int sis190_mac_addr(struct net_device *dev, void *p) | ||
1829 | { | ||
1830 | int rc; | ||
1831 | |||
1832 | rc = eth_mac_addr(dev, p); | ||
1833 | if (!rc) | ||
1834 | sis190_init_rxfilter(dev); | ||
1835 | return rc; | ||
1836 | } | ||
1837 | |||
1828 | static const struct net_device_ops sis190_netdev_ops = { | 1838 | static const struct net_device_ops sis190_netdev_ops = { |
1829 | .ndo_open = sis190_open, | 1839 | .ndo_open = sis190_open, |
1830 | .ndo_stop = sis190_close, | 1840 | .ndo_stop = sis190_close, |
@@ -1833,7 +1843,7 @@ static const struct net_device_ops sis190_netdev_ops = { | |||
1833 | .ndo_tx_timeout = sis190_tx_timeout, | 1843 | .ndo_tx_timeout = sis190_tx_timeout, |
1834 | .ndo_set_multicast_list = sis190_set_rx_mode, | 1844 | .ndo_set_multicast_list = sis190_set_rx_mode, |
1835 | .ndo_change_mtu = eth_change_mtu, | 1845 | .ndo_change_mtu = eth_change_mtu, |
1836 | .ndo_set_mac_address = eth_mac_addr, | 1846 | .ndo_set_mac_address = sis190_mac_addr, |
1837 | .ndo_validate_addr = eth_validate_addr, | 1847 | .ndo_validate_addr = eth_validate_addr, |
1838 | #ifdef CONFIG_NET_POLL_CONTROLLER | 1848 | #ifdef CONFIG_NET_POLL_CONTROLLER |
1839 | .ndo_poll_controller = sis190_netpoll, | 1849 | .ndo_poll_controller = sis190_netpoll, |
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index fd622a66ebbf..a03336e086d5 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
@@ -53,7 +53,7 @@ | |||
53 | #include <linux/usb/usbnet.h> | 53 | #include <linux/usb/usbnet.h> |
54 | #include <linux/usb/cdc.h> | 54 | #include <linux/usb/cdc.h> |
55 | 55 | ||
56 | #define DRIVER_VERSION "01-June-2011" | 56 | #define DRIVER_VERSION "04-Aug-2011" |
57 | 57 | ||
58 | /* CDC NCM subclass 3.2.1 */ | 58 | /* CDC NCM subclass 3.2.1 */ |
59 | #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 | 59 | #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 |
@@ -163,35 +163,8 @@ cdc_ncm_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info) | |||
163 | usb_make_path(dev->udev, info->bus_info, sizeof(info->bus_info)); | 163 | usb_make_path(dev->udev, info->bus_info, sizeof(info->bus_info)); |
164 | } | 164 | } |
165 | 165 | ||
166 | static int | ||
167 | cdc_ncm_do_request(struct cdc_ncm_ctx *ctx, struct usb_cdc_notification *req, | ||
168 | void *data, u16 flags, u16 *actlen, u16 timeout) | ||
169 | { | ||
170 | int err; | ||
171 | |||
172 | err = usb_control_msg(ctx->udev, (req->bmRequestType & USB_DIR_IN) ? | ||
173 | usb_rcvctrlpipe(ctx->udev, 0) : | ||
174 | usb_sndctrlpipe(ctx->udev, 0), | ||
175 | req->bNotificationType, req->bmRequestType, | ||
176 | req->wValue, | ||
177 | req->wIndex, data, | ||
178 | req->wLength, timeout); | ||
179 | |||
180 | if (err < 0) { | ||
181 | if (actlen) | ||
182 | *actlen = 0; | ||
183 | return err; | ||
184 | } | ||
185 | |||
186 | if (actlen) | ||
187 | *actlen = err; | ||
188 | |||
189 | return 0; | ||
190 | } | ||
191 | |||
192 | static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | 166 | static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) |
193 | { | 167 | { |
194 | struct usb_cdc_notification req; | ||
195 | u32 val; | 168 | u32 val; |
196 | u8 flags; | 169 | u8 flags; |
197 | u8 iface_no; | 170 | u8 iface_no; |
@@ -200,14 +173,14 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
200 | 173 | ||
201 | iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber; | 174 | iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber; |
202 | 175 | ||
203 | req.bmRequestType = USB_TYPE_CLASS | USB_DIR_IN | USB_RECIP_INTERFACE; | 176 | err = usb_control_msg(ctx->udev, |
204 | req.bNotificationType = USB_CDC_GET_NTB_PARAMETERS; | 177 | usb_rcvctrlpipe(ctx->udev, 0), |
205 | req.wValue = 0; | 178 | USB_CDC_GET_NTB_PARAMETERS, |
206 | req.wIndex = cpu_to_le16(iface_no); | 179 | USB_TYPE_CLASS | USB_DIR_IN |
207 | req.wLength = cpu_to_le16(sizeof(ctx->ncm_parm)); | 180 | | USB_RECIP_INTERFACE, |
208 | 181 | 0, iface_no, &ctx->ncm_parm, | |
209 | err = cdc_ncm_do_request(ctx, &req, &ctx->ncm_parm, 0, NULL, 1000); | 182 | sizeof(ctx->ncm_parm), 10000); |
210 | if (err) { | 183 | if (err < 0) { |
211 | pr_debug("failed GET_NTB_PARAMETERS\n"); | 184 | pr_debug("failed GET_NTB_PARAMETERS\n"); |
212 | return 1; | 185 | return 1; |
213 | } | 186 | } |
@@ -253,31 +226,26 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
253 | 226 | ||
254 | /* inform device about NTB input size changes */ | 227 | /* inform device about NTB input size changes */ |
255 | if (ctx->rx_max != le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize)) { | 228 | if (ctx->rx_max != le32_to_cpu(ctx->ncm_parm.dwNtbInMaxSize)) { |
256 | req.bmRequestType = USB_TYPE_CLASS | USB_DIR_OUT | | ||
257 | USB_RECIP_INTERFACE; | ||
258 | req.bNotificationType = USB_CDC_SET_NTB_INPUT_SIZE; | ||
259 | req.wValue = 0; | ||
260 | req.wIndex = cpu_to_le16(iface_no); | ||
261 | 229 | ||
262 | if (flags & USB_CDC_NCM_NCAP_NTB_INPUT_SIZE) { | 230 | if (flags & USB_CDC_NCM_NCAP_NTB_INPUT_SIZE) { |
263 | struct usb_cdc_ncm_ndp_input_size ndp_in_sz; | 231 | struct usb_cdc_ncm_ndp_input_size ndp_in_sz; |
264 | 232 | err = usb_control_msg(ctx->udev, | |
265 | req.wLength = 8; | 233 | usb_sndctrlpipe(ctx->udev, 0), |
266 | ndp_in_sz.dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); | 234 | USB_CDC_SET_NTB_INPUT_SIZE, |
267 | ndp_in_sz.wNtbInMaxDatagrams = | 235 | USB_TYPE_CLASS | USB_DIR_OUT |
268 | cpu_to_le16(CDC_NCM_DPT_DATAGRAMS_MAX); | 236 | | USB_RECIP_INTERFACE, |
269 | ndp_in_sz.wReserved = 0; | 237 | 0, iface_no, &ndp_in_sz, 8, 1000); |
270 | err = cdc_ncm_do_request(ctx, &req, &ndp_in_sz, 0, NULL, | ||
271 | 1000); | ||
272 | } else { | 238 | } else { |
273 | __le32 dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); | 239 | __le32 dwNtbInMaxSize = cpu_to_le32(ctx->rx_max); |
274 | 240 | err = usb_control_msg(ctx->udev, | |
275 | req.wLength = 4; | 241 | usb_sndctrlpipe(ctx->udev, 0), |
276 | err = cdc_ncm_do_request(ctx, &req, &dwNtbInMaxSize, 0, | 242 | USB_CDC_SET_NTB_INPUT_SIZE, |
277 | NULL, 1000); | 243 | USB_TYPE_CLASS | USB_DIR_OUT |
244 | | USB_RECIP_INTERFACE, | ||
245 | 0, iface_no, &dwNtbInMaxSize, 4, 1000); | ||
278 | } | 246 | } |
279 | 247 | ||
280 | if (err) | 248 | if (err < 0) |
281 | pr_debug("Setting NTB Input Size failed\n"); | 249 | pr_debug("Setting NTB Input Size failed\n"); |
282 | } | 250 | } |
283 | 251 | ||
@@ -332,29 +300,24 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
332 | 300 | ||
333 | /* set CRC Mode */ | 301 | /* set CRC Mode */ |
334 | if (flags & USB_CDC_NCM_NCAP_CRC_MODE) { | 302 | if (flags & USB_CDC_NCM_NCAP_CRC_MODE) { |
335 | req.bmRequestType = USB_TYPE_CLASS | USB_DIR_OUT | | 303 | err = usb_control_msg(ctx->udev, usb_sndctrlpipe(ctx->udev, 0), |
336 | USB_RECIP_INTERFACE; | 304 | USB_CDC_SET_CRC_MODE, |
337 | req.bNotificationType = USB_CDC_SET_CRC_MODE; | 305 | USB_TYPE_CLASS | USB_DIR_OUT |
338 | req.wValue = cpu_to_le16(USB_CDC_NCM_CRC_NOT_APPENDED); | 306 | | USB_RECIP_INTERFACE, |
339 | req.wIndex = cpu_to_le16(iface_no); | 307 | USB_CDC_NCM_CRC_NOT_APPENDED, |
340 | req.wLength = 0; | 308 | iface_no, NULL, 0, 1000); |
341 | 309 | if (err < 0) | |
342 | err = cdc_ncm_do_request(ctx, &req, NULL, 0, NULL, 1000); | ||
343 | if (err) | ||
344 | pr_debug("Setting CRC mode off failed\n"); | 310 | pr_debug("Setting CRC mode off failed\n"); |
345 | } | 311 | } |
346 | 312 | ||
347 | /* set NTB format, if both formats are supported */ | 313 | /* set NTB format, if both formats are supported */ |
348 | if (ntb_fmt_supported & USB_CDC_NCM_NTH32_SIGN) { | 314 | if (ntb_fmt_supported & USB_CDC_NCM_NTH32_SIGN) { |
349 | req.bmRequestType = USB_TYPE_CLASS | USB_DIR_OUT | | 315 | err = usb_control_msg(ctx->udev, usb_sndctrlpipe(ctx->udev, 0), |
350 | USB_RECIP_INTERFACE; | 316 | USB_CDC_SET_NTB_FORMAT, USB_TYPE_CLASS |
351 | req.bNotificationType = USB_CDC_SET_NTB_FORMAT; | 317 | | USB_DIR_OUT | USB_RECIP_INTERFACE, |
352 | req.wValue = cpu_to_le16(USB_CDC_NCM_NTB16_FORMAT); | 318 | USB_CDC_NCM_NTB16_FORMAT, |
353 | req.wIndex = cpu_to_le16(iface_no); | 319 | iface_no, NULL, 0, 1000); |
354 | req.wLength = 0; | 320 | if (err < 0) |
355 | |||
356 | err = cdc_ncm_do_request(ctx, &req, NULL, 0, NULL, 1000); | ||
357 | if (err) | ||
358 | pr_debug("Setting NTB format to 16-bit failed\n"); | 321 | pr_debug("Setting NTB format to 16-bit failed\n"); |
359 | } | 322 | } |
360 | 323 | ||
@@ -364,17 +327,13 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
364 | if (flags & USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE) { | 327 | if (flags & USB_CDC_NCM_NCAP_MAX_DATAGRAM_SIZE) { |
365 | __le16 max_datagram_size; | 328 | __le16 max_datagram_size; |
366 | u16 eth_max_sz = le16_to_cpu(ctx->ether_desc->wMaxSegmentSize); | 329 | u16 eth_max_sz = le16_to_cpu(ctx->ether_desc->wMaxSegmentSize); |
367 | 330 | err = usb_control_msg(ctx->udev, usb_rcvctrlpipe(ctx->udev, 0), | |
368 | req.bmRequestType = USB_TYPE_CLASS | USB_DIR_IN | | 331 | USB_CDC_GET_MAX_DATAGRAM_SIZE, |
369 | USB_RECIP_INTERFACE; | 332 | USB_TYPE_CLASS | USB_DIR_IN |
370 | req.bNotificationType = USB_CDC_GET_MAX_DATAGRAM_SIZE; | 333 | | USB_RECIP_INTERFACE, |
371 | req.wValue = 0; | 334 | 0, iface_no, &max_datagram_size, |
372 | req.wIndex = cpu_to_le16(iface_no); | 335 | 2, 1000); |
373 | req.wLength = cpu_to_le16(2); | 336 | if (err < 0) { |
374 | |||
375 | err = cdc_ncm_do_request(ctx, &req, &max_datagram_size, 0, NULL, | ||
376 | 1000); | ||
377 | if (err) { | ||
378 | pr_debug("GET_MAX_DATAGRAM_SIZE failed, use size=%u\n", | 337 | pr_debug("GET_MAX_DATAGRAM_SIZE failed, use size=%u\n", |
379 | CDC_NCM_MIN_DATAGRAM_SIZE); | 338 | CDC_NCM_MIN_DATAGRAM_SIZE); |
380 | } else { | 339 | } else { |
@@ -395,17 +354,15 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
395 | CDC_NCM_MIN_DATAGRAM_SIZE; | 354 | CDC_NCM_MIN_DATAGRAM_SIZE; |
396 | 355 | ||
397 | /* if value changed, update device */ | 356 | /* if value changed, update device */ |
398 | req.bmRequestType = USB_TYPE_CLASS | USB_DIR_OUT | | 357 | err = usb_control_msg(ctx->udev, |
399 | USB_RECIP_INTERFACE; | 358 | usb_sndctrlpipe(ctx->udev, 0), |
400 | req.bNotificationType = USB_CDC_SET_MAX_DATAGRAM_SIZE; | 359 | USB_CDC_SET_MAX_DATAGRAM_SIZE, |
401 | req.wValue = 0; | 360 | USB_TYPE_CLASS | USB_DIR_OUT |
402 | req.wIndex = cpu_to_le16(iface_no); | 361 | | USB_RECIP_INTERFACE, |
403 | req.wLength = 2; | 362 | 0, |
404 | max_datagram_size = cpu_to_le16(ctx->max_datagram_size); | 363 | iface_no, &max_datagram_size, |
405 | 364 | 2, 1000); | |
406 | err = cdc_ncm_do_request(ctx, &req, &max_datagram_size, | 365 | if (err < 0) |
407 | 0, NULL, 1000); | ||
408 | if (err) | ||
409 | pr_debug("SET_MAX_DATAGRAM_SIZE failed\n"); | 366 | pr_debug("SET_MAX_DATAGRAM_SIZE failed\n"); |
410 | } | 367 | } |
411 | 368 | ||
@@ -671,7 +628,7 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb) | |||
671 | u32 rem; | 628 | u32 rem; |
672 | u32 offset; | 629 | u32 offset; |
673 | u32 last_offset; | 630 | u32 last_offset; |
674 | u16 n = 0; | 631 | u16 n = 0, index; |
675 | u8 ready2send = 0; | 632 | u8 ready2send = 0; |
676 | 633 | ||
677 | /* if there is a remaining skb, it gets priority */ | 634 | /* if there is a remaining skb, it gets priority */ |
@@ -859,8 +816,8 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb) | |||
859 | cpu_to_le16(sizeof(ctx->tx_ncm.nth16)); | 816 | cpu_to_le16(sizeof(ctx->tx_ncm.nth16)); |
860 | ctx->tx_ncm.nth16.wSequence = cpu_to_le16(ctx->tx_seq); | 817 | ctx->tx_ncm.nth16.wSequence = cpu_to_le16(ctx->tx_seq); |
861 | ctx->tx_ncm.nth16.wBlockLength = cpu_to_le16(last_offset); | 818 | ctx->tx_ncm.nth16.wBlockLength = cpu_to_le16(last_offset); |
862 | ctx->tx_ncm.nth16.wNdpIndex = ALIGN(sizeof(struct usb_cdc_ncm_nth16), | 819 | index = ALIGN(sizeof(struct usb_cdc_ncm_nth16), ctx->tx_ndp_modulus); |
863 | ctx->tx_ndp_modulus); | 820 | ctx->tx_ncm.nth16.wNdpIndex = cpu_to_le16(index); |
864 | 821 | ||
865 | memcpy(skb_out->data, &(ctx->tx_ncm.nth16), sizeof(ctx->tx_ncm.nth16)); | 822 | memcpy(skb_out->data, &(ctx->tx_ncm.nth16), sizeof(ctx->tx_ncm.nth16)); |
866 | ctx->tx_seq++; | 823 | ctx->tx_seq++; |
@@ -873,12 +830,11 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb) | |||
873 | ctx->tx_ncm.ndp16.wLength = cpu_to_le16(rem); | 830 | ctx->tx_ncm.ndp16.wLength = cpu_to_le16(rem); |
874 | ctx->tx_ncm.ndp16.wNextNdpIndex = 0; /* reserved */ | 831 | ctx->tx_ncm.ndp16.wNextNdpIndex = 0; /* reserved */ |
875 | 832 | ||
876 | memcpy(((u8 *)skb_out->data) + ctx->tx_ncm.nth16.wNdpIndex, | 833 | memcpy(((u8 *)skb_out->data) + index, |
877 | &(ctx->tx_ncm.ndp16), | 834 | &(ctx->tx_ncm.ndp16), |
878 | sizeof(ctx->tx_ncm.ndp16)); | 835 | sizeof(ctx->tx_ncm.ndp16)); |
879 | 836 | ||
880 | memcpy(((u8 *)skb_out->data) + ctx->tx_ncm.nth16.wNdpIndex + | 837 | memcpy(((u8 *)skb_out->data) + index + sizeof(ctx->tx_ncm.ndp16), |
881 | sizeof(ctx->tx_ncm.ndp16), | ||
882 | &(ctx->tx_ncm.dpe16), | 838 | &(ctx->tx_ncm.dpe16), |
883 | (ctx->tx_curr_frame_num + 1) * | 839 | (ctx->tx_curr_frame_num + 1) * |
884 | sizeof(struct usb_cdc_ncm_dpe16)); | 840 | sizeof(struct usb_cdc_ncm_dpe16)); |
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c index 9ff7c30573b8..44d9d8d56490 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c | |||
@@ -309,11 +309,7 @@ static void ar9002_hw_configpcipowersave(struct ath_hw *ah, | |||
309 | u8 i; | 309 | u8 i; |
310 | u32 val; | 310 | u32 val; |
311 | 311 | ||
312 | if (ah->is_pciexpress != true) | 312 | if (ah->is_pciexpress != true || ah->aspm_enabled != true) |
313 | return; | ||
314 | |||
315 | /* Do not touch SerDes registers */ | ||
316 | if (ah->config.pcie_powersave_enable == 2) | ||
317 | return; | 313 | return; |
318 | 314 | ||
319 | /* Nothing to do on restore for 11N */ | 315 | /* Nothing to do on restore for 11N */ |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c index 8efdec247c02..ad2bb2bf4e8a 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c | |||
@@ -519,11 +519,7 @@ static void ar9003_hw_configpcipowersave(struct ath_hw *ah, | |||
519 | int restore, | 519 | int restore, |
520 | int power_off) | 520 | int power_off) |
521 | { | 521 | { |
522 | if (ah->is_pciexpress != true) | 522 | if (ah->is_pciexpress != true || ah->aspm_enabled != true) |
523 | return; | ||
524 | |||
525 | /* Do not touch SerDes registers */ | ||
526 | if (ah->config.pcie_powersave_enable == 2) | ||
527 | return; | 523 | return; |
528 | 524 | ||
529 | /* Nothing to do on restore for 11N */ | 525 | /* Nothing to do on restore for 11N */ |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 8006ce0c7357..8dcefe74f4c3 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -318,6 +318,14 @@ static void ath9k_hw_disablepcie(struct ath_hw *ah) | |||
318 | REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); | 318 | REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); |
319 | } | 319 | } |
320 | 320 | ||
321 | static void ath9k_hw_aspm_init(struct ath_hw *ah) | ||
322 | { | ||
323 | struct ath_common *common = ath9k_hw_common(ah); | ||
324 | |||
325 | if (common->bus_ops->aspm_init) | ||
326 | common->bus_ops->aspm_init(common); | ||
327 | } | ||
328 | |||
321 | /* This should work for all families including legacy */ | 329 | /* This should work for all families including legacy */ |
322 | static bool ath9k_hw_chip_test(struct ath_hw *ah) | 330 | static bool ath9k_hw_chip_test(struct ath_hw *ah) |
323 | { | 331 | { |
@@ -378,7 +386,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah) | |||
378 | ah->config.additional_swba_backoff = 0; | 386 | ah->config.additional_swba_backoff = 0; |
379 | ah->config.ack_6mb = 0x0; | 387 | ah->config.ack_6mb = 0x0; |
380 | ah->config.cwm_ignore_extcca = 0; | 388 | ah->config.cwm_ignore_extcca = 0; |
381 | ah->config.pcie_powersave_enable = 0; | ||
382 | ah->config.pcie_clock_req = 0; | 389 | ah->config.pcie_clock_req = 0; |
383 | ah->config.pcie_waen = 0; | 390 | ah->config.pcie_waen = 0; |
384 | ah->config.analog_shiftreg = 1; | 391 | ah->config.analog_shiftreg = 1; |
@@ -598,7 +605,7 @@ static int __ath9k_hw_init(struct ath_hw *ah) | |||
598 | 605 | ||
599 | 606 | ||
600 | if (ah->is_pciexpress) | 607 | if (ah->is_pciexpress) |
601 | ath9k_hw_configpcipowersave(ah, 0, 0); | 608 | ath9k_hw_aspm_init(ah); |
602 | else | 609 | else |
603 | ath9k_hw_disablepcie(ah); | 610 | ath9k_hw_disablepcie(ah); |
604 | 611 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 6acd0f975ae1..c79889036ec4 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -219,7 +219,6 @@ struct ath9k_ops_config { | |||
219 | int additional_swba_backoff; | 219 | int additional_swba_backoff; |
220 | int ack_6mb; | 220 | int ack_6mb; |
221 | u32 cwm_ignore_extcca; | 221 | u32 cwm_ignore_extcca; |
222 | u8 pcie_powersave_enable; | ||
223 | bool pcieSerDesWrite; | 222 | bool pcieSerDesWrite; |
224 | u8 pcie_clock_req; | 223 | u8 pcie_clock_req; |
225 | u32 pcie_waen; | 224 | u32 pcie_waen; |
@@ -673,6 +672,7 @@ struct ath_hw { | |||
673 | 672 | ||
674 | bool sw_mgmt_crypto; | 673 | bool sw_mgmt_crypto; |
675 | bool is_pciexpress; | 674 | bool is_pciexpress; |
675 | bool aspm_enabled; | ||
676 | bool is_monitoring; | 676 | bool is_monitoring; |
677 | bool need_an_top2_fixup; | 677 | bool need_an_top2_fixup; |
678 | u16 tx_trig_level; | 678 | u16 tx_trig_level; |
@@ -874,6 +874,7 @@ struct ath_bus_ops { | |||
874 | bool (*eeprom_read)(struct ath_common *common, u32 off, u16 *data); | 874 | bool (*eeprom_read)(struct ath_common *common, u32 off, u16 *data); |
875 | void (*bt_coex_prep)(struct ath_common *common); | 875 | void (*bt_coex_prep)(struct ath_common *common); |
876 | void (*extn_synch_en)(struct ath_common *common); | 876 | void (*extn_synch_en)(struct ath_common *common); |
877 | void (*aspm_init)(struct ath_common *common); | ||
877 | }; | 878 | }; |
878 | 879 | ||
879 | static inline struct ath_common *ath9k_hw_common(struct ath_hw *ah) | 880 | static inline struct ath_common *ath9k_hw_common(struct ath_hw *ah) |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index ac5107172f94..aa0ff7e2c922 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
@@ -670,8 +670,10 @@ static void ath9k_init_band_txpower(struct ath_softc *sc, int band) | |||
670 | static void ath9k_init_txpower_limits(struct ath_softc *sc) | 670 | static void ath9k_init_txpower_limits(struct ath_softc *sc) |
671 | { | 671 | { |
672 | struct ath_hw *ah = sc->sc_ah; | 672 | struct ath_hw *ah = sc->sc_ah; |
673 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | ||
673 | struct ath9k_channel *curchan = ah->curchan; | 674 | struct ath9k_channel *curchan = ah->curchan; |
674 | 675 | ||
676 | ah->txchainmask = common->tx_chainmask; | ||
675 | if (ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) | 677 | if (ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) |
676 | ath9k_init_band_txpower(sc, IEEE80211_BAND_2GHZ); | 678 | ath9k_init_band_txpower(sc, IEEE80211_BAND_2GHZ); |
677 | if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) | 679 | if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) |
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index 3bad0b2cf9a3..be4ea1329813 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include <linux/nl80211.h> | 17 | #include <linux/nl80211.h> |
18 | #include <linux/pci.h> | 18 | #include <linux/pci.h> |
19 | #include <linux/pci-aspm.h> | ||
19 | #include <linux/ath9k_platform.h> | 20 | #include <linux/ath9k_platform.h> |
20 | #include "ath9k.h" | 21 | #include "ath9k.h" |
21 | 22 | ||
@@ -115,12 +116,38 @@ static void ath_pci_extn_synch_enable(struct ath_common *common) | |||
115 | pci_write_config_byte(pdev, sc->sc_ah->caps.pcie_lcr_offset, lnkctl); | 116 | pci_write_config_byte(pdev, sc->sc_ah->caps.pcie_lcr_offset, lnkctl); |
116 | } | 117 | } |
117 | 118 | ||
119 | static void ath_pci_aspm_init(struct ath_common *common) | ||
120 | { | ||
121 | struct ath_softc *sc = (struct ath_softc *) common->priv; | ||
122 | struct ath_hw *ah = sc->sc_ah; | ||
123 | struct pci_dev *pdev = to_pci_dev(sc->dev); | ||
124 | struct pci_dev *parent; | ||
125 | int pos; | ||
126 | u8 aspm; | ||
127 | |||
128 | if (!pci_is_pcie(pdev)) | ||
129 | return; | ||
130 | |||
131 | parent = pdev->bus->self; | ||
132 | if (WARN_ON(!parent)) | ||
133 | return; | ||
134 | |||
135 | pos = pci_pcie_cap(parent); | ||
136 | pci_read_config_byte(parent, pos + PCI_EXP_LNKCTL, &aspm); | ||
137 | if (aspm & (PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1)) { | ||
138 | ah->aspm_enabled = true; | ||
139 | /* Initialize PCIe PM and SERDES registers. */ | ||
140 | ath9k_hw_configpcipowersave(ah, 0, 0); | ||
141 | } | ||
142 | } | ||
143 | |||
118 | static const struct ath_bus_ops ath_pci_bus_ops = { | 144 | static const struct ath_bus_ops ath_pci_bus_ops = { |
119 | .ath_bus_type = ATH_PCI, | 145 | .ath_bus_type = ATH_PCI, |
120 | .read_cachesize = ath_pci_read_cachesize, | 146 | .read_cachesize = ath_pci_read_cachesize, |
121 | .eeprom_read = ath_pci_eeprom_read, | 147 | .eeprom_read = ath_pci_eeprom_read, |
122 | .bt_coex_prep = ath_pci_bt_coex_prep, | 148 | .bt_coex_prep = ath_pci_bt_coex_prep, |
123 | .extn_synch_en = ath_pci_extn_synch_enable, | 149 | .extn_synch_en = ath_pci_extn_synch_enable, |
150 | .aspm_init = ath_pci_aspm_init, | ||
124 | }; | 151 | }; |
125 | 152 | ||
126 | static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | 153 | static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
diff --git a/drivers/net/wireless/iwlegacy/iwl-3945.c b/drivers/net/wireless/iwlegacy/iwl-3945.c index dab67a12d73b..73fe3cdf796b 100644 --- a/drivers/net/wireless/iwlegacy/iwl-3945.c +++ b/drivers/net/wireless/iwlegacy/iwl-3945.c | |||
@@ -1746,7 +1746,11 @@ int iwl3945_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx) | |||
1746 | } | 1746 | } |
1747 | 1747 | ||
1748 | memcpy(active_rxon, staging_rxon, sizeof(*active_rxon)); | 1748 | memcpy(active_rxon, staging_rxon, sizeof(*active_rxon)); |
1749 | 1749 | /* | |
1750 | * We do not commit tx power settings while channel changing, | ||
1751 | * do it now if tx power changed. | ||
1752 | */ | ||
1753 | iwl_legacy_set_tx_power(priv, priv->tx_power_next, false); | ||
1750 | return 0; | 1754 | return 0; |
1751 | } | 1755 | } |
1752 | 1756 | ||
diff --git a/drivers/net/wireless/iwlegacy/iwl-4965.c b/drivers/net/wireless/iwlegacy/iwl-4965.c index bd4b000733f7..ecdc6e557428 100644 --- a/drivers/net/wireless/iwlegacy/iwl-4965.c +++ b/drivers/net/wireless/iwlegacy/iwl-4965.c | |||
@@ -1235,7 +1235,12 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c | |||
1235 | 1235 | ||
1236 | memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon)); | 1236 | memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon)); |
1237 | iwl_legacy_print_rx_config_cmd(priv, ctx); | 1237 | iwl_legacy_print_rx_config_cmd(priv, ctx); |
1238 | goto set_tx_power; | 1238 | /* |
1239 | * We do not commit tx power settings while channel changing, | ||
1240 | * do it now if tx power changed. | ||
1241 | */ | ||
1242 | iwl_legacy_set_tx_power(priv, priv->tx_power_next, false); | ||
1243 | return 0; | ||
1239 | } | 1244 | } |
1240 | 1245 | ||
1241 | /* If we are currently associated and the new config requires | 1246 | /* If we are currently associated and the new config requires |
@@ -1315,7 +1320,6 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *c | |||
1315 | 1320 | ||
1316 | iwl4965_init_sensitivity(priv); | 1321 | iwl4965_init_sensitivity(priv); |
1317 | 1322 | ||
1318 | set_tx_power: | ||
1319 | /* If we issue a new RXON command which required a tune then we must | 1323 | /* If we issue a new RXON command which required a tune then we must |
1320 | * send a new TXPOWER command or we won't be able to Tx any frames */ | 1324 | * send a new TXPOWER command or we won't be able to Tx any frames */ |
1321 | ret = iwl_legacy_set_tx_power(priv, priv->tx_power_next, true); | 1325 | ret = iwl_legacy_set_tx_power(priv, priv->tx_power_next, true); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index 3eeb12ebe6e9..c95cefd529dc 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -365,6 +365,7 @@ static struct iwl_base_params iwl5000_base_params = { | |||
365 | .chain_noise_scale = 1000, | 365 | .chain_noise_scale = 1000, |
366 | .wd_timeout = IWL_LONG_WD_TIMEOUT, | 366 | .wd_timeout = IWL_LONG_WD_TIMEOUT, |
367 | .max_event_log_size = 512, | 367 | .max_event_log_size = 512, |
368 | .no_idle_support = true, | ||
368 | }; | 369 | }; |
369 | static struct iwl_ht_params iwl5000_ht_params = { | 370 | static struct iwl_ht_params iwl5000_ht_params = { |
370 | .ht_greenfield_support = true, | 371 | .ht_greenfield_support = true, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 3e6bb734dcb7..02817a438550 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -135,6 +135,7 @@ struct iwl_mod_params { | |||
135 | * @temperature_kelvin: temperature report by uCode in kelvin | 135 | * @temperature_kelvin: temperature report by uCode in kelvin |
136 | * @max_event_log_size: size of event log buffer size for ucode event logging | 136 | * @max_event_log_size: size of event log buffer size for ucode event logging |
137 | * @shadow_reg_enable: HW shadhow register bit | 137 | * @shadow_reg_enable: HW shadhow register bit |
138 | * @no_idle_support: do not support idle mode | ||
138 | */ | 139 | */ |
139 | struct iwl_base_params { | 140 | struct iwl_base_params { |
140 | int eeprom_size; | 141 | int eeprom_size; |
@@ -156,6 +157,7 @@ struct iwl_base_params { | |||
156 | bool temperature_kelvin; | 157 | bool temperature_kelvin; |
157 | u32 max_event_log_size; | 158 | u32 max_event_log_size; |
158 | const bool shadow_reg_enable; | 159 | const bool shadow_reg_enable; |
160 | const bool no_idle_support; | ||
159 | }; | 161 | }; |
160 | /* | 162 | /* |
161 | * @advanced_bt_coexist: support advanced bt coexist | 163 | * @advanced_bt_coexist: support advanced bt coexist |
diff --git a/drivers/net/wireless/iwlwifi/iwl-pci.c b/drivers/net/wireless/iwlwifi/iwl-pci.c index fb7e436b40c7..69d4ec467dca 100644 --- a/drivers/net/wireless/iwlwifi/iwl-pci.c +++ b/drivers/net/wireless/iwlwifi/iwl-pci.c | |||
@@ -134,6 +134,7 @@ static void iwl_pci_apm_config(struct iwl_bus *bus) | |||
134 | static void iwl_pci_set_drv_data(struct iwl_bus *bus, void *drv_data) | 134 | static void iwl_pci_set_drv_data(struct iwl_bus *bus, void *drv_data) |
135 | { | 135 | { |
136 | bus->drv_data = drv_data; | 136 | bus->drv_data = drv_data; |
137 | pci_set_drvdata(IWL_BUS_GET_PCI_DEV(bus), drv_data); | ||
137 | } | 138 | } |
138 | 139 | ||
139 | static void iwl_pci_get_hw_id(struct iwl_bus *bus, char buf[], | 140 | static void iwl_pci_get_hw_id(struct iwl_bus *bus, char buf[], |
@@ -454,8 +455,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
454 | pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); | 455 | pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); |
455 | } | 456 | } |
456 | 457 | ||
457 | pci_set_drvdata(pdev, bus); | ||
458 | |||
459 | bus->dev = &pdev->dev; | 458 | bus->dev = &pdev->dev; |
460 | bus->irq = pdev->irq; | 459 | bus->irq = pdev->irq; |
461 | bus->ops = &pci_ops; | 460 | bus->ops = &pci_ops; |
@@ -494,11 +493,12 @@ static void iwl_pci_down(struct iwl_bus *bus) | |||
494 | 493 | ||
495 | static void __devexit iwl_pci_remove(struct pci_dev *pdev) | 494 | static void __devexit iwl_pci_remove(struct pci_dev *pdev) |
496 | { | 495 | { |
497 | struct iwl_bus *bus = pci_get_drvdata(pdev); | 496 | struct iwl_priv *priv = pci_get_drvdata(pdev); |
497 | void *bus_specific = priv->bus->bus_specific; | ||
498 | 498 | ||
499 | iwl_remove(bus->drv_data); | 499 | iwl_remove(priv); |
500 | 500 | ||
501 | iwl_pci_down(bus); | 501 | iwl_pci_down(bus_specific); |
502 | } | 502 | } |
503 | 503 | ||
504 | #ifdef CONFIG_PM | 504 | #ifdef CONFIG_PM |
@@ -506,20 +506,20 @@ static void __devexit iwl_pci_remove(struct pci_dev *pdev) | |||
506 | static int iwl_pci_suspend(struct device *device) | 506 | static int iwl_pci_suspend(struct device *device) |
507 | { | 507 | { |
508 | struct pci_dev *pdev = to_pci_dev(device); | 508 | struct pci_dev *pdev = to_pci_dev(device); |
509 | struct iwl_bus *bus = pci_get_drvdata(pdev); | 509 | struct iwl_priv *priv = pci_get_drvdata(pdev); |
510 | 510 | ||
511 | /* Before you put code here, think about WoWLAN. You cannot check here | 511 | /* Before you put code here, think about WoWLAN. You cannot check here |
512 | * whether WoWLAN is enabled or not, and your code will run even if | 512 | * whether WoWLAN is enabled or not, and your code will run even if |
513 | * WoWLAN is enabled - don't kill the NIC, someone may need it in Sx. | 513 | * WoWLAN is enabled - don't kill the NIC, someone may need it in Sx. |
514 | */ | 514 | */ |
515 | 515 | ||
516 | return iwl_suspend(bus->drv_data); | 516 | return iwl_suspend(priv); |
517 | } | 517 | } |
518 | 518 | ||
519 | static int iwl_pci_resume(struct device *device) | 519 | static int iwl_pci_resume(struct device *device) |
520 | { | 520 | { |
521 | struct pci_dev *pdev = to_pci_dev(device); | 521 | struct pci_dev *pdev = to_pci_dev(device); |
522 | struct iwl_bus *bus = pci_get_drvdata(pdev); | 522 | struct iwl_priv *priv = pci_get_drvdata(pdev); |
523 | 523 | ||
524 | /* Before you put code here, think about WoWLAN. You cannot check here | 524 | /* Before you put code here, think about WoWLAN. You cannot check here |
525 | * whether WoWLAN is enabled or not, and your code will run even if | 525 | * whether WoWLAN is enabled or not, and your code will run even if |
@@ -532,7 +532,7 @@ static int iwl_pci_resume(struct device *device) | |||
532 | */ | 532 | */ |
533 | pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00); | 533 | pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00); |
534 | 534 | ||
535 | return iwl_resume(bus->drv_data); | 535 | return iwl_resume(priv); |
536 | } | 536 | } |
537 | 537 | ||
538 | static SIMPLE_DEV_PM_OPS(iwl_dev_pm_ops, iwl_pci_suspend, iwl_pci_resume); | 538 | static SIMPLE_DEV_PM_OPS(iwl_dev_pm_ops, iwl_pci_suspend, iwl_pci_resume); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.c b/drivers/net/wireless/iwlwifi/iwl-power.c index 3ec619c6881c..cd64df05f9ed 100644 --- a/drivers/net/wireless/iwlwifi/iwl-power.c +++ b/drivers/net/wireless/iwlwifi/iwl-power.c | |||
@@ -349,7 +349,8 @@ static void iwl_power_build_cmd(struct iwl_priv *priv, | |||
349 | 349 | ||
350 | if (priv->wowlan) | 350 | if (priv->wowlan) |
351 | iwl_static_sleep_cmd(priv, cmd, IWL_POWER_INDEX_5, dtimper); | 351 | iwl_static_sleep_cmd(priv, cmd, IWL_POWER_INDEX_5, dtimper); |
352 | else if (priv->hw->conf.flags & IEEE80211_CONF_IDLE) | 352 | else if (!priv->cfg->base_params->no_idle_support && |
353 | priv->hw->conf.flags & IEEE80211_CONF_IDLE) | ||
353 | iwl_static_sleep_cmd(priv, cmd, IWL_POWER_INDEX_5, 20); | 354 | iwl_static_sleep_cmd(priv, cmd, IWL_POWER_INDEX_5, 20); |
354 | else if (iwl_tt_is_low_power_state(priv)) { | 355 | else if (iwl_tt_is_low_power_state(priv)) { |
355 | /* in thermal throttling low power state */ | 356 | /* in thermal throttling low power state */ |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 84ab7d1acb6a..ef67f6786a84 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -703,8 +703,7 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc) | |||
703 | /* | 703 | /* |
704 | * Add space for the TXWI in front of the skb. | 704 | * Add space for the TXWI in front of the skb. |
705 | */ | 705 | */ |
706 | skb_push(entry->skb, TXWI_DESC_SIZE); | 706 | memset(skb_push(entry->skb, TXWI_DESC_SIZE), 0, TXWI_DESC_SIZE); |
707 | memset(entry->skb, 0, TXWI_DESC_SIZE); | ||
708 | 707 | ||
709 | /* | 708 | /* |
710 | * Register descriptor details in skb frame descriptor. | 709 | * Register descriptor details in skb frame descriptor. |
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h index 15cdc7e57fc4..4cdf247a870d 100644 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h | |||
@@ -355,7 +355,8 @@ static inline enum cipher rt2x00crypto_key_to_cipher(struct ieee80211_key_conf * | |||
355 | return CIPHER_NONE; | 355 | return CIPHER_NONE; |
356 | } | 356 | } |
357 | 357 | ||
358 | static inline void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry, | 358 | static inline void rt2x00crypto_create_tx_descriptor(struct rt2x00_dev *rt2x00dev, |
359 | struct sk_buff *skb, | ||
359 | struct txentry_desc *txdesc) | 360 | struct txentry_desc *txdesc) |
360 | { | 361 | { |
361 | } | 362 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index 8efab3983528..4ccf23805973 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
@@ -113,7 +113,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
113 | * due to possible race conditions in mac80211. | 113 | * due to possible race conditions in mac80211. |
114 | */ | 114 | */ |
115 | if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) | 115 | if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) |
116 | goto exit_fail; | 116 | goto exit_free_skb; |
117 | 117 | ||
118 | /* | 118 | /* |
119 | * Use the ATIM queue if appropriate and present. | 119 | * Use the ATIM queue if appropriate and present. |
@@ -127,7 +127,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
127 | ERROR(rt2x00dev, | 127 | ERROR(rt2x00dev, |
128 | "Attempt to send packet over invalid queue %d.\n" | 128 | "Attempt to send packet over invalid queue %d.\n" |
129 | "Please file bug report to %s.\n", qid, DRV_PROJECT); | 129 | "Please file bug report to %s.\n", qid, DRV_PROJECT); |
130 | goto exit_fail; | 130 | goto exit_free_skb; |
131 | } | 131 | } |
132 | 132 | ||
133 | /* | 133 | /* |
@@ -159,6 +159,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
159 | 159 | ||
160 | exit_fail: | 160 | exit_fail: |
161 | rt2x00queue_pause_queue(queue); | 161 | rt2x00queue_pause_queue(queue); |
162 | exit_free_skb: | ||
162 | dev_kfree_skb_any(skb); | 163 | dev_kfree_skb_any(skb); |
163 | } | 164 | } |
164 | EXPORT_SYMBOL_GPL(rt2x00mac_tx); | 165 | EXPORT_SYMBOL_GPL(rt2x00mac_tx); |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 5efd57833489..56f12358389d 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
@@ -1696,15 +1696,17 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev, | |||
1696 | pcipriv->ndis_adapter.devnumber = PCI_SLOT(pdev->devfn); | 1696 | pcipriv->ndis_adapter.devnumber = PCI_SLOT(pdev->devfn); |
1697 | pcipriv->ndis_adapter.funcnumber = PCI_FUNC(pdev->devfn); | 1697 | pcipriv->ndis_adapter.funcnumber = PCI_FUNC(pdev->devfn); |
1698 | 1698 | ||
1699 | /*find bridge info */ | 1699 | if (bridge_pdev) { |
1700 | pcipriv->ndis_adapter.pcibridge_vendorid = bridge_pdev->vendor; | 1700 | /*find bridge info if available */ |
1701 | for (tmp = 0; tmp < PCI_BRIDGE_VENDOR_MAX; tmp++) { | 1701 | pcipriv->ndis_adapter.pcibridge_vendorid = bridge_pdev->vendor; |
1702 | if (bridge_pdev->vendor == pcibridge_vendors[tmp]) { | 1702 | for (tmp = 0; tmp < PCI_BRIDGE_VENDOR_MAX; tmp++) { |
1703 | pcipriv->ndis_adapter.pcibridge_vendor = tmp; | 1703 | if (bridge_pdev->vendor == pcibridge_vendors[tmp]) { |
1704 | RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, | 1704 | pcipriv->ndis_adapter.pcibridge_vendor = tmp; |
1705 | ("Pci Bridge Vendor is found index: %d\n", | 1705 | RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, |
1706 | tmp)); | 1706 | ("Pci Bridge Vendor is found index:" |
1707 | break; | 1707 | " %d\n", tmp)); |
1708 | break; | ||
1709 | } | ||
1708 | } | 1710 | } |
1709 | } | 1711 | } |
1710 | 1712 | ||
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig index 45e0191c35dd..1e88d4785321 100644 --- a/drivers/platform/x86/Kconfig +++ b/drivers/platform/x86/Kconfig | |||
@@ -769,4 +769,12 @@ config INTEL_OAKTRAIL | |||
769 | enable/disable the Camera, WiFi, BT etc. devices. If in doubt, say Y | 769 | enable/disable the Camera, WiFi, BT etc. devices. If in doubt, say Y |
770 | here; it will only load on supported platforms. | 770 | here; it will only load on supported platforms. |
771 | 771 | ||
772 | config SAMSUNG_Q10 | ||
773 | tristate "Samsung Q10 Extras" | ||
774 | depends on SERIO_I8042 | ||
775 | select BACKLIGHT_CLASS_DEVICE | ||
776 | ---help--- | ||
777 | This driver provides support for backlight control on Samsung Q10 | ||
778 | and related laptops, including Dell Latitude X200. | ||
779 | |||
772 | endif # X86_PLATFORM_DEVICES | 780 | endif # X86_PLATFORM_DEVICES |
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile index afc1f832aa67..293a320d9faa 100644 --- a/drivers/platform/x86/Makefile +++ b/drivers/platform/x86/Makefile | |||
@@ -44,3 +44,4 @@ obj-$(CONFIG_SAMSUNG_LAPTOP) += samsung-laptop.o | |||
44 | obj-$(CONFIG_MXM_WMI) += mxm-wmi.o | 44 | obj-$(CONFIG_MXM_WMI) += mxm-wmi.o |
45 | obj-$(CONFIG_INTEL_MID_POWER_BUTTON) += intel_mid_powerbtn.o | 45 | obj-$(CONFIG_INTEL_MID_POWER_BUTTON) += intel_mid_powerbtn.o |
46 | obj-$(CONFIG_INTEL_OAKTRAIL) += intel_oaktrail.o | 46 | obj-$(CONFIG_INTEL_OAKTRAIL) += intel_oaktrail.o |
47 | obj-$(CONFIG_SAMSUNG_Q10) += samsung-q10.o | ||
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index e1c4938b301b..af2bb20cb2fb 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
@@ -99,6 +99,7 @@ enum acer_wmi_event_ids { | |||
99 | static const struct key_entry acer_wmi_keymap[] = { | 99 | static const struct key_entry acer_wmi_keymap[] = { |
100 | {KE_KEY, 0x01, {KEY_WLAN} }, /* WiFi */ | 100 | {KE_KEY, 0x01, {KEY_WLAN} }, /* WiFi */ |
101 | {KE_KEY, 0x03, {KEY_WLAN} }, /* WiFi */ | 101 | {KE_KEY, 0x03, {KEY_WLAN} }, /* WiFi */ |
102 | {KE_KEY, 0x04, {KEY_WLAN} }, /* WiFi */ | ||
102 | {KE_KEY, 0x12, {KEY_BLUETOOTH} }, /* BT */ | 103 | {KE_KEY, 0x12, {KEY_BLUETOOTH} }, /* BT */ |
103 | {KE_KEY, 0x21, {KEY_PROG1} }, /* Backup */ | 104 | {KE_KEY, 0x21, {KEY_PROG1} }, /* Backup */ |
104 | {KE_KEY, 0x22, {KEY_PROG2} }, /* Arcade */ | 105 | {KE_KEY, 0x22, {KEY_PROG2} }, /* Arcade */ |
@@ -304,6 +305,10 @@ static struct quirk_entry quirk_fujitsu_amilo_li_1718 = { | |||
304 | .wireless = 2, | 305 | .wireless = 2, |
305 | }; | 306 | }; |
306 | 307 | ||
308 | static struct quirk_entry quirk_lenovo_ideapad_s205 = { | ||
309 | .wireless = 3, | ||
310 | }; | ||
311 | |||
307 | /* The Aspire One has a dummy ACPI-WMI interface - disable it */ | 312 | /* The Aspire One has a dummy ACPI-WMI interface - disable it */ |
308 | static struct dmi_system_id __devinitdata acer_blacklist[] = { | 313 | static struct dmi_system_id __devinitdata acer_blacklist[] = { |
309 | { | 314 | { |
@@ -450,6 +455,15 @@ static struct dmi_system_id acer_quirks[] = { | |||
450 | }, | 455 | }, |
451 | .driver_data = &quirk_medion_md_98300, | 456 | .driver_data = &quirk_medion_md_98300, |
452 | }, | 457 | }, |
458 | { | ||
459 | .callback = dmi_matched, | ||
460 | .ident = "Lenovo Ideapad S205", | ||
461 | .matches = { | ||
462 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
463 | DMI_MATCH(DMI_PRODUCT_NAME, "10382LG"), | ||
464 | }, | ||
465 | .driver_data = &quirk_lenovo_ideapad_s205, | ||
466 | }, | ||
453 | {} | 467 | {} |
454 | }; | 468 | }; |
455 | 469 | ||
@@ -542,6 +556,12 @@ struct wmi_interface *iface) | |||
542 | return AE_ERROR; | 556 | return AE_ERROR; |
543 | *value = result & 0x1; | 557 | *value = result & 0x1; |
544 | return AE_OK; | 558 | return AE_OK; |
559 | case 3: | ||
560 | err = ec_read(0x78, &result); | ||
561 | if (err) | ||
562 | return AE_ERROR; | ||
563 | *value = result & 0x1; | ||
564 | return AE_OK; | ||
545 | default: | 565 | default: |
546 | err = ec_read(0xA, &result); | 566 | err = ec_read(0xA, &result); |
547 | if (err) | 567 | if (err) |
@@ -1266,8 +1286,13 @@ static void acer_rfkill_update(struct work_struct *ignored) | |||
1266 | acpi_status status; | 1286 | acpi_status status; |
1267 | 1287 | ||
1268 | status = get_u32(&state, ACER_CAP_WIRELESS); | 1288 | status = get_u32(&state, ACER_CAP_WIRELESS); |
1269 | if (ACPI_SUCCESS(status)) | 1289 | if (ACPI_SUCCESS(status)) { |
1270 | rfkill_set_sw_state(wireless_rfkill, !state); | 1290 | if (quirks->wireless == 3) { |
1291 | rfkill_set_hw_state(wireless_rfkill, !state); | ||
1292 | } else { | ||
1293 | rfkill_set_sw_state(wireless_rfkill, !state); | ||
1294 | } | ||
1295 | } | ||
1271 | 1296 | ||
1272 | if (has_cap(ACER_CAP_BLUETOOTH)) { | 1297 | if (has_cap(ACER_CAP_BLUETOOTH)) { |
1273 | status = get_u32(&state, ACER_CAP_BLUETOOTH); | 1298 | status = get_u32(&state, ACER_CAP_BLUETOOTH); |
@@ -1400,6 +1425,9 @@ static ssize_t show_bool_threeg(struct device *dev, | |||
1400 | { | 1425 | { |
1401 | u32 result; \ | 1426 | u32 result; \ |
1402 | acpi_status status; | 1427 | acpi_status status; |
1428 | |||
1429 | pr_info("This threeg sysfs will be removed in 2012" | ||
1430 | " - used by: %s\n", current->comm); | ||
1403 | if (wmi_has_guid(WMID_GUID3)) | 1431 | if (wmi_has_guid(WMID_GUID3)) |
1404 | status = wmid3_get_device_status(&result, | 1432 | status = wmid3_get_device_status(&result, |
1405 | ACER_WMID3_GDS_THREEG); | 1433 | ACER_WMID3_GDS_THREEG); |
@@ -1415,8 +1443,10 @@ static ssize_t set_bool_threeg(struct device *dev, | |||
1415 | { | 1443 | { |
1416 | u32 tmp = simple_strtoul(buf, NULL, 10); | 1444 | u32 tmp = simple_strtoul(buf, NULL, 10); |
1417 | acpi_status status = set_u32(tmp, ACER_CAP_THREEG); | 1445 | acpi_status status = set_u32(tmp, ACER_CAP_THREEG); |
1418 | if (ACPI_FAILURE(status)) | 1446 | pr_info("This threeg sysfs will be removed in 2012" |
1419 | return -EINVAL; | 1447 | " - used by: %s\n", current->comm); |
1448 | if (ACPI_FAILURE(status)) | ||
1449 | return -EINVAL; | ||
1420 | return count; | 1450 | return count; |
1421 | } | 1451 | } |
1422 | static DEVICE_ATTR(threeg, S_IRUGO | S_IWUSR, show_bool_threeg, | 1452 | static DEVICE_ATTR(threeg, S_IRUGO | S_IWUSR, show_bool_threeg, |
@@ -1425,6 +1455,8 @@ static DEVICE_ATTR(threeg, S_IRUGO | S_IWUSR, show_bool_threeg, | |||
1425 | static ssize_t show_interface(struct device *dev, struct device_attribute *attr, | 1455 | static ssize_t show_interface(struct device *dev, struct device_attribute *attr, |
1426 | char *buf) | 1456 | char *buf) |
1427 | { | 1457 | { |
1458 | pr_info("This interface sysfs will be removed in 2012" | ||
1459 | " - used by: %s\n", current->comm); | ||
1428 | switch (interface->type) { | 1460 | switch (interface->type) { |
1429 | case ACER_AMW0: | 1461 | case ACER_AMW0: |
1430 | return sprintf(buf, "AMW0\n"); | 1462 | return sprintf(buf, "AMW0\n"); |
diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c index fca3489218b7..760c6d7624fe 100644 --- a/drivers/platform/x86/acerhdf.c +++ b/drivers/platform/x86/acerhdf.c | |||
@@ -182,6 +182,7 @@ static const struct bios_settings_t bios_tbl[] = { | |||
182 | {"Acer", "Aspire 1810T", "v1.3308", 0x55, 0x58, {0x9e, 0x00} }, | 182 | {"Acer", "Aspire 1810T", "v1.3308", 0x55, 0x58, {0x9e, 0x00} }, |
183 | {"Acer", "Aspire 1810TZ", "v1.3310", 0x55, 0x58, {0x9e, 0x00} }, | 183 | {"Acer", "Aspire 1810TZ", "v1.3310", 0x55, 0x58, {0x9e, 0x00} }, |
184 | {"Acer", "Aspire 1810T", "v1.3310", 0x55, 0x58, {0x9e, 0x00} }, | 184 | {"Acer", "Aspire 1810T", "v1.3310", 0x55, 0x58, {0x9e, 0x00} }, |
185 | {"Acer", "Aspire 1810TZ", "v1.3314", 0x55, 0x58, {0x9e, 0x00} }, | ||
185 | /* Acer 531 */ | 186 | /* Acer 531 */ |
186 | {"Acer", "AO531h", "v0.3201", 0x55, 0x58, {0x20, 0x00} }, | 187 | {"Acer", "AO531h", "v0.3201", 0x55, 0x58, {0x20, 0x00} }, |
187 | /* Gateway */ | 188 | /* Gateway */ |
@@ -703,15 +704,15 @@ MODULE_LICENSE("GPL"); | |||
703 | MODULE_AUTHOR("Peter Feuerer"); | 704 | MODULE_AUTHOR("Peter Feuerer"); |
704 | MODULE_DESCRIPTION("Aspire One temperature and fan driver"); | 705 | MODULE_DESCRIPTION("Aspire One temperature and fan driver"); |
705 | MODULE_ALIAS("dmi:*:*Acer*:pnAOA*:"); | 706 | MODULE_ALIAS("dmi:*:*Acer*:pnAOA*:"); |
706 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire 1410*:"); | 707 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1410*:"); |
707 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire 1810*:"); | 708 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1810*:"); |
708 | MODULE_ALIAS("dmi:*:*Acer*:pnAO531*:"); | 709 | MODULE_ALIAS("dmi:*:*Acer*:pnAO531*:"); |
709 | MODULE_ALIAS("dmi:*:*Gateway*:pnAOA*:"); | 710 | MODULE_ALIAS("dmi:*:*Gateway*:pnAOA*:"); |
710 | MODULE_ALIAS("dmi:*:*Gateway*:pnLT31*:"); | 711 | MODULE_ALIAS("dmi:*:*Gateway*:pnLT31*:"); |
711 | MODULE_ALIAS("dmi:*:*Packard Bell*:pnAOA*:"); | 712 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnAOA*:"); |
712 | MODULE_ALIAS("dmi:*:*Packard Bell*:pnDOA*:"); | 713 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOA*:"); |
713 | MODULE_ALIAS("dmi:*:*Packard Bell*:pnDOTMU*:"); | 714 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTMU*:"); |
714 | MODULE_ALIAS("dmi:*:*Packard Bell*:pnDOTMA*:"); | 715 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTMA*:"); |
715 | 716 | ||
716 | module_init(acerhdf_init); | 717 | module_init(acerhdf_init); |
717 | module_exit(acerhdf_exit); | 718 | module_exit(acerhdf_exit); |
diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c index d65df92e2acc..fa6d7ec68b26 100644 --- a/drivers/platform/x86/asus-laptop.c +++ b/drivers/platform/x86/asus-laptop.c | |||
@@ -70,11 +70,10 @@ MODULE_LICENSE("GPL"); | |||
70 | * WAPF defines the behavior of the Fn+Fx wlan key | 70 | * WAPF defines the behavior of the Fn+Fx wlan key |
71 | * The significance of values is yet to be found, but | 71 | * The significance of values is yet to be found, but |
72 | * most of the time: | 72 | * most of the time: |
73 | * 0x0 will do nothing | 73 | * Bit | Bluetooth | WLAN |
74 | * 0x1 will allow to control the device with Fn+Fx key. | 74 | * 0 | Hardware | Hardware |
75 | * 0x4 will send an ACPI event (0x88) while pressing the Fn+Fx key | 75 | * 1 | Hardware | Software |
76 | * 0x5 like 0x1 or 0x4 | 76 | * 4 | Software | Software |
77 | * So, if something doesn't work as you want, just try other values =) | ||
78 | */ | 77 | */ |
79 | static uint wapf = 1; | 78 | static uint wapf = 1; |
80 | module_param(wapf, uint, 0444); | 79 | module_param(wapf, uint, 0444); |
diff --git a/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c index 0580d99b0798..b0859d4183e8 100644 --- a/drivers/platform/x86/asus-nb-wmi.c +++ b/drivers/platform/x86/asus-nb-wmi.c | |||
@@ -38,6 +38,24 @@ MODULE_LICENSE("GPL"); | |||
38 | 38 | ||
39 | MODULE_ALIAS("wmi:"ASUS_NB_WMI_EVENT_GUID); | 39 | MODULE_ALIAS("wmi:"ASUS_NB_WMI_EVENT_GUID); |
40 | 40 | ||
41 | /* | ||
42 | * WAPF defines the behavior of the Fn+Fx wlan key | ||
43 | * The significance of values is yet to be found, but | ||
44 | * most of the time: | ||
45 | * Bit | Bluetooth | WLAN | ||
46 | * 0 | Hardware | Hardware | ||
47 | * 1 | Hardware | Software | ||
48 | * 4 | Software | Software | ||
49 | */ | ||
50 | static uint wapf; | ||
51 | module_param(wapf, uint, 0444); | ||
52 | MODULE_PARM_DESC(wapf, "WAPF value"); | ||
53 | |||
54 | static void asus_nb_wmi_quirks(struct asus_wmi_driver *driver) | ||
55 | { | ||
56 | driver->wapf = wapf; | ||
57 | } | ||
58 | |||
41 | static const struct key_entry asus_nb_wmi_keymap[] = { | 59 | static const struct key_entry asus_nb_wmi_keymap[] = { |
42 | { KE_KEY, 0x30, { KEY_VOLUMEUP } }, | 60 | { KE_KEY, 0x30, { KEY_VOLUMEUP } }, |
43 | { KE_KEY, 0x31, { KEY_VOLUMEDOWN } }, | 61 | { KE_KEY, 0x31, { KEY_VOLUMEDOWN } }, |
@@ -53,16 +71,16 @@ static const struct key_entry asus_nb_wmi_keymap[] = { | |||
53 | { KE_KEY, 0x51, { KEY_WWW } }, | 71 | { KE_KEY, 0x51, { KEY_WWW } }, |
54 | { KE_KEY, 0x55, { KEY_CALC } }, | 72 | { KE_KEY, 0x55, { KEY_CALC } }, |
55 | { KE_KEY, 0x5C, { KEY_F15 } }, /* Power Gear key */ | 73 | { KE_KEY, 0x5C, { KEY_F15 } }, /* Power Gear key */ |
56 | { KE_KEY, 0x5D, { KEY_WLAN } }, | 74 | { KE_KEY, 0x5D, { KEY_WLAN } }, /* Wireless console Toggle */ |
57 | { KE_KEY, 0x5E, { KEY_WLAN } }, | 75 | { KE_KEY, 0x5E, { KEY_WLAN } }, /* Wireless console Enable */ |
58 | { KE_KEY, 0x5F, { KEY_WLAN } }, | 76 | { KE_KEY, 0x5F, { KEY_WLAN } }, /* Wireless console Disable */ |
59 | { KE_KEY, 0x60, { KEY_SWITCHVIDEOMODE } }, | 77 | { KE_KEY, 0x60, { KEY_SWITCHVIDEOMODE } }, |
60 | { KE_KEY, 0x61, { KEY_SWITCHVIDEOMODE } }, | 78 | { KE_KEY, 0x61, { KEY_SWITCHVIDEOMODE } }, |
61 | { KE_KEY, 0x62, { KEY_SWITCHVIDEOMODE } }, | 79 | { KE_KEY, 0x62, { KEY_SWITCHVIDEOMODE } }, |
62 | { KE_KEY, 0x63, { KEY_SWITCHVIDEOMODE } }, | 80 | { KE_KEY, 0x63, { KEY_SWITCHVIDEOMODE } }, |
63 | { KE_KEY, 0x6B, { KEY_TOUCHPAD_TOGGLE } }, | 81 | { KE_KEY, 0x6B, { KEY_TOUCHPAD_TOGGLE } }, |
64 | { KE_KEY, 0x7E, { KEY_BLUETOOTH } }, | ||
65 | { KE_KEY, 0x7D, { KEY_BLUETOOTH } }, | 82 | { KE_KEY, 0x7D, { KEY_BLUETOOTH } }, |
83 | { KE_KEY, 0x7E, { KEY_BLUETOOTH } }, | ||
66 | { KE_KEY, 0x82, { KEY_CAMERA } }, | 84 | { KE_KEY, 0x82, { KEY_CAMERA } }, |
67 | { KE_KEY, 0x88, { KEY_RFKILL } }, | 85 | { KE_KEY, 0x88, { KEY_RFKILL } }, |
68 | { KE_KEY, 0x8A, { KEY_PROG1 } }, | 86 | { KE_KEY, 0x8A, { KEY_PROG1 } }, |
@@ -81,6 +99,7 @@ static struct asus_wmi_driver asus_nb_wmi_driver = { | |||
81 | .keymap = asus_nb_wmi_keymap, | 99 | .keymap = asus_nb_wmi_keymap, |
82 | .input_name = "Asus WMI hotkeys", | 100 | .input_name = "Asus WMI hotkeys", |
83 | .input_phys = ASUS_NB_WMI_FILE "/input0", | 101 | .input_phys = ASUS_NB_WMI_FILE "/input0", |
102 | .quirks = asus_nb_wmi_quirks, | ||
84 | }; | 103 | }; |
85 | 104 | ||
86 | 105 | ||
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index 65b66aa44c78..95cba9ebf6c0 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <linux/debugfs.h> | 44 | #include <linux/debugfs.h> |
45 | #include <linux/seq_file.h> | 45 | #include <linux/seq_file.h> |
46 | #include <linux/platform_device.h> | 46 | #include <linux/platform_device.h> |
47 | #include <linux/thermal.h> | ||
47 | #include <acpi/acpi_bus.h> | 48 | #include <acpi/acpi_bus.h> |
48 | #include <acpi/acpi_drivers.h> | 49 | #include <acpi/acpi_drivers.h> |
49 | 50 | ||
@@ -66,6 +67,8 @@ MODULE_LICENSE("GPL"); | |||
66 | #define NOTIFY_BRNUP_MAX 0x1f | 67 | #define NOTIFY_BRNUP_MAX 0x1f |
67 | #define NOTIFY_BRNDOWN_MIN 0x20 | 68 | #define NOTIFY_BRNDOWN_MIN 0x20 |
68 | #define NOTIFY_BRNDOWN_MAX 0x2e | 69 | #define NOTIFY_BRNDOWN_MAX 0x2e |
70 | #define NOTIFY_KBD_BRTUP 0xc4 | ||
71 | #define NOTIFY_KBD_BRTDWN 0xc5 | ||
69 | 72 | ||
70 | /* WMI Methods */ | 73 | /* WMI Methods */ |
71 | #define ASUS_WMI_METHODID_SPEC 0x43455053 /* BIOS SPECification */ | 74 | #define ASUS_WMI_METHODID_SPEC 0x43455053 /* BIOS SPECification */ |
@@ -93,6 +96,7 @@ MODULE_LICENSE("GPL"); | |||
93 | /* Wireless */ | 96 | /* Wireless */ |
94 | #define ASUS_WMI_DEVID_HW_SWITCH 0x00010001 | 97 | #define ASUS_WMI_DEVID_HW_SWITCH 0x00010001 |
95 | #define ASUS_WMI_DEVID_WIRELESS_LED 0x00010002 | 98 | #define ASUS_WMI_DEVID_WIRELESS_LED 0x00010002 |
99 | #define ASUS_WMI_DEVID_CWAP 0x00010003 | ||
96 | #define ASUS_WMI_DEVID_WLAN 0x00010011 | 100 | #define ASUS_WMI_DEVID_WLAN 0x00010011 |
97 | #define ASUS_WMI_DEVID_BLUETOOTH 0x00010013 | 101 | #define ASUS_WMI_DEVID_BLUETOOTH 0x00010013 |
98 | #define ASUS_WMI_DEVID_GPS 0x00010015 | 102 | #define ASUS_WMI_DEVID_GPS 0x00010015 |
@@ -102,6 +106,12 @@ MODULE_LICENSE("GPL"); | |||
102 | 106 | ||
103 | /* Leds */ | 107 | /* Leds */ |
104 | /* 0x000200XX and 0x000400XX */ | 108 | /* 0x000200XX and 0x000400XX */ |
109 | #define ASUS_WMI_DEVID_LED1 0x00020011 | ||
110 | #define ASUS_WMI_DEVID_LED2 0x00020012 | ||
111 | #define ASUS_WMI_DEVID_LED3 0x00020013 | ||
112 | #define ASUS_WMI_DEVID_LED4 0x00020014 | ||
113 | #define ASUS_WMI_DEVID_LED5 0x00020015 | ||
114 | #define ASUS_WMI_DEVID_LED6 0x00020016 | ||
105 | 115 | ||
106 | /* Backlight and Brightness */ | 116 | /* Backlight and Brightness */ |
107 | #define ASUS_WMI_DEVID_BACKLIGHT 0x00050011 | 117 | #define ASUS_WMI_DEVID_BACKLIGHT 0x00050011 |
@@ -174,13 +184,18 @@ struct asus_wmi { | |||
174 | 184 | ||
175 | struct led_classdev tpd_led; | 185 | struct led_classdev tpd_led; |
176 | int tpd_led_wk; | 186 | int tpd_led_wk; |
187 | struct led_classdev kbd_led; | ||
188 | int kbd_led_wk; | ||
177 | struct workqueue_struct *led_workqueue; | 189 | struct workqueue_struct *led_workqueue; |
178 | struct work_struct tpd_led_work; | 190 | struct work_struct tpd_led_work; |
191 | struct work_struct kbd_led_work; | ||
179 | 192 | ||
180 | struct asus_rfkill wlan; | 193 | struct asus_rfkill wlan; |
181 | struct asus_rfkill bluetooth; | 194 | struct asus_rfkill bluetooth; |
182 | struct asus_rfkill wimax; | 195 | struct asus_rfkill wimax; |
183 | struct asus_rfkill wwan3g; | 196 | struct asus_rfkill wwan3g; |
197 | struct asus_rfkill gps; | ||
198 | struct asus_rfkill uwb; | ||
184 | 199 | ||
185 | struct hotplug_slot *hotplug_slot; | 200 | struct hotplug_slot *hotplug_slot; |
186 | struct mutex hotplug_lock; | 201 | struct mutex hotplug_lock; |
@@ -205,6 +220,7 @@ static int asus_wmi_input_init(struct asus_wmi *asus) | |||
205 | asus->inputdev->phys = asus->driver->input_phys; | 220 | asus->inputdev->phys = asus->driver->input_phys; |
206 | asus->inputdev->id.bustype = BUS_HOST; | 221 | asus->inputdev->id.bustype = BUS_HOST; |
207 | asus->inputdev->dev.parent = &asus->platform_device->dev; | 222 | asus->inputdev->dev.parent = &asus->platform_device->dev; |
223 | set_bit(EV_REP, asus->inputdev->evbit); | ||
208 | 224 | ||
209 | err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL); | 225 | err = sparse_keymap_setup(asus->inputdev, asus->driver->keymap, NULL); |
210 | if (err) | 226 | if (err) |
@@ -359,30 +375,80 @@ static enum led_brightness tpd_led_get(struct led_classdev *led_cdev) | |||
359 | return read_tpd_led_state(asus); | 375 | return read_tpd_led_state(asus); |
360 | } | 376 | } |
361 | 377 | ||
362 | static int asus_wmi_led_init(struct asus_wmi *asus) | 378 | static void kbd_led_update(struct work_struct *work) |
363 | { | 379 | { |
364 | int rv; | 380 | int ctrl_param = 0; |
381 | struct asus_wmi *asus; | ||
365 | 382 | ||
366 | if (read_tpd_led_state(asus) < 0) | 383 | asus = container_of(work, struct asus_wmi, kbd_led_work); |
367 | return 0; | ||
368 | 384 | ||
369 | asus->led_workqueue = create_singlethread_workqueue("led_workqueue"); | 385 | /* |
370 | if (!asus->led_workqueue) | 386 | * bits 0-2: level |
371 | return -ENOMEM; | 387 | * bit 7: light on/off |
372 | INIT_WORK(&asus->tpd_led_work, tpd_led_update); | 388 | */ |
389 | if (asus->kbd_led_wk > 0) | ||
390 | ctrl_param = 0x80 | (asus->kbd_led_wk & 0x7F); | ||
373 | 391 | ||
374 | asus->tpd_led.name = "asus::touchpad"; | 392 | asus_wmi_set_devstate(ASUS_WMI_DEVID_KBD_BACKLIGHT, ctrl_param, NULL); |
375 | asus->tpd_led.brightness_set = tpd_led_set; | 393 | } |
376 | asus->tpd_led.brightness_get = tpd_led_get; | ||
377 | asus->tpd_led.max_brightness = 1; | ||
378 | 394 | ||
379 | rv = led_classdev_register(&asus->platform_device->dev, &asus->tpd_led); | 395 | static int kbd_led_read(struct asus_wmi *asus, int *level, int *env) |
380 | if (rv) { | 396 | { |
381 | destroy_workqueue(asus->led_workqueue); | 397 | int retval; |
382 | return rv; | 398 | |
399 | /* | ||
400 | * bits 0-2: level | ||
401 | * bit 7: light on/off | ||
402 | * bit 8-10: environment (0: dark, 1: normal, 2: light) | ||
403 | * bit 17: status unknown | ||
404 | */ | ||
405 | retval = asus_wmi_get_devstate_bits(asus, ASUS_WMI_DEVID_KBD_BACKLIGHT, | ||
406 | 0xFFFF); | ||
407 | |||
408 | /* Unknown status is considered as off */ | ||
409 | if (retval == 0x8000) | ||
410 | retval = 0; | ||
411 | |||
412 | if (retval >= 0) { | ||
413 | if (level) | ||
414 | *level = retval & 0x80 ? retval & 0x7F : 0; | ||
415 | if (env) | ||
416 | *env = (retval >> 8) & 0x7F; | ||
417 | retval = 0; | ||
383 | } | 418 | } |
384 | 419 | ||
385 | return 0; | 420 | return retval; |
421 | } | ||
422 | |||
423 | static void kbd_led_set(struct led_classdev *led_cdev, | ||
424 | enum led_brightness value) | ||
425 | { | ||
426 | struct asus_wmi *asus; | ||
427 | |||
428 | asus = container_of(led_cdev, struct asus_wmi, kbd_led); | ||
429 | |||
430 | if (value > asus->kbd_led.max_brightness) | ||
431 | value = asus->kbd_led.max_brightness; | ||
432 | else if (value < 0) | ||
433 | value = 0; | ||
434 | |||
435 | asus->kbd_led_wk = value; | ||
436 | queue_work(asus->led_workqueue, &asus->kbd_led_work); | ||
437 | } | ||
438 | |||
439 | static enum led_brightness kbd_led_get(struct led_classdev *led_cdev) | ||
440 | { | ||
441 | struct asus_wmi *asus; | ||
442 | int retval, value; | ||
443 | |||
444 | asus = container_of(led_cdev, struct asus_wmi, kbd_led); | ||
445 | |||
446 | retval = kbd_led_read(asus, &value, NULL); | ||
447 | |||
448 | if (retval < 0) | ||
449 | return retval; | ||
450 | |||
451 | return value; | ||
386 | } | 452 | } |
387 | 453 | ||
388 | static void asus_wmi_led_exit(struct asus_wmi *asus) | 454 | static void asus_wmi_led_exit(struct asus_wmi *asus) |
@@ -393,6 +459,48 @@ static void asus_wmi_led_exit(struct asus_wmi *asus) | |||
393 | destroy_workqueue(asus->led_workqueue); | 459 | destroy_workqueue(asus->led_workqueue); |
394 | } | 460 | } |
395 | 461 | ||
462 | static int asus_wmi_led_init(struct asus_wmi *asus) | ||
463 | { | ||
464 | int rv = 0; | ||
465 | |||
466 | asus->led_workqueue = create_singlethread_workqueue("led_workqueue"); | ||
467 | if (!asus->led_workqueue) | ||
468 | return -ENOMEM; | ||
469 | |||
470 | if (read_tpd_led_state(asus) >= 0) { | ||
471 | INIT_WORK(&asus->tpd_led_work, tpd_led_update); | ||
472 | |||
473 | asus->tpd_led.name = "asus::touchpad"; | ||
474 | asus->tpd_led.brightness_set = tpd_led_set; | ||
475 | asus->tpd_led.brightness_get = tpd_led_get; | ||
476 | asus->tpd_led.max_brightness = 1; | ||
477 | |||
478 | rv = led_classdev_register(&asus->platform_device->dev, | ||
479 | &asus->tpd_led); | ||
480 | if (rv) | ||
481 | goto error; | ||
482 | } | ||
483 | |||
484 | if (kbd_led_read(asus, NULL, NULL) >= 0) { | ||
485 | INIT_WORK(&asus->kbd_led_work, kbd_led_update); | ||
486 | |||
487 | asus->kbd_led.name = "asus::kbd_backlight"; | ||
488 | asus->kbd_led.brightness_set = kbd_led_set; | ||
489 | asus->kbd_led.brightness_get = kbd_led_get; | ||
490 | asus->kbd_led.max_brightness = 3; | ||
491 | |||
492 | rv = led_classdev_register(&asus->platform_device->dev, | ||
493 | &asus->kbd_led); | ||
494 | } | ||
495 | |||
496 | error: | ||
497 | if (rv) | ||
498 | asus_wmi_led_exit(asus); | ||
499 | |||
500 | return rv; | ||
501 | } | ||
502 | |||
503 | |||
396 | /* | 504 | /* |
397 | * PCI hotplug (for wlan rfkill) | 505 | * PCI hotplug (for wlan rfkill) |
398 | */ | 506 | */ |
@@ -729,6 +837,16 @@ static void asus_wmi_rfkill_exit(struct asus_wmi *asus) | |||
729 | rfkill_destroy(asus->wwan3g.rfkill); | 837 | rfkill_destroy(asus->wwan3g.rfkill); |
730 | asus->wwan3g.rfkill = NULL; | 838 | asus->wwan3g.rfkill = NULL; |
731 | } | 839 | } |
840 | if (asus->gps.rfkill) { | ||
841 | rfkill_unregister(asus->gps.rfkill); | ||
842 | rfkill_destroy(asus->gps.rfkill); | ||
843 | asus->gps.rfkill = NULL; | ||
844 | } | ||
845 | if (asus->uwb.rfkill) { | ||
846 | rfkill_unregister(asus->uwb.rfkill); | ||
847 | rfkill_destroy(asus->uwb.rfkill); | ||
848 | asus->uwb.rfkill = NULL; | ||
849 | } | ||
732 | } | 850 | } |
733 | 851 | ||
734 | static int asus_wmi_rfkill_init(struct asus_wmi *asus) | 852 | static int asus_wmi_rfkill_init(struct asus_wmi *asus) |
@@ -763,6 +881,18 @@ static int asus_wmi_rfkill_init(struct asus_wmi *asus) | |||
763 | if (result && result != -ENODEV) | 881 | if (result && result != -ENODEV) |
764 | goto exit; | 882 | goto exit; |
765 | 883 | ||
884 | result = asus_new_rfkill(asus, &asus->gps, "asus-gps", | ||
885 | RFKILL_TYPE_GPS, ASUS_WMI_DEVID_GPS); | ||
886 | |||
887 | if (result && result != -ENODEV) | ||
888 | goto exit; | ||
889 | |||
890 | result = asus_new_rfkill(asus, &asus->uwb, "asus-uwb", | ||
891 | RFKILL_TYPE_UWB, ASUS_WMI_DEVID_UWB); | ||
892 | |||
893 | if (result && result != -ENODEV) | ||
894 | goto exit; | ||
895 | |||
766 | if (!asus->driver->hotplug_wireless) | 896 | if (!asus->driver->hotplug_wireless) |
767 | goto exit; | 897 | goto exit; |
768 | 898 | ||
@@ -797,8 +927,8 @@ exit: | |||
797 | * Hwmon device | 927 | * Hwmon device |
798 | */ | 928 | */ |
799 | static ssize_t asus_hwmon_pwm1(struct device *dev, | 929 | static ssize_t asus_hwmon_pwm1(struct device *dev, |
800 | struct device_attribute *attr, | 930 | struct device_attribute *attr, |
801 | char *buf) | 931 | char *buf) |
802 | { | 932 | { |
803 | struct asus_wmi *asus = dev_get_drvdata(dev); | 933 | struct asus_wmi *asus = dev_get_drvdata(dev); |
804 | u32 value; | 934 | u32 value; |
@@ -809,7 +939,7 @@ static ssize_t asus_hwmon_pwm1(struct device *dev, | |||
809 | if (err < 0) | 939 | if (err < 0) |
810 | return err; | 940 | return err; |
811 | 941 | ||
812 | value |= 0xFF; | 942 | value &= 0xFF; |
813 | 943 | ||
814 | if (value == 1) /* Low Speed */ | 944 | if (value == 1) /* Low Speed */ |
815 | value = 85; | 945 | value = 85; |
@@ -825,7 +955,26 @@ static ssize_t asus_hwmon_pwm1(struct device *dev, | |||
825 | return sprintf(buf, "%d\n", value); | 955 | return sprintf(buf, "%d\n", value); |
826 | } | 956 | } |
827 | 957 | ||
958 | static ssize_t asus_hwmon_temp1(struct device *dev, | ||
959 | struct device_attribute *attr, | ||
960 | char *buf) | ||
961 | { | ||
962 | struct asus_wmi *asus = dev_get_drvdata(dev); | ||
963 | u32 value; | ||
964 | int err; | ||
965 | |||
966 | err = asus_wmi_get_devstate(asus, ASUS_WMI_DEVID_THERMAL_CTRL, &value); | ||
967 | |||
968 | if (err < 0) | ||
969 | return err; | ||
970 | |||
971 | value = KELVIN_TO_CELSIUS((value & 0xFFFF)) * 1000; | ||
972 | |||
973 | return sprintf(buf, "%d\n", value); | ||
974 | } | ||
975 | |||
828 | static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO, asus_hwmon_pwm1, NULL, 0); | 976 | static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO, asus_hwmon_pwm1, NULL, 0); |
977 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, asus_hwmon_temp1, NULL, 0); | ||
829 | 978 | ||
830 | static ssize_t | 979 | static ssize_t |
831 | show_name(struct device *dev, struct device_attribute *attr, char *buf) | 980 | show_name(struct device *dev, struct device_attribute *attr, char *buf) |
@@ -836,12 +985,13 @@ static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, 0); | |||
836 | 985 | ||
837 | static struct attribute *hwmon_attributes[] = { | 986 | static struct attribute *hwmon_attributes[] = { |
838 | &sensor_dev_attr_pwm1.dev_attr.attr, | 987 | &sensor_dev_attr_pwm1.dev_attr.attr, |
988 | &sensor_dev_attr_temp1_input.dev_attr.attr, | ||
839 | &sensor_dev_attr_name.dev_attr.attr, | 989 | &sensor_dev_attr_name.dev_attr.attr, |
840 | NULL | 990 | NULL |
841 | }; | 991 | }; |
842 | 992 | ||
843 | static mode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj, | 993 | static mode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj, |
844 | struct attribute *attr, int idx) | 994 | struct attribute *attr, int idx) |
845 | { | 995 | { |
846 | struct device *dev = container_of(kobj, struct device, kobj); | 996 | struct device *dev = container_of(kobj, struct device, kobj); |
847 | struct platform_device *pdev = to_platform_device(dev->parent); | 997 | struct platform_device *pdev = to_platform_device(dev->parent); |
@@ -852,6 +1002,8 @@ static mode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj, | |||
852 | 1002 | ||
853 | if (attr == &sensor_dev_attr_pwm1.dev_attr.attr) | 1003 | if (attr == &sensor_dev_attr_pwm1.dev_attr.attr) |
854 | dev_id = ASUS_WMI_DEVID_FAN_CTRL; | 1004 | dev_id = ASUS_WMI_DEVID_FAN_CTRL; |
1005 | else if (attr == &sensor_dev_attr_temp1_input.dev_attr.attr) | ||
1006 | dev_id = ASUS_WMI_DEVID_THERMAL_CTRL; | ||
855 | 1007 | ||
856 | if (dev_id != -1) { | 1008 | if (dev_id != -1) { |
857 | int err = asus_wmi_get_devstate(asus, dev_id, &value); | 1009 | int err = asus_wmi_get_devstate(asus, dev_id, &value); |
@@ -869,9 +1021,13 @@ static mode_t asus_hwmon_sysfs_is_visible(struct kobject *kobj, | |||
869 | * - reverved bits are non-zero | 1021 | * - reverved bits are non-zero |
870 | * - sfun and presence bit are not set | 1022 | * - sfun and presence bit are not set |
871 | */ | 1023 | */ |
872 | if (value != ASUS_WMI_UNSUPPORTED_METHOD || value & 0xFFF80000 | 1024 | if (value == ASUS_WMI_UNSUPPORTED_METHOD || value & 0xFFF80000 |
873 | || (!asus->sfun && !(value & ASUS_WMI_DSTS_PRESENCE_BIT))) | 1025 | || (!asus->sfun && !(value & ASUS_WMI_DSTS_PRESENCE_BIT))) |
874 | ok = false; | 1026 | ok = false; |
1027 | } else if (dev_id == ASUS_WMI_DEVID_THERMAL_CTRL) { | ||
1028 | /* If value is zero, something is clearly wrong */ | ||
1029 | if (value == 0) | ||
1030 | ok = false; | ||
875 | } | 1031 | } |
876 | 1032 | ||
877 | return ok ? attr->mode : 0; | 1033 | return ok ? attr->mode : 0; |
@@ -904,6 +1060,7 @@ static int asus_wmi_hwmon_init(struct asus_wmi *asus) | |||
904 | pr_err("Could not register asus hwmon device\n"); | 1060 | pr_err("Could not register asus hwmon device\n"); |
905 | return PTR_ERR(hwmon); | 1061 | return PTR_ERR(hwmon); |
906 | } | 1062 | } |
1063 | dev_set_drvdata(hwmon, asus); | ||
907 | asus->hwmon_device = hwmon; | 1064 | asus->hwmon_device = hwmon; |
908 | result = sysfs_create_group(&hwmon->kobj, &hwmon_attribute_group); | 1065 | result = sysfs_create_group(&hwmon->kobj, &hwmon_attribute_group); |
909 | if (result) | 1066 | if (result) |
@@ -1060,6 +1217,8 @@ static void asus_wmi_notify(u32 value, void *context) | |||
1060 | acpi_status status; | 1217 | acpi_status status; |
1061 | int code; | 1218 | int code; |
1062 | int orig_code; | 1219 | int orig_code; |
1220 | unsigned int key_value = 1; | ||
1221 | bool autorelease = 1; | ||
1063 | 1222 | ||
1064 | status = wmi_get_event_data(value, &response); | 1223 | status = wmi_get_event_data(value, &response); |
1065 | if (status != AE_OK) { | 1224 | if (status != AE_OK) { |
@@ -1075,6 +1234,13 @@ static void asus_wmi_notify(u32 value, void *context) | |||
1075 | code = obj->integer.value; | 1234 | code = obj->integer.value; |
1076 | orig_code = code; | 1235 | orig_code = code; |
1077 | 1236 | ||
1237 | if (asus->driver->key_filter) { | ||
1238 | asus->driver->key_filter(asus->driver, &code, &key_value, | ||
1239 | &autorelease); | ||
1240 | if (code == ASUS_WMI_KEY_IGNORE) | ||
1241 | goto exit; | ||
1242 | } | ||
1243 | |||
1078 | if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX) | 1244 | if (code >= NOTIFY_BRNUP_MIN && code <= NOTIFY_BRNUP_MAX) |
1079 | code = NOTIFY_BRNUP_MIN; | 1245 | code = NOTIFY_BRNUP_MIN; |
1080 | else if (code >= NOTIFY_BRNDOWN_MIN && | 1246 | else if (code >= NOTIFY_BRNDOWN_MIN && |
@@ -1084,7 +1250,8 @@ static void asus_wmi_notify(u32 value, void *context) | |||
1084 | if (code == NOTIFY_BRNUP_MIN || code == NOTIFY_BRNDOWN_MIN) { | 1250 | if (code == NOTIFY_BRNUP_MIN || code == NOTIFY_BRNDOWN_MIN) { |
1085 | if (!acpi_video_backlight_support()) | 1251 | if (!acpi_video_backlight_support()) |
1086 | asus_wmi_backlight_notify(asus, orig_code); | 1252 | asus_wmi_backlight_notify(asus, orig_code); |
1087 | } else if (!sparse_keymap_report_event(asus->inputdev, code, 1, true)) | 1253 | } else if (!sparse_keymap_report_event(asus->inputdev, code, |
1254 | key_value, autorelease)) | ||
1088 | pr_info("Unknown key %x pressed\n", code); | 1255 | pr_info("Unknown key %x pressed\n", code); |
1089 | 1256 | ||
1090 | exit: | 1257 | exit: |
@@ -1164,14 +1331,18 @@ ASUS_WMI_CREATE_DEVICE_ATTR(cardr, 0644, ASUS_WMI_DEVID_CARDREADER); | |||
1164 | static ssize_t store_cpufv(struct device *dev, struct device_attribute *attr, | 1331 | static ssize_t store_cpufv(struct device *dev, struct device_attribute *attr, |
1165 | const char *buf, size_t count) | 1332 | const char *buf, size_t count) |
1166 | { | 1333 | { |
1167 | int value; | 1334 | int value, rv; |
1168 | 1335 | ||
1169 | if (!count || sscanf(buf, "%i", &value) != 1) | 1336 | if (!count || sscanf(buf, "%i", &value) != 1) |
1170 | return -EINVAL; | 1337 | return -EINVAL; |
1171 | if (value < 0 || value > 2) | 1338 | if (value < 0 || value > 2) |
1172 | return -EINVAL; | 1339 | return -EINVAL; |
1173 | 1340 | ||
1174 | return asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL); | 1341 | rv = asus_wmi_evaluate_method(ASUS_WMI_METHODID_CFVS, value, 0, NULL); |
1342 | if (rv < 0) | ||
1343 | return rv; | ||
1344 | |||
1345 | return count; | ||
1175 | } | 1346 | } |
1176 | 1347 | ||
1177 | static DEVICE_ATTR(cpufv, S_IRUGO | S_IWUSR, NULL, store_cpufv); | 1348 | static DEVICE_ATTR(cpufv, S_IRUGO | S_IWUSR, NULL, store_cpufv); |
@@ -1234,7 +1405,7 @@ static int asus_wmi_platform_init(struct asus_wmi *asus) | |||
1234 | 1405 | ||
1235 | /* We don't know yet what to do with this version... */ | 1406 | /* We don't know yet what to do with this version... */ |
1236 | if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC, 0, 0x9, &rv)) { | 1407 | if (!asus_wmi_evaluate_method(ASUS_WMI_METHODID_SPEC, 0, 0x9, &rv)) { |
1237 | pr_info("BIOS WMI version: %d.%d", rv >> 8, rv & 0xFF); | 1408 | pr_info("BIOS WMI version: %d.%d", rv >> 16, rv & 0xFF); |
1238 | asus->spec = rv; | 1409 | asus->spec = rv; |
1239 | } | 1410 | } |
1240 | 1411 | ||
@@ -1266,6 +1437,12 @@ static int asus_wmi_platform_init(struct asus_wmi *asus) | |||
1266 | return -ENODEV; | 1437 | return -ENODEV; |
1267 | } | 1438 | } |
1268 | 1439 | ||
1440 | /* CWAP allow to define the behavior of the Fn+F2 key, | ||
1441 | * this method doesn't seems to be present on Eee PCs */ | ||
1442 | if (asus->driver->wapf >= 0) | ||
1443 | asus_wmi_set_devstate(ASUS_WMI_DEVID_CWAP, | ||
1444 | asus->driver->wapf, NULL); | ||
1445 | |||
1269 | return asus_wmi_sysfs_init(asus->platform_device); | 1446 | return asus_wmi_sysfs_init(asus->platform_device); |
1270 | } | 1447 | } |
1271 | 1448 | ||
@@ -1568,6 +1745,14 @@ static int asus_hotk_restore(struct device *device) | |||
1568 | bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WWAN3G); | 1745 | bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_WWAN3G); |
1569 | rfkill_set_sw_state(asus->wwan3g.rfkill, bl); | 1746 | rfkill_set_sw_state(asus->wwan3g.rfkill, bl); |
1570 | } | 1747 | } |
1748 | if (asus->gps.rfkill) { | ||
1749 | bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_GPS); | ||
1750 | rfkill_set_sw_state(asus->gps.rfkill, bl); | ||
1751 | } | ||
1752 | if (asus->uwb.rfkill) { | ||
1753 | bl = !asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_UWB); | ||
1754 | rfkill_set_sw_state(asus->uwb.rfkill, bl); | ||
1755 | } | ||
1571 | 1756 | ||
1572 | return 0; | 1757 | return 0; |
1573 | } | 1758 | } |
@@ -1604,7 +1789,7 @@ static int asus_wmi_probe(struct platform_device *pdev) | |||
1604 | 1789 | ||
1605 | static bool used; | 1790 | static bool used; |
1606 | 1791 | ||
1607 | int asus_wmi_register_driver(struct asus_wmi_driver *driver) | 1792 | int __init_or_module asus_wmi_register_driver(struct asus_wmi_driver *driver) |
1608 | { | 1793 | { |
1609 | struct platform_driver *platform_driver; | 1794 | struct platform_driver *platform_driver; |
1610 | struct platform_device *platform_device; | 1795 | struct platform_device *platform_device; |
diff --git a/drivers/platform/x86/asus-wmi.h b/drivers/platform/x86/asus-wmi.h index c044522c8766..8147c10161cc 100644 --- a/drivers/platform/x86/asus-wmi.h +++ b/drivers/platform/x86/asus-wmi.h | |||
@@ -29,12 +29,15 @@ | |||
29 | 29 | ||
30 | #include <linux/platform_device.h> | 30 | #include <linux/platform_device.h> |
31 | 31 | ||
32 | #define ASUS_WMI_KEY_IGNORE (-1) | ||
33 | |||
32 | struct module; | 34 | struct module; |
33 | struct key_entry; | 35 | struct key_entry; |
34 | struct asus_wmi; | 36 | struct asus_wmi; |
35 | 37 | ||
36 | struct asus_wmi_driver { | 38 | struct asus_wmi_driver { |
37 | bool hotplug_wireless; | 39 | bool hotplug_wireless; |
40 | int wapf; | ||
38 | 41 | ||
39 | const char *name; | 42 | const char *name; |
40 | struct module *owner; | 43 | struct module *owner; |
@@ -44,6 +47,10 @@ struct asus_wmi_driver { | |||
44 | const struct key_entry *keymap; | 47 | const struct key_entry *keymap; |
45 | const char *input_name; | 48 | const char *input_name; |
46 | const char *input_phys; | 49 | const char *input_phys; |
50 | /* Returns new code, value, and autorelease values in arguments. | ||
51 | * Return ASUS_WMI_KEY_IGNORE in code if event should be ignored. */ | ||
52 | void (*key_filter) (struct asus_wmi_driver *driver, int *code, | ||
53 | unsigned int *value, bool *autorelease); | ||
47 | 54 | ||
48 | int (*probe) (struct platform_device *device); | 55 | int (*probe) (struct platform_device *device); |
49 | void (*quirks) (struct asus_wmi_driver *driver); | 56 | void (*quirks) (struct asus_wmi_driver *driver); |
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c index e39ab1d3ed87..f31fa4efa725 100644 --- a/drivers/platform/x86/dell-laptop.c +++ b/drivers/platform/x86/dell-laptop.c | |||
@@ -612,7 +612,6 @@ static int __init dell_init(void) | |||
612 | if (!bufferpage) | 612 | if (!bufferpage) |
613 | goto fail_buffer; | 613 | goto fail_buffer; |
614 | buffer = page_address(bufferpage); | 614 | buffer = page_address(bufferpage); |
615 | mutex_init(&buffer_mutex); | ||
616 | 615 | ||
617 | ret = dell_setup_rfkill(); | 616 | ret = dell_setup_rfkill(); |
618 | 617 | ||
diff --git a/drivers/platform/x86/dell-wmi.c b/drivers/platform/x86/dell-wmi.c index ce790827e199..fa9a2171cc13 100644 --- a/drivers/platform/x86/dell-wmi.c +++ b/drivers/platform/x86/dell-wmi.c | |||
@@ -54,6 +54,8 @@ MODULE_ALIAS("wmi:"DELL_EVENT_GUID); | |||
54 | */ | 54 | */ |
55 | 55 | ||
56 | static const struct key_entry dell_wmi_legacy_keymap[] __initconst = { | 56 | static const struct key_entry dell_wmi_legacy_keymap[] __initconst = { |
57 | { KE_IGNORE, 0x003a, { KEY_CAPSLOCK } }, | ||
58 | |||
57 | { KE_KEY, 0xe045, { KEY_PROG1 } }, | 59 | { KE_KEY, 0xe045, { KEY_PROG1 } }, |
58 | { KE_KEY, 0xe009, { KEY_EJECTCD } }, | 60 | { KE_KEY, 0xe009, { KEY_EJECTCD } }, |
59 | 61 | ||
@@ -85,6 +87,11 @@ static const struct key_entry dell_wmi_legacy_keymap[] __initconst = { | |||
85 | { KE_IGNORE, 0xe013, { KEY_RESERVED } }, | 87 | { KE_IGNORE, 0xe013, { KEY_RESERVED } }, |
86 | 88 | ||
87 | { KE_IGNORE, 0xe020, { KEY_MUTE } }, | 89 | { KE_IGNORE, 0xe020, { KEY_MUTE } }, |
90 | |||
91 | /* Shortcut and audio panel keys */ | ||
92 | { KE_IGNORE, 0xe025, { KEY_RESERVED } }, | ||
93 | { KE_IGNORE, 0xe026, { KEY_RESERVED } }, | ||
94 | |||
88 | { KE_IGNORE, 0xe02e, { KEY_VOLUMEDOWN } }, | 95 | { KE_IGNORE, 0xe02e, { KEY_VOLUMEDOWN } }, |
89 | { KE_IGNORE, 0xe030, { KEY_VOLUMEUP } }, | 96 | { KE_IGNORE, 0xe030, { KEY_VOLUMEUP } }, |
90 | { KE_IGNORE, 0xe033, { KEY_KBDILLUMUP } }, | 97 | { KE_IGNORE, 0xe033, { KEY_KBDILLUMUP } }, |
@@ -92,6 +99,9 @@ static const struct key_entry dell_wmi_legacy_keymap[] __initconst = { | |||
92 | { KE_IGNORE, 0xe03a, { KEY_CAPSLOCK } }, | 99 | { KE_IGNORE, 0xe03a, { KEY_CAPSLOCK } }, |
93 | { KE_IGNORE, 0xe045, { KEY_NUMLOCK } }, | 100 | { KE_IGNORE, 0xe045, { KEY_NUMLOCK } }, |
94 | { KE_IGNORE, 0xe046, { KEY_SCROLLLOCK } }, | 101 | { KE_IGNORE, 0xe046, { KEY_SCROLLLOCK } }, |
102 | { KE_IGNORE, 0xe0f7, { KEY_MUTE } }, | ||
103 | { KE_IGNORE, 0xe0f8, { KEY_VOLUMEDOWN } }, | ||
104 | { KE_IGNORE, 0xe0f9, { KEY_VOLUMEUP } }, | ||
95 | { KE_END, 0 } | 105 | { KE_END, 0 } |
96 | }; | 106 | }; |
97 | 107 | ||
diff --git a/drivers/platform/x86/eeepc-wmi.c b/drivers/platform/x86/eeepc-wmi.c index 4aa867a9b88b..9f6e64302b45 100644 --- a/drivers/platform/x86/eeepc-wmi.c +++ b/drivers/platform/x86/eeepc-wmi.c | |||
@@ -56,6 +56,11 @@ MODULE_PARM_DESC(hotplug_wireless, | |||
56 | "If your laptop needs that, please report to " | 56 | "If your laptop needs that, please report to " |
57 | "acpi4asus-user@lists.sourceforge.net."); | 57 | "acpi4asus-user@lists.sourceforge.net."); |
58 | 58 | ||
59 | /* Values for T101MT "Home" key */ | ||
60 | #define HOME_PRESS 0xe4 | ||
61 | #define HOME_HOLD 0xea | ||
62 | #define HOME_RELEASE 0xe5 | ||
63 | |||
59 | static const struct key_entry eeepc_wmi_keymap[] = { | 64 | static const struct key_entry eeepc_wmi_keymap[] = { |
60 | /* Sleep already handled via generic ACPI code */ | 65 | /* Sleep already handled via generic ACPI code */ |
61 | { KE_KEY, 0x30, { KEY_VOLUMEUP } }, | 66 | { KE_KEY, 0x30, { KEY_VOLUMEUP } }, |
@@ -71,6 +76,7 @@ static const struct key_entry eeepc_wmi_keymap[] = { | |||
71 | { KE_KEY, 0xcc, { KEY_SWITCHVIDEOMODE } }, | 76 | { KE_KEY, 0xcc, { KEY_SWITCHVIDEOMODE } }, |
72 | { KE_KEY, 0xe0, { KEY_PROG1 } }, /* Task Manager */ | 77 | { KE_KEY, 0xe0, { KEY_PROG1 } }, /* Task Manager */ |
73 | { KE_KEY, 0xe1, { KEY_F14 } }, /* Change Resolution */ | 78 | { KE_KEY, 0xe1, { KEY_F14 } }, /* Change Resolution */ |
79 | { KE_KEY, HOME_PRESS, { KEY_CONFIG } }, /* Home/Express gate key */ | ||
74 | { KE_KEY, 0xe8, { KEY_SCREENLOCK } }, | 80 | { KE_KEY, 0xe8, { KEY_SCREENLOCK } }, |
75 | { KE_KEY, 0xe9, { KEY_BRIGHTNESS_ZERO } }, | 81 | { KE_KEY, 0xe9, { KEY_BRIGHTNESS_ZERO } }, |
76 | { KE_KEY, 0xeb, { KEY_CAMERA_ZOOMOUT } }, | 82 | { KE_KEY, 0xeb, { KEY_CAMERA_ZOOMOUT } }, |
@@ -81,6 +87,25 @@ static const struct key_entry eeepc_wmi_keymap[] = { | |||
81 | { KE_END, 0}, | 87 | { KE_END, 0}, |
82 | }; | 88 | }; |
83 | 89 | ||
90 | static void eeepc_wmi_key_filter(struct asus_wmi_driver *asus_wmi, int *code, | ||
91 | unsigned int *value, bool *autorelease) | ||
92 | { | ||
93 | switch (*code) { | ||
94 | case HOME_PRESS: | ||
95 | *value = 1; | ||
96 | *autorelease = 0; | ||
97 | break; | ||
98 | case HOME_HOLD: | ||
99 | *code = ASUS_WMI_KEY_IGNORE; | ||
100 | break; | ||
101 | case HOME_RELEASE: | ||
102 | *code = HOME_PRESS; | ||
103 | *value = 0; | ||
104 | *autorelease = 0; | ||
105 | break; | ||
106 | } | ||
107 | } | ||
108 | |||
84 | static acpi_status eeepc_wmi_parse_device(acpi_handle handle, u32 level, | 109 | static acpi_status eeepc_wmi_parse_device(acpi_handle handle, u32 level, |
85 | void *context, void **retval) | 110 | void *context, void **retval) |
86 | { | 111 | { |
@@ -141,6 +166,7 @@ static void eeepc_dmi_check(struct asus_wmi_driver *driver) | |||
141 | static void eeepc_wmi_quirks(struct asus_wmi_driver *driver) | 166 | static void eeepc_wmi_quirks(struct asus_wmi_driver *driver) |
142 | { | 167 | { |
143 | driver->hotplug_wireless = hotplug_wireless; | 168 | driver->hotplug_wireless = hotplug_wireless; |
169 | driver->wapf = -1; | ||
144 | eeepc_dmi_check(driver); | 170 | eeepc_dmi_check(driver); |
145 | } | 171 | } |
146 | 172 | ||
@@ -151,6 +177,7 @@ static struct asus_wmi_driver asus_wmi_driver = { | |||
151 | .keymap = eeepc_wmi_keymap, | 177 | .keymap = eeepc_wmi_keymap, |
152 | .input_name = "Eee PC WMI hotkeys", | 178 | .input_name = "Eee PC WMI hotkeys", |
153 | .input_phys = EEEPC_WMI_FILE "/input0", | 179 | .input_phys = EEEPC_WMI_FILE "/input0", |
180 | .key_filter = eeepc_wmi_key_filter, | ||
154 | .probe = eeepc_wmi_probe, | 181 | .probe = eeepc_wmi_probe, |
155 | .quirks = eeepc_wmi_quirks, | 182 | .quirks = eeepc_wmi_quirks, |
156 | }; | 183 | }; |
diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c index bfdda33feb26..0c595410e788 100644 --- a/drivers/platform/x86/ideapad-laptop.c +++ b/drivers/platform/x86/ideapad-laptop.c | |||
@@ -32,13 +32,22 @@ | |||
32 | #include <linux/platform_device.h> | 32 | #include <linux/platform_device.h> |
33 | #include <linux/input.h> | 33 | #include <linux/input.h> |
34 | #include <linux/input/sparse-keymap.h> | 34 | #include <linux/input/sparse-keymap.h> |
35 | #include <linux/backlight.h> | ||
36 | #include <linux/fb.h> | ||
35 | 37 | ||
36 | #define IDEAPAD_RFKILL_DEV_NUM (3) | 38 | #define IDEAPAD_RFKILL_DEV_NUM (3) |
37 | 39 | ||
40 | #define CFG_BT_BIT (16) | ||
41 | #define CFG_3G_BIT (17) | ||
42 | #define CFG_WIFI_BIT (18) | ||
43 | #define CFG_CAMERA_BIT (19) | ||
44 | |||
38 | struct ideapad_private { | 45 | struct ideapad_private { |
39 | struct rfkill *rfk[IDEAPAD_RFKILL_DEV_NUM]; | 46 | struct rfkill *rfk[IDEAPAD_RFKILL_DEV_NUM]; |
40 | struct platform_device *platform_device; | 47 | struct platform_device *platform_device; |
41 | struct input_dev *inputdev; | 48 | struct input_dev *inputdev; |
49 | struct backlight_device *blightdev; | ||
50 | unsigned long cfg; | ||
42 | }; | 51 | }; |
43 | 52 | ||
44 | static acpi_handle ideapad_handle; | 53 | static acpi_handle ideapad_handle; |
@@ -155,7 +164,7 @@ static int write_ec_cmd(acpi_handle handle, int cmd, unsigned long data) | |||
155 | } | 164 | } |
156 | 165 | ||
157 | /* | 166 | /* |
158 | * camera power | 167 | * sysfs |
159 | */ | 168 | */ |
160 | static ssize_t show_ideapad_cam(struct device *dev, | 169 | static ssize_t show_ideapad_cam(struct device *dev, |
161 | struct device_attribute *attr, | 170 | struct device_attribute *attr, |
@@ -186,6 +195,44 @@ static ssize_t store_ideapad_cam(struct device *dev, | |||
186 | 195 | ||
187 | static DEVICE_ATTR(camera_power, 0644, show_ideapad_cam, store_ideapad_cam); | 196 | static DEVICE_ATTR(camera_power, 0644, show_ideapad_cam, store_ideapad_cam); |
188 | 197 | ||
198 | static ssize_t show_ideapad_cfg(struct device *dev, | ||
199 | struct device_attribute *attr, | ||
200 | char *buf) | ||
201 | { | ||
202 | struct ideapad_private *priv = dev_get_drvdata(dev); | ||
203 | |||
204 | return sprintf(buf, "0x%.8lX\n", priv->cfg); | ||
205 | } | ||
206 | |||
207 | static DEVICE_ATTR(cfg, 0444, show_ideapad_cfg, NULL); | ||
208 | |||
209 | static struct attribute *ideapad_attributes[] = { | ||
210 | &dev_attr_camera_power.attr, | ||
211 | &dev_attr_cfg.attr, | ||
212 | NULL | ||
213 | }; | ||
214 | |||
215 | static mode_t ideapad_is_visible(struct kobject *kobj, | ||
216 | struct attribute *attr, | ||
217 | int idx) | ||
218 | { | ||
219 | struct device *dev = container_of(kobj, struct device, kobj); | ||
220 | struct ideapad_private *priv = dev_get_drvdata(dev); | ||
221 | bool supported; | ||
222 | |||
223 | if (attr == &dev_attr_camera_power.attr) | ||
224 | supported = test_bit(CFG_CAMERA_BIT, &(priv->cfg)); | ||
225 | else | ||
226 | supported = true; | ||
227 | |||
228 | return supported ? attr->mode : 0; | ||
229 | } | ||
230 | |||
231 | static struct attribute_group ideapad_attribute_group = { | ||
232 | .is_visible = ideapad_is_visible, | ||
233 | .attrs = ideapad_attributes | ||
234 | }; | ||
235 | |||
189 | /* | 236 | /* |
190 | * Rfkill | 237 | * Rfkill |
191 | */ | 238 | */ |
@@ -197,9 +244,9 @@ struct ideapad_rfk_data { | |||
197 | }; | 244 | }; |
198 | 245 | ||
199 | const struct ideapad_rfk_data ideapad_rfk_data[] = { | 246 | const struct ideapad_rfk_data ideapad_rfk_data[] = { |
200 | { "ideapad_wlan", 18, 0x15, RFKILL_TYPE_WLAN }, | 247 | { "ideapad_wlan", CFG_WIFI_BIT, 0x15, RFKILL_TYPE_WLAN }, |
201 | { "ideapad_bluetooth", 16, 0x17, RFKILL_TYPE_BLUETOOTH }, | 248 | { "ideapad_bluetooth", CFG_BT_BIT, 0x17, RFKILL_TYPE_BLUETOOTH }, |
202 | { "ideapad_3g", 17, 0x20, RFKILL_TYPE_WWAN }, | 249 | { "ideapad_3g", CFG_3G_BIT, 0x20, RFKILL_TYPE_WWAN }, |
203 | }; | 250 | }; |
204 | 251 | ||
205 | static int ideapad_rfk_set(void *data, bool blocked) | 252 | static int ideapad_rfk_set(void *data, bool blocked) |
@@ -265,8 +312,7 @@ static int __devinit ideapad_register_rfkill(struct acpi_device *adevice, | |||
265 | return 0; | 312 | return 0; |
266 | } | 313 | } |
267 | 314 | ||
268 | static void __devexit ideapad_unregister_rfkill(struct acpi_device *adevice, | 315 | static void ideapad_unregister_rfkill(struct acpi_device *adevice, int dev) |
269 | int dev) | ||
270 | { | 316 | { |
271 | struct ideapad_private *priv = dev_get_drvdata(&adevice->dev); | 317 | struct ideapad_private *priv = dev_get_drvdata(&adevice->dev); |
272 | 318 | ||
@@ -280,15 +326,6 @@ static void __devexit ideapad_unregister_rfkill(struct acpi_device *adevice, | |||
280 | /* | 326 | /* |
281 | * Platform device | 327 | * Platform device |
282 | */ | 328 | */ |
283 | static struct attribute *ideapad_attributes[] = { | ||
284 | &dev_attr_camera_power.attr, | ||
285 | NULL | ||
286 | }; | ||
287 | |||
288 | static struct attribute_group ideapad_attribute_group = { | ||
289 | .attrs = ideapad_attributes | ||
290 | }; | ||
291 | |||
292 | static int __devinit ideapad_platform_init(struct ideapad_private *priv) | 329 | static int __devinit ideapad_platform_init(struct ideapad_private *priv) |
293 | { | 330 | { |
294 | int result; | 331 | int result; |
@@ -369,7 +406,7 @@ err_free_dev: | |||
369 | return error; | 406 | return error; |
370 | } | 407 | } |
371 | 408 | ||
372 | static void __devexit ideapad_input_exit(struct ideapad_private *priv) | 409 | static void ideapad_input_exit(struct ideapad_private *priv) |
373 | { | 410 | { |
374 | sparse_keymap_free(priv->inputdev); | 411 | sparse_keymap_free(priv->inputdev); |
375 | input_unregister_device(priv->inputdev); | 412 | input_unregister_device(priv->inputdev); |
@@ -383,6 +420,98 @@ static void ideapad_input_report(struct ideapad_private *priv, | |||
383 | } | 420 | } |
384 | 421 | ||
385 | /* | 422 | /* |
423 | * backlight | ||
424 | */ | ||
425 | static int ideapad_backlight_get_brightness(struct backlight_device *blightdev) | ||
426 | { | ||
427 | unsigned long now; | ||
428 | |||
429 | if (read_ec_data(ideapad_handle, 0x12, &now)) | ||
430 | return -EIO; | ||
431 | return now; | ||
432 | } | ||
433 | |||
434 | static int ideapad_backlight_update_status(struct backlight_device *blightdev) | ||
435 | { | ||
436 | if (write_ec_cmd(ideapad_handle, 0x13, blightdev->props.brightness)) | ||
437 | return -EIO; | ||
438 | if (write_ec_cmd(ideapad_handle, 0x33, | ||
439 | blightdev->props.power == FB_BLANK_POWERDOWN ? 0 : 1)) | ||
440 | return -EIO; | ||
441 | |||
442 | return 0; | ||
443 | } | ||
444 | |||
445 | static const struct backlight_ops ideapad_backlight_ops = { | ||
446 | .get_brightness = ideapad_backlight_get_brightness, | ||
447 | .update_status = ideapad_backlight_update_status, | ||
448 | }; | ||
449 | |||
450 | static int ideapad_backlight_init(struct ideapad_private *priv) | ||
451 | { | ||
452 | struct backlight_device *blightdev; | ||
453 | struct backlight_properties props; | ||
454 | unsigned long max, now, power; | ||
455 | |||
456 | if (read_ec_data(ideapad_handle, 0x11, &max)) | ||
457 | return -EIO; | ||
458 | if (read_ec_data(ideapad_handle, 0x12, &now)) | ||
459 | return -EIO; | ||
460 | if (read_ec_data(ideapad_handle, 0x18, &power)) | ||
461 | return -EIO; | ||
462 | |||
463 | memset(&props, 0, sizeof(struct backlight_properties)); | ||
464 | props.max_brightness = max; | ||
465 | props.type = BACKLIGHT_PLATFORM; | ||
466 | blightdev = backlight_device_register("ideapad", | ||
467 | &priv->platform_device->dev, | ||
468 | priv, | ||
469 | &ideapad_backlight_ops, | ||
470 | &props); | ||
471 | if (IS_ERR(blightdev)) { | ||
472 | pr_err("Could not register backlight device\n"); | ||
473 | return PTR_ERR(blightdev); | ||
474 | } | ||
475 | |||
476 | priv->blightdev = blightdev; | ||
477 | blightdev->props.brightness = now; | ||
478 | blightdev->props.power = power ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; | ||
479 | backlight_update_status(blightdev); | ||
480 | |||
481 | return 0; | ||
482 | } | ||
483 | |||
484 | static void ideapad_backlight_exit(struct ideapad_private *priv) | ||
485 | { | ||
486 | if (priv->blightdev) | ||
487 | backlight_device_unregister(priv->blightdev); | ||
488 | priv->blightdev = NULL; | ||
489 | } | ||
490 | |||
491 | static void ideapad_backlight_notify_power(struct ideapad_private *priv) | ||
492 | { | ||
493 | unsigned long power; | ||
494 | struct backlight_device *blightdev = priv->blightdev; | ||
495 | |||
496 | if (read_ec_data(ideapad_handle, 0x18, &power)) | ||
497 | return; | ||
498 | blightdev->props.power = power ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; | ||
499 | } | ||
500 | |||
501 | static void ideapad_backlight_notify_brightness(struct ideapad_private *priv) | ||
502 | { | ||
503 | unsigned long now; | ||
504 | |||
505 | /* if we control brightness via acpi video driver */ | ||
506 | if (priv->blightdev == NULL) { | ||
507 | read_ec_data(ideapad_handle, 0x12, &now); | ||
508 | return; | ||
509 | } | ||
510 | |||
511 | backlight_force_update(priv->blightdev, BACKLIGHT_UPDATE_HOTKEY); | ||
512 | } | ||
513 | |||
514 | /* | ||
386 | * module init/exit | 515 | * module init/exit |
387 | */ | 516 | */ |
388 | static const struct acpi_device_id ideapad_device_ids[] = { | 517 | static const struct acpi_device_id ideapad_device_ids[] = { |
@@ -393,10 +522,11 @@ MODULE_DEVICE_TABLE(acpi, ideapad_device_ids); | |||
393 | 522 | ||
394 | static int __devinit ideapad_acpi_add(struct acpi_device *adevice) | 523 | static int __devinit ideapad_acpi_add(struct acpi_device *adevice) |
395 | { | 524 | { |
396 | int ret, i, cfg; | 525 | int ret, i; |
526 | unsigned long cfg; | ||
397 | struct ideapad_private *priv; | 527 | struct ideapad_private *priv; |
398 | 528 | ||
399 | if (read_method_int(adevice->handle, "_CFG", &cfg)) | 529 | if (read_method_int(adevice->handle, "_CFG", (int *)&cfg)) |
400 | return -ENODEV; | 530 | return -ENODEV; |
401 | 531 | ||
402 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | 532 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
@@ -404,6 +534,7 @@ static int __devinit ideapad_acpi_add(struct acpi_device *adevice) | |||
404 | return -ENOMEM; | 534 | return -ENOMEM; |
405 | dev_set_drvdata(&adevice->dev, priv); | 535 | dev_set_drvdata(&adevice->dev, priv); |
406 | ideapad_handle = adevice->handle; | 536 | ideapad_handle = adevice->handle; |
537 | priv->cfg = cfg; | ||
407 | 538 | ||
408 | ret = ideapad_platform_init(priv); | 539 | ret = ideapad_platform_init(priv); |
409 | if (ret) | 540 | if (ret) |
@@ -414,15 +545,25 @@ static int __devinit ideapad_acpi_add(struct acpi_device *adevice) | |||
414 | goto input_failed; | 545 | goto input_failed; |
415 | 546 | ||
416 | for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++) { | 547 | for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++) { |
417 | if (test_bit(ideapad_rfk_data[i].cfgbit, (unsigned long *)&cfg)) | 548 | if (test_bit(ideapad_rfk_data[i].cfgbit, &cfg)) |
418 | ideapad_register_rfkill(adevice, i); | 549 | ideapad_register_rfkill(adevice, i); |
419 | else | 550 | else |
420 | priv->rfk[i] = NULL; | 551 | priv->rfk[i] = NULL; |
421 | } | 552 | } |
422 | ideapad_sync_rfk_state(adevice); | 553 | ideapad_sync_rfk_state(adevice); |
423 | 554 | ||
555 | if (!acpi_video_backlight_support()) { | ||
556 | ret = ideapad_backlight_init(priv); | ||
557 | if (ret && ret != -ENODEV) | ||
558 | goto backlight_failed; | ||
559 | } | ||
560 | |||
424 | return 0; | 561 | return 0; |
425 | 562 | ||
563 | backlight_failed: | ||
564 | for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++) | ||
565 | ideapad_unregister_rfkill(adevice, i); | ||
566 | ideapad_input_exit(priv); | ||
426 | input_failed: | 567 | input_failed: |
427 | ideapad_platform_exit(priv); | 568 | ideapad_platform_exit(priv); |
428 | platform_failed: | 569 | platform_failed: |
@@ -435,6 +576,7 @@ static int __devexit ideapad_acpi_remove(struct acpi_device *adevice, int type) | |||
435 | struct ideapad_private *priv = dev_get_drvdata(&adevice->dev); | 576 | struct ideapad_private *priv = dev_get_drvdata(&adevice->dev); |
436 | int i; | 577 | int i; |
437 | 578 | ||
579 | ideapad_backlight_exit(priv); | ||
438 | for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++) | 580 | for (i = 0; i < IDEAPAD_RFKILL_DEV_NUM; i++) |
439 | ideapad_unregister_rfkill(adevice, i); | 581 | ideapad_unregister_rfkill(adevice, i); |
440 | ideapad_input_exit(priv); | 582 | ideapad_input_exit(priv); |
@@ -459,12 +601,19 @@ static void ideapad_acpi_notify(struct acpi_device *adevice, u32 event) | |||
459 | vpc1 = (vpc2 << 8) | vpc1; | 601 | vpc1 = (vpc2 << 8) | vpc1; |
460 | for (vpc_bit = 0; vpc_bit < 16; vpc_bit++) { | 602 | for (vpc_bit = 0; vpc_bit < 16; vpc_bit++) { |
461 | if (test_bit(vpc_bit, &vpc1)) { | 603 | if (test_bit(vpc_bit, &vpc1)) { |
462 | if (vpc_bit == 9) | 604 | switch (vpc_bit) { |
605 | case 9: | ||
463 | ideapad_sync_rfk_state(adevice); | 606 | ideapad_sync_rfk_state(adevice); |
464 | else if (vpc_bit == 4) | 607 | break; |
465 | read_ec_data(handle, 0x12, &vpc2); | 608 | case 4: |
466 | else | 609 | ideapad_backlight_notify_brightness(priv); |
610 | break; | ||
611 | case 2: | ||
612 | ideapad_backlight_notify_power(priv); | ||
613 | break; | ||
614 | default: | ||
467 | ideapad_input_report(priv, vpc_bit); | 615 | ideapad_input_report(priv, vpc_bit); |
616 | } | ||
468 | } | 617 | } |
469 | } | 618 | } |
470 | } | 619 | } |
diff --git a/drivers/platform/x86/intel_ips.c b/drivers/platform/x86/intel_ips.c index 5ffe7c398148..809a3ae943c6 100644 --- a/drivers/platform/x86/intel_ips.c +++ b/drivers/platform/x86/intel_ips.c | |||
@@ -403,7 +403,7 @@ static void ips_cpu_raise(struct ips_driver *ips) | |||
403 | 403 | ||
404 | thm_writew(THM_MPCPC, (new_tdp_limit * 10) / 8); | 404 | thm_writew(THM_MPCPC, (new_tdp_limit * 10) / 8); |
405 | 405 | ||
406 | turbo_override |= TURBO_TDC_OVR_EN | TURBO_TDC_OVR_EN; | 406 | turbo_override |= TURBO_TDC_OVR_EN | TURBO_TDP_OVR_EN; |
407 | wrmsrl(TURBO_POWER_CURRENT_LIMIT, turbo_override); | 407 | wrmsrl(TURBO_POWER_CURRENT_LIMIT, turbo_override); |
408 | 408 | ||
409 | turbo_override &= ~TURBO_TDP_MASK; | 409 | turbo_override &= ~TURBO_TDP_MASK; |
@@ -438,7 +438,7 @@ static void ips_cpu_lower(struct ips_driver *ips) | |||
438 | 438 | ||
439 | thm_writew(THM_MPCPC, (new_limit * 10) / 8); | 439 | thm_writew(THM_MPCPC, (new_limit * 10) / 8); |
440 | 440 | ||
441 | turbo_override |= TURBO_TDC_OVR_EN | TURBO_TDC_OVR_EN; | 441 | turbo_override |= TURBO_TDC_OVR_EN | TURBO_TDP_OVR_EN; |
442 | wrmsrl(TURBO_POWER_CURRENT_LIMIT, turbo_override); | 442 | wrmsrl(TURBO_POWER_CURRENT_LIMIT, turbo_override); |
443 | 443 | ||
444 | turbo_override &= ~TURBO_TDP_MASK; | 444 | turbo_override &= ~TURBO_TDP_MASK; |
diff --git a/drivers/platform/x86/intel_menlow.c b/drivers/platform/x86/intel_menlow.c index 809adea4965f..abddc83e9fd7 100644 --- a/drivers/platform/x86/intel_menlow.c +++ b/drivers/platform/x86/intel_menlow.c | |||
@@ -477,6 +477,8 @@ static acpi_status intel_menlow_register_sensor(acpi_handle handle, u32 lvl, | |||
477 | return AE_ERROR; | 477 | return AE_ERROR; |
478 | } | 478 | } |
479 | 479 | ||
480 | return AE_OK; | ||
481 | |||
480 | aux1_not_found: | 482 | aux1_not_found: |
481 | if (status == AE_NOT_FOUND) | 483 | if (status == AE_NOT_FOUND) |
482 | return AE_OK; | 484 | return AE_OK; |
diff --git a/drivers/platform/x86/intel_mid_thermal.c b/drivers/platform/x86/intel_mid_thermal.c index 3a578323122b..ccd7b1f83519 100644 --- a/drivers/platform/x86/intel_mid_thermal.c +++ b/drivers/platform/x86/intel_mid_thermal.c | |||
@@ -493,20 +493,30 @@ static int mid_thermal_probe(struct platform_device *pdev) | |||
493 | 493 | ||
494 | /* Register each sensor with the generic thermal framework*/ | 494 | /* Register each sensor with the generic thermal framework*/ |
495 | for (i = 0; i < MSIC_THERMAL_SENSORS; i++) { | 495 | for (i = 0; i < MSIC_THERMAL_SENSORS; i++) { |
496 | struct thermal_device_info *td_info = initialize_sensor(i); | ||
497 | |||
498 | if (!td_info) { | ||
499 | ret = -ENOMEM; | ||
500 | goto err; | ||
501 | } | ||
496 | pinfo->tzd[i] = thermal_zone_device_register(name[i], | 502 | pinfo->tzd[i] = thermal_zone_device_register(name[i], |
497 | 0, initialize_sensor(i), &tzd_ops, 0, 0, 0, 0); | 503 | 0, td_info, &tzd_ops, 0, 0, 0, 0); |
498 | if (IS_ERR(pinfo->tzd[i])) | 504 | if (IS_ERR(pinfo->tzd[i])) { |
499 | goto reg_fail; | 505 | kfree(td_info); |
506 | ret = PTR_ERR(pinfo->tzd[i]); | ||
507 | goto err; | ||
508 | } | ||
500 | } | 509 | } |
501 | 510 | ||
502 | pinfo->pdev = pdev; | 511 | pinfo->pdev = pdev; |
503 | platform_set_drvdata(pdev, pinfo); | 512 | platform_set_drvdata(pdev, pinfo); |
504 | return 0; | 513 | return 0; |
505 | 514 | ||
506 | reg_fail: | 515 | err: |
507 | ret = PTR_ERR(pinfo->tzd[i]); | 516 | while (--i >= 0) { |
508 | while (--i >= 0) | 517 | kfree(pinfo->tzd[i]->devdata); |
509 | thermal_zone_device_unregister(pinfo->tzd[i]); | 518 | thermal_zone_device_unregister(pinfo->tzd[i]); |
519 | } | ||
510 | configure_adc(0); | 520 | configure_adc(0); |
511 | kfree(pinfo); | 521 | kfree(pinfo); |
512 | return ret; | 522 | return ret; |
@@ -524,8 +534,10 @@ static int mid_thermal_remove(struct platform_device *pdev) | |||
524 | int i; | 534 | int i; |
525 | struct platform_info *pinfo = platform_get_drvdata(pdev); | 535 | struct platform_info *pinfo = platform_get_drvdata(pdev); |
526 | 536 | ||
527 | for (i = 0; i < MSIC_THERMAL_SENSORS; i++) | 537 | for (i = 0; i < MSIC_THERMAL_SENSORS; i++) { |
538 | kfree(pinfo->tzd[i]->devdata); | ||
528 | thermal_zone_device_unregister(pinfo->tzd[i]); | 539 | thermal_zone_device_unregister(pinfo->tzd[i]); |
540 | } | ||
529 | 541 | ||
530 | kfree(pinfo); | 542 | kfree(pinfo); |
531 | platform_set_drvdata(pdev, NULL); | 543 | platform_set_drvdata(pdev, NULL); |
diff --git a/drivers/platform/x86/intel_rar_register.c b/drivers/platform/x86/intel_rar_register.c index bde47e9080cd..c8a6aed45277 100644 --- a/drivers/platform/x86/intel_rar_register.c +++ b/drivers/platform/x86/intel_rar_register.c | |||
@@ -637,15 +637,13 @@ end_function: | |||
637 | return error; | 637 | return error; |
638 | } | 638 | } |
639 | 639 | ||
640 | const struct pci_device_id rar_pci_id_tbl[] = { | 640 | static DEFINE_PCI_DEVICE_TABLE(rar_pci_id_tbl) = { |
641 | { PCI_VDEVICE(INTEL, 0x4110) }, | 641 | { PCI_VDEVICE(INTEL, 0x4110) }, |
642 | { 0 } | 642 | { 0 } |
643 | }; | 643 | }; |
644 | 644 | ||
645 | MODULE_DEVICE_TABLE(pci, rar_pci_id_tbl); | 645 | MODULE_DEVICE_TABLE(pci, rar_pci_id_tbl); |
646 | 646 | ||
647 | const struct pci_device_id *my_id_table = rar_pci_id_tbl; | ||
648 | |||
649 | /* field for registering driver to PCI device */ | 647 | /* field for registering driver to PCI device */ |
650 | static struct pci_driver rar_pci_driver = { | 648 | static struct pci_driver rar_pci_driver = { |
651 | .name = "rar_register_driver", | 649 | .name = "rar_register_driver", |
diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c index 940accbe28d3..c86665369a22 100644 --- a/drivers/platform/x86/intel_scu_ipc.c +++ b/drivers/platform/x86/intel_scu_ipc.c | |||
@@ -725,7 +725,7 @@ static void ipc_remove(struct pci_dev *pdev) | |||
725 | intel_scu_devices_destroy(); | 725 | intel_scu_devices_destroy(); |
726 | } | 726 | } |
727 | 727 | ||
728 | static const struct pci_device_id pci_ids[] = { | 728 | static DEFINE_PCI_DEVICE_TABLE(pci_ids) = { |
729 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x080e)}, | 729 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x080e)}, |
730 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x082a)}, | 730 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x082a)}, |
731 | { 0,} | 731 | { 0,} |
diff --git a/drivers/platform/x86/msi-laptop.c b/drivers/platform/x86/msi-laptop.c index 3ff629df9f01..f204643c5052 100644 --- a/drivers/platform/x86/msi-laptop.c +++ b/drivers/platform/x86/msi-laptop.c | |||
@@ -538,6 +538,15 @@ static struct dmi_system_id __initdata msi_load_scm_models_dmi_table[] = { | |||
538 | }, | 538 | }, |
539 | .callback = dmi_check_cb | 539 | .callback = dmi_check_cb |
540 | }, | 540 | }, |
541 | { | ||
542 | .ident = "MSI U270", | ||
543 | .matches = { | ||
544 | DMI_MATCH(DMI_SYS_VENDOR, | ||
545 | "Micro-Star International Co., Ltd."), | ||
546 | DMI_MATCH(DMI_PRODUCT_NAME, "U270 series"), | ||
547 | }, | ||
548 | .callback = dmi_check_cb | ||
549 | }, | ||
541 | { } | 550 | { } |
542 | }; | 551 | }; |
543 | 552 | ||
@@ -996,3 +1005,4 @@ MODULE_ALIAS("dmi:*:svnMICRO-STARINTERNATIONAL*:pnMS-N034:*"); | |||
996 | MODULE_ALIAS("dmi:*:svnMICRO-STARINTERNATIONAL*:pnMS-N051:*"); | 1005 | MODULE_ALIAS("dmi:*:svnMICRO-STARINTERNATIONAL*:pnMS-N051:*"); |
997 | MODULE_ALIAS("dmi:*:svnMICRO-STARINTERNATIONAL*:pnMS-N014:*"); | 1006 | MODULE_ALIAS("dmi:*:svnMICRO-STARINTERNATIONAL*:pnMS-N014:*"); |
998 | MODULE_ALIAS("dmi:*:svnMicro-StarInternational*:pnCR620:*"); | 1007 | MODULE_ALIAS("dmi:*:svnMicro-StarInternational*:pnCR620:*"); |
1008 | MODULE_ALIAS("dmi:*:svnMicro-StarInternational*:pnU270series:*"); | ||
diff --git a/drivers/platform/x86/msi-wmi.c b/drivers/platform/x86/msi-wmi.c index c832e3356cd6..6f40bf202dc7 100644 --- a/drivers/platform/x86/msi-wmi.c +++ b/drivers/platform/x86/msi-wmi.c | |||
@@ -272,6 +272,7 @@ static int __init msi_wmi_init(void) | |||
272 | err_free_backlight: | 272 | err_free_backlight: |
273 | backlight_device_unregister(backlight); | 273 | backlight_device_unregister(backlight); |
274 | err_free_input: | 274 | err_free_input: |
275 | sparse_keymap_free(msi_wmi_input_dev); | ||
275 | input_unregister_device(msi_wmi_input_dev); | 276 | input_unregister_device(msi_wmi_input_dev); |
276 | err_uninstall_notifier: | 277 | err_uninstall_notifier: |
277 | wmi_remove_notify_handler(MSIWMI_EVENT_GUID); | 278 | wmi_remove_notify_handler(MSIWMI_EVENT_GUID); |
diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c index d347116d150e..359163011044 100644 --- a/drivers/platform/x86/samsung-laptop.c +++ b/drivers/platform/x86/samsung-laptop.c | |||
@@ -521,6 +521,16 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { | |||
521 | .callback = dmi_check_cb, | 521 | .callback = dmi_check_cb, |
522 | }, | 522 | }, |
523 | { | 523 | { |
524 | .ident = "N510", | ||
525 | .matches = { | ||
526 | DMI_MATCH(DMI_SYS_VENDOR, | ||
527 | "SAMSUNG ELECTRONICS CO., LTD."), | ||
528 | DMI_MATCH(DMI_PRODUCT_NAME, "N510"), | ||
529 | DMI_MATCH(DMI_BOARD_NAME, "N510"), | ||
530 | }, | ||
531 | .callback = dmi_check_cb, | ||
532 | }, | ||
533 | { | ||
524 | .ident = "X125", | 534 | .ident = "X125", |
525 | .matches = { | 535 | .matches = { |
526 | DMI_MATCH(DMI_SYS_VENDOR, | 536 | DMI_MATCH(DMI_SYS_VENDOR, |
@@ -601,6 +611,16 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { | |||
601 | .callback = dmi_check_cb, | 611 | .callback = dmi_check_cb, |
602 | }, | 612 | }, |
603 | { | 613 | { |
614 | .ident = "N150/N210/N220", | ||
615 | .matches = { | ||
616 | DMI_MATCH(DMI_SYS_VENDOR, | ||
617 | "SAMSUNG ELECTRONICS CO., LTD."), | ||
618 | DMI_MATCH(DMI_PRODUCT_NAME, "N150/N210/N220"), | ||
619 | DMI_MATCH(DMI_BOARD_NAME, "N150/N210/N220"), | ||
620 | }, | ||
621 | .callback = dmi_check_cb, | ||
622 | }, | ||
623 | { | ||
604 | .ident = "N150/N210/N220/N230", | 624 | .ident = "N150/N210/N220/N230", |
605 | .matches = { | 625 | .matches = { |
606 | DMI_MATCH(DMI_SYS_VENDOR, | 626 | DMI_MATCH(DMI_SYS_VENDOR, |
diff --git a/drivers/platform/x86/samsung-q10.c b/drivers/platform/x86/samsung-q10.c new file mode 100644 index 000000000000..1e54ae74274c --- /dev/null +++ b/drivers/platform/x86/samsung-q10.c | |||
@@ -0,0 +1,196 @@ | |||
1 | /* | ||
2 | * Driver for Samsung Q10 and related laptops: controls the backlight | ||
3 | * | ||
4 | * Copyright (c) 2011 Frederick van der Wyck <fvanderwyck@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #include <linux/module.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/init.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/backlight.h> | ||
17 | #include <linux/i8042.h> | ||
18 | #include <linux/dmi.h> | ||
19 | |||
20 | #define SAMSUNGQ10_BL_MAX_INTENSITY 255 | ||
21 | #define SAMSUNGQ10_BL_DEFAULT_INTENSITY 185 | ||
22 | |||
23 | #define SAMSUNGQ10_BL_8042_CMD 0xbe | ||
24 | #define SAMSUNGQ10_BL_8042_DATA { 0x89, 0x91 } | ||
25 | |||
26 | static int samsungq10_bl_brightness; | ||
27 | |||
28 | static bool force; | ||
29 | module_param(force, bool, 0); | ||
30 | MODULE_PARM_DESC(force, | ||
31 | "Disable the DMI check and force the driver to be loaded"); | ||
32 | |||
33 | static int samsungq10_bl_set_intensity(struct backlight_device *bd) | ||
34 | { | ||
35 | |||
36 | int brightness = bd->props.brightness; | ||
37 | unsigned char c[3] = SAMSUNGQ10_BL_8042_DATA; | ||
38 | |||
39 | c[2] = (unsigned char)brightness; | ||
40 | i8042_lock_chip(); | ||
41 | i8042_command(c, (0x30 << 8) | SAMSUNGQ10_BL_8042_CMD); | ||
42 | i8042_unlock_chip(); | ||
43 | samsungq10_bl_brightness = brightness; | ||
44 | |||
45 | return 0; | ||
46 | } | ||
47 | |||
48 | static int samsungq10_bl_get_intensity(struct backlight_device *bd) | ||
49 | { | ||
50 | return samsungq10_bl_brightness; | ||
51 | } | ||
52 | |||
53 | static const struct backlight_ops samsungq10_bl_ops = { | ||
54 | .get_brightness = samsungq10_bl_get_intensity, | ||
55 | .update_status = samsungq10_bl_set_intensity, | ||
56 | }; | ||
57 | |||
58 | #ifdef CONFIG_PM_SLEEP | ||
59 | static int samsungq10_suspend(struct device *dev) | ||
60 | { | ||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | static int samsungq10_resume(struct device *dev) | ||
65 | { | ||
66 | |||
67 | struct backlight_device *bd = dev_get_drvdata(dev); | ||
68 | |||
69 | samsungq10_bl_set_intensity(bd); | ||
70 | return 0; | ||
71 | } | ||
72 | #else | ||
73 | #define samsungq10_suspend NULL | ||
74 | #define samsungq10_resume NULL | ||
75 | #endif | ||
76 | |||
77 | static SIMPLE_DEV_PM_OPS(samsungq10_pm_ops, | ||
78 | samsungq10_suspend, samsungq10_resume); | ||
79 | |||
80 | static int __devinit samsungq10_probe(struct platform_device *pdev) | ||
81 | { | ||
82 | |||
83 | struct backlight_properties props; | ||
84 | struct backlight_device *bd; | ||
85 | |||
86 | memset(&props, 0, sizeof(struct backlight_properties)); | ||
87 | props.type = BACKLIGHT_PLATFORM; | ||
88 | props.max_brightness = SAMSUNGQ10_BL_MAX_INTENSITY; | ||
89 | bd = backlight_device_register("samsung", &pdev->dev, NULL, | ||
90 | &samsungq10_bl_ops, &props); | ||
91 | if (IS_ERR(bd)) | ||
92 | return PTR_ERR(bd); | ||
93 | |||
94 | platform_set_drvdata(pdev, bd); | ||
95 | |||
96 | bd->props.brightness = SAMSUNGQ10_BL_DEFAULT_INTENSITY; | ||
97 | samsungq10_bl_set_intensity(bd); | ||
98 | |||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | static int __devexit samsungq10_remove(struct platform_device *pdev) | ||
103 | { | ||
104 | |||
105 | struct backlight_device *bd = platform_get_drvdata(pdev); | ||
106 | |||
107 | bd->props.brightness = SAMSUNGQ10_BL_DEFAULT_INTENSITY; | ||
108 | samsungq10_bl_set_intensity(bd); | ||
109 | |||
110 | backlight_device_unregister(bd); | ||
111 | |||
112 | return 0; | ||
113 | } | ||
114 | |||
115 | static struct platform_driver samsungq10_driver = { | ||
116 | .driver = { | ||
117 | .name = KBUILD_MODNAME, | ||
118 | .owner = THIS_MODULE, | ||
119 | .pm = &samsungq10_pm_ops, | ||
120 | }, | ||
121 | .probe = samsungq10_probe, | ||
122 | .remove = __devexit_p(samsungq10_remove), | ||
123 | }; | ||
124 | |||
125 | static struct platform_device *samsungq10_device; | ||
126 | |||
127 | static int __init dmi_check_callback(const struct dmi_system_id *id) | ||
128 | { | ||
129 | printk(KERN_INFO KBUILD_MODNAME ": found model '%s'\n", id->ident); | ||
130 | return 1; | ||
131 | } | ||
132 | |||
133 | static struct dmi_system_id __initdata samsungq10_dmi_table[] = { | ||
134 | { | ||
135 | .ident = "Samsung Q10", | ||
136 | .matches = { | ||
137 | DMI_MATCH(DMI_SYS_VENDOR, "Samsung"), | ||
138 | DMI_MATCH(DMI_PRODUCT_NAME, "SQ10"), | ||
139 | }, | ||
140 | .callback = dmi_check_callback, | ||
141 | }, | ||
142 | { | ||
143 | .ident = "Samsung Q20", | ||
144 | .matches = { | ||
145 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG Electronics"), | ||
146 | DMI_MATCH(DMI_PRODUCT_NAME, "SENS Q20"), | ||
147 | }, | ||
148 | .callback = dmi_check_callback, | ||
149 | }, | ||
150 | { | ||
151 | .ident = "Samsung Q25", | ||
152 | .matches = { | ||
153 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG Electronics"), | ||
154 | DMI_MATCH(DMI_PRODUCT_NAME, "NQ25"), | ||
155 | }, | ||
156 | .callback = dmi_check_callback, | ||
157 | }, | ||
158 | { | ||
159 | .ident = "Dell Latitude X200", | ||
160 | .matches = { | ||
161 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), | ||
162 | DMI_MATCH(DMI_PRODUCT_NAME, "X200"), | ||
163 | }, | ||
164 | .callback = dmi_check_callback, | ||
165 | }, | ||
166 | { }, | ||
167 | }; | ||
168 | MODULE_DEVICE_TABLE(dmi, samsungq10_dmi_table); | ||
169 | |||
170 | static int __init samsungq10_init(void) | ||
171 | { | ||
172 | if (!force && !dmi_check_system(samsungq10_dmi_table)) | ||
173 | return -ENODEV; | ||
174 | |||
175 | samsungq10_device = platform_create_bundle(&samsungq10_driver, | ||
176 | samsungq10_probe, | ||
177 | NULL, 0, NULL, 0); | ||
178 | |||
179 | if (IS_ERR(samsungq10_device)) | ||
180 | return PTR_ERR(samsungq10_device); | ||
181 | |||
182 | return 0; | ||
183 | } | ||
184 | |||
185 | static void __exit samsungq10_exit(void) | ||
186 | { | ||
187 | platform_device_unregister(samsungq10_device); | ||
188 | platform_driver_unregister(&samsungq10_driver); | ||
189 | } | ||
190 | |||
191 | module_init(samsungq10_init); | ||
192 | module_exit(samsungq10_exit); | ||
193 | |||
194 | MODULE_AUTHOR("Frederick van der Wyck <fvanderwyck@gmail.com>"); | ||
195 | MODULE_DESCRIPTION("Samsung Q10 Driver"); | ||
196 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 26c5b117df22..7bd829f247eb 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
@@ -3186,8 +3186,17 @@ static int __init hotkey_init(struct ibm_init_struct *iibm) | |||
3186 | KEY_VENDOR, /* 0x17: Thinkpad/AccessIBM/Lenovo */ | 3186 | KEY_VENDOR, /* 0x17: Thinkpad/AccessIBM/Lenovo */ |
3187 | 3187 | ||
3188 | /* (assignments unknown, please report if found) */ | 3188 | /* (assignments unknown, please report if found) */ |
3189 | KEY_UNKNOWN, KEY_UNKNOWN, | ||
3190 | |||
3191 | /* | ||
3192 | * The mic mute button only sends 0x1a. It does not | ||
3193 | * automatically mute the mic or change the mute light. | ||
3194 | */ | ||
3195 | KEY_MICMUTE, /* 0x1a: Mic mute (since ?400 or so) */ | ||
3196 | |||
3197 | /* (assignments unknown, please report if found) */ | ||
3189 | KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, | 3198 | KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, |
3190 | KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, | 3199 | KEY_UNKNOWN, |
3191 | }, | 3200 | }, |
3192 | }; | 3201 | }; |
3193 | 3202 | ||
diff --git a/drivers/staging/gma500/gem_glue.c b/drivers/staging/gma500/gem_glue.c index 779ac1a12d24..daac12120653 100644 --- a/drivers/staging/gma500/gem_glue.c +++ b/drivers/staging/gma500/gem_glue.c | |||
@@ -20,26 +20,6 @@ | |||
20 | #include <drm/drmP.h> | 20 | #include <drm/drmP.h> |
21 | #include <drm/drm.h> | 21 | #include <drm/drm.h> |
22 | 22 | ||
23 | /** | ||
24 | * Initialize an already allocated GEM object of the specified size with | ||
25 | * no GEM provided backing store. Instead the caller is responsible for | ||
26 | * backing the object and handling it. | ||
27 | */ | ||
28 | int drm_gem_private_object_init(struct drm_device *dev, | ||
29 | struct drm_gem_object *obj, size_t size) | ||
30 | { | ||
31 | BUG_ON((size & (PAGE_SIZE - 1)) != 0); | ||
32 | |||
33 | obj->dev = dev; | ||
34 | obj->filp = NULL; | ||
35 | |||
36 | kref_init(&obj->refcount); | ||
37 | atomic_set(&obj->handle_count, 0); | ||
38 | obj->size = size; | ||
39 | |||
40 | return 0; | ||
41 | } | ||
42 | |||
43 | void drm_gem_object_release_wrap(struct drm_gem_object *obj) | 23 | void drm_gem_object_release_wrap(struct drm_gem_object *obj) |
44 | { | 24 | { |
45 | /* Remove the list map if one is present */ | 25 | /* Remove the list map if one is present */ |
@@ -51,8 +31,7 @@ void drm_gem_object_release_wrap(struct drm_gem_object *obj) | |||
51 | kfree(list->map); | 31 | kfree(list->map); |
52 | list->map = NULL; | 32 | list->map = NULL; |
53 | } | 33 | } |
54 | if (obj->filp) | 34 | drm_gem_object_release(obj); |
55 | drm_gem_object_release(obj); | ||
56 | } | 35 | } |
57 | 36 | ||
58 | /** | 37 | /** |
diff --git a/drivers/staging/gma500/gem_glue.h b/drivers/staging/gma500/gem_glue.h index a0f2bc4e4ae7..ce5ce30f74db 100644 --- a/drivers/staging/gma500/gem_glue.h +++ b/drivers/staging/gma500/gem_glue.h | |||
@@ -1,4 +1,2 @@ | |||
1 | extern void drm_gem_object_release_wrap(struct drm_gem_object *obj); | 1 | extern void drm_gem_object_release_wrap(struct drm_gem_object *obj); |
2 | extern int drm_gem_private_object_init(struct drm_device *dev, | ||
3 | struct drm_gem_object *obj, size_t size); | ||
4 | extern int gem_create_mmap_offset(struct drm_gem_object *obj); | 2 | extern int gem_create_mmap_offset(struct drm_gem_object *obj); |
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index d0a56235c50e..2ec57b2fb278 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c | |||
@@ -1889,7 +1889,7 @@ static int __devinit sci_init_single(struct platform_device *dev, | |||
1889 | 1889 | ||
1890 | if (p->regtype == SCIx_PROBE_REGTYPE) { | 1890 | if (p->regtype == SCIx_PROBE_REGTYPE) { |
1891 | ret = sci_probe_regmap(p); | 1891 | ret = sci_probe_regmap(p); |
1892 | if (unlikely(!ret)) | 1892 | if (unlikely(ret)) |
1893 | return ret; | 1893 | return ret; |
1894 | } | 1894 | } |
1895 | 1895 | ||
diff --git a/drivers/video/savage/savagefb.h b/drivers/video/savage/savagefb.h index 32549d177b19..dcaab9012ca2 100644 --- a/drivers/video/savage/savagefb.h +++ b/drivers/video/savage/savagefb.h | |||
@@ -55,7 +55,7 @@ | |||
55 | 55 | ||
56 | #define S3_SAVAGE3D_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX)) | 56 | #define S3_SAVAGE3D_SERIES(chip) ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX)) |
57 | 57 | ||
58 | #define S3_SAVAGE4_SERIES(chip) ((chip>=S3_SAVAGE4) || (chip<=S3_PROSAVAGEDDR)) | 58 | #define S3_SAVAGE4_SERIES(chip) ((chip>=S3_SAVAGE4) && (chip<=S3_PROSAVAGEDDR)) |
59 | 59 | ||
60 | #define S3_SAVAGE_MOBILE_SERIES(chip) ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE)) | 60 | #define S3_SAVAGE_MOBILE_SERIES(chip) ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE)) |
61 | 61 | ||
diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index f815283667af..5f7ff8e2fc14 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig | |||
@@ -11,7 +11,7 @@ config XEN_BALLOON | |||
11 | 11 | ||
12 | config XEN_SELFBALLOONING | 12 | config XEN_SELFBALLOONING |
13 | bool "Dynamically self-balloon kernel memory to target" | 13 | bool "Dynamically self-balloon kernel memory to target" |
14 | depends on XEN && XEN_BALLOON && CLEANCACHE && SWAP | 14 | depends on XEN && XEN_BALLOON && CLEANCACHE && SWAP && XEN_TMEM |
15 | default n | 15 | default n |
16 | help | 16 | help |
17 | Self-ballooning dynamically balloons available kernel memory driven | 17 | Self-ballooning dynamically balloons available kernel memory driven |
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index 475f9c597cb7..326dc08d3e3f 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h | |||
@@ -39,27 +39,17 @@ | |||
39 | 39 | ||
40 | /* #define DEBUG */ | 40 | /* #define DEBUG */ |
41 | 41 | ||
42 | #ifdef DEBUG | 42 | #define DPRINTK(fmt, ...) \ |
43 | #define DPRINTK(fmt, args...) \ | 43 | pr_debug("pid %d: %s: " fmt "\n", \ |
44 | do { \ | 44 | current->pid, __func__, ##__VA_ARGS__) |
45 | printk(KERN_DEBUG "pid %d: %s: " fmt "\n", \ | 45 | |
46 | current->pid, __func__, ##args); \ | 46 | #define AUTOFS_WARN(fmt, ...) \ |
47 | } while (0) | ||
48 | #else | ||
49 | #define DPRINTK(fmt, args...) do {} while (0) | ||
50 | #endif | ||
51 | |||
52 | #define AUTOFS_WARN(fmt, args...) \ | ||
53 | do { \ | ||
54 | printk(KERN_WARNING "pid %d: %s: " fmt "\n", \ | 47 | printk(KERN_WARNING "pid %d: %s: " fmt "\n", \ |
55 | current->pid, __func__, ##args); \ | 48 | current->pid, __func__, ##__VA_ARGS__) |
56 | } while (0) | ||
57 | 49 | ||
58 | #define AUTOFS_ERROR(fmt, args...) \ | 50 | #define AUTOFS_ERROR(fmt, ...) \ |
59 | do { \ | ||
60 | printk(KERN_ERR "pid %d: %s: " fmt "\n", \ | 51 | printk(KERN_ERR "pid %d: %s: " fmt "\n", \ |
61 | current->pid, __func__, ##args); \ | 52 | current->pid, __func__, ##__VA_ARGS__) |
62 | } while (0) | ||
63 | 53 | ||
64 | /* Unified info structure. This is pointed to by both the dentry and | 54 | /* Unified info structure. This is pointed to by both the dentry and |
65 | inode structures. Each file in the filesystem has an instance of this | 55 | inode structures. Each file in the filesystem has an instance of this |
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index 25435987d6ae..e1fbdeef85db 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c | |||
@@ -104,7 +104,7 @@ static void autofs4_notify_daemon(struct autofs_sb_info *sbi, | |||
104 | size_t pktsz; | 104 | size_t pktsz; |
105 | 105 | ||
106 | DPRINTK("wait id = 0x%08lx, name = %.*s, type=%d", | 106 | DPRINTK("wait id = 0x%08lx, name = %.*s, type=%d", |
107 | wq->wait_queue_token, wq->name.len, wq->name.name, type); | 107 | (unsigned long) wq->wait_queue_token, wq->name.len, wq->name.name, type); |
108 | 108 | ||
109 | memset(&pkt,0,sizeof pkt); /* For security reasons */ | 109 | memset(&pkt,0,sizeof pkt); /* For security reasons */ |
110 | 110 | ||
diff --git a/fs/block_dev.c b/fs/block_dev.c index f28680553288..ff77262e887c 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -387,6 +387,10 @@ int blkdev_fsync(struct file *filp, loff_t start, loff_t end, int datasync) | |||
387 | struct inode *bd_inode = filp->f_mapping->host; | 387 | struct inode *bd_inode = filp->f_mapping->host; |
388 | struct block_device *bdev = I_BDEV(bd_inode); | 388 | struct block_device *bdev = I_BDEV(bd_inode); |
389 | int error; | 389 | int error; |
390 | |||
391 | error = filemap_write_and_wait_range(filp->f_mapping, start, end); | ||
392 | if (error) | ||
393 | return error; | ||
390 | 394 | ||
391 | /* | 395 | /* |
392 | * There is no need to serialise calls to blkdev_issue_flush with | 396 | * There is no need to serialise calls to blkdev_issue_flush with |
diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index 8d8f28c94c0f..6873bb634a97 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c | |||
@@ -141,10 +141,11 @@ char *cifs_compose_mount_options(const char *sb_mountdata, | |||
141 | 141 | ||
142 | rc = dns_resolve_server_name_to_ip(*devname, &srvIP); | 142 | rc = dns_resolve_server_name_to_ip(*devname, &srvIP); |
143 | if (rc < 0) { | 143 | if (rc < 0) { |
144 | cERROR(1, "%s: Failed to resolve server part of %s to IP: %d", | 144 | cFYI(1, "%s: Failed to resolve server part of %s to IP: %d", |
145 | __func__, *devname, rc); | 145 | __func__, *devname, rc); |
146 | goto compose_mount_options_err; | 146 | goto compose_mount_options_err; |
147 | } | 147 | } |
148 | |||
148 | /* md_len = strlen(...) + 12 for 'sep+prefixpath=' | 149 | /* md_len = strlen(...) + 12 for 'sep+prefixpath=' |
149 | * assuming that we have 'unc=' and 'ip=' in | 150 | * assuming that we have 'unc=' and 'ip=' in |
150 | * the original sb_mountdata | 151 | * the original sb_mountdata |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 212e5629cc1d..f93eb948d071 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -563,6 +563,10 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb) | |||
563 | mutex_unlock(&dir->i_mutex); | 563 | mutex_unlock(&dir->i_mutex); |
564 | dput(dentry); | 564 | dput(dentry); |
565 | dentry = child; | 565 | dentry = child; |
566 | if (!dentry->d_inode) { | ||
567 | dput(dentry); | ||
568 | dentry = ERR_PTR(-ENOENT); | ||
569 | } | ||
566 | } while (!IS_ERR(dentry)); | 570 | } while (!IS_ERR(dentry)); |
567 | _FreeXid(xid); | 571 | _FreeXid(xid); |
568 | kfree(full_path); | 572 | kfree(full_path); |
diff --git a/fs/cifs/dns_resolve.c b/fs/cifs/dns_resolve.c index 548f06230a6d..1d2d91d9bf65 100644 --- a/fs/cifs/dns_resolve.c +++ b/fs/cifs/dns_resolve.c | |||
@@ -79,8 +79,8 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) | |||
79 | /* Perform the upcall */ | 79 | /* Perform the upcall */ |
80 | rc = dns_query(NULL, hostname, len, NULL, ip_addr, NULL); | 80 | rc = dns_query(NULL, hostname, len, NULL, ip_addr, NULL); |
81 | if (rc < 0) | 81 | if (rc < 0) |
82 | cERROR(1, "%s: unable to resolve: %*.*s", | 82 | cFYI(1, "%s: unable to resolve: %*.*s", |
83 | __func__, len, len, hostname); | 83 | __func__, len, len, hostname); |
84 | else | 84 | else |
85 | cFYI(1, "%s: resolved: %*.*s to %s", | 85 | cFYI(1, "%s: resolved: %*.*s to %s", |
86 | __func__, len, len, hostname, *ip_addr); | 86 | __func__, len, len, hostname, *ip_addr); |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 9b018c8334fa..a7b2dcd4a53e 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -764,20 +764,10 @@ char *cifs_build_path_to_root(struct smb_vol *vol, struct cifs_sb_info *cifs_sb, | |||
764 | if (full_path == NULL) | 764 | if (full_path == NULL) |
765 | return full_path; | 765 | return full_path; |
766 | 766 | ||
767 | if (dfsplen) { | 767 | if (dfsplen) |
768 | strncpy(full_path, tcon->treeName, dfsplen); | 768 | strncpy(full_path, tcon->treeName, dfsplen); |
769 | /* switch slash direction in prepath depending on whether | ||
770 | * windows or posix style path names | ||
771 | */ | ||
772 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) { | ||
773 | int i; | ||
774 | for (i = 0; i < dfsplen; i++) { | ||
775 | if (full_path[i] == '\\') | ||
776 | full_path[i] = '/'; | ||
777 | } | ||
778 | } | ||
779 | } | ||
780 | strncpy(full_path + dfsplen, vol->prepath, pplen); | 769 | strncpy(full_path + dfsplen, vol->prepath, pplen); |
770 | convert_delimiter(full_path, CIFS_DIR_SEP(cifs_sb)); | ||
781 | full_path[dfsplen + pplen] = 0; /* add trailing null */ | 771 | full_path[dfsplen + pplen] = 0; /* add trailing null */ |
782 | return full_path; | 772 | return full_path; |
783 | } | 773 | } |
diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c index 243d58720513..d3e619692ee0 100644 --- a/fs/cifs/sess.c +++ b/fs/cifs/sess.c | |||
@@ -124,8 +124,7 @@ static __u32 cifs_ssetup_hdr(struct cifs_ses *ses, SESSION_SETUP_ANDX *pSMB) | |||
124 | /* that we use in next few lines */ | 124 | /* that we use in next few lines */ |
125 | /* Note that header is initialized to zero in header_assemble */ | 125 | /* Note that header is initialized to zero in header_assemble */ |
126 | pSMB->req.AndXCommand = 0xFF; | 126 | pSMB->req.AndXCommand = 0xFF; |
127 | pSMB->req.MaxBufferSize = cpu_to_le16(min_t(u32, CIFSMaxBufSize - 4, | 127 | pSMB->req.MaxBufferSize = cpu_to_le16(ses->server->maxBuf); |
128 | USHRT_MAX)); | ||
129 | pSMB->req.MaxMpxCount = cpu_to_le16(ses->server->maxReq); | 128 | pSMB->req.MaxMpxCount = cpu_to_le16(ses->server->maxReq); |
130 | pSMB->req.VcNumber = get_next_vcnum(ses); | 129 | pSMB->req.VcNumber = get_next_vcnum(ses); |
131 | 130 | ||
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 147aa22c3c3a..c1b9c4b10739 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
@@ -362,6 +362,8 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov, | |||
362 | mid = AllocMidQEntry(hdr, server); | 362 | mid = AllocMidQEntry(hdr, server); |
363 | if (mid == NULL) { | 363 | if (mid == NULL) { |
364 | mutex_unlock(&server->srv_mutex); | 364 | mutex_unlock(&server->srv_mutex); |
365 | atomic_dec(&server->inFlight); | ||
366 | wake_up(&server->request_q); | ||
365 | return -ENOMEM; | 367 | return -ENOMEM; |
366 | } | 368 | } |
367 | 369 | ||
diff --git a/fs/dcache.c b/fs/dcache.c index c83cae19161e..a88948b8bd17 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -1729,7 +1729,7 @@ seqretry: | |||
1729 | */ | 1729 | */ |
1730 | if (read_seqcount_retry(&dentry->d_seq, *seq)) | 1730 | if (read_seqcount_retry(&dentry->d_seq, *seq)) |
1731 | goto seqretry; | 1731 | goto seqretry; |
1732 | if (parent->d_flags & DCACHE_OP_COMPARE) { | 1732 | if (unlikely(parent->d_flags & DCACHE_OP_COMPARE)) { |
1733 | if (parent->d_op->d_compare(parent, *inode, | 1733 | if (parent->d_op->d_compare(parent, *inode, |
1734 | dentry, i, | 1734 | dentry, i, |
1735 | tlen, tname, name)) | 1735 | tlen, tname, name)) |
diff --git a/fs/ecryptfs/Kconfig b/fs/ecryptfs/Kconfig index 1cd6d9d3e29a..cc16562654de 100644 --- a/fs/ecryptfs/Kconfig +++ b/fs/ecryptfs/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config ECRYPT_FS | 1 | config ECRYPT_FS |
2 | tristate "eCrypt filesystem layer support (EXPERIMENTAL)" | 2 | tristate "eCrypt filesystem layer support (EXPERIMENTAL)" |
3 | depends on EXPERIMENTAL && KEYS && CRYPTO | 3 | depends on EXPERIMENTAL && KEYS && CRYPTO && (ENCRYPTED_KEYS || ENCRYPTED_KEYS=n) |
4 | select CRYPTO_ECB | 4 | select CRYPTO_ECB |
5 | select CRYPTO_CBC | 5 | select CRYPTO_CBC |
6 | select CRYPTO_MD5 | 6 | select CRYPTO_MD5 |
diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 08a2b52bf565..ac1ad48c2376 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c | |||
@@ -1973,7 +1973,7 @@ pki_encrypt_session_key(struct key *auth_tok_key, | |||
1973 | { | 1973 | { |
1974 | struct ecryptfs_msg_ctx *msg_ctx = NULL; | 1974 | struct ecryptfs_msg_ctx *msg_ctx = NULL; |
1975 | char *payload = NULL; | 1975 | char *payload = NULL; |
1976 | size_t payload_len; | 1976 | size_t payload_len = 0; |
1977 | struct ecryptfs_message *msg; | 1977 | struct ecryptfs_message *msg; |
1978 | int rc; | 1978 | int rc; |
1979 | 1979 | ||
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 9f1bb747d77d..b4a6befb1216 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c | |||
@@ -175,6 +175,7 @@ enum { ecryptfs_opt_sig, ecryptfs_opt_ecryptfs_sig, | |||
175 | ecryptfs_opt_encrypted_view, ecryptfs_opt_fnek_sig, | 175 | ecryptfs_opt_encrypted_view, ecryptfs_opt_fnek_sig, |
176 | ecryptfs_opt_fn_cipher, ecryptfs_opt_fn_cipher_key_bytes, | 176 | ecryptfs_opt_fn_cipher, ecryptfs_opt_fn_cipher_key_bytes, |
177 | ecryptfs_opt_unlink_sigs, ecryptfs_opt_mount_auth_tok_only, | 177 | ecryptfs_opt_unlink_sigs, ecryptfs_opt_mount_auth_tok_only, |
178 | ecryptfs_opt_check_dev_ruid, | ||
178 | ecryptfs_opt_err }; | 179 | ecryptfs_opt_err }; |
179 | 180 | ||
180 | static const match_table_t tokens = { | 181 | static const match_table_t tokens = { |
@@ -191,6 +192,7 @@ static const match_table_t tokens = { | |||
191 | {ecryptfs_opt_fn_cipher_key_bytes, "ecryptfs_fn_key_bytes=%u"}, | 192 | {ecryptfs_opt_fn_cipher_key_bytes, "ecryptfs_fn_key_bytes=%u"}, |
192 | {ecryptfs_opt_unlink_sigs, "ecryptfs_unlink_sigs"}, | 193 | {ecryptfs_opt_unlink_sigs, "ecryptfs_unlink_sigs"}, |
193 | {ecryptfs_opt_mount_auth_tok_only, "ecryptfs_mount_auth_tok_only"}, | 194 | {ecryptfs_opt_mount_auth_tok_only, "ecryptfs_mount_auth_tok_only"}, |
195 | {ecryptfs_opt_check_dev_ruid, "ecryptfs_check_dev_ruid"}, | ||
194 | {ecryptfs_opt_err, NULL} | 196 | {ecryptfs_opt_err, NULL} |
195 | }; | 197 | }; |
196 | 198 | ||
@@ -236,6 +238,7 @@ static void ecryptfs_init_mount_crypt_stat( | |||
236 | * ecryptfs_parse_options | 238 | * ecryptfs_parse_options |
237 | * @sb: The ecryptfs super block | 239 | * @sb: The ecryptfs super block |
238 | * @options: The options passed to the kernel | 240 | * @options: The options passed to the kernel |
241 | * @check_ruid: set to 1 if device uid should be checked against the ruid | ||
239 | * | 242 | * |
240 | * Parse mount options: | 243 | * Parse mount options: |
241 | * debug=N - ecryptfs_verbosity level for debug output | 244 | * debug=N - ecryptfs_verbosity level for debug output |
@@ -251,7 +254,8 @@ static void ecryptfs_init_mount_crypt_stat( | |||
251 | * | 254 | * |
252 | * Returns zero on success; non-zero on error | 255 | * Returns zero on success; non-zero on error |
253 | */ | 256 | */ |
254 | static int ecryptfs_parse_options(struct ecryptfs_sb_info *sbi, char *options) | 257 | static int ecryptfs_parse_options(struct ecryptfs_sb_info *sbi, char *options, |
258 | uid_t *check_ruid) | ||
255 | { | 259 | { |
256 | char *p; | 260 | char *p; |
257 | int rc = 0; | 261 | int rc = 0; |
@@ -276,6 +280,8 @@ static int ecryptfs_parse_options(struct ecryptfs_sb_info *sbi, char *options) | |||
276 | char *cipher_key_bytes_src; | 280 | char *cipher_key_bytes_src; |
277 | char *fn_cipher_key_bytes_src; | 281 | char *fn_cipher_key_bytes_src; |
278 | 282 | ||
283 | *check_ruid = 0; | ||
284 | |||
279 | if (!options) { | 285 | if (!options) { |
280 | rc = -EINVAL; | 286 | rc = -EINVAL; |
281 | goto out; | 287 | goto out; |
@@ -380,6 +386,9 @@ static int ecryptfs_parse_options(struct ecryptfs_sb_info *sbi, char *options) | |||
380 | mount_crypt_stat->flags |= | 386 | mount_crypt_stat->flags |= |
381 | ECRYPTFS_GLOBAL_MOUNT_AUTH_TOK_ONLY; | 387 | ECRYPTFS_GLOBAL_MOUNT_AUTH_TOK_ONLY; |
382 | break; | 388 | break; |
389 | case ecryptfs_opt_check_dev_ruid: | ||
390 | *check_ruid = 1; | ||
391 | break; | ||
383 | case ecryptfs_opt_err: | 392 | case ecryptfs_opt_err: |
384 | default: | 393 | default: |
385 | printk(KERN_WARNING | 394 | printk(KERN_WARNING |
@@ -475,6 +484,7 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags | |||
475 | const char *err = "Getting sb failed"; | 484 | const char *err = "Getting sb failed"; |
476 | struct inode *inode; | 485 | struct inode *inode; |
477 | struct path path; | 486 | struct path path; |
487 | uid_t check_ruid; | ||
478 | int rc; | 488 | int rc; |
479 | 489 | ||
480 | sbi = kmem_cache_zalloc(ecryptfs_sb_info_cache, GFP_KERNEL); | 490 | sbi = kmem_cache_zalloc(ecryptfs_sb_info_cache, GFP_KERNEL); |
@@ -483,7 +493,7 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags | |||
483 | goto out; | 493 | goto out; |
484 | } | 494 | } |
485 | 495 | ||
486 | rc = ecryptfs_parse_options(sbi, raw_data); | 496 | rc = ecryptfs_parse_options(sbi, raw_data, &check_ruid); |
487 | if (rc) { | 497 | if (rc) { |
488 | err = "Error parsing options"; | 498 | err = "Error parsing options"; |
489 | goto out; | 499 | goto out; |
@@ -521,6 +531,15 @@ static struct dentry *ecryptfs_mount(struct file_system_type *fs_type, int flags | |||
521 | "known incompatibilities\n"); | 531 | "known incompatibilities\n"); |
522 | goto out_free; | 532 | goto out_free; |
523 | } | 533 | } |
534 | |||
535 | if (check_ruid && path.dentry->d_inode->i_uid != current_uid()) { | ||
536 | rc = -EPERM; | ||
537 | printk(KERN_ERR "Mount of device (uid: %d) not owned by " | ||
538 | "requested user (uid: %d)\n", | ||
539 | path.dentry->d_inode->i_uid, current_uid()); | ||
540 | goto out_free; | ||
541 | } | ||
542 | |||
524 | ecryptfs_set_superblock_lower(s, path.dentry->d_sb); | 543 | ecryptfs_set_superblock_lower(s, path.dentry->d_sb); |
525 | s->s_maxbytes = path.dentry->d_sb->s_maxbytes; | 544 | s->s_maxbytes = path.dentry->d_sb->s_maxbytes; |
526 | s->s_blocksize = path.dentry->d_sb->s_blocksize; | 545 | s->s_blocksize = path.dentry->d_sb->s_blocksize; |
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index 85d430963116..3745f7c2b9c2 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c | |||
@@ -39,15 +39,16 @@ | |||
39 | int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, | 39 | int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, |
40 | loff_t offset, size_t size) | 40 | loff_t offset, size_t size) |
41 | { | 41 | { |
42 | struct ecryptfs_inode_info *inode_info; | 42 | struct file *lower_file; |
43 | mm_segment_t fs_save; | 43 | mm_segment_t fs_save; |
44 | ssize_t rc; | 44 | ssize_t rc; |
45 | 45 | ||
46 | inode_info = ecryptfs_inode_to_private(ecryptfs_inode); | 46 | lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file; |
47 | BUG_ON(!inode_info->lower_file); | 47 | if (!lower_file) |
48 | return -EIO; | ||
48 | fs_save = get_fs(); | 49 | fs_save = get_fs(); |
49 | set_fs(get_ds()); | 50 | set_fs(get_ds()); |
50 | rc = vfs_write(inode_info->lower_file, data, size, &offset); | 51 | rc = vfs_write(lower_file, data, size, &offset); |
51 | set_fs(fs_save); | 52 | set_fs(fs_save); |
52 | mark_inode_dirty_sync(ecryptfs_inode); | 53 | mark_inode_dirty_sync(ecryptfs_inode); |
53 | return rc; | 54 | return rc; |
@@ -225,15 +226,16 @@ out: | |||
225 | int ecryptfs_read_lower(char *data, loff_t offset, size_t size, | 226 | int ecryptfs_read_lower(char *data, loff_t offset, size_t size, |
226 | struct inode *ecryptfs_inode) | 227 | struct inode *ecryptfs_inode) |
227 | { | 228 | { |
228 | struct ecryptfs_inode_info *inode_info = | 229 | struct file *lower_file; |
229 | ecryptfs_inode_to_private(ecryptfs_inode); | ||
230 | mm_segment_t fs_save; | 230 | mm_segment_t fs_save; |
231 | ssize_t rc; | 231 | ssize_t rc; |
232 | 232 | ||
233 | BUG_ON(!inode_info->lower_file); | 233 | lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file; |
234 | if (!lower_file) | ||
235 | return -EIO; | ||
234 | fs_save = get_fs(); | 236 | fs_save = get_fs(); |
235 | set_fs(get_ds()); | 237 | set_fs(get_ds()); |
236 | rc = vfs_read(inode_info->lower_file, data, size, &offset); | 238 | rc = vfs_read(lower_file, data, size, &offset); |
237 | set_fs(fs_save); | 239 | set_fs(fs_save); |
238 | return rc; | 240 | return rc; |
239 | } | 241 | } |
diff --git a/fs/exofs/Kbuild b/fs/exofs/Kbuild index 2d0f757fda3e..c5a5855a6c44 100644 --- a/fs/exofs/Kbuild +++ b/fs/exofs/Kbuild | |||
@@ -12,5 +12,8 @@ | |||
12 | # Kbuild - Gets included from the Kernels Makefile and build system | 12 | # Kbuild - Gets included from the Kernels Makefile and build system |
13 | # | 13 | # |
14 | 14 | ||
15 | exofs-y := ios.o inode.o file.o symlink.o namei.o dir.o super.o | 15 | # ore module library |
16 | obj-$(CONFIG_ORE) += ore.o | ||
17 | |||
18 | exofs-y := inode.o file.o symlink.o namei.o dir.o super.o | ||
16 | obj-$(CONFIG_EXOFS_FS) += exofs.o | 19 | obj-$(CONFIG_EXOFS_FS) += exofs.o |
diff --git a/fs/exofs/Kconfig b/fs/exofs/Kconfig index 86194b2f799d..70bae4149291 100644 --- a/fs/exofs/Kconfig +++ b/fs/exofs/Kconfig | |||
@@ -1,6 +1,10 @@ | |||
1 | config ORE | ||
2 | tristate | ||
3 | |||
1 | config EXOFS_FS | 4 | config EXOFS_FS |
2 | tristate "exofs: OSD based file system support" | 5 | tristate "exofs: OSD based file system support" |
3 | depends on SCSI_OSD_ULD | 6 | depends on SCSI_OSD_ULD |
7 | select ORE | ||
4 | help | 8 | help |
5 | EXOFS is a file system that uses an OSD storage device, | 9 | EXOFS is a file system that uses an OSD storage device, |
6 | as its backing storage. | 10 | as its backing storage. |
diff --git a/fs/exofs/exofs.h b/fs/exofs/exofs.h index c965806c2821..f4e442ec7445 100644 --- a/fs/exofs/exofs.h +++ b/fs/exofs/exofs.h | |||
@@ -36,12 +36,9 @@ | |||
36 | #include <linux/fs.h> | 36 | #include <linux/fs.h> |
37 | #include <linux/time.h> | 37 | #include <linux/time.h> |
38 | #include <linux/backing-dev.h> | 38 | #include <linux/backing-dev.h> |
39 | #include "common.h" | 39 | #include <scsi/osd_ore.h> |
40 | 40 | ||
41 | /* FIXME: Remove once pnfs hits mainline | 41 | #include "common.h" |
42 | * #include <linux/exportfs/pnfs_osd_xdr.h> | ||
43 | */ | ||
44 | #include "pnfs.h" | ||
45 | 42 | ||
46 | #define EXOFS_ERR(fmt, a...) printk(KERN_ERR "exofs: " fmt, ##a) | 43 | #define EXOFS_ERR(fmt, a...) printk(KERN_ERR "exofs: " fmt, ##a) |
47 | 44 | ||
@@ -56,27 +53,11 @@ | |||
56 | /* u64 has problems with printk this will cast it to unsigned long long */ | 53 | /* u64 has problems with printk this will cast it to unsigned long long */ |
57 | #define _LLU(x) (unsigned long long)(x) | 54 | #define _LLU(x) (unsigned long long)(x) |
58 | 55 | ||
59 | struct exofs_layout { | ||
60 | osd_id s_pid; /* partition ID of file system*/ | ||
61 | |||
62 | /* Our way of looking at the data_map */ | ||
63 | unsigned stripe_unit; | ||
64 | unsigned mirrors_p1; | ||
65 | |||
66 | unsigned group_width; | ||
67 | u64 group_depth; | ||
68 | unsigned group_count; | ||
69 | |||
70 | enum exofs_inode_layout_gen_functions lay_func; | ||
71 | |||
72 | unsigned s_numdevs; /* Num of devices in array */ | ||
73 | struct osd_dev *s_ods[0]; /* Variable length */ | ||
74 | }; | ||
75 | |||
76 | /* | 56 | /* |
77 | * our extension to the in-memory superblock | 57 | * our extension to the in-memory superblock |
78 | */ | 58 | */ |
79 | struct exofs_sb_info { | 59 | struct exofs_sb_info { |
60 | struct backing_dev_info bdi; /* register our bdi with VFS */ | ||
80 | struct exofs_sb_stats s_ess; /* Written often, pre-allocate*/ | 61 | struct exofs_sb_stats s_ess; /* Written often, pre-allocate*/ |
81 | int s_timeout; /* timeout for OSD operations */ | 62 | int s_timeout; /* timeout for OSD operations */ |
82 | uint64_t s_nextid; /* highest object ID used */ | 63 | uint64_t s_nextid; /* highest object ID used */ |
@@ -84,16 +65,13 @@ struct exofs_sb_info { | |||
84 | spinlock_t s_next_gen_lock; /* spinlock for gen # update */ | 65 | spinlock_t s_next_gen_lock; /* spinlock for gen # update */ |
85 | u32 s_next_generation; /* next gen # to use */ | 66 | u32 s_next_generation; /* next gen # to use */ |
86 | atomic_t s_curr_pending; /* number of pending commands */ | 67 | atomic_t s_curr_pending; /* number of pending commands */ |
87 | uint8_t s_cred[OSD_CAP_LEN]; /* credential for the fscb */ | ||
88 | struct backing_dev_info bdi; /* register our bdi with VFS */ | ||
89 | 68 | ||
90 | struct pnfs_osd_data_map data_map; /* Default raid to use | 69 | struct pnfs_osd_data_map data_map; /* Default raid to use |
91 | * FIXME: Needed ? | 70 | * FIXME: Needed ? |
92 | */ | 71 | */ |
93 | /* struct exofs_layout dir_layout;*/ /* Default dir layout */ | 72 | struct ore_layout layout; /* Default files layout */ |
94 | struct exofs_layout layout; /* Default files layout, | 73 | struct ore_comp one_comp; /* id & cred of partition id=0*/ |
95 | * contains the variable osd_dev | 74 | struct ore_components comps; /* comps for the partition */ |
96 | * array. Keep last */ | ||
97 | struct osd_dev *_min_one_dev[1]; /* Place holder for one dev */ | 75 | struct osd_dev *_min_one_dev[1]; /* Place holder for one dev */ |
98 | }; | 76 | }; |
99 | 77 | ||
@@ -107,7 +85,8 @@ struct exofs_i_info { | |||
107 | uint32_t i_data[EXOFS_IDATA];/*short symlink names and device #s*/ | 85 | uint32_t i_data[EXOFS_IDATA];/*short symlink names and device #s*/ |
108 | uint32_t i_dir_start_lookup; /* which page to start lookup */ | 86 | uint32_t i_dir_start_lookup; /* which page to start lookup */ |
109 | uint64_t i_commit_size; /* the object's written length */ | 87 | uint64_t i_commit_size; /* the object's written length */ |
110 | uint8_t i_cred[OSD_CAP_LEN];/* all-powerful credential */ | 88 | struct ore_comp one_comp; /* same component for all devices */ |
89 | struct ore_components comps; /* inode view of the device table */ | ||
111 | }; | 90 | }; |
112 | 91 | ||
113 | static inline osd_id exofs_oi_objno(struct exofs_i_info *oi) | 92 | static inline osd_id exofs_oi_objno(struct exofs_i_info *oi) |
@@ -115,52 +94,6 @@ static inline osd_id exofs_oi_objno(struct exofs_i_info *oi) | |||
115 | return oi->vfs_inode.i_ino + EXOFS_OBJ_OFF; | 94 | return oi->vfs_inode.i_ino + EXOFS_OBJ_OFF; |
116 | } | 95 | } |
117 | 96 | ||
118 | struct exofs_io_state; | ||
119 | typedef void (*exofs_io_done_fn)(struct exofs_io_state *or, void *private); | ||
120 | |||
121 | struct exofs_io_state { | ||
122 | struct kref kref; | ||
123 | |||
124 | void *private; | ||
125 | exofs_io_done_fn done; | ||
126 | |||
127 | struct exofs_layout *layout; | ||
128 | struct osd_obj_id obj; | ||
129 | u8 *cred; | ||
130 | |||
131 | /* Global read/write IO*/ | ||
132 | loff_t offset; | ||
133 | unsigned long length; | ||
134 | void *kern_buff; | ||
135 | |||
136 | struct page **pages; | ||
137 | unsigned nr_pages; | ||
138 | unsigned pgbase; | ||
139 | unsigned pages_consumed; | ||
140 | |||
141 | /* Attributes */ | ||
142 | unsigned in_attr_len; | ||
143 | struct osd_attr *in_attr; | ||
144 | unsigned out_attr_len; | ||
145 | struct osd_attr *out_attr; | ||
146 | |||
147 | /* Variable array of size numdevs */ | ||
148 | unsigned numdevs; | ||
149 | struct exofs_per_dev_state { | ||
150 | struct osd_request *or; | ||
151 | struct bio *bio; | ||
152 | loff_t offset; | ||
153 | unsigned length; | ||
154 | unsigned dev; | ||
155 | } per_dev[]; | ||
156 | }; | ||
157 | |||
158 | static inline unsigned exofs_io_state_size(unsigned numdevs) | ||
159 | { | ||
160 | return sizeof(struct exofs_io_state) + | ||
161 | sizeof(struct exofs_per_dev_state) * numdevs; | ||
162 | } | ||
163 | |||
164 | /* | 97 | /* |
165 | * our inode flags | 98 | * our inode flags |
166 | */ | 99 | */ |
@@ -205,12 +138,6 @@ static inline struct exofs_i_info *exofs_i(struct inode *inode) | |||
205 | } | 138 | } |
206 | 139 | ||
207 | /* | 140 | /* |
208 | * Given a layout, object_number and stripe_index return the associated global | ||
209 | * dev_index | ||
210 | */ | ||
211 | unsigned exofs_layout_od_id(struct exofs_layout *layout, | ||
212 | osd_id obj_no, unsigned layout_index); | ||
213 | /* | ||
214 | * Maximum count of links to a file | 141 | * Maximum count of links to a file |
215 | */ | 142 | */ |
216 | #define EXOFS_LINK_MAX 32000 | 143 | #define EXOFS_LINK_MAX 32000 |
@@ -219,44 +146,8 @@ unsigned exofs_layout_od_id(struct exofs_layout *layout, | |||
219 | * function declarations * | 146 | * function declarations * |
220 | *************************/ | 147 | *************************/ |
221 | 148 | ||
222 | /* ios.c */ | ||
223 | void exofs_make_credential(u8 cred_a[OSD_CAP_LEN], | ||
224 | const struct osd_obj_id *obj); | ||
225 | int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj, | ||
226 | u64 offset, void *p, unsigned length); | ||
227 | |||
228 | int exofs_get_io_state(struct exofs_layout *layout, | ||
229 | struct exofs_io_state **ios); | ||
230 | void exofs_put_io_state(struct exofs_io_state *ios); | ||
231 | |||
232 | int exofs_check_io(struct exofs_io_state *ios, u64 *resid); | ||
233 | |||
234 | int exofs_sbi_create(struct exofs_io_state *ios); | ||
235 | int exofs_sbi_remove(struct exofs_io_state *ios); | ||
236 | int exofs_sbi_write(struct exofs_io_state *ios); | ||
237 | int exofs_sbi_read(struct exofs_io_state *ios); | ||
238 | |||
239 | int extract_attr_from_ios(struct exofs_io_state *ios, struct osd_attr *attr); | ||
240 | |||
241 | int exofs_oi_truncate(struct exofs_i_info *oi, u64 new_len); | ||
242 | static inline int exofs_oi_write(struct exofs_i_info *oi, | ||
243 | struct exofs_io_state *ios) | ||
244 | { | ||
245 | ios->obj.id = exofs_oi_objno(oi); | ||
246 | ios->cred = oi->i_cred; | ||
247 | return exofs_sbi_write(ios); | ||
248 | } | ||
249 | |||
250 | static inline int exofs_oi_read(struct exofs_i_info *oi, | ||
251 | struct exofs_io_state *ios) | ||
252 | { | ||
253 | ios->obj.id = exofs_oi_objno(oi); | ||
254 | ios->cred = oi->i_cred; | ||
255 | return exofs_sbi_read(ios); | ||
256 | } | ||
257 | |||
258 | /* inode.c */ | 149 | /* inode.c */ |
259 | unsigned exofs_max_io_pages(struct exofs_layout *layout, | 150 | unsigned exofs_max_io_pages(struct ore_layout *layout, |
260 | unsigned expected_pages); | 151 | unsigned expected_pages); |
261 | int exofs_setattr(struct dentry *, struct iattr *); | 152 | int exofs_setattr(struct dentry *, struct iattr *); |
262 | int exofs_write_begin(struct file *file, struct address_space *mapping, | 153 | int exofs_write_begin(struct file *file, struct address_space *mapping, |
@@ -281,6 +172,8 @@ int exofs_set_link(struct inode *, struct exofs_dir_entry *, struct page *, | |||
281 | struct inode *); | 172 | struct inode *); |
282 | 173 | ||
283 | /* super.c */ | 174 | /* super.c */ |
175 | void exofs_make_credential(u8 cred_a[OSD_CAP_LEN], | ||
176 | const struct osd_obj_id *obj); | ||
284 | int exofs_sbi_write_stats(struct exofs_sb_info *sbi); | 177 | int exofs_sbi_write_stats(struct exofs_sb_info *sbi); |
285 | 178 | ||
286 | /********************* | 179 | /********************* |
@@ -295,7 +188,6 @@ extern const struct file_operations exofs_file_operations; | |||
295 | 188 | ||
296 | /* inode.c */ | 189 | /* inode.c */ |
297 | extern const struct address_space_operations exofs_aops; | 190 | extern const struct address_space_operations exofs_aops; |
298 | extern const struct osd_attr g_attr_logical_length; | ||
299 | 191 | ||
300 | /* namei.c */ | 192 | /* namei.c */ |
301 | extern const struct inode_operations exofs_dir_inode_operations; | 193 | extern const struct inode_operations exofs_dir_inode_operations; |
@@ -305,4 +197,33 @@ extern const struct inode_operations exofs_special_inode_operations; | |||
305 | extern const struct inode_operations exofs_symlink_inode_operations; | 197 | extern const struct inode_operations exofs_symlink_inode_operations; |
306 | extern const struct inode_operations exofs_fast_symlink_inode_operations; | 198 | extern const struct inode_operations exofs_fast_symlink_inode_operations; |
307 | 199 | ||
200 | /* exofs_init_comps will initialize an ore_components device array | ||
201 | * pointing to a single ore_comp struct, and a round-robin view | ||
202 | * of the device table. | ||
203 | * The first device of each inode is the [inode->ino % num_devices] | ||
204 | * and the rest of the devices sequentially following where the | ||
205 | * first device is after the last device. | ||
206 | * It is assumed that the global device array at @sbi is twice | ||
207 | * bigger and that the device table repeats twice. | ||
208 | * See: exofs_read_lookup_dev_table() | ||
209 | */ | ||
210 | static inline void exofs_init_comps(struct ore_components *comps, | ||
211 | struct ore_comp *one_comp, | ||
212 | struct exofs_sb_info *sbi, osd_id oid) | ||
213 | { | ||
214 | unsigned dev_mod = (unsigned)oid, first_dev; | ||
215 | |||
216 | one_comp->obj.partition = sbi->one_comp.obj.partition; | ||
217 | one_comp->obj.id = oid; | ||
218 | exofs_make_credential(one_comp->cred, &one_comp->obj); | ||
219 | |||
220 | comps->numdevs = sbi->comps.numdevs; | ||
221 | comps->single_comp = EC_SINGLE_COMP; | ||
222 | comps->comps = one_comp; | ||
223 | |||
224 | /* Round robin device view of the table */ | ||
225 | first_dev = (dev_mod * sbi->layout.mirrors_p1) % sbi->comps.numdevs; | ||
226 | comps->ods = sbi->comps.ods + first_dev; | ||
227 | } | ||
228 | |||
308 | #endif | 229 | #endif |
diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c index 8472c098445d..f39a38fc2349 100644 --- a/fs/exofs/inode.c +++ b/fs/exofs/inode.c | |||
@@ -43,7 +43,7 @@ enum { BIO_MAX_PAGES_KMALLOC = | |||
43 | PAGE_SIZE / sizeof(struct page *), | 43 | PAGE_SIZE / sizeof(struct page *), |
44 | }; | 44 | }; |
45 | 45 | ||
46 | unsigned exofs_max_io_pages(struct exofs_layout *layout, | 46 | unsigned exofs_max_io_pages(struct ore_layout *layout, |
47 | unsigned expected_pages) | 47 | unsigned expected_pages) |
48 | { | 48 | { |
49 | unsigned pages = min_t(unsigned, expected_pages, MAX_PAGES_KMALLOC); | 49 | unsigned pages = min_t(unsigned, expected_pages, MAX_PAGES_KMALLOC); |
@@ -58,7 +58,7 @@ struct page_collect { | |||
58 | struct exofs_sb_info *sbi; | 58 | struct exofs_sb_info *sbi; |
59 | struct inode *inode; | 59 | struct inode *inode; |
60 | unsigned expected_pages; | 60 | unsigned expected_pages; |
61 | struct exofs_io_state *ios; | 61 | struct ore_io_state *ios; |
62 | 62 | ||
63 | struct page **pages; | 63 | struct page **pages; |
64 | unsigned alloc_pages; | 64 | unsigned alloc_pages; |
@@ -110,13 +110,6 @@ static int pcol_try_alloc(struct page_collect *pcol) | |||
110 | { | 110 | { |
111 | unsigned pages; | 111 | unsigned pages; |
112 | 112 | ||
113 | if (!pcol->ios) { /* First time allocate io_state */ | ||
114 | int ret = exofs_get_io_state(&pcol->sbi->layout, &pcol->ios); | ||
115 | |||
116 | if (ret) | ||
117 | return ret; | ||
118 | } | ||
119 | |||
120 | /* TODO: easily support bio chaining */ | 113 | /* TODO: easily support bio chaining */ |
121 | pages = exofs_max_io_pages(&pcol->sbi->layout, pcol->expected_pages); | 114 | pages = exofs_max_io_pages(&pcol->sbi->layout, pcol->expected_pages); |
122 | 115 | ||
@@ -140,7 +133,7 @@ static void pcol_free(struct page_collect *pcol) | |||
140 | pcol->pages = NULL; | 133 | pcol->pages = NULL; |
141 | 134 | ||
142 | if (pcol->ios) { | 135 | if (pcol->ios) { |
143 | exofs_put_io_state(pcol->ios); | 136 | ore_put_io_state(pcol->ios); |
144 | pcol->ios = NULL; | 137 | pcol->ios = NULL; |
145 | } | 138 | } |
146 | } | 139 | } |
@@ -200,7 +193,7 @@ static int __readpages_done(struct page_collect *pcol) | |||
200 | u64 resid; | 193 | u64 resid; |
201 | u64 good_bytes; | 194 | u64 good_bytes; |
202 | u64 length = 0; | 195 | u64 length = 0; |
203 | int ret = exofs_check_io(pcol->ios, &resid); | 196 | int ret = ore_check_io(pcol->ios, &resid); |
204 | 197 | ||
205 | if (likely(!ret)) | 198 | if (likely(!ret)) |
206 | good_bytes = pcol->length; | 199 | good_bytes = pcol->length; |
@@ -241,7 +234,7 @@ static int __readpages_done(struct page_collect *pcol) | |||
241 | } | 234 | } |
242 | 235 | ||
243 | /* callback of async reads */ | 236 | /* callback of async reads */ |
244 | static void readpages_done(struct exofs_io_state *ios, void *p) | 237 | static void readpages_done(struct ore_io_state *ios, void *p) |
245 | { | 238 | { |
246 | struct page_collect *pcol = p; | 239 | struct page_collect *pcol = p; |
247 | 240 | ||
@@ -269,20 +262,28 @@ static void _unlock_pcol_pages(struct page_collect *pcol, int ret, int rw) | |||
269 | static int read_exec(struct page_collect *pcol) | 262 | static int read_exec(struct page_collect *pcol) |
270 | { | 263 | { |
271 | struct exofs_i_info *oi = exofs_i(pcol->inode); | 264 | struct exofs_i_info *oi = exofs_i(pcol->inode); |
272 | struct exofs_io_state *ios = pcol->ios; | 265 | struct ore_io_state *ios; |
273 | struct page_collect *pcol_copy = NULL; | 266 | struct page_collect *pcol_copy = NULL; |
274 | int ret; | 267 | int ret; |
275 | 268 | ||
276 | if (!pcol->pages) | 269 | if (!pcol->pages) |
277 | return 0; | 270 | return 0; |
278 | 271 | ||
272 | if (!pcol->ios) { | ||
273 | int ret = ore_get_rw_state(&pcol->sbi->layout, &oi->comps, true, | ||
274 | pcol->pg_first << PAGE_CACHE_SHIFT, | ||
275 | pcol->length, &pcol->ios); | ||
276 | |||
277 | if (ret) | ||
278 | return ret; | ||
279 | } | ||
280 | |||
281 | ios = pcol->ios; | ||
279 | ios->pages = pcol->pages; | 282 | ios->pages = pcol->pages; |
280 | ios->nr_pages = pcol->nr_pages; | 283 | ios->nr_pages = pcol->nr_pages; |
281 | ios->length = pcol->length; | ||
282 | ios->offset = pcol->pg_first << PAGE_CACHE_SHIFT; | ||
283 | 284 | ||
284 | if (pcol->read_4_write) { | 285 | if (pcol->read_4_write) { |
285 | exofs_oi_read(oi, pcol->ios); | 286 | ore_read(pcol->ios); |
286 | return __readpages_done(pcol); | 287 | return __readpages_done(pcol); |
287 | } | 288 | } |
288 | 289 | ||
@@ -295,14 +296,14 @@ static int read_exec(struct page_collect *pcol) | |||
295 | *pcol_copy = *pcol; | 296 | *pcol_copy = *pcol; |
296 | ios->done = readpages_done; | 297 | ios->done = readpages_done; |
297 | ios->private = pcol_copy; | 298 | ios->private = pcol_copy; |
298 | ret = exofs_oi_read(oi, ios); | 299 | ret = ore_read(ios); |
299 | if (unlikely(ret)) | 300 | if (unlikely(ret)) |
300 | goto err; | 301 | goto err; |
301 | 302 | ||
302 | atomic_inc(&pcol->sbi->s_curr_pending); | 303 | atomic_inc(&pcol->sbi->s_curr_pending); |
303 | 304 | ||
304 | EXOFS_DBGMSG2("read_exec obj=0x%llx start=0x%llx length=0x%lx\n", | 305 | EXOFS_DBGMSG2("read_exec obj=0x%llx start=0x%llx length=0x%lx\n", |
305 | ios->obj.id, _LLU(ios->offset), pcol->length); | 306 | oi->one_comp.obj.id, _LLU(ios->offset), pcol->length); |
306 | 307 | ||
307 | /* pages ownership was passed to pcol_copy */ | 308 | /* pages ownership was passed to pcol_copy */ |
308 | _pcol_reset(pcol); | 309 | _pcol_reset(pcol); |
@@ -457,14 +458,14 @@ static int exofs_readpage(struct file *file, struct page *page) | |||
457 | } | 458 | } |
458 | 459 | ||
459 | /* Callback for osd_write. All writes are asynchronous */ | 460 | /* Callback for osd_write. All writes are asynchronous */ |
460 | static void writepages_done(struct exofs_io_state *ios, void *p) | 461 | static void writepages_done(struct ore_io_state *ios, void *p) |
461 | { | 462 | { |
462 | struct page_collect *pcol = p; | 463 | struct page_collect *pcol = p; |
463 | int i; | 464 | int i; |
464 | u64 resid; | 465 | u64 resid; |
465 | u64 good_bytes; | 466 | u64 good_bytes; |
466 | u64 length = 0; | 467 | u64 length = 0; |
467 | int ret = exofs_check_io(ios, &resid); | 468 | int ret = ore_check_io(ios, &resid); |
468 | 469 | ||
469 | atomic_dec(&pcol->sbi->s_curr_pending); | 470 | atomic_dec(&pcol->sbi->s_curr_pending); |
470 | 471 | ||
@@ -507,13 +508,21 @@ static void writepages_done(struct exofs_io_state *ios, void *p) | |||
507 | static int write_exec(struct page_collect *pcol) | 508 | static int write_exec(struct page_collect *pcol) |
508 | { | 509 | { |
509 | struct exofs_i_info *oi = exofs_i(pcol->inode); | 510 | struct exofs_i_info *oi = exofs_i(pcol->inode); |
510 | struct exofs_io_state *ios = pcol->ios; | 511 | struct ore_io_state *ios; |
511 | struct page_collect *pcol_copy = NULL; | 512 | struct page_collect *pcol_copy = NULL; |
512 | int ret; | 513 | int ret; |
513 | 514 | ||
514 | if (!pcol->pages) | 515 | if (!pcol->pages) |
515 | return 0; | 516 | return 0; |
516 | 517 | ||
518 | BUG_ON(pcol->ios); | ||
519 | ret = ore_get_rw_state(&pcol->sbi->layout, &oi->comps, false, | ||
520 | pcol->pg_first << PAGE_CACHE_SHIFT, | ||
521 | pcol->length, &pcol->ios); | ||
522 | |||
523 | if (unlikely(ret)) | ||
524 | goto err; | ||
525 | |||
517 | pcol_copy = kmalloc(sizeof(*pcol_copy), GFP_KERNEL); | 526 | pcol_copy = kmalloc(sizeof(*pcol_copy), GFP_KERNEL); |
518 | if (!pcol_copy) { | 527 | if (!pcol_copy) { |
519 | EXOFS_ERR("write_exec: Failed to kmalloc(pcol)\n"); | 528 | EXOFS_ERR("write_exec: Failed to kmalloc(pcol)\n"); |
@@ -523,16 +532,15 @@ static int write_exec(struct page_collect *pcol) | |||
523 | 532 | ||
524 | *pcol_copy = *pcol; | 533 | *pcol_copy = *pcol; |
525 | 534 | ||
535 | ios = pcol->ios; | ||
526 | ios->pages = pcol_copy->pages; | 536 | ios->pages = pcol_copy->pages; |
527 | ios->nr_pages = pcol_copy->nr_pages; | 537 | ios->nr_pages = pcol_copy->nr_pages; |
528 | ios->offset = pcol_copy->pg_first << PAGE_CACHE_SHIFT; | ||
529 | ios->length = pcol_copy->length; | ||
530 | ios->done = writepages_done; | 538 | ios->done = writepages_done; |
531 | ios->private = pcol_copy; | 539 | ios->private = pcol_copy; |
532 | 540 | ||
533 | ret = exofs_oi_write(oi, ios); | 541 | ret = ore_write(ios); |
534 | if (unlikely(ret)) { | 542 | if (unlikely(ret)) { |
535 | EXOFS_ERR("write_exec: exofs_oi_write() Failed\n"); | 543 | EXOFS_ERR("write_exec: ore_write() Failed\n"); |
536 | goto err; | 544 | goto err; |
537 | } | 545 | } |
538 | 546 | ||
@@ -844,17 +852,15 @@ static inline int exofs_inode_is_fast_symlink(struct inode *inode) | |||
844 | return S_ISLNK(inode->i_mode) && (oi->i_data[0] != 0); | 852 | return S_ISLNK(inode->i_mode) && (oi->i_data[0] != 0); |
845 | } | 853 | } |
846 | 854 | ||
847 | const struct osd_attr g_attr_logical_length = ATTR_DEF( | ||
848 | OSD_APAGE_OBJECT_INFORMATION, OSD_ATTR_OI_LOGICAL_LENGTH, 8); | ||
849 | |||
850 | static int _do_truncate(struct inode *inode, loff_t newsize) | 855 | static int _do_truncate(struct inode *inode, loff_t newsize) |
851 | { | 856 | { |
852 | struct exofs_i_info *oi = exofs_i(inode); | 857 | struct exofs_i_info *oi = exofs_i(inode); |
858 | struct exofs_sb_info *sbi = inode->i_sb->s_fs_info; | ||
853 | int ret; | 859 | int ret; |
854 | 860 | ||
855 | inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 861 | inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
856 | 862 | ||
857 | ret = exofs_oi_truncate(oi, (u64)newsize); | 863 | ret = ore_truncate(&sbi->layout, &oi->comps, (u64)newsize); |
858 | if (likely(!ret)) | 864 | if (likely(!ret)) |
859 | truncate_setsize(inode, newsize); | 865 | truncate_setsize(inode, newsize); |
860 | 866 | ||
@@ -917,30 +923,26 @@ static int exofs_get_inode(struct super_block *sb, struct exofs_i_info *oi, | |||
917 | [1] = g_attr_inode_file_layout, | 923 | [1] = g_attr_inode_file_layout, |
918 | [2] = g_attr_inode_dir_layout, | 924 | [2] = g_attr_inode_dir_layout, |
919 | }; | 925 | }; |
920 | struct exofs_io_state *ios; | 926 | struct ore_io_state *ios; |
921 | struct exofs_on_disk_inode_layout *layout; | 927 | struct exofs_on_disk_inode_layout *layout; |
922 | int ret; | 928 | int ret; |
923 | 929 | ||
924 | ret = exofs_get_io_state(&sbi->layout, &ios); | 930 | ret = ore_get_io_state(&sbi->layout, &oi->comps, &ios); |
925 | if (unlikely(ret)) { | 931 | if (unlikely(ret)) { |
926 | EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__); | 932 | EXOFS_ERR("%s: ore_get_io_state failed.\n", __func__); |
927 | return ret; | 933 | return ret; |
928 | } | 934 | } |
929 | 935 | ||
930 | ios->obj.id = exofs_oi_objno(oi); | 936 | attrs[1].len = exofs_on_disk_inode_layout_size(sbi->comps.numdevs); |
931 | exofs_make_credential(oi->i_cred, &ios->obj); | 937 | attrs[2].len = exofs_on_disk_inode_layout_size(sbi->comps.numdevs); |
932 | ios->cred = oi->i_cred; | ||
933 | |||
934 | attrs[1].len = exofs_on_disk_inode_layout_size(sbi->layout.s_numdevs); | ||
935 | attrs[2].len = exofs_on_disk_inode_layout_size(sbi->layout.s_numdevs); | ||
936 | 938 | ||
937 | ios->in_attr = attrs; | 939 | ios->in_attr = attrs; |
938 | ios->in_attr_len = ARRAY_SIZE(attrs); | 940 | ios->in_attr_len = ARRAY_SIZE(attrs); |
939 | 941 | ||
940 | ret = exofs_sbi_read(ios); | 942 | ret = ore_read(ios); |
941 | if (unlikely(ret)) { | 943 | if (unlikely(ret)) { |
942 | EXOFS_ERR("object(0x%llx) corrupted, return empty file=>%d\n", | 944 | EXOFS_ERR("object(0x%llx) corrupted, return empty file=>%d\n", |
943 | _LLU(ios->obj.id), ret); | 945 | _LLU(oi->one_comp.obj.id), ret); |
944 | memset(inode, 0, sizeof(*inode)); | 946 | memset(inode, 0, sizeof(*inode)); |
945 | inode->i_mode = 0040000 | (0777 & ~022); | 947 | inode->i_mode = 0040000 | (0777 & ~022); |
946 | /* If object is lost on target we might as well enable it's | 948 | /* If object is lost on target we might as well enable it's |
@@ -990,7 +992,7 @@ static int exofs_get_inode(struct super_block *sb, struct exofs_i_info *oi, | |||
990 | } | 992 | } |
991 | 993 | ||
992 | out: | 994 | out: |
993 | exofs_put_io_state(ios); | 995 | ore_put_io_state(ios); |
994 | return ret; | 996 | return ret; |
995 | } | 997 | } |
996 | 998 | ||
@@ -1016,6 +1018,8 @@ struct inode *exofs_iget(struct super_block *sb, unsigned long ino) | |||
1016 | return inode; | 1018 | return inode; |
1017 | oi = exofs_i(inode); | 1019 | oi = exofs_i(inode); |
1018 | __oi_init(oi); | 1020 | __oi_init(oi); |
1021 | exofs_init_comps(&oi->comps, &oi->one_comp, sb->s_fs_info, | ||
1022 | exofs_oi_objno(oi)); | ||
1019 | 1023 | ||
1020 | /* read the inode from the osd */ | 1024 | /* read the inode from the osd */ |
1021 | ret = exofs_get_inode(sb, oi, &fcb); | 1025 | ret = exofs_get_inode(sb, oi, &fcb); |
@@ -1107,21 +1111,22 @@ int __exofs_wait_obj_created(struct exofs_i_info *oi) | |||
1107 | * set the obj_created flag so that other methods know that the object exists on | 1111 | * set the obj_created flag so that other methods know that the object exists on |
1108 | * the OSD. | 1112 | * the OSD. |
1109 | */ | 1113 | */ |
1110 | static void create_done(struct exofs_io_state *ios, void *p) | 1114 | static void create_done(struct ore_io_state *ios, void *p) |
1111 | { | 1115 | { |
1112 | struct inode *inode = p; | 1116 | struct inode *inode = p; |
1113 | struct exofs_i_info *oi = exofs_i(inode); | 1117 | struct exofs_i_info *oi = exofs_i(inode); |
1114 | struct exofs_sb_info *sbi = inode->i_sb->s_fs_info; | 1118 | struct exofs_sb_info *sbi = inode->i_sb->s_fs_info; |
1115 | int ret; | 1119 | int ret; |
1116 | 1120 | ||
1117 | ret = exofs_check_io(ios, NULL); | 1121 | ret = ore_check_io(ios, NULL); |
1118 | exofs_put_io_state(ios); | 1122 | ore_put_io_state(ios); |
1119 | 1123 | ||
1120 | atomic_dec(&sbi->s_curr_pending); | 1124 | atomic_dec(&sbi->s_curr_pending); |
1121 | 1125 | ||
1122 | if (unlikely(ret)) { | 1126 | if (unlikely(ret)) { |
1123 | EXOFS_ERR("object=0x%llx creation failed in pid=0x%llx", | 1127 | EXOFS_ERR("object=0x%llx creation failed in pid=0x%llx", |
1124 | _LLU(exofs_oi_objno(oi)), _LLU(sbi->layout.s_pid)); | 1128 | _LLU(exofs_oi_objno(oi)), |
1129 | _LLU(oi->one_comp.obj.partition)); | ||
1125 | /*TODO: When FS is corrupted creation can fail, object already | 1130 | /*TODO: When FS is corrupted creation can fail, object already |
1126 | * exist. Get rid of this asynchronous creation, if exist | 1131 | * exist. Get rid of this asynchronous creation, if exist |
1127 | * increment the obj counter and try the next object. Until we | 1132 | * increment the obj counter and try the next object. Until we |
@@ -1140,14 +1145,13 @@ static void create_done(struct exofs_io_state *ios, void *p) | |||
1140 | */ | 1145 | */ |
1141 | struct inode *exofs_new_inode(struct inode *dir, int mode) | 1146 | struct inode *exofs_new_inode(struct inode *dir, int mode) |
1142 | { | 1147 | { |
1143 | struct super_block *sb; | 1148 | struct super_block *sb = dir->i_sb; |
1149 | struct exofs_sb_info *sbi = sb->s_fs_info; | ||
1144 | struct inode *inode; | 1150 | struct inode *inode; |
1145 | struct exofs_i_info *oi; | 1151 | struct exofs_i_info *oi; |
1146 | struct exofs_sb_info *sbi; | 1152 | struct ore_io_state *ios; |
1147 | struct exofs_io_state *ios; | ||
1148 | int ret; | 1153 | int ret; |
1149 | 1154 | ||
1150 | sb = dir->i_sb; | ||
1151 | inode = new_inode(sb); | 1155 | inode = new_inode(sb); |
1152 | if (!inode) | 1156 | if (!inode) |
1153 | return ERR_PTR(-ENOMEM); | 1157 | return ERR_PTR(-ENOMEM); |
@@ -1157,8 +1161,6 @@ struct inode *exofs_new_inode(struct inode *dir, int mode) | |||
1157 | 1161 | ||
1158 | set_obj_2bcreated(oi); | 1162 | set_obj_2bcreated(oi); |
1159 | 1163 | ||
1160 | sbi = sb->s_fs_info; | ||
1161 | |||
1162 | inode->i_mapping->backing_dev_info = sb->s_bdi; | 1164 | inode->i_mapping->backing_dev_info = sb->s_bdi; |
1163 | inode_init_owner(inode, dir, mode); | 1165 | inode_init_owner(inode, dir, mode); |
1164 | inode->i_ino = sbi->s_nextid++; | 1166 | inode->i_ino = sbi->s_nextid++; |
@@ -1170,25 +1172,24 @@ struct inode *exofs_new_inode(struct inode *dir, int mode) | |||
1170 | spin_unlock(&sbi->s_next_gen_lock); | 1172 | spin_unlock(&sbi->s_next_gen_lock); |
1171 | insert_inode_hash(inode); | 1173 | insert_inode_hash(inode); |
1172 | 1174 | ||
1175 | exofs_init_comps(&oi->comps, &oi->one_comp, sb->s_fs_info, | ||
1176 | exofs_oi_objno(oi)); | ||
1173 | exofs_sbi_write_stats(sbi); /* Make sure new sbi->s_nextid is on disk */ | 1177 | exofs_sbi_write_stats(sbi); /* Make sure new sbi->s_nextid is on disk */ |
1174 | 1178 | ||
1175 | mark_inode_dirty(inode); | 1179 | mark_inode_dirty(inode); |
1176 | 1180 | ||
1177 | ret = exofs_get_io_state(&sbi->layout, &ios); | 1181 | ret = ore_get_io_state(&sbi->layout, &oi->comps, &ios); |
1178 | if (unlikely(ret)) { | 1182 | if (unlikely(ret)) { |
1179 | EXOFS_ERR("exofs_new_inode: exofs_get_io_state failed\n"); | 1183 | EXOFS_ERR("exofs_new_inode: ore_get_io_state failed\n"); |
1180 | return ERR_PTR(ret); | 1184 | return ERR_PTR(ret); |
1181 | } | 1185 | } |
1182 | 1186 | ||
1183 | ios->obj.id = exofs_oi_objno(oi); | ||
1184 | exofs_make_credential(oi->i_cred, &ios->obj); | ||
1185 | |||
1186 | ios->done = create_done; | 1187 | ios->done = create_done; |
1187 | ios->private = inode; | 1188 | ios->private = inode; |
1188 | ios->cred = oi->i_cred; | 1189 | |
1189 | ret = exofs_sbi_create(ios); | 1190 | ret = ore_create(ios); |
1190 | if (ret) { | 1191 | if (ret) { |
1191 | exofs_put_io_state(ios); | 1192 | ore_put_io_state(ios); |
1192 | return ERR_PTR(ret); | 1193 | return ERR_PTR(ret); |
1193 | } | 1194 | } |
1194 | atomic_inc(&sbi->s_curr_pending); | 1195 | atomic_inc(&sbi->s_curr_pending); |
@@ -1207,11 +1208,11 @@ struct updatei_args { | |||
1207 | /* | 1208 | /* |
1208 | * Callback function from exofs_update_inode(). | 1209 | * Callback function from exofs_update_inode(). |
1209 | */ | 1210 | */ |
1210 | static void updatei_done(struct exofs_io_state *ios, void *p) | 1211 | static void updatei_done(struct ore_io_state *ios, void *p) |
1211 | { | 1212 | { |
1212 | struct updatei_args *args = p; | 1213 | struct updatei_args *args = p; |
1213 | 1214 | ||
1214 | exofs_put_io_state(ios); | 1215 | ore_put_io_state(ios); |
1215 | 1216 | ||
1216 | atomic_dec(&args->sbi->s_curr_pending); | 1217 | atomic_dec(&args->sbi->s_curr_pending); |
1217 | 1218 | ||
@@ -1227,7 +1228,7 @@ static int exofs_update_inode(struct inode *inode, int do_sync) | |||
1227 | struct exofs_i_info *oi = exofs_i(inode); | 1228 | struct exofs_i_info *oi = exofs_i(inode); |
1228 | struct super_block *sb = inode->i_sb; | 1229 | struct super_block *sb = inode->i_sb; |
1229 | struct exofs_sb_info *sbi = sb->s_fs_info; | 1230 | struct exofs_sb_info *sbi = sb->s_fs_info; |
1230 | struct exofs_io_state *ios; | 1231 | struct ore_io_state *ios; |
1231 | struct osd_attr attr; | 1232 | struct osd_attr attr; |
1232 | struct exofs_fcb *fcb; | 1233 | struct exofs_fcb *fcb; |
1233 | struct updatei_args *args; | 1234 | struct updatei_args *args; |
@@ -1266,9 +1267,9 @@ static int exofs_update_inode(struct inode *inode, int do_sync) | |||
1266 | } else | 1267 | } else |
1267 | memcpy(fcb->i_data, oi->i_data, sizeof(fcb->i_data)); | 1268 | memcpy(fcb->i_data, oi->i_data, sizeof(fcb->i_data)); |
1268 | 1269 | ||
1269 | ret = exofs_get_io_state(&sbi->layout, &ios); | 1270 | ret = ore_get_io_state(&sbi->layout, &oi->comps, &ios); |
1270 | if (unlikely(ret)) { | 1271 | if (unlikely(ret)) { |
1271 | EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__); | 1272 | EXOFS_ERR("%s: ore_get_io_state failed.\n", __func__); |
1272 | goto free_args; | 1273 | goto free_args; |
1273 | } | 1274 | } |
1274 | 1275 | ||
@@ -1285,13 +1286,13 @@ static int exofs_update_inode(struct inode *inode, int do_sync) | |||
1285 | ios->private = args; | 1286 | ios->private = args; |
1286 | } | 1287 | } |
1287 | 1288 | ||
1288 | ret = exofs_oi_write(oi, ios); | 1289 | ret = ore_write(ios); |
1289 | if (!do_sync && !ret) { | 1290 | if (!do_sync && !ret) { |
1290 | atomic_inc(&sbi->s_curr_pending); | 1291 | atomic_inc(&sbi->s_curr_pending); |
1291 | goto out; /* deallocation in updatei_done */ | 1292 | goto out; /* deallocation in updatei_done */ |
1292 | } | 1293 | } |
1293 | 1294 | ||
1294 | exofs_put_io_state(ios); | 1295 | ore_put_io_state(ios); |
1295 | free_args: | 1296 | free_args: |
1296 | kfree(args); | 1297 | kfree(args); |
1297 | out: | 1298 | out: |
@@ -1310,11 +1311,11 @@ int exofs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
1310 | * Callback function from exofs_delete_inode() - don't have much cleaning up to | 1311 | * Callback function from exofs_delete_inode() - don't have much cleaning up to |
1311 | * do. | 1312 | * do. |
1312 | */ | 1313 | */ |
1313 | static void delete_done(struct exofs_io_state *ios, void *p) | 1314 | static void delete_done(struct ore_io_state *ios, void *p) |
1314 | { | 1315 | { |
1315 | struct exofs_sb_info *sbi = p; | 1316 | struct exofs_sb_info *sbi = p; |
1316 | 1317 | ||
1317 | exofs_put_io_state(ios); | 1318 | ore_put_io_state(ios); |
1318 | 1319 | ||
1319 | atomic_dec(&sbi->s_curr_pending); | 1320 | atomic_dec(&sbi->s_curr_pending); |
1320 | } | 1321 | } |
@@ -1329,7 +1330,7 @@ void exofs_evict_inode(struct inode *inode) | |||
1329 | struct exofs_i_info *oi = exofs_i(inode); | 1330 | struct exofs_i_info *oi = exofs_i(inode); |
1330 | struct super_block *sb = inode->i_sb; | 1331 | struct super_block *sb = inode->i_sb; |
1331 | struct exofs_sb_info *sbi = sb->s_fs_info; | 1332 | struct exofs_sb_info *sbi = sb->s_fs_info; |
1332 | struct exofs_io_state *ios; | 1333 | struct ore_io_state *ios; |
1333 | int ret; | 1334 | int ret; |
1334 | 1335 | ||
1335 | truncate_inode_pages(&inode->i_data, 0); | 1336 | truncate_inode_pages(&inode->i_data, 0); |
@@ -1349,20 +1350,19 @@ void exofs_evict_inode(struct inode *inode) | |||
1349 | /* ignore the error, attempt a remove anyway */ | 1350 | /* ignore the error, attempt a remove anyway */ |
1350 | 1351 | ||
1351 | /* Now Remove the OSD objects */ | 1352 | /* Now Remove the OSD objects */ |
1352 | ret = exofs_get_io_state(&sbi->layout, &ios); | 1353 | ret = ore_get_io_state(&sbi->layout, &oi->comps, &ios); |
1353 | if (unlikely(ret)) { | 1354 | if (unlikely(ret)) { |
1354 | EXOFS_ERR("%s: exofs_get_io_state failed\n", __func__); | 1355 | EXOFS_ERR("%s: ore_get_io_state failed\n", __func__); |
1355 | return; | 1356 | return; |
1356 | } | 1357 | } |
1357 | 1358 | ||
1358 | ios->obj.id = exofs_oi_objno(oi); | ||
1359 | ios->done = delete_done; | 1359 | ios->done = delete_done; |
1360 | ios->private = sbi; | 1360 | ios->private = sbi; |
1361 | ios->cred = oi->i_cred; | 1361 | |
1362 | ret = exofs_sbi_remove(ios); | 1362 | ret = ore_remove(ios); |
1363 | if (ret) { | 1363 | if (ret) { |
1364 | EXOFS_ERR("%s: exofs_sbi_remove failed\n", __func__); | 1364 | EXOFS_ERR("%s: ore_remove failed\n", __func__); |
1365 | exofs_put_io_state(ios); | 1365 | ore_put_io_state(ios); |
1366 | return; | 1366 | return; |
1367 | } | 1367 | } |
1368 | atomic_inc(&sbi->s_curr_pending); | 1368 | atomic_inc(&sbi->s_curr_pending); |
diff --git a/fs/exofs/ios.c b/fs/exofs/ore.c index f74a2ec027a6..25305af88198 100644 --- a/fs/exofs/ios.c +++ b/fs/exofs/ore.c | |||
@@ -23,81 +23,87 @@ | |||
23 | */ | 23 | */ |
24 | 24 | ||
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <scsi/scsi_device.h> | ||
27 | #include <asm/div64.h> | 26 | #include <asm/div64.h> |
28 | 27 | ||
29 | #include "exofs.h" | 28 | #include <scsi/osd_ore.h> |
30 | 29 | ||
31 | #define EXOFS_DBGMSG2(M...) do {} while (0) | 30 | #define ORE_ERR(fmt, a...) printk(KERN_ERR "ore: " fmt, ##a) |
32 | /* #define EXOFS_DBGMSG2 EXOFS_DBGMSG */ | ||
33 | 31 | ||
34 | void exofs_make_credential(u8 cred_a[OSD_CAP_LEN], const struct osd_obj_id *obj) | 32 | #ifdef CONFIG_EXOFS_DEBUG |
35 | { | 33 | #define ORE_DBGMSG(fmt, a...) \ |
36 | osd_sec_init_nosec_doall_caps(cred_a, obj, false, true); | 34 | printk(KERN_NOTICE "ore @%s:%d: " fmt, __func__, __LINE__, ##a) |
37 | } | 35 | #else |
36 | #define ORE_DBGMSG(fmt, a...) \ | ||
37 | do { if (0) printk(fmt, ##a); } while (0) | ||
38 | #endif | ||
38 | 39 | ||
39 | int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj, | 40 | /* u64 has problems with printk this will cast it to unsigned long long */ |
40 | u64 offset, void *p, unsigned length) | 41 | #define _LLU(x) (unsigned long long)(x) |
41 | { | ||
42 | struct osd_request *or = osd_start_request(od, GFP_KERNEL); | ||
43 | /* struct osd_sense_info osi = {.key = 0};*/ | ||
44 | int ret; | ||
45 | 42 | ||
46 | if (unlikely(!or)) { | 43 | #define ORE_DBGMSG2(M...) do {} while (0) |
47 | EXOFS_DBGMSG("%s: osd_start_request failed.\n", __func__); | 44 | /* #define ORE_DBGMSG2 ORE_DBGMSG */ |
48 | return -ENOMEM; | ||
49 | } | ||
50 | ret = osd_req_read_kern(or, obj, offset, p, length); | ||
51 | if (unlikely(ret)) { | ||
52 | EXOFS_DBGMSG("%s: osd_req_read_kern failed.\n", __func__); | ||
53 | goto out; | ||
54 | } | ||
55 | 45 | ||
56 | ret = osd_finalize_request(or, 0, cred, NULL); | 46 | MODULE_AUTHOR("Boaz Harrosh <bharrosh@panasas.com>"); |
57 | if (unlikely(ret)) { | 47 | MODULE_DESCRIPTION("Objects Raid Engine ore.ko"); |
58 | EXOFS_DBGMSG("Failed to osd_finalize_request() => %d\n", ret); | 48 | MODULE_LICENSE("GPL"); |
59 | goto out; | ||
60 | } | ||
61 | 49 | ||
62 | ret = osd_execute_request(or); | 50 | static u8 *_ios_cred(struct ore_io_state *ios, unsigned index) |
63 | if (unlikely(ret)) | 51 | { |
64 | EXOFS_DBGMSG("osd_execute_request() => %d\n", ret); | 52 | return ios->comps->comps[index & ios->comps->single_comp].cred; |
65 | /* osd_req_decode_sense(or, ret); */ | 53 | } |
66 | 54 | ||
67 | out: | 55 | static struct osd_obj_id *_ios_obj(struct ore_io_state *ios, unsigned index) |
68 | osd_end_request(or); | 56 | { |
69 | return ret; | 57 | return &ios->comps->comps[index & ios->comps->single_comp].obj; |
70 | } | 58 | } |
71 | 59 | ||
72 | int exofs_get_io_state(struct exofs_layout *layout, | 60 | static struct osd_dev *_ios_od(struct ore_io_state *ios, unsigned index) |
73 | struct exofs_io_state **pios) | ||
74 | { | 61 | { |
75 | struct exofs_io_state *ios; | 62 | return ios->comps->ods[index]; |
63 | } | ||
64 | |||
65 | int ore_get_rw_state(struct ore_layout *layout, struct ore_components *comps, | ||
66 | bool is_reading, u64 offset, u64 length, | ||
67 | struct ore_io_state **pios) | ||
68 | { | ||
69 | struct ore_io_state *ios; | ||
76 | 70 | ||
77 | /*TODO: Maybe use kmem_cach per sbi of size | 71 | /*TODO: Maybe use kmem_cach per sbi of size |
78 | * exofs_io_state_size(layout->s_numdevs) | 72 | * exofs_io_state_size(layout->s_numdevs) |
79 | */ | 73 | */ |
80 | ios = kzalloc(exofs_io_state_size(layout->s_numdevs), GFP_KERNEL); | 74 | ios = kzalloc(ore_io_state_size(comps->numdevs), GFP_KERNEL); |
81 | if (unlikely(!ios)) { | 75 | if (unlikely(!ios)) { |
82 | EXOFS_DBGMSG("Failed kzalloc bytes=%d\n", | 76 | ORE_DBGMSG("Failed kzalloc bytes=%d\n", |
83 | exofs_io_state_size(layout->s_numdevs)); | 77 | ore_io_state_size(comps->numdevs)); |
84 | *pios = NULL; | 78 | *pios = NULL; |
85 | return -ENOMEM; | 79 | return -ENOMEM; |
86 | } | 80 | } |
87 | 81 | ||
88 | ios->layout = layout; | 82 | ios->layout = layout; |
89 | ios->obj.partition = layout->s_pid; | 83 | ios->comps = comps; |
84 | ios->offset = offset; | ||
85 | ios->length = length; | ||
86 | ios->reading = is_reading; | ||
87 | |||
90 | *pios = ios; | 88 | *pios = ios; |
91 | return 0; | 89 | return 0; |
92 | } | 90 | } |
91 | EXPORT_SYMBOL(ore_get_rw_state); | ||
92 | |||
93 | int ore_get_io_state(struct ore_layout *layout, struct ore_components *comps, | ||
94 | struct ore_io_state **ios) | ||
95 | { | ||
96 | return ore_get_rw_state(layout, comps, true, 0, 0, ios); | ||
97 | } | ||
98 | EXPORT_SYMBOL(ore_get_io_state); | ||
93 | 99 | ||
94 | void exofs_put_io_state(struct exofs_io_state *ios) | 100 | void ore_put_io_state(struct ore_io_state *ios) |
95 | { | 101 | { |
96 | if (ios) { | 102 | if (ios) { |
97 | unsigned i; | 103 | unsigned i; |
98 | 104 | ||
99 | for (i = 0; i < ios->numdevs; i++) { | 105 | for (i = 0; i < ios->numdevs; i++) { |
100 | struct exofs_per_dev_state *per_dev = &ios->per_dev[i]; | 106 | struct ore_per_dev_state *per_dev = &ios->per_dev[i]; |
101 | 107 | ||
102 | if (per_dev->or) | 108 | if (per_dev->or) |
103 | osd_end_request(per_dev->or); | 109 | osd_end_request(per_dev->or); |
@@ -108,31 +114,9 @@ void exofs_put_io_state(struct exofs_io_state *ios) | |||
108 | kfree(ios); | 114 | kfree(ios); |
109 | } | 115 | } |
110 | } | 116 | } |
117 | EXPORT_SYMBOL(ore_put_io_state); | ||
111 | 118 | ||
112 | unsigned exofs_layout_od_id(struct exofs_layout *layout, | 119 | static void _sync_done(struct ore_io_state *ios, void *p) |
113 | osd_id obj_no, unsigned layout_index) | ||
114 | { | ||
115 | /* switch (layout->lay_func) { | ||
116 | case LAYOUT_MOVING_WINDOW: | ||
117 | {*/ | ||
118 | unsigned dev_mod = obj_no; | ||
119 | |||
120 | return (layout_index + dev_mod * layout->mirrors_p1) % | ||
121 | layout->s_numdevs; | ||
122 | /* } | ||
123 | case LAYOUT_FUNC_IMPLICT: | ||
124 | return layout->devs[layout_index]; | ||
125 | }*/ | ||
126 | } | ||
127 | |||
128 | static inline struct osd_dev *exofs_ios_od(struct exofs_io_state *ios, | ||
129 | unsigned layout_index) | ||
130 | { | ||
131 | return ios->layout->s_ods[ | ||
132 | exofs_layout_od_id(ios->layout, ios->obj.id, layout_index)]; | ||
133 | } | ||
134 | |||
135 | static void _sync_done(struct exofs_io_state *ios, void *p) | ||
136 | { | 120 | { |
137 | struct completion *waiting = p; | 121 | struct completion *waiting = p; |
138 | 122 | ||
@@ -141,20 +125,20 @@ static void _sync_done(struct exofs_io_state *ios, void *p) | |||
141 | 125 | ||
142 | static void _last_io(struct kref *kref) | 126 | static void _last_io(struct kref *kref) |
143 | { | 127 | { |
144 | struct exofs_io_state *ios = container_of( | 128 | struct ore_io_state *ios = container_of( |
145 | kref, struct exofs_io_state, kref); | 129 | kref, struct ore_io_state, kref); |
146 | 130 | ||
147 | ios->done(ios, ios->private); | 131 | ios->done(ios, ios->private); |
148 | } | 132 | } |
149 | 133 | ||
150 | static void _done_io(struct osd_request *or, void *p) | 134 | static void _done_io(struct osd_request *or, void *p) |
151 | { | 135 | { |
152 | struct exofs_io_state *ios = p; | 136 | struct ore_io_state *ios = p; |
153 | 137 | ||
154 | kref_put(&ios->kref, _last_io); | 138 | kref_put(&ios->kref, _last_io); |
155 | } | 139 | } |
156 | 140 | ||
157 | static int exofs_io_execute(struct exofs_io_state *ios) | 141 | static int ore_io_execute(struct ore_io_state *ios) |
158 | { | 142 | { |
159 | DECLARE_COMPLETION_ONSTACK(wait); | 143 | DECLARE_COMPLETION_ONSTACK(wait); |
160 | bool sync = (ios->done == NULL); | 144 | bool sync = (ios->done == NULL); |
@@ -170,9 +154,9 @@ static int exofs_io_execute(struct exofs_io_state *ios) | |||
170 | if (unlikely(!or)) | 154 | if (unlikely(!or)) |
171 | continue; | 155 | continue; |
172 | 156 | ||
173 | ret = osd_finalize_request(or, 0, ios->cred, NULL); | 157 | ret = osd_finalize_request(or, 0, _ios_cred(ios, i), NULL); |
174 | if (unlikely(ret)) { | 158 | if (unlikely(ret)) { |
175 | EXOFS_DBGMSG("Failed to osd_finalize_request() => %d\n", | 159 | ORE_DBGMSG("Failed to osd_finalize_request() => %d\n", |
176 | ret); | 160 | ret); |
177 | return ret; | 161 | return ret; |
178 | } | 162 | } |
@@ -194,7 +178,7 @@ static int exofs_io_execute(struct exofs_io_state *ios) | |||
194 | 178 | ||
195 | if (sync) { | 179 | if (sync) { |
196 | wait_for_completion(&wait); | 180 | wait_for_completion(&wait); |
197 | ret = exofs_check_io(ios, NULL); | 181 | ret = ore_check_io(ios, NULL); |
198 | } | 182 | } |
199 | return ret; | 183 | return ret; |
200 | } | 184 | } |
@@ -214,7 +198,7 @@ static void _clear_bio(struct bio *bio) | |||
214 | } | 198 | } |
215 | } | 199 | } |
216 | 200 | ||
217 | int exofs_check_io(struct exofs_io_state *ios, u64 *resid) | 201 | int ore_check_io(struct ore_io_state *ios, u64 *resid) |
218 | { | 202 | { |
219 | enum osd_err_priority acumulated_osd_err = 0; | 203 | enum osd_err_priority acumulated_osd_err = 0; |
220 | int acumulated_lin_err = 0; | 204 | int acumulated_lin_err = 0; |
@@ -235,7 +219,7 @@ int exofs_check_io(struct exofs_io_state *ios, u64 *resid) | |||
235 | if (OSD_ERR_PRI_CLEAR_PAGES == osi.osd_err_pri) { | 219 | if (OSD_ERR_PRI_CLEAR_PAGES == osi.osd_err_pri) { |
236 | /* start read offset passed endof file */ | 220 | /* start read offset passed endof file */ |
237 | _clear_bio(ios->per_dev[i].bio); | 221 | _clear_bio(ios->per_dev[i].bio); |
238 | EXOFS_DBGMSG("start read offset passed end of file " | 222 | ORE_DBGMSG("start read offset passed end of file " |
239 | "offset=0x%llx, length=0x%llx\n", | 223 | "offset=0x%llx, length=0x%llx\n", |
240 | _LLU(ios->per_dev[i].offset), | 224 | _LLU(ios->per_dev[i].offset), |
241 | _LLU(ios->per_dev[i].length)); | 225 | _LLU(ios->per_dev[i].length)); |
@@ -259,6 +243,7 @@ int exofs_check_io(struct exofs_io_state *ios, u64 *resid) | |||
259 | 243 | ||
260 | return acumulated_lin_err; | 244 | return acumulated_lin_err; |
261 | } | 245 | } |
246 | EXPORT_SYMBOL(ore_check_io); | ||
262 | 247 | ||
263 | /* | 248 | /* |
264 | * L - logical offset into the file | 249 | * L - logical offset into the file |
@@ -305,20 +290,21 @@ int exofs_check_io(struct exofs_io_state *ios, u64 *resid) | |||
305 | struct _striping_info { | 290 | struct _striping_info { |
306 | u64 obj_offset; | 291 | u64 obj_offset; |
307 | u64 group_length; | 292 | u64 group_length; |
293 | u64 M; /* for truncate */ | ||
308 | unsigned dev; | 294 | unsigned dev; |
309 | unsigned unit_off; | 295 | unsigned unit_off; |
310 | }; | 296 | }; |
311 | 297 | ||
312 | static void _calc_stripe_info(struct exofs_io_state *ios, u64 file_offset, | 298 | static void _calc_stripe_info(struct ore_layout *layout, u64 file_offset, |
313 | struct _striping_info *si) | 299 | struct _striping_info *si) |
314 | { | 300 | { |
315 | u32 stripe_unit = ios->layout->stripe_unit; | 301 | u32 stripe_unit = layout->stripe_unit; |
316 | u32 group_width = ios->layout->group_width; | 302 | u32 group_width = layout->group_width; |
317 | u64 group_depth = ios->layout->group_depth; | 303 | u64 group_depth = layout->group_depth; |
318 | 304 | ||
319 | u32 U = stripe_unit * group_width; | 305 | u32 U = stripe_unit * group_width; |
320 | u64 T = U * group_depth; | 306 | u64 T = U * group_depth; |
321 | u64 S = T * ios->layout->group_count; | 307 | u64 S = T * layout->group_count; |
322 | u64 M = div64_u64(file_offset, S); | 308 | u64 M = div64_u64(file_offset, S); |
323 | 309 | ||
324 | /* | 310 | /* |
@@ -333,7 +319,7 @@ static void _calc_stripe_info(struct exofs_io_state *ios, u64 file_offset, | |||
333 | 319 | ||
334 | /* "H - (N * U)" is just "H % U" so it's bound to u32 */ | 320 | /* "H - (N * U)" is just "H % U" so it's bound to u32 */ |
335 | si->dev = (u32)(H - (N * U)) / stripe_unit + G * group_width; | 321 | si->dev = (u32)(H - (N * U)) / stripe_unit + G * group_width; |
336 | si->dev *= ios->layout->mirrors_p1; | 322 | si->dev *= layout->mirrors_p1; |
337 | 323 | ||
338 | div_u64_rem(file_offset, stripe_unit, &si->unit_off); | 324 | div_u64_rem(file_offset, stripe_unit, &si->unit_off); |
339 | 325 | ||
@@ -341,15 +327,16 @@ static void _calc_stripe_info(struct exofs_io_state *ios, u64 file_offset, | |||
341 | (M * group_depth * stripe_unit); | 327 | (M * group_depth * stripe_unit); |
342 | 328 | ||
343 | si->group_length = T - H; | 329 | si->group_length = T - H; |
330 | si->M = M; | ||
344 | } | 331 | } |
345 | 332 | ||
346 | static int _add_stripe_unit(struct exofs_io_state *ios, unsigned *cur_pg, | 333 | static int _add_stripe_unit(struct ore_io_state *ios, unsigned *cur_pg, |
347 | unsigned pgbase, struct exofs_per_dev_state *per_dev, | 334 | unsigned pgbase, struct ore_per_dev_state *per_dev, |
348 | int cur_len) | 335 | int cur_len) |
349 | { | 336 | { |
350 | unsigned pg = *cur_pg; | 337 | unsigned pg = *cur_pg; |
351 | struct request_queue *q = | 338 | struct request_queue *q = |
352 | osd_request_queue(exofs_ios_od(ios, per_dev->dev)); | 339 | osd_request_queue(_ios_od(ios, per_dev->dev)); |
353 | 340 | ||
354 | per_dev->length += cur_len; | 341 | per_dev->length += cur_len; |
355 | 342 | ||
@@ -361,7 +348,7 @@ static int _add_stripe_unit(struct exofs_io_state *ios, unsigned *cur_pg, | |||
361 | 348 | ||
362 | per_dev->bio = bio_kmalloc(GFP_KERNEL, bio_size); | 349 | per_dev->bio = bio_kmalloc(GFP_KERNEL, bio_size); |
363 | if (unlikely(!per_dev->bio)) { | 350 | if (unlikely(!per_dev->bio)) { |
364 | EXOFS_DBGMSG("Failed to allocate BIO size=%u\n", | 351 | ORE_DBGMSG("Failed to allocate BIO size=%u\n", |
365 | bio_size); | 352 | bio_size); |
366 | return -ENOMEM; | 353 | return -ENOMEM; |
367 | } | 354 | } |
@@ -387,7 +374,7 @@ static int _add_stripe_unit(struct exofs_io_state *ios, unsigned *cur_pg, | |||
387 | return 0; | 374 | return 0; |
388 | } | 375 | } |
389 | 376 | ||
390 | static int _prepare_one_group(struct exofs_io_state *ios, u64 length, | 377 | static int _prepare_one_group(struct ore_io_state *ios, u64 length, |
391 | struct _striping_info *si) | 378 | struct _striping_info *si) |
392 | { | 379 | { |
393 | unsigned stripe_unit = ios->layout->stripe_unit; | 380 | unsigned stripe_unit = ios->layout->stripe_unit; |
@@ -400,7 +387,7 @@ static int _prepare_one_group(struct exofs_io_state *ios, u64 length, | |||
400 | int ret = 0; | 387 | int ret = 0; |
401 | 388 | ||
402 | while (length) { | 389 | while (length) { |
403 | struct exofs_per_dev_state *per_dev = &ios->per_dev[dev]; | 390 | struct ore_per_dev_state *per_dev = &ios->per_dev[dev]; |
404 | unsigned cur_len, page_off = 0; | 391 | unsigned cur_len, page_off = 0; |
405 | 392 | ||
406 | if (!per_dev->length) { | 393 | if (!per_dev->length) { |
@@ -443,7 +430,7 @@ out: | |||
443 | return ret; | 430 | return ret; |
444 | } | 431 | } |
445 | 432 | ||
446 | static int _prepare_for_striping(struct exofs_io_state *ios) | 433 | static int _prepare_for_striping(struct ore_io_state *ios) |
447 | { | 434 | { |
448 | u64 length = ios->length; | 435 | u64 length = ios->length; |
449 | u64 offset = ios->offset; | 436 | u64 offset = ios->offset; |
@@ -452,9 +439,9 @@ static int _prepare_for_striping(struct exofs_io_state *ios) | |||
452 | 439 | ||
453 | if (!ios->pages) { | 440 | if (!ios->pages) { |
454 | if (ios->kern_buff) { | 441 | if (ios->kern_buff) { |
455 | struct exofs_per_dev_state *per_dev = &ios->per_dev[0]; | 442 | struct ore_per_dev_state *per_dev = &ios->per_dev[0]; |
456 | 443 | ||
457 | _calc_stripe_info(ios, ios->offset, &si); | 444 | _calc_stripe_info(ios->layout, ios->offset, &si); |
458 | per_dev->offset = si.obj_offset; | 445 | per_dev->offset = si.obj_offset; |
459 | per_dev->dev = si.dev; | 446 | per_dev->dev = si.dev; |
460 | 447 | ||
@@ -468,7 +455,7 @@ static int _prepare_for_striping(struct exofs_io_state *ios) | |||
468 | } | 455 | } |
469 | 456 | ||
470 | while (length) { | 457 | while (length) { |
471 | _calc_stripe_info(ios, offset, &si); | 458 | _calc_stripe_info(ios->layout, offset, &si); |
472 | 459 | ||
473 | if (length < si.group_length) | 460 | if (length < si.group_length) |
474 | si.group_length = length; | 461 | si.group_length = length; |
@@ -485,57 +472,59 @@ out: | |||
485 | return ret; | 472 | return ret; |
486 | } | 473 | } |
487 | 474 | ||
488 | int exofs_sbi_create(struct exofs_io_state *ios) | 475 | int ore_create(struct ore_io_state *ios) |
489 | { | 476 | { |
490 | int i, ret; | 477 | int i, ret; |
491 | 478 | ||
492 | for (i = 0; i < ios->layout->s_numdevs; i++) { | 479 | for (i = 0; i < ios->comps->numdevs; i++) { |
493 | struct osd_request *or; | 480 | struct osd_request *or; |
494 | 481 | ||
495 | or = osd_start_request(exofs_ios_od(ios, i), GFP_KERNEL); | 482 | or = osd_start_request(_ios_od(ios, i), GFP_KERNEL); |
496 | if (unlikely(!or)) { | 483 | if (unlikely(!or)) { |
497 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 484 | ORE_ERR("%s: osd_start_request failed\n", __func__); |
498 | ret = -ENOMEM; | 485 | ret = -ENOMEM; |
499 | goto out; | 486 | goto out; |
500 | } | 487 | } |
501 | ios->per_dev[i].or = or; | 488 | ios->per_dev[i].or = or; |
502 | ios->numdevs++; | 489 | ios->numdevs++; |
503 | 490 | ||
504 | osd_req_create_object(or, &ios->obj); | 491 | osd_req_create_object(or, _ios_obj(ios, i)); |
505 | } | 492 | } |
506 | ret = exofs_io_execute(ios); | 493 | ret = ore_io_execute(ios); |
507 | 494 | ||
508 | out: | 495 | out: |
509 | return ret; | 496 | return ret; |
510 | } | 497 | } |
498 | EXPORT_SYMBOL(ore_create); | ||
511 | 499 | ||
512 | int exofs_sbi_remove(struct exofs_io_state *ios) | 500 | int ore_remove(struct ore_io_state *ios) |
513 | { | 501 | { |
514 | int i, ret; | 502 | int i, ret; |
515 | 503 | ||
516 | for (i = 0; i < ios->layout->s_numdevs; i++) { | 504 | for (i = 0; i < ios->comps->numdevs; i++) { |
517 | struct osd_request *or; | 505 | struct osd_request *or; |
518 | 506 | ||
519 | or = osd_start_request(exofs_ios_od(ios, i), GFP_KERNEL); | 507 | or = osd_start_request(_ios_od(ios, i), GFP_KERNEL); |
520 | if (unlikely(!or)) { | 508 | if (unlikely(!or)) { |
521 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 509 | ORE_ERR("%s: osd_start_request failed\n", __func__); |
522 | ret = -ENOMEM; | 510 | ret = -ENOMEM; |
523 | goto out; | 511 | goto out; |
524 | } | 512 | } |
525 | ios->per_dev[i].or = or; | 513 | ios->per_dev[i].or = or; |
526 | ios->numdevs++; | 514 | ios->numdevs++; |
527 | 515 | ||
528 | osd_req_remove_object(or, &ios->obj); | 516 | osd_req_remove_object(or, _ios_obj(ios, i)); |
529 | } | 517 | } |
530 | ret = exofs_io_execute(ios); | 518 | ret = ore_io_execute(ios); |
531 | 519 | ||
532 | out: | 520 | out: |
533 | return ret; | 521 | return ret; |
534 | } | 522 | } |
523 | EXPORT_SYMBOL(ore_remove); | ||
535 | 524 | ||
536 | static int _sbi_write_mirror(struct exofs_io_state *ios, int cur_comp) | 525 | static int _write_mirror(struct ore_io_state *ios, int cur_comp) |
537 | { | 526 | { |
538 | struct exofs_per_dev_state *master_dev = &ios->per_dev[cur_comp]; | 527 | struct ore_per_dev_state *master_dev = &ios->per_dev[cur_comp]; |
539 | unsigned dev = ios->per_dev[cur_comp].dev; | 528 | unsigned dev = ios->per_dev[cur_comp].dev; |
540 | unsigned last_comp = cur_comp + ios->layout->mirrors_p1; | 529 | unsigned last_comp = cur_comp + ios->layout->mirrors_p1; |
541 | int ret = 0; | 530 | int ret = 0; |
@@ -544,12 +533,12 @@ static int _sbi_write_mirror(struct exofs_io_state *ios, int cur_comp) | |||
544 | return 0; /* Just an empty slot */ | 533 | return 0; /* Just an empty slot */ |
545 | 534 | ||
546 | for (; cur_comp < last_comp; ++cur_comp, ++dev) { | 535 | for (; cur_comp < last_comp; ++cur_comp, ++dev) { |
547 | struct exofs_per_dev_state *per_dev = &ios->per_dev[cur_comp]; | 536 | struct ore_per_dev_state *per_dev = &ios->per_dev[cur_comp]; |
548 | struct osd_request *or; | 537 | struct osd_request *or; |
549 | 538 | ||
550 | or = osd_start_request(exofs_ios_od(ios, dev), GFP_KERNEL); | 539 | or = osd_start_request(_ios_od(ios, dev), GFP_KERNEL); |
551 | if (unlikely(!or)) { | 540 | if (unlikely(!or)) { |
552 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 541 | ORE_ERR("%s: osd_start_request failed\n", __func__); |
553 | ret = -ENOMEM; | 542 | ret = -ENOMEM; |
554 | goto out; | 543 | goto out; |
555 | } | 544 | } |
@@ -563,7 +552,7 @@ static int _sbi_write_mirror(struct exofs_io_state *ios, int cur_comp) | |||
563 | bio = bio_kmalloc(GFP_KERNEL, | 552 | bio = bio_kmalloc(GFP_KERNEL, |
564 | master_dev->bio->bi_max_vecs); | 553 | master_dev->bio->bi_max_vecs); |
565 | if (unlikely(!bio)) { | 554 | if (unlikely(!bio)) { |
566 | EXOFS_DBGMSG( | 555 | ORE_DBGMSG( |
567 | "Failed to allocate BIO size=%u\n", | 556 | "Failed to allocate BIO size=%u\n", |
568 | master_dev->bio->bi_max_vecs); | 557 | master_dev->bio->bi_max_vecs); |
569 | ret = -ENOMEM; | 558 | ret = -ENOMEM; |
@@ -582,25 +571,29 @@ static int _sbi_write_mirror(struct exofs_io_state *ios, int cur_comp) | |||
582 | bio->bi_rw |= REQ_WRITE; | 571 | bio->bi_rw |= REQ_WRITE; |
583 | } | 572 | } |
584 | 573 | ||
585 | osd_req_write(or, &ios->obj, per_dev->offset, bio, | 574 | osd_req_write(or, _ios_obj(ios, dev), per_dev->offset, |
586 | per_dev->length); | 575 | bio, per_dev->length); |
587 | EXOFS_DBGMSG("write(0x%llx) offset=0x%llx " | 576 | ORE_DBGMSG("write(0x%llx) offset=0x%llx " |
588 | "length=0x%llx dev=%d\n", | 577 | "length=0x%llx dev=%d\n", |
589 | _LLU(ios->obj.id), _LLU(per_dev->offset), | 578 | _LLU(_ios_obj(ios, dev)->id), |
579 | _LLU(per_dev->offset), | ||
590 | _LLU(per_dev->length), dev); | 580 | _LLU(per_dev->length), dev); |
591 | } else if (ios->kern_buff) { | 581 | } else if (ios->kern_buff) { |
592 | ret = osd_req_write_kern(or, &ios->obj, per_dev->offset, | 582 | ret = osd_req_write_kern(or, _ios_obj(ios, dev), |
593 | ios->kern_buff, ios->length); | 583 | per_dev->offset, |
584 | ios->kern_buff, ios->length); | ||
594 | if (unlikely(ret)) | 585 | if (unlikely(ret)) |
595 | goto out; | 586 | goto out; |
596 | EXOFS_DBGMSG2("write_kern(0x%llx) offset=0x%llx " | 587 | ORE_DBGMSG2("write_kern(0x%llx) offset=0x%llx " |
597 | "length=0x%llx dev=%d\n", | 588 | "length=0x%llx dev=%d\n", |
598 | _LLU(ios->obj.id), _LLU(per_dev->offset), | 589 | _LLU(_ios_obj(ios, dev)->id), |
590 | _LLU(per_dev->offset), | ||
599 | _LLU(ios->length), dev); | 591 | _LLU(ios->length), dev); |
600 | } else { | 592 | } else { |
601 | osd_req_set_attributes(or, &ios->obj); | 593 | osd_req_set_attributes(or, _ios_obj(ios, dev)); |
602 | EXOFS_DBGMSG2("obj(0x%llx) set_attributes=%d dev=%d\n", | 594 | ORE_DBGMSG2("obj(0x%llx) set_attributes=%d dev=%d\n", |
603 | _LLU(ios->obj.id), ios->out_attr_len, dev); | 595 | _LLU(_ios_obj(ios, dev)->id), |
596 | ios->out_attr_len, dev); | ||
604 | } | 597 | } |
605 | 598 | ||
606 | if (ios->out_attr) | 599 | if (ios->out_attr) |
@@ -616,7 +609,7 @@ out: | |||
616 | return ret; | 609 | return ret; |
617 | } | 610 | } |
618 | 611 | ||
619 | int exofs_sbi_write(struct exofs_io_state *ios) | 612 | int ore_write(struct ore_io_state *ios) |
620 | { | 613 | { |
621 | int i; | 614 | int i; |
622 | int ret; | 615 | int ret; |
@@ -626,52 +619,55 @@ int exofs_sbi_write(struct exofs_io_state *ios) | |||
626 | return ret; | 619 | return ret; |
627 | 620 | ||
628 | for (i = 0; i < ios->numdevs; i += ios->layout->mirrors_p1) { | 621 | for (i = 0; i < ios->numdevs; i += ios->layout->mirrors_p1) { |
629 | ret = _sbi_write_mirror(ios, i); | 622 | ret = _write_mirror(ios, i); |
630 | if (unlikely(ret)) | 623 | if (unlikely(ret)) |
631 | return ret; | 624 | return ret; |
632 | } | 625 | } |
633 | 626 | ||
634 | ret = exofs_io_execute(ios); | 627 | ret = ore_io_execute(ios); |
635 | return ret; | 628 | return ret; |
636 | } | 629 | } |
630 | EXPORT_SYMBOL(ore_write); | ||
637 | 631 | ||
638 | static int _sbi_read_mirror(struct exofs_io_state *ios, unsigned cur_comp) | 632 | static int _read_mirror(struct ore_io_state *ios, unsigned cur_comp) |
639 | { | 633 | { |
640 | struct osd_request *or; | 634 | struct osd_request *or; |
641 | struct exofs_per_dev_state *per_dev = &ios->per_dev[cur_comp]; | 635 | struct ore_per_dev_state *per_dev = &ios->per_dev[cur_comp]; |
642 | unsigned first_dev = (unsigned)ios->obj.id; | 636 | struct osd_obj_id *obj = _ios_obj(ios, cur_comp); |
637 | unsigned first_dev = (unsigned)obj->id; | ||
643 | 638 | ||
644 | if (ios->pages && !per_dev->length) | 639 | if (ios->pages && !per_dev->length) |
645 | return 0; /* Just an empty slot */ | 640 | return 0; /* Just an empty slot */ |
646 | 641 | ||
647 | first_dev = per_dev->dev + first_dev % ios->layout->mirrors_p1; | 642 | first_dev = per_dev->dev + first_dev % ios->layout->mirrors_p1; |
648 | or = osd_start_request(exofs_ios_od(ios, first_dev), GFP_KERNEL); | 643 | or = osd_start_request(_ios_od(ios, first_dev), GFP_KERNEL); |
649 | if (unlikely(!or)) { | 644 | if (unlikely(!or)) { |
650 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 645 | ORE_ERR("%s: osd_start_request failed\n", __func__); |
651 | return -ENOMEM; | 646 | return -ENOMEM; |
652 | } | 647 | } |
653 | per_dev->or = or; | 648 | per_dev->or = or; |
654 | 649 | ||
655 | if (ios->pages) { | 650 | if (ios->pages) { |
656 | osd_req_read(or, &ios->obj, per_dev->offset, | 651 | osd_req_read(or, obj, per_dev->offset, |
657 | per_dev->bio, per_dev->length); | 652 | per_dev->bio, per_dev->length); |
658 | EXOFS_DBGMSG("read(0x%llx) offset=0x%llx length=0x%llx" | 653 | ORE_DBGMSG("read(0x%llx) offset=0x%llx length=0x%llx" |
659 | " dev=%d\n", _LLU(ios->obj.id), | 654 | " dev=%d\n", _LLU(obj->id), |
660 | _LLU(per_dev->offset), _LLU(per_dev->length), | 655 | _LLU(per_dev->offset), _LLU(per_dev->length), |
661 | first_dev); | 656 | first_dev); |
662 | } else if (ios->kern_buff) { | 657 | } else if (ios->kern_buff) { |
663 | int ret = osd_req_read_kern(or, &ios->obj, per_dev->offset, | 658 | int ret = osd_req_read_kern(or, obj, per_dev->offset, |
664 | ios->kern_buff, ios->length); | 659 | ios->kern_buff, ios->length); |
665 | EXOFS_DBGMSG2("read_kern(0x%llx) offset=0x%llx " | 660 | ORE_DBGMSG2("read_kern(0x%llx) offset=0x%llx " |
666 | "length=0x%llx dev=%d ret=>%d\n", | 661 | "length=0x%llx dev=%d ret=>%d\n", |
667 | _LLU(ios->obj.id), _LLU(per_dev->offset), | 662 | _LLU(obj->id), _LLU(per_dev->offset), |
668 | _LLU(ios->length), first_dev, ret); | 663 | _LLU(ios->length), first_dev, ret); |
669 | if (unlikely(ret)) | 664 | if (unlikely(ret)) |
670 | return ret; | 665 | return ret; |
671 | } else { | 666 | } else { |
672 | osd_req_get_attributes(or, &ios->obj); | 667 | osd_req_get_attributes(or, obj); |
673 | EXOFS_DBGMSG2("obj(0x%llx) get_attributes=%d dev=%d\n", | 668 | ORE_DBGMSG2("obj(0x%llx) get_attributes=%d dev=%d\n", |
674 | _LLU(ios->obj.id), ios->in_attr_len, first_dev); | 669 | _LLU(obj->id), |
670 | ios->in_attr_len, first_dev); | ||
675 | } | 671 | } |
676 | if (ios->out_attr) | 672 | if (ios->out_attr) |
677 | osd_req_add_set_attr_list(or, ios->out_attr, ios->out_attr_len); | 673 | osd_req_add_set_attr_list(or, ios->out_attr, ios->out_attr_len); |
@@ -682,7 +678,7 @@ static int _sbi_read_mirror(struct exofs_io_state *ios, unsigned cur_comp) | |||
682 | return 0; | 678 | return 0; |
683 | } | 679 | } |
684 | 680 | ||
685 | int exofs_sbi_read(struct exofs_io_state *ios) | 681 | int ore_read(struct ore_io_state *ios) |
686 | { | 682 | { |
687 | int i; | 683 | int i; |
688 | int ret; | 684 | int ret; |
@@ -692,16 +688,17 @@ int exofs_sbi_read(struct exofs_io_state *ios) | |||
692 | return ret; | 688 | return ret; |
693 | 689 | ||
694 | for (i = 0; i < ios->numdevs; i += ios->layout->mirrors_p1) { | 690 | for (i = 0; i < ios->numdevs; i += ios->layout->mirrors_p1) { |
695 | ret = _sbi_read_mirror(ios, i); | 691 | ret = _read_mirror(ios, i); |
696 | if (unlikely(ret)) | 692 | if (unlikely(ret)) |
697 | return ret; | 693 | return ret; |
698 | } | 694 | } |
699 | 695 | ||
700 | ret = exofs_io_execute(ios); | 696 | ret = ore_io_execute(ios); |
701 | return ret; | 697 | return ret; |
702 | } | 698 | } |
699 | EXPORT_SYMBOL(ore_read); | ||
703 | 700 | ||
704 | int extract_attr_from_ios(struct exofs_io_state *ios, struct osd_attr *attr) | 701 | int extract_attr_from_ios(struct ore_io_state *ios, struct osd_attr *attr) |
705 | { | 702 | { |
706 | struct osd_attr cur_attr = {.attr_page = 0}; /* start with zeros */ | 703 | struct osd_attr cur_attr = {.attr_page = 0}; /* start with zeros */ |
707 | void *iter = NULL; | 704 | void *iter = NULL; |
@@ -721,83 +718,118 @@ int extract_attr_from_ios(struct exofs_io_state *ios, struct osd_attr *attr) | |||
721 | 718 | ||
722 | return -EIO; | 719 | return -EIO; |
723 | } | 720 | } |
721 | EXPORT_SYMBOL(extract_attr_from_ios); | ||
724 | 722 | ||
725 | static int _truncate_mirrors(struct exofs_io_state *ios, unsigned cur_comp, | 723 | static int _truncate_mirrors(struct ore_io_state *ios, unsigned cur_comp, |
726 | struct osd_attr *attr) | 724 | struct osd_attr *attr) |
727 | { | 725 | { |
728 | int last_comp = cur_comp + ios->layout->mirrors_p1; | 726 | int last_comp = cur_comp + ios->layout->mirrors_p1; |
729 | 727 | ||
730 | for (; cur_comp < last_comp; ++cur_comp) { | 728 | for (; cur_comp < last_comp; ++cur_comp) { |
731 | struct exofs_per_dev_state *per_dev = &ios->per_dev[cur_comp]; | 729 | struct ore_per_dev_state *per_dev = &ios->per_dev[cur_comp]; |
732 | struct osd_request *or; | 730 | struct osd_request *or; |
733 | 731 | ||
734 | or = osd_start_request(exofs_ios_od(ios, cur_comp), GFP_KERNEL); | 732 | or = osd_start_request(_ios_od(ios, cur_comp), GFP_KERNEL); |
735 | if (unlikely(!or)) { | 733 | if (unlikely(!or)) { |
736 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 734 | ORE_ERR("%s: osd_start_request failed\n", __func__); |
737 | return -ENOMEM; | 735 | return -ENOMEM; |
738 | } | 736 | } |
739 | per_dev->or = or; | 737 | per_dev->or = or; |
740 | 738 | ||
741 | osd_req_set_attributes(or, &ios->obj); | 739 | osd_req_set_attributes(or, _ios_obj(ios, cur_comp)); |
742 | osd_req_add_set_attr_list(or, attr, 1); | 740 | osd_req_add_set_attr_list(or, attr, 1); |
743 | } | 741 | } |
744 | 742 | ||
745 | return 0; | 743 | return 0; |
746 | } | 744 | } |
747 | 745 | ||
748 | int exofs_oi_truncate(struct exofs_i_info *oi, u64 size) | 746 | struct _trunc_info { |
747 | struct _striping_info si; | ||
748 | u64 prev_group_obj_off; | ||
749 | u64 next_group_obj_off; | ||
750 | |||
751 | unsigned first_group_dev; | ||
752 | unsigned nex_group_dev; | ||
753 | unsigned max_devs; | ||
754 | }; | ||
755 | |||
756 | void _calc_trunk_info(struct ore_layout *layout, u64 file_offset, | ||
757 | struct _trunc_info *ti) | ||
758 | { | ||
759 | unsigned stripe_unit = layout->stripe_unit; | ||
760 | |||
761 | _calc_stripe_info(layout, file_offset, &ti->si); | ||
762 | |||
763 | ti->prev_group_obj_off = ti->si.M * stripe_unit; | ||
764 | ti->next_group_obj_off = ti->si.M ? (ti->si.M - 1) * stripe_unit : 0; | ||
765 | |||
766 | ti->first_group_dev = ti->si.dev - (ti->si.dev % layout->group_width); | ||
767 | ti->nex_group_dev = ti->first_group_dev + layout->group_width; | ||
768 | ti->max_devs = layout->group_width * layout->group_count; | ||
769 | } | ||
770 | |||
771 | int ore_truncate(struct ore_layout *layout, struct ore_components *comps, | ||
772 | u64 size) | ||
749 | { | 773 | { |
750 | struct exofs_sb_info *sbi = oi->vfs_inode.i_sb->s_fs_info; | 774 | struct ore_io_state *ios; |
751 | struct exofs_io_state *ios; | ||
752 | struct exofs_trunc_attr { | 775 | struct exofs_trunc_attr { |
753 | struct osd_attr attr; | 776 | struct osd_attr attr; |
754 | __be64 newsize; | 777 | __be64 newsize; |
755 | } *size_attrs; | 778 | } *size_attrs; |
756 | struct _striping_info si; | 779 | struct _trunc_info ti; |
757 | int i, ret; | 780 | int i, ret; |
758 | 781 | ||
759 | ret = exofs_get_io_state(&sbi->layout, &ios); | 782 | ret = ore_get_io_state(layout, comps, &ios); |
760 | if (unlikely(ret)) | 783 | if (unlikely(ret)) |
761 | return ret; | 784 | return ret; |
762 | 785 | ||
763 | size_attrs = kcalloc(ios->layout->group_width, sizeof(*size_attrs), | 786 | _calc_trunk_info(ios->layout, size, &ti); |
787 | |||
788 | size_attrs = kcalloc(ti.max_devs, sizeof(*size_attrs), | ||
764 | GFP_KERNEL); | 789 | GFP_KERNEL); |
765 | if (unlikely(!size_attrs)) { | 790 | if (unlikely(!size_attrs)) { |
766 | ret = -ENOMEM; | 791 | ret = -ENOMEM; |
767 | goto out; | 792 | goto out; |
768 | } | 793 | } |
769 | 794 | ||
770 | ios->obj.id = exofs_oi_objno(oi); | 795 | ios->numdevs = ios->comps->numdevs; |
771 | ios->cred = oi->i_cred; | ||
772 | 796 | ||
773 | ios->numdevs = ios->layout->s_numdevs; | 797 | for (i = 0; i < ti.max_devs; ++i) { |
774 | _calc_stripe_info(ios, size, &si); | ||
775 | |||
776 | for (i = 0; i < ios->layout->group_width; ++i) { | ||
777 | struct exofs_trunc_attr *size_attr = &size_attrs[i]; | 798 | struct exofs_trunc_attr *size_attr = &size_attrs[i]; |
778 | u64 obj_size; | 799 | u64 obj_size; |
779 | 800 | ||
780 | if (i < si.dev) | 801 | if (i < ti.first_group_dev) |
781 | obj_size = si.obj_offset + | 802 | obj_size = ti.prev_group_obj_off; |
782 | ios->layout->stripe_unit - si.unit_off; | 803 | else if (i >= ti.nex_group_dev) |
783 | else if (i == si.dev) | 804 | obj_size = ti.next_group_obj_off; |
784 | obj_size = si.obj_offset; | 805 | else if (i < ti.si.dev) /* dev within this group */ |
785 | else /* i > si.dev */ | 806 | obj_size = ti.si.obj_offset + |
786 | obj_size = si.obj_offset - si.unit_off; | 807 | ios->layout->stripe_unit - ti.si.unit_off; |
808 | else if (i == ti.si.dev) | ||
809 | obj_size = ti.si.obj_offset; | ||
810 | else /* i > ti.dev */ | ||
811 | obj_size = ti.si.obj_offset - ti.si.unit_off; | ||
787 | 812 | ||
788 | size_attr->newsize = cpu_to_be64(obj_size); | 813 | size_attr->newsize = cpu_to_be64(obj_size); |
789 | size_attr->attr = g_attr_logical_length; | 814 | size_attr->attr = g_attr_logical_length; |
790 | size_attr->attr.val_ptr = &size_attr->newsize; | 815 | size_attr->attr.val_ptr = &size_attr->newsize; |
791 | 816 | ||
817 | ORE_DBGMSG("trunc(0x%llx) obj_offset=0x%llx dev=%d\n", | ||
818 | _LLU(comps->comps->obj.id), _LLU(obj_size), i); | ||
792 | ret = _truncate_mirrors(ios, i * ios->layout->mirrors_p1, | 819 | ret = _truncate_mirrors(ios, i * ios->layout->mirrors_p1, |
793 | &size_attr->attr); | 820 | &size_attr->attr); |
794 | if (unlikely(ret)) | 821 | if (unlikely(ret)) |
795 | goto out; | 822 | goto out; |
796 | } | 823 | } |
797 | ret = exofs_io_execute(ios); | 824 | ret = ore_io_execute(ios); |
798 | 825 | ||
799 | out: | 826 | out: |
800 | kfree(size_attrs); | 827 | kfree(size_attrs); |
801 | exofs_put_io_state(ios); | 828 | ore_put_io_state(ios); |
802 | return ret; | 829 | return ret; |
803 | } | 830 | } |
831 | EXPORT_SYMBOL(ore_truncate); | ||
832 | |||
833 | const struct osd_attr g_attr_logical_length = ATTR_DEF( | ||
834 | OSD_APAGE_OBJECT_INFORMATION, OSD_ATTR_OI_LOGICAL_LENGTH, 8); | ||
835 | EXPORT_SYMBOL(g_attr_logical_length); | ||
diff --git a/fs/exofs/pnfs.h b/fs/exofs/pnfs.h deleted file mode 100644 index c52e9888b8ab..000000000000 --- a/fs/exofs/pnfs.h +++ /dev/null | |||
@@ -1,45 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008, 2009 | ||
3 | * Boaz Harrosh <bharrosh@panasas.com> | ||
4 | * | ||
5 | * This file is part of exofs. | ||
6 | * | ||
7 | * exofs is free software; you can redistribute it and/or modify it under the | ||
8 | * terms of the GNU General Public License version 2 as published by the Free | ||
9 | * Software Foundation. | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | /* FIXME: Remove this file once pnfs hits mainline */ | ||
14 | |||
15 | #ifndef __EXOFS_PNFS_H__ | ||
16 | #define __EXOFS_PNFS_H__ | ||
17 | |||
18 | #if ! defined(__PNFS_OSD_XDR_H__) | ||
19 | |||
20 | enum pnfs_iomode { | ||
21 | IOMODE_READ = 1, | ||
22 | IOMODE_RW = 2, | ||
23 | IOMODE_ANY = 3, | ||
24 | }; | ||
25 | |||
26 | /* Layout Structure */ | ||
27 | enum pnfs_osd_raid_algorithm4 { | ||
28 | PNFS_OSD_RAID_0 = 1, | ||
29 | PNFS_OSD_RAID_4 = 2, | ||
30 | PNFS_OSD_RAID_5 = 3, | ||
31 | PNFS_OSD_RAID_PQ = 4 /* Reed-Solomon P+Q */ | ||
32 | }; | ||
33 | |||
34 | struct pnfs_osd_data_map { | ||
35 | u32 odm_num_comps; | ||
36 | u64 odm_stripe_unit; | ||
37 | u32 odm_group_width; | ||
38 | u32 odm_group_depth; | ||
39 | u32 odm_mirror_cnt; | ||
40 | u32 odm_raid_algorithm; | ||
41 | }; | ||
42 | |||
43 | #endif /* ! defined(__PNFS_OSD_XDR_H__) */ | ||
44 | |||
45 | #endif /* __EXOFS_PNFS_H__ */ | ||
diff --git a/fs/exofs/super.c b/fs/exofs/super.c index c57beddcc217..274894053b02 100644 --- a/fs/exofs/super.c +++ b/fs/exofs/super.c | |||
@@ -40,6 +40,8 @@ | |||
40 | 40 | ||
41 | #include "exofs.h" | 41 | #include "exofs.h" |
42 | 42 | ||
43 | #define EXOFS_DBGMSG2(M...) do {} while (0) | ||
44 | |||
43 | /****************************************************************************** | 45 | /****************************************************************************** |
44 | * MOUNT OPTIONS | 46 | * MOUNT OPTIONS |
45 | *****************************************************************************/ | 47 | *****************************************************************************/ |
@@ -208,10 +210,48 @@ static void destroy_inodecache(void) | |||
208 | } | 210 | } |
209 | 211 | ||
210 | /****************************************************************************** | 212 | /****************************************************************************** |
211 | * SUPERBLOCK FUNCTIONS | 213 | * Some osd helpers |
212 | *****************************************************************************/ | 214 | *****************************************************************************/ |
213 | static const struct super_operations exofs_sops; | 215 | void exofs_make_credential(u8 cred_a[OSD_CAP_LEN], const struct osd_obj_id *obj) |
214 | static const struct export_operations exofs_export_ops; | 216 | { |
217 | osd_sec_init_nosec_doall_caps(cred_a, obj, false, true); | ||
218 | } | ||
219 | |||
220 | static int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj, | ||
221 | u64 offset, void *p, unsigned length) | ||
222 | { | ||
223 | struct osd_request *or = osd_start_request(od, GFP_KERNEL); | ||
224 | /* struct osd_sense_info osi = {.key = 0};*/ | ||
225 | int ret; | ||
226 | |||
227 | if (unlikely(!or)) { | ||
228 | EXOFS_DBGMSG("%s: osd_start_request failed.\n", __func__); | ||
229 | return -ENOMEM; | ||
230 | } | ||
231 | ret = osd_req_read_kern(or, obj, offset, p, length); | ||
232 | if (unlikely(ret)) { | ||
233 | EXOFS_DBGMSG("%s: osd_req_read_kern failed.\n", __func__); | ||
234 | goto out; | ||
235 | } | ||
236 | |||
237 | ret = osd_finalize_request(or, 0, cred, NULL); | ||
238 | if (unlikely(ret)) { | ||
239 | EXOFS_DBGMSG("Failed to osd_finalize_request() => %d\n", ret); | ||
240 | goto out; | ||
241 | } | ||
242 | |||
243 | ret = osd_execute_request(or); | ||
244 | if (unlikely(ret)) | ||
245 | EXOFS_DBGMSG("osd_execute_request() => %d\n", ret); | ||
246 | /* osd_req_decode_sense(or, ret); */ | ||
247 | |||
248 | out: | ||
249 | osd_end_request(or); | ||
250 | EXOFS_DBGMSG2("read_kern(0x%llx) offset=0x%llx " | ||
251 | "length=0x%llx dev=%p ret=>%d\n", | ||
252 | _LLU(obj->id), _LLU(offset), _LLU(length), od, ret); | ||
253 | return ret; | ||
254 | } | ||
215 | 255 | ||
216 | static const struct osd_attr g_attr_sb_stats = ATTR_DEF( | 256 | static const struct osd_attr g_attr_sb_stats = ATTR_DEF( |
217 | EXOFS_APAGE_SB_DATA, | 257 | EXOFS_APAGE_SB_DATA, |
@@ -223,21 +263,19 @@ static int __sbi_read_stats(struct exofs_sb_info *sbi) | |||
223 | struct osd_attr attrs[] = { | 263 | struct osd_attr attrs[] = { |
224 | [0] = g_attr_sb_stats, | 264 | [0] = g_attr_sb_stats, |
225 | }; | 265 | }; |
226 | struct exofs_io_state *ios; | 266 | struct ore_io_state *ios; |
227 | int ret; | 267 | int ret; |
228 | 268 | ||
229 | ret = exofs_get_io_state(&sbi->layout, &ios); | 269 | ret = ore_get_io_state(&sbi->layout, &sbi->comps, &ios); |
230 | if (unlikely(ret)) { | 270 | if (unlikely(ret)) { |
231 | EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__); | 271 | EXOFS_ERR("%s: ore_get_io_state failed.\n", __func__); |
232 | return ret; | 272 | return ret; |
233 | } | 273 | } |
234 | 274 | ||
235 | ios->cred = sbi->s_cred; | ||
236 | |||
237 | ios->in_attr = attrs; | 275 | ios->in_attr = attrs; |
238 | ios->in_attr_len = ARRAY_SIZE(attrs); | 276 | ios->in_attr_len = ARRAY_SIZE(attrs); |
239 | 277 | ||
240 | ret = exofs_sbi_read(ios); | 278 | ret = ore_read(ios); |
241 | if (unlikely(ret)) { | 279 | if (unlikely(ret)) { |
242 | EXOFS_ERR("Error reading super_block stats => %d\n", ret); | 280 | EXOFS_ERR("Error reading super_block stats => %d\n", ret); |
243 | goto out; | 281 | goto out; |
@@ -264,13 +302,13 @@ static int __sbi_read_stats(struct exofs_sb_info *sbi) | |||
264 | } | 302 | } |
265 | 303 | ||
266 | out: | 304 | out: |
267 | exofs_put_io_state(ios); | 305 | ore_put_io_state(ios); |
268 | return ret; | 306 | return ret; |
269 | } | 307 | } |
270 | 308 | ||
271 | static void stats_done(struct exofs_io_state *ios, void *p) | 309 | static void stats_done(struct ore_io_state *ios, void *p) |
272 | { | 310 | { |
273 | exofs_put_io_state(ios); | 311 | ore_put_io_state(ios); |
274 | /* Good thanks nothing to do anymore */ | 312 | /* Good thanks nothing to do anymore */ |
275 | } | 313 | } |
276 | 314 | ||
@@ -280,12 +318,12 @@ int exofs_sbi_write_stats(struct exofs_sb_info *sbi) | |||
280 | struct osd_attr attrs[] = { | 318 | struct osd_attr attrs[] = { |
281 | [0] = g_attr_sb_stats, | 319 | [0] = g_attr_sb_stats, |
282 | }; | 320 | }; |
283 | struct exofs_io_state *ios; | 321 | struct ore_io_state *ios; |
284 | int ret; | 322 | int ret; |
285 | 323 | ||
286 | ret = exofs_get_io_state(&sbi->layout, &ios); | 324 | ret = ore_get_io_state(&sbi->layout, &sbi->comps, &ios); |
287 | if (unlikely(ret)) { | 325 | if (unlikely(ret)) { |
288 | EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__); | 326 | EXOFS_ERR("%s: ore_get_io_state failed.\n", __func__); |
289 | return ret; | 327 | return ret; |
290 | } | 328 | } |
291 | 329 | ||
@@ -293,21 +331,27 @@ int exofs_sbi_write_stats(struct exofs_sb_info *sbi) | |||
293 | sbi->s_ess.s_numfiles = cpu_to_le64(sbi->s_numfiles); | 331 | sbi->s_ess.s_numfiles = cpu_to_le64(sbi->s_numfiles); |
294 | attrs[0].val_ptr = &sbi->s_ess; | 332 | attrs[0].val_ptr = &sbi->s_ess; |
295 | 333 | ||
296 | ios->cred = sbi->s_cred; | 334 | |
297 | ios->done = stats_done; | 335 | ios->done = stats_done; |
298 | ios->private = sbi; | 336 | ios->private = sbi; |
299 | ios->out_attr = attrs; | 337 | ios->out_attr = attrs; |
300 | ios->out_attr_len = ARRAY_SIZE(attrs); | 338 | ios->out_attr_len = ARRAY_SIZE(attrs); |
301 | 339 | ||
302 | ret = exofs_sbi_write(ios); | 340 | ret = ore_write(ios); |
303 | if (unlikely(ret)) { | 341 | if (unlikely(ret)) { |
304 | EXOFS_ERR("%s: exofs_sbi_write failed.\n", __func__); | 342 | EXOFS_ERR("%s: ore_write failed.\n", __func__); |
305 | exofs_put_io_state(ios); | 343 | ore_put_io_state(ios); |
306 | } | 344 | } |
307 | 345 | ||
308 | return ret; | 346 | return ret; |
309 | } | 347 | } |
310 | 348 | ||
349 | /****************************************************************************** | ||
350 | * SUPERBLOCK FUNCTIONS | ||
351 | *****************************************************************************/ | ||
352 | static const struct super_operations exofs_sops; | ||
353 | static const struct export_operations exofs_export_ops; | ||
354 | |||
311 | /* | 355 | /* |
312 | * Write the superblock to the OSD | 356 | * Write the superblock to the OSD |
313 | */ | 357 | */ |
@@ -315,7 +359,9 @@ int exofs_sync_fs(struct super_block *sb, int wait) | |||
315 | { | 359 | { |
316 | struct exofs_sb_info *sbi; | 360 | struct exofs_sb_info *sbi; |
317 | struct exofs_fscb *fscb; | 361 | struct exofs_fscb *fscb; |
318 | struct exofs_io_state *ios; | 362 | struct ore_comp one_comp; |
363 | struct ore_components comps; | ||
364 | struct ore_io_state *ios; | ||
319 | int ret = -ENOMEM; | 365 | int ret = -ENOMEM; |
320 | 366 | ||
321 | fscb = kmalloc(sizeof(*fscb), GFP_KERNEL); | 367 | fscb = kmalloc(sizeof(*fscb), GFP_KERNEL); |
@@ -331,7 +377,10 @@ int exofs_sync_fs(struct super_block *sb, int wait) | |||
331 | * version). Otherwise the exofs_fscb is read-only from mkfs time. All | 377 | * version). Otherwise the exofs_fscb is read-only from mkfs time. All |
332 | * the writeable info is set in exofs_sbi_write_stats() above. | 378 | * the writeable info is set in exofs_sbi_write_stats() above. |
333 | */ | 379 | */ |
334 | ret = exofs_get_io_state(&sbi->layout, &ios); | 380 | |
381 | exofs_init_comps(&comps, &one_comp, sbi, EXOFS_SUPER_ID); | ||
382 | |||
383 | ret = ore_get_io_state(&sbi->layout, &comps, &ios); | ||
335 | if (unlikely(ret)) | 384 | if (unlikely(ret)) |
336 | goto out; | 385 | goto out; |
337 | 386 | ||
@@ -345,14 +394,12 @@ int exofs_sync_fs(struct super_block *sb, int wait) | |||
345 | fscb->s_newfs = 0; | 394 | fscb->s_newfs = 0; |
346 | fscb->s_version = EXOFS_FSCB_VER; | 395 | fscb->s_version = EXOFS_FSCB_VER; |
347 | 396 | ||
348 | ios->obj.id = EXOFS_SUPER_ID; | ||
349 | ios->offset = 0; | 397 | ios->offset = 0; |
350 | ios->kern_buff = fscb; | 398 | ios->kern_buff = fscb; |
351 | ios->cred = sbi->s_cred; | ||
352 | 399 | ||
353 | ret = exofs_sbi_write(ios); | 400 | ret = ore_write(ios); |
354 | if (unlikely(ret)) | 401 | if (unlikely(ret)) |
355 | EXOFS_ERR("%s: exofs_sbi_write failed.\n", __func__); | 402 | EXOFS_ERR("%s: ore_write failed.\n", __func__); |
356 | else | 403 | else |
357 | sb->s_dirt = 0; | 404 | sb->s_dirt = 0; |
358 | 405 | ||
@@ -360,7 +407,7 @@ int exofs_sync_fs(struct super_block *sb, int wait) | |||
360 | unlock_super(sb); | 407 | unlock_super(sb); |
361 | out: | 408 | out: |
362 | EXOFS_DBGMSG("s_nextid=0x%llx ret=%d\n", _LLU(sbi->s_nextid), ret); | 409 | EXOFS_DBGMSG("s_nextid=0x%llx ret=%d\n", _LLU(sbi->s_nextid), ret); |
363 | exofs_put_io_state(ios); | 410 | ore_put_io_state(ios); |
364 | kfree(fscb); | 411 | kfree(fscb); |
365 | return ret; | 412 | return ret; |
366 | } | 413 | } |
@@ -384,15 +431,17 @@ static void _exofs_print_device(const char *msg, const char *dev_path, | |||
384 | 431 | ||
385 | void exofs_free_sbi(struct exofs_sb_info *sbi) | 432 | void exofs_free_sbi(struct exofs_sb_info *sbi) |
386 | { | 433 | { |
387 | while (sbi->layout.s_numdevs) { | 434 | while (sbi->comps.numdevs) { |
388 | int i = --sbi->layout.s_numdevs; | 435 | int i = --sbi->comps.numdevs; |
389 | struct osd_dev *od = sbi->layout.s_ods[i]; | 436 | struct osd_dev *od = sbi->comps.ods[i]; |
390 | 437 | ||
391 | if (od) { | 438 | if (od) { |
392 | sbi->layout.s_ods[i] = NULL; | 439 | sbi->comps.ods[i] = NULL; |
393 | osduld_put_device(od); | 440 | osduld_put_device(od); |
394 | } | 441 | } |
395 | } | 442 | } |
443 | if (sbi->comps.ods != sbi->_min_one_dev) | ||
444 | kfree(sbi->comps.ods); | ||
396 | kfree(sbi); | 445 | kfree(sbi); |
397 | } | 446 | } |
398 | 447 | ||
@@ -419,8 +468,8 @@ static void exofs_put_super(struct super_block *sb) | |||
419 | msecs_to_jiffies(100)); | 468 | msecs_to_jiffies(100)); |
420 | } | 469 | } |
421 | 470 | ||
422 | _exofs_print_device("Unmounting", NULL, sbi->layout.s_ods[0], | 471 | _exofs_print_device("Unmounting", NULL, sbi->comps.ods[0], |
423 | sbi->layout.s_pid); | 472 | sbi->one_comp.obj.partition); |
424 | 473 | ||
425 | bdi_destroy(&sbi->bdi); | 474 | bdi_destroy(&sbi->bdi); |
426 | exofs_free_sbi(sbi); | 475 | exofs_free_sbi(sbi); |
@@ -501,10 +550,19 @@ static int _read_and_match_data_map(struct exofs_sb_info *sbi, unsigned numdevs, | |||
501 | return -EINVAL; | 550 | return -EINVAL; |
502 | } | 551 | } |
503 | 552 | ||
553 | EXOFS_DBGMSG("exofs: layout: " | ||
554 | "num_comps=%u stripe_unit=0x%x group_width=%u " | ||
555 | "group_depth=0x%llx mirrors_p1=%u raid_algorithm=%u\n", | ||
556 | numdevs, | ||
557 | sbi->layout.stripe_unit, | ||
558 | sbi->layout.group_width, | ||
559 | _LLU(sbi->layout.group_depth), | ||
560 | sbi->layout.mirrors_p1, | ||
561 | sbi->data_map.odm_raid_algorithm); | ||
504 | return 0; | 562 | return 0; |
505 | } | 563 | } |
506 | 564 | ||
507 | static unsigned __ra_pages(struct exofs_layout *layout) | 565 | static unsigned __ra_pages(struct ore_layout *layout) |
508 | { | 566 | { |
509 | const unsigned _MIN_RA = 32; /* min 128K read-ahead */ | 567 | const unsigned _MIN_RA = 32; /* min 128K read-ahead */ |
510 | unsigned ra_pages = layout->group_width * layout->stripe_unit / | 568 | unsigned ra_pages = layout->group_width * layout->stripe_unit / |
@@ -547,13 +605,11 @@ static int exofs_devs_2_odi(struct exofs_dt_device_info *dt_dev, | |||
547 | return !(odi->systemid_len || odi->osdname_len); | 605 | return !(odi->systemid_len || odi->osdname_len); |
548 | } | 606 | } |
549 | 607 | ||
550 | static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | 608 | static int exofs_read_lookup_dev_table(struct exofs_sb_info *sbi, |
609 | struct osd_dev *fscb_od, | ||
551 | unsigned table_count) | 610 | unsigned table_count) |
552 | { | 611 | { |
553 | struct exofs_sb_info *sbi = *psbi; | 612 | struct ore_comp comp; |
554 | struct osd_dev *fscb_od; | ||
555 | struct osd_obj_id obj = {.partition = sbi->layout.s_pid, | ||
556 | .id = EXOFS_DEVTABLE_ID}; | ||
557 | struct exofs_device_table *dt; | 613 | struct exofs_device_table *dt; |
558 | unsigned table_bytes = table_count * sizeof(dt->dt_dev_table[0]) + | 614 | unsigned table_bytes = table_count * sizeof(dt->dt_dev_table[0]) + |
559 | sizeof(*dt); | 615 | sizeof(*dt); |
@@ -567,10 +623,14 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
567 | return -ENOMEM; | 623 | return -ENOMEM; |
568 | } | 624 | } |
569 | 625 | ||
570 | fscb_od = sbi->layout.s_ods[0]; | 626 | sbi->comps.numdevs = 0; |
571 | sbi->layout.s_ods[0] = NULL; | 627 | |
572 | sbi->layout.s_numdevs = 0; | 628 | comp.obj.partition = sbi->one_comp.obj.partition; |
573 | ret = exofs_read_kern(fscb_od, sbi->s_cred, &obj, 0, dt, table_bytes); | 629 | comp.obj.id = EXOFS_DEVTABLE_ID; |
630 | exofs_make_credential(comp.cred, &comp.obj); | ||
631 | |||
632 | ret = exofs_read_kern(fscb_od, comp.cred, &comp.obj, 0, dt, | ||
633 | table_bytes); | ||
574 | if (unlikely(ret)) { | 634 | if (unlikely(ret)) { |
575 | EXOFS_ERR("ERROR: reading device table\n"); | 635 | EXOFS_ERR("ERROR: reading device table\n"); |
576 | goto out; | 636 | goto out; |
@@ -588,16 +648,18 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
588 | goto out; | 648 | goto out; |
589 | 649 | ||
590 | if (likely(numdevs > 1)) { | 650 | if (likely(numdevs > 1)) { |
591 | unsigned size = numdevs * sizeof(sbi->layout.s_ods[0]); | 651 | unsigned size = numdevs * sizeof(sbi->comps.ods[0]); |
592 | 652 | ||
593 | sbi = krealloc(sbi, sizeof(*sbi) + size, GFP_KERNEL); | 653 | /* Twice bigger table: See exofs_init_comps() and below |
594 | if (unlikely(!sbi)) { | 654 | * comment |
655 | */ | ||
656 | sbi->comps.ods = kzalloc(size + size - 1, GFP_KERNEL); | ||
657 | if (unlikely(!sbi->comps.ods)) { | ||
658 | EXOFS_ERR("ERROR: faild allocating Device array[%d]\n", | ||
659 | numdevs); | ||
595 | ret = -ENOMEM; | 660 | ret = -ENOMEM; |
596 | goto out; | 661 | goto out; |
597 | } | 662 | } |
598 | memset(&sbi->layout.s_ods[1], 0, | ||
599 | size - sizeof(sbi->layout.s_ods[0])); | ||
600 | *psbi = sbi; | ||
601 | } | 663 | } |
602 | 664 | ||
603 | for (i = 0; i < numdevs; i++) { | 665 | for (i = 0; i < numdevs; i++) { |
@@ -619,8 +681,8 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
619 | * line. We always keep them in device-table order. | 681 | * line. We always keep them in device-table order. |
620 | */ | 682 | */ |
621 | if (fscb_od && osduld_device_same(fscb_od, &odi)) { | 683 | if (fscb_od && osduld_device_same(fscb_od, &odi)) { |
622 | sbi->layout.s_ods[i] = fscb_od; | 684 | sbi->comps.ods[i] = fscb_od; |
623 | ++sbi->layout.s_numdevs; | 685 | ++sbi->comps.numdevs; |
624 | fscb_od = NULL; | 686 | fscb_od = NULL; |
625 | continue; | 687 | continue; |
626 | } | 688 | } |
@@ -633,13 +695,13 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
633 | goto out; | 695 | goto out; |
634 | } | 696 | } |
635 | 697 | ||
636 | sbi->layout.s_ods[i] = od; | 698 | sbi->comps.ods[i] = od; |
637 | ++sbi->layout.s_numdevs; | 699 | ++sbi->comps.numdevs; |
638 | 700 | ||
639 | /* Read the fscb of the other devices to make sure the FS | 701 | /* Read the fscb of the other devices to make sure the FS |
640 | * partition is there. | 702 | * partition is there. |
641 | */ | 703 | */ |
642 | ret = exofs_read_kern(od, sbi->s_cred, &obj, 0, &fscb, | 704 | ret = exofs_read_kern(od, comp.cred, &comp.obj, 0, &fscb, |
643 | sizeof(fscb)); | 705 | sizeof(fscb)); |
644 | if (unlikely(ret)) { | 706 | if (unlikely(ret)) { |
645 | EXOFS_ERR("ERROR: Malformed participating device " | 707 | EXOFS_ERR("ERROR: Malformed participating device " |
@@ -656,13 +718,22 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
656 | 718 | ||
657 | out: | 719 | out: |
658 | kfree(dt); | 720 | kfree(dt); |
659 | if (unlikely(!ret && fscb_od)) { | 721 | if (likely(!ret)) { |
660 | EXOFS_ERR( | 722 | unsigned numdevs = sbi->comps.numdevs; |
661 | "ERROR: Bad device-table container device not present\n"); | ||
662 | osduld_put_device(fscb_od); | ||
663 | ret = -EINVAL; | ||
664 | } | ||
665 | 723 | ||
724 | if (unlikely(fscb_od)) { | ||
725 | EXOFS_ERR("ERROR: Bad device-table container device not present\n"); | ||
726 | osduld_put_device(fscb_od); | ||
727 | return -EINVAL; | ||
728 | } | ||
729 | /* exofs round-robins the device table view according to inode | ||
730 | * number. We hold a: twice bigger table hence inodes can point | ||
731 | * to any device and have a sequential view of the table | ||
732 | * starting at this device. See exofs_init_comps() | ||
733 | */ | ||
734 | for (i = 0; i < numdevs - 1; ++i) | ||
735 | sbi->comps.ods[i + numdevs] = sbi->comps.ods[i]; | ||
736 | } | ||
666 | return ret; | 737 | return ret; |
667 | } | 738 | } |
668 | 739 | ||
@@ -676,7 +747,7 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
676 | struct exofs_sb_info *sbi; /*extended info */ | 747 | struct exofs_sb_info *sbi; /*extended info */ |
677 | struct osd_dev *od; /* Master device */ | 748 | struct osd_dev *od; /* Master device */ |
678 | struct exofs_fscb fscb; /*on-disk superblock info */ | 749 | struct exofs_fscb fscb; /*on-disk superblock info */ |
679 | struct osd_obj_id obj; | 750 | struct ore_comp comp; |
680 | unsigned table_count; | 751 | unsigned table_count; |
681 | int ret; | 752 | int ret; |
682 | 753 | ||
@@ -684,10 +755,6 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
684 | if (!sbi) | 755 | if (!sbi) |
685 | return -ENOMEM; | 756 | return -ENOMEM; |
686 | 757 | ||
687 | ret = bdi_setup_and_register(&sbi->bdi, "exofs", BDI_CAP_MAP_COPY); | ||
688 | if (ret) | ||
689 | goto free_bdi; | ||
690 | |||
691 | /* use mount options to fill superblock */ | 758 | /* use mount options to fill superblock */ |
692 | if (opts->is_osdname) { | 759 | if (opts->is_osdname) { |
693 | struct osd_dev_info odi = {.systemid_len = 0}; | 760 | struct osd_dev_info odi = {.systemid_len = 0}; |
@@ -695,6 +762,8 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
695 | odi.osdname_len = strlen(opts->dev_name); | 762 | odi.osdname_len = strlen(opts->dev_name); |
696 | odi.osdname = (u8 *)opts->dev_name; | 763 | odi.osdname = (u8 *)opts->dev_name; |
697 | od = osduld_info_lookup(&odi); | 764 | od = osduld_info_lookup(&odi); |
765 | kfree(opts->dev_name); | ||
766 | opts->dev_name = NULL; | ||
698 | } else { | 767 | } else { |
699 | od = osduld_path_lookup(opts->dev_name); | 768 | od = osduld_path_lookup(opts->dev_name); |
700 | } | 769 | } |
@@ -709,11 +778,16 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
709 | sbi->layout.group_width = 1; | 778 | sbi->layout.group_width = 1; |
710 | sbi->layout.group_depth = -1; | 779 | sbi->layout.group_depth = -1; |
711 | sbi->layout.group_count = 1; | 780 | sbi->layout.group_count = 1; |
712 | sbi->layout.s_ods[0] = od; | ||
713 | sbi->layout.s_numdevs = 1; | ||
714 | sbi->layout.s_pid = opts->pid; | ||
715 | sbi->s_timeout = opts->timeout; | 781 | sbi->s_timeout = opts->timeout; |
716 | 782 | ||
783 | sbi->one_comp.obj.partition = opts->pid; | ||
784 | sbi->one_comp.obj.id = 0; | ||
785 | exofs_make_credential(sbi->one_comp.cred, &sbi->one_comp.obj); | ||
786 | sbi->comps.numdevs = 1; | ||
787 | sbi->comps.single_comp = EC_SINGLE_COMP; | ||
788 | sbi->comps.comps = &sbi->one_comp; | ||
789 | sbi->comps.ods = sbi->_min_one_dev; | ||
790 | |||
717 | /* fill in some other data by hand */ | 791 | /* fill in some other data by hand */ |
718 | memset(sb->s_id, 0, sizeof(sb->s_id)); | 792 | memset(sb->s_id, 0, sizeof(sb->s_id)); |
719 | strcpy(sb->s_id, "exofs"); | 793 | strcpy(sb->s_id, "exofs"); |
@@ -724,11 +798,11 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
724 | sb->s_bdev = NULL; | 798 | sb->s_bdev = NULL; |
725 | sb->s_dev = 0; | 799 | sb->s_dev = 0; |
726 | 800 | ||
727 | obj.partition = sbi->layout.s_pid; | 801 | comp.obj.partition = sbi->one_comp.obj.partition; |
728 | obj.id = EXOFS_SUPER_ID; | 802 | comp.obj.id = EXOFS_SUPER_ID; |
729 | exofs_make_credential(sbi->s_cred, &obj); | 803 | exofs_make_credential(comp.cred, &comp.obj); |
730 | 804 | ||
731 | ret = exofs_read_kern(od, sbi->s_cred, &obj, 0, &fscb, sizeof(fscb)); | 805 | ret = exofs_read_kern(od, comp.cred, &comp.obj, 0, &fscb, sizeof(fscb)); |
732 | if (unlikely(ret)) | 806 | if (unlikely(ret)) |
733 | goto free_sbi; | 807 | goto free_sbi; |
734 | 808 | ||
@@ -757,9 +831,11 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
757 | 831 | ||
758 | table_count = le64_to_cpu(fscb.s_dev_table_count); | 832 | table_count = le64_to_cpu(fscb.s_dev_table_count); |
759 | if (table_count) { | 833 | if (table_count) { |
760 | ret = exofs_read_lookup_dev_table(&sbi, table_count); | 834 | ret = exofs_read_lookup_dev_table(sbi, od, table_count); |
761 | if (unlikely(ret)) | 835 | if (unlikely(ret)) |
762 | goto free_sbi; | 836 | goto free_sbi; |
837 | } else { | ||
838 | sbi->comps.ods[0] = od; | ||
763 | } | 839 | } |
764 | 840 | ||
765 | __sbi_read_stats(sbi); | 841 | __sbi_read_stats(sbi); |
@@ -793,20 +869,20 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
793 | goto free_sbi; | 869 | goto free_sbi; |
794 | } | 870 | } |
795 | 871 | ||
796 | _exofs_print_device("Mounting", opts->dev_name, sbi->layout.s_ods[0], | 872 | ret = bdi_setup_and_register(&sbi->bdi, "exofs", BDI_CAP_MAP_COPY); |
797 | sbi->layout.s_pid); | 873 | if (ret) { |
798 | if (opts->is_osdname) | 874 | EXOFS_DBGMSG("Failed to bdi_setup_and_register\n"); |
799 | kfree(opts->dev_name); | 875 | goto free_sbi; |
876 | } | ||
877 | |||
878 | _exofs_print_device("Mounting", opts->dev_name, sbi->comps.ods[0], | ||
879 | sbi->one_comp.obj.partition); | ||
800 | return 0; | 880 | return 0; |
801 | 881 | ||
802 | free_sbi: | 882 | free_sbi: |
803 | bdi_destroy(&sbi->bdi); | ||
804 | free_bdi: | ||
805 | EXOFS_ERR("Unable to mount exofs on %s pid=0x%llx err=%d\n", | 883 | EXOFS_ERR("Unable to mount exofs on %s pid=0x%llx err=%d\n", |
806 | opts->dev_name, sbi->layout.s_pid, ret); | 884 | opts->dev_name, sbi->one_comp.obj.partition, ret); |
807 | exofs_free_sbi(sbi); | 885 | exofs_free_sbi(sbi); |
808 | if (opts->is_osdname) | ||
809 | kfree(opts->dev_name); | ||
810 | return ret; | 886 | return ret; |
811 | } | 887 | } |
812 | 888 | ||
@@ -837,7 +913,7 @@ static int exofs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
837 | { | 913 | { |
838 | struct super_block *sb = dentry->d_sb; | 914 | struct super_block *sb = dentry->d_sb; |
839 | struct exofs_sb_info *sbi = sb->s_fs_info; | 915 | struct exofs_sb_info *sbi = sb->s_fs_info; |
840 | struct exofs_io_state *ios; | 916 | struct ore_io_state *ios; |
841 | struct osd_attr attrs[] = { | 917 | struct osd_attr attrs[] = { |
842 | ATTR_DEF(OSD_APAGE_PARTITION_QUOTAS, | 918 | ATTR_DEF(OSD_APAGE_PARTITION_QUOTAS, |
843 | OSD_ATTR_PQ_CAPACITY_QUOTA, sizeof(__be64)), | 919 | OSD_ATTR_PQ_CAPACITY_QUOTA, sizeof(__be64)), |
@@ -846,21 +922,18 @@ static int exofs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
846 | }; | 922 | }; |
847 | uint64_t capacity = ULLONG_MAX; | 923 | uint64_t capacity = ULLONG_MAX; |
848 | uint64_t used = ULLONG_MAX; | 924 | uint64_t used = ULLONG_MAX; |
849 | uint8_t cred_a[OSD_CAP_LEN]; | ||
850 | int ret; | 925 | int ret; |
851 | 926 | ||
852 | ret = exofs_get_io_state(&sbi->layout, &ios); | 927 | ret = ore_get_io_state(&sbi->layout, &sbi->comps, &ios); |
853 | if (ret) { | 928 | if (ret) { |
854 | EXOFS_DBGMSG("exofs_get_io_state failed.\n"); | 929 | EXOFS_DBGMSG("ore_get_io_state failed.\n"); |
855 | return ret; | 930 | return ret; |
856 | } | 931 | } |
857 | 932 | ||
858 | exofs_make_credential(cred_a, &ios->obj); | ||
859 | ios->cred = sbi->s_cred; | ||
860 | ios->in_attr = attrs; | 933 | ios->in_attr = attrs; |
861 | ios->in_attr_len = ARRAY_SIZE(attrs); | 934 | ios->in_attr_len = ARRAY_SIZE(attrs); |
862 | 935 | ||
863 | ret = exofs_sbi_read(ios); | 936 | ret = ore_read(ios); |
864 | if (unlikely(ret)) | 937 | if (unlikely(ret)) |
865 | goto out; | 938 | goto out; |
866 | 939 | ||
@@ -889,7 +962,7 @@ static int exofs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
889 | buf->f_namelen = EXOFS_NAME_LEN; | 962 | buf->f_namelen = EXOFS_NAME_LEN; |
890 | 963 | ||
891 | out: | 964 | out: |
892 | exofs_put_io_state(ios); | 965 | ore_put_io_state(ios); |
893 | return ret; | 966 | return ret; |
894 | } | 967 | } |
895 | 968 | ||
diff --git a/fs/inode.c b/fs/inode.c index 5aab80dc008c..73920d555c88 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -143,6 +143,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode) | |||
143 | inode->i_op = &empty_iops; | 143 | inode->i_op = &empty_iops; |
144 | inode->i_fop = &empty_fops; | 144 | inode->i_fop = &empty_fops; |
145 | inode->i_nlink = 1; | 145 | inode->i_nlink = 1; |
146 | inode->i_opflags = 0; | ||
146 | inode->i_uid = 0; | 147 | inode->i_uid = 0; |
147 | inode->i_gid = 0; | 148 | inode->i_gid = 0; |
148 | atomic_set(&inode->i_writecount, 0); | 149 | atomic_set(&inode->i_writecount, 0); |
diff --git a/fs/namei.c b/fs/namei.c index 445fd5da11fa..2826db35dc25 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -179,19 +179,14 @@ static int check_acl(struct inode *inode, int mask) | |||
179 | #ifdef CONFIG_FS_POSIX_ACL | 179 | #ifdef CONFIG_FS_POSIX_ACL |
180 | struct posix_acl *acl; | 180 | struct posix_acl *acl; |
181 | 181 | ||
182 | /* | ||
183 | * Under RCU walk, we cannot even do a "get_cached_acl()", | ||
184 | * because that involves locking and getting a refcount on | ||
185 | * a cached ACL. | ||
186 | * | ||
187 | * So the only case we handle during RCU walking is the | ||
188 | * case of a cached "no ACL at all", which needs no locks | ||
189 | * or refcounts. | ||
190 | */ | ||
191 | if (mask & MAY_NOT_BLOCK) { | 182 | if (mask & MAY_NOT_BLOCK) { |
192 | if (negative_cached_acl(inode, ACL_TYPE_ACCESS)) | 183 | acl = get_cached_acl_rcu(inode, ACL_TYPE_ACCESS); |
184 | if (!acl) | ||
193 | return -EAGAIN; | 185 | return -EAGAIN; |
194 | return -ECHILD; | 186 | /* no ->get_acl() calls in RCU mode... */ |
187 | if (acl == ACL_NOT_CACHED) | ||
188 | return -ECHILD; | ||
189 | return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK); | ||
195 | } | 190 | } |
196 | 191 | ||
197 | acl = get_cached_acl(inode, ACL_TYPE_ACCESS); | 192 | acl = get_cached_acl(inode, ACL_TYPE_ACCESS); |
@@ -313,6 +308,26 @@ int generic_permission(struct inode *inode, int mask) | |||
313 | return -EACCES; | 308 | return -EACCES; |
314 | } | 309 | } |
315 | 310 | ||
311 | /* | ||
312 | * We _really_ want to just do "generic_permission()" without | ||
313 | * even looking at the inode->i_op values. So we keep a cache | ||
314 | * flag in inode->i_opflags, that says "this has not special | ||
315 | * permission function, use the fast case". | ||
316 | */ | ||
317 | static inline int do_inode_permission(struct inode *inode, int mask) | ||
318 | { | ||
319 | if (unlikely(!(inode->i_opflags & IOP_FASTPERM))) { | ||
320 | if (likely(inode->i_op->permission)) | ||
321 | return inode->i_op->permission(inode, mask); | ||
322 | |||
323 | /* This gets set once for the inode lifetime */ | ||
324 | spin_lock(&inode->i_lock); | ||
325 | inode->i_opflags |= IOP_FASTPERM; | ||
326 | spin_unlock(&inode->i_lock); | ||
327 | } | ||
328 | return generic_permission(inode, mask); | ||
329 | } | ||
330 | |||
316 | /** | 331 | /** |
317 | * inode_permission - check for access rights to a given inode | 332 | * inode_permission - check for access rights to a given inode |
318 | * @inode: inode to check permission on | 333 | * @inode: inode to check permission on |
@@ -327,7 +342,7 @@ int inode_permission(struct inode *inode, int mask) | |||
327 | { | 342 | { |
328 | int retval; | 343 | int retval; |
329 | 344 | ||
330 | if (mask & MAY_WRITE) { | 345 | if (unlikely(mask & MAY_WRITE)) { |
331 | umode_t mode = inode->i_mode; | 346 | umode_t mode = inode->i_mode; |
332 | 347 | ||
333 | /* | 348 | /* |
@@ -344,11 +359,7 @@ int inode_permission(struct inode *inode, int mask) | |||
344 | return -EACCES; | 359 | return -EACCES; |
345 | } | 360 | } |
346 | 361 | ||
347 | if (inode->i_op->permission) | 362 | retval = do_inode_permission(inode, mask); |
348 | retval = inode->i_op->permission(inode, mask); | ||
349 | else | ||
350 | retval = generic_permission(inode, mask); | ||
351 | |||
352 | if (retval) | 363 | if (retval) |
353 | return retval; | 364 | return retval; |
354 | 365 | ||
@@ -1250,6 +1261,26 @@ static void terminate_walk(struct nameidata *nd) | |||
1250 | } | 1261 | } |
1251 | } | 1262 | } |
1252 | 1263 | ||
1264 | /* | ||
1265 | * Do we need to follow links? We _really_ want to be able | ||
1266 | * to do this check without having to look at inode->i_op, | ||
1267 | * so we keep a cache of "no, this doesn't need follow_link" | ||
1268 | * for the common case. | ||
1269 | */ | ||
1270 | static inline int should_follow_link(struct inode *inode, int follow) | ||
1271 | { | ||
1272 | if (unlikely(!(inode->i_opflags & IOP_NOFOLLOW))) { | ||
1273 | if (likely(inode->i_op->follow_link)) | ||
1274 | return follow; | ||
1275 | |||
1276 | /* This gets set once for the inode lifetime */ | ||
1277 | spin_lock(&inode->i_lock); | ||
1278 | inode->i_opflags |= IOP_NOFOLLOW; | ||
1279 | spin_unlock(&inode->i_lock); | ||
1280 | } | ||
1281 | return 0; | ||
1282 | } | ||
1283 | |||
1253 | static inline int walk_component(struct nameidata *nd, struct path *path, | 1284 | static inline int walk_component(struct nameidata *nd, struct path *path, |
1254 | struct qstr *name, int type, int follow) | 1285 | struct qstr *name, int type, int follow) |
1255 | { | 1286 | { |
@@ -1272,7 +1303,7 @@ static inline int walk_component(struct nameidata *nd, struct path *path, | |||
1272 | terminate_walk(nd); | 1303 | terminate_walk(nd); |
1273 | return -ENOENT; | 1304 | return -ENOENT; |
1274 | } | 1305 | } |
1275 | if (unlikely(inode->i_op->follow_link) && follow) { | 1306 | if (should_follow_link(inode, follow)) { |
1276 | if (nd->flags & LOOKUP_RCU) { | 1307 | if (nd->flags & LOOKUP_RCU) { |
1277 | if (unlikely(unlazy_walk(nd, path->dentry))) { | 1308 | if (unlikely(unlazy_walk(nd, path->dentry))) { |
1278 | terminate_walk(nd); | 1309 | terminate_walk(nd); |
@@ -1325,6 +1356,26 @@ static inline int nested_symlink(struct path *path, struct nameidata *nd) | |||
1325 | } | 1356 | } |
1326 | 1357 | ||
1327 | /* | 1358 | /* |
1359 | * We really don't want to look at inode->i_op->lookup | ||
1360 | * when we don't have to. So we keep a cache bit in | ||
1361 | * the inode ->i_opflags field that says "yes, we can | ||
1362 | * do lookup on this inode". | ||
1363 | */ | ||
1364 | static inline int can_lookup(struct inode *inode) | ||
1365 | { | ||
1366 | if (likely(inode->i_opflags & IOP_LOOKUP)) | ||
1367 | return 1; | ||
1368 | if (likely(!inode->i_op->lookup)) | ||
1369 | return 0; | ||
1370 | |||
1371 | /* We do this once for the lifetime of the inode */ | ||
1372 | spin_lock(&inode->i_lock); | ||
1373 | inode->i_opflags |= IOP_LOOKUP; | ||
1374 | spin_unlock(&inode->i_lock); | ||
1375 | return 1; | ||
1376 | } | ||
1377 | |||
1378 | /* | ||
1328 | * Name resolution. | 1379 | * Name resolution. |
1329 | * This is the basic name resolution function, turning a pathname into | 1380 | * This is the basic name resolution function, turning a pathname into |
1330 | * the final dentry. We expect 'base' to be positive and a directory. | 1381 | * the final dentry. We expect 'base' to be positive and a directory. |
@@ -1403,10 +1454,10 @@ static int link_path_walk(const char *name, struct nameidata *nd) | |||
1403 | if (err) | 1454 | if (err) |
1404 | return err; | 1455 | return err; |
1405 | } | 1456 | } |
1457 | if (can_lookup(nd->inode)) | ||
1458 | continue; | ||
1406 | err = -ENOTDIR; | 1459 | err = -ENOTDIR; |
1407 | if (!nd->inode->i_op->lookup) | 1460 | break; |
1408 | break; | ||
1409 | continue; | ||
1410 | /* here ends the main loop */ | 1461 | /* here ends the main loop */ |
1411 | 1462 | ||
1412 | last_component: | 1463 | last_component: |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 08e3eccf9a12..5eb02069e1b8 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -1118,7 +1118,7 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf, | |||
1118 | * Warn that /proc/pid/oom_adj is deprecated, see | 1118 | * Warn that /proc/pid/oom_adj is deprecated, see |
1119 | * Documentation/feature-removal-schedule.txt. | 1119 | * Documentation/feature-removal-schedule.txt. |
1120 | */ | 1120 | */ |
1121 | WARN_ONCE(1, "%s (%d): /proc/%d/oom_adj is deprecated, please use /proc/%d/oom_score_adj instead.\n", | 1121 | printk_once(KERN_WARNING "%s (%d): /proc/%d/oom_adj is deprecated, please use /proc/%d/oom_score_adj instead.\n", |
1122 | current->comm, task_pid_nr(current), task_pid_nr(task), | 1122 | current->comm, task_pid_nr(current), task_pid_nr(task), |
1123 | task_pid_nr(task)); | 1123 | task_pid_nr(task)); |
1124 | task->signal->oom_adj = oom_adjust; | 1124 | task->signal->oom_adj = oom_adjust; |
@@ -1919,6 +1919,14 @@ static int proc_fd_info(struct inode *inode, struct path *path, char *info) | |||
1919 | spin_lock(&files->file_lock); | 1919 | spin_lock(&files->file_lock); |
1920 | file = fcheck_files(files, fd); | 1920 | file = fcheck_files(files, fd); |
1921 | if (file) { | 1921 | if (file) { |
1922 | unsigned int f_flags; | ||
1923 | struct fdtable *fdt; | ||
1924 | |||
1925 | fdt = files_fdtable(files); | ||
1926 | f_flags = file->f_flags & ~O_CLOEXEC; | ||
1927 | if (FD_ISSET(fd, fdt->close_on_exec)) | ||
1928 | f_flags |= O_CLOEXEC; | ||
1929 | |||
1922 | if (path) { | 1930 | if (path) { |
1923 | *path = file->f_path; | 1931 | *path = file->f_path; |
1924 | path_get(&file->f_path); | 1932 | path_get(&file->f_path); |
@@ -1928,7 +1936,7 @@ static int proc_fd_info(struct inode *inode, struct path *path, char *info) | |||
1928 | "pos:\t%lli\n" | 1936 | "pos:\t%lli\n" |
1929 | "flags:\t0%o\n", | 1937 | "flags:\t0%o\n", |
1930 | (long long) file->f_pos, | 1938 | (long long) file->f_pos, |
1931 | file->f_flags); | 1939 | f_flags); |
1932 | spin_unlock(&files->file_lock); | 1940 | spin_unlock(&files->file_lock); |
1933 | put_files_struct(files); | 1941 | put_files_struct(files); |
1934 | return 0; | 1942 | return 0; |
@@ -27,12 +27,12 @@ void generic_fillattr(struct inode *inode, struct kstat *stat) | |||
27 | stat->uid = inode->i_uid; | 27 | stat->uid = inode->i_uid; |
28 | stat->gid = inode->i_gid; | 28 | stat->gid = inode->i_gid; |
29 | stat->rdev = inode->i_rdev; | 29 | stat->rdev = inode->i_rdev; |
30 | stat->size = i_size_read(inode); | ||
30 | stat->atime = inode->i_atime; | 31 | stat->atime = inode->i_atime; |
31 | stat->mtime = inode->i_mtime; | 32 | stat->mtime = inode->i_mtime; |
32 | stat->ctime = inode->i_ctime; | 33 | stat->ctime = inode->i_ctime; |
33 | stat->size = i_size_read(inode); | ||
34 | stat->blocks = inode->i_blocks; | ||
35 | stat->blksize = (1 << inode->i_blkbits); | 34 | stat->blksize = (1 << inode->i_blkbits); |
35 | stat->blocks = inode->i_blocks; | ||
36 | } | 36 | } |
37 | 37 | ||
38 | EXPORT_SYMBOL(generic_fillattr); | 38 | EXPORT_SYMBOL(generic_fillattr); |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 33d12f87f0e0..44335e57eaaa 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
@@ -205,6 +205,8 @@ struct drm_display_info { | |||
205 | enum subpixel_order subpixel_order; | 205 | enum subpixel_order subpixel_order; |
206 | u32 color_formats; | 206 | u32 color_formats; |
207 | 207 | ||
208 | u8 cea_rev; | ||
209 | |||
208 | char *raw_edid; /* if any */ | 210 | char *raw_edid; /* if any */ |
209 | }; | 211 | }; |
210 | 212 | ||
@@ -802,6 +804,7 @@ extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, | |||
802 | extern int drm_add_modes_noedid(struct drm_connector *connector, | 804 | extern int drm_add_modes_noedid(struct drm_connector *connector, |
803 | int hdisplay, int vdisplay); | 805 | int hdisplay, int vdisplay); |
804 | 806 | ||
807 | extern int drm_edid_header_is_valid(const u8 *raw_edid); | ||
805 | extern bool drm_edid_is_valid(struct edid *edid); | 808 | extern bool drm_edid_is_valid(struct edid *edid); |
806 | struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, | 809 | struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, |
807 | int hsize, int vsize, int fresh); | 810 | int hsize, int vsize, int fresh); |
diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h index c4d6dbfa3ff4..28c0d114cb52 100644 --- a/include/drm/i915_drm.h +++ b/include/drm/i915_drm.h | |||
@@ -237,7 +237,7 @@ typedef struct _drm_i915_sarea { | |||
237 | #define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture) | 237 | #define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture) |
238 | #define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id) | 238 | #define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id) |
239 | #define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise) | 239 | #define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise) |
240 | #define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_IOCTL_I915_OVERLAY_ATTRS, struct drm_intel_overlay_put_image) | 240 | #define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_I915_OVERLAY_PUT_IMAGE, struct drm_intel_overlay_put_image) |
241 | #define DRM_IOCTL_I915_OVERLAY_ATTRS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs) | 241 | #define DRM_IOCTL_I915_OVERLAY_ATTRS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs) |
242 | 242 | ||
243 | /* Allow drivers to submit batchbuffers directly to hardware, relying | 243 | /* Allow drivers to submit batchbuffers directly to hardware, relying |
diff --git a/include/linux/cred.h b/include/linux/cred.h index 48e82af1159b..40308969ed00 100644 --- a/include/linux/cred.h +++ b/include/linux/cred.h | |||
@@ -265,10 +265,11 @@ static inline void put_cred(const struct cred *_cred) | |||
265 | /** | 265 | /** |
266 | * current_cred - Access the current task's subjective credentials | 266 | * current_cred - Access the current task's subjective credentials |
267 | * | 267 | * |
268 | * Access the subjective credentials of the current task. | 268 | * Access the subjective credentials of the current task. RCU-safe, |
269 | * since nobody else can modify it. | ||
269 | */ | 270 | */ |
270 | #define current_cred() \ | 271 | #define current_cred() \ |
271 | (current->cred) | 272 | rcu_dereference_protected(current->cred, 1) |
272 | 273 | ||
273 | /** | 274 | /** |
274 | * __task_cred - Access a task's objective credentials | 275 | * __task_cred - Access a task's objective credentials |
@@ -306,8 +307,8 @@ static inline void put_cred(const struct cred *_cred) | |||
306 | #define get_current_user() \ | 307 | #define get_current_user() \ |
307 | ({ \ | 308 | ({ \ |
308 | struct user_struct *__u; \ | 309 | struct user_struct *__u; \ |
309 | struct cred *__cred; \ | 310 | const struct cred *__cred; \ |
310 | __cred = (struct cred *) current_cred(); \ | 311 | __cred = current_cred(); \ |
311 | __u = get_uid(__cred->user); \ | 312 | __u = get_uid(__cred->user); \ |
312 | __u; \ | 313 | __u; \ |
313 | }) | 314 | }) |
@@ -321,8 +322,8 @@ static inline void put_cred(const struct cred *_cred) | |||
321 | #define get_current_groups() \ | 322 | #define get_current_groups() \ |
322 | ({ \ | 323 | ({ \ |
323 | struct group_info *__groups; \ | 324 | struct group_info *__groups; \ |
324 | struct cred *__cred; \ | 325 | const struct cred *__cred; \ |
325 | __cred = (struct cred *) current_cred(); \ | 326 | __cred = current_cred(); \ |
326 | __groups = get_group_info(__cred->group_info); \ | 327 | __groups = get_group_info(__cred->group_info); \ |
327 | __groups; \ | 328 | __groups; \ |
328 | }) | 329 | }) |
@@ -341,7 +342,7 @@ static inline void put_cred(const struct cred *_cred) | |||
341 | 342 | ||
342 | #define current_cred_xxx(xxx) \ | 343 | #define current_cred_xxx(xxx) \ |
343 | ({ \ | 344 | ({ \ |
344 | current->cred->xxx; \ | 345 | current_cred()->xxx; \ |
345 | }) | 346 | }) |
346 | 347 | ||
347 | #define current_uid() (current_cred_xxx(uid)) | 348 | #define current_uid() (current_cred_xxx(uid)) |
diff --git a/include/linux/cryptohash.h b/include/linux/cryptohash.h index ec78a4bbe1d5..2cd9f1cf9fa3 100644 --- a/include/linux/cryptohash.h +++ b/include/linux/cryptohash.h | |||
@@ -3,11 +3,16 @@ | |||
3 | 3 | ||
4 | #define SHA_DIGEST_WORDS 5 | 4 | #define SHA_DIGEST_WORDS 5 |
5 | #define SHA_MESSAGE_BYTES (512 /*bits*/ / 8) | 5 | #define SHA_MESSAGE_BYTES (512 /*bits*/ / 8) |
6 | #define SHA_WORKSPACE_WORDS 80 | 6 | #define SHA_WORKSPACE_WORDS 16 |
7 | 7 | ||
8 | void sha_init(__u32 *buf); | 8 | void sha_init(__u32 *buf); |
9 | void sha_transform(__u32 *digest, const char *data, __u32 *W); | 9 | void sha_transform(__u32 *digest, const char *data, __u32 *W); |
10 | 10 | ||
11 | #define MD5_DIGEST_WORDS 4 | ||
12 | #define MD5_MESSAGE_BYTES 64 | ||
13 | |||
14 | void md5_transform(__u32 *hash, __u32 const *in); | ||
15 | |||
11 | __u32 half_md4_transform(__u32 buf[4], __u32 const in[8]); | 16 | __u32 half_md4_transform(__u32 buf[4], __u32 const in[8]); |
12 | 17 | ||
13 | #endif | 18 | #endif |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index d37d2a793099..62157c03caf7 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
@@ -180,12 +180,12 @@ struct dentry_operations { | |||
180 | */ | 180 | */ |
181 | 181 | ||
182 | /* d_flags entries */ | 182 | /* d_flags entries */ |
183 | #define DCACHE_AUTOFS_PENDING 0x0001 /* autofs: "under construction" */ | 183 | #define DCACHE_OP_HASH 0x0001 |
184 | #define DCACHE_NFSFS_RENAMED 0x0002 | 184 | #define DCACHE_OP_COMPARE 0x0002 |
185 | /* this dentry has been "silly renamed" and has to be deleted on the last | 185 | #define DCACHE_OP_REVALIDATE 0x0004 |
186 | * dput() */ | 186 | #define DCACHE_OP_DELETE 0x0008 |
187 | 187 | ||
188 | #define DCACHE_DISCONNECTED 0x0004 | 188 | #define DCACHE_DISCONNECTED 0x0010 |
189 | /* This dentry is possibly not currently connected to the dcache tree, in | 189 | /* This dentry is possibly not currently connected to the dcache tree, in |
190 | * which case its parent will either be itself, or will have this flag as | 190 | * which case its parent will either be itself, or will have this flag as |
191 | * well. nfsd will not use a dentry with this bit set, but will first | 191 | * well. nfsd will not use a dentry with this bit set, but will first |
@@ -196,22 +196,18 @@ struct dentry_operations { | |||
196 | * dentry into place and return that dentry rather than the passed one, | 196 | * dentry into place and return that dentry rather than the passed one, |
197 | * typically using d_splice_alias. */ | 197 | * typically using d_splice_alias. */ |
198 | 198 | ||
199 | #define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */ | 199 | #define DCACHE_REFERENCED 0x0020 /* Recently used, don't discard. */ |
200 | #define DCACHE_RCUACCESS 0x0010 /* Entry has ever been RCU-visible */ | 200 | #define DCACHE_RCUACCESS 0x0040 /* Entry has ever been RCU-visible */ |
201 | #define DCACHE_INOTIFY_PARENT_WATCHED 0x0020 | ||
202 | /* Parent inode is watched by inotify */ | ||
203 | |||
204 | #define DCACHE_COOKIE 0x0040 /* For use by dcookie subsystem */ | ||
205 | #define DCACHE_FSNOTIFY_PARENT_WATCHED 0x0080 | ||
206 | /* Parent inode is watched by some fsnotify listener */ | ||
207 | 201 | ||
208 | #define DCACHE_CANT_MOUNT 0x0100 | 202 | #define DCACHE_CANT_MOUNT 0x0100 |
209 | #define DCACHE_GENOCIDE 0x0200 | 203 | #define DCACHE_GENOCIDE 0x0200 |
210 | 204 | ||
211 | #define DCACHE_OP_HASH 0x1000 | 205 | #define DCACHE_NFSFS_RENAMED 0x1000 |
212 | #define DCACHE_OP_COMPARE 0x2000 | 206 | /* this dentry has been "silly renamed" and has to be deleted on the last |
213 | #define DCACHE_OP_REVALIDATE 0x4000 | 207 | * dput() */ |
214 | #define DCACHE_OP_DELETE 0x8000 | 208 | #define DCACHE_COOKIE 0x2000 /* For use by dcookie subsystem */ |
209 | #define DCACHE_FSNOTIFY_PARENT_WATCHED 0x4000 | ||
210 | /* Parent inode is watched by some fsnotify listener */ | ||
215 | 211 | ||
216 | #define DCACHE_MOUNTED 0x10000 /* is a mountpoint */ | 212 | #define DCACHE_MOUNTED 0x10000 /* is a mountpoint */ |
217 | #define DCACHE_NEED_AUTOMOUNT 0x20000 /* handle automount on this dir */ | 213 | #define DCACHE_NEED_AUTOMOUNT 0x20000 /* handle automount on this dir */ |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 786b3b1113cf..178cdb4f1d4a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -738,22 +738,54 @@ static inline int mapping_writably_mapped(struct address_space *mapping) | |||
738 | struct posix_acl; | 738 | struct posix_acl; |
739 | #define ACL_NOT_CACHED ((void *)(-1)) | 739 | #define ACL_NOT_CACHED ((void *)(-1)) |
740 | 740 | ||
741 | #define IOP_FASTPERM 0x0001 | ||
742 | #define IOP_LOOKUP 0x0002 | ||
743 | #define IOP_NOFOLLOW 0x0004 | ||
744 | |||
745 | /* | ||
746 | * Keep mostly read-only and often accessed (especially for | ||
747 | * the RCU path lookup and 'stat' data) fields at the beginning | ||
748 | * of the 'struct inode' | ||
749 | */ | ||
741 | struct inode { | 750 | struct inode { |
742 | /* RCU path lookup touches following: */ | ||
743 | umode_t i_mode; | 751 | umode_t i_mode; |
752 | unsigned short i_opflags; | ||
744 | uid_t i_uid; | 753 | uid_t i_uid; |
745 | gid_t i_gid; | 754 | gid_t i_gid; |
755 | unsigned int i_flags; | ||
756 | |||
757 | #ifdef CONFIG_FS_POSIX_ACL | ||
758 | struct posix_acl *i_acl; | ||
759 | struct posix_acl *i_default_acl; | ||
760 | #endif | ||
761 | |||
746 | const struct inode_operations *i_op; | 762 | const struct inode_operations *i_op; |
747 | struct super_block *i_sb; | 763 | struct super_block *i_sb; |
764 | struct address_space *i_mapping; | ||
748 | 765 | ||
749 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | ||
750 | unsigned int i_flags; | ||
751 | unsigned long i_state; | ||
752 | #ifdef CONFIG_SECURITY | 766 | #ifdef CONFIG_SECURITY |
753 | void *i_security; | 767 | void *i_security; |
754 | #endif | 768 | #endif |
755 | struct mutex i_mutex; | ||
756 | 769 | ||
770 | /* Stat data, not accessed from path walking */ | ||
771 | unsigned long i_ino; | ||
772 | unsigned int i_nlink; | ||
773 | dev_t i_rdev; | ||
774 | loff_t i_size; | ||
775 | struct timespec i_atime; | ||
776 | struct timespec i_mtime; | ||
777 | struct timespec i_ctime; | ||
778 | unsigned int i_blkbits; | ||
779 | blkcnt_t i_blocks; | ||
780 | |||
781 | #ifdef __NEED_I_SIZE_ORDERED | ||
782 | seqcount_t i_size_seqcount; | ||
783 | #endif | ||
784 | |||
785 | /* Misc */ | ||
786 | unsigned long i_state; | ||
787 | spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ | ||
788 | struct mutex i_mutex; | ||
757 | 789 | ||
758 | unsigned long dirtied_when; /* jiffies of first dirtying */ | 790 | unsigned long dirtied_when; /* jiffies of first dirtying */ |
759 | 791 | ||
@@ -765,25 +797,12 @@ struct inode { | |||
765 | struct list_head i_dentry; | 797 | struct list_head i_dentry; |
766 | struct rcu_head i_rcu; | 798 | struct rcu_head i_rcu; |
767 | }; | 799 | }; |
768 | unsigned long i_ino; | ||
769 | atomic_t i_count; | 800 | atomic_t i_count; |
770 | unsigned int i_nlink; | ||
771 | dev_t i_rdev; | ||
772 | unsigned int i_blkbits; | ||
773 | u64 i_version; | 801 | u64 i_version; |
774 | loff_t i_size; | ||
775 | #ifdef __NEED_I_SIZE_ORDERED | ||
776 | seqcount_t i_size_seqcount; | ||
777 | #endif | ||
778 | struct timespec i_atime; | ||
779 | struct timespec i_mtime; | ||
780 | struct timespec i_ctime; | ||
781 | blkcnt_t i_blocks; | ||
782 | unsigned short i_bytes; | 802 | unsigned short i_bytes; |
783 | atomic_t i_dio_count; | 803 | atomic_t i_dio_count; |
784 | const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ | 804 | const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ |
785 | struct file_lock *i_flock; | 805 | struct file_lock *i_flock; |
786 | struct address_space *i_mapping; | ||
787 | struct address_space i_data; | 806 | struct address_space i_data; |
788 | #ifdef CONFIG_QUOTA | 807 | #ifdef CONFIG_QUOTA |
789 | struct dquot *i_dquot[MAXQUOTAS]; | 808 | struct dquot *i_dquot[MAXQUOTAS]; |
@@ -806,10 +825,6 @@ struct inode { | |||
806 | atomic_t i_readcount; /* struct files open RO */ | 825 | atomic_t i_readcount; /* struct files open RO */ |
807 | #endif | 826 | #endif |
808 | atomic_t i_writecount; | 827 | atomic_t i_writecount; |
809 | #ifdef CONFIG_FS_POSIX_ACL | ||
810 | struct posix_acl *i_acl; | ||
811 | struct posix_acl *i_default_acl; | ||
812 | #endif | ||
813 | void *i_private; /* fs or device private pointer */ | 828 | void *i_private; /* fs or device private pointer */ |
814 | }; | 829 | }; |
815 | 830 | ||
diff --git a/include/linux/input.h b/include/linux/input.h index 068784e17972..a637e7814334 100644 --- a/include/linux/input.h +++ b/include/linux/input.h | |||
@@ -438,6 +438,8 @@ struct input_keymap_entry { | |||
438 | #define KEY_WIMAX 246 | 438 | #define KEY_WIMAX 246 |
439 | #define KEY_RFKILL 247 /* Key that controls all radios */ | 439 | #define KEY_RFKILL 247 /* Key that controls all radios */ |
440 | 440 | ||
441 | #define KEY_MICMUTE 248 /* Mute / unmute the microphone */ | ||
442 | |||
441 | /* Code 255 is reserved for special needs of AT keyboard driver */ | 443 | /* Code 255 is reserved for special needs of AT keyboard driver */ |
442 | 444 | ||
443 | #define BTN_MISC 0x100 | 445 | #define BTN_MISC 0x100 |
diff --git a/include/linux/mm.h b/include/linux/mm.h index f2690cf49827..fd599f4bb846 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -962,6 +962,8 @@ int invalidate_inode_page(struct page *page); | |||
962 | #ifdef CONFIG_MMU | 962 | #ifdef CONFIG_MMU |
963 | extern int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, | 963 | extern int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, |
964 | unsigned long address, unsigned int flags); | 964 | unsigned long address, unsigned int flags); |
965 | extern int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, | ||
966 | unsigned long address, unsigned int fault_flags); | ||
965 | #else | 967 | #else |
966 | static inline int handle_mm_fault(struct mm_struct *mm, | 968 | static inline int handle_mm_fault(struct mm_struct *mm, |
967 | struct vm_area_struct *vma, unsigned long address, | 969 | struct vm_area_struct *vma, unsigned long address, |
@@ -971,6 +973,14 @@ static inline int handle_mm_fault(struct mm_struct *mm, | |||
971 | BUG(); | 973 | BUG(); |
972 | return VM_FAULT_SIGBUS; | 974 | return VM_FAULT_SIGBUS; |
973 | } | 975 | } |
976 | static inline int fixup_user_fault(struct task_struct *tsk, | ||
977 | struct mm_struct *mm, unsigned long address, | ||
978 | unsigned int fault_flags) | ||
979 | { | ||
980 | /* should never happen if there's no MMU */ | ||
981 | BUG(); | ||
982 | return -EFAULT; | ||
983 | } | ||
974 | #endif | 984 | #endif |
975 | 985 | ||
976 | extern int make_pages_present(unsigned long addr, unsigned long end); | 986 | extern int make_pages_present(unsigned long addr, unsigned long end); |
@@ -988,8 +998,6 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, | |||
988 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, | 998 | int get_user_pages_fast(unsigned long start, int nr_pages, int write, |
989 | struct page **pages); | 999 | struct page **pages); |
990 | struct page *get_dump_page(unsigned long addr); | 1000 | struct page *get_dump_page(unsigned long addr); |
991 | extern int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, | ||
992 | unsigned long address, unsigned int fault_flags); | ||
993 | 1001 | ||
994 | extern int try_to_release_page(struct page * page, gfp_t gfp_mask); | 1002 | extern int try_to_release_page(struct page * page, gfp_t gfp_mask); |
995 | extern void do_invalidatepage(struct page *page, unsigned long offset); | 1003 | extern void do_invalidatepage(struct page *page, unsigned long offset); |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 569ea5b76fda..abd615d74a29 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
@@ -773,6 +773,11 @@ struct nfs3_getaclres { | |||
773 | struct posix_acl * acl_default; | 773 | struct posix_acl * acl_default; |
774 | }; | 774 | }; |
775 | 775 | ||
776 | struct nfs4_string { | ||
777 | unsigned int len; | ||
778 | char *data; | ||
779 | }; | ||
780 | |||
776 | #ifdef CONFIG_NFS_V4 | 781 | #ifdef CONFIG_NFS_V4 |
777 | 782 | ||
778 | typedef u64 clientid4; | 783 | typedef u64 clientid4; |
@@ -963,11 +968,6 @@ struct nfs4_server_caps_res { | |||
963 | struct nfs4_sequence_res seq_res; | 968 | struct nfs4_sequence_res seq_res; |
964 | }; | 969 | }; |
965 | 970 | ||
966 | struct nfs4_string { | ||
967 | unsigned int len; | ||
968 | char *data; | ||
969 | }; | ||
970 | |||
971 | #define NFS4_PATHNAME_MAXCOMPONENTS 512 | 971 | #define NFS4_PATHNAME_MAXCOMPONENTS 512 |
972 | struct nfs4_pathname { | 972 | struct nfs4_pathname { |
973 | unsigned int ncomponents; | 973 | unsigned int ncomponents; |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index b00c4ec5056e..ae96bbe54518 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -2709,6 +2709,16 @@ | |||
2709 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 | 2709 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 |
2710 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN 0x3b00 | 2710 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN 0x3b00 |
2711 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX 0x3b1f | 2711 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX 0x3b1f |
2712 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB0 0x3c20 | ||
2713 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB1 0x3c21 | ||
2714 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB2 0x3c22 | ||
2715 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB3 0x3c23 | ||
2716 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB4 0x3c24 | ||
2717 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB5 0x3c25 | ||
2718 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB6 0x3c26 | ||
2719 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB7 0x3c27 | ||
2720 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB8 0x3c2e | ||
2721 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB9 0x3c2f | ||
2712 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f | 2722 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f |
2713 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 | 2723 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 |
2714 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 | 2724 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 |
diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 951bba82d50d..b7681102a4b9 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h | |||
@@ -9,6 +9,7 @@ | |||
9 | #define __LINUX_POSIX_ACL_H | 9 | #define __LINUX_POSIX_ACL_H |
10 | 10 | ||
11 | #include <linux/slab.h> | 11 | #include <linux/slab.h> |
12 | #include <linux/rcupdate.h> | ||
12 | 13 | ||
13 | #define ACL_UNDEFINED_ID (-1) | 14 | #define ACL_UNDEFINED_ID (-1) |
14 | 15 | ||
@@ -38,7 +39,10 @@ struct posix_acl_entry { | |||
38 | }; | 39 | }; |
39 | 40 | ||
40 | struct posix_acl { | 41 | struct posix_acl { |
41 | atomic_t a_refcount; | 42 | union { |
43 | atomic_t a_refcount; | ||
44 | struct rcu_head a_rcu; | ||
45 | }; | ||
42 | unsigned int a_count; | 46 | unsigned int a_count; |
43 | struct posix_acl_entry a_entries[0]; | 47 | struct posix_acl_entry a_entries[0]; |
44 | }; | 48 | }; |
@@ -65,7 +69,7 @@ static inline void | |||
65 | posix_acl_release(struct posix_acl *acl) | 69 | posix_acl_release(struct posix_acl *acl) |
66 | { | 70 | { |
67 | if (acl && atomic_dec_and_test(&acl->a_refcount)) | 71 | if (acl && atomic_dec_and_test(&acl->a_refcount)) |
68 | kfree(acl); | 72 | kfree_rcu(acl, a_rcu); |
69 | } | 73 | } |
70 | 74 | ||
71 | 75 | ||
@@ -84,20 +88,22 @@ extern struct posix_acl *get_posix_acl(struct inode *, int); | |||
84 | extern int set_posix_acl(struct inode *, int, struct posix_acl *); | 88 | extern int set_posix_acl(struct inode *, int, struct posix_acl *); |
85 | 89 | ||
86 | #ifdef CONFIG_FS_POSIX_ACL | 90 | #ifdef CONFIG_FS_POSIX_ACL |
87 | static inline struct posix_acl *get_cached_acl(struct inode *inode, int type) | 91 | static inline struct posix_acl **acl_by_type(struct inode *inode, int type) |
88 | { | 92 | { |
89 | struct posix_acl **p, *acl; | ||
90 | switch (type) { | 93 | switch (type) { |
91 | case ACL_TYPE_ACCESS: | 94 | case ACL_TYPE_ACCESS: |
92 | p = &inode->i_acl; | 95 | return &inode->i_acl; |
93 | break; | ||
94 | case ACL_TYPE_DEFAULT: | 96 | case ACL_TYPE_DEFAULT: |
95 | p = &inode->i_default_acl; | 97 | return &inode->i_default_acl; |
96 | break; | ||
97 | default: | 98 | default: |
98 | return ERR_PTR(-EINVAL); | 99 | BUG(); |
99 | } | 100 | } |
100 | acl = ACCESS_ONCE(*p); | 101 | } |
102 | |||
103 | static inline struct posix_acl *get_cached_acl(struct inode *inode, int type) | ||
104 | { | ||
105 | struct posix_acl **p = acl_by_type(inode, type); | ||
106 | struct posix_acl *acl = ACCESS_ONCE(*p); | ||
101 | if (acl) { | 107 | if (acl) { |
102 | spin_lock(&inode->i_lock); | 108 | spin_lock(&inode->i_lock); |
103 | acl = *p; | 109 | acl = *p; |
@@ -108,41 +114,20 @@ static inline struct posix_acl *get_cached_acl(struct inode *inode, int type) | |||
108 | return acl; | 114 | return acl; |
109 | } | 115 | } |
110 | 116 | ||
111 | static inline int negative_cached_acl(struct inode *inode, int type) | 117 | static inline struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type) |
112 | { | 118 | { |
113 | struct posix_acl **p, *acl; | 119 | return rcu_dereference(*acl_by_type(inode, type)); |
114 | switch (type) { | ||
115 | case ACL_TYPE_ACCESS: | ||
116 | p = &inode->i_acl; | ||
117 | break; | ||
118 | case ACL_TYPE_DEFAULT: | ||
119 | p = &inode->i_default_acl; | ||
120 | break; | ||
121 | default: | ||
122 | BUG(); | ||
123 | } | ||
124 | acl = ACCESS_ONCE(*p); | ||
125 | if (acl) | ||
126 | return 0; | ||
127 | return 1; | ||
128 | } | 120 | } |
129 | 121 | ||
130 | static inline void set_cached_acl(struct inode *inode, | 122 | static inline void set_cached_acl(struct inode *inode, |
131 | int type, | 123 | int type, |
132 | struct posix_acl *acl) | 124 | struct posix_acl *acl) |
133 | { | 125 | { |
134 | struct posix_acl *old = NULL; | 126 | struct posix_acl **p = acl_by_type(inode, type); |
127 | struct posix_acl *old; | ||
135 | spin_lock(&inode->i_lock); | 128 | spin_lock(&inode->i_lock); |
136 | switch (type) { | 129 | old = *p; |
137 | case ACL_TYPE_ACCESS: | 130 | rcu_assign_pointer(*p, posix_acl_dup(acl)); |
138 | old = inode->i_acl; | ||
139 | inode->i_acl = posix_acl_dup(acl); | ||
140 | break; | ||
141 | case ACL_TYPE_DEFAULT: | ||
142 | old = inode->i_default_acl; | ||
143 | inode->i_default_acl = posix_acl_dup(acl); | ||
144 | break; | ||
145 | } | ||
146 | spin_unlock(&inode->i_lock); | 131 | spin_unlock(&inode->i_lock); |
147 | if (old != ACL_NOT_CACHED) | 132 | if (old != ACL_NOT_CACHED) |
148 | posix_acl_release(old); | 133 | posix_acl_release(old); |
@@ -150,18 +135,11 @@ static inline void set_cached_acl(struct inode *inode, | |||
150 | 135 | ||
151 | static inline void forget_cached_acl(struct inode *inode, int type) | 136 | static inline void forget_cached_acl(struct inode *inode, int type) |
152 | { | 137 | { |
153 | struct posix_acl *old = NULL; | 138 | struct posix_acl **p = acl_by_type(inode, type); |
139 | struct posix_acl *old; | ||
154 | spin_lock(&inode->i_lock); | 140 | spin_lock(&inode->i_lock); |
155 | switch (type) { | 141 | old = *p; |
156 | case ACL_TYPE_ACCESS: | 142 | *p = ACL_NOT_CACHED; |
157 | old = inode->i_acl; | ||
158 | inode->i_acl = ACL_NOT_CACHED; | ||
159 | break; | ||
160 | case ACL_TYPE_DEFAULT: | ||
161 | old = inode->i_default_acl; | ||
162 | inode->i_default_acl = ACL_NOT_CACHED; | ||
163 | break; | ||
164 | } | ||
165 | spin_unlock(&inode->i_lock); | 143 | spin_unlock(&inode->i_lock); |
166 | if (old != ACL_NOT_CACHED) | 144 | if (old != ACL_NOT_CACHED) |
167 | posix_acl_release(old); | 145 | posix_acl_release(old); |
diff --git a/include/linux/random.h b/include/linux/random.h index ce29a040c8dc..d13059f3ea32 100644 --- a/include/linux/random.h +++ b/include/linux/random.h | |||
@@ -57,18 +57,6 @@ extern void add_interrupt_randomness(int irq); | |||
57 | extern void get_random_bytes(void *buf, int nbytes); | 57 | extern void get_random_bytes(void *buf, int nbytes); |
58 | void generate_random_uuid(unsigned char uuid_out[16]); | 58 | void generate_random_uuid(unsigned char uuid_out[16]); |
59 | 59 | ||
60 | extern __u32 secure_ip_id(__be32 daddr); | ||
61 | extern __u32 secure_ipv6_id(const __be32 daddr[4]); | ||
62 | extern u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport); | ||
63 | extern u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | ||
64 | __be16 dport); | ||
65 | extern __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr, | ||
66 | __be16 sport, __be16 dport); | ||
67 | extern __u32 secure_tcpv6_sequence_number(__be32 *saddr, __be32 *daddr, | ||
68 | __be16 sport, __be16 dport); | ||
69 | extern u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, | ||
70 | __be16 sport, __be16 dport); | ||
71 | |||
72 | #ifndef MODULE | 60 | #ifndef MODULE |
73 | extern const struct file_operations random_fops, urandom_fops; | 61 | extern const struct file_operations random_fops, urandom_fops; |
74 | #endif | 62 | #endif |
diff --git a/include/net/cipso_ipv4.h b/include/net/cipso_ipv4.h index 3b938743514b..9808877c2ab9 100644 --- a/include/net/cipso_ipv4.h +++ b/include/net/cipso_ipv4.h | |||
@@ -8,7 +8,7 @@ | |||
8 | * have chosen to adopt the protocol and over the years it has become a | 8 | * have chosen to adopt the protocol and over the years it has become a |
9 | * de-facto standard for labeled networking. | 9 | * de-facto standard for labeled networking. |
10 | * | 10 | * |
11 | * Author: Paul Moore <paul.moore@hp.com> | 11 | * Author: Paul Moore <paul@paul-moore.com> |
12 | * | 12 | * |
13 | */ | 13 | */ |
14 | 14 | ||
diff --git a/include/net/dst.h b/include/net/dst.h index 29e255796ce1..13d507d69ddb 100644 --- a/include/net/dst.h +++ b/include/net/dst.h | |||
@@ -37,7 +37,7 @@ struct dst_entry { | |||
37 | unsigned long _metrics; | 37 | unsigned long _metrics; |
38 | unsigned long expires; | 38 | unsigned long expires; |
39 | struct dst_entry *path; | 39 | struct dst_entry *path; |
40 | struct neighbour *_neighbour; | 40 | struct neighbour __rcu *_neighbour; |
41 | #ifdef CONFIG_XFRM | 41 | #ifdef CONFIG_XFRM |
42 | struct xfrm_state *xfrm; | 42 | struct xfrm_state *xfrm; |
43 | #else | 43 | #else |
@@ -88,12 +88,17 @@ struct dst_entry { | |||
88 | 88 | ||
89 | static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst) | 89 | static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst) |
90 | { | 90 | { |
91 | return dst->_neighbour; | 91 | return rcu_dereference(dst->_neighbour); |
92 | } | ||
93 | |||
94 | static inline struct neighbour *dst_get_neighbour_raw(struct dst_entry *dst) | ||
95 | { | ||
96 | return rcu_dereference_raw(dst->_neighbour); | ||
92 | } | 97 | } |
93 | 98 | ||
94 | static inline void dst_set_neighbour(struct dst_entry *dst, struct neighbour *neigh) | 99 | static inline void dst_set_neighbour(struct dst_entry *dst, struct neighbour *neigh) |
95 | { | 100 | { |
96 | dst->_neighbour = neigh; | 101 | rcu_assign_pointer(dst->_neighbour, neigh); |
97 | } | 102 | } |
98 | 103 | ||
99 | extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); | 104 | extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); |
@@ -382,8 +387,12 @@ static inline void dst_rcu_free(struct rcu_head *head) | |||
382 | static inline void dst_confirm(struct dst_entry *dst) | 387 | static inline void dst_confirm(struct dst_entry *dst) |
383 | { | 388 | { |
384 | if (dst) { | 389 | if (dst) { |
385 | struct neighbour *n = dst_get_neighbour(dst); | 390 | struct neighbour *n; |
391 | |||
392 | rcu_read_lock(); | ||
393 | n = dst_get_neighbour(dst); | ||
386 | neigh_confirm(n); | 394 | neigh_confirm(n); |
395 | rcu_read_unlock(); | ||
387 | } | 396 | } |
388 | } | 397 | } |
389 | 398 | ||
diff --git a/include/net/netlabel.h b/include/net/netlabel.h index f21a16ee3705..f67440970d7e 100644 --- a/include/net/netlabel.h +++ b/include/net/netlabel.h | |||
@@ -4,7 +4,7 @@ | |||
4 | * The NetLabel system manages static and dynamic label mappings for network | 4 | * The NetLabel system manages static and dynamic label mappings for network |
5 | * protocols such as CIPSO and RIPSO. | 5 | * protocols such as CIPSO and RIPSO. |
6 | * | 6 | * |
7 | * Author: Paul Moore <paul.moore@hp.com> | 7 | * Author: Paul Moore <paul@paul-moore.com> |
8 | * | 8 | * |
9 | */ | 9 | */ |
10 | 10 | ||
diff --git a/include/net/secure_seq.h b/include/net/secure_seq.h new file mode 100644 index 000000000000..d97f6892c019 --- /dev/null +++ b/include/net/secure_seq.h | |||
@@ -0,0 +1,20 @@ | |||
1 | #ifndef _NET_SECURE_SEQ | ||
2 | #define _NET_SECURE_SEQ | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | extern __u32 secure_ip_id(__be32 daddr); | ||
7 | extern __u32 secure_ipv6_id(const __be32 daddr[4]); | ||
8 | extern u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport); | ||
9 | extern u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | ||
10 | __be16 dport); | ||
11 | extern __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr, | ||
12 | __be16 sport, __be16 dport); | ||
13 | extern __u32 secure_tcpv6_sequence_number(__be32 *saddr, __be32 *daddr, | ||
14 | __be16 sport, __be16 dport); | ||
15 | extern u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, | ||
16 | __be16 sport, __be16 dport); | ||
17 | extern u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr, | ||
18 | __be16 sport, __be16 dport); | ||
19 | |||
20 | #endif /* _NET_SECURE_SEQ */ | ||
diff --git a/include/scsi/osd_ore.h b/include/scsi/osd_ore.h new file mode 100644 index 000000000000..c5c5e008e6de --- /dev/null +++ b/include/scsi/osd_ore.h | |||
@@ -0,0 +1,125 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 | ||
3 | * Boaz Harrosh <bharrosh@panasas.com> | ||
4 | * | ||
5 | * Public Declarations of the ORE API | ||
6 | * | ||
7 | * This file is part of the ORE (Object Raid Engine) library. | ||
8 | * | ||
9 | * ORE is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as published | ||
11 | * by the Free Software Foundation. (GPL v2) | ||
12 | * | ||
13 | * ORE is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with the ORE; if not, write to the Free Software | ||
20 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
21 | */ | ||
22 | #ifndef __ORE_H__ | ||
23 | #define __ORE_H__ | ||
24 | |||
25 | #include <scsi/osd_initiator.h> | ||
26 | #include <scsi/osd_attributes.h> | ||
27 | #include <scsi/osd_sec.h> | ||
28 | #include <linux/pnfs_osd_xdr.h> | ||
29 | |||
30 | struct ore_comp { | ||
31 | struct osd_obj_id obj; | ||
32 | u8 cred[OSD_CAP_LEN]; | ||
33 | }; | ||
34 | |||
35 | struct ore_layout { | ||
36 | /* Our way of looking at the data_map */ | ||
37 | unsigned stripe_unit; | ||
38 | unsigned mirrors_p1; | ||
39 | |||
40 | unsigned group_width; | ||
41 | u64 group_depth; | ||
42 | unsigned group_count; | ||
43 | }; | ||
44 | |||
45 | struct ore_components { | ||
46 | unsigned numdevs; /* Num of devices in array */ | ||
47 | /* If @single_comp == EC_SINGLE_COMP, @comps points to a single | ||
48 | * component. else there are @numdevs components | ||
49 | */ | ||
50 | enum EC_COMP_USAGE { | ||
51 | EC_SINGLE_COMP = 0, EC_MULTPLE_COMPS = 0xffffffff | ||
52 | } single_comp; | ||
53 | struct ore_comp *comps; | ||
54 | struct osd_dev **ods; /* osd_dev array */ | ||
55 | }; | ||
56 | |||
57 | struct ore_io_state; | ||
58 | typedef void (*ore_io_done_fn)(struct ore_io_state *ios, void *private); | ||
59 | |||
60 | struct ore_io_state { | ||
61 | struct kref kref; | ||
62 | |||
63 | void *private; | ||
64 | ore_io_done_fn done; | ||
65 | |||
66 | struct ore_layout *layout; | ||
67 | struct ore_components *comps; | ||
68 | |||
69 | /* Global read/write IO*/ | ||
70 | loff_t offset; | ||
71 | unsigned long length; | ||
72 | void *kern_buff; | ||
73 | |||
74 | struct page **pages; | ||
75 | unsigned nr_pages; | ||
76 | unsigned pgbase; | ||
77 | unsigned pages_consumed; | ||
78 | |||
79 | /* Attributes */ | ||
80 | unsigned in_attr_len; | ||
81 | struct osd_attr *in_attr; | ||
82 | unsigned out_attr_len; | ||
83 | struct osd_attr *out_attr; | ||
84 | |||
85 | bool reading; | ||
86 | |||
87 | /* Variable array of size numdevs */ | ||
88 | unsigned numdevs; | ||
89 | struct ore_per_dev_state { | ||
90 | struct osd_request *or; | ||
91 | struct bio *bio; | ||
92 | loff_t offset; | ||
93 | unsigned length; | ||
94 | unsigned dev; | ||
95 | } per_dev[]; | ||
96 | }; | ||
97 | |||
98 | static inline unsigned ore_io_state_size(unsigned numdevs) | ||
99 | { | ||
100 | return sizeof(struct ore_io_state) + | ||
101 | sizeof(struct ore_per_dev_state) * numdevs; | ||
102 | } | ||
103 | |||
104 | /* ore.c */ | ||
105 | int ore_get_rw_state(struct ore_layout *layout, struct ore_components *comps, | ||
106 | bool is_reading, u64 offset, u64 length, | ||
107 | struct ore_io_state **ios); | ||
108 | int ore_get_io_state(struct ore_layout *layout, struct ore_components *comps, | ||
109 | struct ore_io_state **ios); | ||
110 | void ore_put_io_state(struct ore_io_state *ios); | ||
111 | |||
112 | int ore_check_io(struct ore_io_state *ios, u64 *resid); | ||
113 | |||
114 | int ore_create(struct ore_io_state *ios); | ||
115 | int ore_remove(struct ore_io_state *ios); | ||
116 | int ore_write(struct ore_io_state *ios); | ||
117 | int ore_read(struct ore_io_state *ios); | ||
118 | int ore_truncate(struct ore_layout *layout, struct ore_components *comps, | ||
119 | u64 size); | ||
120 | |||
121 | int extract_attr_from_ios(struct ore_io_state *ios, struct osd_attr *attr); | ||
122 | |||
123 | extern const struct osd_attr g_attr_logical_length; | ||
124 | |||
125 | #endif | ||
diff --git a/include/sound/wm8915.h b/include/sound/wm8996.h index 5817d762f6f3..ea4d88f43975 100644 --- a/include/sound/wm8915.h +++ b/include/sound/wm8996.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * linux/sound/wm8915.h -- Platform data for WM8915 | 2 | * linux/sound/wm8996.h -- Platform data for WM8996 |
3 | * | 3 | * |
4 | * Copyright 2011 Wolfson Microelectronics. PLC. | 4 | * Copyright 2011 Wolfson Microelectronics. PLC. |
5 | * | 5 | * |
@@ -8,14 +8,14 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #ifndef __LINUX_SND_WM8903_H | 11 | #ifndef __LINUX_SND_WM8996_H |
12 | #define __LINUX_SND_WM8903_H | 12 | #define __LINUX_SND_WM8996_H |
13 | 13 | ||
14 | enum wm8915_inmode { | 14 | enum wm8996_inmode { |
15 | WM8915_DIFFERRENTIAL_1 = 0, /* IN1xP - IN1xN */ | 15 | WM8996_DIFFERRENTIAL_1 = 0, /* IN1xP - IN1xN */ |
16 | WM8915_INVERTING = 1, /* IN1xN */ | 16 | WM8996_INVERTING = 1, /* IN1xN */ |
17 | WM8915_NON_INVERTING = 2, /* IN1xP */ | 17 | WM8996_NON_INVERTING = 2, /* IN1xP */ |
18 | WM8915_DIFFERENTIAL_2 = 3, /* IN2xP - IN2xP */ | 18 | WM8996_DIFFERENTIAL_2 = 3, /* IN2xP - IN2xP */ |
19 | }; | 19 | }; |
20 | 20 | ||
21 | /** | 21 | /** |
@@ -25,23 +25,23 @@ enum wm8915_inmode { | |||
25 | * Configurations are expected to be generated using the ReTune Mobile | 25 | * Configurations are expected to be generated using the ReTune Mobile |
26 | * control panel in WISCE - see http://www.wolfsonmicro.com/wisce/ | 26 | * control panel in WISCE - see http://www.wolfsonmicro.com/wisce/ |
27 | */ | 27 | */ |
28 | struct wm8915_retune_mobile_config { | 28 | struct wm8996_retune_mobile_config { |
29 | const char *name; | 29 | const char *name; |
30 | int rate; | 30 | int rate; |
31 | u16 regs[20]; | 31 | u16 regs[20]; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | #define WM8915_SET_DEFAULT 0x10000 | 34 | #define WM8996_SET_DEFAULT 0x10000 |
35 | 35 | ||
36 | struct wm8915_pdata { | 36 | struct wm8996_pdata { |
37 | int irq_flags; /** Set IRQ trigger flags; default active low */ | 37 | int irq_flags; /** Set IRQ trigger flags; default active low */ |
38 | 38 | ||
39 | int ldo_ena; /** GPIO for LDO1; -1 for none */ | 39 | int ldo_ena; /** GPIO for LDO1; -1 for none */ |
40 | 40 | ||
41 | int micdet_def; /** Default MICDET_SRC/HP1FB_SRC/MICD_BIAS */ | 41 | int micdet_def; /** Default MICDET_SRC/HP1FB_SRC/MICD_BIAS */ |
42 | 42 | ||
43 | enum wm8915_inmode inl_mode; | 43 | enum wm8996_inmode inl_mode; |
44 | enum wm8915_inmode inr_mode; | 44 | enum wm8996_inmode inr_mode; |
45 | 45 | ||
46 | u32 spkmute_seq; /** Value for register 0x802 */ | 46 | u32 spkmute_seq; /** Value for register 0x802 */ |
47 | 47 | ||
@@ -49,7 +49,7 @@ struct wm8915_pdata { | |||
49 | u32 gpio_default[5]; | 49 | u32 gpio_default[5]; |
50 | 50 | ||
51 | int num_retune_mobile_cfgs; | 51 | int num_retune_mobile_cfgs; |
52 | struct wm8915_retune_mobile_config *retune_mobile_cfgs; | 52 | struct wm8996_retune_mobile_config *retune_mobile_cfgs; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | #endif | 55 | #endif |
@@ -105,9 +105,16 @@ void shm_exit_ns(struct ipc_namespace *ns) | |||
105 | } | 105 | } |
106 | #endif | 106 | #endif |
107 | 107 | ||
108 | void __init shm_init (void) | 108 | static int __init ipc_ns_init(void) |
109 | { | 109 | { |
110 | shm_init_ns(&init_ipc_ns); | 110 | shm_init_ns(&init_ipc_ns); |
111 | return 0; | ||
112 | } | ||
113 | |||
114 | pure_initcall(ipc_ns_init); | ||
115 | |||
116 | void __init shm_init (void) | ||
117 | { | ||
111 | ipc_init_proc_interface("sysvipc/shm", | 118 | ipc_init_proc_interface("sysvipc/shm", |
112 | #if BITS_PER_LONG <= 32 | 119 | #if BITS_PER_LONG <= 32 |
113 | " key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime rss swap\n", | 120 | " key shmid perms size cpid lpid nattch uid gid cuid cgid atime dtime ctime rss swap\n", |
diff --git a/kernel/futex.c b/kernel/futex.c index 0a308970c24a..11cbe052b2e8 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
@@ -218,6 +218,8 @@ static void drop_futex_key_refs(union futex_key *key) | |||
218 | * @uaddr: virtual address of the futex | 218 | * @uaddr: virtual address of the futex |
219 | * @fshared: 0 for a PROCESS_PRIVATE futex, 1 for PROCESS_SHARED | 219 | * @fshared: 0 for a PROCESS_PRIVATE futex, 1 for PROCESS_SHARED |
220 | * @key: address where result is stored. | 220 | * @key: address where result is stored. |
221 | * @rw: mapping needs to be read/write (values: VERIFY_READ, | ||
222 | * VERIFY_WRITE) | ||
221 | * | 223 | * |
222 | * Returns a negative error code or 0 | 224 | * Returns a negative error code or 0 |
223 | * The key words are stored in *key on success. | 225 | * The key words are stored in *key on success. |
@@ -229,12 +231,12 @@ static void drop_futex_key_refs(union futex_key *key) | |||
229 | * lock_page() might sleep, the caller should not hold a spinlock. | 231 | * lock_page() might sleep, the caller should not hold a spinlock. |
230 | */ | 232 | */ |
231 | static int | 233 | static int |
232 | get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key) | 234 | get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key, int rw) |
233 | { | 235 | { |
234 | unsigned long address = (unsigned long)uaddr; | 236 | unsigned long address = (unsigned long)uaddr; |
235 | struct mm_struct *mm = current->mm; | 237 | struct mm_struct *mm = current->mm; |
236 | struct page *page, *page_head; | 238 | struct page *page, *page_head; |
237 | int err; | 239 | int err, ro = 0; |
238 | 240 | ||
239 | /* | 241 | /* |
240 | * The futex address must be "naturally" aligned. | 242 | * The futex address must be "naturally" aligned. |
@@ -262,8 +264,18 @@ get_futex_key(u32 __user *uaddr, int fshared, union futex_key *key) | |||
262 | 264 | ||
263 | again: | 265 | again: |
264 | err = get_user_pages_fast(address, 1, 1, &page); | 266 | err = get_user_pages_fast(address, 1, 1, &page); |
267 | /* | ||
268 | * If write access is not required (eg. FUTEX_WAIT), try | ||
269 | * and get read-only access. | ||
270 | */ | ||
271 | if (err == -EFAULT && rw == VERIFY_READ) { | ||
272 | err = get_user_pages_fast(address, 1, 0, &page); | ||
273 | ro = 1; | ||
274 | } | ||
265 | if (err < 0) | 275 | if (err < 0) |
266 | return err; | 276 | return err; |
277 | else | ||
278 | err = 0; | ||
267 | 279 | ||
268 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE | 280 | #ifdef CONFIG_TRANSPARENT_HUGEPAGE |
269 | page_head = page; | 281 | page_head = page; |
@@ -305,6 +317,13 @@ again: | |||
305 | if (!page_head->mapping) { | 317 | if (!page_head->mapping) { |
306 | unlock_page(page_head); | 318 | unlock_page(page_head); |
307 | put_page(page_head); | 319 | put_page(page_head); |
320 | /* | ||
321 | * ZERO_PAGE pages don't have a mapping. Avoid a busy loop | ||
322 | * trying to find one. RW mapping would have COW'd (and thus | ||
323 | * have a mapping) so this page is RO and won't ever change. | ||
324 | */ | ||
325 | if ((page_head == ZERO_PAGE(address))) | ||
326 | return -EFAULT; | ||
308 | goto again; | 327 | goto again; |
309 | } | 328 | } |
310 | 329 | ||
@@ -316,6 +335,15 @@ again: | |||
316 | * the object not the particular process. | 335 | * the object not the particular process. |
317 | */ | 336 | */ |
318 | if (PageAnon(page_head)) { | 337 | if (PageAnon(page_head)) { |
338 | /* | ||
339 | * A RO anonymous page will never change and thus doesn't make | ||
340 | * sense for futex operations. | ||
341 | */ | ||
342 | if (ro) { | ||
343 | err = -EFAULT; | ||
344 | goto out; | ||
345 | } | ||
346 | |||
319 | key->both.offset |= FUT_OFF_MMSHARED; /* ref taken on mm */ | 347 | key->both.offset |= FUT_OFF_MMSHARED; /* ref taken on mm */ |
320 | key->private.mm = mm; | 348 | key->private.mm = mm; |
321 | key->private.address = address; | 349 | key->private.address = address; |
@@ -327,9 +355,10 @@ again: | |||
327 | 355 | ||
328 | get_futex_key_refs(key); | 356 | get_futex_key_refs(key); |
329 | 357 | ||
358 | out: | ||
330 | unlock_page(page_head); | 359 | unlock_page(page_head); |
331 | put_page(page_head); | 360 | put_page(page_head); |
332 | return 0; | 361 | return err; |
333 | } | 362 | } |
334 | 363 | ||
335 | static inline void put_futex_key(union futex_key *key) | 364 | static inline void put_futex_key(union futex_key *key) |
@@ -940,7 +969,7 @@ futex_wake(u32 __user *uaddr, unsigned int flags, int nr_wake, u32 bitset) | |||
940 | if (!bitset) | 969 | if (!bitset) |
941 | return -EINVAL; | 970 | return -EINVAL; |
942 | 971 | ||
943 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key); | 972 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, VERIFY_READ); |
944 | if (unlikely(ret != 0)) | 973 | if (unlikely(ret != 0)) |
945 | goto out; | 974 | goto out; |
946 | 975 | ||
@@ -986,10 +1015,10 @@ futex_wake_op(u32 __user *uaddr1, unsigned int flags, u32 __user *uaddr2, | |||
986 | int ret, op_ret; | 1015 | int ret, op_ret; |
987 | 1016 | ||
988 | retry: | 1017 | retry: |
989 | ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1); | 1018 | ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, VERIFY_READ); |
990 | if (unlikely(ret != 0)) | 1019 | if (unlikely(ret != 0)) |
991 | goto out; | 1020 | goto out; |
992 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2); | 1021 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE); |
993 | if (unlikely(ret != 0)) | 1022 | if (unlikely(ret != 0)) |
994 | goto out_put_key1; | 1023 | goto out_put_key1; |
995 | 1024 | ||
@@ -1243,10 +1272,11 @@ retry: | |||
1243 | pi_state = NULL; | 1272 | pi_state = NULL; |
1244 | } | 1273 | } |
1245 | 1274 | ||
1246 | ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1); | 1275 | ret = get_futex_key(uaddr1, flags & FLAGS_SHARED, &key1, VERIFY_READ); |
1247 | if (unlikely(ret != 0)) | 1276 | if (unlikely(ret != 0)) |
1248 | goto out; | 1277 | goto out; |
1249 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2); | 1278 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, |
1279 | requeue_pi ? VERIFY_WRITE : VERIFY_READ); | ||
1250 | if (unlikely(ret != 0)) | 1280 | if (unlikely(ret != 0)) |
1251 | goto out_put_key1; | 1281 | goto out_put_key1; |
1252 | 1282 | ||
@@ -1790,7 +1820,7 @@ static int futex_wait_setup(u32 __user *uaddr, u32 val, unsigned int flags, | |||
1790 | * while the syscall executes. | 1820 | * while the syscall executes. |
1791 | */ | 1821 | */ |
1792 | retry: | 1822 | retry: |
1793 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q->key); | 1823 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q->key, VERIFY_READ); |
1794 | if (unlikely(ret != 0)) | 1824 | if (unlikely(ret != 0)) |
1795 | return ret; | 1825 | return ret; |
1796 | 1826 | ||
@@ -1941,7 +1971,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, int detect, | |||
1941 | } | 1971 | } |
1942 | 1972 | ||
1943 | retry: | 1973 | retry: |
1944 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q.key); | 1974 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &q.key, VERIFY_WRITE); |
1945 | if (unlikely(ret != 0)) | 1975 | if (unlikely(ret != 0)) |
1946 | goto out; | 1976 | goto out; |
1947 | 1977 | ||
@@ -2060,7 +2090,7 @@ retry: | |||
2060 | if ((uval & FUTEX_TID_MASK) != vpid) | 2090 | if ((uval & FUTEX_TID_MASK) != vpid) |
2061 | return -EPERM; | 2091 | return -EPERM; |
2062 | 2092 | ||
2063 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key); | 2093 | ret = get_futex_key(uaddr, flags & FLAGS_SHARED, &key, VERIFY_WRITE); |
2064 | if (unlikely(ret != 0)) | 2094 | if (unlikely(ret != 0)) |
2065 | goto out; | 2095 | goto out; |
2066 | 2096 | ||
@@ -2249,7 +2279,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, | |||
2249 | debug_rt_mutex_init_waiter(&rt_waiter); | 2279 | debug_rt_mutex_init_waiter(&rt_waiter); |
2250 | rt_waiter.task = NULL; | 2280 | rt_waiter.task = NULL; |
2251 | 2281 | ||
2252 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2); | 2282 | ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, VERIFY_WRITE); |
2253 | if (unlikely(ret != 0)) | 2283 | if (unlikely(ret != 0)) |
2254 | goto out; | 2284 | goto out; |
2255 | 2285 | ||
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 3956f5149e25..8c24294e477f 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -2468,7 +2468,7 @@ mark_held_locks(struct task_struct *curr, enum mark_type mark) | |||
2468 | 2468 | ||
2469 | BUG_ON(usage_bit >= LOCK_USAGE_STATES); | 2469 | BUG_ON(usage_bit >= LOCK_USAGE_STATES); |
2470 | 2470 | ||
2471 | if (hlock_class(hlock)->key == &__lockdep_no_validate__) | 2471 | if (hlock_class(hlock)->key == __lockdep_no_validate__.subkeys) |
2472 | continue; | 2472 | continue; |
2473 | 2473 | ||
2474 | if (!mark_lock(curr, hlock, usage_bit)) | 2474 | if (!mark_lock(curr, hlock, usage_bit)) |
@@ -2485,23 +2485,9 @@ static void __trace_hardirqs_on_caller(unsigned long ip) | |||
2485 | { | 2485 | { |
2486 | struct task_struct *curr = current; | 2486 | struct task_struct *curr = current; |
2487 | 2487 | ||
2488 | if (DEBUG_LOCKS_WARN_ON(unlikely(early_boot_irqs_disabled))) | ||
2489 | return; | ||
2490 | |||
2491 | if (unlikely(curr->hardirqs_enabled)) { | ||
2492 | /* | ||
2493 | * Neither irq nor preemption are disabled here | ||
2494 | * so this is racy by nature but losing one hit | ||
2495 | * in a stat is not a big deal. | ||
2496 | */ | ||
2497 | __debug_atomic_inc(redundant_hardirqs_on); | ||
2498 | return; | ||
2499 | } | ||
2500 | /* we'll do an OFF -> ON transition: */ | 2488 | /* we'll do an OFF -> ON transition: */ |
2501 | curr->hardirqs_enabled = 1; | 2489 | curr->hardirqs_enabled = 1; |
2502 | 2490 | ||
2503 | if (DEBUG_LOCKS_WARN_ON(current->hardirq_context)) | ||
2504 | return; | ||
2505 | /* | 2491 | /* |
2506 | * We are going to turn hardirqs on, so set the | 2492 | * We are going to turn hardirqs on, so set the |
2507 | * usage bit for all held locks: | 2493 | * usage bit for all held locks: |
@@ -2529,9 +2515,25 @@ void trace_hardirqs_on_caller(unsigned long ip) | |||
2529 | if (unlikely(!debug_locks || current->lockdep_recursion)) | 2515 | if (unlikely(!debug_locks || current->lockdep_recursion)) |
2530 | return; | 2516 | return; |
2531 | 2517 | ||
2518 | if (unlikely(current->hardirqs_enabled)) { | ||
2519 | /* | ||
2520 | * Neither irq nor preemption are disabled here | ||
2521 | * so this is racy by nature but losing one hit | ||
2522 | * in a stat is not a big deal. | ||
2523 | */ | ||
2524 | __debug_atomic_inc(redundant_hardirqs_on); | ||
2525 | return; | ||
2526 | } | ||
2527 | |||
2532 | if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) | 2528 | if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) |
2533 | return; | 2529 | return; |
2534 | 2530 | ||
2531 | if (DEBUG_LOCKS_WARN_ON(unlikely(early_boot_irqs_disabled))) | ||
2532 | return; | ||
2533 | |||
2534 | if (DEBUG_LOCKS_WARN_ON(current->hardirq_context)) | ||
2535 | return; | ||
2536 | |||
2535 | current->lockdep_recursion = 1; | 2537 | current->lockdep_recursion = 1; |
2536 | __trace_hardirqs_on_caller(ip); | 2538 | __trace_hardirqs_on_caller(ip); |
2537 | current->lockdep_recursion = 0; | 2539 | current->lockdep_recursion = 0; |
@@ -2872,10 +2874,7 @@ static int mark_lock(struct task_struct *curr, struct held_lock *this, | |||
2872 | void lockdep_init_map(struct lockdep_map *lock, const char *name, | 2874 | void lockdep_init_map(struct lockdep_map *lock, const char *name, |
2873 | struct lock_class_key *key, int subclass) | 2875 | struct lock_class_key *key, int subclass) |
2874 | { | 2876 | { |
2875 | int i; | 2877 | memset(lock, 0, sizeof(*lock)); |
2876 | |||
2877 | for (i = 0; i < NR_LOCKDEP_CACHING_CLASSES; i++) | ||
2878 | lock->class_cache[i] = NULL; | ||
2879 | 2878 | ||
2880 | #ifdef CONFIG_LOCK_STAT | 2879 | #ifdef CONFIG_LOCK_STAT |
2881 | lock->cpu = raw_smp_processor_id(); | 2880 | lock->cpu = raw_smp_processor_id(); |
diff --git a/kernel/printk.c b/kernel/printk.c index 37dff3429adb..836a2ae0ac31 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -318,8 +318,10 @@ static int check_syslog_permissions(int type, bool from_file) | |||
318 | return 0; | 318 | return 0; |
319 | /* For historical reasons, accept CAP_SYS_ADMIN too, with a warning */ | 319 | /* For historical reasons, accept CAP_SYS_ADMIN too, with a warning */ |
320 | if (capable(CAP_SYS_ADMIN)) { | 320 | if (capable(CAP_SYS_ADMIN)) { |
321 | WARN_ONCE(1, "Attempt to access syslog with CAP_SYS_ADMIN " | 321 | printk_once(KERN_WARNING "%s (%d): " |
322 | "but no CAP_SYSLOG (deprecated).\n"); | 322 | "Attempt to access syslog with CAP_SYS_ADMIN " |
323 | "but no CAP_SYSLOG (deprecated).\n", | ||
324 | current->comm, task_pid_nr(current)); | ||
323 | return 0; | 325 | return 0; |
324 | } | 326 | } |
325 | return -EPERM; | 327 | return -EPERM; |
diff --git a/lib/Makefile b/lib/Makefile index 6457af4a7caf..d5d175c8a6ca 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
@@ -10,7 +10,7 @@ endif | |||
10 | lib-y := ctype.o string.o vsprintf.o cmdline.o \ | 10 | lib-y := ctype.o string.o vsprintf.o cmdline.o \ |
11 | rbtree.o radix-tree.o dump_stack.o timerqueue.o\ | 11 | rbtree.o radix-tree.o dump_stack.o timerqueue.o\ |
12 | idr.o int_sqrt.o extable.o prio_tree.o \ | 12 | idr.o int_sqrt.o extable.o prio_tree.o \ |
13 | sha1.o irq_regs.o reciprocal_div.o argv_split.o \ | 13 | sha1.o md5.o irq_regs.o reciprocal_div.o argv_split.o \ |
14 | proportions.o prio_heap.o ratelimit.o show_mem.o \ | 14 | proportions.o prio_heap.o ratelimit.o show_mem.o \ |
15 | is_single_threaded.o plist.o decompress.o find_next_bit.o | 15 | is_single_threaded.o plist.o decompress.o find_next_bit.o |
16 | 16 | ||
diff --git a/lib/md5.c b/lib/md5.c new file mode 100644 index 000000000000..c777180e1f2f --- /dev/null +++ b/lib/md5.c | |||
@@ -0,0 +1,95 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/cryptohash.h> | ||
4 | |||
5 | #define F1(x, y, z) (z ^ (x & (y ^ z))) | ||
6 | #define F2(x, y, z) F1(z, x, y) | ||
7 | #define F3(x, y, z) (x ^ y ^ z) | ||
8 | #define F4(x, y, z) (y ^ (x | ~z)) | ||
9 | |||
10 | #define MD5STEP(f, w, x, y, z, in, s) \ | ||
11 | (w += f(x, y, z) + in, w = (w<<s | w>>(32-s)) + x) | ||
12 | |||
13 | void md5_transform(__u32 *hash, __u32 const *in) | ||
14 | { | ||
15 | u32 a, b, c, d; | ||
16 | |||
17 | a = hash[0]; | ||
18 | b = hash[1]; | ||
19 | c = hash[2]; | ||
20 | d = hash[3]; | ||
21 | |||
22 | MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); | ||
23 | MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); | ||
24 | MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); | ||
25 | MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); | ||
26 | MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); | ||
27 | MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); | ||
28 | MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); | ||
29 | MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); | ||
30 | MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); | ||
31 | MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); | ||
32 | MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); | ||
33 | MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); | ||
34 | MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); | ||
35 | MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); | ||
36 | MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); | ||
37 | MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); | ||
38 | |||
39 | MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); | ||
40 | MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); | ||
41 | MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); | ||
42 | MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); | ||
43 | MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); | ||
44 | MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); | ||
45 | MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); | ||
46 | MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); | ||
47 | MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); | ||
48 | MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); | ||
49 | MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); | ||
50 | MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); | ||
51 | MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); | ||
52 | MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); | ||
53 | MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); | ||
54 | MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); | ||
55 | |||
56 | MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); | ||
57 | MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); | ||
58 | MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); | ||
59 | MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); | ||
60 | MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); | ||
61 | MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); | ||
62 | MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); | ||
63 | MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); | ||
64 | MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); | ||
65 | MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); | ||
66 | MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); | ||
67 | MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); | ||
68 | MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); | ||
69 | MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); | ||
70 | MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); | ||
71 | MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); | ||
72 | |||
73 | MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); | ||
74 | MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); | ||
75 | MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); | ||
76 | MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); | ||
77 | MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); | ||
78 | MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); | ||
79 | MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); | ||
80 | MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); | ||
81 | MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); | ||
82 | MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); | ||
83 | MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); | ||
84 | MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); | ||
85 | MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); | ||
86 | MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); | ||
87 | MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); | ||
88 | MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); | ||
89 | |||
90 | hash[0] += a; | ||
91 | hash[1] += b; | ||
92 | hash[2] += c; | ||
93 | hash[3] += d; | ||
94 | } | ||
95 | EXPORT_SYMBOL(md5_transform); | ||
diff --git a/lib/sha1.c b/lib/sha1.c index 4c45fd50e913..f33271dd00cb 100644 --- a/lib/sha1.c +++ b/lib/sha1.c | |||
@@ -1,31 +1,72 @@ | |||
1 | /* | 1 | /* |
2 | * SHA transform algorithm, originally taken from code written by | 2 | * SHA1 routine optimized to do word accesses rather than byte accesses, |
3 | * Peter Gutmann, and placed in the public domain. | 3 | * and to avoid unnecessary copies into the context array. |
4 | * | ||
5 | * This was based on the git SHA1 implementation. | ||
4 | */ | 6 | */ |
5 | 7 | ||
6 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
7 | #include <linux/module.h> | 9 | #include <linux/module.h> |
8 | #include <linux/cryptohash.h> | 10 | #include <linux/bitops.h> |
11 | #include <asm/unaligned.h> | ||
9 | 12 | ||
10 | /* The SHA f()-functions. */ | 13 | /* |
14 | * If you have 32 registers or more, the compiler can (and should) | ||
15 | * try to change the array[] accesses into registers. However, on | ||
16 | * machines with less than ~25 registers, that won't really work, | ||
17 | * and at least gcc will make an unholy mess of it. | ||
18 | * | ||
19 | * So to avoid that mess which just slows things down, we force | ||
20 | * the stores to memory to actually happen (we might be better off | ||
21 | * with a 'W(t)=(val);asm("":"+m" (W(t))' there instead, as | ||
22 | * suggested by Artur Skawina - that will also make gcc unable to | ||
23 | * try to do the silly "optimize away loads" part because it won't | ||
24 | * see what the value will be). | ||
25 | * | ||
26 | * Ben Herrenschmidt reports that on PPC, the C version comes close | ||
27 | * to the optimized asm with this (ie on PPC you don't want that | ||
28 | * 'volatile', since there are lots of registers). | ||
29 | * | ||
30 | * On ARM we get the best code generation by forcing a full memory barrier | ||
31 | * between each SHA_ROUND, otherwise gcc happily get wild with spilling and | ||
32 | * the stack frame size simply explode and performance goes down the drain. | ||
33 | */ | ||
11 | 34 | ||
12 | #define f1(x,y,z) (z ^ (x & (y ^ z))) /* x ? y : z */ | 35 | #ifdef CONFIG_X86 |
13 | #define f2(x,y,z) (x ^ y ^ z) /* XOR */ | 36 | #define setW(x, val) (*(volatile __u32 *)&W(x) = (val)) |
14 | #define f3(x,y,z) ((x & y) + (z & (x ^ y))) /* majority */ | 37 | #elif defined(CONFIG_ARM) |
38 | #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0) | ||
39 | #else | ||
40 | #define setW(x, val) (W(x) = (val)) | ||
41 | #endif | ||
15 | 42 | ||
16 | /* The SHA Mysterious Constants */ | 43 | /* This "rolls" over the 512-bit array */ |
44 | #define W(x) (array[(x)&15]) | ||
17 | 45 | ||
18 | #define K1 0x5A827999L /* Rounds 0-19: sqrt(2) * 2^30 */ | 46 | /* |
19 | #define K2 0x6ED9EBA1L /* Rounds 20-39: sqrt(3) * 2^30 */ | 47 | * Where do we get the source from? The first 16 iterations get it from |
20 | #define K3 0x8F1BBCDCL /* Rounds 40-59: sqrt(5) * 2^30 */ | 48 | * the input data, the next mix it from the 512-bit array. |
21 | #define K4 0xCA62C1D6L /* Rounds 60-79: sqrt(10) * 2^30 */ | 49 | */ |
50 | #define SHA_SRC(t) get_unaligned_be32((__u32 *)data + t) | ||
51 | #define SHA_MIX(t) rol32(W(t+13) ^ W(t+8) ^ W(t+2) ^ W(t), 1) | ||
52 | |||
53 | #define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \ | ||
54 | __u32 TEMP = input(t); setW(t, TEMP); \ | ||
55 | E += TEMP + rol32(A,5) + (fn) + (constant); \ | ||
56 | B = ror32(B, 2); } while (0) | ||
57 | |||
58 | #define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) | ||
59 | #define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) | ||
60 | #define T_20_39(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0x6ed9eba1, A, B, C, D, E ) | ||
61 | #define T_40_59(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, ((B&C)+(D&(B^C))) , 0x8f1bbcdc, A, B, C, D, E ) | ||
62 | #define T_60_79(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6, A, B, C, D, E ) | ||
22 | 63 | ||
23 | /** | 64 | /** |
24 | * sha_transform - single block SHA1 transform | 65 | * sha_transform - single block SHA1 transform |
25 | * | 66 | * |
26 | * @digest: 160 bit digest to update | 67 | * @digest: 160 bit digest to update |
27 | * @data: 512 bits of data to hash | 68 | * @data: 512 bits of data to hash |
28 | * @W: 80 words of workspace (see note) | 69 | * @array: 16 words of workspace (see note) |
29 | * | 70 | * |
30 | * This function generates a SHA1 digest for a single 512-bit block. | 71 | * This function generates a SHA1 digest for a single 512-bit block. |
31 | * Be warned, it does not handle padding and message digest, do not | 72 | * Be warned, it does not handle padding and message digest, do not |
@@ -36,47 +77,111 @@ | |||
36 | * to clear the workspace. This is left to the caller to avoid | 77 | * to clear the workspace. This is left to the caller to avoid |
37 | * unnecessary clears between chained hashing operations. | 78 | * unnecessary clears between chained hashing operations. |
38 | */ | 79 | */ |
39 | void sha_transform(__u32 *digest, const char *in, __u32 *W) | 80 | void sha_transform(__u32 *digest, const char *data, __u32 *array) |
40 | { | 81 | { |
41 | __u32 a, b, c, d, e, t, i; | 82 | __u32 A, B, C, D, E; |
42 | 83 | ||
43 | for (i = 0; i < 16; i++) | 84 | A = digest[0]; |
44 | W[i] = be32_to_cpu(((const __be32 *)in)[i]); | 85 | B = digest[1]; |
45 | 86 | C = digest[2]; | |
46 | for (i = 0; i < 64; i++) | 87 | D = digest[3]; |
47 | W[i+16] = rol32(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i], 1); | 88 | E = digest[4]; |
48 | 89 | ||
49 | a = digest[0]; | 90 | /* Round 1 - iterations 0-16 take their input from 'data' */ |
50 | b = digest[1]; | 91 | T_0_15( 0, A, B, C, D, E); |
51 | c = digest[2]; | 92 | T_0_15( 1, E, A, B, C, D); |
52 | d = digest[3]; | 93 | T_0_15( 2, D, E, A, B, C); |
53 | e = digest[4]; | 94 | T_0_15( 3, C, D, E, A, B); |
54 | 95 | T_0_15( 4, B, C, D, E, A); | |
55 | for (i = 0; i < 20; i++) { | 96 | T_0_15( 5, A, B, C, D, E); |
56 | t = f1(b, c, d) + K1 + rol32(a, 5) + e + W[i]; | 97 | T_0_15( 6, E, A, B, C, D); |
57 | e = d; d = c; c = rol32(b, 30); b = a; a = t; | 98 | T_0_15( 7, D, E, A, B, C); |
58 | } | 99 | T_0_15( 8, C, D, E, A, B); |
59 | 100 | T_0_15( 9, B, C, D, E, A); | |
60 | for (; i < 40; i ++) { | 101 | T_0_15(10, A, B, C, D, E); |
61 | t = f2(b, c, d) + K2 + rol32(a, 5) + e + W[i]; | 102 | T_0_15(11, E, A, B, C, D); |
62 | e = d; d = c; c = rol32(b, 30); b = a; a = t; | 103 | T_0_15(12, D, E, A, B, C); |
63 | } | 104 | T_0_15(13, C, D, E, A, B); |
64 | 105 | T_0_15(14, B, C, D, E, A); | |
65 | for (; i < 60; i ++) { | 106 | T_0_15(15, A, B, C, D, E); |
66 | t = f3(b, c, d) + K3 + rol32(a, 5) + e + W[i]; | 107 | |
67 | e = d; d = c; c = rol32(b, 30); b = a; a = t; | 108 | /* Round 1 - tail. Input from 512-bit mixing array */ |
68 | } | 109 | T_16_19(16, E, A, B, C, D); |
69 | 110 | T_16_19(17, D, E, A, B, C); | |
70 | for (; i < 80; i ++) { | 111 | T_16_19(18, C, D, E, A, B); |
71 | t = f2(b, c, d) + K4 + rol32(a, 5) + e + W[i]; | 112 | T_16_19(19, B, C, D, E, A); |
72 | e = d; d = c; c = rol32(b, 30); b = a; a = t; | 113 | |
73 | } | 114 | /* Round 2 */ |
74 | 115 | T_20_39(20, A, B, C, D, E); | |
75 | digest[0] += a; | 116 | T_20_39(21, E, A, B, C, D); |
76 | digest[1] += b; | 117 | T_20_39(22, D, E, A, B, C); |
77 | digest[2] += c; | 118 | T_20_39(23, C, D, E, A, B); |
78 | digest[3] += d; | 119 | T_20_39(24, B, C, D, E, A); |
79 | digest[4] += e; | 120 | T_20_39(25, A, B, C, D, E); |
121 | T_20_39(26, E, A, B, C, D); | ||
122 | T_20_39(27, D, E, A, B, C); | ||
123 | T_20_39(28, C, D, E, A, B); | ||
124 | T_20_39(29, B, C, D, E, A); | ||
125 | T_20_39(30, A, B, C, D, E); | ||
126 | T_20_39(31, E, A, B, C, D); | ||
127 | T_20_39(32, D, E, A, B, C); | ||
128 | T_20_39(33, C, D, E, A, B); | ||
129 | T_20_39(34, B, C, D, E, A); | ||
130 | T_20_39(35, A, B, C, D, E); | ||
131 | T_20_39(36, E, A, B, C, D); | ||
132 | T_20_39(37, D, E, A, B, C); | ||
133 | T_20_39(38, C, D, E, A, B); | ||
134 | T_20_39(39, B, C, D, E, A); | ||
135 | |||
136 | /* Round 3 */ | ||
137 | T_40_59(40, A, B, C, D, E); | ||
138 | T_40_59(41, E, A, B, C, D); | ||
139 | T_40_59(42, D, E, A, B, C); | ||
140 | T_40_59(43, C, D, E, A, B); | ||
141 | T_40_59(44, B, C, D, E, A); | ||
142 | T_40_59(45, A, B, C, D, E); | ||
143 | T_40_59(46, E, A, B, C, D); | ||
144 | T_40_59(47, D, E, A, B, C); | ||
145 | T_40_59(48, C, D, E, A, B); | ||
146 | T_40_59(49, B, C, D, E, A); | ||
147 | T_40_59(50, A, B, C, D, E); | ||
148 | T_40_59(51, E, A, B, C, D); | ||
149 | T_40_59(52, D, E, A, B, C); | ||
150 | T_40_59(53, C, D, E, A, B); | ||
151 | T_40_59(54, B, C, D, E, A); | ||
152 | T_40_59(55, A, B, C, D, E); | ||
153 | T_40_59(56, E, A, B, C, D); | ||
154 | T_40_59(57, D, E, A, B, C); | ||
155 | T_40_59(58, C, D, E, A, B); | ||
156 | T_40_59(59, B, C, D, E, A); | ||
157 | |||
158 | /* Round 4 */ | ||
159 | T_60_79(60, A, B, C, D, E); | ||
160 | T_60_79(61, E, A, B, C, D); | ||
161 | T_60_79(62, D, E, A, B, C); | ||
162 | T_60_79(63, C, D, E, A, B); | ||
163 | T_60_79(64, B, C, D, E, A); | ||
164 | T_60_79(65, A, B, C, D, E); | ||
165 | T_60_79(66, E, A, B, C, D); | ||
166 | T_60_79(67, D, E, A, B, C); | ||
167 | T_60_79(68, C, D, E, A, B); | ||
168 | T_60_79(69, B, C, D, E, A); | ||
169 | T_60_79(70, A, B, C, D, E); | ||
170 | T_60_79(71, E, A, B, C, D); | ||
171 | T_60_79(72, D, E, A, B, C); | ||
172 | T_60_79(73, C, D, E, A, B); | ||
173 | T_60_79(74, B, C, D, E, A); | ||
174 | T_60_79(75, A, B, C, D, E); | ||
175 | T_60_79(76, E, A, B, C, D); | ||
176 | T_60_79(77, D, E, A, B, C); | ||
177 | T_60_79(78, C, D, E, A, B); | ||
178 | T_60_79(79, B, C, D, E, A); | ||
179 | |||
180 | digest[0] += A; | ||
181 | digest[1] += B; | ||
182 | digest[2] += C; | ||
183 | digest[3] += D; | ||
184 | digest[4] += E; | ||
80 | } | 185 | } |
81 | EXPORT_SYMBOL(sha_transform); | 186 | EXPORT_SYMBOL(sha_transform); |
82 | 187 | ||
@@ -92,4 +197,3 @@ void sha_init(__u32 *buf) | |||
92 | buf[3] = 0x10325476; | 197 | buf[3] = 0x10325476; |
93 | buf[4] = 0xc3d2e1f0; | 198 | buf[4] = 0xc3d2e1f0; |
94 | } | 199 | } |
95 | |||
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index f4ec4e7ca4cd..930de9437271 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -2091,6 +2091,7 @@ struct memcg_stock_pcp { | |||
2091 | #define FLUSHING_CACHED_CHARGE (0) | 2091 | #define FLUSHING_CACHED_CHARGE (0) |
2092 | }; | 2092 | }; |
2093 | static DEFINE_PER_CPU(struct memcg_stock_pcp, memcg_stock); | 2093 | static DEFINE_PER_CPU(struct memcg_stock_pcp, memcg_stock); |
2094 | static DEFINE_MUTEX(percpu_charge_mutex); | ||
2094 | 2095 | ||
2095 | /* | 2096 | /* |
2096 | * Try to consume stocked charge on this cpu. If success, one page is consumed | 2097 | * Try to consume stocked charge on this cpu. If success, one page is consumed |
@@ -2197,8 +2198,7 @@ static void drain_all_stock(struct mem_cgroup *root_mem, bool sync) | |||
2197 | 2198 | ||
2198 | for_each_online_cpu(cpu) { | 2199 | for_each_online_cpu(cpu) { |
2199 | struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); | 2200 | struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); |
2200 | if (mem_cgroup_same_or_subtree(root_mem, stock->cached) && | 2201 | if (test_bit(FLUSHING_CACHED_CHARGE, &stock->flags)) |
2201 | test_bit(FLUSHING_CACHED_CHARGE, &stock->flags)) | ||
2202 | flush_work(&stock->work); | 2202 | flush_work(&stock->work); |
2203 | } | 2203 | } |
2204 | out: | 2204 | out: |
@@ -2213,14 +2213,22 @@ out: | |||
2213 | */ | 2213 | */ |
2214 | static void drain_all_stock_async(struct mem_cgroup *root_mem) | 2214 | static void drain_all_stock_async(struct mem_cgroup *root_mem) |
2215 | { | 2215 | { |
2216 | /* | ||
2217 | * If someone calls draining, avoid adding more kworker runs. | ||
2218 | */ | ||
2219 | if (!mutex_trylock(&percpu_charge_mutex)) | ||
2220 | return; | ||
2216 | drain_all_stock(root_mem, false); | 2221 | drain_all_stock(root_mem, false); |
2222 | mutex_unlock(&percpu_charge_mutex); | ||
2217 | } | 2223 | } |
2218 | 2224 | ||
2219 | /* This is a synchronous drain interface. */ | 2225 | /* This is a synchronous drain interface. */ |
2220 | static void drain_all_stock_sync(struct mem_cgroup *root_mem) | 2226 | static void drain_all_stock_sync(struct mem_cgroup *root_mem) |
2221 | { | 2227 | { |
2222 | /* called when force_empty is called */ | 2228 | /* called when force_empty is called */ |
2229 | mutex_lock(&percpu_charge_mutex); | ||
2223 | drain_all_stock(root_mem, true); | 2230 | drain_all_stock(root_mem, true); |
2231 | mutex_unlock(&percpu_charge_mutex); | ||
2224 | } | 2232 | } |
2225 | 2233 | ||
2226 | /* | 2234 | /* |
@@ -622,6 +622,51 @@ int slab_is_available(void) | |||
622 | static struct lock_class_key on_slab_l3_key; | 622 | static struct lock_class_key on_slab_l3_key; |
623 | static struct lock_class_key on_slab_alc_key; | 623 | static struct lock_class_key on_slab_alc_key; |
624 | 624 | ||
625 | static struct lock_class_key debugobj_l3_key; | ||
626 | static struct lock_class_key debugobj_alc_key; | ||
627 | |||
628 | static void slab_set_lock_classes(struct kmem_cache *cachep, | ||
629 | struct lock_class_key *l3_key, struct lock_class_key *alc_key, | ||
630 | int q) | ||
631 | { | ||
632 | struct array_cache **alc; | ||
633 | struct kmem_list3 *l3; | ||
634 | int r; | ||
635 | |||
636 | l3 = cachep->nodelists[q]; | ||
637 | if (!l3) | ||
638 | return; | ||
639 | |||
640 | lockdep_set_class(&l3->list_lock, l3_key); | ||
641 | alc = l3->alien; | ||
642 | /* | ||
643 | * FIXME: This check for BAD_ALIEN_MAGIC | ||
644 | * should go away when common slab code is taught to | ||
645 | * work even without alien caches. | ||
646 | * Currently, non NUMA code returns BAD_ALIEN_MAGIC | ||
647 | * for alloc_alien_cache, | ||
648 | */ | ||
649 | if (!alc || (unsigned long)alc == BAD_ALIEN_MAGIC) | ||
650 | return; | ||
651 | for_each_node(r) { | ||
652 | if (alc[r]) | ||
653 | lockdep_set_class(&alc[r]->lock, alc_key); | ||
654 | } | ||
655 | } | ||
656 | |||
657 | static void slab_set_debugobj_lock_classes_node(struct kmem_cache *cachep, int node) | ||
658 | { | ||
659 | slab_set_lock_classes(cachep, &debugobj_l3_key, &debugobj_alc_key, node); | ||
660 | } | ||
661 | |||
662 | static void slab_set_debugobj_lock_classes(struct kmem_cache *cachep) | ||
663 | { | ||
664 | int node; | ||
665 | |||
666 | for_each_online_node(node) | ||
667 | slab_set_debugobj_lock_classes_node(cachep, node); | ||
668 | } | ||
669 | |||
625 | static void init_node_lock_keys(int q) | 670 | static void init_node_lock_keys(int q) |
626 | { | 671 | { |
627 | struct cache_sizes *s = malloc_sizes; | 672 | struct cache_sizes *s = malloc_sizes; |
@@ -630,29 +675,14 @@ static void init_node_lock_keys(int q) | |||
630 | return; | 675 | return; |
631 | 676 | ||
632 | for (s = malloc_sizes; s->cs_size != ULONG_MAX; s++) { | 677 | for (s = malloc_sizes; s->cs_size != ULONG_MAX; s++) { |
633 | struct array_cache **alc; | ||
634 | struct kmem_list3 *l3; | 678 | struct kmem_list3 *l3; |
635 | int r; | ||
636 | 679 | ||
637 | l3 = s->cs_cachep->nodelists[q]; | 680 | l3 = s->cs_cachep->nodelists[q]; |
638 | if (!l3 || OFF_SLAB(s->cs_cachep)) | 681 | if (!l3 || OFF_SLAB(s->cs_cachep)) |
639 | continue; | 682 | continue; |
640 | lockdep_set_class(&l3->list_lock, &on_slab_l3_key); | 683 | |
641 | alc = l3->alien; | 684 | slab_set_lock_classes(s->cs_cachep, &on_slab_l3_key, |
642 | /* | 685 | &on_slab_alc_key, q); |
643 | * FIXME: This check for BAD_ALIEN_MAGIC | ||
644 | * should go away when common slab code is taught to | ||
645 | * work even without alien caches. | ||
646 | * Currently, non NUMA code returns BAD_ALIEN_MAGIC | ||
647 | * for alloc_alien_cache, | ||
648 | */ | ||
649 | if (!alc || (unsigned long)alc == BAD_ALIEN_MAGIC) | ||
650 | continue; | ||
651 | for_each_node(r) { | ||
652 | if (alc[r]) | ||
653 | lockdep_set_class(&alc[r]->lock, | ||
654 | &on_slab_alc_key); | ||
655 | } | ||
656 | } | 686 | } |
657 | } | 687 | } |
658 | 688 | ||
@@ -671,6 +701,14 @@ static void init_node_lock_keys(int q) | |||
671 | static inline void init_lock_keys(void) | 701 | static inline void init_lock_keys(void) |
672 | { | 702 | { |
673 | } | 703 | } |
704 | |||
705 | static void slab_set_debugobj_lock_classes_node(struct kmem_cache *cachep, int node) | ||
706 | { | ||
707 | } | ||
708 | |||
709 | static void slab_set_debugobj_lock_classes(struct kmem_cache *cachep) | ||
710 | { | ||
711 | } | ||
674 | #endif | 712 | #endif |
675 | 713 | ||
676 | /* | 714 | /* |
@@ -1264,6 +1302,8 @@ static int __cpuinit cpuup_prepare(long cpu) | |||
1264 | spin_unlock_irq(&l3->list_lock); | 1302 | spin_unlock_irq(&l3->list_lock); |
1265 | kfree(shared); | 1303 | kfree(shared); |
1266 | free_alien_cache(alien); | 1304 | free_alien_cache(alien); |
1305 | if (cachep->flags & SLAB_DEBUG_OBJECTS) | ||
1306 | slab_set_debugobj_lock_classes_node(cachep, node); | ||
1267 | } | 1307 | } |
1268 | init_node_lock_keys(node); | 1308 | init_node_lock_keys(node); |
1269 | 1309 | ||
@@ -1626,6 +1666,9 @@ void __init kmem_cache_init_late(void) | |||
1626 | { | 1666 | { |
1627 | struct kmem_cache *cachep; | 1667 | struct kmem_cache *cachep; |
1628 | 1668 | ||
1669 | /* Annotate slab for lockdep -- annotate the malloc caches */ | ||
1670 | init_lock_keys(); | ||
1671 | |||
1629 | /* 6) resize the head arrays to their final sizes */ | 1672 | /* 6) resize the head arrays to their final sizes */ |
1630 | mutex_lock(&cache_chain_mutex); | 1673 | mutex_lock(&cache_chain_mutex); |
1631 | list_for_each_entry(cachep, &cache_chain, next) | 1674 | list_for_each_entry(cachep, &cache_chain, next) |
@@ -1636,9 +1679,6 @@ void __init kmem_cache_init_late(void) | |||
1636 | /* Done! */ | 1679 | /* Done! */ |
1637 | g_cpucache_up = FULL; | 1680 | g_cpucache_up = FULL; |
1638 | 1681 | ||
1639 | /* Annotate slab for lockdep -- annotate the malloc caches */ | ||
1640 | init_lock_keys(); | ||
1641 | |||
1642 | /* | 1682 | /* |
1643 | * Register a cpu startup notifier callback that initializes | 1683 | * Register a cpu startup notifier callback that initializes |
1644 | * cpu_cache_get for all new cpus | 1684 | * cpu_cache_get for all new cpus |
@@ -2426,6 +2466,16 @@ kmem_cache_create (const char *name, size_t size, size_t align, | |||
2426 | goto oops; | 2466 | goto oops; |
2427 | } | 2467 | } |
2428 | 2468 | ||
2469 | if (flags & SLAB_DEBUG_OBJECTS) { | ||
2470 | /* | ||
2471 | * Would deadlock through slab_destroy()->call_rcu()-> | ||
2472 | * debug_object_activate()->kmem_cache_alloc(). | ||
2473 | */ | ||
2474 | WARN_ON_ONCE(flags & SLAB_DESTROY_BY_RCU); | ||
2475 | |||
2476 | slab_set_debugobj_lock_classes(cachep); | ||
2477 | } | ||
2478 | |||
2429 | /* cache setup completed, link it into the list */ | 2479 | /* cache setup completed, link it into the list */ |
2430 | list_add(&cachep->next, &cache_chain); | 2480 | list_add(&cachep->next, &cache_chain); |
2431 | oops: | 2481 | oops: |
@@ -701,7 +701,7 @@ static u8 *check_bytes(u8 *start, u8 value, unsigned int bytes) | |||
701 | return check_bytes8(start, value, bytes); | 701 | return check_bytes8(start, value, bytes); |
702 | 702 | ||
703 | value64 = value | value << 8 | value << 16 | value << 24; | 703 | value64 = value | value << 8 | value << 16 | value << 24; |
704 | value64 = value64 | value64 << 32; | 704 | value64 = (value64 & 0xffffffff) | value64 << 32; |
705 | prefix = 8 - ((unsigned long)start) % 8; | 705 | prefix = 8 - ((unsigned long)start) % 8; |
706 | 706 | ||
707 | if (prefix) { | 707 | if (prefix) { |
@@ -1854,7 +1854,7 @@ redo: | |||
1854 | 1854 | ||
1855 | new.frozen = 0; | 1855 | new.frozen = 0; |
1856 | 1856 | ||
1857 | if (!new.inuse && n->nr_partial < s->min_partial) | 1857 | if (!new.inuse && n->nr_partial > s->min_partial) |
1858 | m = M_FREE; | 1858 | m = M_FREE; |
1859 | else if (new.freelist) { | 1859 | else if (new.freelist) { |
1860 | m = M_PARTIAL; | 1860 | m = M_PARTIAL; |
@@ -2387,11 +2387,13 @@ static void __slab_free(struct kmem_cache *s, struct page *page, | |||
2387 | slab_empty: | 2387 | slab_empty: |
2388 | if (prior) { | 2388 | if (prior) { |
2389 | /* | 2389 | /* |
2390 | * Slab still on the partial list. | 2390 | * Slab on the partial list. |
2391 | */ | 2391 | */ |
2392 | remove_partial(n, page); | 2392 | remove_partial(n, page); |
2393 | stat(s, FREE_REMOVE_PARTIAL); | 2393 | stat(s, FREE_REMOVE_PARTIAL); |
2394 | } | 2394 | } else |
2395 | /* Slab must be on the full list */ | ||
2396 | remove_full(s, page); | ||
2395 | 2397 | ||
2396 | spin_unlock_irqrestore(&n->list_lock, flags); | 2398 | spin_unlock_irqrestore(&n->list_lock, flags); |
2397 | stat(s, FREE_SLAB); | 2399 | stat(s, FREE_SLAB); |
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index 2252c2085dac..52cfd0c3ea71 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
@@ -242,8 +242,6 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct net_device *dev, | |||
242 | if (brdev->payload == p_bridged) { | 242 | if (brdev->payload == p_bridged) { |
243 | skb_push(skb, 2); | 243 | skb_push(skb, 2); |
244 | memset(skb->data, 0, 2); | 244 | memset(skb->data, 0, 2); |
245 | } else { /* p_routed */ | ||
246 | skb_pull(skb, ETH_HLEN); | ||
247 | } | 245 | } |
248 | } | 246 | } |
249 | skb_debug(skb); | 247 | skb_debug(skb); |
diff --git a/net/core/Makefile b/net/core/Makefile index 8a04dd22cf77..0d357b1c4e57 100644 --- a/net/core/Makefile +++ b/net/core/Makefile | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := sock.o request_sock.o skbuff.o iovec.o datagram.o stream.o scm.o \ | 5 | obj-y := sock.o request_sock.o skbuff.o iovec.o datagram.o stream.o scm.o \ |
6 | gen_stats.o gen_estimator.o net_namespace.o | 6 | gen_stats.o gen_estimator.o net_namespace.o secure_seq.o |
7 | 7 | ||
8 | obj-$(CONFIG_SYSCTL) += sysctl_net_core.o | 8 | obj-$(CONFIG_SYSCTL) += sysctl_net_core.o |
9 | 9 | ||
diff --git a/net/core/secure_seq.c b/net/core/secure_seq.c new file mode 100644 index 000000000000..45329d7c9dd9 --- /dev/null +++ b/net/core/secure_seq.c | |||
@@ -0,0 +1,184 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/init.h> | ||
3 | #include <linux/cryptohash.h> | ||
4 | #include <linux/module.h> | ||
5 | #include <linux/cache.h> | ||
6 | #include <linux/random.h> | ||
7 | #include <linux/hrtimer.h> | ||
8 | #include <linux/ktime.h> | ||
9 | #include <linux/string.h> | ||
10 | |||
11 | #include <net/secure_seq.h> | ||
12 | |||
13 | static u32 net_secret[MD5_MESSAGE_BYTES / 4] ____cacheline_aligned; | ||
14 | |||
15 | static int __init net_secret_init(void) | ||
16 | { | ||
17 | get_random_bytes(net_secret, sizeof(net_secret)); | ||
18 | return 0; | ||
19 | } | ||
20 | late_initcall(net_secret_init); | ||
21 | |||
22 | static u32 seq_scale(u32 seq) | ||
23 | { | ||
24 | /* | ||
25 | * As close as possible to RFC 793, which | ||
26 | * suggests using a 250 kHz clock. | ||
27 | * Further reading shows this assumes 2 Mb/s networks. | ||
28 | * For 10 Mb/s Ethernet, a 1 MHz clock is appropriate. | ||
29 | * For 10 Gb/s Ethernet, a 1 GHz clock should be ok, but | ||
30 | * we also need to limit the resolution so that the u32 seq | ||
31 | * overlaps less than one time per MSL (2 minutes). | ||
32 | * Choosing a clock of 64 ns period is OK. (period of 274 s) | ||
33 | */ | ||
34 | return seq + (ktime_to_ns(ktime_get_real()) >> 6); | ||
35 | } | ||
36 | |||
37 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
38 | __u32 secure_tcpv6_sequence_number(__be32 *saddr, __be32 *daddr, | ||
39 | __be16 sport, __be16 dport) | ||
40 | { | ||
41 | u32 secret[MD5_MESSAGE_BYTES / 4]; | ||
42 | u32 hash[MD5_DIGEST_WORDS]; | ||
43 | u32 i; | ||
44 | |||
45 | memcpy(hash, saddr, 16); | ||
46 | for (i = 0; i < 4; i++) | ||
47 | secret[i] = net_secret[i] + daddr[i]; | ||
48 | secret[4] = net_secret[4] + | ||
49 | (((__force u16)sport << 16) + (__force u16)dport); | ||
50 | for (i = 5; i < MD5_MESSAGE_BYTES / 4; i++) | ||
51 | secret[i] = net_secret[i]; | ||
52 | |||
53 | md5_transform(hash, secret); | ||
54 | |||
55 | return seq_scale(hash[0]); | ||
56 | } | ||
57 | EXPORT_SYMBOL(secure_tcpv6_sequence_number); | ||
58 | |||
59 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | ||
60 | __be16 dport) | ||
61 | { | ||
62 | u32 secret[MD5_MESSAGE_BYTES / 4]; | ||
63 | u32 hash[MD5_DIGEST_WORDS]; | ||
64 | u32 i; | ||
65 | |||
66 | memcpy(hash, saddr, 16); | ||
67 | for (i = 0; i < 4; i++) | ||
68 | secret[i] = net_secret[i] + (__force u32) daddr[i]; | ||
69 | secret[4] = net_secret[4] + (__force u32)dport; | ||
70 | for (i = 5; i < MD5_MESSAGE_BYTES / 4; i++) | ||
71 | secret[i] = net_secret[i]; | ||
72 | |||
73 | md5_transform(hash, secret); | ||
74 | |||
75 | return hash[0]; | ||
76 | } | ||
77 | #endif | ||
78 | |||
79 | #ifdef CONFIG_INET | ||
80 | __u32 secure_ip_id(__be32 daddr) | ||
81 | { | ||
82 | u32 hash[MD5_DIGEST_WORDS]; | ||
83 | |||
84 | hash[0] = (__force __u32) daddr; | ||
85 | hash[1] = net_secret[13]; | ||
86 | hash[2] = net_secret[14]; | ||
87 | hash[3] = net_secret[15]; | ||
88 | |||
89 | md5_transform(hash, net_secret); | ||
90 | |||
91 | return hash[0]; | ||
92 | } | ||
93 | |||
94 | __u32 secure_ipv6_id(const __be32 daddr[4]) | ||
95 | { | ||
96 | __u32 hash[4]; | ||
97 | |||
98 | memcpy(hash, daddr, 16); | ||
99 | md5_transform(hash, net_secret); | ||
100 | |||
101 | return hash[0]; | ||
102 | } | ||
103 | |||
104 | __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr, | ||
105 | __be16 sport, __be16 dport) | ||
106 | { | ||
107 | u32 hash[MD5_DIGEST_WORDS]; | ||
108 | |||
109 | hash[0] = (__force u32)saddr; | ||
110 | hash[1] = (__force u32)daddr; | ||
111 | hash[2] = ((__force u16)sport << 16) + (__force u16)dport; | ||
112 | hash[3] = net_secret[15]; | ||
113 | |||
114 | md5_transform(hash, net_secret); | ||
115 | |||
116 | return seq_scale(hash[0]); | ||
117 | } | ||
118 | |||
119 | u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport) | ||
120 | { | ||
121 | u32 hash[MD5_DIGEST_WORDS]; | ||
122 | |||
123 | hash[0] = (__force u32)saddr; | ||
124 | hash[1] = (__force u32)daddr; | ||
125 | hash[2] = (__force u32)dport ^ net_secret[14]; | ||
126 | hash[3] = net_secret[15]; | ||
127 | |||
128 | md5_transform(hash, net_secret); | ||
129 | |||
130 | return hash[0]; | ||
131 | } | ||
132 | EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral); | ||
133 | #endif | ||
134 | |||
135 | #if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE) | ||
136 | u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr, | ||
137 | __be16 sport, __be16 dport) | ||
138 | { | ||
139 | u32 hash[MD5_DIGEST_WORDS]; | ||
140 | u64 seq; | ||
141 | |||
142 | hash[0] = (__force u32)saddr; | ||
143 | hash[1] = (__force u32)daddr; | ||
144 | hash[2] = ((__force u16)sport << 16) + (__force u16)dport; | ||
145 | hash[3] = net_secret[15]; | ||
146 | |||
147 | md5_transform(hash, net_secret); | ||
148 | |||
149 | seq = hash[0] | (((u64)hash[1]) << 32); | ||
150 | seq += ktime_to_ns(ktime_get_real()); | ||
151 | seq &= (1ull << 48) - 1; | ||
152 | |||
153 | return seq; | ||
154 | } | ||
155 | EXPORT_SYMBOL(secure_dccp_sequence_number); | ||
156 | |||
157 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | ||
158 | u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr, | ||
159 | __be16 sport, __be16 dport) | ||
160 | { | ||
161 | u32 secret[MD5_MESSAGE_BYTES / 4]; | ||
162 | u32 hash[MD5_DIGEST_WORDS]; | ||
163 | u64 seq; | ||
164 | u32 i; | ||
165 | |||
166 | memcpy(hash, saddr, 16); | ||
167 | for (i = 0; i < 4; i++) | ||
168 | secret[i] = net_secret[i] + daddr[i]; | ||
169 | secret[4] = net_secret[4] + | ||
170 | (((__force u16)sport << 16) + (__force u16)dport); | ||
171 | for (i = 5; i < MD5_MESSAGE_BYTES / 4; i++) | ||
172 | secret[i] = net_secret[i]; | ||
173 | |||
174 | md5_transform(hash, secret); | ||
175 | |||
176 | seq = hash[0] | (((u64)hash[1]) << 32); | ||
177 | seq += ktime_to_ns(ktime_get_real()); | ||
178 | seq &= (1ull << 48) - 1; | ||
179 | |||
180 | return seq; | ||
181 | } | ||
182 | EXPORT_SYMBOL(secure_dccpv6_sequence_number); | ||
183 | #endif | ||
184 | #endif | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 2beda824636e..27002dffe7ed 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -1369,8 +1369,21 @@ pull_pages: | |||
1369 | } | 1369 | } |
1370 | EXPORT_SYMBOL(__pskb_pull_tail); | 1370 | EXPORT_SYMBOL(__pskb_pull_tail); |
1371 | 1371 | ||
1372 | /* Copy some data bits from skb to kernel buffer. */ | 1372 | /** |
1373 | 1373 | * skb_copy_bits - copy bits from skb to kernel buffer | |
1374 | * @skb: source skb | ||
1375 | * @offset: offset in source | ||
1376 | * @to: destination buffer | ||
1377 | * @len: number of bytes to copy | ||
1378 | * | ||
1379 | * Copy the specified number of bytes from the source skb to the | ||
1380 | * destination buffer. | ||
1381 | * | ||
1382 | * CAUTION ! : | ||
1383 | * If its prototype is ever changed, | ||
1384 | * check arch/{*}/net/{*}.S files, | ||
1385 | * since it is called from BPF assembly code. | ||
1386 | */ | ||
1374 | int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len) | 1387 | int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len) |
1375 | { | 1388 | { |
1376 | int start = skb_headlen(skb); | 1389 | int start = skb_headlen(skb); |
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index 8c36adfd1919..332639b56f4d 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <net/timewait_sock.h> | 26 | #include <net/timewait_sock.h> |
27 | #include <net/tcp_states.h> | 27 | #include <net/tcp_states.h> |
28 | #include <net/xfrm.h> | 28 | #include <net/xfrm.h> |
29 | #include <net/secure_seq.h> | ||
29 | 30 | ||
30 | #include "ackvec.h" | 31 | #include "ackvec.h" |
31 | #include "ccid.h" | 32 | #include "ccid.h" |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 8dc4348774a5..b74f76117dcf 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <net/transp_v6.h> | 29 | #include <net/transp_v6.h> |
30 | #include <net/ip6_checksum.h> | 30 | #include <net/ip6_checksum.h> |
31 | #include <net/xfrm.h> | 31 | #include <net/xfrm.h> |
32 | #include <net/secure_seq.h> | ||
32 | 33 | ||
33 | #include "dccp.h" | 34 | #include "dccp.h" |
34 | #include "ipv6.h" | 35 | #include "ipv6.h" |
@@ -69,13 +70,7 @@ static inline void dccp_v6_send_check(struct sock *sk, struct sk_buff *skb) | |||
69 | dh->dccph_checksum = dccp_v6_csum_finish(skb, &np->saddr, &np->daddr); | 70 | dh->dccph_checksum = dccp_v6_csum_finish(skb, &np->saddr, &np->daddr); |
70 | } | 71 | } |
71 | 72 | ||
72 | static inline __u32 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr, | 73 | static inline __u64 dccp_v6_init_sequence(struct sk_buff *skb) |
73 | __be16 sport, __be16 dport ) | ||
74 | { | ||
75 | return secure_tcpv6_sequence_number(saddr, daddr, sport, dport); | ||
76 | } | ||
77 | |||
78 | static inline __u32 dccp_v6_init_sequence(struct sk_buff *skb) | ||
79 | { | 74 | { |
80 | return secure_dccpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32, | 75 | return secure_dccpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32, |
81 | ipv6_hdr(skb)->saddr.s6_addr32, | 76 | ipv6_hdr(skb)->saddr.s6_addr32, |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index f1d27f6c9351..283c0a26e03f 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -1718,7 +1718,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode, | |||
1718 | 1718 | ||
1719 | pmc->sfcount[sfmode]--; | 1719 | pmc->sfcount[sfmode]--; |
1720 | for (j=0; j<i; j++) | 1720 | for (j=0; j<i; j++) |
1721 | (void) ip_mc_del1_src(pmc, sfmode, &psfsrc[i]); | 1721 | (void) ip_mc_del1_src(pmc, sfmode, &psfsrc[j]); |
1722 | } else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) { | 1722 | } else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) { |
1723 | #ifdef CONFIG_IP_MULTICAST | 1723 | #ifdef CONFIG_IP_MULTICAST |
1724 | struct ip_sf_list *psf; | 1724 | struct ip_sf_list *psf; |
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index 3c0369a3a663..984ec656b03b 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c | |||
@@ -21,6 +21,7 @@ | |||
21 | 21 | ||
22 | #include <net/inet_connection_sock.h> | 22 | #include <net/inet_connection_sock.h> |
23 | #include <net/inet_hashtables.h> | 23 | #include <net/inet_hashtables.h> |
24 | #include <net/secure_seq.h> | ||
24 | #include <net/ip.h> | 25 | #include <net/ip.h> |
25 | 26 | ||
26 | /* | 27 | /* |
diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c index e38213817d0a..86f13c67ea85 100644 --- a/net/ipv4/inetpeer.c +++ b/net/ipv4/inetpeer.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/net.h> | 19 | #include <linux/net.h> |
20 | #include <net/ip.h> | 20 | #include <net/ip.h> |
21 | #include <net/inetpeer.h> | 21 | #include <net/inetpeer.h> |
22 | #include <net/secure_seq.h> | ||
22 | 23 | ||
23 | /* | 24 | /* |
24 | * Theory of operations. | 25 | * Theory of operations. |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index ccaaa851ab42..77d3eded665a 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -204,9 +204,15 @@ static inline int ip_finish_output2(struct sk_buff *skb) | |||
204 | skb = skb2; | 204 | skb = skb2; |
205 | } | 205 | } |
206 | 206 | ||
207 | rcu_read_lock(); | ||
207 | neigh = dst_get_neighbour(dst); | 208 | neigh = dst_get_neighbour(dst); |
208 | if (neigh) | 209 | if (neigh) { |
209 | return neigh_output(neigh, skb); | 210 | int res = neigh_output(neigh, skb); |
211 | |||
212 | rcu_read_unlock(); | ||
213 | return res; | ||
214 | } | ||
215 | rcu_read_unlock(); | ||
210 | 216 | ||
211 | if (net_ratelimit()) | 217 | if (net_ratelimit()) |
212 | printk(KERN_DEBUG "ip_finish_output2: No header cache and no neighbour!\n"); | 218 | printk(KERN_DEBUG "ip_finish_output2: No header cache and no neighbour!\n"); |
diff --git a/net/ipv4/netfilter/nf_nat_proto_common.c b/net/ipv4/netfilter/nf_nat_proto_common.c index 3e61faf23a9a..f52d41ea0690 100644 --- a/net/ipv4/netfilter/nf_nat_proto_common.c +++ b/net/ipv4/netfilter/nf_nat_proto_common.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/ip.h> | 12 | #include <linux/ip.h> |
13 | 13 | ||
14 | #include <linux/netfilter.h> | 14 | #include <linux/netfilter.h> |
15 | #include <net/secure_seq.h> | ||
15 | #include <net/netfilter/nf_nat.h> | 16 | #include <net/netfilter/nf_nat.h> |
16 | #include <net/netfilter/nf_nat_core.h> | 17 | #include <net/netfilter/nf_nat_core.h> |
17 | #include <net/netfilter/nf_nat_rule.h> | 18 | #include <net/netfilter/nf_nat_rule.h> |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 1730689f560e..e3dec1c9f09d 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -109,6 +109,7 @@ | |||
109 | #include <linux/sysctl.h> | 109 | #include <linux/sysctl.h> |
110 | #endif | 110 | #endif |
111 | #include <net/atmclip.h> | 111 | #include <net/atmclip.h> |
112 | #include <net/secure_seq.h> | ||
112 | 113 | ||
113 | #define RT_FL_TOS(oldflp4) \ | 114 | #define RT_FL_TOS(oldflp4) \ |
114 | ((u32)(oldflp4->flowi4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) | 115 | ((u32)(oldflp4->flowi4_tos & (IPTOS_RT_MASK | RTO_ONLINK))) |
@@ -1628,16 +1629,18 @@ static int check_peer_redir(struct dst_entry *dst, struct inet_peer *peer) | |||
1628 | { | 1629 | { |
1629 | struct rtable *rt = (struct rtable *) dst; | 1630 | struct rtable *rt = (struct rtable *) dst; |
1630 | __be32 orig_gw = rt->rt_gateway; | 1631 | __be32 orig_gw = rt->rt_gateway; |
1631 | struct neighbour *n; | 1632 | struct neighbour *n, *old_n; |
1632 | 1633 | ||
1633 | dst_confirm(&rt->dst); | 1634 | dst_confirm(&rt->dst); |
1634 | 1635 | ||
1635 | neigh_release(dst_get_neighbour(&rt->dst)); | ||
1636 | dst_set_neighbour(&rt->dst, NULL); | ||
1637 | |||
1638 | rt->rt_gateway = peer->redirect_learned.a4; | 1636 | rt->rt_gateway = peer->redirect_learned.a4; |
1639 | rt_bind_neighbour(rt); | 1637 | |
1640 | n = dst_get_neighbour(&rt->dst); | 1638 | n = ipv4_neigh_lookup(&rt->dst, &rt->rt_gateway); |
1639 | if (IS_ERR(n)) | ||
1640 | return PTR_ERR(n); | ||
1641 | old_n = xchg(&rt->dst._neighbour, n); | ||
1642 | if (old_n) | ||
1643 | neigh_release(old_n); | ||
1641 | if (!n || !(n->nud_state & NUD_VALID)) { | 1644 | if (!n || !(n->nud_state & NUD_VALID)) { |
1642 | if (n) | 1645 | if (n) |
1643 | neigh_event_send(n, NULL); | 1646 | neigh_event_send(n, NULL); |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 955b8e65b69e..1c12b8ec849d 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -72,6 +72,7 @@ | |||
72 | #include <net/timewait_sock.h> | 72 | #include <net/timewait_sock.h> |
73 | #include <net/xfrm.h> | 73 | #include <net/xfrm.h> |
74 | #include <net/netdma.h> | 74 | #include <net/netdma.h> |
75 | #include <net/secure_seq.h> | ||
75 | 76 | ||
76 | #include <linux/inet.h> | 77 | #include <linux/inet.h> |
77 | #include <linux/ipv6.h> | 78 | #include <linux/ipv6.h> |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a55500cc0b29..f012ebd87b43 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -656,7 +656,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | |||
656 | * layer address of our nexhop router | 656 | * layer address of our nexhop router |
657 | */ | 657 | */ |
658 | 658 | ||
659 | if (dst_get_neighbour(&rt->dst) == NULL) | 659 | if (dst_get_neighbour_raw(&rt->dst) == NULL) |
660 | ifa->flags &= ~IFA_F_OPTIMISTIC; | 660 | ifa->flags &= ~IFA_F_OPTIMISTIC; |
661 | 661 | ||
662 | ifa->idev = idev; | 662 | ifa->idev = idev; |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 16560336eb72..9ef1831746ef 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -33,6 +33,11 @@ | |||
33 | #include <linux/errqueue.h> | 33 | #include <linux/errqueue.h> |
34 | #include <asm/uaccess.h> | 34 | #include <asm/uaccess.h> |
35 | 35 | ||
36 | static inline int ipv6_mapped_addr_any(const struct in6_addr *a) | ||
37 | { | ||
38 | return (ipv6_addr_v4mapped(a) && (a->s6_addr32[3] == 0)); | ||
39 | } | ||
40 | |||
36 | int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | 41 | int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) |
37 | { | 42 | { |
38 | struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; | 43 | struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; |
@@ -102,10 +107,12 @@ ipv4_connected: | |||
102 | 107 | ||
103 | ipv6_addr_set_v4mapped(inet->inet_daddr, &np->daddr); | 108 | ipv6_addr_set_v4mapped(inet->inet_daddr, &np->daddr); |
104 | 109 | ||
105 | if (ipv6_addr_any(&np->saddr)) | 110 | if (ipv6_addr_any(&np->saddr) || |
111 | ipv6_mapped_addr_any(&np->saddr)) | ||
106 | ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); | 112 | ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); |
107 | 113 | ||
108 | if (ipv6_addr_any(&np->rcv_saddr)) { | 114 | if (ipv6_addr_any(&np->rcv_saddr) || |
115 | ipv6_mapped_addr_any(&np->rcv_saddr)) { | ||
109 | ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, | 116 | ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, |
110 | &np->rcv_saddr); | 117 | &np->rcv_saddr); |
111 | if (sk->sk_prot->rehash) | 118 | if (sk->sk_prot->rehash) |
diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c index b53197233709..73f1a00a96af 100644 --- a/net/ipv6/inet6_hashtables.c +++ b/net/ipv6/inet6_hashtables.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <net/inet_connection_sock.h> | 20 | #include <net/inet_connection_sock.h> |
21 | #include <net/inet_hashtables.h> | 21 | #include <net/inet_hashtables.h> |
22 | #include <net/inet6_hashtables.h> | 22 | #include <net/inet6_hashtables.h> |
23 | #include <net/secure_seq.h> | ||
23 | #include <net/ip.h> | 24 | #include <net/ip.h> |
24 | 25 | ||
25 | int __inet6_hash(struct sock *sk, struct inet_timewait_sock *tw) | 26 | int __inet6_hash(struct sock *sk, struct inet_timewait_sock *tw) |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 54a4678955bf..320d91d20ad7 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -1455,7 +1455,7 @@ static int fib6_age(struct rt6_info *rt, void *arg) | |||
1455 | RT6_TRACE("aging clone %p\n", rt); | 1455 | RT6_TRACE("aging clone %p\n", rt); |
1456 | return -1; | 1456 | return -1; |
1457 | } else if ((rt->rt6i_flags & RTF_GATEWAY) && | 1457 | } else if ((rt->rt6i_flags & RTF_GATEWAY) && |
1458 | (!(dst_get_neighbour(&rt->dst)->flags & NTF_ROUTER))) { | 1458 | (!(dst_get_neighbour_raw(&rt->dst)->flags & NTF_ROUTER))) { |
1459 | RT6_TRACE("purging route %p via non-router but gateway\n", | 1459 | RT6_TRACE("purging route %p via non-router but gateway\n", |
1460 | rt); | 1460 | rt); |
1461 | return -1; | 1461 | return -1; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 32e5339db0c8..4c882cf4e8a1 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -135,10 +135,15 @@ static int ip6_finish_output2(struct sk_buff *skb) | |||
135 | skb->len); | 135 | skb->len); |
136 | } | 136 | } |
137 | 137 | ||
138 | rcu_read_lock(); | ||
138 | neigh = dst_get_neighbour(dst); | 139 | neigh = dst_get_neighbour(dst); |
139 | if (neigh) | 140 | if (neigh) { |
140 | return neigh_output(neigh, skb); | 141 | int res = neigh_output(neigh, skb); |
141 | 142 | ||
143 | rcu_read_unlock(); | ||
144 | return res; | ||
145 | } | ||
146 | rcu_read_unlock(); | ||
142 | IP6_INC_STATS_BH(dev_net(dst->dev), | 147 | IP6_INC_STATS_BH(dev_net(dst->dev), |
143 | ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); | 148 | ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); |
144 | kfree_skb(skb); | 149 | kfree_skb(skb); |
@@ -975,12 +980,14 @@ static int ip6_dst_lookup_tail(struct sock *sk, | |||
975 | * dst entry and replace it instead with the | 980 | * dst entry and replace it instead with the |
976 | * dst entry of the nexthop router | 981 | * dst entry of the nexthop router |
977 | */ | 982 | */ |
983 | rcu_read_lock(); | ||
978 | n = dst_get_neighbour(*dst); | 984 | n = dst_get_neighbour(*dst); |
979 | if (n && !(n->nud_state & NUD_VALID)) { | 985 | if (n && !(n->nud_state & NUD_VALID)) { |
980 | struct inet6_ifaddr *ifp; | 986 | struct inet6_ifaddr *ifp; |
981 | struct flowi6 fl_gw6; | 987 | struct flowi6 fl_gw6; |
982 | int redirect; | 988 | int redirect; |
983 | 989 | ||
990 | rcu_read_unlock(); | ||
984 | ifp = ipv6_get_ifaddr(net, &fl6->saddr, | 991 | ifp = ipv6_get_ifaddr(net, &fl6->saddr, |
985 | (*dst)->dev, 1); | 992 | (*dst)->dev, 1); |
986 | 993 | ||
@@ -1000,6 +1007,8 @@ static int ip6_dst_lookup_tail(struct sock *sk, | |||
1000 | if ((err = (*dst)->error)) | 1007 | if ((err = (*dst)->error)) |
1001 | goto out_err_release; | 1008 | goto out_err_release; |
1002 | } | 1009 | } |
1010 | } else { | ||
1011 | rcu_read_unlock(); | ||
1003 | } | 1012 | } |
1004 | #endif | 1013 | #endif |
1005 | 1014 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index e8987da06667..9e69eb0ec6dd 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -364,7 +364,7 @@ out: | |||
364 | #ifdef CONFIG_IPV6_ROUTER_PREF | 364 | #ifdef CONFIG_IPV6_ROUTER_PREF |
365 | static void rt6_probe(struct rt6_info *rt) | 365 | static void rt6_probe(struct rt6_info *rt) |
366 | { | 366 | { |
367 | struct neighbour *neigh = rt ? dst_get_neighbour(&rt->dst) : NULL; | 367 | struct neighbour *neigh; |
368 | /* | 368 | /* |
369 | * Okay, this does not seem to be appropriate | 369 | * Okay, this does not seem to be appropriate |
370 | * for now, however, we need to check if it | 370 | * for now, however, we need to check if it |
@@ -373,8 +373,10 @@ static void rt6_probe(struct rt6_info *rt) | |||
373 | * Router Reachability Probe MUST be rate-limited | 373 | * Router Reachability Probe MUST be rate-limited |
374 | * to no more than one per minute. | 374 | * to no more than one per minute. |
375 | */ | 375 | */ |
376 | rcu_read_lock(); | ||
377 | neigh = rt ? dst_get_neighbour(&rt->dst) : NULL; | ||
376 | if (!neigh || (neigh->nud_state & NUD_VALID)) | 378 | if (!neigh || (neigh->nud_state & NUD_VALID)) |
377 | return; | 379 | goto out; |
378 | read_lock_bh(&neigh->lock); | 380 | read_lock_bh(&neigh->lock); |
379 | if (!(neigh->nud_state & NUD_VALID) && | 381 | if (!(neigh->nud_state & NUD_VALID) && |
380 | time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) { | 382 | time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) { |
@@ -387,8 +389,11 @@ static void rt6_probe(struct rt6_info *rt) | |||
387 | target = (struct in6_addr *)&neigh->primary_key; | 389 | target = (struct in6_addr *)&neigh->primary_key; |
388 | addrconf_addr_solict_mult(target, &mcaddr); | 390 | addrconf_addr_solict_mult(target, &mcaddr); |
389 | ndisc_send_ns(rt->rt6i_dev, NULL, target, &mcaddr, NULL); | 391 | ndisc_send_ns(rt->rt6i_dev, NULL, target, &mcaddr, NULL); |
390 | } else | 392 | } else { |
391 | read_unlock_bh(&neigh->lock); | 393 | read_unlock_bh(&neigh->lock); |
394 | } | ||
395 | out: | ||
396 | rcu_read_unlock(); | ||
392 | } | 397 | } |
393 | #else | 398 | #else |
394 | static inline void rt6_probe(struct rt6_info *rt) | 399 | static inline void rt6_probe(struct rt6_info *rt) |
@@ -412,8 +417,11 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif) | |||
412 | 417 | ||
413 | static inline int rt6_check_neigh(struct rt6_info *rt) | 418 | static inline int rt6_check_neigh(struct rt6_info *rt) |
414 | { | 419 | { |
415 | struct neighbour *neigh = dst_get_neighbour(&rt->dst); | 420 | struct neighbour *neigh; |
416 | int m; | 421 | int m; |
422 | |||
423 | rcu_read_lock(); | ||
424 | neigh = dst_get_neighbour(&rt->dst); | ||
417 | if (rt->rt6i_flags & RTF_NONEXTHOP || | 425 | if (rt->rt6i_flags & RTF_NONEXTHOP || |
418 | !(rt->rt6i_flags & RTF_GATEWAY)) | 426 | !(rt->rt6i_flags & RTF_GATEWAY)) |
419 | m = 1; | 427 | m = 1; |
@@ -430,6 +438,7 @@ static inline int rt6_check_neigh(struct rt6_info *rt) | |||
430 | read_unlock_bh(&neigh->lock); | 438 | read_unlock_bh(&neigh->lock); |
431 | } else | 439 | } else |
432 | m = 0; | 440 | m = 0; |
441 | rcu_read_unlock(); | ||
433 | return m; | 442 | return m; |
434 | } | 443 | } |
435 | 444 | ||
@@ -769,7 +778,7 @@ static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort, | |||
769 | rt->rt6i_dst.plen = 128; | 778 | rt->rt6i_dst.plen = 128; |
770 | rt->rt6i_flags |= RTF_CACHE; | 779 | rt->rt6i_flags |= RTF_CACHE; |
771 | rt->dst.flags |= DST_HOST; | 780 | rt->dst.flags |= DST_HOST; |
772 | dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour(&ort->dst))); | 781 | dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour_raw(&ort->dst))); |
773 | } | 782 | } |
774 | return rt; | 783 | return rt; |
775 | } | 784 | } |
@@ -803,7 +812,7 @@ restart: | |||
803 | dst_hold(&rt->dst); | 812 | dst_hold(&rt->dst); |
804 | read_unlock_bh(&table->tb6_lock); | 813 | read_unlock_bh(&table->tb6_lock); |
805 | 814 | ||
806 | if (!dst_get_neighbour(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP)) | 815 | if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP)) |
807 | nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr); | 816 | nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr); |
808 | else if (!(rt->dst.flags & DST_HOST)) | 817 | else if (!(rt->dst.flags & DST_HOST)) |
809 | nrt = rt6_alloc_clone(rt, &fl6->daddr); | 818 | nrt = rt6_alloc_clone(rt, &fl6->daddr); |
@@ -1587,7 +1596,7 @@ void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src, | |||
1587 | dst_confirm(&rt->dst); | 1596 | dst_confirm(&rt->dst); |
1588 | 1597 | ||
1589 | /* Duplicate redirect: silently ignore. */ | 1598 | /* Duplicate redirect: silently ignore. */ |
1590 | if (neigh == dst_get_neighbour(&rt->dst)) | 1599 | if (neigh == dst_get_neighbour_raw(&rt->dst)) |
1591 | goto out; | 1600 | goto out; |
1592 | 1601 | ||
1593 | nrt = ip6_rt_copy(rt, dest); | 1602 | nrt = ip6_rt_copy(rt, dest); |
@@ -1682,7 +1691,7 @@ again: | |||
1682 | 1. It is connected route. Action: COW | 1691 | 1. It is connected route. Action: COW |
1683 | 2. It is gatewayed route or NONEXTHOP route. Action: clone it. | 1692 | 2. It is gatewayed route or NONEXTHOP route. Action: clone it. |
1684 | */ | 1693 | */ |
1685 | if (!dst_get_neighbour(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP)) | 1694 | if (!dst_get_neighbour_raw(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP)) |
1686 | nrt = rt6_alloc_cow(rt, daddr, saddr); | 1695 | nrt = rt6_alloc_cow(rt, daddr, saddr); |
1687 | else | 1696 | else |
1688 | nrt = rt6_alloc_clone(rt, daddr); | 1697 | nrt = rt6_alloc_clone(rt, daddr); |
@@ -2326,6 +2335,7 @@ static int rt6_fill_node(struct net *net, | |||
2326 | struct nlmsghdr *nlh; | 2335 | struct nlmsghdr *nlh; |
2327 | long expires; | 2336 | long expires; |
2328 | u32 table; | 2337 | u32 table; |
2338 | struct neighbour *n; | ||
2329 | 2339 | ||
2330 | if (prefix) { /* user wants prefix routes only */ | 2340 | if (prefix) { /* user wants prefix routes only */ |
2331 | if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { | 2341 | if (!(rt->rt6i_flags & RTF_PREFIX_RT)) { |
@@ -2414,8 +2424,11 @@ static int rt6_fill_node(struct net *net, | |||
2414 | if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0) | 2424 | if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0) |
2415 | goto nla_put_failure; | 2425 | goto nla_put_failure; |
2416 | 2426 | ||
2417 | if (dst_get_neighbour(&rt->dst)) | 2427 | rcu_read_lock(); |
2418 | NLA_PUT(skb, RTA_GATEWAY, 16, &dst_get_neighbour(&rt->dst)->primary_key); | 2428 | n = dst_get_neighbour(&rt->dst); |
2429 | if (n) | ||
2430 | NLA_PUT(skb, RTA_GATEWAY, 16, &n->primary_key); | ||
2431 | rcu_read_unlock(); | ||
2419 | 2432 | ||
2420 | if (rt->dst.dev) | 2433 | if (rt->dst.dev) |
2421 | NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex); | 2434 | NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex); |
@@ -2608,12 +2621,14 @@ static int rt6_info_route(struct rt6_info *rt, void *p_arg) | |||
2608 | #else | 2621 | #else |
2609 | seq_puts(m, "00000000000000000000000000000000 00 "); | 2622 | seq_puts(m, "00000000000000000000000000000000 00 "); |
2610 | #endif | 2623 | #endif |
2624 | rcu_read_lock(); | ||
2611 | n = dst_get_neighbour(&rt->dst); | 2625 | n = dst_get_neighbour(&rt->dst); |
2612 | if (n) { | 2626 | if (n) { |
2613 | seq_printf(m, "%pi6", n->primary_key); | 2627 | seq_printf(m, "%pi6", n->primary_key); |
2614 | } else { | 2628 | } else { |
2615 | seq_puts(m, "00000000000000000000000000000000"); | 2629 | seq_puts(m, "00000000000000000000000000000000"); |
2616 | } | 2630 | } |
2631 | rcu_read_unlock(); | ||
2617 | seq_printf(m, " %08x %08x %08x %08x %8s\n", | 2632 | seq_printf(m, " %08x %08x %08x %08x %8s\n", |
2618 | rt->rt6i_metric, atomic_read(&rt->dst.__refcnt), | 2633 | rt->rt6i_metric, atomic_read(&rt->dst.__refcnt), |
2619 | rt->dst.__use, rt->rt6i_flags, | 2634 | rt->dst.__use, rt->rt6i_flags, |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 78aa53492b3e..d1fb63f4aeb7 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -61,6 +61,7 @@ | |||
61 | #include <net/timewait_sock.h> | 61 | #include <net/timewait_sock.h> |
62 | #include <net/netdma.h> | 62 | #include <net/netdma.h> |
63 | #include <net/inet_common.h> | 63 | #include <net/inet_common.h> |
64 | #include <net/secure_seq.h> | ||
64 | 65 | ||
65 | #include <asm/uaccess.h> | 66 | #include <asm/uaccess.h> |
66 | 67 | ||
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index be43fd805bd0..2b771dc708a3 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
@@ -3771,6 +3771,7 @@ err_sock: | |||
3771 | void ip_vs_control_cleanup(void) | 3771 | void ip_vs_control_cleanup(void) |
3772 | { | 3772 | { |
3773 | EnterFunction(2); | 3773 | EnterFunction(2); |
3774 | unregister_netdevice_notifier(&ip_vs_dst_notifier); | ||
3774 | ip_vs_genl_unregister(); | 3775 | ip_vs_genl_unregister(); |
3775 | nf_unregister_sockopt(&ip_vs_sockopts); | 3776 | nf_unregister_sockopt(&ip_vs_sockopts); |
3776 | LeaveFunction(2); | 3777 | LeaveFunction(2); |
diff --git a/net/netlabel/Makefile b/net/netlabel/Makefile index ea750e9df65f..d2732fc952e2 100644 --- a/net/netlabel/Makefile +++ b/net/netlabel/Makefile | |||
@@ -1,8 +1,6 @@ | |||
1 | # | 1 | # |
2 | # Makefile for the NetLabel subsystem. | 2 | # Makefile for the NetLabel subsystem. |
3 | # | 3 | # |
4 | # Feb 9, 2006, Paul Moore <paul.moore@hp.com> | ||
5 | # | ||
6 | 4 | ||
7 | # base objects | 5 | # base objects |
8 | obj-y := netlabel_user.o netlabel_kapi.o | 6 | obj-y := netlabel_user.o netlabel_kapi.o |
diff --git a/net/netlabel/netlabel_addrlist.c b/net/netlabel/netlabel_addrlist.c index c0519139679e..96b749dacc34 100644 --- a/net/netlabel/netlabel_addrlist.c +++ b/net/netlabel/netlabel_addrlist.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * system manages static and dynamic label mappings for network protocols such | 6 | * system manages static and dynamic label mappings for network protocols such |
7 | * as CIPSO and RIPSO. | 7 | * as CIPSO and RIPSO. |
8 | * | 8 | * |
9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
diff --git a/net/netlabel/netlabel_addrlist.h b/net/netlabel/netlabel_addrlist.h index 2b9644e19de0..fdbc1d2c7352 100644 --- a/net/netlabel/netlabel_addrlist.h +++ b/net/netlabel/netlabel_addrlist.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * system manages static and dynamic label mappings for network protocols such | 6 | * system manages static and dynamic label mappings for network protocols such |
7 | * as CIPSO and RIPSO. | 7 | * as CIPSO and RIPSO. |
8 | * | 8 | * |
9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c index dd53a36d89af..6bf878335d94 100644 --- a/net/netlabel/netlabel_cipso_v4.c +++ b/net/netlabel/netlabel_cipso_v4.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/net/netlabel/netlabel_cipso_v4.h b/net/netlabel/netlabel_cipso_v4.h index af7f3355103e..d24d774bfd62 100644 --- a/net/netlabel/netlabel_cipso_v4.h +++ b/net/netlabel/netlabel_cipso_v4.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/net/netlabel/netlabel_domainhash.c b/net/netlabel/netlabel_domainhash.c index 2aa975e5452d..7d8083cde34f 100644 --- a/net/netlabel/netlabel_domainhash.c +++ b/net/netlabel/netlabel_domainhash.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * system manages static and dynamic label mappings for network protocols such | 6 | * system manages static and dynamic label mappings for network protocols such |
7 | * as CIPSO and RIPSO. | 7 | * as CIPSO and RIPSO. |
8 | * | 8 | * |
9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
diff --git a/net/netlabel/netlabel_domainhash.h b/net/netlabel/netlabel_domainhash.h index 0261dda3f2d2..bfcc0f7024c5 100644 --- a/net/netlabel/netlabel_domainhash.h +++ b/net/netlabel/netlabel_domainhash.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * system manages static and dynamic label mappings for network protocols such | 6 | * system manages static and dynamic label mappings for network protocols such |
7 | * as CIPSO and RIPSO. | 7 | * as CIPSO and RIPSO. |
8 | * | 8 | * |
9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index b528dd928d3c..58107d060846 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * system manages static and dynamic label mappings for network protocols such | 5 | * system manages static and dynamic label mappings for network protocols such |
6 | * as CIPSO and RIPSO. | 6 | * as CIPSO and RIPSO. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/net/netlabel/netlabel_mgmt.c b/net/netlabel/netlabel_mgmt.c index dff8a0809245..bfa555869775 100644 --- a/net/netlabel/netlabel_mgmt.c +++ b/net/netlabel/netlabel_mgmt.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/net/netlabel/netlabel_mgmt.h b/net/netlabel/netlabel_mgmt.h index 8db37f4c10f7..5a9f31ce5799 100644 --- a/net/netlabel/netlabel_mgmt.h +++ b/net/netlabel/netlabel_mgmt.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index f1ecf848e3ac..e6e823656f9d 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * NetLabel system. The NetLabel system manages static and dynamic label | 5 | * NetLabel system. The NetLabel system manages static and dynamic label |
6 | * mappings for network protocols such as CIPSO and RIPSO. | 6 | * mappings for network protocols such as CIPSO and RIPSO. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/net/netlabel/netlabel_unlabeled.h b/net/netlabel/netlabel_unlabeled.h index 0bc8dc3f9e3c..700af49022a0 100644 --- a/net/netlabel/netlabel_unlabeled.h +++ b/net/netlabel/netlabel_unlabeled.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * NetLabel system. The NetLabel system manages static and dynamic label | 5 | * NetLabel system. The NetLabel system manages static and dynamic label |
6 | * mappings for network protocols such as CIPSO and RIPSO. | 6 | * mappings for network protocols such as CIPSO and RIPSO. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/net/netlabel/netlabel_user.c b/net/netlabel/netlabel_user.c index a3fd75ac3fa5..9fae63f10298 100644 --- a/net/netlabel/netlabel_user.c +++ b/net/netlabel/netlabel_user.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/net/netlabel/netlabel_user.h b/net/netlabel/netlabel_user.h index f4fc4c9ad567..81969785e279 100644 --- a/net/netlabel/netlabel_user.h +++ b/net/netlabel/netlabel_user.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * NetLabel system manages static and dynamic label mappings for network | 5 | * NetLabel system manages static and dynamic label mappings for network |
6 | * protocols such as CIPSO and RIPSO. | 6 | * protocols such as CIPSO and RIPSO. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c index 4536ee64383e..4f5510e2bd6f 100644 --- a/net/sched/sch_sfq.c +++ b/net/sched/sch_sfq.c | |||
@@ -410,7 +410,12 @@ sfq_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
410 | /* Return Congestion Notification only if we dropped a packet | 410 | /* Return Congestion Notification only if we dropped a packet |
411 | * from this flow. | 411 | * from this flow. |
412 | */ | 412 | */ |
413 | return (qlen != slot->qlen) ? NET_XMIT_CN : NET_XMIT_SUCCESS; | 413 | if (qlen != slot->qlen) |
414 | return NET_XMIT_CN; | ||
415 | |||
416 | /* As we dropped a packet, better let upper stack know this */ | ||
417 | qdisc_tree_decrease_qlen(sch, 1); | ||
418 | return NET_XMIT_SUCCESS; | ||
414 | } | 419 | } |
415 | 420 | ||
416 | static struct sk_buff * | 421 | static struct sk_buff * |
diff --git a/net/socket.c b/net/socket.c index b1cbbcd92558..24a77400b65e 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -1871,8 +1871,14 @@ SYSCALL_DEFINE2(shutdown, int, fd, int, how) | |||
1871 | #define COMPAT_NAMELEN(msg) COMPAT_MSG(msg, msg_namelen) | 1871 | #define COMPAT_NAMELEN(msg) COMPAT_MSG(msg, msg_namelen) |
1872 | #define COMPAT_FLAGS(msg) COMPAT_MSG(msg, msg_flags) | 1872 | #define COMPAT_FLAGS(msg) COMPAT_MSG(msg, msg_flags) |
1873 | 1873 | ||
1874 | struct used_address { | ||
1875 | struct sockaddr_storage name; | ||
1876 | unsigned int name_len; | ||
1877 | }; | ||
1878 | |||
1874 | static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, | 1879 | static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, |
1875 | struct msghdr *msg_sys, unsigned flags, int nosec) | 1880 | struct msghdr *msg_sys, unsigned flags, |
1881 | struct used_address *used_address) | ||
1876 | { | 1882 | { |
1877 | struct compat_msghdr __user *msg_compat = | 1883 | struct compat_msghdr __user *msg_compat = |
1878 | (struct compat_msghdr __user *)msg; | 1884 | (struct compat_msghdr __user *)msg; |
@@ -1953,8 +1959,28 @@ static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, | |||
1953 | 1959 | ||
1954 | if (sock->file->f_flags & O_NONBLOCK) | 1960 | if (sock->file->f_flags & O_NONBLOCK) |
1955 | msg_sys->msg_flags |= MSG_DONTWAIT; | 1961 | msg_sys->msg_flags |= MSG_DONTWAIT; |
1956 | err = (nosec ? sock_sendmsg_nosec : sock_sendmsg)(sock, msg_sys, | 1962 | /* |
1957 | total_len); | 1963 | * If this is sendmmsg() and current destination address is same as |
1964 | * previously succeeded address, omit asking LSM's decision. | ||
1965 | * used_address->name_len is initialized to UINT_MAX so that the first | ||
1966 | * destination address never matches. | ||
1967 | */ | ||
1968 | if (used_address && used_address->name_len == msg_sys->msg_namelen && | ||
1969 | !memcmp(&used_address->name, msg->msg_name, | ||
1970 | used_address->name_len)) { | ||
1971 | err = sock_sendmsg_nosec(sock, msg_sys, total_len); | ||
1972 | goto out_freectl; | ||
1973 | } | ||
1974 | err = sock_sendmsg(sock, msg_sys, total_len); | ||
1975 | /* | ||
1976 | * If this is sendmmsg() and sending to current destination address was | ||
1977 | * successful, remember it. | ||
1978 | */ | ||
1979 | if (used_address && err >= 0) { | ||
1980 | used_address->name_len = msg_sys->msg_namelen; | ||
1981 | memcpy(&used_address->name, msg->msg_name, | ||
1982 | used_address->name_len); | ||
1983 | } | ||
1958 | 1984 | ||
1959 | out_freectl: | 1985 | out_freectl: |
1960 | if (ctl_buf != ctl) | 1986 | if (ctl_buf != ctl) |
@@ -1979,7 +2005,7 @@ SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags) | |||
1979 | if (!sock) | 2005 | if (!sock) |
1980 | goto out; | 2006 | goto out; |
1981 | 2007 | ||
1982 | err = __sys_sendmsg(sock, msg, &msg_sys, flags, 0); | 2008 | err = __sys_sendmsg(sock, msg, &msg_sys, flags, NULL); |
1983 | 2009 | ||
1984 | fput_light(sock->file, fput_needed); | 2010 | fput_light(sock->file, fput_needed); |
1985 | out: | 2011 | out: |
@@ -1998,6 +2024,10 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
1998 | struct mmsghdr __user *entry; | 2024 | struct mmsghdr __user *entry; |
1999 | struct compat_mmsghdr __user *compat_entry; | 2025 | struct compat_mmsghdr __user *compat_entry; |
2000 | struct msghdr msg_sys; | 2026 | struct msghdr msg_sys; |
2027 | struct used_address used_address; | ||
2028 | |||
2029 | if (vlen > UIO_MAXIOV) | ||
2030 | vlen = UIO_MAXIOV; | ||
2001 | 2031 | ||
2002 | datagrams = 0; | 2032 | datagrams = 0; |
2003 | 2033 | ||
@@ -2005,27 +2035,22 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
2005 | if (!sock) | 2035 | if (!sock) |
2006 | return err; | 2036 | return err; |
2007 | 2037 | ||
2008 | err = sock_error(sock->sk); | 2038 | used_address.name_len = UINT_MAX; |
2009 | if (err) | ||
2010 | goto out_put; | ||
2011 | |||
2012 | entry = mmsg; | 2039 | entry = mmsg; |
2013 | compat_entry = (struct compat_mmsghdr __user *)mmsg; | 2040 | compat_entry = (struct compat_mmsghdr __user *)mmsg; |
2041 | err = 0; | ||
2014 | 2042 | ||
2015 | while (datagrams < vlen) { | 2043 | while (datagrams < vlen) { |
2016 | /* | ||
2017 | * No need to ask LSM for more than the first datagram. | ||
2018 | */ | ||
2019 | if (MSG_CMSG_COMPAT & flags) { | 2044 | if (MSG_CMSG_COMPAT & flags) { |
2020 | err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry, | 2045 | err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry, |
2021 | &msg_sys, flags, datagrams); | 2046 | &msg_sys, flags, &used_address); |
2022 | if (err < 0) | 2047 | if (err < 0) |
2023 | break; | 2048 | break; |
2024 | err = __put_user(err, &compat_entry->msg_len); | 2049 | err = __put_user(err, &compat_entry->msg_len); |
2025 | ++compat_entry; | 2050 | ++compat_entry; |
2026 | } else { | 2051 | } else { |
2027 | err = __sys_sendmsg(sock, (struct msghdr __user *)entry, | 2052 | err = __sys_sendmsg(sock, (struct msghdr __user *)entry, |
2028 | &msg_sys, flags, datagrams); | 2053 | &msg_sys, flags, &used_address); |
2029 | if (err < 0) | 2054 | if (err < 0) |
2030 | break; | 2055 | break; |
2031 | err = put_user(err, &entry->msg_len); | 2056 | err = put_user(err, &entry->msg_len); |
@@ -2037,29 +2062,11 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
2037 | ++datagrams; | 2062 | ++datagrams; |
2038 | } | 2063 | } |
2039 | 2064 | ||
2040 | out_put: | ||
2041 | fput_light(sock->file, fput_needed); | 2065 | fput_light(sock->file, fput_needed); |
2042 | 2066 | ||
2043 | if (err == 0) | 2067 | /* We only return an error if no datagrams were able to be sent */ |
2044 | return datagrams; | 2068 | if (datagrams != 0) |
2045 | |||
2046 | if (datagrams != 0) { | ||
2047 | /* | ||
2048 | * We may send less entries than requested (vlen) if the | ||
2049 | * sock is non blocking... | ||
2050 | */ | ||
2051 | if (err != -EAGAIN) { | ||
2052 | /* | ||
2053 | * ... or if sendmsg returns an error after we | ||
2054 | * send some datagrams, where we record the | ||
2055 | * error to return on the next call or if the | ||
2056 | * app asks about it using getsockopt(SO_ERROR). | ||
2057 | */ | ||
2058 | sock->sk->sk_err = -err; | ||
2059 | } | ||
2060 | |||
2061 | return datagrams; | 2069 | return datagrams; |
2062 | } | ||
2063 | 2070 | ||
2064 | return err; | 2071 | return err; |
2065 | } | 2072 | } |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 9b6a4d1ea8f8..f4385e45a5fc 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -187,6 +187,7 @@ EXPORT_SYMBOL_GPL(xprt_load_transport); | |||
187 | /** | 187 | /** |
188 | * xprt_reserve_xprt - serialize write access to transports | 188 | * xprt_reserve_xprt - serialize write access to transports |
189 | * @task: task that is requesting access to the transport | 189 | * @task: task that is requesting access to the transport |
190 | * @xprt: pointer to the target transport | ||
190 | * | 191 | * |
191 | * This prevents mixing the payload of separate requests, and prevents | 192 | * This prevents mixing the payload of separate requests, and prevents |
192 | * transport connects from colliding with writes. No congestion control | 193 | * transport connects from colliding with writes. No congestion control |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 28d2aa109bee..e83e7fee3bc0 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -3464,7 +3464,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) | |||
3464 | tmp) { | 3464 | tmp) { |
3465 | enum ieee80211_band band = nla_type(attr); | 3465 | enum ieee80211_band band = nla_type(attr); |
3466 | 3466 | ||
3467 | if (band < 0 || band > IEEE80211_NUM_BANDS) { | 3467 | if (band < 0 || band >= IEEE80211_NUM_BANDS) { |
3468 | err = -EINVAL; | 3468 | err = -EINVAL; |
3469 | goto out_free; | 3469 | goto out_free; |
3470 | } | 3470 | } |
diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c index 58064d9e565d..791ab2e77f3f 100644 --- a/net/xfrm/xfrm_algo.c +++ b/net/xfrm/xfrm_algo.c | |||
@@ -462,8 +462,8 @@ static struct xfrm_algo_desc ealg_list[] = { | |||
462 | .desc = { | 462 | .desc = { |
463 | .sadb_alg_id = SADB_X_EALG_AESCTR, | 463 | .sadb_alg_id = SADB_X_EALG_AESCTR, |
464 | .sadb_alg_ivlen = 8, | 464 | .sadb_alg_ivlen = 8, |
465 | .sadb_alg_minbits = 128, | 465 | .sadb_alg_minbits = 160, |
466 | .sadb_alg_maxbits = 256 | 466 | .sadb_alg_maxbits = 288 |
467 | } | 467 | } |
468 | }, | 468 | }, |
469 | }; | 469 | }; |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index a38316b2e3f6..266a2292451d 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -14,7 +14,7 @@ | |||
14 | * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc. | 14 | * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc. |
15 | * <dgoeddel@trustedcs.com> | 15 | * <dgoeddel@trustedcs.com> |
16 | * Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P. | 16 | * Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P. |
17 | * Paul Moore <paul.moore@hp.com> | 17 | * Paul Moore <paul@paul-moore.com> |
18 | * Copyright (C) 2007 Hitachi Software Engineering Co., Ltd. | 18 | * Copyright (C) 2007 Hitachi Software Engineering Co., Ltd. |
19 | * Yuichi Nakamura <ynakam@hitachisoft.jp> | 19 | * Yuichi Nakamura <ynakam@hitachisoft.jp> |
20 | * | 20 | * |
diff --git a/security/selinux/include/netif.h b/security/selinux/include/netif.h index ce23edd128b3..43d507242b42 100644 --- a/security/selinux/include/netif.h +++ b/security/selinux/include/netif.h | |||
@@ -8,7 +8,7 @@ | |||
8 | * | 8 | * |
9 | * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com> | 9 | * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com> |
10 | * Copyright (C) 2007 Hewlett-Packard Development Company, L.P. | 10 | * Copyright (C) 2007 Hewlett-Packard Development Company, L.P. |
11 | * Paul Moore, <paul.moore@hp.com> | 11 | * Paul Moore <paul@paul-moore.com> |
12 | * | 12 | * |
13 | * This program is free software; you can redistribute it and/or modify | 13 | * This program is free software; you can redistribute it and/or modify |
14 | * it under the terms of the GNU General Public License version 2, | 14 | * it under the terms of the GNU General Public License version 2, |
diff --git a/security/selinux/include/netlabel.h b/security/selinux/include/netlabel.h index cf2f628e6e28..8c59b8f150e8 100644 --- a/security/selinux/include/netlabel.h +++ b/security/selinux/include/netlabel.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * SELinux interface to the NetLabel subsystem | 2 | * SELinux interface to the NetLabel subsystem |
3 | * | 3 | * |
4 | * Author : Paul Moore <paul.moore@hp.com> | 4 | * Author: Paul Moore <paul@paul-moore.com> |
5 | * | 5 | * |
6 | */ | 6 | */ |
7 | 7 | ||
diff --git a/security/selinux/include/netnode.h b/security/selinux/include/netnode.h index 1b94450d11d2..df7a5ed6c694 100644 --- a/security/selinux/include/netnode.h +++ b/security/selinux/include/netnode.h | |||
@@ -6,7 +6,7 @@ | |||
6 | * needed to reduce the lookup overhead since most of these queries happen on | 6 | * needed to reduce the lookup overhead since most of these queries happen on |
7 | * a per-packet basis. | 7 | * a per-packet basis. |
8 | * | 8 | * |
9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
diff --git a/security/selinux/include/netport.h b/security/selinux/include/netport.h index 8991752eaf93..4d965b83d735 100644 --- a/security/selinux/include/netport.h +++ b/security/selinux/include/netport.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * mapping is maintained as part of the normal policy but a fast cache is | 5 | * mapping is maintained as part of the normal policy but a fast cache is |
6 | * needed to reduce the lookup overhead. | 6 | * needed to reduce the lookup overhead. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | */ | 10 | */ |
11 | 11 | ||
diff --git a/security/selinux/netif.c b/security/selinux/netif.c index 58cc481c93d5..326f22cbe405 100644 --- a/security/selinux/netif.c +++ b/security/selinux/netif.c | |||
@@ -8,7 +8,7 @@ | |||
8 | * | 8 | * |
9 | * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com> | 9 | * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com> |
10 | * Copyright (C) 2007 Hewlett-Packard Development Company, L.P. | 10 | * Copyright (C) 2007 Hewlett-Packard Development Company, L.P. |
11 | * Paul Moore <paul.moore@hp.com> | 11 | * Paul Moore <paul@paul-moore.com> |
12 | * | 12 | * |
13 | * This program is free software; you can redistribute it and/or modify | 13 | * This program is free software; you can redistribute it and/or modify |
14 | * it under the terms of the GNU General Public License version 2, | 14 | * it under the terms of the GNU General Public License version 2, |
diff --git a/security/selinux/netlabel.c b/security/selinux/netlabel.c index c3bf3ed07b06..da4b8b233280 100644 --- a/security/selinux/netlabel.c +++ b/security/selinux/netlabel.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * This file provides the necessary glue to tie NetLabel into the SELinux | 4 | * This file provides the necessary glue to tie NetLabel into the SELinux |
5 | * subsystem. | 5 | * subsystem. |
6 | * | 6 | * |
7 | * Author: Paul Moore <paul.moore@hp.com> | 7 | * Author: Paul Moore <paul@paul-moore.com> |
8 | * | 8 | * |
9 | */ | 9 | */ |
10 | 10 | ||
diff --git a/security/selinux/netnode.c b/security/selinux/netnode.c index 8b691a863186..3bf46abaa688 100644 --- a/security/selinux/netnode.c +++ b/security/selinux/netnode.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * needed to reduce the lookup overhead since most of these queries happen on | 6 | * needed to reduce the lookup overhead since most of these queries happen on |
7 | * a per-packet basis. | 7 | * a per-packet basis. |
8 | * | 8 | * |
9 | * Author: Paul Moore <paul.moore@hp.com> | 9 | * Author: Paul Moore <paul@paul-moore.com> |
10 | * | 10 | * |
11 | * This code is heavily based on the "netif" concept originally developed by | 11 | * This code is heavily based on the "netif" concept originally developed by |
12 | * James Morris <jmorris@redhat.com> | 12 | * James Morris <jmorris@redhat.com> |
diff --git a/security/selinux/netport.c b/security/selinux/netport.c index ae76e298de7d..0b62bd112461 100644 --- a/security/selinux/netport.c +++ b/security/selinux/netport.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * mapping is maintained as part of the normal policy but a fast cache is | 5 | * mapping is maintained as part of the normal policy but a fast cache is |
6 | * needed to reduce the lookup overhead. | 6 | * needed to reduce the lookup overhead. |
7 | * | 7 | * |
8 | * Author: Paul Moore <paul.moore@hp.com> | 8 | * Author: Paul Moore <paul@paul-moore.com> |
9 | * | 9 | * |
10 | * This code is heavily based on the "netif" concept originally developed by | 10 | * This code is heavily based on the "netif" concept originally developed by |
11 | * James Morris <jmorris@redhat.com> | 11 | * James Morris <jmorris@redhat.com> |
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index de7900ef53da..55d92cbb177a 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * | 2 | * |
3 | * Added conditional policy language extensions | 3 | * Added conditional policy language extensions |
4 | * | 4 | * |
5 | * Updated: Hewlett-Packard <paul.moore@hp.com> | 5 | * Updated: Hewlett-Packard <paul@paul-moore.com> |
6 | * | 6 | * |
7 | * Added support for the policy capability bitmap | 7 | * Added support for the policy capability bitmap |
8 | * | 8 | * |
diff --git a/security/selinux/ss/ebitmap.c b/security/selinux/ss/ebitmap.c index d42951fcbe87..30f119b1d1ec 100644 --- a/security/selinux/ss/ebitmap.c +++ b/security/selinux/ss/ebitmap.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Author : Stephen Smalley, <sds@epoch.ncsc.mil> | 4 | * Author : Stephen Smalley, <sds@epoch.ncsc.mil> |
5 | */ | 5 | */ |
6 | /* | 6 | /* |
7 | * Updated: Hewlett-Packard <paul.moore@hp.com> | 7 | * Updated: Hewlett-Packard <paul@paul-moore.com> |
8 | * | 8 | * |
9 | * Added support to import/export the NetLabel category bitmap | 9 | * Added support to import/export the NetLabel category bitmap |
10 | * | 10 | * |
diff --git a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c index e96174216bc9..fbf9c5816c71 100644 --- a/security/selinux/ss/mls.c +++ b/security/selinux/ss/mls.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc. | 11 | * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc. |
12 | */ | 12 | */ |
13 | /* | 13 | /* |
14 | * Updated: Hewlett-Packard <paul.moore@hp.com> | 14 | * Updated: Hewlett-Packard <paul@paul-moore.com> |
15 | * | 15 | * |
16 | * Added support to import/export the MLS label from NetLabel | 16 | * Added support to import/export the MLS label from NetLabel |
17 | * | 17 | * |
diff --git a/security/selinux/ss/mls.h b/security/selinux/ss/mls.h index 037bf9d82d41..e4369e3e6366 100644 --- a/security/selinux/ss/mls.h +++ b/security/selinux/ss/mls.h | |||
@@ -11,7 +11,7 @@ | |||
11 | * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc. | 11 | * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc. |
12 | */ | 12 | */ |
13 | /* | 13 | /* |
14 | * Updated: Hewlett-Packard <paul.moore@hp.com> | 14 | * Updated: Hewlett-Packard <paul@paul-moore.com> |
15 | * | 15 | * |
16 | * Added support to import/export the MLS label from NetLabel | 16 | * Added support to import/export the MLS label from NetLabel |
17 | * | 17 | * |
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index d246aca3f4fb..2381d0ded228 100644 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c | |||
@@ -13,7 +13,7 @@ | |||
13 | * | 13 | * |
14 | * Added conditional policy language extensions | 14 | * Added conditional policy language extensions |
15 | * | 15 | * |
16 | * Updated: Hewlett-Packard <paul.moore@hp.com> | 16 | * Updated: Hewlett-Packard <paul@paul-moore.com> |
17 | * | 17 | * |
18 | * Added support for the policy capability bitmap | 18 | * Added support for the policy capability bitmap |
19 | * | 19 | * |
diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 973e00e34fa9..f6917bc0aa05 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c | |||
@@ -13,7 +13,7 @@ | |||
13 | * | 13 | * |
14 | * Added conditional policy language extensions | 14 | * Added conditional policy language extensions |
15 | * | 15 | * |
16 | * Updated: Hewlett-Packard <paul.moore@hp.com> | 16 | * Updated: Hewlett-Packard <paul@paul-moore.com> |
17 | * | 17 | * |
18 | * Added support for NetLabel | 18 | * Added support for NetLabel |
19 | * Added support for the policy capability bitmap | 19 | * Added support for the policy capability bitmap |
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index f375eb2e1957..b9c5e149903b 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c | |||
@@ -9,7 +9,7 @@ | |||
9 | * | 9 | * |
10 | * Copyright (C) 2007 Casey Schaufler <casey@schaufler-ca.com> | 10 | * Copyright (C) 2007 Casey Schaufler <casey@schaufler-ca.com> |
11 | * Copyright (C) 2009 Hewlett-Packard Development Company, L.P. | 11 | * Copyright (C) 2009 Hewlett-Packard Development Company, L.P. |
12 | * Paul Moore <paul.moore@hp.com> | 12 | * Paul Moore <paul@paul-moore.com> |
13 | * Copyright (C) 2010 Nokia Corporation | 13 | * Copyright (C) 2010 Nokia Corporation |
14 | * | 14 | * |
15 | * This program is free software; you can redistribute it and/or modify | 15 | * This program is free software; you can redistribute it and/or modify |
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c index c8439cf2a448..2e43aec1c36b 100644 --- a/security/tomoyo/common.c +++ b/security/tomoyo/common.c | |||
@@ -710,8 +710,10 @@ static void tomoyo_read_profile(struct tomoyo_io_buffer *head) | |||
710 | head->r.index++) | 710 | head->r.index++) |
711 | if (ns->profile_ptr[head->r.index]) | 711 | if (ns->profile_ptr[head->r.index]) |
712 | break; | 712 | break; |
713 | if (head->r.index == TOMOYO_MAX_PROFILES) | 713 | if (head->r.index == TOMOYO_MAX_PROFILES) { |
714 | head->r.eof = true; | ||
714 | return; | 715 | return; |
716 | } | ||
715 | head->r.step++; | 717 | head->r.step++; |
716 | break; | 718 | break; |
717 | case 2: | 719 | case 2: |
@@ -723,6 +725,7 @@ static void tomoyo_read_profile(struct tomoyo_io_buffer *head) | |||
723 | tomoyo_io_printf(head, "%u-COMMENT=", index); | 725 | tomoyo_io_printf(head, "%u-COMMENT=", index); |
724 | tomoyo_set_string(head, comment ? comment->name : ""); | 726 | tomoyo_set_string(head, comment ? comment->name : ""); |
725 | tomoyo_set_lf(head); | 727 | tomoyo_set_lf(head); |
728 | tomoyo_print_namespace(head); | ||
726 | tomoyo_io_printf(head, "%u-PREFERENCE={ ", index); | 729 | tomoyo_io_printf(head, "%u-PREFERENCE={ ", index); |
727 | for (i = 0; i < TOMOYO_MAX_PREF; i++) | 730 | for (i = 0; i < TOMOYO_MAX_PREF; i++) |
728 | tomoyo_io_printf(head, "%s=%u ", | 731 | tomoyo_io_printf(head, "%s=%u ", |
diff --git a/sound/core/timer.c b/sound/core/timer.c index 7c1cbf0a0dc4..67ebf1c21c04 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c | |||
@@ -328,6 +328,8 @@ int snd_timer_close(struct snd_timer_instance *timeri) | |||
328 | mutex_unlock(®ister_mutex); | 328 | mutex_unlock(®ister_mutex); |
329 | } else { | 329 | } else { |
330 | timer = timeri->timer; | 330 | timer = timeri->timer; |
331 | if (snd_BUG_ON(!timer)) | ||
332 | goto out; | ||
331 | /* wait, until the active callback is finished */ | 333 | /* wait, until the active callback is finished */ |
332 | spin_lock_irq(&timer->lock); | 334 | spin_lock_irq(&timer->lock); |
333 | while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) { | 335 | while (timeri->flags & SNDRV_TIMER_IFLG_CALLBACK) { |
@@ -353,6 +355,7 @@ int snd_timer_close(struct snd_timer_instance *timeri) | |||
353 | } | 355 | } |
354 | mutex_unlock(®ister_mutex); | 356 | mutex_unlock(®ister_mutex); |
355 | } | 357 | } |
358 | out: | ||
356 | if (timeri->private_free) | 359 | if (timeri->private_free) |
357 | timeri->private_free(timeri); | 360 | timeri->private_free(timeri); |
358 | kfree(timeri->owner); | 361 | kfree(timeri->owner); |
@@ -531,6 +534,8 @@ int snd_timer_stop(struct snd_timer_instance *timeri) | |||
531 | if (err < 0) | 534 | if (err < 0) |
532 | return err; | 535 | return err; |
533 | timer = timeri->timer; | 536 | timer = timeri->timer; |
537 | if (!timer) | ||
538 | return -EINVAL; | ||
534 | spin_lock_irqsave(&timer->lock, flags); | 539 | spin_lock_irqsave(&timer->lock, flags); |
535 | timeri->cticks = timeri->ticks; | 540 | timeri->cticks = timeri->ticks; |
536 | timeri->pticks = 0; | 541 | timeri->pticks = 0; |
diff --git a/sound/oss/pas2_pcm.c b/sound/oss/pas2_pcm.c index 8f7d175767a2..6f13ab4afc6b 100644 --- a/sound/oss/pas2_pcm.c +++ b/sound/oss/pas2_pcm.c | |||
@@ -63,13 +63,13 @@ static int pcm_set_speed(int arg) | |||
63 | 63 | ||
64 | if (pcm_channels & 2) | 64 | if (pcm_channels & 2) |
65 | { | 65 | { |
66 | foo = ((CLOCK_TICK_RATE / 2) + (arg / 2)) / arg; | 66 | foo = ((PIT_TICK_RATE / 2) + (arg / 2)) / arg; |
67 | arg = ((CLOCK_TICK_RATE / 2) + (foo / 2)) / foo; | 67 | arg = ((PIT_TICK_RATE / 2) + (foo / 2)) / foo; |
68 | } | 68 | } |
69 | else | 69 | else |
70 | { | 70 | { |
71 | foo = (CLOCK_TICK_RATE + (arg / 2)) / arg; | 71 | foo = (PIT_TICK_RATE + (arg / 2)) / arg; |
72 | arg = (CLOCK_TICK_RATE + (foo / 2)) / foo; | 72 | arg = (PIT_TICK_RATE + (foo / 2)) / foo; |
73 | } | 73 | } |
74 | 74 | ||
75 | pcm_speed = arg; | 75 | pcm_speed = arg; |
diff --git a/sound/oss/pss.c b/sound/oss/pss.c index 9b800ce5100e..2fc0624024b5 100644 --- a/sound/oss/pss.c +++ b/sound/oss/pss.c | |||
@@ -673,7 +673,8 @@ static void configure_nonsound_components(void) | |||
673 | 673 | ||
674 | if (pss_cdrom_port == -1) { /* If cdrom port enablation wasn't requested */ | 674 | if (pss_cdrom_port == -1) { /* If cdrom port enablation wasn't requested */ |
675 | printk(KERN_INFO "PSS: CDROM port not enabled.\n"); | 675 | printk(KERN_INFO "PSS: CDROM port not enabled.\n"); |
676 | } else if (check_region(pss_cdrom_port, 2)) { | 676 | } else if (!request_region(pss_cdrom_port, 2, "PSS CDROM")) { |
677 | pss_cdrom_port = -1; | ||
677 | printk(KERN_ERR "PSS: CDROM I/O port conflict.\n"); | 678 | printk(KERN_ERR "PSS: CDROM I/O port conflict.\n"); |
678 | } else { | 679 | } else { |
679 | set_io_base(devc, CONF_CDROM, pss_cdrom_port); | 680 | set_io_base(devc, CONF_CDROM, pss_cdrom_port); |
@@ -1232,7 +1233,8 @@ static void __exit cleanup_pss(void) | |||
1232 | if(pssmpu) | 1233 | if(pssmpu) |
1233 | unload_pss_mpu(&cfg_mpu); | 1234 | unload_pss_mpu(&cfg_mpu); |
1234 | unload_pss(&cfg); | 1235 | unload_pss(&cfg); |
1235 | } | 1236 | } else if (pss_cdrom_port != -1) |
1237 | release_region(pss_cdrom_port, 2); | ||
1236 | 1238 | ||
1237 | if(!pss_keep_settings) /* Keep hardware settings if asked */ | 1239 | if(!pss_keep_settings) /* Keep hardware settings if asked */ |
1238 | { | 1240 | { |
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig index 50abf5bf8e09..88168044375f 100644 --- a/sound/pci/Kconfig +++ b/sound/pci/Kconfig | |||
@@ -1,5 +1,10 @@ | |||
1 | # ALSA PCI drivers | 1 | # ALSA PCI drivers |
2 | 2 | ||
3 | config SND_TEA575X | ||
4 | tristate | ||
5 | depends on SND_FM801_TEA575X_BOOL || SND_ES1968_RADIO || RADIO_SF16FMR2 | ||
6 | default SND_FM801 || SND_ES1968 || RADIO_SF16FMR2 | ||
7 | |||
3 | menuconfig SND_PCI | 8 | menuconfig SND_PCI |
4 | bool "PCI sound devices" | 9 | bool "PCI sound devices" |
5 | depends on PCI | 10 | depends on PCI |
@@ -563,11 +568,6 @@ config SND_FM801_TEA575X_BOOL | |||
563 | FM801 chip with a TEA5757 tuner (MediaForte SF256-PCS, SF256-PCP and | 568 | FM801 chip with a TEA5757 tuner (MediaForte SF256-PCS, SF256-PCP and |
564 | SF64-PCR) into the snd-fm801 driver. | 569 | SF64-PCR) into the snd-fm801 driver. |
565 | 570 | ||
566 | config SND_TEA575X | ||
567 | tristate | ||
568 | depends on SND_FM801_TEA575X_BOOL || SND_ES1968_RADIO || RADIO_SF16FMR2 | ||
569 | default SND_FM801 || SND_ES1968 || RADIO_SF16FMR2 | ||
570 | |||
571 | source "sound/pci/hda/Kconfig" | 571 | source "sound/pci/hda/Kconfig" |
572 | 572 | ||
573 | config SND_HDSP | 573 | config SND_HDSP |
diff --git a/sound/pci/asihpi/hpicmn.c b/sound/pci/asihpi/hpicmn.c index 65b7ca13115b..bd47521b24ec 100644 --- a/sound/pci/asihpi/hpicmn.c +++ b/sound/pci/asihpi/hpicmn.c | |||
@@ -631,13 +631,12 @@ struct hpi_control_cache *hpi_alloc_control_cache(const u32 control_count, | |||
631 | if (!p_cache) | 631 | if (!p_cache) |
632 | return NULL; | 632 | return NULL; |
633 | 633 | ||
634 | p_cache->p_info = | 634 | p_cache->p_info = kzalloc(sizeof(*p_cache->p_info) * control_count, |
635 | kmalloc(sizeof(*p_cache->p_info) * control_count, GFP_KERNEL); | 635 | GFP_KERNEL); |
636 | if (!p_cache->p_info) { | 636 | if (!p_cache->p_info) { |
637 | kfree(p_cache); | 637 | kfree(p_cache); |
638 | return NULL; | 638 | return NULL; |
639 | } | 639 | } |
640 | memset(p_cache->p_info, 0, sizeof(*p_cache->p_info) * control_count); | ||
641 | p_cache->cache_size_in_bytes = size_in_bytes; | 640 | p_cache->cache_size_in_bytes = size_in_bytes; |
642 | p_cache->control_count = control_count; | 641 | p_cache->control_count = control_count; |
643 | p_cache->p_cache = p_dsp_control_buffer; | 642 | p_cache->p_cache = p_dsp_control_buffer; |
diff --git a/sound/pci/hda/alc269_quirks.c b/sound/pci/hda/alc269_quirks.c index 14fdcf29b154..5ac0e2162a46 100644 --- a/sound/pci/hda/alc269_quirks.c +++ b/sound/pci/hda/alc269_quirks.c | |||
@@ -531,17 +531,10 @@ static const struct snd_pci_quirk alc269_cfg_tbl[] = { | |||
531 | SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC), | 531 | SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC), |
532 | SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC), | 532 | SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC), |
533 | SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC), | 533 | SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC), |
534 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC), | ||
535 | SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC), | 534 | SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC), |
536 | SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC), | 535 | SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC), |
537 | SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC), | 536 | SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC), |
538 | SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC), | 537 | SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC), |
539 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901", | ||
540 | ALC269_DMIC), | ||
541 | SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101", | ||
542 | ALC269_DMIC), | ||
543 | SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC), | ||
544 | SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC), | ||
545 | SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO), | 538 | SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO), |
546 | SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), | 539 | SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK), |
547 | SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC), | 540 | SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC), |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index e125c60fe352..9a1aa09f47fe 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -4484,6 +4484,22 @@ static void alc269_fixup_pcm_44k(struct hda_codec *codec, | |||
4484 | spec->stream_analog_capture = &alc269_44k_pcm_analog_capture; | 4484 | spec->stream_analog_capture = &alc269_44k_pcm_analog_capture; |
4485 | } | 4485 | } |
4486 | 4486 | ||
4487 | static void alc269_fixup_stereo_dmic(struct hda_codec *codec, | ||
4488 | const struct alc_fixup *fix, int action) | ||
4489 | { | ||
4490 | int coef; | ||
4491 | |||
4492 | if (action != ALC_FIXUP_ACT_INIT) | ||
4493 | return; | ||
4494 | /* The digital-mic unit sends PDM (differential signal) instead of | ||
4495 | * the standard PCM, thus you can't record a valid mono stream as is. | ||
4496 | * Below is a workaround specific to ALC269 to control the dmic | ||
4497 | * signal source as mono. | ||
4498 | */ | ||
4499 | coef = alc_read_coef_idx(codec, 0x07); | ||
4500 | alc_write_coef_idx(codec, 0x07, coef | 0x80); | ||
4501 | } | ||
4502 | |||
4487 | enum { | 4503 | enum { |
4488 | ALC269_FIXUP_SONY_VAIO, | 4504 | ALC269_FIXUP_SONY_VAIO, |
4489 | ALC275_FIXUP_SONY_VAIO_GPIO2, | 4505 | ALC275_FIXUP_SONY_VAIO_GPIO2, |
@@ -4494,6 +4510,7 @@ enum { | |||
4494 | ALC275_FIXUP_SONY_HWEQ, | 4510 | ALC275_FIXUP_SONY_HWEQ, |
4495 | ALC271_FIXUP_DMIC, | 4511 | ALC271_FIXUP_DMIC, |
4496 | ALC269_FIXUP_PCM_44K, | 4512 | ALC269_FIXUP_PCM_44K, |
4513 | ALC269_FIXUP_STEREO_DMIC, | ||
4497 | }; | 4514 | }; |
4498 | 4515 | ||
4499 | static const struct alc_fixup alc269_fixups[] = { | 4516 | static const struct alc_fixup alc269_fixups[] = { |
@@ -4556,10 +4573,19 @@ static const struct alc_fixup alc269_fixups[] = { | |||
4556 | .type = ALC_FIXUP_FUNC, | 4573 | .type = ALC_FIXUP_FUNC, |
4557 | .v.func = alc269_fixup_pcm_44k, | 4574 | .v.func = alc269_fixup_pcm_44k, |
4558 | }, | 4575 | }, |
4576 | [ALC269_FIXUP_STEREO_DMIC] = { | ||
4577 | .type = ALC_FIXUP_FUNC, | ||
4578 | .v.func = alc269_fixup_stereo_dmic, | ||
4579 | }, | ||
4559 | }; | 4580 | }; |
4560 | 4581 | ||
4561 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 4582 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
4562 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), | 4583 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), |
4584 | SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC), | ||
4585 | SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC), | ||
4586 | SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC), | ||
4587 | SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC), | ||
4588 | SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC), | ||
4563 | SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2), | 4589 | SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2), |
4564 | SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), | 4590 | SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), |
4565 | SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), | 4591 | SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 84d8798bf33a..4ebfbd874c9a 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
@@ -2084,7 +2084,7 @@ static int via_auto_create_speaker_ctls(struct hda_codec *codec) | |||
2084 | struct via_spec *spec = codec->spec; | 2084 | struct via_spec *spec = codec->spec; |
2085 | struct nid_path *path; | 2085 | struct nid_path *path; |
2086 | bool check_dac; | 2086 | bool check_dac; |
2087 | hda_nid_t pin, dac; | 2087 | hda_nid_t pin, dac = 0; |
2088 | int err; | 2088 | int err; |
2089 | 2089 | ||
2090 | pin = spec->autocfg.speaker_pins[0]; | 2090 | pin = spec->autocfg.speaker_pins[0]; |
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c index 6edc67ced905..493e3946756f 100644 --- a/sound/pci/rme9652/hdspm.c +++ b/sound/pci/rme9652/hdspm.c | |||
@@ -1339,6 +1339,10 @@ static u64 hdspm_calc_dds_value(struct hdspm *hdspm, u64 period) | |||
1339 | break; | 1339 | break; |
1340 | case MADIface: | 1340 | case MADIface: |
1341 | freq_const = 131072000000000ULL; | 1341 | freq_const = 131072000000000ULL; |
1342 | break; | ||
1343 | default: | ||
1344 | snd_BUG(); | ||
1345 | return 0; | ||
1342 | } | 1346 | } |
1343 | 1347 | ||
1344 | return div_u64(freq_const, period); | 1348 | return div_u64(freq_const, period); |
@@ -1356,16 +1360,19 @@ static void hdspm_set_dds_value(struct hdspm *hdspm, int rate) | |||
1356 | 1360 | ||
1357 | switch (hdspm->io_type) { | 1361 | switch (hdspm->io_type) { |
1358 | case MADIface: | 1362 | case MADIface: |
1359 | n = 131072000000000ULL; /* 125 MHz */ | 1363 | n = 131072000000000ULL; /* 125 MHz */ |
1360 | break; | 1364 | break; |
1361 | case MADI: | 1365 | case MADI: |
1362 | case AES32: | 1366 | case AES32: |
1363 | n = 110069313433624ULL; /* 105 MHz */ | 1367 | n = 110069313433624ULL; /* 105 MHz */ |
1364 | break; | 1368 | break; |
1365 | case RayDAT: | 1369 | case RayDAT: |
1366 | case AIO: | 1370 | case AIO: |
1367 | n = 104857600000000ULL; /* 100 MHz */ | 1371 | n = 104857600000000ULL; /* 100 MHz */ |
1368 | break; | 1372 | break; |
1373 | default: | ||
1374 | snd_BUG(); | ||
1375 | return; | ||
1369 | } | 1376 | } |
1370 | 1377 | ||
1371 | n = div_u64(n, rate); | 1378 | n = div_u64(n, rate); |
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 379b2e3afd98..665d9240c4ae 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig | |||
@@ -78,7 +78,6 @@ config SND_SOC_ALL_CODECS | |||
78 | select SND_SOC_WM8900 if I2C | 78 | select SND_SOC_WM8900 if I2C |
79 | select SND_SOC_WM8903 if I2C | 79 | select SND_SOC_WM8903 if I2C |
80 | select SND_SOC_WM8904 if I2C | 80 | select SND_SOC_WM8904 if I2C |
81 | select SND_SOC_WM8915 if I2C | ||
82 | select SND_SOC_WM8940 if I2C | 81 | select SND_SOC_WM8940 if I2C |
83 | select SND_SOC_WM8955 if I2C | 82 | select SND_SOC_WM8955 if I2C |
84 | select SND_SOC_WM8960 if I2C | 83 | select SND_SOC_WM8960 if I2C |
@@ -95,6 +94,7 @@ config SND_SOC_ALL_CODECS | |||
95 | select SND_SOC_WM8993 if I2C | 94 | select SND_SOC_WM8993 if I2C |
96 | select SND_SOC_WM8994 if MFD_WM8994 | 95 | select SND_SOC_WM8994 if MFD_WM8994 |
97 | select SND_SOC_WM8995 if SND_SOC_I2C_AND_SPI | 96 | select SND_SOC_WM8995 if SND_SOC_I2C_AND_SPI |
97 | select SND_SOC_WM8996 if I2C | ||
98 | select SND_SOC_WM9081 if I2C | 98 | select SND_SOC_WM9081 if I2C |
99 | select SND_SOC_WM9090 if I2C | 99 | select SND_SOC_WM9090 if I2C |
100 | select SND_SOC_WM9705 if SND_SOC_AC97_BUS | 100 | select SND_SOC_WM9705 if SND_SOC_AC97_BUS |
@@ -329,9 +329,6 @@ config SND_SOC_WM8903 | |||
329 | config SND_SOC_WM8904 | 329 | config SND_SOC_WM8904 |
330 | tristate | 330 | tristate |
331 | 331 | ||
332 | config SND_SOC_WM8915 | ||
333 | tristate | ||
334 | |||
335 | config SND_SOC_WM8940 | 332 | config SND_SOC_WM8940 |
336 | tristate | 333 | tristate |
337 | 334 | ||
@@ -380,6 +377,9 @@ config SND_SOC_WM8994 | |||
380 | config SND_SOC_WM8995 | 377 | config SND_SOC_WM8995 |
381 | tristate | 378 | tristate |
382 | 379 | ||
380 | config SND_SOC_WM8996 | ||
381 | tristate | ||
382 | |||
383 | config SND_SOC_WM9081 | 383 | config SND_SOC_WM9081 |
384 | tristate | 384 | tristate |
385 | 385 | ||
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index da9990fb8569..5119a7e2c1a8 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile | |||
@@ -63,7 +63,7 @@ snd-soc-wm8804-objs := wm8804.o | |||
63 | snd-soc-wm8900-objs := wm8900.o | 63 | snd-soc-wm8900-objs := wm8900.o |
64 | snd-soc-wm8903-objs := wm8903.o | 64 | snd-soc-wm8903-objs := wm8903.o |
65 | snd-soc-wm8904-objs := wm8904.o | 65 | snd-soc-wm8904-objs := wm8904.o |
66 | snd-soc-wm8915-objs := wm8915.o | 66 | snd-soc-wm8996-objs := wm8996.o |
67 | snd-soc-wm8940-objs := wm8940.o | 67 | snd-soc-wm8940-objs := wm8940.o |
68 | snd-soc-wm8955-objs := wm8955.o | 68 | snd-soc-wm8955-objs := wm8955.o |
69 | snd-soc-wm8960-objs := wm8960.o | 69 | snd-soc-wm8960-objs := wm8960.o |
@@ -160,7 +160,7 @@ obj-$(CONFIG_SND_SOC_WM8804) += snd-soc-wm8804.o | |||
160 | obj-$(CONFIG_SND_SOC_WM8900) += snd-soc-wm8900.o | 160 | obj-$(CONFIG_SND_SOC_WM8900) += snd-soc-wm8900.o |
161 | obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o | 161 | obj-$(CONFIG_SND_SOC_WM8903) += snd-soc-wm8903.o |
162 | obj-$(CONFIG_SND_SOC_WM8904) += snd-soc-wm8904.o | 162 | obj-$(CONFIG_SND_SOC_WM8904) += snd-soc-wm8904.o |
163 | obj-$(CONFIG_SND_SOC_WM8915) += snd-soc-wm8915.o | 163 | obj-$(CONFIG_SND_SOC_WM8996) += snd-soc-wm8996.o |
164 | obj-$(CONFIG_SND_SOC_WM8940) += snd-soc-wm8940.o | 164 | obj-$(CONFIG_SND_SOC_WM8940) += snd-soc-wm8940.o |
165 | obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o | 165 | obj-$(CONFIG_SND_SOC_WM8955) += snd-soc-wm8955.o |
166 | obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o | 166 | obj-$(CONFIG_SND_SOC_WM8960) += snd-soc-wm8960.o |
diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index 76258f2a2ffb..7e4066e131e6 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c | |||
@@ -33,73 +33,31 @@ | |||
33 | #define SGTL5000_DAP_REG_OFFSET 0x0100 | 33 | #define SGTL5000_DAP_REG_OFFSET 0x0100 |
34 | #define SGTL5000_MAX_REG_OFFSET 0x013A | 34 | #define SGTL5000_MAX_REG_OFFSET 0x013A |
35 | 35 | ||
36 | /* default value of sgtl5000 registers except DAP */ | 36 | /* default value of sgtl5000 registers */ |
37 | static const u16 sgtl5000_regs[SGTL5000_MAX_REG_OFFSET >> 1] = { | 37 | static const u16 sgtl5000_regs[SGTL5000_MAX_REG_OFFSET] = { |
38 | 0xa011, /* 0x0000, CHIP_ID. 11 stand for revison 17 */ | 38 | [SGTL5000_CHIP_CLK_CTRL] = 0x0008, |
39 | 0x0000, /* 0x0002, CHIP_DIG_POWER. */ | 39 | [SGTL5000_CHIP_I2S_CTRL] = 0x0010, |
40 | 0x0008, /* 0x0004, CHIP_CKL_CTRL */ | 40 | [SGTL5000_CHIP_SSS_CTRL] = 0x0008, |
41 | 0x0010, /* 0x0006, CHIP_I2S_CTRL */ | 41 | [SGTL5000_CHIP_DAC_VOL] = 0x3c3c, |
42 | 0x0000, /* 0x0008, reserved */ | 42 | [SGTL5000_CHIP_PAD_STRENGTH] = 0x015f, |
43 | 0x0008, /* 0x000A, CHIP_SSS_CTRL */ | 43 | [SGTL5000_CHIP_ANA_HP_CTRL] = 0x1818, |
44 | 0x0000, /* 0x000C, reserved */ | 44 | [SGTL5000_CHIP_ANA_CTRL] = 0x0111, |
45 | 0x020c, /* 0x000E, CHIP_ADCDAC_CTRL */ | 45 | [SGTL5000_CHIP_LINE_OUT_VOL] = 0x0404, |
46 | 0x3c3c, /* 0x0010, CHIP_DAC_VOL */ | 46 | [SGTL5000_CHIP_ANA_POWER] = 0x7060, |
47 | 0x0000, /* 0x0012, reserved */ | 47 | [SGTL5000_CHIP_PLL_CTRL] = 0x5000, |
48 | 0x015f, /* 0x0014, CHIP_PAD_STRENGTH */ | 48 | [SGTL5000_DAP_BASS_ENHANCE] = 0x0040, |
49 | 0x0000, /* 0x0016, reserved */ | 49 | [SGTL5000_DAP_BASS_ENHANCE_CTRL] = 0x051f, |
50 | 0x0000, /* 0x0018, reserved */ | 50 | [SGTL5000_DAP_SURROUND] = 0x0040, |
51 | 0x0000, /* 0x001A, reserved */ | 51 | [SGTL5000_DAP_EQ_BASS_BAND0] = 0x002f, |
52 | 0x0000, /* 0x001E, reserved */ | 52 | [SGTL5000_DAP_EQ_BASS_BAND1] = 0x002f, |
53 | 0x0000, /* 0x0020, CHIP_ANA_ADC_CTRL */ | 53 | [SGTL5000_DAP_EQ_BASS_BAND2] = 0x002f, |
54 | 0x1818, /* 0x0022, CHIP_ANA_HP_CTRL */ | 54 | [SGTL5000_DAP_EQ_BASS_BAND3] = 0x002f, |
55 | 0x0111, /* 0x0024, CHIP_ANN_CTRL */ | 55 | [SGTL5000_DAP_EQ_BASS_BAND4] = 0x002f, |
56 | 0x0000, /* 0x0026, CHIP_LINREG_CTRL */ | 56 | [SGTL5000_DAP_MAIN_CHAN] = 0x8000, |
57 | 0x0000, /* 0x0028, CHIP_REF_CTRL */ | 57 | [SGTL5000_DAP_AVC_CTRL] = 0x0510, |
58 | 0x0000, /* 0x002A, CHIP_MIC_CTRL */ | 58 | [SGTL5000_DAP_AVC_THRESHOLD] = 0x1473, |
59 | 0x0000, /* 0x002C, CHIP_LINE_OUT_CTRL */ | 59 | [SGTL5000_DAP_AVC_ATTACK] = 0x0028, |
60 | 0x0404, /* 0x002E, CHIP_LINE_OUT_VOL */ | 60 | [SGTL5000_DAP_AVC_DECAY] = 0x0050, |
61 | 0x7060, /* 0x0030, CHIP_ANA_POWER */ | ||
62 | 0x5000, /* 0x0032, CHIP_PLL_CTRL */ | ||
63 | 0x0000, /* 0x0034, CHIP_CLK_TOP_CTRL */ | ||
64 | 0x0000, /* 0x0036, CHIP_ANA_STATUS */ | ||
65 | 0x0000, /* 0x0038, reserved */ | ||
66 | 0x0000, /* 0x003A, CHIP_ANA_TEST2 */ | ||
67 | 0x0000, /* 0x003C, CHIP_SHORT_CTRL */ | ||
68 | 0x0000, /* reserved */ | ||
69 | }; | ||
70 | |||
71 | /* default value of dap registers */ | ||
72 | static const u16 sgtl5000_dap_regs[] = { | ||
73 | 0x0000, /* 0x0100, DAP_CONTROL */ | ||
74 | 0x0000, /* 0x0102, DAP_PEQ */ | ||
75 | 0x0040, /* 0x0104, DAP_BASS_ENHANCE */ | ||
76 | 0x051f, /* 0x0106, DAP_BASS_ENHANCE_CTRL */ | ||
77 | 0x0000, /* 0x0108, DAP_AUDIO_EQ */ | ||
78 | 0x0040, /* 0x010A, DAP_SGTL_SURROUND */ | ||
79 | 0x0000, /* 0x010C, DAP_FILTER_COEF_ACCESS */ | ||
80 | 0x0000, /* 0x010E, DAP_COEF_WR_B0_MSB */ | ||
81 | 0x0000, /* 0x0110, DAP_COEF_WR_B0_LSB */ | ||
82 | 0x0000, /* 0x0112, reserved */ | ||
83 | 0x0000, /* 0x0114, reserved */ | ||
84 | 0x002f, /* 0x0116, DAP_AUDIO_EQ_BASS_BAND0 */ | ||
85 | 0x002f, /* 0x0118, DAP_AUDIO_EQ_BAND0 */ | ||
86 | 0x002f, /* 0x011A, DAP_AUDIO_EQ_BAND2 */ | ||
87 | 0x002f, /* 0x011C, DAP_AUDIO_EQ_BAND3 */ | ||
88 | 0x002f, /* 0x011E, DAP_AUDIO_EQ_TREBLE_BAND4 */ | ||
89 | 0x8000, /* 0x0120, DAP_MAIN_CHAN */ | ||
90 | 0x0000, /* 0x0122, DAP_MIX_CHAN */ | ||
91 | 0x0510, /* 0x0124, DAP_AVC_CTRL */ | ||
92 | 0x1473, /* 0x0126, DAP_AVC_THRESHOLD */ | ||
93 | 0x0028, /* 0x0128, DAP_AVC_ATTACK */ | ||
94 | 0x0050, /* 0x012A, DAP_AVC_DECAY */ | ||
95 | 0x0000, /* 0x012C, DAP_COEF_WR_B1_MSB */ | ||
96 | 0x0000, /* 0x012E, DAP_COEF_WR_B1_LSB */ | ||
97 | 0x0000, /* 0x0130, DAP_COEF_WR_B2_MSB */ | ||
98 | 0x0000, /* 0x0132, DAP_COEF_WR_B2_LSB */ | ||
99 | 0x0000, /* 0x0134, DAP_COEF_WR_A1_MSB */ | ||
100 | 0x0000, /* 0x0136, DAP_COEF_WR_A1_LSB */ | ||
101 | 0x0000, /* 0x0138, DAP_COEF_WR_A2_MSB */ | ||
102 | 0x0000, /* 0x013A, DAP_COEF_WR_A2_LSB */ | ||
103 | }; | 61 | }; |
104 | 62 | ||
105 | /* regulator supplies for sgtl5000, VDDD is an optional external supply */ | 63 | /* regulator supplies for sgtl5000, VDDD is an optional external supply */ |
@@ -1023,12 +981,10 @@ static int sgtl5000_suspend(struct snd_soc_codec *codec, pm_message_t state) | |||
1023 | static int sgtl5000_restore_regs(struct snd_soc_codec *codec) | 981 | static int sgtl5000_restore_regs(struct snd_soc_codec *codec) |
1024 | { | 982 | { |
1025 | u16 *cache = codec->reg_cache; | 983 | u16 *cache = codec->reg_cache; |
1026 | int i; | 984 | u16 reg; |
1027 | int regular_regs = SGTL5000_CHIP_SHORT_CTRL >> 1; | ||
1028 | 985 | ||
1029 | /* restore regular registers */ | 986 | /* restore regular registers */ |
1030 | for (i = 0; i < regular_regs; i++) { | 987 | for (reg = 0; reg <= SGTL5000_CHIP_SHORT_CTRL; reg += 2) { |
1031 | int reg = i << 1; | ||
1032 | 988 | ||
1033 | /* this regs depends on the others */ | 989 | /* this regs depends on the others */ |
1034 | if (reg == SGTL5000_CHIP_ANA_POWER || | 990 | if (reg == SGTL5000_CHIP_ANA_POWER || |
@@ -1038,35 +994,31 @@ static int sgtl5000_restore_regs(struct snd_soc_codec *codec) | |||
1038 | reg == SGTL5000_CHIP_CLK_CTRL) | 994 | reg == SGTL5000_CHIP_CLK_CTRL) |
1039 | continue; | 995 | continue; |
1040 | 996 | ||
1041 | snd_soc_write(codec, reg, cache[i]); | 997 | snd_soc_write(codec, reg, cache[reg]); |
1042 | } | 998 | } |
1043 | 999 | ||
1044 | /* restore dap registers */ | 1000 | /* restore dap registers */ |
1045 | for (i = SGTL5000_DAP_REG_OFFSET >> 1; | 1001 | for (reg = SGTL5000_DAP_REG_OFFSET; reg < SGTL5000_MAX_REG_OFFSET; reg += 2) |
1046 | i < SGTL5000_MAX_REG_OFFSET >> 1; i++) { | 1002 | snd_soc_write(codec, reg, cache[reg]); |
1047 | int reg = i << 1; | ||
1048 | |||
1049 | snd_soc_write(codec, reg, cache[i]); | ||
1050 | } | ||
1051 | 1003 | ||
1052 | /* | 1004 | /* |
1053 | * restore power and other regs according | 1005 | * restore power and other regs according |
1054 | * to set_power() and set_clock() | 1006 | * to set_power() and set_clock() |
1055 | */ | 1007 | */ |
1056 | snd_soc_write(codec, SGTL5000_CHIP_LINREG_CTRL, | 1008 | snd_soc_write(codec, SGTL5000_CHIP_LINREG_CTRL, |
1057 | cache[SGTL5000_CHIP_LINREG_CTRL >> 1]); | 1009 | cache[SGTL5000_CHIP_LINREG_CTRL]); |
1058 | 1010 | ||
1059 | snd_soc_write(codec, SGTL5000_CHIP_ANA_POWER, | 1011 | snd_soc_write(codec, SGTL5000_CHIP_ANA_POWER, |
1060 | cache[SGTL5000_CHIP_ANA_POWER >> 1]); | 1012 | cache[SGTL5000_CHIP_ANA_POWER]); |
1061 | 1013 | ||
1062 | snd_soc_write(codec, SGTL5000_CHIP_CLK_CTRL, | 1014 | snd_soc_write(codec, SGTL5000_CHIP_CLK_CTRL, |
1063 | cache[SGTL5000_CHIP_CLK_CTRL >> 1]); | 1015 | cache[SGTL5000_CHIP_CLK_CTRL]); |
1064 | 1016 | ||
1065 | snd_soc_write(codec, SGTL5000_CHIP_REF_CTRL, | 1017 | snd_soc_write(codec, SGTL5000_CHIP_REF_CTRL, |
1066 | cache[SGTL5000_CHIP_REF_CTRL >> 1]); | 1018 | cache[SGTL5000_CHIP_REF_CTRL]); |
1067 | 1019 | ||
1068 | snd_soc_write(codec, SGTL5000_CHIP_LINE_OUT_CTRL, | 1020 | snd_soc_write(codec, SGTL5000_CHIP_LINE_OUT_CTRL, |
1069 | cache[SGTL5000_CHIP_LINE_OUT_CTRL >> 1]); | 1021 | cache[SGTL5000_CHIP_LINE_OUT_CTRL]); |
1070 | return 0; | 1022 | return 0; |
1071 | } | 1023 | } |
1072 | 1024 | ||
@@ -1454,16 +1406,6 @@ static __devinit int sgtl5000_i2c_probe(struct i2c_client *client, | |||
1454 | if (!sgtl5000) | 1406 | if (!sgtl5000) |
1455 | return -ENOMEM; | 1407 | return -ENOMEM; |
1456 | 1408 | ||
1457 | /* | ||
1458 | * copy DAP default values to default value array. | ||
1459 | * sgtl5000 register space has a big hole, merge it | ||
1460 | * at init phase makes life easy. | ||
1461 | * FIXME: should we drop 'const' of sgtl5000_regs? | ||
1462 | */ | ||
1463 | memcpy((void *)(&sgtl5000_regs[0] + (SGTL5000_DAP_REG_OFFSET >> 1)), | ||
1464 | sgtl5000_dap_regs, | ||
1465 | SGTL5000_MAX_REG_OFFSET - SGTL5000_DAP_REG_OFFSET); | ||
1466 | |||
1467 | i2c_set_clientdata(client, sgtl5000); | 1409 | i2c_set_clientdata(client, sgtl5000); |
1468 | 1410 | ||
1469 | ret = snd_soc_register_codec(&client->dev, | 1411 | ret = snd_soc_register_codec(&client->dev, |
diff --git a/sound/soc/codecs/wm8915.c b/sound/soc/codecs/wm8915.c deleted file mode 100644 index 423baa9be241..000000000000 --- a/sound/soc/codecs/wm8915.c +++ /dev/null | |||
@@ -1,2995 +0,0 @@ | |||
1 | /* | ||
2 | * wm8915.c - WM8915 audio codec interface | ||
3 | * | ||
4 | * Copyright 2011 Wolfson Microelectronics PLC. | ||
5 | * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | */ | ||
12 | |||
13 | #include <linux/module.h> | ||
14 | #include <linux/moduleparam.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/completion.h> | ||
17 | #include <linux/delay.h> | ||
18 | #include <linux/pm.h> | ||
19 | #include <linux/gcd.h> | ||
20 | #include <linux/gpio.h> | ||
21 | #include <linux/i2c.h> | ||
22 | #include <linux/regulator/consumer.h> | ||
23 | #include <linux/slab.h> | ||
24 | #include <linux/workqueue.h> | ||
25 | #include <sound/core.h> | ||
26 | #include <sound/jack.h> | ||
27 | #include <sound/pcm.h> | ||
28 | #include <sound/pcm_params.h> | ||
29 | #include <sound/soc.h> | ||
30 | #include <sound/initval.h> | ||
31 | #include <sound/tlv.h> | ||
32 | #include <trace/events/asoc.h> | ||
33 | |||
34 | #include <sound/wm8915.h> | ||
35 | #include "wm8915.h" | ||
36 | |||
37 | #define WM8915_AIFS 2 | ||
38 | |||
39 | #define HPOUT1L 1 | ||
40 | #define HPOUT1R 2 | ||
41 | #define HPOUT2L 4 | ||
42 | #define HPOUT2R 8 | ||
43 | |||
44 | #define WM8915_NUM_SUPPLIES 4 | ||
45 | static const char *wm8915_supply_names[WM8915_NUM_SUPPLIES] = { | ||
46 | "DBVDD", | ||
47 | "AVDD1", | ||
48 | "AVDD2", | ||
49 | "CPVDD", | ||
50 | }; | ||
51 | |||
52 | struct wm8915_priv { | ||
53 | struct snd_soc_codec *codec; | ||
54 | |||
55 | int ldo1ena; | ||
56 | |||
57 | int sysclk; | ||
58 | int sysclk_src; | ||
59 | |||
60 | int fll_src; | ||
61 | int fll_fref; | ||
62 | int fll_fout; | ||
63 | |||
64 | struct completion fll_lock; | ||
65 | |||
66 | u16 dcs_pending; | ||
67 | struct completion dcs_done; | ||
68 | |||
69 | u16 hpout_ena; | ||
70 | u16 hpout_pending; | ||
71 | |||
72 | struct regulator_bulk_data supplies[WM8915_NUM_SUPPLIES]; | ||
73 | struct notifier_block disable_nb[WM8915_NUM_SUPPLIES]; | ||
74 | |||
75 | struct wm8915_pdata pdata; | ||
76 | |||
77 | int rx_rate[WM8915_AIFS]; | ||
78 | int bclk_rate[WM8915_AIFS]; | ||
79 | |||
80 | /* Platform dependant ReTune mobile configuration */ | ||
81 | int num_retune_mobile_texts; | ||
82 | const char **retune_mobile_texts; | ||
83 | int retune_mobile_cfg[2]; | ||
84 | struct soc_enum retune_mobile_enum; | ||
85 | |||
86 | struct snd_soc_jack *jack; | ||
87 | bool detecting; | ||
88 | bool jack_mic; | ||
89 | wm8915_polarity_fn polarity_cb; | ||
90 | |||
91 | #ifdef CONFIG_GPIOLIB | ||
92 | struct gpio_chip gpio_chip; | ||
93 | #endif | ||
94 | }; | ||
95 | |||
96 | /* We can't use the same notifier block for more than one supply and | ||
97 | * there's no way I can see to get from a callback to the caller | ||
98 | * except container_of(). | ||
99 | */ | ||
100 | #define WM8915_REGULATOR_EVENT(n) \ | ||
101 | static int wm8915_regulator_event_##n(struct notifier_block *nb, \ | ||
102 | unsigned long event, void *data) \ | ||
103 | { \ | ||
104 | struct wm8915_priv *wm8915 = container_of(nb, struct wm8915_priv, \ | ||
105 | disable_nb[n]); \ | ||
106 | if (event & REGULATOR_EVENT_DISABLE) { \ | ||
107 | wm8915->codec->cache_sync = 1; \ | ||
108 | } \ | ||
109 | return 0; \ | ||
110 | } | ||
111 | |||
112 | WM8915_REGULATOR_EVENT(0) | ||
113 | WM8915_REGULATOR_EVENT(1) | ||
114 | WM8915_REGULATOR_EVENT(2) | ||
115 | WM8915_REGULATOR_EVENT(3) | ||
116 | |||
117 | static const u16 wm8915_reg[WM8915_MAX_REGISTER] = { | ||
118 | [WM8915_SOFTWARE_RESET] = 0x8915, | ||
119 | [WM8915_POWER_MANAGEMENT_7] = 0x10, | ||
120 | [WM8915_DAC1_HPOUT1_VOLUME] = 0x88, | ||
121 | [WM8915_DAC2_HPOUT2_VOLUME] = 0x88, | ||
122 | [WM8915_DAC1_LEFT_VOLUME] = 0x2c0, | ||
123 | [WM8915_DAC1_RIGHT_VOLUME] = 0x2c0, | ||
124 | [WM8915_DAC2_LEFT_VOLUME] = 0x2c0, | ||
125 | [WM8915_DAC2_RIGHT_VOLUME] = 0x2c0, | ||
126 | [WM8915_OUTPUT1_LEFT_VOLUME] = 0x80, | ||
127 | [WM8915_OUTPUT1_RIGHT_VOLUME] = 0x80, | ||
128 | [WM8915_OUTPUT2_LEFT_VOLUME] = 0x80, | ||
129 | [WM8915_OUTPUT2_RIGHT_VOLUME] = 0x80, | ||
130 | [WM8915_MICBIAS_1] = 0x39, | ||
131 | [WM8915_MICBIAS_2] = 0x39, | ||
132 | [WM8915_LDO_1] = 0x3, | ||
133 | [WM8915_LDO_2] = 0x13, | ||
134 | [WM8915_ACCESSORY_DETECT_MODE_1] = 0x4, | ||
135 | [WM8915_HEADPHONE_DETECT_1] = 0x20, | ||
136 | [WM8915_MIC_DETECT_1] = 0x7600, | ||
137 | [WM8915_MIC_DETECT_2] = 0xbf, | ||
138 | [WM8915_CHARGE_PUMP_1] = 0x1f25, | ||
139 | [WM8915_CHARGE_PUMP_2] = 0xab19, | ||
140 | [WM8915_DC_SERVO_5] = 0x2a2a, | ||
141 | [WM8915_CONTROL_INTERFACE_1] = 0x8004, | ||
142 | [WM8915_CLOCKING_1] = 0x10, | ||
143 | [WM8915_AIF_RATE] = 0x83, | ||
144 | [WM8915_FLL_CONTROL_4] = 0x5dc0, | ||
145 | [WM8915_FLL_CONTROL_5] = 0xc84, | ||
146 | [WM8915_FLL_EFS_2] = 0x2, | ||
147 | [WM8915_AIF1_TX_LRCLK_1] = 0x80, | ||
148 | [WM8915_AIF1_TX_LRCLK_2] = 0x8, | ||
149 | [WM8915_AIF1_RX_LRCLK_1] = 0x80, | ||
150 | [WM8915_AIF1TX_DATA_CONFIGURATION_1] = 0x1818, | ||
151 | [WM8915_AIF1RX_DATA_CONFIGURATION] = 0x1818, | ||
152 | [WM8915_AIF1TX_TEST] = 0x7, | ||
153 | [WM8915_AIF2_TX_LRCLK_1] = 0x80, | ||
154 | [WM8915_AIF2_TX_LRCLK_2] = 0x8, | ||
155 | [WM8915_AIF2_RX_LRCLK_1] = 0x80, | ||
156 | [WM8915_AIF2TX_DATA_CONFIGURATION_1] = 0x1818, | ||
157 | [WM8915_AIF2RX_DATA_CONFIGURATION] = 0x1818, | ||
158 | [WM8915_AIF2TX_TEST] = 0x1, | ||
159 | [WM8915_DSP1_TX_LEFT_VOLUME] = 0xc0, | ||
160 | [WM8915_DSP1_TX_RIGHT_VOLUME] = 0xc0, | ||
161 | [WM8915_DSP1_RX_LEFT_VOLUME] = 0xc0, | ||
162 | [WM8915_DSP1_RX_RIGHT_VOLUME] = 0xc0, | ||
163 | [WM8915_DSP1_TX_FILTERS] = 0x2000, | ||
164 | [WM8915_DSP1_RX_FILTERS_1] = 0x200, | ||
165 | [WM8915_DSP1_RX_FILTERS_2] = 0x10, | ||
166 | [WM8915_DSP1_DRC_1] = 0x98, | ||
167 | [WM8915_DSP1_DRC_2] = 0x845, | ||
168 | [WM8915_DSP1_RX_EQ_GAINS_1] = 0x6318, | ||
169 | [WM8915_DSP1_RX_EQ_GAINS_2] = 0x6300, | ||
170 | [WM8915_DSP1_RX_EQ_BAND_1_A] = 0xfca, | ||
171 | [WM8915_DSP1_RX_EQ_BAND_1_B] = 0x400, | ||
172 | [WM8915_DSP1_RX_EQ_BAND_1_PG] = 0xd8, | ||
173 | [WM8915_DSP1_RX_EQ_BAND_2_A] = 0x1eb5, | ||
174 | [WM8915_DSP1_RX_EQ_BAND_2_B] = 0xf145, | ||
175 | [WM8915_DSP1_RX_EQ_BAND_2_C] = 0xb75, | ||
176 | [WM8915_DSP1_RX_EQ_BAND_2_PG] = 0x1c5, | ||
177 | [WM8915_DSP1_RX_EQ_BAND_3_A] = 0x1c58, | ||
178 | [WM8915_DSP1_RX_EQ_BAND_3_B] = 0xf373, | ||
179 | [WM8915_DSP1_RX_EQ_BAND_3_C] = 0xa54, | ||
180 | [WM8915_DSP1_RX_EQ_BAND_3_PG] = 0x558, | ||
181 | [WM8915_DSP1_RX_EQ_BAND_4_A] = 0x168e, | ||
182 | [WM8915_DSP1_RX_EQ_BAND_4_B] = 0xf829, | ||
183 | [WM8915_DSP1_RX_EQ_BAND_4_C] = 0x7ad, | ||
184 | [WM8915_DSP1_RX_EQ_BAND_4_PG] = 0x1103, | ||
185 | [WM8915_DSP1_RX_EQ_BAND_5_A] = 0x564, | ||
186 | [WM8915_DSP1_RX_EQ_BAND_5_B] = 0x559, | ||
187 | [WM8915_DSP1_RX_EQ_BAND_5_PG] = 0x4000, | ||
188 | [WM8915_DSP2_TX_LEFT_VOLUME] = 0xc0, | ||
189 | [WM8915_DSP2_TX_RIGHT_VOLUME] = 0xc0, | ||
190 | [WM8915_DSP2_RX_LEFT_VOLUME] = 0xc0, | ||
191 | [WM8915_DSP2_RX_RIGHT_VOLUME] = 0xc0, | ||
192 | [WM8915_DSP2_TX_FILTERS] = 0x2000, | ||
193 | [WM8915_DSP2_RX_FILTERS_1] = 0x200, | ||
194 | [WM8915_DSP2_RX_FILTERS_2] = 0x10, | ||
195 | [WM8915_DSP2_DRC_1] = 0x98, | ||
196 | [WM8915_DSP2_DRC_2] = 0x845, | ||
197 | [WM8915_DSP2_RX_EQ_GAINS_1] = 0x6318, | ||
198 | [WM8915_DSP2_RX_EQ_GAINS_2] = 0x6300, | ||
199 | [WM8915_DSP2_RX_EQ_BAND_1_A] = 0xfca, | ||
200 | [WM8915_DSP2_RX_EQ_BAND_1_B] = 0x400, | ||
201 | [WM8915_DSP2_RX_EQ_BAND_1_PG] = 0xd8, | ||
202 | [WM8915_DSP2_RX_EQ_BAND_2_A] = 0x1eb5, | ||
203 | [WM8915_DSP2_RX_EQ_BAND_2_B] = 0xf145, | ||
204 | [WM8915_DSP2_RX_EQ_BAND_2_C] = 0xb75, | ||
205 | [WM8915_DSP2_RX_EQ_BAND_2_PG] = 0x1c5, | ||
206 | [WM8915_DSP2_RX_EQ_BAND_3_A] = 0x1c58, | ||
207 | [WM8915_DSP2_RX_EQ_BAND_3_B] = 0xf373, | ||
208 | [WM8915_DSP2_RX_EQ_BAND_3_C] = 0xa54, | ||
209 | [WM8915_DSP2_RX_EQ_BAND_3_PG] = 0x558, | ||
210 | [WM8915_DSP2_RX_EQ_BAND_4_A] = 0x168e, | ||
211 | [WM8915_DSP2_RX_EQ_BAND_4_B] = 0xf829, | ||
212 | [WM8915_DSP2_RX_EQ_BAND_4_C] = 0x7ad, | ||
213 | [WM8915_DSP2_RX_EQ_BAND_4_PG] = 0x1103, | ||
214 | [WM8915_DSP2_RX_EQ_BAND_5_A] = 0x564, | ||
215 | [WM8915_DSP2_RX_EQ_BAND_5_B] = 0x559, | ||
216 | [WM8915_DSP2_RX_EQ_BAND_5_PG] = 0x4000, | ||
217 | [WM8915_OVERSAMPLING] = 0xd, | ||
218 | [WM8915_SIDETONE] = 0x1040, | ||
219 | [WM8915_GPIO_1] = 0xa101, | ||
220 | [WM8915_GPIO_2] = 0xa101, | ||
221 | [WM8915_GPIO_3] = 0xa101, | ||
222 | [WM8915_GPIO_4] = 0xa101, | ||
223 | [WM8915_GPIO_5] = 0xa101, | ||
224 | [WM8915_PULL_CONTROL_2] = 0x140, | ||
225 | [WM8915_INTERRUPT_STATUS_1_MASK] = 0x1f, | ||
226 | [WM8915_INTERRUPT_STATUS_2_MASK] = 0x1ecf, | ||
227 | [WM8915_RIGHT_PDM_SPEAKER] = 0x1, | ||
228 | [WM8915_PDM_SPEAKER_MUTE_SEQUENCE] = 0x69, | ||
229 | [WM8915_PDM_SPEAKER_VOLUME] = 0x66, | ||
230 | [WM8915_WRITE_SEQUENCER_0] = 0x1, | ||
231 | [WM8915_WRITE_SEQUENCER_1] = 0x1, | ||
232 | [WM8915_WRITE_SEQUENCER_3] = 0x6, | ||
233 | [WM8915_WRITE_SEQUENCER_4] = 0x40, | ||
234 | [WM8915_WRITE_SEQUENCER_5] = 0x1, | ||
235 | [WM8915_WRITE_SEQUENCER_6] = 0xf, | ||
236 | [WM8915_WRITE_SEQUENCER_7] = 0x6, | ||
237 | [WM8915_WRITE_SEQUENCER_8] = 0x1, | ||
238 | [WM8915_WRITE_SEQUENCER_9] = 0x3, | ||
239 | [WM8915_WRITE_SEQUENCER_10] = 0x104, | ||
240 | [WM8915_WRITE_SEQUENCER_12] = 0x60, | ||
241 | [WM8915_WRITE_SEQUENCER_13] = 0x11, | ||
242 | [WM8915_WRITE_SEQUENCER_14] = 0x401, | ||
243 | [WM8915_WRITE_SEQUENCER_16] = 0x50, | ||
244 | [WM8915_WRITE_SEQUENCER_17] = 0x3, | ||
245 | [WM8915_WRITE_SEQUENCER_18] = 0x100, | ||
246 | [WM8915_WRITE_SEQUENCER_20] = 0x51, | ||
247 | [WM8915_WRITE_SEQUENCER_21] = 0x3, | ||
248 | [WM8915_WRITE_SEQUENCER_22] = 0x104, | ||
249 | [WM8915_WRITE_SEQUENCER_23] = 0xa, | ||
250 | [WM8915_WRITE_SEQUENCER_24] = 0x60, | ||
251 | [WM8915_WRITE_SEQUENCER_25] = 0x3b, | ||
252 | [WM8915_WRITE_SEQUENCER_26] = 0x502, | ||
253 | [WM8915_WRITE_SEQUENCER_27] = 0x100, | ||
254 | [WM8915_WRITE_SEQUENCER_28] = 0x2fff, | ||
255 | [WM8915_WRITE_SEQUENCER_32] = 0x2fff, | ||
256 | [WM8915_WRITE_SEQUENCER_36] = 0x2fff, | ||
257 | [WM8915_WRITE_SEQUENCER_40] = 0x2fff, | ||
258 | [WM8915_WRITE_SEQUENCER_44] = 0x2fff, | ||
259 | [WM8915_WRITE_SEQUENCER_48] = 0x2fff, | ||
260 | [WM8915_WRITE_SEQUENCER_52] = 0x2fff, | ||
261 | [WM8915_WRITE_SEQUENCER_56] = 0x2fff, | ||
262 | [WM8915_WRITE_SEQUENCER_60] = 0x2fff, | ||
263 | [WM8915_WRITE_SEQUENCER_64] = 0x1, | ||
264 | [WM8915_WRITE_SEQUENCER_65] = 0x1, | ||
265 | [WM8915_WRITE_SEQUENCER_67] = 0x6, | ||
266 | [WM8915_WRITE_SEQUENCER_68] = 0x40, | ||
267 | [WM8915_WRITE_SEQUENCER_69] = 0x1, | ||
268 | [WM8915_WRITE_SEQUENCER_70] = 0xf, | ||
269 | [WM8915_WRITE_SEQUENCER_71] = 0x6, | ||
270 | [WM8915_WRITE_SEQUENCER_72] = 0x1, | ||
271 | [WM8915_WRITE_SEQUENCER_73] = 0x3, | ||
272 | [WM8915_WRITE_SEQUENCER_74] = 0x104, | ||
273 | [WM8915_WRITE_SEQUENCER_76] = 0x60, | ||
274 | [WM8915_WRITE_SEQUENCER_77] = 0x11, | ||
275 | [WM8915_WRITE_SEQUENCER_78] = 0x401, | ||
276 | [WM8915_WRITE_SEQUENCER_80] = 0x50, | ||
277 | [WM8915_WRITE_SEQUENCER_81] = 0x3, | ||
278 | [WM8915_WRITE_SEQUENCER_82] = 0x100, | ||
279 | [WM8915_WRITE_SEQUENCER_84] = 0x60, | ||
280 | [WM8915_WRITE_SEQUENCER_85] = 0x3b, | ||
281 | [WM8915_WRITE_SEQUENCER_86] = 0x502, | ||
282 | [WM8915_WRITE_SEQUENCER_87] = 0x100, | ||
283 | [WM8915_WRITE_SEQUENCER_88] = 0x2fff, | ||
284 | [WM8915_WRITE_SEQUENCER_92] = 0x2fff, | ||
285 | [WM8915_WRITE_SEQUENCER_96] = 0x2fff, | ||
286 | [WM8915_WRITE_SEQUENCER_100] = 0x2fff, | ||
287 | [WM8915_WRITE_SEQUENCER_104] = 0x2fff, | ||
288 | [WM8915_WRITE_SEQUENCER_108] = 0x2fff, | ||
289 | [WM8915_WRITE_SEQUENCER_112] = 0x2fff, | ||
290 | [WM8915_WRITE_SEQUENCER_116] = 0x2fff, | ||
291 | [WM8915_WRITE_SEQUENCER_120] = 0x2fff, | ||
292 | [WM8915_WRITE_SEQUENCER_124] = 0x2fff, | ||
293 | [WM8915_WRITE_SEQUENCER_128] = 0x1, | ||
294 | [WM8915_WRITE_SEQUENCER_129] = 0x1, | ||
295 | [WM8915_WRITE_SEQUENCER_131] = 0x6, | ||
296 | [WM8915_WRITE_SEQUENCER_132] = 0x40, | ||
297 | [WM8915_WRITE_SEQUENCER_133] = 0x1, | ||
298 | [WM8915_WRITE_SEQUENCER_134] = 0xf, | ||
299 | [WM8915_WRITE_SEQUENCER_135] = 0x6, | ||
300 | [WM8915_WRITE_SEQUENCER_136] = 0x1, | ||
301 | [WM8915_WRITE_SEQUENCER_137] = 0x3, | ||
302 | [WM8915_WRITE_SEQUENCER_138] = 0x106, | ||
303 | [WM8915_WRITE_SEQUENCER_140] = 0x61, | ||
304 | [WM8915_WRITE_SEQUENCER_141] = 0x11, | ||
305 | [WM8915_WRITE_SEQUENCER_142] = 0x401, | ||
306 | [WM8915_WRITE_SEQUENCER_144] = 0x50, | ||
307 | [WM8915_WRITE_SEQUENCER_145] = 0x3, | ||
308 | [WM8915_WRITE_SEQUENCER_146] = 0x102, | ||
309 | [WM8915_WRITE_SEQUENCER_148] = 0x51, | ||
310 | [WM8915_WRITE_SEQUENCER_149] = 0x3, | ||
311 | [WM8915_WRITE_SEQUENCER_150] = 0x106, | ||
312 | [WM8915_WRITE_SEQUENCER_151] = 0xa, | ||
313 | [WM8915_WRITE_SEQUENCER_152] = 0x61, | ||
314 | [WM8915_WRITE_SEQUENCER_153] = 0x3b, | ||
315 | [WM8915_WRITE_SEQUENCER_154] = 0x502, | ||
316 | [WM8915_WRITE_SEQUENCER_155] = 0x100, | ||
317 | [WM8915_WRITE_SEQUENCER_156] = 0x2fff, | ||
318 | [WM8915_WRITE_SEQUENCER_160] = 0x2fff, | ||
319 | [WM8915_WRITE_SEQUENCER_164] = 0x2fff, | ||
320 | [WM8915_WRITE_SEQUENCER_168] = 0x2fff, | ||
321 | [WM8915_WRITE_SEQUENCER_172] = 0x2fff, | ||
322 | [WM8915_WRITE_SEQUENCER_176] = 0x2fff, | ||
323 | [WM8915_WRITE_SEQUENCER_180] = 0x2fff, | ||
324 | [WM8915_WRITE_SEQUENCER_184] = 0x2fff, | ||
325 | [WM8915_WRITE_SEQUENCER_188] = 0x2fff, | ||
326 | [WM8915_WRITE_SEQUENCER_192] = 0x1, | ||
327 | [WM8915_WRITE_SEQUENCER_193] = 0x1, | ||
328 | [WM8915_WRITE_SEQUENCER_195] = 0x6, | ||
329 | [WM8915_WRITE_SEQUENCER_196] = 0x40, | ||
330 | [WM8915_WRITE_SEQUENCER_197] = 0x1, | ||
331 | [WM8915_WRITE_SEQUENCER_198] = 0xf, | ||
332 | [WM8915_WRITE_SEQUENCER_199] = 0x6, | ||
333 | [WM8915_WRITE_SEQUENCER_200] = 0x1, | ||
334 | [WM8915_WRITE_SEQUENCER_201] = 0x3, | ||
335 | [WM8915_WRITE_SEQUENCER_202] = 0x106, | ||
336 | [WM8915_WRITE_SEQUENCER_204] = 0x61, | ||
337 | [WM8915_WRITE_SEQUENCER_205] = 0x11, | ||
338 | [WM8915_WRITE_SEQUENCER_206] = 0x401, | ||
339 | [WM8915_WRITE_SEQUENCER_208] = 0x50, | ||
340 | [WM8915_WRITE_SEQUENCER_209] = 0x3, | ||
341 | [WM8915_WRITE_SEQUENCER_210] = 0x102, | ||
342 | [WM8915_WRITE_SEQUENCER_212] = 0x61, | ||
343 | [WM8915_WRITE_SEQUENCER_213] = 0x3b, | ||
344 | [WM8915_WRITE_SEQUENCER_214] = 0x502, | ||
345 | [WM8915_WRITE_SEQUENCER_215] = 0x100, | ||
346 | [WM8915_WRITE_SEQUENCER_216] = 0x2fff, | ||
347 | [WM8915_WRITE_SEQUENCER_220] = 0x2fff, | ||
348 | [WM8915_WRITE_SEQUENCER_224] = 0x2fff, | ||
349 | [WM8915_WRITE_SEQUENCER_228] = 0x2fff, | ||
350 | [WM8915_WRITE_SEQUENCER_232] = 0x2fff, | ||
351 | [WM8915_WRITE_SEQUENCER_236] = 0x2fff, | ||
352 | [WM8915_WRITE_SEQUENCER_240] = 0x2fff, | ||
353 | [WM8915_WRITE_SEQUENCER_244] = 0x2fff, | ||
354 | [WM8915_WRITE_SEQUENCER_248] = 0x2fff, | ||
355 | [WM8915_WRITE_SEQUENCER_252] = 0x2fff, | ||
356 | [WM8915_WRITE_SEQUENCER_256] = 0x60, | ||
357 | [WM8915_WRITE_SEQUENCER_258] = 0x601, | ||
358 | [WM8915_WRITE_SEQUENCER_260] = 0x50, | ||
359 | [WM8915_WRITE_SEQUENCER_262] = 0x100, | ||
360 | [WM8915_WRITE_SEQUENCER_264] = 0x1, | ||
361 | [WM8915_WRITE_SEQUENCER_266] = 0x104, | ||
362 | [WM8915_WRITE_SEQUENCER_267] = 0x100, | ||
363 | [WM8915_WRITE_SEQUENCER_268] = 0x2fff, | ||
364 | [WM8915_WRITE_SEQUENCER_272] = 0x2fff, | ||
365 | [WM8915_WRITE_SEQUENCER_276] = 0x2fff, | ||
366 | [WM8915_WRITE_SEQUENCER_280] = 0x2fff, | ||
367 | [WM8915_WRITE_SEQUENCER_284] = 0x2fff, | ||
368 | [WM8915_WRITE_SEQUENCER_288] = 0x2fff, | ||
369 | [WM8915_WRITE_SEQUENCER_292] = 0x2fff, | ||
370 | [WM8915_WRITE_SEQUENCER_296] = 0x2fff, | ||
371 | [WM8915_WRITE_SEQUENCER_300] = 0x2fff, | ||
372 | [WM8915_WRITE_SEQUENCER_304] = 0x2fff, | ||
373 | [WM8915_WRITE_SEQUENCER_308] = 0x2fff, | ||
374 | [WM8915_WRITE_SEQUENCER_312] = 0x2fff, | ||
375 | [WM8915_WRITE_SEQUENCER_316] = 0x2fff, | ||
376 | [WM8915_WRITE_SEQUENCER_320] = 0x61, | ||
377 | [WM8915_WRITE_SEQUENCER_322] = 0x601, | ||
378 | [WM8915_WRITE_SEQUENCER_324] = 0x50, | ||
379 | [WM8915_WRITE_SEQUENCER_326] = 0x102, | ||
380 | [WM8915_WRITE_SEQUENCER_328] = 0x1, | ||
381 | [WM8915_WRITE_SEQUENCER_330] = 0x106, | ||
382 | [WM8915_WRITE_SEQUENCER_331] = 0x100, | ||
383 | [WM8915_WRITE_SEQUENCER_332] = 0x2fff, | ||
384 | [WM8915_WRITE_SEQUENCER_336] = 0x2fff, | ||
385 | [WM8915_WRITE_SEQUENCER_340] = 0x2fff, | ||
386 | [WM8915_WRITE_SEQUENCER_344] = 0x2fff, | ||
387 | [WM8915_WRITE_SEQUENCER_348] = 0x2fff, | ||
388 | [WM8915_WRITE_SEQUENCER_352] = 0x2fff, | ||
389 | [WM8915_WRITE_SEQUENCER_356] = 0x2fff, | ||
390 | [WM8915_WRITE_SEQUENCER_360] = 0x2fff, | ||
391 | [WM8915_WRITE_SEQUENCER_364] = 0x2fff, | ||
392 | [WM8915_WRITE_SEQUENCER_368] = 0x2fff, | ||
393 | [WM8915_WRITE_SEQUENCER_372] = 0x2fff, | ||
394 | [WM8915_WRITE_SEQUENCER_376] = 0x2fff, | ||
395 | [WM8915_WRITE_SEQUENCER_380] = 0x2fff, | ||
396 | [WM8915_WRITE_SEQUENCER_384] = 0x60, | ||
397 | [WM8915_WRITE_SEQUENCER_386] = 0x601, | ||
398 | [WM8915_WRITE_SEQUENCER_388] = 0x61, | ||
399 | [WM8915_WRITE_SEQUENCER_390] = 0x601, | ||
400 | [WM8915_WRITE_SEQUENCER_392] = 0x50, | ||
401 | [WM8915_WRITE_SEQUENCER_394] = 0x300, | ||
402 | [WM8915_WRITE_SEQUENCER_396] = 0x1, | ||
403 | [WM8915_WRITE_SEQUENCER_398] = 0x304, | ||
404 | [WM8915_WRITE_SEQUENCER_400] = 0x40, | ||
405 | [WM8915_WRITE_SEQUENCER_402] = 0xf, | ||
406 | [WM8915_WRITE_SEQUENCER_404] = 0x1, | ||
407 | [WM8915_WRITE_SEQUENCER_407] = 0x100, | ||
408 | }; | ||
409 | |||
410 | static const DECLARE_TLV_DB_SCALE(inpga_tlv, 0, 100, 0); | ||
411 | static const DECLARE_TLV_DB_SCALE(sidetone_tlv, -3600, 150, 0); | ||
412 | static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); | ||
413 | static const DECLARE_TLV_DB_SCALE(out_digital_tlv, -1200, 150, 0); | ||
414 | static const DECLARE_TLV_DB_SCALE(out_tlv, -900, 75, 0); | ||
415 | static const DECLARE_TLV_DB_SCALE(spk_tlv, -900, 150, 0); | ||
416 | static const DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0); | ||
417 | |||
418 | static const char *sidetone_hpf_text[] = { | ||
419 | "2.9kHz", "1.5kHz", "735Hz", "403Hz", "196Hz", "98Hz", "49Hz" | ||
420 | }; | ||
421 | |||
422 | static const struct soc_enum sidetone_hpf = | ||
423 | SOC_ENUM_SINGLE(WM8915_SIDETONE, 7, 6, sidetone_hpf_text); | ||
424 | |||
425 | static const char *hpf_mode_text[] = { | ||
426 | "HiFi", "Custom", "Voice" | ||
427 | }; | ||
428 | |||
429 | static const struct soc_enum dsp1tx_hpf_mode = | ||
430 | SOC_ENUM_SINGLE(WM8915_DSP1_TX_FILTERS, 3, 3, hpf_mode_text); | ||
431 | |||
432 | static const struct soc_enum dsp2tx_hpf_mode = | ||
433 | SOC_ENUM_SINGLE(WM8915_DSP2_TX_FILTERS, 3, 3, hpf_mode_text); | ||
434 | |||
435 | static const char *hpf_cutoff_text[] = { | ||
436 | "50Hz", "75Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz" | ||
437 | }; | ||
438 | |||
439 | static const struct soc_enum dsp1tx_hpf_cutoff = | ||
440 | SOC_ENUM_SINGLE(WM8915_DSP1_TX_FILTERS, 0, 7, hpf_cutoff_text); | ||
441 | |||
442 | static const struct soc_enum dsp2tx_hpf_cutoff = | ||
443 | SOC_ENUM_SINGLE(WM8915_DSP2_TX_FILTERS, 0, 7, hpf_cutoff_text); | ||
444 | |||
445 | static void wm8915_set_retune_mobile(struct snd_soc_codec *codec, int block) | ||
446 | { | ||
447 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
448 | struct wm8915_pdata *pdata = &wm8915->pdata; | ||
449 | int base, best, best_val, save, i, cfg, iface; | ||
450 | |||
451 | if (!wm8915->num_retune_mobile_texts) | ||
452 | return; | ||
453 | |||
454 | switch (block) { | ||
455 | case 0: | ||
456 | base = WM8915_DSP1_RX_EQ_GAINS_1; | ||
457 | if (snd_soc_read(codec, WM8915_POWER_MANAGEMENT_8) & | ||
458 | WM8915_DSP1RX_SRC) | ||
459 | iface = 1; | ||
460 | else | ||
461 | iface = 0; | ||
462 | break; | ||
463 | case 1: | ||
464 | base = WM8915_DSP1_RX_EQ_GAINS_2; | ||
465 | if (snd_soc_read(codec, WM8915_POWER_MANAGEMENT_8) & | ||
466 | WM8915_DSP2RX_SRC) | ||
467 | iface = 1; | ||
468 | else | ||
469 | iface = 0; | ||
470 | break; | ||
471 | default: | ||
472 | return; | ||
473 | } | ||
474 | |||
475 | /* Find the version of the currently selected configuration | ||
476 | * with the nearest sample rate. */ | ||
477 | cfg = wm8915->retune_mobile_cfg[block]; | ||
478 | best = 0; | ||
479 | best_val = INT_MAX; | ||
480 | for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { | ||
481 | if (strcmp(pdata->retune_mobile_cfgs[i].name, | ||
482 | wm8915->retune_mobile_texts[cfg]) == 0 && | ||
483 | abs(pdata->retune_mobile_cfgs[i].rate | ||
484 | - wm8915->rx_rate[iface]) < best_val) { | ||
485 | best = i; | ||
486 | best_val = abs(pdata->retune_mobile_cfgs[i].rate | ||
487 | - wm8915->rx_rate[iface]); | ||
488 | } | ||
489 | } | ||
490 | |||
491 | dev_dbg(codec->dev, "ReTune Mobile %d %s/%dHz for %dHz sample rate\n", | ||
492 | block, | ||
493 | pdata->retune_mobile_cfgs[best].name, | ||
494 | pdata->retune_mobile_cfgs[best].rate, | ||
495 | wm8915->rx_rate[iface]); | ||
496 | |||
497 | /* The EQ will be disabled while reconfiguring it, remember the | ||
498 | * current configuration. | ||
499 | */ | ||
500 | save = snd_soc_read(codec, base); | ||
501 | save &= WM8915_DSP1RX_EQ_ENA; | ||
502 | |||
503 | for (i = 0; i < ARRAY_SIZE(pdata->retune_mobile_cfgs[best].regs); i++) | ||
504 | snd_soc_update_bits(codec, base + i, 0xffff, | ||
505 | pdata->retune_mobile_cfgs[best].regs[i]); | ||
506 | |||
507 | snd_soc_update_bits(codec, base, WM8915_DSP1RX_EQ_ENA, save); | ||
508 | } | ||
509 | |||
510 | /* Icky as hell but saves code duplication */ | ||
511 | static int wm8915_get_retune_mobile_block(const char *name) | ||
512 | { | ||
513 | if (strcmp(name, "DSP1 EQ Mode") == 0) | ||
514 | return 0; | ||
515 | if (strcmp(name, "DSP2 EQ Mode") == 0) | ||
516 | return 1; | ||
517 | return -EINVAL; | ||
518 | } | ||
519 | |||
520 | static int wm8915_put_retune_mobile_enum(struct snd_kcontrol *kcontrol, | ||
521 | struct snd_ctl_elem_value *ucontrol) | ||
522 | { | ||
523 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
524 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
525 | struct wm8915_pdata *pdata = &wm8915->pdata; | ||
526 | int block = wm8915_get_retune_mobile_block(kcontrol->id.name); | ||
527 | int value = ucontrol->value.integer.value[0]; | ||
528 | |||
529 | if (block < 0) | ||
530 | return block; | ||
531 | |||
532 | if (value >= pdata->num_retune_mobile_cfgs) | ||
533 | return -EINVAL; | ||
534 | |||
535 | wm8915->retune_mobile_cfg[block] = value; | ||
536 | |||
537 | wm8915_set_retune_mobile(codec, block); | ||
538 | |||
539 | return 0; | ||
540 | } | ||
541 | |||
542 | static int wm8915_get_retune_mobile_enum(struct snd_kcontrol *kcontrol, | ||
543 | struct snd_ctl_elem_value *ucontrol) | ||
544 | { | ||
545 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
546 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
547 | int block = wm8915_get_retune_mobile_block(kcontrol->id.name); | ||
548 | |||
549 | ucontrol->value.enumerated.item[0] = wm8915->retune_mobile_cfg[block]; | ||
550 | |||
551 | return 0; | ||
552 | } | ||
553 | |||
554 | static const struct snd_kcontrol_new wm8915_snd_controls[] = { | ||
555 | SOC_DOUBLE_R_TLV("Capture Volume", WM8915_LEFT_LINE_INPUT_VOLUME, | ||
556 | WM8915_RIGHT_LINE_INPUT_VOLUME, 0, 31, 0, inpga_tlv), | ||
557 | SOC_DOUBLE_R("Capture ZC Switch", WM8915_LEFT_LINE_INPUT_VOLUME, | ||
558 | WM8915_RIGHT_LINE_INPUT_VOLUME, 5, 1, 0), | ||
559 | |||
560 | SOC_DOUBLE_TLV("DAC1 Sidetone Volume", WM8915_DAC1_MIXER_VOLUMES, | ||
561 | 0, 5, 24, 0, sidetone_tlv), | ||
562 | SOC_DOUBLE_TLV("DAC2 Sidetone Volume", WM8915_DAC2_MIXER_VOLUMES, | ||
563 | 0, 5, 24, 0, sidetone_tlv), | ||
564 | SOC_SINGLE("Sidetone LPF Switch", WM8915_SIDETONE, 12, 1, 0), | ||
565 | SOC_ENUM("Sidetone HPF Cut-off", sidetone_hpf), | ||
566 | SOC_SINGLE("Sidetone HPF Switch", WM8915_SIDETONE, 6, 1, 0), | ||
567 | |||
568 | SOC_DOUBLE_R_TLV("DSP1 Capture Volume", WM8915_DSP1_TX_LEFT_VOLUME, | ||
569 | WM8915_DSP1_TX_RIGHT_VOLUME, 1, 96, 0, digital_tlv), | ||
570 | SOC_DOUBLE_R_TLV("DSP2 Capture Volume", WM8915_DSP2_TX_LEFT_VOLUME, | ||
571 | WM8915_DSP2_TX_RIGHT_VOLUME, 1, 96, 0, digital_tlv), | ||
572 | |||
573 | SOC_SINGLE("DSP1 Capture Notch Filter Switch", WM8915_DSP1_TX_FILTERS, | ||
574 | 13, 1, 0), | ||
575 | SOC_DOUBLE("DSP1 Capture HPF Switch", WM8915_DSP1_TX_FILTERS, 12, 11, 1, 0), | ||
576 | SOC_ENUM("DSP1 Capture HPF Mode", dsp1tx_hpf_mode), | ||
577 | SOC_ENUM("DSP1 Capture HPF Cutoff", dsp1tx_hpf_cutoff), | ||
578 | |||
579 | SOC_SINGLE("DSP2 Capture Notch Filter Switch", WM8915_DSP2_TX_FILTERS, | ||
580 | 13, 1, 0), | ||
581 | SOC_DOUBLE("DSP2 Capture HPF Switch", WM8915_DSP2_TX_FILTERS, 12, 11, 1, 0), | ||
582 | SOC_ENUM("DSP2 Capture HPF Mode", dsp2tx_hpf_mode), | ||
583 | SOC_ENUM("DSP2 Capture HPF Cutoff", dsp2tx_hpf_cutoff), | ||
584 | |||
585 | SOC_DOUBLE_R_TLV("DSP1 Playback Volume", WM8915_DSP1_RX_LEFT_VOLUME, | ||
586 | WM8915_DSP1_RX_RIGHT_VOLUME, 1, 112, 0, digital_tlv), | ||
587 | SOC_SINGLE("DSP1 Playback Switch", WM8915_DSP1_RX_FILTERS_1, 9, 1, 1), | ||
588 | |||
589 | SOC_DOUBLE_R_TLV("DSP2 Playback Volume", WM8915_DSP2_RX_LEFT_VOLUME, | ||
590 | WM8915_DSP2_RX_RIGHT_VOLUME, 1, 112, 0, digital_tlv), | ||
591 | SOC_SINGLE("DSP2 Playback Switch", WM8915_DSP2_RX_FILTERS_1, 9, 1, 1), | ||
592 | |||
593 | SOC_DOUBLE_R_TLV("DAC1 Volume", WM8915_DAC1_LEFT_VOLUME, | ||
594 | WM8915_DAC1_RIGHT_VOLUME, 1, 112, 0, digital_tlv), | ||
595 | SOC_DOUBLE_R("DAC1 Switch", WM8915_DAC1_LEFT_VOLUME, | ||
596 | WM8915_DAC1_RIGHT_VOLUME, 9, 1, 1), | ||
597 | |||
598 | SOC_DOUBLE_R_TLV("DAC2 Volume", WM8915_DAC2_LEFT_VOLUME, | ||
599 | WM8915_DAC2_RIGHT_VOLUME, 1, 112, 0, digital_tlv), | ||
600 | SOC_DOUBLE_R("DAC2 Switch", WM8915_DAC2_LEFT_VOLUME, | ||
601 | WM8915_DAC2_RIGHT_VOLUME, 9, 1, 1), | ||
602 | |||
603 | SOC_SINGLE("Speaker High Performance Switch", WM8915_OVERSAMPLING, 3, 1, 0), | ||
604 | SOC_SINGLE("DMIC High Performance Switch", WM8915_OVERSAMPLING, 2, 1, 0), | ||
605 | SOC_SINGLE("ADC High Performance Switch", WM8915_OVERSAMPLING, 1, 1, 0), | ||
606 | SOC_SINGLE("DAC High Performance Switch", WM8915_OVERSAMPLING, 0, 1, 0), | ||
607 | |||
608 | SOC_SINGLE("DAC Soft Mute Switch", WM8915_DAC_SOFTMUTE, 1, 1, 0), | ||
609 | SOC_SINGLE("DAC Slow Soft Mute Switch", WM8915_DAC_SOFTMUTE, 0, 1, 0), | ||
610 | |||
611 | SOC_DOUBLE_TLV("Digital Output 1 Volume", WM8915_DAC1_HPOUT1_VOLUME, 0, 4, | ||
612 | 8, 0, out_digital_tlv), | ||
613 | SOC_DOUBLE_TLV("Digital Output 2 Volume", WM8915_DAC2_HPOUT2_VOLUME, 0, 4, | ||
614 | 8, 0, out_digital_tlv), | ||
615 | |||
616 | SOC_DOUBLE_R_TLV("Output 1 Volume", WM8915_OUTPUT1_LEFT_VOLUME, | ||
617 | WM8915_OUTPUT1_RIGHT_VOLUME, 0, 12, 0, out_tlv), | ||
618 | SOC_DOUBLE_R("Output 1 ZC Switch", WM8915_OUTPUT1_LEFT_VOLUME, | ||
619 | WM8915_OUTPUT1_RIGHT_VOLUME, 7, 1, 0), | ||
620 | |||
621 | SOC_DOUBLE_R_TLV("Output 2 Volume", WM8915_OUTPUT2_LEFT_VOLUME, | ||
622 | WM8915_OUTPUT2_RIGHT_VOLUME, 0, 12, 0, out_tlv), | ||
623 | SOC_DOUBLE_R("Output 2 ZC Switch", WM8915_OUTPUT2_LEFT_VOLUME, | ||
624 | WM8915_OUTPUT2_RIGHT_VOLUME, 7, 1, 0), | ||
625 | |||
626 | SOC_DOUBLE_TLV("Speaker Volume", WM8915_PDM_SPEAKER_VOLUME, 0, 4, 8, 0, | ||
627 | spk_tlv), | ||
628 | SOC_DOUBLE_R("Speaker Switch", WM8915_LEFT_PDM_SPEAKER, | ||
629 | WM8915_RIGHT_PDM_SPEAKER, 3, 1, 1), | ||
630 | SOC_DOUBLE_R("Speaker ZC Switch", WM8915_LEFT_PDM_SPEAKER, | ||
631 | WM8915_RIGHT_PDM_SPEAKER, 2, 1, 0), | ||
632 | |||
633 | SOC_SINGLE("DSP1 EQ Switch", WM8915_DSP1_RX_EQ_GAINS_1, 0, 1, 0), | ||
634 | SOC_SINGLE("DSP2 EQ Switch", WM8915_DSP2_RX_EQ_GAINS_1, 0, 1, 0), | ||
635 | }; | ||
636 | |||
637 | static const struct snd_kcontrol_new wm8915_eq_controls[] = { | ||
638 | SOC_SINGLE_TLV("DSP1 EQ B1 Volume", WM8915_DSP1_RX_EQ_GAINS_1, 11, 31, 0, | ||
639 | eq_tlv), | ||
640 | SOC_SINGLE_TLV("DSP1 EQ B2 Volume", WM8915_DSP1_RX_EQ_GAINS_1, 6, 31, 0, | ||
641 | eq_tlv), | ||
642 | SOC_SINGLE_TLV("DSP1 EQ B3 Volume", WM8915_DSP1_RX_EQ_GAINS_1, 1, 31, 0, | ||
643 | eq_tlv), | ||
644 | SOC_SINGLE_TLV("DSP1 EQ B4 Volume", WM8915_DSP1_RX_EQ_GAINS_2, 11, 31, 0, | ||
645 | eq_tlv), | ||
646 | SOC_SINGLE_TLV("DSP1 EQ B5 Volume", WM8915_DSP1_RX_EQ_GAINS_2, 6, 31, 0, | ||
647 | eq_tlv), | ||
648 | |||
649 | SOC_SINGLE_TLV("DSP2 EQ B1 Volume", WM8915_DSP2_RX_EQ_GAINS_1, 11, 31, 0, | ||
650 | eq_tlv), | ||
651 | SOC_SINGLE_TLV("DSP2 EQ B2 Volume", WM8915_DSP2_RX_EQ_GAINS_1, 6, 31, 0, | ||
652 | eq_tlv), | ||
653 | SOC_SINGLE_TLV("DSP2 EQ B3 Volume", WM8915_DSP2_RX_EQ_GAINS_1, 1, 31, 0, | ||
654 | eq_tlv), | ||
655 | SOC_SINGLE_TLV("DSP2 EQ B4 Volume", WM8915_DSP2_RX_EQ_GAINS_2, 11, 31, 0, | ||
656 | eq_tlv), | ||
657 | SOC_SINGLE_TLV("DSP2 EQ B5 Volume", WM8915_DSP2_RX_EQ_GAINS_2, 6, 31, 0, | ||
658 | eq_tlv), | ||
659 | }; | ||
660 | |||
661 | static int cp_event(struct snd_soc_dapm_widget *w, | ||
662 | struct snd_kcontrol *kcontrol, int event) | ||
663 | { | ||
664 | switch (event) { | ||
665 | case SND_SOC_DAPM_POST_PMU: | ||
666 | msleep(5); | ||
667 | break; | ||
668 | default: | ||
669 | BUG(); | ||
670 | return -EINVAL; | ||
671 | } | ||
672 | |||
673 | return 0; | ||
674 | } | ||
675 | |||
676 | static int rmv_short_event(struct snd_soc_dapm_widget *w, | ||
677 | struct snd_kcontrol *kcontrol, int event) | ||
678 | { | ||
679 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(w->codec); | ||
680 | |||
681 | /* Record which outputs we enabled */ | ||
682 | switch (event) { | ||
683 | case SND_SOC_DAPM_PRE_PMD: | ||
684 | wm8915->hpout_pending &= ~w->shift; | ||
685 | break; | ||
686 | case SND_SOC_DAPM_PRE_PMU: | ||
687 | wm8915->hpout_pending |= w->shift; | ||
688 | break; | ||
689 | default: | ||
690 | BUG(); | ||
691 | return -EINVAL; | ||
692 | } | ||
693 | |||
694 | return 0; | ||
695 | } | ||
696 | |||
697 | static void wait_for_dc_servo(struct snd_soc_codec *codec, u16 mask) | ||
698 | { | ||
699 | struct i2c_client *i2c = to_i2c_client(codec->dev); | ||
700 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
701 | int i, ret; | ||
702 | unsigned long timeout = 200; | ||
703 | |||
704 | snd_soc_write(codec, WM8915_DC_SERVO_2, mask); | ||
705 | |||
706 | /* Use the interrupt if possible */ | ||
707 | do { | ||
708 | if (i2c->irq) { | ||
709 | timeout = wait_for_completion_timeout(&wm8915->dcs_done, | ||
710 | msecs_to_jiffies(200)); | ||
711 | if (timeout == 0) | ||
712 | dev_err(codec->dev, "DC servo timed out\n"); | ||
713 | |||
714 | } else { | ||
715 | msleep(1); | ||
716 | if (--i) { | ||
717 | timeout = 0; | ||
718 | break; | ||
719 | } | ||
720 | } | ||
721 | |||
722 | ret = snd_soc_read(codec, WM8915_DC_SERVO_2); | ||
723 | dev_dbg(codec->dev, "DC servo state: %x\n", ret); | ||
724 | } while (ret & mask); | ||
725 | |||
726 | if (timeout == 0) | ||
727 | dev_err(codec->dev, "DC servo timed out for %x\n", mask); | ||
728 | else | ||
729 | dev_dbg(codec->dev, "DC servo complete for %x\n", mask); | ||
730 | } | ||
731 | |||
732 | static void wm8915_seq_notifier(struct snd_soc_dapm_context *dapm, | ||
733 | enum snd_soc_dapm_type event, int subseq) | ||
734 | { | ||
735 | struct snd_soc_codec *codec = container_of(dapm, | ||
736 | struct snd_soc_codec, dapm); | ||
737 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
738 | u16 val, mask; | ||
739 | |||
740 | /* Complete any pending DC servo starts */ | ||
741 | if (wm8915->dcs_pending) { | ||
742 | dev_dbg(codec->dev, "Starting DC servo for %x\n", | ||
743 | wm8915->dcs_pending); | ||
744 | |||
745 | /* Trigger a startup sequence */ | ||
746 | wait_for_dc_servo(codec, wm8915->dcs_pending | ||
747 | << WM8915_DCS_TRIG_STARTUP_0_SHIFT); | ||
748 | |||
749 | wm8915->dcs_pending = 0; | ||
750 | } | ||
751 | |||
752 | if (wm8915->hpout_pending != wm8915->hpout_ena) { | ||
753 | dev_dbg(codec->dev, "Applying RMV_SHORTs %x->%x\n", | ||
754 | wm8915->hpout_ena, wm8915->hpout_pending); | ||
755 | |||
756 | val = 0; | ||
757 | mask = 0; | ||
758 | if (wm8915->hpout_pending & HPOUT1L) { | ||
759 | val |= WM8915_HPOUT1L_RMV_SHORT; | ||
760 | mask |= WM8915_HPOUT1L_RMV_SHORT; | ||
761 | } else { | ||
762 | mask |= WM8915_HPOUT1L_RMV_SHORT | | ||
763 | WM8915_HPOUT1L_OUTP | | ||
764 | WM8915_HPOUT1L_DLY; | ||
765 | } | ||
766 | |||
767 | if (wm8915->hpout_pending & HPOUT1R) { | ||
768 | val |= WM8915_HPOUT1R_RMV_SHORT; | ||
769 | mask |= WM8915_HPOUT1R_RMV_SHORT; | ||
770 | } else { | ||
771 | mask |= WM8915_HPOUT1R_RMV_SHORT | | ||
772 | WM8915_HPOUT1R_OUTP | | ||
773 | WM8915_HPOUT1R_DLY; | ||
774 | } | ||
775 | |||
776 | snd_soc_update_bits(codec, WM8915_ANALOGUE_HP_1, mask, val); | ||
777 | |||
778 | val = 0; | ||
779 | mask = 0; | ||
780 | if (wm8915->hpout_pending & HPOUT2L) { | ||
781 | val |= WM8915_HPOUT2L_RMV_SHORT; | ||
782 | mask |= WM8915_HPOUT2L_RMV_SHORT; | ||
783 | } else { | ||
784 | mask |= WM8915_HPOUT2L_RMV_SHORT | | ||
785 | WM8915_HPOUT2L_OUTP | | ||
786 | WM8915_HPOUT2L_DLY; | ||
787 | } | ||
788 | |||
789 | if (wm8915->hpout_pending & HPOUT2R) { | ||
790 | val |= WM8915_HPOUT2R_RMV_SHORT; | ||
791 | mask |= WM8915_HPOUT2R_RMV_SHORT; | ||
792 | } else { | ||
793 | mask |= WM8915_HPOUT2R_RMV_SHORT | | ||
794 | WM8915_HPOUT2R_OUTP | | ||
795 | WM8915_HPOUT2R_DLY; | ||
796 | } | ||
797 | |||
798 | snd_soc_update_bits(codec, WM8915_ANALOGUE_HP_2, mask, val); | ||
799 | |||
800 | wm8915->hpout_ena = wm8915->hpout_pending; | ||
801 | } | ||
802 | } | ||
803 | |||
804 | static int dcs_start(struct snd_soc_dapm_widget *w, | ||
805 | struct snd_kcontrol *kcontrol, int event) | ||
806 | { | ||
807 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(w->codec); | ||
808 | |||
809 | switch (event) { | ||
810 | case SND_SOC_DAPM_POST_PMU: | ||
811 | wm8915->dcs_pending |= 1 << w->shift; | ||
812 | break; | ||
813 | default: | ||
814 | BUG(); | ||
815 | return -EINVAL; | ||
816 | } | ||
817 | |||
818 | return 0; | ||
819 | } | ||
820 | |||
821 | static const char *sidetone_text[] = { | ||
822 | "IN1", "IN2", | ||
823 | }; | ||
824 | |||
825 | static const struct soc_enum left_sidetone_enum = | ||
826 | SOC_ENUM_SINGLE(WM8915_SIDETONE, 0, 2, sidetone_text); | ||
827 | |||
828 | static const struct snd_kcontrol_new left_sidetone = | ||
829 | SOC_DAPM_ENUM("Left Sidetone", left_sidetone_enum); | ||
830 | |||
831 | static const struct soc_enum right_sidetone_enum = | ||
832 | SOC_ENUM_SINGLE(WM8915_SIDETONE, 1, 2, sidetone_text); | ||
833 | |||
834 | static const struct snd_kcontrol_new right_sidetone = | ||
835 | SOC_DAPM_ENUM("Right Sidetone", right_sidetone_enum); | ||
836 | |||
837 | static const char *spk_text[] = { | ||
838 | "DAC1L", "DAC1R", "DAC2L", "DAC2R" | ||
839 | }; | ||
840 | |||
841 | static const struct soc_enum spkl_enum = | ||
842 | SOC_ENUM_SINGLE(WM8915_LEFT_PDM_SPEAKER, 0, 4, spk_text); | ||
843 | |||
844 | static const struct snd_kcontrol_new spkl_mux = | ||
845 | SOC_DAPM_ENUM("SPKL", spkl_enum); | ||
846 | |||
847 | static const struct soc_enum spkr_enum = | ||
848 | SOC_ENUM_SINGLE(WM8915_RIGHT_PDM_SPEAKER, 0, 4, spk_text); | ||
849 | |||
850 | static const struct snd_kcontrol_new spkr_mux = | ||
851 | SOC_DAPM_ENUM("SPKR", spkr_enum); | ||
852 | |||
853 | static const char *dsp1rx_text[] = { | ||
854 | "AIF1", "AIF2" | ||
855 | }; | ||
856 | |||
857 | static const struct soc_enum dsp1rx_enum = | ||
858 | SOC_ENUM_SINGLE(WM8915_POWER_MANAGEMENT_8, 0, 2, dsp1rx_text); | ||
859 | |||
860 | static const struct snd_kcontrol_new dsp1rx = | ||
861 | SOC_DAPM_ENUM("DSP1RX", dsp1rx_enum); | ||
862 | |||
863 | static const char *dsp2rx_text[] = { | ||
864 | "AIF2", "AIF1" | ||
865 | }; | ||
866 | |||
867 | static const struct soc_enum dsp2rx_enum = | ||
868 | SOC_ENUM_SINGLE(WM8915_POWER_MANAGEMENT_8, 4, 2, dsp2rx_text); | ||
869 | |||
870 | static const struct snd_kcontrol_new dsp2rx = | ||
871 | SOC_DAPM_ENUM("DSP2RX", dsp2rx_enum); | ||
872 | |||
873 | static const char *aif2tx_text[] = { | ||
874 | "DSP2", "DSP1", "AIF1" | ||
875 | }; | ||
876 | |||
877 | static const struct soc_enum aif2tx_enum = | ||
878 | SOC_ENUM_SINGLE(WM8915_POWER_MANAGEMENT_8, 6, 3, aif2tx_text); | ||
879 | |||
880 | static const struct snd_kcontrol_new aif2tx = | ||
881 | SOC_DAPM_ENUM("AIF2TX", aif2tx_enum); | ||
882 | |||
883 | static const char *inmux_text[] = { | ||
884 | "ADC", "DMIC1", "DMIC2" | ||
885 | }; | ||
886 | |||
887 | static const struct soc_enum in1_enum = | ||
888 | SOC_ENUM_SINGLE(WM8915_POWER_MANAGEMENT_7, 0, 3, inmux_text); | ||
889 | |||
890 | static const struct snd_kcontrol_new in1_mux = | ||
891 | SOC_DAPM_ENUM("IN1 Mux", in1_enum); | ||
892 | |||
893 | static const struct soc_enum in2_enum = | ||
894 | SOC_ENUM_SINGLE(WM8915_POWER_MANAGEMENT_7, 4, 3, inmux_text); | ||
895 | |||
896 | static const struct snd_kcontrol_new in2_mux = | ||
897 | SOC_DAPM_ENUM("IN2 Mux", in2_enum); | ||
898 | |||
899 | static const struct snd_kcontrol_new dac2r_mix[] = { | ||
900 | SOC_DAPM_SINGLE("Right Sidetone Switch", WM8915_DAC2_RIGHT_MIXER_ROUTING, | ||
901 | 5, 1, 0), | ||
902 | SOC_DAPM_SINGLE("Left Sidetone Switch", WM8915_DAC2_RIGHT_MIXER_ROUTING, | ||
903 | 4, 1, 0), | ||
904 | SOC_DAPM_SINGLE("DSP2 Switch", WM8915_DAC2_RIGHT_MIXER_ROUTING, 1, 1, 0), | ||
905 | SOC_DAPM_SINGLE("DSP1 Switch", WM8915_DAC2_RIGHT_MIXER_ROUTING, 0, 1, 0), | ||
906 | }; | ||
907 | |||
908 | static const struct snd_kcontrol_new dac2l_mix[] = { | ||
909 | SOC_DAPM_SINGLE("Right Sidetone Switch", WM8915_DAC2_LEFT_MIXER_ROUTING, | ||
910 | 5, 1, 0), | ||
911 | SOC_DAPM_SINGLE("Left Sidetone Switch", WM8915_DAC2_LEFT_MIXER_ROUTING, | ||
912 | 4, 1, 0), | ||
913 | SOC_DAPM_SINGLE("DSP2 Switch", WM8915_DAC2_LEFT_MIXER_ROUTING, 1, 1, 0), | ||
914 | SOC_DAPM_SINGLE("DSP1 Switch", WM8915_DAC2_LEFT_MIXER_ROUTING, 0, 1, 0), | ||
915 | }; | ||
916 | |||
917 | static const struct snd_kcontrol_new dac1r_mix[] = { | ||
918 | SOC_DAPM_SINGLE("Right Sidetone Switch", WM8915_DAC1_RIGHT_MIXER_ROUTING, | ||
919 | 5, 1, 0), | ||
920 | SOC_DAPM_SINGLE("Left Sidetone Switch", WM8915_DAC1_RIGHT_MIXER_ROUTING, | ||
921 | 4, 1, 0), | ||
922 | SOC_DAPM_SINGLE("DSP2 Switch", WM8915_DAC1_RIGHT_MIXER_ROUTING, 1, 1, 0), | ||
923 | SOC_DAPM_SINGLE("DSP1 Switch", WM8915_DAC1_RIGHT_MIXER_ROUTING, 0, 1, 0), | ||
924 | }; | ||
925 | |||
926 | static const struct snd_kcontrol_new dac1l_mix[] = { | ||
927 | SOC_DAPM_SINGLE("Right Sidetone Switch", WM8915_DAC1_LEFT_MIXER_ROUTING, | ||
928 | 5, 1, 0), | ||
929 | SOC_DAPM_SINGLE("Left Sidetone Switch", WM8915_DAC1_LEFT_MIXER_ROUTING, | ||
930 | 4, 1, 0), | ||
931 | SOC_DAPM_SINGLE("DSP2 Switch", WM8915_DAC1_LEFT_MIXER_ROUTING, 1, 1, 0), | ||
932 | SOC_DAPM_SINGLE("DSP1 Switch", WM8915_DAC1_LEFT_MIXER_ROUTING, 0, 1, 0), | ||
933 | }; | ||
934 | |||
935 | static const struct snd_kcontrol_new dsp1txl[] = { | ||
936 | SOC_DAPM_SINGLE("IN1 Switch", WM8915_DSP1_TX_LEFT_MIXER_ROUTING, | ||
937 | 1, 1, 0), | ||
938 | SOC_DAPM_SINGLE("DAC Switch", WM8915_DSP1_TX_LEFT_MIXER_ROUTING, | ||
939 | 0, 1, 0), | ||
940 | }; | ||
941 | |||
942 | static const struct snd_kcontrol_new dsp1txr[] = { | ||
943 | SOC_DAPM_SINGLE("IN1 Switch", WM8915_DSP1_TX_RIGHT_MIXER_ROUTING, | ||
944 | 1, 1, 0), | ||
945 | SOC_DAPM_SINGLE("DAC Switch", WM8915_DSP1_TX_RIGHT_MIXER_ROUTING, | ||
946 | 0, 1, 0), | ||
947 | }; | ||
948 | |||
949 | static const struct snd_kcontrol_new dsp2txl[] = { | ||
950 | SOC_DAPM_SINGLE("IN1 Switch", WM8915_DSP2_TX_LEFT_MIXER_ROUTING, | ||
951 | 1, 1, 0), | ||
952 | SOC_DAPM_SINGLE("DAC Switch", WM8915_DSP2_TX_LEFT_MIXER_ROUTING, | ||
953 | 0, 1, 0), | ||
954 | }; | ||
955 | |||
956 | static const struct snd_kcontrol_new dsp2txr[] = { | ||
957 | SOC_DAPM_SINGLE("IN1 Switch", WM8915_DSP2_TX_RIGHT_MIXER_ROUTING, | ||
958 | 1, 1, 0), | ||
959 | SOC_DAPM_SINGLE("DAC Switch", WM8915_DSP2_TX_RIGHT_MIXER_ROUTING, | ||
960 | 0, 1, 0), | ||
961 | }; | ||
962 | |||
963 | |||
964 | static const struct snd_soc_dapm_widget wm8915_dapm_widgets[] = { | ||
965 | SND_SOC_DAPM_INPUT("IN1LN"), | ||
966 | SND_SOC_DAPM_INPUT("IN1LP"), | ||
967 | SND_SOC_DAPM_INPUT("IN1RN"), | ||
968 | SND_SOC_DAPM_INPUT("IN1RP"), | ||
969 | |||
970 | SND_SOC_DAPM_INPUT("IN2LN"), | ||
971 | SND_SOC_DAPM_INPUT("IN2LP"), | ||
972 | SND_SOC_DAPM_INPUT("IN2RN"), | ||
973 | SND_SOC_DAPM_INPUT("IN2RP"), | ||
974 | |||
975 | SND_SOC_DAPM_INPUT("DMIC1DAT"), | ||
976 | SND_SOC_DAPM_INPUT("DMIC2DAT"), | ||
977 | |||
978 | SND_SOC_DAPM_SUPPLY_S("SYSCLK", 1, WM8915_AIF_CLOCKING_1, 0, 0, NULL, 0), | ||
979 | SND_SOC_DAPM_SUPPLY_S("SYSDSPCLK", 2, WM8915_CLOCKING_1, 1, 0, NULL, 0), | ||
980 | SND_SOC_DAPM_SUPPLY_S("AIFCLK", 2, WM8915_CLOCKING_1, 2, 0, NULL, 0), | ||
981 | SND_SOC_DAPM_SUPPLY_S("Charge Pump", 2, WM8915_CHARGE_PUMP_1, 15, 0, cp_event, | ||
982 | SND_SOC_DAPM_POST_PMU), | ||
983 | |||
984 | SND_SOC_DAPM_SUPPLY("LDO2", WM8915_POWER_MANAGEMENT_2, 1, 0, NULL, 0), | ||
985 | SND_SOC_DAPM_MICBIAS("MICB2", WM8915_POWER_MANAGEMENT_1, 9, 0), | ||
986 | SND_SOC_DAPM_MICBIAS("MICB1", WM8915_POWER_MANAGEMENT_1, 8, 0), | ||
987 | |||
988 | SND_SOC_DAPM_PGA("IN1L PGA", WM8915_POWER_MANAGEMENT_2, 5, 0, NULL, 0), | ||
989 | SND_SOC_DAPM_PGA("IN1R PGA", WM8915_POWER_MANAGEMENT_2, 4, 0, NULL, 0), | ||
990 | |||
991 | SND_SOC_DAPM_MUX("IN1L Mux", SND_SOC_NOPM, 0, 0, &in1_mux), | ||
992 | SND_SOC_DAPM_MUX("IN1R Mux", SND_SOC_NOPM, 0, 0, &in1_mux), | ||
993 | SND_SOC_DAPM_MUX("IN2L Mux", SND_SOC_NOPM, 0, 0, &in2_mux), | ||
994 | SND_SOC_DAPM_MUX("IN2R Mux", SND_SOC_NOPM, 0, 0, &in2_mux), | ||
995 | |||
996 | SND_SOC_DAPM_PGA("IN1L", WM8915_POWER_MANAGEMENT_7, 2, 0, NULL, 0), | ||
997 | SND_SOC_DAPM_PGA("IN1R", WM8915_POWER_MANAGEMENT_7, 3, 0, NULL, 0), | ||
998 | SND_SOC_DAPM_PGA("IN2L", WM8915_POWER_MANAGEMENT_7, 6, 0, NULL, 0), | ||
999 | SND_SOC_DAPM_PGA("IN2R", WM8915_POWER_MANAGEMENT_7, 7, 0, NULL, 0), | ||
1000 | |||
1001 | SND_SOC_DAPM_SUPPLY("DMIC2", WM8915_POWER_MANAGEMENT_7, 9, 0, NULL, 0), | ||
1002 | SND_SOC_DAPM_SUPPLY("DMIC1", WM8915_POWER_MANAGEMENT_7, 8, 0, NULL, 0), | ||
1003 | |||
1004 | SND_SOC_DAPM_ADC("DMIC2L", NULL, WM8915_POWER_MANAGEMENT_3, 5, 0), | ||
1005 | SND_SOC_DAPM_ADC("DMIC2R", NULL, WM8915_POWER_MANAGEMENT_3, 4, 0), | ||
1006 | SND_SOC_DAPM_ADC("DMIC1L", NULL, WM8915_POWER_MANAGEMENT_3, 3, 0), | ||
1007 | SND_SOC_DAPM_ADC("DMIC1R", NULL, WM8915_POWER_MANAGEMENT_3, 2, 0), | ||
1008 | |||
1009 | SND_SOC_DAPM_ADC("ADCL", NULL, WM8915_POWER_MANAGEMENT_3, 1, 0), | ||
1010 | SND_SOC_DAPM_ADC("ADCR", NULL, WM8915_POWER_MANAGEMENT_3, 0, 0), | ||
1011 | |||
1012 | SND_SOC_DAPM_MUX("Left Sidetone", SND_SOC_NOPM, 0, 0, &left_sidetone), | ||
1013 | SND_SOC_DAPM_MUX("Right Sidetone", SND_SOC_NOPM, 0, 0, &right_sidetone), | ||
1014 | |||
1015 | SND_SOC_DAPM_AIF_IN("DSP2RXL", NULL, 0, WM8915_POWER_MANAGEMENT_3, 11, 0), | ||
1016 | SND_SOC_DAPM_AIF_IN("DSP2RXR", NULL, 1, WM8915_POWER_MANAGEMENT_3, 10, 0), | ||
1017 | SND_SOC_DAPM_AIF_IN("DSP1RXL", NULL, 0, WM8915_POWER_MANAGEMENT_3, 9, 0), | ||
1018 | SND_SOC_DAPM_AIF_IN("DSP1RXR", NULL, 1, WM8915_POWER_MANAGEMENT_3, 8, 0), | ||
1019 | |||
1020 | SND_SOC_DAPM_MIXER("DSP2TXL", WM8915_POWER_MANAGEMENT_5, 11, 0, | ||
1021 | dsp2txl, ARRAY_SIZE(dsp2txl)), | ||
1022 | SND_SOC_DAPM_MIXER("DSP2TXR", WM8915_POWER_MANAGEMENT_5, 10, 0, | ||
1023 | dsp2txr, ARRAY_SIZE(dsp2txr)), | ||
1024 | SND_SOC_DAPM_MIXER("DSP1TXL", WM8915_POWER_MANAGEMENT_5, 9, 0, | ||
1025 | dsp1txl, ARRAY_SIZE(dsp1txl)), | ||
1026 | SND_SOC_DAPM_MIXER("DSP1TXR", WM8915_POWER_MANAGEMENT_5, 8, 0, | ||
1027 | dsp1txr, ARRAY_SIZE(dsp1txr)), | ||
1028 | |||
1029 | SND_SOC_DAPM_MIXER("DAC2L Mixer", SND_SOC_NOPM, 0, 0, | ||
1030 | dac2l_mix, ARRAY_SIZE(dac2l_mix)), | ||
1031 | SND_SOC_DAPM_MIXER("DAC2R Mixer", SND_SOC_NOPM, 0, 0, | ||
1032 | dac2r_mix, ARRAY_SIZE(dac2r_mix)), | ||
1033 | SND_SOC_DAPM_MIXER("DAC1L Mixer", SND_SOC_NOPM, 0, 0, | ||
1034 | dac1l_mix, ARRAY_SIZE(dac1l_mix)), | ||
1035 | SND_SOC_DAPM_MIXER("DAC1R Mixer", SND_SOC_NOPM, 0, 0, | ||
1036 | dac1r_mix, ARRAY_SIZE(dac1r_mix)), | ||
1037 | |||
1038 | SND_SOC_DAPM_DAC("DAC2L", NULL, WM8915_POWER_MANAGEMENT_5, 3, 0), | ||
1039 | SND_SOC_DAPM_DAC("DAC2R", NULL, WM8915_POWER_MANAGEMENT_5, 2, 0), | ||
1040 | SND_SOC_DAPM_DAC("DAC1L", NULL, WM8915_POWER_MANAGEMENT_5, 1, 0), | ||
1041 | SND_SOC_DAPM_DAC("DAC1R", NULL, WM8915_POWER_MANAGEMENT_5, 0, 0), | ||
1042 | |||
1043 | SND_SOC_DAPM_AIF_IN("AIF2RX1", "AIF2 Playback", 1, | ||
1044 | WM8915_POWER_MANAGEMENT_4, 9, 0), | ||
1045 | SND_SOC_DAPM_AIF_IN("AIF2RX0", "AIF2 Playback", 2, | ||
1046 | WM8915_POWER_MANAGEMENT_4, 8, 0), | ||
1047 | |||
1048 | SND_SOC_DAPM_AIF_IN("AIF2TX1", "AIF2 Capture", 1, | ||
1049 | WM8915_POWER_MANAGEMENT_6, 9, 0), | ||
1050 | SND_SOC_DAPM_AIF_IN("AIF2TX0", "AIF2 Capture", 2, | ||
1051 | WM8915_POWER_MANAGEMENT_6, 8, 0), | ||
1052 | |||
1053 | SND_SOC_DAPM_AIF_IN("AIF1RX5", "AIF1 Playback", 5, | ||
1054 | WM8915_POWER_MANAGEMENT_4, 5, 0), | ||
1055 | SND_SOC_DAPM_AIF_IN("AIF1RX4", "AIF1 Playback", 4, | ||
1056 | WM8915_POWER_MANAGEMENT_4, 4, 0), | ||
1057 | SND_SOC_DAPM_AIF_IN("AIF1RX3", "AIF1 Playback", 3, | ||
1058 | WM8915_POWER_MANAGEMENT_4, 3, 0), | ||
1059 | SND_SOC_DAPM_AIF_IN("AIF1RX2", "AIF1 Playback", 2, | ||
1060 | WM8915_POWER_MANAGEMENT_4, 2, 0), | ||
1061 | SND_SOC_DAPM_AIF_IN("AIF1RX1", "AIF1 Playback", 1, | ||
1062 | WM8915_POWER_MANAGEMENT_4, 1, 0), | ||
1063 | SND_SOC_DAPM_AIF_IN("AIF1RX0", "AIF1 Playback", 0, | ||
1064 | WM8915_POWER_MANAGEMENT_4, 0, 0), | ||
1065 | |||
1066 | SND_SOC_DAPM_AIF_OUT("AIF1TX5", "AIF1 Capture", 5, | ||
1067 | WM8915_POWER_MANAGEMENT_6, 5, 0), | ||
1068 | SND_SOC_DAPM_AIF_OUT("AIF1TX4", "AIF1 Capture", 4, | ||
1069 | WM8915_POWER_MANAGEMENT_6, 4, 0), | ||
1070 | SND_SOC_DAPM_AIF_OUT("AIF1TX3", "AIF1 Capture", 3, | ||
1071 | WM8915_POWER_MANAGEMENT_6, 3, 0), | ||
1072 | SND_SOC_DAPM_AIF_OUT("AIF1TX2", "AIF1 Capture", 2, | ||
1073 | WM8915_POWER_MANAGEMENT_6, 2, 0), | ||
1074 | SND_SOC_DAPM_AIF_OUT("AIF1TX1", "AIF1 Capture", 1, | ||
1075 | WM8915_POWER_MANAGEMENT_6, 1, 0), | ||
1076 | SND_SOC_DAPM_AIF_OUT("AIF1TX0", "AIF1 Capture", 0, | ||
1077 | WM8915_POWER_MANAGEMENT_6, 0, 0), | ||
1078 | |||
1079 | /* We route as stereo pairs so define some dummy widgets to squash | ||
1080 | * things down for now. RXA = 0,1, RXB = 2,3 and so on */ | ||
1081 | SND_SOC_DAPM_PGA("AIF1RXA", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1082 | SND_SOC_DAPM_PGA("AIF1RXB", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1083 | SND_SOC_DAPM_PGA("AIF1RXC", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1084 | SND_SOC_DAPM_PGA("AIF2RX", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1085 | SND_SOC_DAPM_PGA("DSP2TX", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1086 | |||
1087 | SND_SOC_DAPM_MUX("DSP1RX", SND_SOC_NOPM, 0, 0, &dsp1rx), | ||
1088 | SND_SOC_DAPM_MUX("DSP2RX", SND_SOC_NOPM, 0, 0, &dsp2rx), | ||
1089 | SND_SOC_DAPM_MUX("AIF2TX", SND_SOC_NOPM, 0, 0, &aif2tx), | ||
1090 | |||
1091 | SND_SOC_DAPM_MUX("SPKL", SND_SOC_NOPM, 0, 0, &spkl_mux), | ||
1092 | SND_SOC_DAPM_MUX("SPKR", SND_SOC_NOPM, 0, 0, &spkr_mux), | ||
1093 | SND_SOC_DAPM_PGA("SPKL PGA", WM8915_LEFT_PDM_SPEAKER, 4, 0, NULL, 0), | ||
1094 | SND_SOC_DAPM_PGA("SPKR PGA", WM8915_RIGHT_PDM_SPEAKER, 4, 0, NULL, 0), | ||
1095 | |||
1096 | SND_SOC_DAPM_PGA_S("HPOUT2L PGA", 0, WM8915_POWER_MANAGEMENT_1, 7, 0, NULL, 0), | ||
1097 | SND_SOC_DAPM_PGA_S("HPOUT2L_DLY", 1, WM8915_ANALOGUE_HP_2, 5, 0, NULL, 0), | ||
1098 | SND_SOC_DAPM_PGA_S("HPOUT2L_DCS", 2, WM8915_DC_SERVO_1, 2, 0, dcs_start, | ||
1099 | SND_SOC_DAPM_POST_PMU), | ||
1100 | SND_SOC_DAPM_PGA_S("HPOUT2L_OUTP", 3, WM8915_ANALOGUE_HP_2, 6, 0, NULL, 0), | ||
1101 | SND_SOC_DAPM_PGA_S("HPOUT2L_RMV_SHORT", 3, SND_SOC_NOPM, HPOUT2L, 0, | ||
1102 | rmv_short_event, | ||
1103 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1104 | |||
1105 | SND_SOC_DAPM_PGA_S("HPOUT2R PGA", 0, WM8915_POWER_MANAGEMENT_1, 6, 0,NULL, 0), | ||
1106 | SND_SOC_DAPM_PGA_S("HPOUT2R_DLY", 1, WM8915_ANALOGUE_HP_2, 1, 0, NULL, 0), | ||
1107 | SND_SOC_DAPM_PGA_S("HPOUT2R_DCS", 2, WM8915_DC_SERVO_1, 3, 0, dcs_start, | ||
1108 | SND_SOC_DAPM_POST_PMU), | ||
1109 | SND_SOC_DAPM_PGA_S("HPOUT2R_OUTP", 3, WM8915_ANALOGUE_HP_2, 2, 0, NULL, 0), | ||
1110 | SND_SOC_DAPM_PGA_S("HPOUT2R_RMV_SHORT", 3, SND_SOC_NOPM, HPOUT2R, 0, | ||
1111 | rmv_short_event, | ||
1112 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1113 | |||
1114 | SND_SOC_DAPM_PGA_S("HPOUT1L PGA", 0, WM8915_POWER_MANAGEMENT_1, 5, 0, NULL, 0), | ||
1115 | SND_SOC_DAPM_PGA_S("HPOUT1L_DLY", 1, WM8915_ANALOGUE_HP_1, 5, 0, NULL, 0), | ||
1116 | SND_SOC_DAPM_PGA_S("HPOUT1L_DCS", 2, WM8915_DC_SERVO_1, 0, 0, dcs_start, | ||
1117 | SND_SOC_DAPM_POST_PMU), | ||
1118 | SND_SOC_DAPM_PGA_S("HPOUT1L_OUTP", 3, WM8915_ANALOGUE_HP_1, 6, 0, NULL, 0), | ||
1119 | SND_SOC_DAPM_PGA_S("HPOUT1L_RMV_SHORT", 3, SND_SOC_NOPM, HPOUT1L, 0, | ||
1120 | rmv_short_event, | ||
1121 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1122 | |||
1123 | SND_SOC_DAPM_PGA_S("HPOUT1R PGA", 0, WM8915_POWER_MANAGEMENT_1, 4, 0, NULL, 0), | ||
1124 | SND_SOC_DAPM_PGA_S("HPOUT1R_DLY", 1, WM8915_ANALOGUE_HP_1, 1, 0, NULL, 0), | ||
1125 | SND_SOC_DAPM_PGA_S("HPOUT1R_DCS", 2, WM8915_DC_SERVO_1, 1, 0, dcs_start, | ||
1126 | SND_SOC_DAPM_POST_PMU), | ||
1127 | SND_SOC_DAPM_PGA_S("HPOUT1R_OUTP", 3, WM8915_ANALOGUE_HP_1, 2, 0, NULL, 0), | ||
1128 | SND_SOC_DAPM_PGA_S("HPOUT1R_RMV_SHORT", 3, SND_SOC_NOPM, HPOUT1R, 0, | ||
1129 | rmv_short_event, | ||
1130 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1131 | |||
1132 | SND_SOC_DAPM_OUTPUT("HPOUT1L"), | ||
1133 | SND_SOC_DAPM_OUTPUT("HPOUT1R"), | ||
1134 | SND_SOC_DAPM_OUTPUT("HPOUT2L"), | ||
1135 | SND_SOC_DAPM_OUTPUT("HPOUT2R"), | ||
1136 | SND_SOC_DAPM_OUTPUT("SPKDAT"), | ||
1137 | }; | ||
1138 | |||
1139 | static const struct snd_soc_dapm_route wm8915_dapm_routes[] = { | ||
1140 | { "AIFCLK", NULL, "SYSCLK" }, | ||
1141 | { "SYSDSPCLK", NULL, "SYSCLK" }, | ||
1142 | { "Charge Pump", NULL, "SYSCLK" }, | ||
1143 | |||
1144 | { "MICB1", NULL, "LDO2" }, | ||
1145 | { "MICB2", NULL, "LDO2" }, | ||
1146 | |||
1147 | { "IN1L PGA", NULL, "IN2LN" }, | ||
1148 | { "IN1L PGA", NULL, "IN2LP" }, | ||
1149 | { "IN1L PGA", NULL, "IN1LN" }, | ||
1150 | { "IN1L PGA", NULL, "IN1LP" }, | ||
1151 | |||
1152 | { "IN1R PGA", NULL, "IN2RN" }, | ||
1153 | { "IN1R PGA", NULL, "IN2RP" }, | ||
1154 | { "IN1R PGA", NULL, "IN1RN" }, | ||
1155 | { "IN1R PGA", NULL, "IN1RP" }, | ||
1156 | |||
1157 | { "ADCL", NULL, "IN1L PGA" }, | ||
1158 | |||
1159 | { "ADCR", NULL, "IN1R PGA" }, | ||
1160 | |||
1161 | { "DMIC1L", NULL, "DMIC1DAT" }, | ||
1162 | { "DMIC1R", NULL, "DMIC1DAT" }, | ||
1163 | { "DMIC2L", NULL, "DMIC2DAT" }, | ||
1164 | { "DMIC2R", NULL, "DMIC2DAT" }, | ||
1165 | |||
1166 | { "DMIC2L", NULL, "DMIC2" }, | ||
1167 | { "DMIC2R", NULL, "DMIC2" }, | ||
1168 | { "DMIC1L", NULL, "DMIC1" }, | ||
1169 | { "DMIC1R", NULL, "DMIC1" }, | ||
1170 | |||
1171 | { "IN1L Mux", "ADC", "ADCL" }, | ||
1172 | { "IN1L Mux", "DMIC1", "DMIC1L" }, | ||
1173 | { "IN1L Mux", "DMIC2", "DMIC2L" }, | ||
1174 | |||
1175 | { "IN1R Mux", "ADC", "ADCR" }, | ||
1176 | { "IN1R Mux", "DMIC1", "DMIC1R" }, | ||
1177 | { "IN1R Mux", "DMIC2", "DMIC2R" }, | ||
1178 | |||
1179 | { "IN2L Mux", "ADC", "ADCL" }, | ||
1180 | { "IN2L Mux", "DMIC1", "DMIC1L" }, | ||
1181 | { "IN2L Mux", "DMIC2", "DMIC2L" }, | ||
1182 | |||
1183 | { "IN2R Mux", "ADC", "ADCR" }, | ||
1184 | { "IN2R Mux", "DMIC1", "DMIC1R" }, | ||
1185 | { "IN2R Mux", "DMIC2", "DMIC2R" }, | ||
1186 | |||
1187 | { "Left Sidetone", "IN1", "IN1L Mux" }, | ||
1188 | { "Left Sidetone", "IN2", "IN2L Mux" }, | ||
1189 | |||
1190 | { "Right Sidetone", "IN1", "IN1R Mux" }, | ||
1191 | { "Right Sidetone", "IN2", "IN2R Mux" }, | ||
1192 | |||
1193 | { "DSP1TXL", "IN1 Switch", "IN1L Mux" }, | ||
1194 | { "DSP1TXR", "IN1 Switch", "IN1R Mux" }, | ||
1195 | |||
1196 | { "DSP2TXL", "IN1 Switch", "IN2L Mux" }, | ||
1197 | { "DSP2TXR", "IN1 Switch", "IN2R Mux" }, | ||
1198 | |||
1199 | { "AIF1TX0", NULL, "DSP1TXL" }, | ||
1200 | { "AIF1TX1", NULL, "DSP1TXR" }, | ||
1201 | { "AIF1TX2", NULL, "DSP2TXL" }, | ||
1202 | { "AIF1TX3", NULL, "DSP2TXR" }, | ||
1203 | { "AIF1TX4", NULL, "AIF2RX0" }, | ||
1204 | { "AIF1TX5", NULL, "AIF2RX1" }, | ||
1205 | |||
1206 | { "AIF1RX0", NULL, "AIFCLK" }, | ||
1207 | { "AIF1RX1", NULL, "AIFCLK" }, | ||
1208 | { "AIF1RX2", NULL, "AIFCLK" }, | ||
1209 | { "AIF1RX3", NULL, "AIFCLK" }, | ||
1210 | { "AIF1RX4", NULL, "AIFCLK" }, | ||
1211 | { "AIF1RX5", NULL, "AIFCLK" }, | ||
1212 | |||
1213 | { "AIF2RX0", NULL, "AIFCLK" }, | ||
1214 | { "AIF2RX1", NULL, "AIFCLK" }, | ||
1215 | |||
1216 | { "DSP1RXL", NULL, "SYSDSPCLK" }, | ||
1217 | { "DSP1RXR", NULL, "SYSDSPCLK" }, | ||
1218 | { "DSP2RXL", NULL, "SYSDSPCLK" }, | ||
1219 | { "DSP2RXR", NULL, "SYSDSPCLK" }, | ||
1220 | { "DSP1TXL", NULL, "SYSDSPCLK" }, | ||
1221 | { "DSP1TXR", NULL, "SYSDSPCLK" }, | ||
1222 | { "DSP2TXL", NULL, "SYSDSPCLK" }, | ||
1223 | { "DSP2TXR", NULL, "SYSDSPCLK" }, | ||
1224 | |||
1225 | { "AIF1RXA", NULL, "AIF1RX0" }, | ||
1226 | { "AIF1RXA", NULL, "AIF1RX1" }, | ||
1227 | { "AIF1RXB", NULL, "AIF1RX2" }, | ||
1228 | { "AIF1RXB", NULL, "AIF1RX3" }, | ||
1229 | { "AIF1RXC", NULL, "AIF1RX4" }, | ||
1230 | { "AIF1RXC", NULL, "AIF1RX5" }, | ||
1231 | |||
1232 | { "AIF2RX", NULL, "AIF2RX0" }, | ||
1233 | { "AIF2RX", NULL, "AIF2RX1" }, | ||
1234 | |||
1235 | { "AIF2TX", "DSP2", "DSP2TX" }, | ||
1236 | { "AIF2TX", "DSP1", "DSP1RX" }, | ||
1237 | { "AIF2TX", "AIF1", "AIF1RXC" }, | ||
1238 | |||
1239 | { "DSP1RXL", NULL, "DSP1RX" }, | ||
1240 | { "DSP1RXR", NULL, "DSP1RX" }, | ||
1241 | { "DSP2RXL", NULL, "DSP2RX" }, | ||
1242 | { "DSP2RXR", NULL, "DSP2RX" }, | ||
1243 | |||
1244 | { "DSP2TX", NULL, "DSP2TXL" }, | ||
1245 | { "DSP2TX", NULL, "DSP2TXR" }, | ||
1246 | |||
1247 | { "DSP1RX", "AIF1", "AIF1RXA" }, | ||
1248 | { "DSP1RX", "AIF2", "AIF2RX" }, | ||
1249 | |||
1250 | { "DSP2RX", "AIF1", "AIF1RXB" }, | ||
1251 | { "DSP2RX", "AIF2", "AIF2RX" }, | ||
1252 | |||
1253 | { "DAC2L Mixer", "DSP2 Switch", "DSP2RXL" }, | ||
1254 | { "DAC2L Mixer", "DSP1 Switch", "DSP1RXL" }, | ||
1255 | { "DAC2L Mixer", "Right Sidetone Switch", "Right Sidetone" }, | ||
1256 | { "DAC2L Mixer", "Left Sidetone Switch", "Left Sidetone" }, | ||
1257 | |||
1258 | { "DAC2R Mixer", "DSP2 Switch", "DSP2RXR" }, | ||
1259 | { "DAC2R Mixer", "DSP1 Switch", "DSP1RXR" }, | ||
1260 | { "DAC2R Mixer", "Right Sidetone Switch", "Right Sidetone" }, | ||
1261 | { "DAC2R Mixer", "Left Sidetone Switch", "Left Sidetone" }, | ||
1262 | |||
1263 | { "DAC1L Mixer", "DSP2 Switch", "DSP2RXL" }, | ||
1264 | { "DAC1L Mixer", "DSP1 Switch", "DSP1RXL" }, | ||
1265 | { "DAC1L Mixer", "Right Sidetone Switch", "Right Sidetone" }, | ||
1266 | { "DAC1L Mixer", "Left Sidetone Switch", "Left Sidetone" }, | ||
1267 | |||
1268 | { "DAC1R Mixer", "DSP2 Switch", "DSP2RXR" }, | ||
1269 | { "DAC1R Mixer", "DSP1 Switch", "DSP1RXR" }, | ||
1270 | { "DAC1R Mixer", "Right Sidetone Switch", "Right Sidetone" }, | ||
1271 | { "DAC1R Mixer", "Left Sidetone Switch", "Left Sidetone" }, | ||
1272 | |||
1273 | { "DAC1L", NULL, "DAC1L Mixer" }, | ||
1274 | { "DAC1R", NULL, "DAC1R Mixer" }, | ||
1275 | { "DAC2L", NULL, "DAC2L Mixer" }, | ||
1276 | { "DAC2R", NULL, "DAC2R Mixer" }, | ||
1277 | |||
1278 | { "HPOUT2L PGA", NULL, "Charge Pump" }, | ||
1279 | { "HPOUT2L PGA", NULL, "DAC2L" }, | ||
1280 | { "HPOUT2L_DLY", NULL, "HPOUT2L PGA" }, | ||
1281 | { "HPOUT2L_DCS", NULL, "HPOUT2L_DLY" }, | ||
1282 | { "HPOUT2L_OUTP", NULL, "HPOUT2L_DCS" }, | ||
1283 | { "HPOUT2L_RMV_SHORT", NULL, "HPOUT2L_OUTP" }, | ||
1284 | |||
1285 | { "HPOUT2R PGA", NULL, "Charge Pump" }, | ||
1286 | { "HPOUT2R PGA", NULL, "DAC2R" }, | ||
1287 | { "HPOUT2R_DLY", NULL, "HPOUT2R PGA" }, | ||
1288 | { "HPOUT2R_DCS", NULL, "HPOUT2R_DLY" }, | ||
1289 | { "HPOUT2R_OUTP", NULL, "HPOUT2R_DCS" }, | ||
1290 | { "HPOUT2R_RMV_SHORT", NULL, "HPOUT2R_OUTP" }, | ||
1291 | |||
1292 | { "HPOUT1L PGA", NULL, "Charge Pump" }, | ||
1293 | { "HPOUT1L PGA", NULL, "DAC1L" }, | ||
1294 | { "HPOUT1L_DLY", NULL, "HPOUT1L PGA" }, | ||
1295 | { "HPOUT1L_DCS", NULL, "HPOUT1L_DLY" }, | ||
1296 | { "HPOUT1L_OUTP", NULL, "HPOUT1L_DCS" }, | ||
1297 | { "HPOUT1L_RMV_SHORT", NULL, "HPOUT1L_OUTP" }, | ||
1298 | |||
1299 | { "HPOUT1R PGA", NULL, "Charge Pump" }, | ||
1300 | { "HPOUT1R PGA", NULL, "DAC1R" }, | ||
1301 | { "HPOUT1R_DLY", NULL, "HPOUT1R PGA" }, | ||
1302 | { "HPOUT1R_DCS", NULL, "HPOUT1R_DLY" }, | ||
1303 | { "HPOUT1R_OUTP", NULL, "HPOUT1R_DCS" }, | ||
1304 | { "HPOUT1R_RMV_SHORT", NULL, "HPOUT1R_OUTP" }, | ||
1305 | |||
1306 | { "HPOUT2L", NULL, "HPOUT2L_RMV_SHORT" }, | ||
1307 | { "HPOUT2R", NULL, "HPOUT2R_RMV_SHORT" }, | ||
1308 | { "HPOUT1L", NULL, "HPOUT1L_RMV_SHORT" }, | ||
1309 | { "HPOUT1R", NULL, "HPOUT1R_RMV_SHORT" }, | ||
1310 | |||
1311 | { "SPKL", "DAC1L", "DAC1L" }, | ||
1312 | { "SPKL", "DAC1R", "DAC1R" }, | ||
1313 | { "SPKL", "DAC2L", "DAC2L" }, | ||
1314 | { "SPKL", "DAC2R", "DAC2R" }, | ||
1315 | |||
1316 | { "SPKR", "DAC1L", "DAC1L" }, | ||
1317 | { "SPKR", "DAC1R", "DAC1R" }, | ||
1318 | { "SPKR", "DAC2L", "DAC2L" }, | ||
1319 | { "SPKR", "DAC2R", "DAC2R" }, | ||
1320 | |||
1321 | { "SPKL PGA", NULL, "SPKL" }, | ||
1322 | { "SPKR PGA", NULL, "SPKR" }, | ||
1323 | |||
1324 | { "SPKDAT", NULL, "SPKL PGA" }, | ||
1325 | { "SPKDAT", NULL, "SPKR PGA" }, | ||
1326 | }; | ||
1327 | |||
1328 | static int wm8915_readable_register(struct snd_soc_codec *codec, | ||
1329 | unsigned int reg) | ||
1330 | { | ||
1331 | /* Due to the sparseness of the register map the compiler | ||
1332 | * output from an explicit switch statement ends up being much | ||
1333 | * more efficient than a table. | ||
1334 | */ | ||
1335 | switch (reg) { | ||
1336 | case WM8915_SOFTWARE_RESET: | ||
1337 | case WM8915_POWER_MANAGEMENT_1: | ||
1338 | case WM8915_POWER_MANAGEMENT_2: | ||
1339 | case WM8915_POWER_MANAGEMENT_3: | ||
1340 | case WM8915_POWER_MANAGEMENT_4: | ||
1341 | case WM8915_POWER_MANAGEMENT_5: | ||
1342 | case WM8915_POWER_MANAGEMENT_6: | ||
1343 | case WM8915_POWER_MANAGEMENT_7: | ||
1344 | case WM8915_POWER_MANAGEMENT_8: | ||
1345 | case WM8915_LEFT_LINE_INPUT_VOLUME: | ||
1346 | case WM8915_RIGHT_LINE_INPUT_VOLUME: | ||
1347 | case WM8915_LINE_INPUT_CONTROL: | ||
1348 | case WM8915_DAC1_HPOUT1_VOLUME: | ||
1349 | case WM8915_DAC2_HPOUT2_VOLUME: | ||
1350 | case WM8915_DAC1_LEFT_VOLUME: | ||
1351 | case WM8915_DAC1_RIGHT_VOLUME: | ||
1352 | case WM8915_DAC2_LEFT_VOLUME: | ||
1353 | case WM8915_DAC2_RIGHT_VOLUME: | ||
1354 | case WM8915_OUTPUT1_LEFT_VOLUME: | ||
1355 | case WM8915_OUTPUT1_RIGHT_VOLUME: | ||
1356 | case WM8915_OUTPUT2_LEFT_VOLUME: | ||
1357 | case WM8915_OUTPUT2_RIGHT_VOLUME: | ||
1358 | case WM8915_MICBIAS_1: | ||
1359 | case WM8915_MICBIAS_2: | ||
1360 | case WM8915_LDO_1: | ||
1361 | case WM8915_LDO_2: | ||
1362 | case WM8915_ACCESSORY_DETECT_MODE_1: | ||
1363 | case WM8915_ACCESSORY_DETECT_MODE_2: | ||
1364 | case WM8915_HEADPHONE_DETECT_1: | ||
1365 | case WM8915_HEADPHONE_DETECT_2: | ||
1366 | case WM8915_MIC_DETECT_1: | ||
1367 | case WM8915_MIC_DETECT_2: | ||
1368 | case WM8915_MIC_DETECT_3: | ||
1369 | case WM8915_CHARGE_PUMP_1: | ||
1370 | case WM8915_CHARGE_PUMP_2: | ||
1371 | case WM8915_DC_SERVO_1: | ||
1372 | case WM8915_DC_SERVO_2: | ||
1373 | case WM8915_DC_SERVO_3: | ||
1374 | case WM8915_DC_SERVO_5: | ||
1375 | case WM8915_DC_SERVO_6: | ||
1376 | case WM8915_DC_SERVO_7: | ||
1377 | case WM8915_DC_SERVO_READBACK_0: | ||
1378 | case WM8915_ANALOGUE_HP_1: | ||
1379 | case WM8915_ANALOGUE_HP_2: | ||
1380 | case WM8915_CHIP_REVISION: | ||
1381 | case WM8915_CONTROL_INTERFACE_1: | ||
1382 | case WM8915_WRITE_SEQUENCER_CTRL_1: | ||
1383 | case WM8915_WRITE_SEQUENCER_CTRL_2: | ||
1384 | case WM8915_AIF_CLOCKING_1: | ||
1385 | case WM8915_AIF_CLOCKING_2: | ||
1386 | case WM8915_CLOCKING_1: | ||
1387 | case WM8915_CLOCKING_2: | ||
1388 | case WM8915_AIF_RATE: | ||
1389 | case WM8915_FLL_CONTROL_1: | ||
1390 | case WM8915_FLL_CONTROL_2: | ||
1391 | case WM8915_FLL_CONTROL_3: | ||
1392 | case WM8915_FLL_CONTROL_4: | ||
1393 | case WM8915_FLL_CONTROL_5: | ||
1394 | case WM8915_FLL_CONTROL_6: | ||
1395 | case WM8915_FLL_EFS_1: | ||
1396 | case WM8915_FLL_EFS_2: | ||
1397 | case WM8915_AIF1_CONTROL: | ||
1398 | case WM8915_AIF1_BCLK: | ||
1399 | case WM8915_AIF1_TX_LRCLK_1: | ||
1400 | case WM8915_AIF1_TX_LRCLK_2: | ||
1401 | case WM8915_AIF1_RX_LRCLK_1: | ||
1402 | case WM8915_AIF1_RX_LRCLK_2: | ||
1403 | case WM8915_AIF1TX_DATA_CONFIGURATION_1: | ||
1404 | case WM8915_AIF1TX_DATA_CONFIGURATION_2: | ||
1405 | case WM8915_AIF1RX_DATA_CONFIGURATION: | ||
1406 | case WM8915_AIF1TX_CHANNEL_0_CONFIGURATION: | ||
1407 | case WM8915_AIF1TX_CHANNEL_1_CONFIGURATION: | ||
1408 | case WM8915_AIF1TX_CHANNEL_2_CONFIGURATION: | ||
1409 | case WM8915_AIF1TX_CHANNEL_3_CONFIGURATION: | ||
1410 | case WM8915_AIF1TX_CHANNEL_4_CONFIGURATION: | ||
1411 | case WM8915_AIF1TX_CHANNEL_5_CONFIGURATION: | ||
1412 | case WM8915_AIF1RX_CHANNEL_0_CONFIGURATION: | ||
1413 | case WM8915_AIF1RX_CHANNEL_1_CONFIGURATION: | ||
1414 | case WM8915_AIF1RX_CHANNEL_2_CONFIGURATION: | ||
1415 | case WM8915_AIF1RX_CHANNEL_3_CONFIGURATION: | ||
1416 | case WM8915_AIF1RX_CHANNEL_4_CONFIGURATION: | ||
1417 | case WM8915_AIF1RX_CHANNEL_5_CONFIGURATION: | ||
1418 | case WM8915_AIF1RX_MONO_CONFIGURATION: | ||
1419 | case WM8915_AIF1TX_TEST: | ||
1420 | case WM8915_AIF2_CONTROL: | ||
1421 | case WM8915_AIF2_BCLK: | ||
1422 | case WM8915_AIF2_TX_LRCLK_1: | ||
1423 | case WM8915_AIF2_TX_LRCLK_2: | ||
1424 | case WM8915_AIF2_RX_LRCLK_1: | ||
1425 | case WM8915_AIF2_RX_LRCLK_2: | ||
1426 | case WM8915_AIF2TX_DATA_CONFIGURATION_1: | ||
1427 | case WM8915_AIF2TX_DATA_CONFIGURATION_2: | ||
1428 | case WM8915_AIF2RX_DATA_CONFIGURATION: | ||
1429 | case WM8915_AIF2TX_CHANNEL_0_CONFIGURATION: | ||
1430 | case WM8915_AIF2TX_CHANNEL_1_CONFIGURATION: | ||
1431 | case WM8915_AIF2RX_CHANNEL_0_CONFIGURATION: | ||
1432 | case WM8915_AIF2RX_CHANNEL_1_CONFIGURATION: | ||
1433 | case WM8915_AIF2RX_MONO_CONFIGURATION: | ||
1434 | case WM8915_AIF2TX_TEST: | ||
1435 | case WM8915_DSP1_TX_LEFT_VOLUME: | ||
1436 | case WM8915_DSP1_TX_RIGHT_VOLUME: | ||
1437 | case WM8915_DSP1_RX_LEFT_VOLUME: | ||
1438 | case WM8915_DSP1_RX_RIGHT_VOLUME: | ||
1439 | case WM8915_DSP1_TX_FILTERS: | ||
1440 | case WM8915_DSP1_RX_FILTERS_1: | ||
1441 | case WM8915_DSP1_RX_FILTERS_2: | ||
1442 | case WM8915_DSP1_DRC_1: | ||
1443 | case WM8915_DSP1_DRC_2: | ||
1444 | case WM8915_DSP1_DRC_3: | ||
1445 | case WM8915_DSP1_DRC_4: | ||
1446 | case WM8915_DSP1_DRC_5: | ||
1447 | case WM8915_DSP1_RX_EQ_GAINS_1: | ||
1448 | case WM8915_DSP1_RX_EQ_GAINS_2: | ||
1449 | case WM8915_DSP1_RX_EQ_BAND_1_A: | ||
1450 | case WM8915_DSP1_RX_EQ_BAND_1_B: | ||
1451 | case WM8915_DSP1_RX_EQ_BAND_1_PG: | ||
1452 | case WM8915_DSP1_RX_EQ_BAND_2_A: | ||
1453 | case WM8915_DSP1_RX_EQ_BAND_2_B: | ||
1454 | case WM8915_DSP1_RX_EQ_BAND_2_C: | ||
1455 | case WM8915_DSP1_RX_EQ_BAND_2_PG: | ||
1456 | case WM8915_DSP1_RX_EQ_BAND_3_A: | ||
1457 | case WM8915_DSP1_RX_EQ_BAND_3_B: | ||
1458 | case WM8915_DSP1_RX_EQ_BAND_3_C: | ||
1459 | case WM8915_DSP1_RX_EQ_BAND_3_PG: | ||
1460 | case WM8915_DSP1_RX_EQ_BAND_4_A: | ||
1461 | case WM8915_DSP1_RX_EQ_BAND_4_B: | ||
1462 | case WM8915_DSP1_RX_EQ_BAND_4_C: | ||
1463 | case WM8915_DSP1_RX_EQ_BAND_4_PG: | ||
1464 | case WM8915_DSP1_RX_EQ_BAND_5_A: | ||
1465 | case WM8915_DSP1_RX_EQ_BAND_5_B: | ||
1466 | case WM8915_DSP1_RX_EQ_BAND_5_PG: | ||
1467 | case WM8915_DSP2_TX_LEFT_VOLUME: | ||
1468 | case WM8915_DSP2_TX_RIGHT_VOLUME: | ||
1469 | case WM8915_DSP2_RX_LEFT_VOLUME: | ||
1470 | case WM8915_DSP2_RX_RIGHT_VOLUME: | ||
1471 | case WM8915_DSP2_TX_FILTERS: | ||
1472 | case WM8915_DSP2_RX_FILTERS_1: | ||
1473 | case WM8915_DSP2_RX_FILTERS_2: | ||
1474 | case WM8915_DSP2_DRC_1: | ||
1475 | case WM8915_DSP2_DRC_2: | ||
1476 | case WM8915_DSP2_DRC_3: | ||
1477 | case WM8915_DSP2_DRC_4: | ||
1478 | case WM8915_DSP2_DRC_5: | ||
1479 | case WM8915_DSP2_RX_EQ_GAINS_1: | ||
1480 | case WM8915_DSP2_RX_EQ_GAINS_2: | ||
1481 | case WM8915_DSP2_RX_EQ_BAND_1_A: | ||
1482 | case WM8915_DSP2_RX_EQ_BAND_1_B: | ||
1483 | case WM8915_DSP2_RX_EQ_BAND_1_PG: | ||
1484 | case WM8915_DSP2_RX_EQ_BAND_2_A: | ||
1485 | case WM8915_DSP2_RX_EQ_BAND_2_B: | ||
1486 | case WM8915_DSP2_RX_EQ_BAND_2_C: | ||
1487 | case WM8915_DSP2_RX_EQ_BAND_2_PG: | ||
1488 | case WM8915_DSP2_RX_EQ_BAND_3_A: | ||
1489 | case WM8915_DSP2_RX_EQ_BAND_3_B: | ||
1490 | case WM8915_DSP2_RX_EQ_BAND_3_C: | ||
1491 | case WM8915_DSP2_RX_EQ_BAND_3_PG: | ||
1492 | case WM8915_DSP2_RX_EQ_BAND_4_A: | ||
1493 | case WM8915_DSP2_RX_EQ_BAND_4_B: | ||
1494 | case WM8915_DSP2_RX_EQ_BAND_4_C: | ||
1495 | case WM8915_DSP2_RX_EQ_BAND_4_PG: | ||
1496 | case WM8915_DSP2_RX_EQ_BAND_5_A: | ||
1497 | case WM8915_DSP2_RX_EQ_BAND_5_B: | ||
1498 | case WM8915_DSP2_RX_EQ_BAND_5_PG: | ||
1499 | case WM8915_DAC1_MIXER_VOLUMES: | ||
1500 | case WM8915_DAC1_LEFT_MIXER_ROUTING: | ||
1501 | case WM8915_DAC1_RIGHT_MIXER_ROUTING: | ||
1502 | case WM8915_DAC2_MIXER_VOLUMES: | ||
1503 | case WM8915_DAC2_LEFT_MIXER_ROUTING: | ||
1504 | case WM8915_DAC2_RIGHT_MIXER_ROUTING: | ||
1505 | case WM8915_DSP1_TX_LEFT_MIXER_ROUTING: | ||
1506 | case WM8915_DSP1_TX_RIGHT_MIXER_ROUTING: | ||
1507 | case WM8915_DSP2_TX_LEFT_MIXER_ROUTING: | ||
1508 | case WM8915_DSP2_TX_RIGHT_MIXER_ROUTING: | ||
1509 | case WM8915_DSP_TX_MIXER_SELECT: | ||
1510 | case WM8915_DAC_SOFTMUTE: | ||
1511 | case WM8915_OVERSAMPLING: | ||
1512 | case WM8915_SIDETONE: | ||
1513 | case WM8915_GPIO_1: | ||
1514 | case WM8915_GPIO_2: | ||
1515 | case WM8915_GPIO_3: | ||
1516 | case WM8915_GPIO_4: | ||
1517 | case WM8915_GPIO_5: | ||
1518 | case WM8915_PULL_CONTROL_1: | ||
1519 | case WM8915_PULL_CONTROL_2: | ||
1520 | case WM8915_INTERRUPT_STATUS_1: | ||
1521 | case WM8915_INTERRUPT_STATUS_2: | ||
1522 | case WM8915_INTERRUPT_RAW_STATUS_2: | ||
1523 | case WM8915_INTERRUPT_STATUS_1_MASK: | ||
1524 | case WM8915_INTERRUPT_STATUS_2_MASK: | ||
1525 | case WM8915_INTERRUPT_CONTROL: | ||
1526 | case WM8915_LEFT_PDM_SPEAKER: | ||
1527 | case WM8915_RIGHT_PDM_SPEAKER: | ||
1528 | case WM8915_PDM_SPEAKER_MUTE_SEQUENCE: | ||
1529 | case WM8915_PDM_SPEAKER_VOLUME: | ||
1530 | return 1; | ||
1531 | default: | ||
1532 | return 0; | ||
1533 | } | ||
1534 | } | ||
1535 | |||
1536 | static int wm8915_volatile_register(struct snd_soc_codec *codec, | ||
1537 | unsigned int reg) | ||
1538 | { | ||
1539 | switch (reg) { | ||
1540 | case WM8915_SOFTWARE_RESET: | ||
1541 | case WM8915_CHIP_REVISION: | ||
1542 | case WM8915_LDO_1: | ||
1543 | case WM8915_LDO_2: | ||
1544 | case WM8915_INTERRUPT_STATUS_1: | ||
1545 | case WM8915_INTERRUPT_STATUS_2: | ||
1546 | case WM8915_INTERRUPT_RAW_STATUS_2: | ||
1547 | case WM8915_DC_SERVO_READBACK_0: | ||
1548 | case WM8915_DC_SERVO_2: | ||
1549 | case WM8915_DC_SERVO_6: | ||
1550 | case WM8915_DC_SERVO_7: | ||
1551 | case WM8915_FLL_CONTROL_6: | ||
1552 | case WM8915_MIC_DETECT_3: | ||
1553 | case WM8915_HEADPHONE_DETECT_1: | ||
1554 | case WM8915_HEADPHONE_DETECT_2: | ||
1555 | return 1; | ||
1556 | default: | ||
1557 | return 0; | ||
1558 | } | ||
1559 | } | ||
1560 | |||
1561 | static int wm8915_reset(struct snd_soc_codec *codec) | ||
1562 | { | ||
1563 | return snd_soc_write(codec, WM8915_SOFTWARE_RESET, 0x8915); | ||
1564 | } | ||
1565 | |||
1566 | static const int bclk_divs[] = { | ||
1567 | 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96 | ||
1568 | }; | ||
1569 | |||
1570 | static void wm8915_update_bclk(struct snd_soc_codec *codec) | ||
1571 | { | ||
1572 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
1573 | int aif, best, cur_val, bclk_rate, bclk_reg, i; | ||
1574 | |||
1575 | /* Don't bother if we're in a low frequency idle mode that | ||
1576 | * can't support audio. | ||
1577 | */ | ||
1578 | if (wm8915->sysclk < 64000) | ||
1579 | return; | ||
1580 | |||
1581 | for (aif = 0; aif < WM8915_AIFS; aif++) { | ||
1582 | switch (aif) { | ||
1583 | case 0: | ||
1584 | bclk_reg = WM8915_AIF1_BCLK; | ||
1585 | break; | ||
1586 | case 1: | ||
1587 | bclk_reg = WM8915_AIF2_BCLK; | ||
1588 | break; | ||
1589 | } | ||
1590 | |||
1591 | bclk_rate = wm8915->bclk_rate[aif]; | ||
1592 | |||
1593 | /* Pick a divisor for BCLK as close as we can get to ideal */ | ||
1594 | best = 0; | ||
1595 | for (i = 0; i < ARRAY_SIZE(bclk_divs); i++) { | ||
1596 | cur_val = (wm8915->sysclk / bclk_divs[i]) - bclk_rate; | ||
1597 | if (cur_val < 0) /* BCLK table is sorted */ | ||
1598 | break; | ||
1599 | best = i; | ||
1600 | } | ||
1601 | bclk_rate = wm8915->sysclk / bclk_divs[best]; | ||
1602 | dev_dbg(codec->dev, "Using BCLK_DIV %d for actual BCLK %dHz\n", | ||
1603 | bclk_divs[best], bclk_rate); | ||
1604 | |||
1605 | snd_soc_update_bits(codec, bclk_reg, | ||
1606 | WM8915_AIF1_BCLK_DIV_MASK, best); | ||
1607 | } | ||
1608 | } | ||
1609 | |||
1610 | static int wm8915_set_bias_level(struct snd_soc_codec *codec, | ||
1611 | enum snd_soc_bias_level level) | ||
1612 | { | ||
1613 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
1614 | int ret; | ||
1615 | |||
1616 | switch (level) { | ||
1617 | case SND_SOC_BIAS_ON: | ||
1618 | break; | ||
1619 | |||
1620 | case SND_SOC_BIAS_PREPARE: | ||
1621 | if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) { | ||
1622 | snd_soc_update_bits(codec, WM8915_POWER_MANAGEMENT_1, | ||
1623 | WM8915_BG_ENA, WM8915_BG_ENA); | ||
1624 | msleep(2); | ||
1625 | } | ||
1626 | break; | ||
1627 | |||
1628 | case SND_SOC_BIAS_STANDBY: | ||
1629 | if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { | ||
1630 | ret = regulator_bulk_enable(ARRAY_SIZE(wm8915->supplies), | ||
1631 | wm8915->supplies); | ||
1632 | if (ret != 0) { | ||
1633 | dev_err(codec->dev, | ||
1634 | "Failed to enable supplies: %d\n", | ||
1635 | ret); | ||
1636 | return ret; | ||
1637 | } | ||
1638 | |||
1639 | if (wm8915->pdata.ldo_ena >= 0) { | ||
1640 | gpio_set_value_cansleep(wm8915->pdata.ldo_ena, | ||
1641 | 1); | ||
1642 | msleep(5); | ||
1643 | } | ||
1644 | |||
1645 | codec->cache_only = false; | ||
1646 | snd_soc_cache_sync(codec); | ||
1647 | } | ||
1648 | |||
1649 | snd_soc_update_bits(codec, WM8915_POWER_MANAGEMENT_1, | ||
1650 | WM8915_BG_ENA, 0); | ||
1651 | break; | ||
1652 | |||
1653 | case SND_SOC_BIAS_OFF: | ||
1654 | codec->cache_only = true; | ||
1655 | if (wm8915->pdata.ldo_ena >= 0) | ||
1656 | gpio_set_value_cansleep(wm8915->pdata.ldo_ena, 0); | ||
1657 | regulator_bulk_disable(ARRAY_SIZE(wm8915->supplies), | ||
1658 | wm8915->supplies); | ||
1659 | break; | ||
1660 | } | ||
1661 | |||
1662 | codec->dapm.bias_level = level; | ||
1663 | |||
1664 | return 0; | ||
1665 | } | ||
1666 | |||
1667 | static int wm8915_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
1668 | { | ||
1669 | struct snd_soc_codec *codec = dai->codec; | ||
1670 | int aifctrl = 0; | ||
1671 | int bclk = 0; | ||
1672 | int lrclk_tx = 0; | ||
1673 | int lrclk_rx = 0; | ||
1674 | int aifctrl_reg, bclk_reg, lrclk_tx_reg, lrclk_rx_reg; | ||
1675 | |||
1676 | switch (dai->id) { | ||
1677 | case 0: | ||
1678 | aifctrl_reg = WM8915_AIF1_CONTROL; | ||
1679 | bclk_reg = WM8915_AIF1_BCLK; | ||
1680 | lrclk_tx_reg = WM8915_AIF1_TX_LRCLK_2; | ||
1681 | lrclk_rx_reg = WM8915_AIF1_RX_LRCLK_2; | ||
1682 | break; | ||
1683 | case 1: | ||
1684 | aifctrl_reg = WM8915_AIF2_CONTROL; | ||
1685 | bclk_reg = WM8915_AIF2_BCLK; | ||
1686 | lrclk_tx_reg = WM8915_AIF2_TX_LRCLK_2; | ||
1687 | lrclk_rx_reg = WM8915_AIF2_RX_LRCLK_2; | ||
1688 | break; | ||
1689 | default: | ||
1690 | BUG(); | ||
1691 | return -EINVAL; | ||
1692 | } | ||
1693 | |||
1694 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { | ||
1695 | case SND_SOC_DAIFMT_NB_NF: | ||
1696 | break; | ||
1697 | case SND_SOC_DAIFMT_IB_NF: | ||
1698 | bclk |= WM8915_AIF1_BCLK_INV; | ||
1699 | break; | ||
1700 | case SND_SOC_DAIFMT_NB_IF: | ||
1701 | lrclk_tx |= WM8915_AIF1TX_LRCLK_INV; | ||
1702 | lrclk_rx |= WM8915_AIF1RX_LRCLK_INV; | ||
1703 | break; | ||
1704 | case SND_SOC_DAIFMT_IB_IF: | ||
1705 | bclk |= WM8915_AIF1_BCLK_INV; | ||
1706 | lrclk_tx |= WM8915_AIF1TX_LRCLK_INV; | ||
1707 | lrclk_rx |= WM8915_AIF1RX_LRCLK_INV; | ||
1708 | break; | ||
1709 | } | ||
1710 | |||
1711 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | ||
1712 | case SND_SOC_DAIFMT_CBS_CFS: | ||
1713 | break; | ||
1714 | case SND_SOC_DAIFMT_CBS_CFM: | ||
1715 | lrclk_tx |= WM8915_AIF1TX_LRCLK_MSTR; | ||
1716 | lrclk_rx |= WM8915_AIF1RX_LRCLK_MSTR; | ||
1717 | break; | ||
1718 | case SND_SOC_DAIFMT_CBM_CFS: | ||
1719 | bclk |= WM8915_AIF1_BCLK_MSTR; | ||
1720 | break; | ||
1721 | case SND_SOC_DAIFMT_CBM_CFM: | ||
1722 | bclk |= WM8915_AIF1_BCLK_MSTR; | ||
1723 | lrclk_tx |= WM8915_AIF1TX_LRCLK_MSTR; | ||
1724 | lrclk_rx |= WM8915_AIF1RX_LRCLK_MSTR; | ||
1725 | break; | ||
1726 | default: | ||
1727 | return -EINVAL; | ||
1728 | } | ||
1729 | |||
1730 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | ||
1731 | case SND_SOC_DAIFMT_DSP_A: | ||
1732 | break; | ||
1733 | case SND_SOC_DAIFMT_DSP_B: | ||
1734 | aifctrl |= 1; | ||
1735 | break; | ||
1736 | case SND_SOC_DAIFMT_I2S: | ||
1737 | aifctrl |= 2; | ||
1738 | break; | ||
1739 | case SND_SOC_DAIFMT_LEFT_J: | ||
1740 | aifctrl |= 3; | ||
1741 | break; | ||
1742 | default: | ||
1743 | return -EINVAL; | ||
1744 | } | ||
1745 | |||
1746 | snd_soc_update_bits(codec, aifctrl_reg, WM8915_AIF1_FMT_MASK, aifctrl); | ||
1747 | snd_soc_update_bits(codec, bclk_reg, | ||
1748 | WM8915_AIF1_BCLK_INV | WM8915_AIF1_BCLK_MSTR, | ||
1749 | bclk); | ||
1750 | snd_soc_update_bits(codec, lrclk_tx_reg, | ||
1751 | WM8915_AIF1TX_LRCLK_INV | | ||
1752 | WM8915_AIF1TX_LRCLK_MSTR, | ||
1753 | lrclk_tx); | ||
1754 | snd_soc_update_bits(codec, lrclk_rx_reg, | ||
1755 | WM8915_AIF1RX_LRCLK_INV | | ||
1756 | WM8915_AIF1RX_LRCLK_MSTR, | ||
1757 | lrclk_rx); | ||
1758 | |||
1759 | return 0; | ||
1760 | } | ||
1761 | |||
1762 | static const int dsp_divs[] = { | ||
1763 | 48000, 32000, 16000, 8000 | ||
1764 | }; | ||
1765 | |||
1766 | static int wm8915_hw_params(struct snd_pcm_substream *substream, | ||
1767 | struct snd_pcm_hw_params *params, | ||
1768 | struct snd_soc_dai *dai) | ||
1769 | { | ||
1770 | struct snd_soc_codec *codec = dai->codec; | ||
1771 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
1772 | int bits, i, bclk_rate; | ||
1773 | int aifdata = 0; | ||
1774 | int lrclk = 0; | ||
1775 | int dsp = 0; | ||
1776 | int aifdata_reg, lrclk_reg, dsp_shift; | ||
1777 | |||
1778 | switch (dai->id) { | ||
1779 | case 0: | ||
1780 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || | ||
1781 | (snd_soc_read(codec, WM8915_GPIO_1)) & WM8915_GP1_FN_MASK) { | ||
1782 | aifdata_reg = WM8915_AIF1RX_DATA_CONFIGURATION; | ||
1783 | lrclk_reg = WM8915_AIF1_RX_LRCLK_1; | ||
1784 | } else { | ||
1785 | aifdata_reg = WM8915_AIF1TX_DATA_CONFIGURATION_1; | ||
1786 | lrclk_reg = WM8915_AIF1_TX_LRCLK_1; | ||
1787 | } | ||
1788 | dsp_shift = 0; | ||
1789 | break; | ||
1790 | case 1: | ||
1791 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || | ||
1792 | (snd_soc_read(codec, WM8915_GPIO_2)) & WM8915_GP2_FN_MASK) { | ||
1793 | aifdata_reg = WM8915_AIF2RX_DATA_CONFIGURATION; | ||
1794 | lrclk_reg = WM8915_AIF2_RX_LRCLK_1; | ||
1795 | } else { | ||
1796 | aifdata_reg = WM8915_AIF2TX_DATA_CONFIGURATION_1; | ||
1797 | lrclk_reg = WM8915_AIF2_TX_LRCLK_1; | ||
1798 | } | ||
1799 | dsp_shift = WM8915_DSP2_DIV_SHIFT; | ||
1800 | break; | ||
1801 | default: | ||
1802 | BUG(); | ||
1803 | return -EINVAL; | ||
1804 | } | ||
1805 | |||
1806 | bclk_rate = snd_soc_params_to_bclk(params); | ||
1807 | if (bclk_rate < 0) { | ||
1808 | dev_err(codec->dev, "Unsupported BCLK rate: %d\n", bclk_rate); | ||
1809 | return bclk_rate; | ||
1810 | } | ||
1811 | |||
1812 | wm8915->bclk_rate[dai->id] = bclk_rate; | ||
1813 | wm8915->rx_rate[dai->id] = params_rate(params); | ||
1814 | |||
1815 | /* Needs looking at for TDM */ | ||
1816 | bits = snd_pcm_format_width(params_format(params)); | ||
1817 | if (bits < 0) | ||
1818 | return bits; | ||
1819 | aifdata |= (bits << WM8915_AIF1TX_WL_SHIFT) | bits; | ||
1820 | |||
1821 | for (i = 0; i < ARRAY_SIZE(dsp_divs); i++) { | ||
1822 | if (dsp_divs[i] == params_rate(params)) | ||
1823 | break; | ||
1824 | } | ||
1825 | if (i == ARRAY_SIZE(dsp_divs)) { | ||
1826 | dev_err(codec->dev, "Unsupported sample rate %dHz\n", | ||
1827 | params_rate(params)); | ||
1828 | return -EINVAL; | ||
1829 | } | ||
1830 | dsp |= i << dsp_shift; | ||
1831 | |||
1832 | wm8915_update_bclk(codec); | ||
1833 | |||
1834 | lrclk = bclk_rate / params_rate(params); | ||
1835 | dev_dbg(dai->dev, "Using LRCLK rate %d for actual LRCLK %dHz\n", | ||
1836 | lrclk, bclk_rate / lrclk); | ||
1837 | |||
1838 | snd_soc_update_bits(codec, aifdata_reg, | ||
1839 | WM8915_AIF1TX_WL_MASK | | ||
1840 | WM8915_AIF1TX_SLOT_LEN_MASK, | ||
1841 | aifdata); | ||
1842 | snd_soc_update_bits(codec, lrclk_reg, WM8915_AIF1RX_RATE_MASK, | ||
1843 | lrclk); | ||
1844 | snd_soc_update_bits(codec, WM8915_AIF_CLOCKING_2, | ||
1845 | WM8915_DSP1_DIV_SHIFT << dsp_shift, dsp); | ||
1846 | |||
1847 | return 0; | ||
1848 | } | ||
1849 | |||
1850 | static int wm8915_set_sysclk(struct snd_soc_dai *dai, | ||
1851 | int clk_id, unsigned int freq, int dir) | ||
1852 | { | ||
1853 | struct snd_soc_codec *codec = dai->codec; | ||
1854 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
1855 | int lfclk = 0; | ||
1856 | int ratediv = 0; | ||
1857 | int src; | ||
1858 | int old; | ||
1859 | |||
1860 | if (freq == wm8915->sysclk && clk_id == wm8915->sysclk_src) | ||
1861 | return 0; | ||
1862 | |||
1863 | /* Disable SYSCLK while we reconfigure */ | ||
1864 | old = snd_soc_read(codec, WM8915_AIF_CLOCKING_1) & WM8915_SYSCLK_ENA; | ||
1865 | snd_soc_update_bits(codec, WM8915_AIF_CLOCKING_1, | ||
1866 | WM8915_SYSCLK_ENA, 0); | ||
1867 | |||
1868 | switch (clk_id) { | ||
1869 | case WM8915_SYSCLK_MCLK1: | ||
1870 | wm8915->sysclk = freq; | ||
1871 | src = 0; | ||
1872 | break; | ||
1873 | case WM8915_SYSCLK_MCLK2: | ||
1874 | wm8915->sysclk = freq; | ||
1875 | src = 1; | ||
1876 | break; | ||
1877 | case WM8915_SYSCLK_FLL: | ||
1878 | wm8915->sysclk = freq; | ||
1879 | src = 2; | ||
1880 | break; | ||
1881 | default: | ||
1882 | dev_err(codec->dev, "Unsupported clock source %d\n", clk_id); | ||
1883 | return -EINVAL; | ||
1884 | } | ||
1885 | |||
1886 | switch (wm8915->sysclk) { | ||
1887 | case 6144000: | ||
1888 | snd_soc_update_bits(codec, WM8915_AIF_RATE, | ||
1889 | WM8915_SYSCLK_RATE, 0); | ||
1890 | break; | ||
1891 | case 24576000: | ||
1892 | ratediv = WM8915_SYSCLK_DIV; | ||
1893 | case 12288000: | ||
1894 | snd_soc_update_bits(codec, WM8915_AIF_RATE, | ||
1895 | WM8915_SYSCLK_RATE, WM8915_SYSCLK_RATE); | ||
1896 | break; | ||
1897 | case 32000: | ||
1898 | case 32768: | ||
1899 | lfclk = WM8915_LFCLK_ENA; | ||
1900 | break; | ||
1901 | default: | ||
1902 | dev_warn(codec->dev, "Unsupported clock rate %dHz\n", | ||
1903 | wm8915->sysclk); | ||
1904 | return -EINVAL; | ||
1905 | } | ||
1906 | |||
1907 | wm8915_update_bclk(codec); | ||
1908 | |||
1909 | snd_soc_update_bits(codec, WM8915_AIF_CLOCKING_1, | ||
1910 | WM8915_SYSCLK_SRC_MASK | WM8915_SYSCLK_DIV_MASK, | ||
1911 | src << WM8915_SYSCLK_SRC_SHIFT | ratediv); | ||
1912 | snd_soc_update_bits(codec, WM8915_CLOCKING_1, WM8915_LFCLK_ENA, lfclk); | ||
1913 | snd_soc_update_bits(codec, WM8915_AIF_CLOCKING_1, | ||
1914 | WM8915_SYSCLK_ENA, old); | ||
1915 | |||
1916 | wm8915->sysclk_src = clk_id; | ||
1917 | |||
1918 | return 0; | ||
1919 | } | ||
1920 | |||
1921 | struct _fll_div { | ||
1922 | u16 fll_fratio; | ||
1923 | u16 fll_outdiv; | ||
1924 | u16 fll_refclk_div; | ||
1925 | u16 fll_loop_gain; | ||
1926 | u16 fll_ref_freq; | ||
1927 | u16 n; | ||
1928 | u16 theta; | ||
1929 | u16 lambda; | ||
1930 | }; | ||
1931 | |||
1932 | static struct { | ||
1933 | unsigned int min; | ||
1934 | unsigned int max; | ||
1935 | u16 fll_fratio; | ||
1936 | int ratio; | ||
1937 | } fll_fratios[] = { | ||
1938 | { 0, 64000, 4, 16 }, | ||
1939 | { 64000, 128000, 3, 8 }, | ||
1940 | { 128000, 256000, 2, 4 }, | ||
1941 | { 256000, 1000000, 1, 2 }, | ||
1942 | { 1000000, 13500000, 0, 1 }, | ||
1943 | }; | ||
1944 | |||
1945 | static int fll_factors(struct _fll_div *fll_div, unsigned int Fref, | ||
1946 | unsigned int Fout) | ||
1947 | { | ||
1948 | unsigned int target; | ||
1949 | unsigned int div; | ||
1950 | unsigned int fratio, gcd_fll; | ||
1951 | int i; | ||
1952 | |||
1953 | /* Fref must be <=13.5MHz */ | ||
1954 | div = 1; | ||
1955 | fll_div->fll_refclk_div = 0; | ||
1956 | while ((Fref / div) > 13500000) { | ||
1957 | div *= 2; | ||
1958 | fll_div->fll_refclk_div++; | ||
1959 | |||
1960 | if (div > 8) { | ||
1961 | pr_err("Can't scale %dMHz input down to <=13.5MHz\n", | ||
1962 | Fref); | ||
1963 | return -EINVAL; | ||
1964 | } | ||
1965 | } | ||
1966 | |||
1967 | pr_debug("FLL Fref=%u Fout=%u\n", Fref, Fout); | ||
1968 | |||
1969 | /* Apply the division for our remaining calculations */ | ||
1970 | Fref /= div; | ||
1971 | |||
1972 | if (Fref >= 3000000) | ||
1973 | fll_div->fll_loop_gain = 5; | ||
1974 | else | ||
1975 | fll_div->fll_loop_gain = 0; | ||
1976 | |||
1977 | if (Fref >= 48000) | ||
1978 | fll_div->fll_ref_freq = 0; | ||
1979 | else | ||
1980 | fll_div->fll_ref_freq = 1; | ||
1981 | |||
1982 | /* Fvco should be 90-100MHz; don't check the upper bound */ | ||
1983 | div = 2; | ||
1984 | while (Fout * div < 90000000) { | ||
1985 | div++; | ||
1986 | if (div > 64) { | ||
1987 | pr_err("Unable to find FLL_OUTDIV for Fout=%uHz\n", | ||
1988 | Fout); | ||
1989 | return -EINVAL; | ||
1990 | } | ||
1991 | } | ||
1992 | target = Fout * div; | ||
1993 | fll_div->fll_outdiv = div - 1; | ||
1994 | |||
1995 | pr_debug("FLL Fvco=%dHz\n", target); | ||
1996 | |||
1997 | /* Find an appropraite FLL_FRATIO and factor it out of the target */ | ||
1998 | for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) { | ||
1999 | if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) { | ||
2000 | fll_div->fll_fratio = fll_fratios[i].fll_fratio; | ||
2001 | fratio = fll_fratios[i].ratio; | ||
2002 | break; | ||
2003 | } | ||
2004 | } | ||
2005 | if (i == ARRAY_SIZE(fll_fratios)) { | ||
2006 | pr_err("Unable to find FLL_FRATIO for Fref=%uHz\n", Fref); | ||
2007 | return -EINVAL; | ||
2008 | } | ||
2009 | |||
2010 | fll_div->n = target / (fratio * Fref); | ||
2011 | |||
2012 | if (target % Fref == 0) { | ||
2013 | fll_div->theta = 0; | ||
2014 | fll_div->lambda = 0; | ||
2015 | } else { | ||
2016 | gcd_fll = gcd(target, fratio * Fref); | ||
2017 | |||
2018 | fll_div->theta = (target - (fll_div->n * fratio * Fref)) | ||
2019 | / gcd_fll; | ||
2020 | fll_div->lambda = (fratio * Fref) / gcd_fll; | ||
2021 | } | ||
2022 | |||
2023 | pr_debug("FLL N=%x THETA=%x LAMBDA=%x\n", | ||
2024 | fll_div->n, fll_div->theta, fll_div->lambda); | ||
2025 | pr_debug("FLL_FRATIO=%x FLL_OUTDIV=%x FLL_REFCLK_DIV=%x\n", | ||
2026 | fll_div->fll_fratio, fll_div->fll_outdiv, | ||
2027 | fll_div->fll_refclk_div); | ||
2028 | |||
2029 | return 0; | ||
2030 | } | ||
2031 | |||
2032 | static int wm8915_set_fll(struct snd_soc_codec *codec, int fll_id, int source, | ||
2033 | unsigned int Fref, unsigned int Fout) | ||
2034 | { | ||
2035 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
2036 | struct i2c_client *i2c = to_i2c_client(codec->dev); | ||
2037 | struct _fll_div fll_div; | ||
2038 | unsigned long timeout; | ||
2039 | int ret, reg; | ||
2040 | |||
2041 | /* Any change? */ | ||
2042 | if (source == wm8915->fll_src && Fref == wm8915->fll_fref && | ||
2043 | Fout == wm8915->fll_fout) | ||
2044 | return 0; | ||
2045 | |||
2046 | if (Fout == 0) { | ||
2047 | dev_dbg(codec->dev, "FLL disabled\n"); | ||
2048 | |||
2049 | wm8915->fll_fref = 0; | ||
2050 | wm8915->fll_fout = 0; | ||
2051 | |||
2052 | snd_soc_update_bits(codec, WM8915_FLL_CONTROL_1, | ||
2053 | WM8915_FLL_ENA, 0); | ||
2054 | |||
2055 | return 0; | ||
2056 | } | ||
2057 | |||
2058 | ret = fll_factors(&fll_div, Fref, Fout); | ||
2059 | if (ret != 0) | ||
2060 | return ret; | ||
2061 | |||
2062 | switch (source) { | ||
2063 | case WM8915_FLL_MCLK1: | ||
2064 | reg = 0; | ||
2065 | break; | ||
2066 | case WM8915_FLL_MCLK2: | ||
2067 | reg = 1; | ||
2068 | break; | ||
2069 | case WM8915_FLL_DACLRCLK1: | ||
2070 | reg = 2; | ||
2071 | break; | ||
2072 | case WM8915_FLL_BCLK1: | ||
2073 | reg = 3; | ||
2074 | break; | ||
2075 | default: | ||
2076 | dev_err(codec->dev, "Unknown FLL source %d\n", ret); | ||
2077 | return -EINVAL; | ||
2078 | } | ||
2079 | |||
2080 | reg |= fll_div.fll_refclk_div << WM8915_FLL_REFCLK_DIV_SHIFT; | ||
2081 | reg |= fll_div.fll_ref_freq << WM8915_FLL_REF_FREQ_SHIFT; | ||
2082 | |||
2083 | snd_soc_update_bits(codec, WM8915_FLL_CONTROL_5, | ||
2084 | WM8915_FLL_REFCLK_DIV_MASK | WM8915_FLL_REF_FREQ | | ||
2085 | WM8915_FLL_REFCLK_SRC_MASK, reg); | ||
2086 | |||
2087 | reg = 0; | ||
2088 | if (fll_div.theta || fll_div.lambda) | ||
2089 | reg |= WM8915_FLL_EFS_ENA | (3 << WM8915_FLL_LFSR_SEL_SHIFT); | ||
2090 | else | ||
2091 | reg |= 1 << WM8915_FLL_LFSR_SEL_SHIFT; | ||
2092 | snd_soc_write(codec, WM8915_FLL_EFS_2, reg); | ||
2093 | |||
2094 | snd_soc_update_bits(codec, WM8915_FLL_CONTROL_2, | ||
2095 | WM8915_FLL_OUTDIV_MASK | | ||
2096 | WM8915_FLL_FRATIO_MASK, | ||
2097 | (fll_div.fll_outdiv << WM8915_FLL_OUTDIV_SHIFT) | | ||
2098 | (fll_div.fll_fratio)); | ||
2099 | |||
2100 | snd_soc_write(codec, WM8915_FLL_CONTROL_3, fll_div.theta); | ||
2101 | |||
2102 | snd_soc_update_bits(codec, WM8915_FLL_CONTROL_4, | ||
2103 | WM8915_FLL_N_MASK | WM8915_FLL_LOOP_GAIN_MASK, | ||
2104 | (fll_div.n << WM8915_FLL_N_SHIFT) | | ||
2105 | fll_div.fll_loop_gain); | ||
2106 | |||
2107 | snd_soc_write(codec, WM8915_FLL_EFS_1, fll_div.lambda); | ||
2108 | |||
2109 | snd_soc_update_bits(codec, WM8915_FLL_CONTROL_1, | ||
2110 | WM8915_FLL_ENA, WM8915_FLL_ENA); | ||
2111 | |||
2112 | /* The FLL supports live reconfiguration - kick that in case we were | ||
2113 | * already enabled. | ||
2114 | */ | ||
2115 | snd_soc_write(codec, WM8915_FLL_CONTROL_6, WM8915_FLL_SWITCH_CLK); | ||
2116 | |||
2117 | /* Wait for the FLL to lock, using the interrupt if possible */ | ||
2118 | if (Fref > 1000000) | ||
2119 | timeout = usecs_to_jiffies(300); | ||
2120 | else | ||
2121 | timeout = msecs_to_jiffies(2); | ||
2122 | |||
2123 | /* Allow substantially longer if we've actually got the IRQ */ | ||
2124 | if (i2c->irq) | ||
2125 | timeout *= 1000; | ||
2126 | |||
2127 | ret = wait_for_completion_timeout(&wm8915->fll_lock, timeout); | ||
2128 | |||
2129 | if (ret == 0 && i2c->irq) { | ||
2130 | dev_err(codec->dev, "Timed out waiting for FLL\n"); | ||
2131 | ret = -ETIMEDOUT; | ||
2132 | } else { | ||
2133 | ret = 0; | ||
2134 | } | ||
2135 | |||
2136 | dev_dbg(codec->dev, "FLL configured for %dHz->%dHz\n", Fref, Fout); | ||
2137 | |||
2138 | wm8915->fll_fref = Fref; | ||
2139 | wm8915->fll_fout = Fout; | ||
2140 | wm8915->fll_src = source; | ||
2141 | |||
2142 | return ret; | ||
2143 | } | ||
2144 | |||
2145 | #ifdef CONFIG_GPIOLIB | ||
2146 | static inline struct wm8915_priv *gpio_to_wm8915(struct gpio_chip *chip) | ||
2147 | { | ||
2148 | return container_of(chip, struct wm8915_priv, gpio_chip); | ||
2149 | } | ||
2150 | |||
2151 | static void wm8915_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | ||
2152 | { | ||
2153 | struct wm8915_priv *wm8915 = gpio_to_wm8915(chip); | ||
2154 | struct snd_soc_codec *codec = wm8915->codec; | ||
2155 | |||
2156 | snd_soc_update_bits(codec, WM8915_GPIO_1 + offset, | ||
2157 | WM8915_GP1_LVL, !!value << WM8915_GP1_LVL_SHIFT); | ||
2158 | } | ||
2159 | |||
2160 | static int wm8915_gpio_direction_out(struct gpio_chip *chip, | ||
2161 | unsigned offset, int value) | ||
2162 | { | ||
2163 | struct wm8915_priv *wm8915 = gpio_to_wm8915(chip); | ||
2164 | struct snd_soc_codec *codec = wm8915->codec; | ||
2165 | int val; | ||
2166 | |||
2167 | val = (1 << WM8915_GP1_FN_SHIFT) | (!!value << WM8915_GP1_LVL_SHIFT); | ||
2168 | |||
2169 | return snd_soc_update_bits(codec, WM8915_GPIO_1 + offset, | ||
2170 | WM8915_GP1_FN_MASK | WM8915_GP1_DIR | | ||
2171 | WM8915_GP1_LVL, val); | ||
2172 | } | ||
2173 | |||
2174 | static int wm8915_gpio_get(struct gpio_chip *chip, unsigned offset) | ||
2175 | { | ||
2176 | struct wm8915_priv *wm8915 = gpio_to_wm8915(chip); | ||
2177 | struct snd_soc_codec *codec = wm8915->codec; | ||
2178 | int ret; | ||
2179 | |||
2180 | ret = snd_soc_read(codec, WM8915_GPIO_1 + offset); | ||
2181 | if (ret < 0) | ||
2182 | return ret; | ||
2183 | |||
2184 | return (ret & WM8915_GP1_LVL) != 0; | ||
2185 | } | ||
2186 | |||
2187 | static int wm8915_gpio_direction_in(struct gpio_chip *chip, unsigned offset) | ||
2188 | { | ||
2189 | struct wm8915_priv *wm8915 = gpio_to_wm8915(chip); | ||
2190 | struct snd_soc_codec *codec = wm8915->codec; | ||
2191 | |||
2192 | return snd_soc_update_bits(codec, WM8915_GPIO_1 + offset, | ||
2193 | WM8915_GP1_FN_MASK | WM8915_GP1_DIR, | ||
2194 | (1 << WM8915_GP1_FN_SHIFT) | | ||
2195 | (1 << WM8915_GP1_DIR_SHIFT)); | ||
2196 | } | ||
2197 | |||
2198 | static struct gpio_chip wm8915_template_chip = { | ||
2199 | .label = "wm8915", | ||
2200 | .owner = THIS_MODULE, | ||
2201 | .direction_output = wm8915_gpio_direction_out, | ||
2202 | .set = wm8915_gpio_set, | ||
2203 | .direction_input = wm8915_gpio_direction_in, | ||
2204 | .get = wm8915_gpio_get, | ||
2205 | .can_sleep = 1, | ||
2206 | }; | ||
2207 | |||
2208 | static void wm8915_init_gpio(struct snd_soc_codec *codec) | ||
2209 | { | ||
2210 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
2211 | int ret; | ||
2212 | |||
2213 | wm8915->gpio_chip = wm8915_template_chip; | ||
2214 | wm8915->gpio_chip.ngpio = 5; | ||
2215 | wm8915->gpio_chip.dev = codec->dev; | ||
2216 | |||
2217 | if (wm8915->pdata.gpio_base) | ||
2218 | wm8915->gpio_chip.base = wm8915->pdata.gpio_base; | ||
2219 | else | ||
2220 | wm8915->gpio_chip.base = -1; | ||
2221 | |||
2222 | ret = gpiochip_add(&wm8915->gpio_chip); | ||
2223 | if (ret != 0) | ||
2224 | dev_err(codec->dev, "Failed to add GPIOs: %d\n", ret); | ||
2225 | } | ||
2226 | |||
2227 | static void wm8915_free_gpio(struct snd_soc_codec *codec) | ||
2228 | { | ||
2229 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
2230 | int ret; | ||
2231 | |||
2232 | ret = gpiochip_remove(&wm8915->gpio_chip); | ||
2233 | if (ret != 0) | ||
2234 | dev_err(codec->dev, "Failed to remove GPIOs: %d\n", ret); | ||
2235 | } | ||
2236 | #else | ||
2237 | static void wm8915_init_gpio(struct snd_soc_codec *codec) | ||
2238 | { | ||
2239 | } | ||
2240 | |||
2241 | static void wm8915_free_gpio(struct snd_soc_codec *codec) | ||
2242 | { | ||
2243 | } | ||
2244 | #endif | ||
2245 | |||
2246 | /** | ||
2247 | * wm8915_detect - Enable default WM8915 jack detection | ||
2248 | * | ||
2249 | * The WM8915 has advanced accessory detection support for headsets. | ||
2250 | * This function provides a default implementation which integrates | ||
2251 | * the majority of this functionality with minimal user configuration. | ||
2252 | * | ||
2253 | * This will detect headset, headphone and short circuit button and | ||
2254 | * will also detect inverted microphone ground connections and update | ||
2255 | * the polarity of the connections. | ||
2256 | */ | ||
2257 | int wm8915_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | ||
2258 | wm8915_polarity_fn polarity_cb) | ||
2259 | { | ||
2260 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
2261 | |||
2262 | wm8915->jack = jack; | ||
2263 | wm8915->detecting = true; | ||
2264 | wm8915->polarity_cb = polarity_cb; | ||
2265 | |||
2266 | if (wm8915->polarity_cb) | ||
2267 | wm8915->polarity_cb(codec, 0); | ||
2268 | |||
2269 | /* Clear discarge to avoid noise during detection */ | ||
2270 | snd_soc_update_bits(codec, WM8915_MICBIAS_1, | ||
2271 | WM8915_MICB1_DISCH, 0); | ||
2272 | snd_soc_update_bits(codec, WM8915_MICBIAS_2, | ||
2273 | WM8915_MICB2_DISCH, 0); | ||
2274 | |||
2275 | /* LDO2 powers the microphones, SYSCLK clocks detection */ | ||
2276 | snd_soc_dapm_force_enable_pin(&codec->dapm, "LDO2"); | ||
2277 | snd_soc_dapm_force_enable_pin(&codec->dapm, "SYSCLK"); | ||
2278 | |||
2279 | /* We start off just enabling microphone detection - even a | ||
2280 | * plain headphone will trigger detection. | ||
2281 | */ | ||
2282 | snd_soc_update_bits(codec, WM8915_MIC_DETECT_1, | ||
2283 | WM8915_MICD_ENA, WM8915_MICD_ENA); | ||
2284 | |||
2285 | /* Slowest detection rate, gives debounce for initial detection */ | ||
2286 | snd_soc_update_bits(codec, WM8915_MIC_DETECT_1, | ||
2287 | WM8915_MICD_RATE_MASK, | ||
2288 | WM8915_MICD_RATE_MASK); | ||
2289 | |||
2290 | /* Enable interrupts and we're off */ | ||
2291 | snd_soc_update_bits(codec, WM8915_INTERRUPT_STATUS_2_MASK, | ||
2292 | WM8915_IM_MICD_EINT, 0); | ||
2293 | |||
2294 | return 0; | ||
2295 | } | ||
2296 | EXPORT_SYMBOL_GPL(wm8915_detect); | ||
2297 | |||
2298 | static void wm8915_micd(struct snd_soc_codec *codec) | ||
2299 | { | ||
2300 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
2301 | int val, reg; | ||
2302 | |||
2303 | val = snd_soc_read(codec, WM8915_MIC_DETECT_3); | ||
2304 | |||
2305 | dev_dbg(codec->dev, "Microphone event: %x\n", val); | ||
2306 | |||
2307 | if (!(val & WM8915_MICD_VALID)) { | ||
2308 | dev_warn(codec->dev, "Microphone detection state invalid\n"); | ||
2309 | return; | ||
2310 | } | ||
2311 | |||
2312 | /* No accessory, reset everything and report removal */ | ||
2313 | if (!(val & WM8915_MICD_STS)) { | ||
2314 | dev_dbg(codec->dev, "Jack removal detected\n"); | ||
2315 | wm8915->jack_mic = false; | ||
2316 | wm8915->detecting = true; | ||
2317 | snd_soc_jack_report(wm8915->jack, 0, | ||
2318 | SND_JACK_HEADSET | SND_JACK_BTN_0); | ||
2319 | snd_soc_update_bits(codec, WM8915_MIC_DETECT_1, | ||
2320 | WM8915_MICD_RATE_MASK, | ||
2321 | WM8915_MICD_RATE_MASK); | ||
2322 | return; | ||
2323 | } | ||
2324 | |||
2325 | /* If the measurement is very high we've got a microphone but | ||
2326 | * do a little debounce to account for mechanical issues. | ||
2327 | */ | ||
2328 | if (val & 0x400) { | ||
2329 | dev_dbg(codec->dev, "Microphone detected\n"); | ||
2330 | snd_soc_jack_report(wm8915->jack, SND_JACK_HEADSET, | ||
2331 | SND_JACK_HEADSET | SND_JACK_BTN_0); | ||
2332 | wm8915->jack_mic = true; | ||
2333 | wm8915->detecting = false; | ||
2334 | |||
2335 | /* Increase poll rate to give better responsiveness | ||
2336 | * for buttons */ | ||
2337 | snd_soc_update_bits(codec, WM8915_MIC_DETECT_1, | ||
2338 | WM8915_MICD_RATE_MASK, | ||
2339 | 5 << WM8915_MICD_RATE_SHIFT); | ||
2340 | } | ||
2341 | |||
2342 | /* If we detected a lower impedence during initial startup | ||
2343 | * then we probably have the wrong polarity, flip it. Don't | ||
2344 | * do this for the lowest impedences to speed up detection of | ||
2345 | * plain headphones. | ||
2346 | */ | ||
2347 | if (wm8915->detecting && (val & 0x3f0)) { | ||
2348 | reg = snd_soc_read(codec, WM8915_ACCESSORY_DETECT_MODE_2); | ||
2349 | reg ^= WM8915_HPOUT1FB_SRC | WM8915_MICD_SRC | | ||
2350 | WM8915_MICD_BIAS_SRC; | ||
2351 | snd_soc_update_bits(codec, WM8915_ACCESSORY_DETECT_MODE_2, | ||
2352 | WM8915_HPOUT1FB_SRC | WM8915_MICD_SRC | | ||
2353 | WM8915_MICD_BIAS_SRC, reg); | ||
2354 | |||
2355 | if (wm8915->polarity_cb) | ||
2356 | wm8915->polarity_cb(codec, | ||
2357 | (reg & WM8915_MICD_SRC) != 0); | ||
2358 | |||
2359 | dev_dbg(codec->dev, "Set microphone polarity to %d\n", | ||
2360 | (reg & WM8915_MICD_SRC) != 0); | ||
2361 | |||
2362 | return; | ||
2363 | } | ||
2364 | |||
2365 | /* Don't distinguish between buttons, just report any low | ||
2366 | * impedence as BTN_0. | ||
2367 | */ | ||
2368 | if (val & 0x3fc) { | ||
2369 | if (wm8915->jack_mic) { | ||
2370 | dev_dbg(codec->dev, "Mic button detected\n"); | ||
2371 | snd_soc_jack_report(wm8915->jack, | ||
2372 | SND_JACK_HEADSET | SND_JACK_BTN_0, | ||
2373 | SND_JACK_HEADSET | SND_JACK_BTN_0); | ||
2374 | } else { | ||
2375 | dev_dbg(codec->dev, "Headphone detected\n"); | ||
2376 | snd_soc_jack_report(wm8915->jack, | ||
2377 | SND_JACK_HEADPHONE, | ||
2378 | SND_JACK_HEADSET | | ||
2379 | SND_JACK_BTN_0); | ||
2380 | |||
2381 | /* Increase the detection rate a bit for | ||
2382 | * responsiveness. | ||
2383 | */ | ||
2384 | snd_soc_update_bits(codec, WM8915_MIC_DETECT_1, | ||
2385 | WM8915_MICD_RATE_MASK, | ||
2386 | 7 << WM8915_MICD_RATE_SHIFT); | ||
2387 | |||
2388 | wm8915->detecting = false; | ||
2389 | } | ||
2390 | } | ||
2391 | } | ||
2392 | |||
2393 | static irqreturn_t wm8915_irq(int irq, void *data) | ||
2394 | { | ||
2395 | struct snd_soc_codec *codec = data; | ||
2396 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
2397 | int irq_val; | ||
2398 | |||
2399 | irq_val = snd_soc_read(codec, WM8915_INTERRUPT_STATUS_2); | ||
2400 | if (irq_val < 0) { | ||
2401 | dev_err(codec->dev, "Failed to read IRQ status: %d\n", | ||
2402 | irq_val); | ||
2403 | return IRQ_NONE; | ||
2404 | } | ||
2405 | irq_val &= ~snd_soc_read(codec, WM8915_INTERRUPT_STATUS_2_MASK); | ||
2406 | |||
2407 | if (irq_val & (WM8915_DCS_DONE_01_EINT | WM8915_DCS_DONE_23_EINT)) { | ||
2408 | dev_dbg(codec->dev, "DC servo IRQ\n"); | ||
2409 | complete(&wm8915->dcs_done); | ||
2410 | } | ||
2411 | |||
2412 | if (irq_val & WM8915_FIFOS_ERR_EINT) | ||
2413 | dev_err(codec->dev, "Digital core FIFO error\n"); | ||
2414 | |||
2415 | if (irq_val & WM8915_FLL_LOCK_EINT) { | ||
2416 | dev_dbg(codec->dev, "FLL locked\n"); | ||
2417 | complete(&wm8915->fll_lock); | ||
2418 | } | ||
2419 | |||
2420 | if (irq_val & WM8915_MICD_EINT) | ||
2421 | wm8915_micd(codec); | ||
2422 | |||
2423 | if (irq_val) { | ||
2424 | snd_soc_write(codec, WM8915_INTERRUPT_STATUS_2, irq_val); | ||
2425 | |||
2426 | return IRQ_HANDLED; | ||
2427 | } else { | ||
2428 | return IRQ_NONE; | ||
2429 | } | ||
2430 | } | ||
2431 | |||
2432 | static irqreturn_t wm8915_edge_irq(int irq, void *data) | ||
2433 | { | ||
2434 | irqreturn_t ret = IRQ_NONE; | ||
2435 | irqreturn_t val; | ||
2436 | |||
2437 | do { | ||
2438 | val = wm8915_irq(irq, data); | ||
2439 | if (val != IRQ_NONE) | ||
2440 | ret = val; | ||
2441 | } while (val != IRQ_NONE); | ||
2442 | |||
2443 | return ret; | ||
2444 | } | ||
2445 | |||
2446 | static void wm8915_retune_mobile_pdata(struct snd_soc_codec *codec) | ||
2447 | { | ||
2448 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
2449 | struct wm8915_pdata *pdata = &wm8915->pdata; | ||
2450 | |||
2451 | struct snd_kcontrol_new controls[] = { | ||
2452 | SOC_ENUM_EXT("DSP1 EQ Mode", | ||
2453 | wm8915->retune_mobile_enum, | ||
2454 | wm8915_get_retune_mobile_enum, | ||
2455 | wm8915_put_retune_mobile_enum), | ||
2456 | SOC_ENUM_EXT("DSP2 EQ Mode", | ||
2457 | wm8915->retune_mobile_enum, | ||
2458 | wm8915_get_retune_mobile_enum, | ||
2459 | wm8915_put_retune_mobile_enum), | ||
2460 | }; | ||
2461 | int ret, i, j; | ||
2462 | const char **t; | ||
2463 | |||
2464 | /* We need an array of texts for the enum API but the number | ||
2465 | * of texts is likely to be less than the number of | ||
2466 | * configurations due to the sample rate dependency of the | ||
2467 | * configurations. */ | ||
2468 | wm8915->num_retune_mobile_texts = 0; | ||
2469 | wm8915->retune_mobile_texts = NULL; | ||
2470 | for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { | ||
2471 | for (j = 0; j < wm8915->num_retune_mobile_texts; j++) { | ||
2472 | if (strcmp(pdata->retune_mobile_cfgs[i].name, | ||
2473 | wm8915->retune_mobile_texts[j]) == 0) | ||
2474 | break; | ||
2475 | } | ||
2476 | |||
2477 | if (j != wm8915->num_retune_mobile_texts) | ||
2478 | continue; | ||
2479 | |||
2480 | /* Expand the array... */ | ||
2481 | t = krealloc(wm8915->retune_mobile_texts, | ||
2482 | sizeof(char *) * | ||
2483 | (wm8915->num_retune_mobile_texts + 1), | ||
2484 | GFP_KERNEL); | ||
2485 | if (t == NULL) | ||
2486 | continue; | ||
2487 | |||
2488 | /* ...store the new entry... */ | ||
2489 | t[wm8915->num_retune_mobile_texts] = | ||
2490 | pdata->retune_mobile_cfgs[i].name; | ||
2491 | |||
2492 | /* ...and remember the new version. */ | ||
2493 | wm8915->num_retune_mobile_texts++; | ||
2494 | wm8915->retune_mobile_texts = t; | ||
2495 | } | ||
2496 | |||
2497 | dev_dbg(codec->dev, "Allocated %d unique ReTune Mobile names\n", | ||
2498 | wm8915->num_retune_mobile_texts); | ||
2499 | |||
2500 | wm8915->retune_mobile_enum.max = wm8915->num_retune_mobile_texts; | ||
2501 | wm8915->retune_mobile_enum.texts = wm8915->retune_mobile_texts; | ||
2502 | |||
2503 | ret = snd_soc_add_controls(codec, controls, ARRAY_SIZE(controls)); | ||
2504 | if (ret != 0) | ||
2505 | dev_err(codec->dev, | ||
2506 | "Failed to add ReTune Mobile controls: %d\n", ret); | ||
2507 | } | ||
2508 | |||
2509 | static int wm8915_probe(struct snd_soc_codec *codec) | ||
2510 | { | ||
2511 | int ret; | ||
2512 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
2513 | struct i2c_client *i2c = to_i2c_client(codec->dev); | ||
2514 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
2515 | int i, irq_flags; | ||
2516 | |||
2517 | wm8915->codec = codec; | ||
2518 | |||
2519 | init_completion(&wm8915->dcs_done); | ||
2520 | init_completion(&wm8915->fll_lock); | ||
2521 | |||
2522 | dapm->idle_bias_off = true; | ||
2523 | dapm->bias_level = SND_SOC_BIAS_OFF; | ||
2524 | |||
2525 | ret = snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_I2C); | ||
2526 | if (ret != 0) { | ||
2527 | dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); | ||
2528 | goto err; | ||
2529 | } | ||
2530 | |||
2531 | for (i = 0; i < ARRAY_SIZE(wm8915->supplies); i++) | ||
2532 | wm8915->supplies[i].supply = wm8915_supply_names[i]; | ||
2533 | |||
2534 | ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8915->supplies), | ||
2535 | wm8915->supplies); | ||
2536 | if (ret != 0) { | ||
2537 | dev_err(codec->dev, "Failed to request supplies: %d\n", ret); | ||
2538 | goto err; | ||
2539 | } | ||
2540 | |||
2541 | wm8915->disable_nb[0].notifier_call = wm8915_regulator_event_0; | ||
2542 | wm8915->disable_nb[1].notifier_call = wm8915_regulator_event_1; | ||
2543 | wm8915->disable_nb[2].notifier_call = wm8915_regulator_event_2; | ||
2544 | wm8915->disable_nb[3].notifier_call = wm8915_regulator_event_3; | ||
2545 | |||
2546 | /* This should really be moved into the regulator core */ | ||
2547 | for (i = 0; i < ARRAY_SIZE(wm8915->supplies); i++) { | ||
2548 | ret = regulator_register_notifier(wm8915->supplies[i].consumer, | ||
2549 | &wm8915->disable_nb[i]); | ||
2550 | if (ret != 0) { | ||
2551 | dev_err(codec->dev, | ||
2552 | "Failed to register regulator notifier: %d\n", | ||
2553 | ret); | ||
2554 | } | ||
2555 | } | ||
2556 | |||
2557 | ret = regulator_bulk_enable(ARRAY_SIZE(wm8915->supplies), | ||
2558 | wm8915->supplies); | ||
2559 | if (ret != 0) { | ||
2560 | dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); | ||
2561 | goto err_get; | ||
2562 | } | ||
2563 | |||
2564 | if (wm8915->pdata.ldo_ena >= 0) { | ||
2565 | gpio_set_value_cansleep(wm8915->pdata.ldo_ena, 1); | ||
2566 | msleep(5); | ||
2567 | } | ||
2568 | |||
2569 | ret = snd_soc_read(codec, WM8915_SOFTWARE_RESET); | ||
2570 | if (ret < 0) { | ||
2571 | dev_err(codec->dev, "Failed to read ID register: %d\n", ret); | ||
2572 | goto err_enable; | ||
2573 | } | ||
2574 | if (ret != 0x8915) { | ||
2575 | dev_err(codec->dev, "Device is not a WM8915, ID %x\n", ret); | ||
2576 | ret = -EINVAL; | ||
2577 | goto err_enable; | ||
2578 | } | ||
2579 | |||
2580 | ret = snd_soc_read(codec, WM8915_CHIP_REVISION); | ||
2581 | if (ret < 0) { | ||
2582 | dev_err(codec->dev, "Failed to read device revision: %d\n", | ||
2583 | ret); | ||
2584 | goto err_enable; | ||
2585 | } | ||
2586 | |||
2587 | dev_info(codec->dev, "revision %c\n", | ||
2588 | (ret & WM8915_CHIP_REV_MASK) + 'A'); | ||
2589 | |||
2590 | if (wm8915->pdata.ldo_ena >= 0) { | ||
2591 | gpio_set_value_cansleep(wm8915->pdata.ldo_ena, 0); | ||
2592 | } else { | ||
2593 | ret = wm8915_reset(codec); | ||
2594 | if (ret < 0) { | ||
2595 | dev_err(codec->dev, "Failed to issue reset\n"); | ||
2596 | goto err_enable; | ||
2597 | } | ||
2598 | } | ||
2599 | |||
2600 | codec->cache_only = true; | ||
2601 | |||
2602 | /* Apply platform data settings */ | ||
2603 | snd_soc_update_bits(codec, WM8915_LINE_INPUT_CONTROL, | ||
2604 | WM8915_INL_MODE_MASK | WM8915_INR_MODE_MASK, | ||
2605 | wm8915->pdata.inl_mode << WM8915_INL_MODE_SHIFT | | ||
2606 | wm8915->pdata.inr_mode); | ||
2607 | |||
2608 | for (i = 0; i < ARRAY_SIZE(wm8915->pdata.gpio_default); i++) { | ||
2609 | if (!wm8915->pdata.gpio_default[i]) | ||
2610 | continue; | ||
2611 | |||
2612 | snd_soc_write(codec, WM8915_GPIO_1 + i, | ||
2613 | wm8915->pdata.gpio_default[i] & 0xffff); | ||
2614 | } | ||
2615 | |||
2616 | if (wm8915->pdata.spkmute_seq) | ||
2617 | snd_soc_update_bits(codec, WM8915_PDM_SPEAKER_MUTE_SEQUENCE, | ||
2618 | WM8915_SPK_MUTE_ENDIAN | | ||
2619 | WM8915_SPK_MUTE_SEQ1_MASK, | ||
2620 | wm8915->pdata.spkmute_seq); | ||
2621 | |||
2622 | snd_soc_update_bits(codec, WM8915_ACCESSORY_DETECT_MODE_2, | ||
2623 | WM8915_MICD_BIAS_SRC | WM8915_HPOUT1FB_SRC | | ||
2624 | WM8915_MICD_SRC, wm8915->pdata.micdet_def); | ||
2625 | |||
2626 | /* Latch volume update bits */ | ||
2627 | snd_soc_update_bits(codec, WM8915_LEFT_LINE_INPUT_VOLUME, | ||
2628 | WM8915_IN1_VU, WM8915_IN1_VU); | ||
2629 | snd_soc_update_bits(codec, WM8915_RIGHT_LINE_INPUT_VOLUME, | ||
2630 | WM8915_IN1_VU, WM8915_IN1_VU); | ||
2631 | |||
2632 | snd_soc_update_bits(codec, WM8915_DAC1_LEFT_VOLUME, | ||
2633 | WM8915_DAC1_VU, WM8915_DAC1_VU); | ||
2634 | snd_soc_update_bits(codec, WM8915_DAC1_RIGHT_VOLUME, | ||
2635 | WM8915_DAC1_VU, WM8915_DAC1_VU); | ||
2636 | snd_soc_update_bits(codec, WM8915_DAC2_LEFT_VOLUME, | ||
2637 | WM8915_DAC2_VU, WM8915_DAC2_VU); | ||
2638 | snd_soc_update_bits(codec, WM8915_DAC2_RIGHT_VOLUME, | ||
2639 | WM8915_DAC2_VU, WM8915_DAC2_VU); | ||
2640 | |||
2641 | snd_soc_update_bits(codec, WM8915_OUTPUT1_LEFT_VOLUME, | ||
2642 | WM8915_DAC1_VU, WM8915_DAC1_VU); | ||
2643 | snd_soc_update_bits(codec, WM8915_OUTPUT1_RIGHT_VOLUME, | ||
2644 | WM8915_DAC1_VU, WM8915_DAC1_VU); | ||
2645 | snd_soc_update_bits(codec, WM8915_OUTPUT2_LEFT_VOLUME, | ||
2646 | WM8915_DAC2_VU, WM8915_DAC2_VU); | ||
2647 | snd_soc_update_bits(codec, WM8915_OUTPUT2_RIGHT_VOLUME, | ||
2648 | WM8915_DAC2_VU, WM8915_DAC2_VU); | ||
2649 | |||
2650 | snd_soc_update_bits(codec, WM8915_DSP1_TX_LEFT_VOLUME, | ||
2651 | WM8915_DSP1TX_VU, WM8915_DSP1TX_VU); | ||
2652 | snd_soc_update_bits(codec, WM8915_DSP1_TX_RIGHT_VOLUME, | ||
2653 | WM8915_DSP1TX_VU, WM8915_DSP1TX_VU); | ||
2654 | snd_soc_update_bits(codec, WM8915_DSP2_TX_LEFT_VOLUME, | ||
2655 | WM8915_DSP2TX_VU, WM8915_DSP2TX_VU); | ||
2656 | snd_soc_update_bits(codec, WM8915_DSP2_TX_RIGHT_VOLUME, | ||
2657 | WM8915_DSP2TX_VU, WM8915_DSP2TX_VU); | ||
2658 | |||
2659 | snd_soc_update_bits(codec, WM8915_DSP1_RX_LEFT_VOLUME, | ||
2660 | WM8915_DSP1RX_VU, WM8915_DSP1RX_VU); | ||
2661 | snd_soc_update_bits(codec, WM8915_DSP1_RX_RIGHT_VOLUME, | ||
2662 | WM8915_DSP1RX_VU, WM8915_DSP1RX_VU); | ||
2663 | snd_soc_update_bits(codec, WM8915_DSP2_RX_LEFT_VOLUME, | ||
2664 | WM8915_DSP2RX_VU, WM8915_DSP2RX_VU); | ||
2665 | snd_soc_update_bits(codec, WM8915_DSP2_RX_RIGHT_VOLUME, | ||
2666 | WM8915_DSP2RX_VU, WM8915_DSP2RX_VU); | ||
2667 | |||
2668 | /* No support currently for the underclocked TDM modes and | ||
2669 | * pick a default TDM layout with each channel pair working with | ||
2670 | * slots 0 and 1. */ | ||
2671 | snd_soc_update_bits(codec, WM8915_AIF1RX_CHANNEL_0_CONFIGURATION, | ||
2672 | WM8915_AIF1RX_CHAN0_SLOTS_MASK | | ||
2673 | WM8915_AIF1RX_CHAN0_START_SLOT_MASK, | ||
2674 | 1 << WM8915_AIF1RX_CHAN0_SLOTS_SHIFT | 0); | ||
2675 | snd_soc_update_bits(codec, WM8915_AIF1RX_CHANNEL_1_CONFIGURATION, | ||
2676 | WM8915_AIF1RX_CHAN1_SLOTS_MASK | | ||
2677 | WM8915_AIF1RX_CHAN1_START_SLOT_MASK, | ||
2678 | 1 << WM8915_AIF1RX_CHAN1_SLOTS_SHIFT | 1); | ||
2679 | snd_soc_update_bits(codec, WM8915_AIF1RX_CHANNEL_2_CONFIGURATION, | ||
2680 | WM8915_AIF1RX_CHAN2_SLOTS_MASK | | ||
2681 | WM8915_AIF1RX_CHAN2_START_SLOT_MASK, | ||
2682 | 1 << WM8915_AIF1RX_CHAN2_SLOTS_SHIFT | 0); | ||
2683 | snd_soc_update_bits(codec, WM8915_AIF1RX_CHANNEL_3_CONFIGURATION, | ||
2684 | WM8915_AIF1RX_CHAN3_SLOTS_MASK | | ||
2685 | WM8915_AIF1RX_CHAN0_START_SLOT_MASK, | ||
2686 | 1 << WM8915_AIF1RX_CHAN3_SLOTS_SHIFT | 1); | ||
2687 | snd_soc_update_bits(codec, WM8915_AIF1RX_CHANNEL_4_CONFIGURATION, | ||
2688 | WM8915_AIF1RX_CHAN4_SLOTS_MASK | | ||
2689 | WM8915_AIF1RX_CHAN0_START_SLOT_MASK, | ||
2690 | 1 << WM8915_AIF1RX_CHAN4_SLOTS_SHIFT | 0); | ||
2691 | snd_soc_update_bits(codec, WM8915_AIF1RX_CHANNEL_5_CONFIGURATION, | ||
2692 | WM8915_AIF1RX_CHAN5_SLOTS_MASK | | ||
2693 | WM8915_AIF1RX_CHAN0_START_SLOT_MASK, | ||
2694 | 1 << WM8915_AIF1RX_CHAN5_SLOTS_SHIFT | 1); | ||
2695 | |||
2696 | snd_soc_update_bits(codec, WM8915_AIF2RX_CHANNEL_0_CONFIGURATION, | ||
2697 | WM8915_AIF2RX_CHAN0_SLOTS_MASK | | ||
2698 | WM8915_AIF2RX_CHAN0_START_SLOT_MASK, | ||
2699 | 1 << WM8915_AIF2RX_CHAN0_SLOTS_SHIFT | 0); | ||
2700 | snd_soc_update_bits(codec, WM8915_AIF2RX_CHANNEL_1_CONFIGURATION, | ||
2701 | WM8915_AIF2RX_CHAN1_SLOTS_MASK | | ||
2702 | WM8915_AIF2RX_CHAN1_START_SLOT_MASK, | ||
2703 | 1 << WM8915_AIF2RX_CHAN1_SLOTS_SHIFT | 1); | ||
2704 | |||
2705 | snd_soc_update_bits(codec, WM8915_AIF1TX_CHANNEL_0_CONFIGURATION, | ||
2706 | WM8915_AIF1TX_CHAN0_SLOTS_MASK | | ||
2707 | WM8915_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2708 | 1 << WM8915_AIF1TX_CHAN0_SLOTS_SHIFT | 0); | ||
2709 | snd_soc_update_bits(codec, WM8915_AIF1TX_CHANNEL_1_CONFIGURATION, | ||
2710 | WM8915_AIF1TX_CHAN1_SLOTS_MASK | | ||
2711 | WM8915_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2712 | 1 << WM8915_AIF1TX_CHAN1_SLOTS_SHIFT | 1); | ||
2713 | snd_soc_update_bits(codec, WM8915_AIF1TX_CHANNEL_2_CONFIGURATION, | ||
2714 | WM8915_AIF1TX_CHAN2_SLOTS_MASK | | ||
2715 | WM8915_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2716 | 1 << WM8915_AIF1TX_CHAN2_SLOTS_SHIFT | 0); | ||
2717 | snd_soc_update_bits(codec, WM8915_AIF1TX_CHANNEL_3_CONFIGURATION, | ||
2718 | WM8915_AIF1TX_CHAN3_SLOTS_MASK | | ||
2719 | WM8915_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2720 | 1 << WM8915_AIF1TX_CHAN3_SLOTS_SHIFT | 1); | ||
2721 | snd_soc_update_bits(codec, WM8915_AIF1TX_CHANNEL_4_CONFIGURATION, | ||
2722 | WM8915_AIF1TX_CHAN4_SLOTS_MASK | | ||
2723 | WM8915_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2724 | 1 << WM8915_AIF1TX_CHAN4_SLOTS_SHIFT | 0); | ||
2725 | snd_soc_update_bits(codec, WM8915_AIF1TX_CHANNEL_5_CONFIGURATION, | ||
2726 | WM8915_AIF1TX_CHAN5_SLOTS_MASK | | ||
2727 | WM8915_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2728 | 1 << WM8915_AIF1TX_CHAN5_SLOTS_SHIFT | 1); | ||
2729 | |||
2730 | snd_soc_update_bits(codec, WM8915_AIF2TX_CHANNEL_0_CONFIGURATION, | ||
2731 | WM8915_AIF2TX_CHAN0_SLOTS_MASK | | ||
2732 | WM8915_AIF2TX_CHAN0_START_SLOT_MASK, | ||
2733 | 1 << WM8915_AIF2TX_CHAN0_SLOTS_SHIFT | 0); | ||
2734 | snd_soc_update_bits(codec, WM8915_AIF1TX_CHANNEL_1_CONFIGURATION, | ||
2735 | WM8915_AIF2TX_CHAN1_SLOTS_MASK | | ||
2736 | WM8915_AIF2TX_CHAN1_START_SLOT_MASK, | ||
2737 | 1 << WM8915_AIF1TX_CHAN1_SLOTS_SHIFT | 1); | ||
2738 | |||
2739 | if (wm8915->pdata.num_retune_mobile_cfgs) | ||
2740 | wm8915_retune_mobile_pdata(codec); | ||
2741 | else | ||
2742 | snd_soc_add_controls(codec, wm8915_eq_controls, | ||
2743 | ARRAY_SIZE(wm8915_eq_controls)); | ||
2744 | |||
2745 | /* If the TX LRCLK pins are not in LRCLK mode configure the | ||
2746 | * AIFs to source their clocks from the RX LRCLKs. | ||
2747 | */ | ||
2748 | if ((snd_soc_read(codec, WM8915_GPIO_1))) | ||
2749 | snd_soc_update_bits(codec, WM8915_AIF1_TX_LRCLK_2, | ||
2750 | WM8915_AIF1TX_LRCLK_MODE, | ||
2751 | WM8915_AIF1TX_LRCLK_MODE); | ||
2752 | |||
2753 | if ((snd_soc_read(codec, WM8915_GPIO_2))) | ||
2754 | snd_soc_update_bits(codec, WM8915_AIF2_TX_LRCLK_2, | ||
2755 | WM8915_AIF2TX_LRCLK_MODE, | ||
2756 | WM8915_AIF2TX_LRCLK_MODE); | ||
2757 | |||
2758 | regulator_bulk_disable(ARRAY_SIZE(wm8915->supplies), wm8915->supplies); | ||
2759 | |||
2760 | wm8915_init_gpio(codec); | ||
2761 | |||
2762 | if (i2c->irq) { | ||
2763 | if (wm8915->pdata.irq_flags) | ||
2764 | irq_flags = wm8915->pdata.irq_flags; | ||
2765 | else | ||
2766 | irq_flags = IRQF_TRIGGER_LOW; | ||
2767 | |||
2768 | irq_flags |= IRQF_ONESHOT; | ||
2769 | |||
2770 | if (irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) | ||
2771 | ret = request_threaded_irq(i2c->irq, NULL, | ||
2772 | wm8915_edge_irq, | ||
2773 | irq_flags, "wm8915", codec); | ||
2774 | else | ||
2775 | ret = request_threaded_irq(i2c->irq, NULL, wm8915_irq, | ||
2776 | irq_flags, "wm8915", codec); | ||
2777 | |||
2778 | if (ret == 0) { | ||
2779 | /* Unmask the interrupt */ | ||
2780 | snd_soc_update_bits(codec, WM8915_INTERRUPT_CONTROL, | ||
2781 | WM8915_IM_IRQ, 0); | ||
2782 | |||
2783 | /* Enable error reporting and DC servo status */ | ||
2784 | snd_soc_update_bits(codec, | ||
2785 | WM8915_INTERRUPT_STATUS_2_MASK, | ||
2786 | WM8915_IM_DCS_DONE_23_EINT | | ||
2787 | WM8915_IM_DCS_DONE_01_EINT | | ||
2788 | WM8915_IM_FLL_LOCK_EINT | | ||
2789 | WM8915_IM_FIFOS_ERR_EINT, | ||
2790 | 0); | ||
2791 | } else { | ||
2792 | dev_err(codec->dev, "Failed to request IRQ: %d\n", | ||
2793 | ret); | ||
2794 | } | ||
2795 | } | ||
2796 | |||
2797 | return 0; | ||
2798 | |||
2799 | err_enable: | ||
2800 | if (wm8915->pdata.ldo_ena >= 0) | ||
2801 | gpio_set_value_cansleep(wm8915->pdata.ldo_ena, 0); | ||
2802 | |||
2803 | regulator_bulk_disable(ARRAY_SIZE(wm8915->supplies), wm8915->supplies); | ||
2804 | err_get: | ||
2805 | regulator_bulk_free(ARRAY_SIZE(wm8915->supplies), wm8915->supplies); | ||
2806 | err: | ||
2807 | return ret; | ||
2808 | } | ||
2809 | |||
2810 | static int wm8915_remove(struct snd_soc_codec *codec) | ||
2811 | { | ||
2812 | struct wm8915_priv *wm8915 = snd_soc_codec_get_drvdata(codec); | ||
2813 | struct i2c_client *i2c = to_i2c_client(codec->dev); | ||
2814 | int i; | ||
2815 | |||
2816 | snd_soc_update_bits(codec, WM8915_INTERRUPT_CONTROL, | ||
2817 | WM8915_IM_IRQ, WM8915_IM_IRQ); | ||
2818 | |||
2819 | if (i2c->irq) | ||
2820 | free_irq(i2c->irq, codec); | ||
2821 | |||
2822 | wm8915_free_gpio(codec); | ||
2823 | |||
2824 | for (i = 0; i < ARRAY_SIZE(wm8915->supplies); i++) | ||
2825 | regulator_unregister_notifier(wm8915->supplies[i].consumer, | ||
2826 | &wm8915->disable_nb[i]); | ||
2827 | regulator_bulk_free(ARRAY_SIZE(wm8915->supplies), wm8915->supplies); | ||
2828 | |||
2829 | return 0; | ||
2830 | } | ||
2831 | |||
2832 | static struct snd_soc_codec_driver soc_codec_dev_wm8915 = { | ||
2833 | .probe = wm8915_probe, | ||
2834 | .remove = wm8915_remove, | ||
2835 | .set_bias_level = wm8915_set_bias_level, | ||
2836 | .seq_notifier = wm8915_seq_notifier, | ||
2837 | .reg_cache_size = WM8915_MAX_REGISTER + 1, | ||
2838 | .reg_word_size = sizeof(u16), | ||
2839 | .reg_cache_default = wm8915_reg, | ||
2840 | .volatile_register = wm8915_volatile_register, | ||
2841 | .readable_register = wm8915_readable_register, | ||
2842 | .compress_type = SND_SOC_RBTREE_COMPRESSION, | ||
2843 | .controls = wm8915_snd_controls, | ||
2844 | .num_controls = ARRAY_SIZE(wm8915_snd_controls), | ||
2845 | .dapm_widgets = wm8915_dapm_widgets, | ||
2846 | .num_dapm_widgets = ARRAY_SIZE(wm8915_dapm_widgets), | ||
2847 | .dapm_routes = wm8915_dapm_routes, | ||
2848 | .num_dapm_routes = ARRAY_SIZE(wm8915_dapm_routes), | ||
2849 | .set_pll = wm8915_set_fll, | ||
2850 | }; | ||
2851 | |||
2852 | #define WM8915_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ | ||
2853 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000) | ||
2854 | #define WM8915_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\ | ||
2855 | SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE |\ | ||
2856 | SNDRV_PCM_FMTBIT_S32_LE) | ||
2857 | |||
2858 | static struct snd_soc_dai_ops wm8915_dai_ops = { | ||
2859 | .set_fmt = wm8915_set_fmt, | ||
2860 | .hw_params = wm8915_hw_params, | ||
2861 | .set_sysclk = wm8915_set_sysclk, | ||
2862 | }; | ||
2863 | |||
2864 | static struct snd_soc_dai_driver wm8915_dai[] = { | ||
2865 | { | ||
2866 | .name = "wm8915-aif1", | ||
2867 | .playback = { | ||
2868 | .stream_name = "AIF1 Playback", | ||
2869 | .channels_min = 1, | ||
2870 | .channels_max = 6, | ||
2871 | .rates = WM8915_RATES, | ||
2872 | .formats = WM8915_FORMATS, | ||
2873 | }, | ||
2874 | .capture = { | ||
2875 | .stream_name = "AIF1 Capture", | ||
2876 | .channels_min = 1, | ||
2877 | .channels_max = 6, | ||
2878 | .rates = WM8915_RATES, | ||
2879 | .formats = WM8915_FORMATS, | ||
2880 | }, | ||
2881 | .ops = &wm8915_dai_ops, | ||
2882 | }, | ||
2883 | { | ||
2884 | .name = "wm8915-aif2", | ||
2885 | .playback = { | ||
2886 | .stream_name = "AIF2 Playback", | ||
2887 | .channels_min = 1, | ||
2888 | .channels_max = 2, | ||
2889 | .rates = WM8915_RATES, | ||
2890 | .formats = WM8915_FORMATS, | ||
2891 | }, | ||
2892 | .capture = { | ||
2893 | .stream_name = "AIF2 Capture", | ||
2894 | .channels_min = 1, | ||
2895 | .channels_max = 2, | ||
2896 | .rates = WM8915_RATES, | ||
2897 | .formats = WM8915_FORMATS, | ||
2898 | }, | ||
2899 | .ops = &wm8915_dai_ops, | ||
2900 | }, | ||
2901 | }; | ||
2902 | |||
2903 | static __devinit int wm8915_i2c_probe(struct i2c_client *i2c, | ||
2904 | const struct i2c_device_id *id) | ||
2905 | { | ||
2906 | struct wm8915_priv *wm8915; | ||
2907 | int ret; | ||
2908 | |||
2909 | wm8915 = kzalloc(sizeof(struct wm8915_priv), GFP_KERNEL); | ||
2910 | if (wm8915 == NULL) | ||
2911 | return -ENOMEM; | ||
2912 | |||
2913 | i2c_set_clientdata(i2c, wm8915); | ||
2914 | |||
2915 | if (dev_get_platdata(&i2c->dev)) | ||
2916 | memcpy(&wm8915->pdata, dev_get_platdata(&i2c->dev), | ||
2917 | sizeof(wm8915->pdata)); | ||
2918 | |||
2919 | if (wm8915->pdata.ldo_ena > 0) { | ||
2920 | ret = gpio_request_one(wm8915->pdata.ldo_ena, | ||
2921 | GPIOF_OUT_INIT_LOW, "WM8915 ENA"); | ||
2922 | if (ret < 0) { | ||
2923 | dev_err(&i2c->dev, "Failed to request GPIO %d: %d\n", | ||
2924 | wm8915->pdata.ldo_ena, ret); | ||
2925 | goto err; | ||
2926 | } | ||
2927 | } | ||
2928 | |||
2929 | ret = snd_soc_register_codec(&i2c->dev, | ||
2930 | &soc_codec_dev_wm8915, wm8915_dai, | ||
2931 | ARRAY_SIZE(wm8915_dai)); | ||
2932 | if (ret < 0) | ||
2933 | goto err_gpio; | ||
2934 | |||
2935 | return ret; | ||
2936 | |||
2937 | err_gpio: | ||
2938 | if (wm8915->pdata.ldo_ena > 0) | ||
2939 | gpio_free(wm8915->pdata.ldo_ena); | ||
2940 | err: | ||
2941 | kfree(wm8915); | ||
2942 | |||
2943 | return ret; | ||
2944 | } | ||
2945 | |||
2946 | static __devexit int wm8915_i2c_remove(struct i2c_client *client) | ||
2947 | { | ||
2948 | struct wm8915_priv *wm8915 = i2c_get_clientdata(client); | ||
2949 | |||
2950 | snd_soc_unregister_codec(&client->dev); | ||
2951 | if (wm8915->pdata.ldo_ena > 0) | ||
2952 | gpio_free(wm8915->pdata.ldo_ena); | ||
2953 | kfree(i2c_get_clientdata(client)); | ||
2954 | return 0; | ||
2955 | } | ||
2956 | |||
2957 | static const struct i2c_device_id wm8915_i2c_id[] = { | ||
2958 | { "wm8915", 0 }, | ||
2959 | { } | ||
2960 | }; | ||
2961 | MODULE_DEVICE_TABLE(i2c, wm8915_i2c_id); | ||
2962 | |||
2963 | static struct i2c_driver wm8915_i2c_driver = { | ||
2964 | .driver = { | ||
2965 | .name = "wm8915", | ||
2966 | .owner = THIS_MODULE, | ||
2967 | }, | ||
2968 | .probe = wm8915_i2c_probe, | ||
2969 | .remove = __devexit_p(wm8915_i2c_remove), | ||
2970 | .id_table = wm8915_i2c_id, | ||
2971 | }; | ||
2972 | |||
2973 | static int __init wm8915_modinit(void) | ||
2974 | { | ||
2975 | int ret; | ||
2976 | |||
2977 | ret = i2c_add_driver(&wm8915_i2c_driver); | ||
2978 | if (ret != 0) { | ||
2979 | printk(KERN_ERR "Failed to register WM8915 I2C driver: %d\n", | ||
2980 | ret); | ||
2981 | } | ||
2982 | |||
2983 | return ret; | ||
2984 | } | ||
2985 | module_init(wm8915_modinit); | ||
2986 | |||
2987 | static void __exit wm8915_exit(void) | ||
2988 | { | ||
2989 | i2c_del_driver(&wm8915_i2c_driver); | ||
2990 | } | ||
2991 | module_exit(wm8915_exit); | ||
2992 | |||
2993 | MODULE_DESCRIPTION("ASoC WM8915 driver"); | ||
2994 | MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); | ||
2995 | MODULE_LICENSE("GPL"); | ||
diff --git a/sound/soc/codecs/wm8915.h b/sound/soc/codecs/wm8915.h deleted file mode 100644 index 200ffd7bf953..000000000000 --- a/sound/soc/codecs/wm8915.h +++ /dev/null | |||
@@ -1,3717 +0,0 @@ | |||
1 | /* | ||
2 | * wm8915.h - WM8915 audio codec interface | ||
3 | * | ||
4 | * Copyright 2011 Wolfson Microelectronics PLC. | ||
5 | * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef _WM8915_H | ||
14 | #define _WM8915_H | ||
15 | |||
16 | #define WM8915_SYSCLK_MCLK1 1 | ||
17 | #define WM8915_SYSCLK_MCLK2 2 | ||
18 | #define WM8915_SYSCLK_FLL 3 | ||
19 | |||
20 | #define WM8915_FLL_MCLK1 1 | ||
21 | #define WM8915_FLL_MCLK2 2 | ||
22 | #define WM8915_FLL_DACLRCLK1 3 | ||
23 | #define WM8915_FLL_BCLK1 4 | ||
24 | |||
25 | typedef void (*wm8915_polarity_fn)(struct snd_soc_codec *codec, int polarity); | ||
26 | |||
27 | int wm8915_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | ||
28 | wm8915_polarity_fn polarity_cb); | ||
29 | |||
30 | /* | ||
31 | * Register values. | ||
32 | */ | ||
33 | #define WM8915_SOFTWARE_RESET 0x00 | ||
34 | #define WM8915_POWER_MANAGEMENT_1 0x01 | ||
35 | #define WM8915_POWER_MANAGEMENT_2 0x02 | ||
36 | #define WM8915_POWER_MANAGEMENT_3 0x03 | ||
37 | #define WM8915_POWER_MANAGEMENT_4 0x04 | ||
38 | #define WM8915_POWER_MANAGEMENT_5 0x05 | ||
39 | #define WM8915_POWER_MANAGEMENT_6 0x06 | ||
40 | #define WM8915_POWER_MANAGEMENT_7 0x07 | ||
41 | #define WM8915_POWER_MANAGEMENT_8 0x08 | ||
42 | #define WM8915_LEFT_LINE_INPUT_VOLUME 0x10 | ||
43 | #define WM8915_RIGHT_LINE_INPUT_VOLUME 0x11 | ||
44 | #define WM8915_LINE_INPUT_CONTROL 0x12 | ||
45 | #define WM8915_DAC1_HPOUT1_VOLUME 0x15 | ||
46 | #define WM8915_DAC2_HPOUT2_VOLUME 0x16 | ||
47 | #define WM8915_DAC1_LEFT_VOLUME 0x18 | ||
48 | #define WM8915_DAC1_RIGHT_VOLUME 0x19 | ||
49 | #define WM8915_DAC2_LEFT_VOLUME 0x1A | ||
50 | #define WM8915_DAC2_RIGHT_VOLUME 0x1B | ||
51 | #define WM8915_OUTPUT1_LEFT_VOLUME 0x1C | ||
52 | #define WM8915_OUTPUT1_RIGHT_VOLUME 0x1D | ||
53 | #define WM8915_OUTPUT2_LEFT_VOLUME 0x1E | ||
54 | #define WM8915_OUTPUT2_RIGHT_VOLUME 0x1F | ||
55 | #define WM8915_MICBIAS_1 0x20 | ||
56 | #define WM8915_MICBIAS_2 0x21 | ||
57 | #define WM8915_LDO_1 0x28 | ||
58 | #define WM8915_LDO_2 0x29 | ||
59 | #define WM8915_ACCESSORY_DETECT_MODE_1 0x30 | ||
60 | #define WM8915_ACCESSORY_DETECT_MODE_2 0x31 | ||
61 | #define WM8915_HEADPHONE_DETECT_1 0x34 | ||
62 | #define WM8915_HEADPHONE_DETECT_2 0x35 | ||
63 | #define WM8915_MIC_DETECT_1 0x38 | ||
64 | #define WM8915_MIC_DETECT_2 0x39 | ||
65 | #define WM8915_MIC_DETECT_3 0x3A | ||
66 | #define WM8915_CHARGE_PUMP_1 0x40 | ||
67 | #define WM8915_CHARGE_PUMP_2 0x41 | ||
68 | #define WM8915_DC_SERVO_1 0x50 | ||
69 | #define WM8915_DC_SERVO_2 0x51 | ||
70 | #define WM8915_DC_SERVO_3 0x52 | ||
71 | #define WM8915_DC_SERVO_5 0x54 | ||
72 | #define WM8915_DC_SERVO_6 0x55 | ||
73 | #define WM8915_DC_SERVO_7 0x56 | ||
74 | #define WM8915_DC_SERVO_READBACK_0 0x57 | ||
75 | #define WM8915_ANALOGUE_HP_1 0x60 | ||
76 | #define WM8915_ANALOGUE_HP_2 0x61 | ||
77 | #define WM8915_CHIP_REVISION 0x100 | ||
78 | #define WM8915_CONTROL_INTERFACE_1 0x101 | ||
79 | #define WM8915_WRITE_SEQUENCER_CTRL_1 0x110 | ||
80 | #define WM8915_WRITE_SEQUENCER_CTRL_2 0x111 | ||
81 | #define WM8915_AIF_CLOCKING_1 0x200 | ||
82 | #define WM8915_AIF_CLOCKING_2 0x201 | ||
83 | #define WM8915_CLOCKING_1 0x208 | ||
84 | #define WM8915_CLOCKING_2 0x209 | ||
85 | #define WM8915_AIF_RATE 0x210 | ||
86 | #define WM8915_FLL_CONTROL_1 0x220 | ||
87 | #define WM8915_FLL_CONTROL_2 0x221 | ||
88 | #define WM8915_FLL_CONTROL_3 0x222 | ||
89 | #define WM8915_FLL_CONTROL_4 0x223 | ||
90 | #define WM8915_FLL_CONTROL_5 0x224 | ||
91 | #define WM8915_FLL_CONTROL_6 0x225 | ||
92 | #define WM8915_FLL_EFS_1 0x226 | ||
93 | #define WM8915_FLL_EFS_2 0x227 | ||
94 | #define WM8915_AIF1_CONTROL 0x300 | ||
95 | #define WM8915_AIF1_BCLK 0x301 | ||
96 | #define WM8915_AIF1_TX_LRCLK_1 0x302 | ||
97 | #define WM8915_AIF1_TX_LRCLK_2 0x303 | ||
98 | #define WM8915_AIF1_RX_LRCLK_1 0x304 | ||
99 | #define WM8915_AIF1_RX_LRCLK_2 0x305 | ||
100 | #define WM8915_AIF1TX_DATA_CONFIGURATION_1 0x306 | ||
101 | #define WM8915_AIF1TX_DATA_CONFIGURATION_2 0x307 | ||
102 | #define WM8915_AIF1RX_DATA_CONFIGURATION 0x308 | ||
103 | #define WM8915_AIF1TX_CHANNEL_0_CONFIGURATION 0x309 | ||
104 | #define WM8915_AIF1TX_CHANNEL_1_CONFIGURATION 0x30A | ||
105 | #define WM8915_AIF1TX_CHANNEL_2_CONFIGURATION 0x30B | ||
106 | #define WM8915_AIF1TX_CHANNEL_3_CONFIGURATION 0x30C | ||
107 | #define WM8915_AIF1TX_CHANNEL_4_CONFIGURATION 0x30D | ||
108 | #define WM8915_AIF1TX_CHANNEL_5_CONFIGURATION 0x30E | ||
109 | #define WM8915_AIF1RX_CHANNEL_0_CONFIGURATION 0x30F | ||
110 | #define WM8915_AIF1RX_CHANNEL_1_CONFIGURATION 0x310 | ||
111 | #define WM8915_AIF1RX_CHANNEL_2_CONFIGURATION 0x311 | ||
112 | #define WM8915_AIF1RX_CHANNEL_3_CONFIGURATION 0x312 | ||
113 | #define WM8915_AIF1RX_CHANNEL_4_CONFIGURATION 0x313 | ||
114 | #define WM8915_AIF1RX_CHANNEL_5_CONFIGURATION 0x314 | ||
115 | #define WM8915_AIF1RX_MONO_CONFIGURATION 0x315 | ||
116 | #define WM8915_AIF1TX_TEST 0x31A | ||
117 | #define WM8915_AIF2_CONTROL 0x320 | ||
118 | #define WM8915_AIF2_BCLK 0x321 | ||
119 | #define WM8915_AIF2_TX_LRCLK_1 0x322 | ||
120 | #define WM8915_AIF2_TX_LRCLK_2 0x323 | ||
121 | #define WM8915_AIF2_RX_LRCLK_1 0x324 | ||
122 | #define WM8915_AIF2_RX_LRCLK_2 0x325 | ||
123 | #define WM8915_AIF2TX_DATA_CONFIGURATION_1 0x326 | ||
124 | #define WM8915_AIF2TX_DATA_CONFIGURATION_2 0x327 | ||
125 | #define WM8915_AIF2RX_DATA_CONFIGURATION 0x328 | ||
126 | #define WM8915_AIF2TX_CHANNEL_0_CONFIGURATION 0x329 | ||
127 | #define WM8915_AIF2TX_CHANNEL_1_CONFIGURATION 0x32A | ||
128 | #define WM8915_AIF2RX_CHANNEL_0_CONFIGURATION 0x32B | ||
129 | #define WM8915_AIF2RX_CHANNEL_1_CONFIGURATION 0x32C | ||
130 | #define WM8915_AIF2RX_MONO_CONFIGURATION 0x32D | ||
131 | #define WM8915_AIF2TX_TEST 0x32F | ||
132 | #define WM8915_DSP1_TX_LEFT_VOLUME 0x400 | ||
133 | #define WM8915_DSP1_TX_RIGHT_VOLUME 0x401 | ||
134 | #define WM8915_DSP1_RX_LEFT_VOLUME 0x402 | ||
135 | #define WM8915_DSP1_RX_RIGHT_VOLUME 0x403 | ||
136 | #define WM8915_DSP1_TX_FILTERS 0x410 | ||
137 | #define WM8915_DSP1_RX_FILTERS_1 0x420 | ||
138 | #define WM8915_DSP1_RX_FILTERS_2 0x421 | ||
139 | #define WM8915_DSP1_DRC_1 0x440 | ||
140 | #define WM8915_DSP1_DRC_2 0x441 | ||
141 | #define WM8915_DSP1_DRC_3 0x442 | ||
142 | #define WM8915_DSP1_DRC_4 0x443 | ||
143 | #define WM8915_DSP1_DRC_5 0x444 | ||
144 | #define WM8915_DSP1_RX_EQ_GAINS_1 0x480 | ||
145 | #define WM8915_DSP1_RX_EQ_GAINS_2 0x481 | ||
146 | #define WM8915_DSP1_RX_EQ_BAND_1_A 0x482 | ||
147 | #define WM8915_DSP1_RX_EQ_BAND_1_B 0x483 | ||
148 | #define WM8915_DSP1_RX_EQ_BAND_1_PG 0x484 | ||
149 | #define WM8915_DSP1_RX_EQ_BAND_2_A 0x485 | ||
150 | #define WM8915_DSP1_RX_EQ_BAND_2_B 0x486 | ||
151 | #define WM8915_DSP1_RX_EQ_BAND_2_C 0x487 | ||
152 | #define WM8915_DSP1_RX_EQ_BAND_2_PG 0x488 | ||
153 | #define WM8915_DSP1_RX_EQ_BAND_3_A 0x489 | ||
154 | #define WM8915_DSP1_RX_EQ_BAND_3_B 0x48A | ||
155 | #define WM8915_DSP1_RX_EQ_BAND_3_C 0x48B | ||
156 | #define WM8915_DSP1_RX_EQ_BAND_3_PG 0x48C | ||
157 | #define WM8915_DSP1_RX_EQ_BAND_4_A 0x48D | ||
158 | #define WM8915_DSP1_RX_EQ_BAND_4_B 0x48E | ||
159 | #define WM8915_DSP1_RX_EQ_BAND_4_C 0x48F | ||
160 | #define WM8915_DSP1_RX_EQ_BAND_4_PG 0x490 | ||
161 | #define WM8915_DSP1_RX_EQ_BAND_5_A 0x491 | ||
162 | #define WM8915_DSP1_RX_EQ_BAND_5_B 0x492 | ||
163 | #define WM8915_DSP1_RX_EQ_BAND_5_PG 0x493 | ||
164 | #define WM8915_DSP2_TX_LEFT_VOLUME 0x500 | ||
165 | #define WM8915_DSP2_TX_RIGHT_VOLUME 0x501 | ||
166 | #define WM8915_DSP2_RX_LEFT_VOLUME 0x502 | ||
167 | #define WM8915_DSP2_RX_RIGHT_VOLUME 0x503 | ||
168 | #define WM8915_DSP2_TX_FILTERS 0x510 | ||
169 | #define WM8915_DSP2_RX_FILTERS_1 0x520 | ||
170 | #define WM8915_DSP2_RX_FILTERS_2 0x521 | ||
171 | #define WM8915_DSP2_DRC_1 0x540 | ||
172 | #define WM8915_DSP2_DRC_2 0x541 | ||
173 | #define WM8915_DSP2_DRC_3 0x542 | ||
174 | #define WM8915_DSP2_DRC_4 0x543 | ||
175 | #define WM8915_DSP2_DRC_5 0x544 | ||
176 | #define WM8915_DSP2_RX_EQ_GAINS_1 0x580 | ||
177 | #define WM8915_DSP2_RX_EQ_GAINS_2 0x581 | ||
178 | #define WM8915_DSP2_RX_EQ_BAND_1_A 0x582 | ||
179 | #define WM8915_DSP2_RX_EQ_BAND_1_B 0x583 | ||
180 | #define WM8915_DSP2_RX_EQ_BAND_1_PG 0x584 | ||
181 | #define WM8915_DSP2_RX_EQ_BAND_2_A 0x585 | ||
182 | #define WM8915_DSP2_RX_EQ_BAND_2_B 0x586 | ||
183 | #define WM8915_DSP2_RX_EQ_BAND_2_C 0x587 | ||
184 | #define WM8915_DSP2_RX_EQ_BAND_2_PG 0x588 | ||
185 | #define WM8915_DSP2_RX_EQ_BAND_3_A 0x589 | ||
186 | #define WM8915_DSP2_RX_EQ_BAND_3_B 0x58A | ||
187 | #define WM8915_DSP2_RX_EQ_BAND_3_C 0x58B | ||
188 | #define WM8915_DSP2_RX_EQ_BAND_3_PG 0x58C | ||
189 | #define WM8915_DSP2_RX_EQ_BAND_4_A 0x58D | ||
190 | #define WM8915_DSP2_RX_EQ_BAND_4_B 0x58E | ||
191 | #define WM8915_DSP2_RX_EQ_BAND_4_C 0x58F | ||
192 | #define WM8915_DSP2_RX_EQ_BAND_4_PG 0x590 | ||
193 | #define WM8915_DSP2_RX_EQ_BAND_5_A 0x591 | ||
194 | #define WM8915_DSP2_RX_EQ_BAND_5_B 0x592 | ||
195 | #define WM8915_DSP2_RX_EQ_BAND_5_PG 0x593 | ||
196 | #define WM8915_DAC1_MIXER_VOLUMES 0x600 | ||
197 | #define WM8915_DAC1_LEFT_MIXER_ROUTING 0x601 | ||
198 | #define WM8915_DAC1_RIGHT_MIXER_ROUTING 0x602 | ||
199 | #define WM8915_DAC2_MIXER_VOLUMES 0x603 | ||
200 | #define WM8915_DAC2_LEFT_MIXER_ROUTING 0x604 | ||
201 | #define WM8915_DAC2_RIGHT_MIXER_ROUTING 0x605 | ||
202 | #define WM8915_DSP1_TX_LEFT_MIXER_ROUTING 0x606 | ||
203 | #define WM8915_DSP1_TX_RIGHT_MIXER_ROUTING 0x607 | ||
204 | #define WM8915_DSP2_TX_LEFT_MIXER_ROUTING 0x608 | ||
205 | #define WM8915_DSP2_TX_RIGHT_MIXER_ROUTING 0x609 | ||
206 | #define WM8915_DSP_TX_MIXER_SELECT 0x60A | ||
207 | #define WM8915_DAC_SOFTMUTE 0x610 | ||
208 | #define WM8915_OVERSAMPLING 0x620 | ||
209 | #define WM8915_SIDETONE 0x621 | ||
210 | #define WM8915_GPIO_1 0x700 | ||
211 | #define WM8915_GPIO_2 0x701 | ||
212 | #define WM8915_GPIO_3 0x702 | ||
213 | #define WM8915_GPIO_4 0x703 | ||
214 | #define WM8915_GPIO_5 0x704 | ||
215 | #define WM8915_PULL_CONTROL_1 0x720 | ||
216 | #define WM8915_PULL_CONTROL_2 0x721 | ||
217 | #define WM8915_INTERRUPT_STATUS_1 0x730 | ||
218 | #define WM8915_INTERRUPT_STATUS_2 0x731 | ||
219 | #define WM8915_INTERRUPT_RAW_STATUS_2 0x732 | ||
220 | #define WM8915_INTERRUPT_STATUS_1_MASK 0x738 | ||
221 | #define WM8915_INTERRUPT_STATUS_2_MASK 0x739 | ||
222 | #define WM8915_INTERRUPT_CONTROL 0x740 | ||
223 | #define WM8915_LEFT_PDM_SPEAKER 0x800 | ||
224 | #define WM8915_RIGHT_PDM_SPEAKER 0x801 | ||
225 | #define WM8915_PDM_SPEAKER_MUTE_SEQUENCE 0x802 | ||
226 | #define WM8915_PDM_SPEAKER_VOLUME 0x803 | ||
227 | #define WM8915_WRITE_SEQUENCER_0 0x3000 | ||
228 | #define WM8915_WRITE_SEQUENCER_1 0x3001 | ||
229 | #define WM8915_WRITE_SEQUENCER_2 0x3002 | ||
230 | #define WM8915_WRITE_SEQUENCER_3 0x3003 | ||
231 | #define WM8915_WRITE_SEQUENCER_4 0x3004 | ||
232 | #define WM8915_WRITE_SEQUENCER_5 0x3005 | ||
233 | #define WM8915_WRITE_SEQUENCER_6 0x3006 | ||
234 | #define WM8915_WRITE_SEQUENCER_7 0x3007 | ||
235 | #define WM8915_WRITE_SEQUENCER_8 0x3008 | ||
236 | #define WM8915_WRITE_SEQUENCER_9 0x3009 | ||
237 | #define WM8915_WRITE_SEQUENCER_10 0x300A | ||
238 | #define WM8915_WRITE_SEQUENCER_11 0x300B | ||
239 | #define WM8915_WRITE_SEQUENCER_12 0x300C | ||
240 | #define WM8915_WRITE_SEQUENCER_13 0x300D | ||
241 | #define WM8915_WRITE_SEQUENCER_14 0x300E | ||
242 | #define WM8915_WRITE_SEQUENCER_15 0x300F | ||
243 | #define WM8915_WRITE_SEQUENCER_16 0x3010 | ||
244 | #define WM8915_WRITE_SEQUENCER_17 0x3011 | ||
245 | #define WM8915_WRITE_SEQUENCER_18 0x3012 | ||
246 | #define WM8915_WRITE_SEQUENCER_19 0x3013 | ||
247 | #define WM8915_WRITE_SEQUENCER_20 0x3014 | ||
248 | #define WM8915_WRITE_SEQUENCER_21 0x3015 | ||
249 | #define WM8915_WRITE_SEQUENCER_22 0x3016 | ||
250 | #define WM8915_WRITE_SEQUENCER_23 0x3017 | ||
251 | #define WM8915_WRITE_SEQUENCER_24 0x3018 | ||
252 | #define WM8915_WRITE_SEQUENCER_25 0x3019 | ||
253 | #define WM8915_WRITE_SEQUENCER_26 0x301A | ||
254 | #define WM8915_WRITE_SEQUENCER_27 0x301B | ||
255 | #define WM8915_WRITE_SEQUENCER_28 0x301C | ||
256 | #define WM8915_WRITE_SEQUENCER_29 0x301D | ||
257 | #define WM8915_WRITE_SEQUENCER_30 0x301E | ||
258 | #define WM8915_WRITE_SEQUENCER_31 0x301F | ||
259 | #define WM8915_WRITE_SEQUENCER_32 0x3020 | ||
260 | #define WM8915_WRITE_SEQUENCER_33 0x3021 | ||
261 | #define WM8915_WRITE_SEQUENCER_34 0x3022 | ||
262 | #define WM8915_WRITE_SEQUENCER_35 0x3023 | ||
263 | #define WM8915_WRITE_SEQUENCER_36 0x3024 | ||
264 | #define WM8915_WRITE_SEQUENCER_37 0x3025 | ||
265 | #define WM8915_WRITE_SEQUENCER_38 0x3026 | ||
266 | #define WM8915_WRITE_SEQUENCER_39 0x3027 | ||
267 | #define WM8915_WRITE_SEQUENCER_40 0x3028 | ||
268 | #define WM8915_WRITE_SEQUENCER_41 0x3029 | ||
269 | #define WM8915_WRITE_SEQUENCER_42 0x302A | ||
270 | #define WM8915_WRITE_SEQUENCER_43 0x302B | ||
271 | #define WM8915_WRITE_SEQUENCER_44 0x302C | ||
272 | #define WM8915_WRITE_SEQUENCER_45 0x302D | ||
273 | #define WM8915_WRITE_SEQUENCER_46 0x302E | ||
274 | #define WM8915_WRITE_SEQUENCER_47 0x302F | ||
275 | #define WM8915_WRITE_SEQUENCER_48 0x3030 | ||
276 | #define WM8915_WRITE_SEQUENCER_49 0x3031 | ||
277 | #define WM8915_WRITE_SEQUENCER_50 0x3032 | ||
278 | #define WM8915_WRITE_SEQUENCER_51 0x3033 | ||
279 | #define WM8915_WRITE_SEQUENCER_52 0x3034 | ||
280 | #define WM8915_WRITE_SEQUENCER_53 0x3035 | ||
281 | #define WM8915_WRITE_SEQUENCER_54 0x3036 | ||
282 | #define WM8915_WRITE_SEQUENCER_55 0x3037 | ||
283 | #define WM8915_WRITE_SEQUENCER_56 0x3038 | ||
284 | #define WM8915_WRITE_SEQUENCER_57 0x3039 | ||
285 | #define WM8915_WRITE_SEQUENCER_58 0x303A | ||
286 | #define WM8915_WRITE_SEQUENCER_59 0x303B | ||
287 | #define WM8915_WRITE_SEQUENCER_60 0x303C | ||
288 | #define WM8915_WRITE_SEQUENCER_61 0x303D | ||
289 | #define WM8915_WRITE_SEQUENCER_62 0x303E | ||
290 | #define WM8915_WRITE_SEQUENCER_63 0x303F | ||
291 | #define WM8915_WRITE_SEQUENCER_64 0x3040 | ||
292 | #define WM8915_WRITE_SEQUENCER_65 0x3041 | ||
293 | #define WM8915_WRITE_SEQUENCER_66 0x3042 | ||
294 | #define WM8915_WRITE_SEQUENCER_67 0x3043 | ||
295 | #define WM8915_WRITE_SEQUENCER_68 0x3044 | ||
296 | #define WM8915_WRITE_SEQUENCER_69 0x3045 | ||
297 | #define WM8915_WRITE_SEQUENCER_70 0x3046 | ||
298 | #define WM8915_WRITE_SEQUENCER_71 0x3047 | ||
299 | #define WM8915_WRITE_SEQUENCER_72 0x3048 | ||
300 | #define WM8915_WRITE_SEQUENCER_73 0x3049 | ||
301 | #define WM8915_WRITE_SEQUENCER_74 0x304A | ||
302 | #define WM8915_WRITE_SEQUENCER_75 0x304B | ||
303 | #define WM8915_WRITE_SEQUENCER_76 0x304C | ||
304 | #define WM8915_WRITE_SEQUENCER_77 0x304D | ||
305 | #define WM8915_WRITE_SEQUENCER_78 0x304E | ||
306 | #define WM8915_WRITE_SEQUENCER_79 0x304F | ||
307 | #define WM8915_WRITE_SEQUENCER_80 0x3050 | ||
308 | #define WM8915_WRITE_SEQUENCER_81 0x3051 | ||
309 | #define WM8915_WRITE_SEQUENCER_82 0x3052 | ||
310 | #define WM8915_WRITE_SEQUENCER_83 0x3053 | ||
311 | #define WM8915_WRITE_SEQUENCER_84 0x3054 | ||
312 | #define WM8915_WRITE_SEQUENCER_85 0x3055 | ||
313 | #define WM8915_WRITE_SEQUENCER_86 0x3056 | ||
314 | #define WM8915_WRITE_SEQUENCER_87 0x3057 | ||
315 | #define WM8915_WRITE_SEQUENCER_88 0x3058 | ||
316 | #define WM8915_WRITE_SEQUENCER_89 0x3059 | ||
317 | #define WM8915_WRITE_SEQUENCER_90 0x305A | ||
318 | #define WM8915_WRITE_SEQUENCER_91 0x305B | ||
319 | #define WM8915_WRITE_SEQUENCER_92 0x305C | ||
320 | #define WM8915_WRITE_SEQUENCER_93 0x305D | ||
321 | #define WM8915_WRITE_SEQUENCER_94 0x305E | ||
322 | #define WM8915_WRITE_SEQUENCER_95 0x305F | ||
323 | #define WM8915_WRITE_SEQUENCER_96 0x3060 | ||
324 | #define WM8915_WRITE_SEQUENCER_97 0x3061 | ||
325 | #define WM8915_WRITE_SEQUENCER_98 0x3062 | ||
326 | #define WM8915_WRITE_SEQUENCER_99 0x3063 | ||
327 | #define WM8915_WRITE_SEQUENCER_100 0x3064 | ||
328 | #define WM8915_WRITE_SEQUENCER_101 0x3065 | ||
329 | #define WM8915_WRITE_SEQUENCER_102 0x3066 | ||
330 | #define WM8915_WRITE_SEQUENCER_103 0x3067 | ||
331 | #define WM8915_WRITE_SEQUENCER_104 0x3068 | ||
332 | #define WM8915_WRITE_SEQUENCER_105 0x3069 | ||
333 | #define WM8915_WRITE_SEQUENCER_106 0x306A | ||
334 | #define WM8915_WRITE_SEQUENCER_107 0x306B | ||
335 | #define WM8915_WRITE_SEQUENCER_108 0x306C | ||
336 | #define WM8915_WRITE_SEQUENCER_109 0x306D | ||
337 | #define WM8915_WRITE_SEQUENCER_110 0x306E | ||
338 | #define WM8915_WRITE_SEQUENCER_111 0x306F | ||
339 | #define WM8915_WRITE_SEQUENCER_112 0x3070 | ||
340 | #define WM8915_WRITE_SEQUENCER_113 0x3071 | ||
341 | #define WM8915_WRITE_SEQUENCER_114 0x3072 | ||
342 | #define WM8915_WRITE_SEQUENCER_115 0x3073 | ||
343 | #define WM8915_WRITE_SEQUENCER_116 0x3074 | ||
344 | #define WM8915_WRITE_SEQUENCER_117 0x3075 | ||
345 | #define WM8915_WRITE_SEQUENCER_118 0x3076 | ||
346 | #define WM8915_WRITE_SEQUENCER_119 0x3077 | ||
347 | #define WM8915_WRITE_SEQUENCER_120 0x3078 | ||
348 | #define WM8915_WRITE_SEQUENCER_121 0x3079 | ||
349 | #define WM8915_WRITE_SEQUENCER_122 0x307A | ||
350 | #define WM8915_WRITE_SEQUENCER_123 0x307B | ||
351 | #define WM8915_WRITE_SEQUENCER_124 0x307C | ||
352 | #define WM8915_WRITE_SEQUENCER_125 0x307D | ||
353 | #define WM8915_WRITE_SEQUENCER_126 0x307E | ||
354 | #define WM8915_WRITE_SEQUENCER_127 0x307F | ||
355 | #define WM8915_WRITE_SEQUENCER_128 0x3080 | ||
356 | #define WM8915_WRITE_SEQUENCER_129 0x3081 | ||
357 | #define WM8915_WRITE_SEQUENCER_130 0x3082 | ||
358 | #define WM8915_WRITE_SEQUENCER_131 0x3083 | ||
359 | #define WM8915_WRITE_SEQUENCER_132 0x3084 | ||
360 | #define WM8915_WRITE_SEQUENCER_133 0x3085 | ||
361 | #define WM8915_WRITE_SEQUENCER_134 0x3086 | ||
362 | #define WM8915_WRITE_SEQUENCER_135 0x3087 | ||
363 | #define WM8915_WRITE_SEQUENCER_136 0x3088 | ||
364 | #define WM8915_WRITE_SEQUENCER_137 0x3089 | ||
365 | #define WM8915_WRITE_SEQUENCER_138 0x308A | ||
366 | #define WM8915_WRITE_SEQUENCER_139 0x308B | ||
367 | #define WM8915_WRITE_SEQUENCER_140 0x308C | ||
368 | #define WM8915_WRITE_SEQUENCER_141 0x308D | ||
369 | #define WM8915_WRITE_SEQUENCER_142 0x308E | ||
370 | #define WM8915_WRITE_SEQUENCER_143 0x308F | ||
371 | #define WM8915_WRITE_SEQUENCER_144 0x3090 | ||
372 | #define WM8915_WRITE_SEQUENCER_145 0x3091 | ||
373 | #define WM8915_WRITE_SEQUENCER_146 0x3092 | ||
374 | #define WM8915_WRITE_SEQUENCER_147 0x3093 | ||
375 | #define WM8915_WRITE_SEQUENCER_148 0x3094 | ||
376 | #define WM8915_WRITE_SEQUENCER_149 0x3095 | ||
377 | #define WM8915_WRITE_SEQUENCER_150 0x3096 | ||
378 | #define WM8915_WRITE_SEQUENCER_151 0x3097 | ||
379 | #define WM8915_WRITE_SEQUENCER_152 0x3098 | ||
380 | #define WM8915_WRITE_SEQUENCER_153 0x3099 | ||
381 | #define WM8915_WRITE_SEQUENCER_154 0x309A | ||
382 | #define WM8915_WRITE_SEQUENCER_155 0x309B | ||
383 | #define WM8915_WRITE_SEQUENCER_156 0x309C | ||
384 | #define WM8915_WRITE_SEQUENCER_157 0x309D | ||
385 | #define WM8915_WRITE_SEQUENCER_158 0x309E | ||
386 | #define WM8915_WRITE_SEQUENCER_159 0x309F | ||
387 | #define WM8915_WRITE_SEQUENCER_160 0x30A0 | ||
388 | #define WM8915_WRITE_SEQUENCER_161 0x30A1 | ||
389 | #define WM8915_WRITE_SEQUENCER_162 0x30A2 | ||
390 | #define WM8915_WRITE_SEQUENCER_163 0x30A3 | ||
391 | #define WM8915_WRITE_SEQUENCER_164 0x30A4 | ||
392 | #define WM8915_WRITE_SEQUENCER_165 0x30A5 | ||
393 | #define WM8915_WRITE_SEQUENCER_166 0x30A6 | ||
394 | #define WM8915_WRITE_SEQUENCER_167 0x30A7 | ||
395 | #define WM8915_WRITE_SEQUENCER_168 0x30A8 | ||
396 | #define WM8915_WRITE_SEQUENCER_169 0x30A9 | ||
397 | #define WM8915_WRITE_SEQUENCER_170 0x30AA | ||
398 | #define WM8915_WRITE_SEQUENCER_171 0x30AB | ||
399 | #define WM8915_WRITE_SEQUENCER_172 0x30AC | ||
400 | #define WM8915_WRITE_SEQUENCER_173 0x30AD | ||
401 | #define WM8915_WRITE_SEQUENCER_174 0x30AE | ||
402 | #define WM8915_WRITE_SEQUENCER_175 0x30AF | ||
403 | #define WM8915_WRITE_SEQUENCER_176 0x30B0 | ||
404 | #define WM8915_WRITE_SEQUENCER_177 0x30B1 | ||
405 | #define WM8915_WRITE_SEQUENCER_178 0x30B2 | ||
406 | #define WM8915_WRITE_SEQUENCER_179 0x30B3 | ||
407 | #define WM8915_WRITE_SEQUENCER_180 0x30B4 | ||
408 | #define WM8915_WRITE_SEQUENCER_181 0x30B5 | ||
409 | #define WM8915_WRITE_SEQUENCER_182 0x30B6 | ||
410 | #define WM8915_WRITE_SEQUENCER_183 0x30B7 | ||
411 | #define WM8915_WRITE_SEQUENCER_184 0x30B8 | ||
412 | #define WM8915_WRITE_SEQUENCER_185 0x30B9 | ||
413 | #define WM8915_WRITE_SEQUENCER_186 0x30BA | ||
414 | #define WM8915_WRITE_SEQUENCER_187 0x30BB | ||
415 | #define WM8915_WRITE_SEQUENCER_188 0x30BC | ||
416 | #define WM8915_WRITE_SEQUENCER_189 0x30BD | ||
417 | #define WM8915_WRITE_SEQUENCER_190 0x30BE | ||
418 | #define WM8915_WRITE_SEQUENCER_191 0x30BF | ||
419 | #define WM8915_WRITE_SEQUENCER_192 0x30C0 | ||
420 | #define WM8915_WRITE_SEQUENCER_193 0x30C1 | ||
421 | #define WM8915_WRITE_SEQUENCER_194 0x30C2 | ||
422 | #define WM8915_WRITE_SEQUENCER_195 0x30C3 | ||
423 | #define WM8915_WRITE_SEQUENCER_196 0x30C4 | ||
424 | #define WM8915_WRITE_SEQUENCER_197 0x30C5 | ||
425 | #define WM8915_WRITE_SEQUENCER_198 0x30C6 | ||
426 | #define WM8915_WRITE_SEQUENCER_199 0x30C7 | ||
427 | #define WM8915_WRITE_SEQUENCER_200 0x30C8 | ||
428 | #define WM8915_WRITE_SEQUENCER_201 0x30C9 | ||
429 | #define WM8915_WRITE_SEQUENCER_202 0x30CA | ||
430 | #define WM8915_WRITE_SEQUENCER_203 0x30CB | ||
431 | #define WM8915_WRITE_SEQUENCER_204 0x30CC | ||
432 | #define WM8915_WRITE_SEQUENCER_205 0x30CD | ||
433 | #define WM8915_WRITE_SEQUENCER_206 0x30CE | ||
434 | #define WM8915_WRITE_SEQUENCER_207 0x30CF | ||
435 | #define WM8915_WRITE_SEQUENCER_208 0x30D0 | ||
436 | #define WM8915_WRITE_SEQUENCER_209 0x30D1 | ||
437 | #define WM8915_WRITE_SEQUENCER_210 0x30D2 | ||
438 | #define WM8915_WRITE_SEQUENCER_211 0x30D3 | ||
439 | #define WM8915_WRITE_SEQUENCER_212 0x30D4 | ||
440 | #define WM8915_WRITE_SEQUENCER_213 0x30D5 | ||
441 | #define WM8915_WRITE_SEQUENCER_214 0x30D6 | ||
442 | #define WM8915_WRITE_SEQUENCER_215 0x30D7 | ||
443 | #define WM8915_WRITE_SEQUENCER_216 0x30D8 | ||
444 | #define WM8915_WRITE_SEQUENCER_217 0x30D9 | ||
445 | #define WM8915_WRITE_SEQUENCER_218 0x30DA | ||
446 | #define WM8915_WRITE_SEQUENCER_219 0x30DB | ||
447 | #define WM8915_WRITE_SEQUENCER_220 0x30DC | ||
448 | #define WM8915_WRITE_SEQUENCER_221 0x30DD | ||
449 | #define WM8915_WRITE_SEQUENCER_222 0x30DE | ||
450 | #define WM8915_WRITE_SEQUENCER_223 0x30DF | ||
451 | #define WM8915_WRITE_SEQUENCER_224 0x30E0 | ||
452 | #define WM8915_WRITE_SEQUENCER_225 0x30E1 | ||
453 | #define WM8915_WRITE_SEQUENCER_226 0x30E2 | ||
454 | #define WM8915_WRITE_SEQUENCER_227 0x30E3 | ||
455 | #define WM8915_WRITE_SEQUENCER_228 0x30E4 | ||
456 | #define WM8915_WRITE_SEQUENCER_229 0x30E5 | ||
457 | #define WM8915_WRITE_SEQUENCER_230 0x30E6 | ||
458 | #define WM8915_WRITE_SEQUENCER_231 0x30E7 | ||
459 | #define WM8915_WRITE_SEQUENCER_232 0x30E8 | ||
460 | #define WM8915_WRITE_SEQUENCER_233 0x30E9 | ||
461 | #define WM8915_WRITE_SEQUENCER_234 0x30EA | ||
462 | #define WM8915_WRITE_SEQUENCER_235 0x30EB | ||
463 | #define WM8915_WRITE_SEQUENCER_236 0x30EC | ||
464 | #define WM8915_WRITE_SEQUENCER_237 0x30ED | ||
465 | #define WM8915_WRITE_SEQUENCER_238 0x30EE | ||
466 | #define WM8915_WRITE_SEQUENCER_239 0x30EF | ||
467 | #define WM8915_WRITE_SEQUENCER_240 0x30F0 | ||
468 | #define WM8915_WRITE_SEQUENCER_241 0x30F1 | ||
469 | #define WM8915_WRITE_SEQUENCER_242 0x30F2 | ||
470 | #define WM8915_WRITE_SEQUENCER_243 0x30F3 | ||
471 | #define WM8915_WRITE_SEQUENCER_244 0x30F4 | ||
472 | #define WM8915_WRITE_SEQUENCER_245 0x30F5 | ||
473 | #define WM8915_WRITE_SEQUENCER_246 0x30F6 | ||
474 | #define WM8915_WRITE_SEQUENCER_247 0x30F7 | ||
475 | #define WM8915_WRITE_SEQUENCER_248 0x30F8 | ||
476 | #define WM8915_WRITE_SEQUENCER_249 0x30F9 | ||
477 | #define WM8915_WRITE_SEQUENCER_250 0x30FA | ||
478 | #define WM8915_WRITE_SEQUENCER_251 0x30FB | ||
479 | #define WM8915_WRITE_SEQUENCER_252 0x30FC | ||
480 | #define WM8915_WRITE_SEQUENCER_253 0x30FD | ||
481 | #define WM8915_WRITE_SEQUENCER_254 0x30FE | ||
482 | #define WM8915_WRITE_SEQUENCER_255 0x30FF | ||
483 | #define WM8915_WRITE_SEQUENCER_256 0x3100 | ||
484 | #define WM8915_WRITE_SEQUENCER_257 0x3101 | ||
485 | #define WM8915_WRITE_SEQUENCER_258 0x3102 | ||
486 | #define WM8915_WRITE_SEQUENCER_259 0x3103 | ||
487 | #define WM8915_WRITE_SEQUENCER_260 0x3104 | ||
488 | #define WM8915_WRITE_SEQUENCER_261 0x3105 | ||
489 | #define WM8915_WRITE_SEQUENCER_262 0x3106 | ||
490 | #define WM8915_WRITE_SEQUENCER_263 0x3107 | ||
491 | #define WM8915_WRITE_SEQUENCER_264 0x3108 | ||
492 | #define WM8915_WRITE_SEQUENCER_265 0x3109 | ||
493 | #define WM8915_WRITE_SEQUENCER_266 0x310A | ||
494 | #define WM8915_WRITE_SEQUENCER_267 0x310B | ||
495 | #define WM8915_WRITE_SEQUENCER_268 0x310C | ||
496 | #define WM8915_WRITE_SEQUENCER_269 0x310D | ||
497 | #define WM8915_WRITE_SEQUENCER_270 0x310E | ||
498 | #define WM8915_WRITE_SEQUENCER_271 0x310F | ||
499 | #define WM8915_WRITE_SEQUENCER_272 0x3110 | ||
500 | #define WM8915_WRITE_SEQUENCER_273 0x3111 | ||
501 | #define WM8915_WRITE_SEQUENCER_274 0x3112 | ||
502 | #define WM8915_WRITE_SEQUENCER_275 0x3113 | ||
503 | #define WM8915_WRITE_SEQUENCER_276 0x3114 | ||
504 | #define WM8915_WRITE_SEQUENCER_277 0x3115 | ||
505 | #define WM8915_WRITE_SEQUENCER_278 0x3116 | ||
506 | #define WM8915_WRITE_SEQUENCER_279 0x3117 | ||
507 | #define WM8915_WRITE_SEQUENCER_280 0x3118 | ||
508 | #define WM8915_WRITE_SEQUENCER_281 0x3119 | ||
509 | #define WM8915_WRITE_SEQUENCER_282 0x311A | ||
510 | #define WM8915_WRITE_SEQUENCER_283 0x311B | ||
511 | #define WM8915_WRITE_SEQUENCER_284 0x311C | ||
512 | #define WM8915_WRITE_SEQUENCER_285 0x311D | ||
513 | #define WM8915_WRITE_SEQUENCER_286 0x311E | ||
514 | #define WM8915_WRITE_SEQUENCER_287 0x311F | ||
515 | #define WM8915_WRITE_SEQUENCER_288 0x3120 | ||
516 | #define WM8915_WRITE_SEQUENCER_289 0x3121 | ||
517 | #define WM8915_WRITE_SEQUENCER_290 0x3122 | ||
518 | #define WM8915_WRITE_SEQUENCER_291 0x3123 | ||
519 | #define WM8915_WRITE_SEQUENCER_292 0x3124 | ||
520 | #define WM8915_WRITE_SEQUENCER_293 0x3125 | ||
521 | #define WM8915_WRITE_SEQUENCER_294 0x3126 | ||
522 | #define WM8915_WRITE_SEQUENCER_295 0x3127 | ||
523 | #define WM8915_WRITE_SEQUENCER_296 0x3128 | ||
524 | #define WM8915_WRITE_SEQUENCER_297 0x3129 | ||
525 | #define WM8915_WRITE_SEQUENCER_298 0x312A | ||
526 | #define WM8915_WRITE_SEQUENCER_299 0x312B | ||
527 | #define WM8915_WRITE_SEQUENCER_300 0x312C | ||
528 | #define WM8915_WRITE_SEQUENCER_301 0x312D | ||
529 | #define WM8915_WRITE_SEQUENCER_302 0x312E | ||
530 | #define WM8915_WRITE_SEQUENCER_303 0x312F | ||
531 | #define WM8915_WRITE_SEQUENCER_304 0x3130 | ||
532 | #define WM8915_WRITE_SEQUENCER_305 0x3131 | ||
533 | #define WM8915_WRITE_SEQUENCER_306 0x3132 | ||
534 | #define WM8915_WRITE_SEQUENCER_307 0x3133 | ||
535 | #define WM8915_WRITE_SEQUENCER_308 0x3134 | ||
536 | #define WM8915_WRITE_SEQUENCER_309 0x3135 | ||
537 | #define WM8915_WRITE_SEQUENCER_310 0x3136 | ||
538 | #define WM8915_WRITE_SEQUENCER_311 0x3137 | ||
539 | #define WM8915_WRITE_SEQUENCER_312 0x3138 | ||
540 | #define WM8915_WRITE_SEQUENCER_313 0x3139 | ||
541 | #define WM8915_WRITE_SEQUENCER_314 0x313A | ||
542 | #define WM8915_WRITE_SEQUENCER_315 0x313B | ||
543 | #define WM8915_WRITE_SEQUENCER_316 0x313C | ||
544 | #define WM8915_WRITE_SEQUENCER_317 0x313D | ||
545 | #define WM8915_WRITE_SEQUENCER_318 0x313E | ||
546 | #define WM8915_WRITE_SEQUENCER_319 0x313F | ||
547 | #define WM8915_WRITE_SEQUENCER_320 0x3140 | ||
548 | #define WM8915_WRITE_SEQUENCER_321 0x3141 | ||
549 | #define WM8915_WRITE_SEQUENCER_322 0x3142 | ||
550 | #define WM8915_WRITE_SEQUENCER_323 0x3143 | ||
551 | #define WM8915_WRITE_SEQUENCER_324 0x3144 | ||
552 | #define WM8915_WRITE_SEQUENCER_325 0x3145 | ||
553 | #define WM8915_WRITE_SEQUENCER_326 0x3146 | ||
554 | #define WM8915_WRITE_SEQUENCER_327 0x3147 | ||
555 | #define WM8915_WRITE_SEQUENCER_328 0x3148 | ||
556 | #define WM8915_WRITE_SEQUENCER_329 0x3149 | ||
557 | #define WM8915_WRITE_SEQUENCER_330 0x314A | ||
558 | #define WM8915_WRITE_SEQUENCER_331 0x314B | ||
559 | #define WM8915_WRITE_SEQUENCER_332 0x314C | ||
560 | #define WM8915_WRITE_SEQUENCER_333 0x314D | ||
561 | #define WM8915_WRITE_SEQUENCER_334 0x314E | ||
562 | #define WM8915_WRITE_SEQUENCER_335 0x314F | ||
563 | #define WM8915_WRITE_SEQUENCER_336 0x3150 | ||
564 | #define WM8915_WRITE_SEQUENCER_337 0x3151 | ||
565 | #define WM8915_WRITE_SEQUENCER_338 0x3152 | ||
566 | #define WM8915_WRITE_SEQUENCER_339 0x3153 | ||
567 | #define WM8915_WRITE_SEQUENCER_340 0x3154 | ||
568 | #define WM8915_WRITE_SEQUENCER_341 0x3155 | ||
569 | #define WM8915_WRITE_SEQUENCER_342 0x3156 | ||
570 | #define WM8915_WRITE_SEQUENCER_343 0x3157 | ||
571 | #define WM8915_WRITE_SEQUENCER_344 0x3158 | ||
572 | #define WM8915_WRITE_SEQUENCER_345 0x3159 | ||
573 | #define WM8915_WRITE_SEQUENCER_346 0x315A | ||
574 | #define WM8915_WRITE_SEQUENCER_347 0x315B | ||
575 | #define WM8915_WRITE_SEQUENCER_348 0x315C | ||
576 | #define WM8915_WRITE_SEQUENCER_349 0x315D | ||
577 | #define WM8915_WRITE_SEQUENCER_350 0x315E | ||
578 | #define WM8915_WRITE_SEQUENCER_351 0x315F | ||
579 | #define WM8915_WRITE_SEQUENCER_352 0x3160 | ||
580 | #define WM8915_WRITE_SEQUENCER_353 0x3161 | ||
581 | #define WM8915_WRITE_SEQUENCER_354 0x3162 | ||
582 | #define WM8915_WRITE_SEQUENCER_355 0x3163 | ||
583 | #define WM8915_WRITE_SEQUENCER_356 0x3164 | ||
584 | #define WM8915_WRITE_SEQUENCER_357 0x3165 | ||
585 | #define WM8915_WRITE_SEQUENCER_358 0x3166 | ||
586 | #define WM8915_WRITE_SEQUENCER_359 0x3167 | ||
587 | #define WM8915_WRITE_SEQUENCER_360 0x3168 | ||
588 | #define WM8915_WRITE_SEQUENCER_361 0x3169 | ||
589 | #define WM8915_WRITE_SEQUENCER_362 0x316A | ||
590 | #define WM8915_WRITE_SEQUENCER_363 0x316B | ||
591 | #define WM8915_WRITE_SEQUENCER_364 0x316C | ||
592 | #define WM8915_WRITE_SEQUENCER_365 0x316D | ||
593 | #define WM8915_WRITE_SEQUENCER_366 0x316E | ||
594 | #define WM8915_WRITE_SEQUENCER_367 0x316F | ||
595 | #define WM8915_WRITE_SEQUENCER_368 0x3170 | ||
596 | #define WM8915_WRITE_SEQUENCER_369 0x3171 | ||
597 | #define WM8915_WRITE_SEQUENCER_370 0x3172 | ||
598 | #define WM8915_WRITE_SEQUENCER_371 0x3173 | ||
599 | #define WM8915_WRITE_SEQUENCER_372 0x3174 | ||
600 | #define WM8915_WRITE_SEQUENCER_373 0x3175 | ||
601 | #define WM8915_WRITE_SEQUENCER_374 0x3176 | ||
602 | #define WM8915_WRITE_SEQUENCER_375 0x3177 | ||
603 | #define WM8915_WRITE_SEQUENCER_376 0x3178 | ||
604 | #define WM8915_WRITE_SEQUENCER_377 0x3179 | ||
605 | #define WM8915_WRITE_SEQUENCER_378 0x317A | ||
606 | #define WM8915_WRITE_SEQUENCER_379 0x317B | ||
607 | #define WM8915_WRITE_SEQUENCER_380 0x317C | ||
608 | #define WM8915_WRITE_SEQUENCER_381 0x317D | ||
609 | #define WM8915_WRITE_SEQUENCER_382 0x317E | ||
610 | #define WM8915_WRITE_SEQUENCER_383 0x317F | ||
611 | #define WM8915_WRITE_SEQUENCER_384 0x3180 | ||
612 | #define WM8915_WRITE_SEQUENCER_385 0x3181 | ||
613 | #define WM8915_WRITE_SEQUENCER_386 0x3182 | ||
614 | #define WM8915_WRITE_SEQUENCER_387 0x3183 | ||
615 | #define WM8915_WRITE_SEQUENCER_388 0x3184 | ||
616 | #define WM8915_WRITE_SEQUENCER_389 0x3185 | ||
617 | #define WM8915_WRITE_SEQUENCER_390 0x3186 | ||
618 | #define WM8915_WRITE_SEQUENCER_391 0x3187 | ||
619 | #define WM8915_WRITE_SEQUENCER_392 0x3188 | ||
620 | #define WM8915_WRITE_SEQUENCER_393 0x3189 | ||
621 | #define WM8915_WRITE_SEQUENCER_394 0x318A | ||
622 | #define WM8915_WRITE_SEQUENCER_395 0x318B | ||
623 | #define WM8915_WRITE_SEQUENCER_396 0x318C | ||
624 | #define WM8915_WRITE_SEQUENCER_397 0x318D | ||
625 | #define WM8915_WRITE_SEQUENCER_398 0x318E | ||
626 | #define WM8915_WRITE_SEQUENCER_399 0x318F | ||
627 | #define WM8915_WRITE_SEQUENCER_400 0x3190 | ||
628 | #define WM8915_WRITE_SEQUENCER_401 0x3191 | ||
629 | #define WM8915_WRITE_SEQUENCER_402 0x3192 | ||
630 | #define WM8915_WRITE_SEQUENCER_403 0x3193 | ||
631 | #define WM8915_WRITE_SEQUENCER_404 0x3194 | ||
632 | #define WM8915_WRITE_SEQUENCER_405 0x3195 | ||
633 | #define WM8915_WRITE_SEQUENCER_406 0x3196 | ||
634 | #define WM8915_WRITE_SEQUENCER_407 0x3197 | ||
635 | #define WM8915_WRITE_SEQUENCER_408 0x3198 | ||
636 | #define WM8915_WRITE_SEQUENCER_409 0x3199 | ||
637 | #define WM8915_WRITE_SEQUENCER_410 0x319A | ||
638 | #define WM8915_WRITE_SEQUENCER_411 0x319B | ||
639 | #define WM8915_WRITE_SEQUENCER_412 0x319C | ||
640 | #define WM8915_WRITE_SEQUENCER_413 0x319D | ||
641 | #define WM8915_WRITE_SEQUENCER_414 0x319E | ||
642 | #define WM8915_WRITE_SEQUENCER_415 0x319F | ||
643 | #define WM8915_WRITE_SEQUENCER_416 0x31A0 | ||
644 | #define WM8915_WRITE_SEQUENCER_417 0x31A1 | ||
645 | #define WM8915_WRITE_SEQUENCER_418 0x31A2 | ||
646 | #define WM8915_WRITE_SEQUENCER_419 0x31A3 | ||
647 | #define WM8915_WRITE_SEQUENCER_420 0x31A4 | ||
648 | #define WM8915_WRITE_SEQUENCER_421 0x31A5 | ||
649 | #define WM8915_WRITE_SEQUENCER_422 0x31A6 | ||
650 | #define WM8915_WRITE_SEQUENCER_423 0x31A7 | ||
651 | #define WM8915_WRITE_SEQUENCER_424 0x31A8 | ||
652 | #define WM8915_WRITE_SEQUENCER_425 0x31A9 | ||
653 | #define WM8915_WRITE_SEQUENCER_426 0x31AA | ||
654 | #define WM8915_WRITE_SEQUENCER_427 0x31AB | ||
655 | #define WM8915_WRITE_SEQUENCER_428 0x31AC | ||
656 | #define WM8915_WRITE_SEQUENCER_429 0x31AD | ||
657 | #define WM8915_WRITE_SEQUENCER_430 0x31AE | ||
658 | #define WM8915_WRITE_SEQUENCER_431 0x31AF | ||
659 | #define WM8915_WRITE_SEQUENCER_432 0x31B0 | ||
660 | #define WM8915_WRITE_SEQUENCER_433 0x31B1 | ||
661 | #define WM8915_WRITE_SEQUENCER_434 0x31B2 | ||
662 | #define WM8915_WRITE_SEQUENCER_435 0x31B3 | ||
663 | #define WM8915_WRITE_SEQUENCER_436 0x31B4 | ||
664 | #define WM8915_WRITE_SEQUENCER_437 0x31B5 | ||
665 | #define WM8915_WRITE_SEQUENCER_438 0x31B6 | ||
666 | #define WM8915_WRITE_SEQUENCER_439 0x31B7 | ||
667 | #define WM8915_WRITE_SEQUENCER_440 0x31B8 | ||
668 | #define WM8915_WRITE_SEQUENCER_441 0x31B9 | ||
669 | #define WM8915_WRITE_SEQUENCER_442 0x31BA | ||
670 | #define WM8915_WRITE_SEQUENCER_443 0x31BB | ||
671 | #define WM8915_WRITE_SEQUENCER_444 0x31BC | ||
672 | #define WM8915_WRITE_SEQUENCER_445 0x31BD | ||
673 | #define WM8915_WRITE_SEQUENCER_446 0x31BE | ||
674 | #define WM8915_WRITE_SEQUENCER_447 0x31BF | ||
675 | #define WM8915_WRITE_SEQUENCER_448 0x31C0 | ||
676 | #define WM8915_WRITE_SEQUENCER_449 0x31C1 | ||
677 | #define WM8915_WRITE_SEQUENCER_450 0x31C2 | ||
678 | #define WM8915_WRITE_SEQUENCER_451 0x31C3 | ||
679 | #define WM8915_WRITE_SEQUENCER_452 0x31C4 | ||
680 | #define WM8915_WRITE_SEQUENCER_453 0x31C5 | ||
681 | #define WM8915_WRITE_SEQUENCER_454 0x31C6 | ||
682 | #define WM8915_WRITE_SEQUENCER_455 0x31C7 | ||
683 | #define WM8915_WRITE_SEQUENCER_456 0x31C8 | ||
684 | #define WM8915_WRITE_SEQUENCER_457 0x31C9 | ||
685 | #define WM8915_WRITE_SEQUENCER_458 0x31CA | ||
686 | #define WM8915_WRITE_SEQUENCER_459 0x31CB | ||
687 | #define WM8915_WRITE_SEQUENCER_460 0x31CC | ||
688 | #define WM8915_WRITE_SEQUENCER_461 0x31CD | ||
689 | #define WM8915_WRITE_SEQUENCER_462 0x31CE | ||
690 | #define WM8915_WRITE_SEQUENCER_463 0x31CF | ||
691 | #define WM8915_WRITE_SEQUENCER_464 0x31D0 | ||
692 | #define WM8915_WRITE_SEQUENCER_465 0x31D1 | ||
693 | #define WM8915_WRITE_SEQUENCER_466 0x31D2 | ||
694 | #define WM8915_WRITE_SEQUENCER_467 0x31D3 | ||
695 | #define WM8915_WRITE_SEQUENCER_468 0x31D4 | ||
696 | #define WM8915_WRITE_SEQUENCER_469 0x31D5 | ||
697 | #define WM8915_WRITE_SEQUENCER_470 0x31D6 | ||
698 | #define WM8915_WRITE_SEQUENCER_471 0x31D7 | ||
699 | #define WM8915_WRITE_SEQUENCER_472 0x31D8 | ||
700 | #define WM8915_WRITE_SEQUENCER_473 0x31D9 | ||
701 | #define WM8915_WRITE_SEQUENCER_474 0x31DA | ||
702 | #define WM8915_WRITE_SEQUENCER_475 0x31DB | ||
703 | #define WM8915_WRITE_SEQUENCER_476 0x31DC | ||
704 | #define WM8915_WRITE_SEQUENCER_477 0x31DD | ||
705 | #define WM8915_WRITE_SEQUENCER_478 0x31DE | ||
706 | #define WM8915_WRITE_SEQUENCER_479 0x31DF | ||
707 | #define WM8915_WRITE_SEQUENCER_480 0x31E0 | ||
708 | #define WM8915_WRITE_SEQUENCER_481 0x31E1 | ||
709 | #define WM8915_WRITE_SEQUENCER_482 0x31E2 | ||
710 | #define WM8915_WRITE_SEQUENCER_483 0x31E3 | ||
711 | #define WM8915_WRITE_SEQUENCER_484 0x31E4 | ||
712 | #define WM8915_WRITE_SEQUENCER_485 0x31E5 | ||
713 | #define WM8915_WRITE_SEQUENCER_486 0x31E6 | ||
714 | #define WM8915_WRITE_SEQUENCER_487 0x31E7 | ||
715 | #define WM8915_WRITE_SEQUENCER_488 0x31E8 | ||
716 | #define WM8915_WRITE_SEQUENCER_489 0x31E9 | ||
717 | #define WM8915_WRITE_SEQUENCER_490 0x31EA | ||
718 | #define WM8915_WRITE_SEQUENCER_491 0x31EB | ||
719 | #define WM8915_WRITE_SEQUENCER_492 0x31EC | ||
720 | #define WM8915_WRITE_SEQUENCER_493 0x31ED | ||
721 | #define WM8915_WRITE_SEQUENCER_494 0x31EE | ||
722 | #define WM8915_WRITE_SEQUENCER_495 0x31EF | ||
723 | #define WM8915_WRITE_SEQUENCER_496 0x31F0 | ||
724 | #define WM8915_WRITE_SEQUENCER_497 0x31F1 | ||
725 | #define WM8915_WRITE_SEQUENCER_498 0x31F2 | ||
726 | #define WM8915_WRITE_SEQUENCER_499 0x31F3 | ||
727 | #define WM8915_WRITE_SEQUENCER_500 0x31F4 | ||
728 | #define WM8915_WRITE_SEQUENCER_501 0x31F5 | ||
729 | #define WM8915_WRITE_SEQUENCER_502 0x31F6 | ||
730 | #define WM8915_WRITE_SEQUENCER_503 0x31F7 | ||
731 | #define WM8915_WRITE_SEQUENCER_504 0x31F8 | ||
732 | #define WM8915_WRITE_SEQUENCER_505 0x31F9 | ||
733 | #define WM8915_WRITE_SEQUENCER_506 0x31FA | ||
734 | #define WM8915_WRITE_SEQUENCER_507 0x31FB | ||
735 | #define WM8915_WRITE_SEQUENCER_508 0x31FC | ||
736 | #define WM8915_WRITE_SEQUENCER_509 0x31FD | ||
737 | #define WM8915_WRITE_SEQUENCER_510 0x31FE | ||
738 | #define WM8915_WRITE_SEQUENCER_511 0x31FF | ||
739 | |||
740 | #define WM8915_REGISTER_COUNT 706 | ||
741 | #define WM8915_MAX_REGISTER 0x31FF | ||
742 | |||
743 | /* | ||
744 | * Field Definitions. | ||
745 | */ | ||
746 | |||
747 | /* | ||
748 | * R0 (0x00) - Software Reset | ||
749 | */ | ||
750 | #define WM8915_SW_RESET_MASK 0xFFFF /* SW_RESET - [15:0] */ | ||
751 | #define WM8915_SW_RESET_SHIFT 0 /* SW_RESET - [15:0] */ | ||
752 | #define WM8915_SW_RESET_WIDTH 16 /* SW_RESET - [15:0] */ | ||
753 | |||
754 | /* | ||
755 | * R1 (0x01) - Power Management (1) | ||
756 | */ | ||
757 | #define WM8915_MICB2_ENA 0x0200 /* MICB2_ENA */ | ||
758 | #define WM8915_MICB2_ENA_MASK 0x0200 /* MICB2_ENA */ | ||
759 | #define WM8915_MICB2_ENA_SHIFT 9 /* MICB2_ENA */ | ||
760 | #define WM8915_MICB2_ENA_WIDTH 1 /* MICB2_ENA */ | ||
761 | #define WM8915_MICB1_ENA 0x0100 /* MICB1_ENA */ | ||
762 | #define WM8915_MICB1_ENA_MASK 0x0100 /* MICB1_ENA */ | ||
763 | #define WM8915_MICB1_ENA_SHIFT 8 /* MICB1_ENA */ | ||
764 | #define WM8915_MICB1_ENA_WIDTH 1 /* MICB1_ENA */ | ||
765 | #define WM8915_HPOUT2L_ENA 0x0080 /* HPOUT2L_ENA */ | ||
766 | #define WM8915_HPOUT2L_ENA_MASK 0x0080 /* HPOUT2L_ENA */ | ||
767 | #define WM8915_HPOUT2L_ENA_SHIFT 7 /* HPOUT2L_ENA */ | ||
768 | #define WM8915_HPOUT2L_ENA_WIDTH 1 /* HPOUT2L_ENA */ | ||
769 | #define WM8915_HPOUT2R_ENA 0x0040 /* HPOUT2R_ENA */ | ||
770 | #define WM8915_HPOUT2R_ENA_MASK 0x0040 /* HPOUT2R_ENA */ | ||
771 | #define WM8915_HPOUT2R_ENA_SHIFT 6 /* HPOUT2R_ENA */ | ||
772 | #define WM8915_HPOUT2R_ENA_WIDTH 1 /* HPOUT2R_ENA */ | ||
773 | #define WM8915_HPOUT1L_ENA 0x0020 /* HPOUT1L_ENA */ | ||
774 | #define WM8915_HPOUT1L_ENA_MASK 0x0020 /* HPOUT1L_ENA */ | ||
775 | #define WM8915_HPOUT1L_ENA_SHIFT 5 /* HPOUT1L_ENA */ | ||
776 | #define WM8915_HPOUT1L_ENA_WIDTH 1 /* HPOUT1L_ENA */ | ||
777 | #define WM8915_HPOUT1R_ENA 0x0010 /* HPOUT1R_ENA */ | ||
778 | #define WM8915_HPOUT1R_ENA_MASK 0x0010 /* HPOUT1R_ENA */ | ||
779 | #define WM8915_HPOUT1R_ENA_SHIFT 4 /* HPOUT1R_ENA */ | ||
780 | #define WM8915_HPOUT1R_ENA_WIDTH 1 /* HPOUT1R_ENA */ | ||
781 | #define WM8915_BG_ENA 0x0001 /* BG_ENA */ | ||
782 | #define WM8915_BG_ENA_MASK 0x0001 /* BG_ENA */ | ||
783 | #define WM8915_BG_ENA_SHIFT 0 /* BG_ENA */ | ||
784 | #define WM8915_BG_ENA_WIDTH 1 /* BG_ENA */ | ||
785 | |||
786 | /* | ||
787 | * R2 (0x02) - Power Management (2) | ||
788 | */ | ||
789 | #define WM8915_OPCLK_ENA 0x0800 /* OPCLK_ENA */ | ||
790 | #define WM8915_OPCLK_ENA_MASK 0x0800 /* OPCLK_ENA */ | ||
791 | #define WM8915_OPCLK_ENA_SHIFT 11 /* OPCLK_ENA */ | ||
792 | #define WM8915_OPCLK_ENA_WIDTH 1 /* OPCLK_ENA */ | ||
793 | #define WM8915_INL_ENA 0x0020 /* INL_ENA */ | ||
794 | #define WM8915_INL_ENA_MASK 0x0020 /* INL_ENA */ | ||
795 | #define WM8915_INL_ENA_SHIFT 5 /* INL_ENA */ | ||
796 | #define WM8915_INL_ENA_WIDTH 1 /* INL_ENA */ | ||
797 | #define WM8915_INR_ENA 0x0010 /* INR_ENA */ | ||
798 | #define WM8915_INR_ENA_MASK 0x0010 /* INR_ENA */ | ||
799 | #define WM8915_INR_ENA_SHIFT 4 /* INR_ENA */ | ||
800 | #define WM8915_INR_ENA_WIDTH 1 /* INR_ENA */ | ||
801 | #define WM8915_LDO2_ENA 0x0002 /* LDO2_ENA */ | ||
802 | #define WM8915_LDO2_ENA_MASK 0x0002 /* LDO2_ENA */ | ||
803 | #define WM8915_LDO2_ENA_SHIFT 1 /* LDO2_ENA */ | ||
804 | #define WM8915_LDO2_ENA_WIDTH 1 /* LDO2_ENA */ | ||
805 | |||
806 | /* | ||
807 | * R3 (0x03) - Power Management (3) | ||
808 | */ | ||
809 | #define WM8915_DSP2RXL_ENA 0x0800 /* DSP2RXL_ENA */ | ||
810 | #define WM8915_DSP2RXL_ENA_MASK 0x0800 /* DSP2RXL_ENA */ | ||
811 | #define WM8915_DSP2RXL_ENA_SHIFT 11 /* DSP2RXL_ENA */ | ||
812 | #define WM8915_DSP2RXL_ENA_WIDTH 1 /* DSP2RXL_ENA */ | ||
813 | #define WM8915_DSP2RXR_ENA 0x0400 /* DSP2RXR_ENA */ | ||
814 | #define WM8915_DSP2RXR_ENA_MASK 0x0400 /* DSP2RXR_ENA */ | ||
815 | #define WM8915_DSP2RXR_ENA_SHIFT 10 /* DSP2RXR_ENA */ | ||
816 | #define WM8915_DSP2RXR_ENA_WIDTH 1 /* DSP2RXR_ENA */ | ||
817 | #define WM8915_DSP1RXL_ENA 0x0200 /* DSP1RXL_ENA */ | ||
818 | #define WM8915_DSP1RXL_ENA_MASK 0x0200 /* DSP1RXL_ENA */ | ||
819 | #define WM8915_DSP1RXL_ENA_SHIFT 9 /* DSP1RXL_ENA */ | ||
820 | #define WM8915_DSP1RXL_ENA_WIDTH 1 /* DSP1RXL_ENA */ | ||
821 | #define WM8915_DSP1RXR_ENA 0x0100 /* DSP1RXR_ENA */ | ||
822 | #define WM8915_DSP1RXR_ENA_MASK 0x0100 /* DSP1RXR_ENA */ | ||
823 | #define WM8915_DSP1RXR_ENA_SHIFT 8 /* DSP1RXR_ENA */ | ||
824 | #define WM8915_DSP1RXR_ENA_WIDTH 1 /* DSP1RXR_ENA */ | ||
825 | #define WM8915_DMIC2L_ENA 0x0020 /* DMIC2L_ENA */ | ||
826 | #define WM8915_DMIC2L_ENA_MASK 0x0020 /* DMIC2L_ENA */ | ||
827 | #define WM8915_DMIC2L_ENA_SHIFT 5 /* DMIC2L_ENA */ | ||
828 | #define WM8915_DMIC2L_ENA_WIDTH 1 /* DMIC2L_ENA */ | ||
829 | #define WM8915_DMIC2R_ENA 0x0010 /* DMIC2R_ENA */ | ||
830 | #define WM8915_DMIC2R_ENA_MASK 0x0010 /* DMIC2R_ENA */ | ||
831 | #define WM8915_DMIC2R_ENA_SHIFT 4 /* DMIC2R_ENA */ | ||
832 | #define WM8915_DMIC2R_ENA_WIDTH 1 /* DMIC2R_ENA */ | ||
833 | #define WM8915_DMIC1L_ENA 0x0008 /* DMIC1L_ENA */ | ||
834 | #define WM8915_DMIC1L_ENA_MASK 0x0008 /* DMIC1L_ENA */ | ||
835 | #define WM8915_DMIC1L_ENA_SHIFT 3 /* DMIC1L_ENA */ | ||
836 | #define WM8915_DMIC1L_ENA_WIDTH 1 /* DMIC1L_ENA */ | ||
837 | #define WM8915_DMIC1R_ENA 0x0004 /* DMIC1R_ENA */ | ||
838 | #define WM8915_DMIC1R_ENA_MASK 0x0004 /* DMIC1R_ENA */ | ||
839 | #define WM8915_DMIC1R_ENA_SHIFT 2 /* DMIC1R_ENA */ | ||
840 | #define WM8915_DMIC1R_ENA_WIDTH 1 /* DMIC1R_ENA */ | ||
841 | #define WM8915_ADCL_ENA 0x0002 /* ADCL_ENA */ | ||
842 | #define WM8915_ADCL_ENA_MASK 0x0002 /* ADCL_ENA */ | ||
843 | #define WM8915_ADCL_ENA_SHIFT 1 /* ADCL_ENA */ | ||
844 | #define WM8915_ADCL_ENA_WIDTH 1 /* ADCL_ENA */ | ||
845 | #define WM8915_ADCR_ENA 0x0001 /* ADCR_ENA */ | ||
846 | #define WM8915_ADCR_ENA_MASK 0x0001 /* ADCR_ENA */ | ||
847 | #define WM8915_ADCR_ENA_SHIFT 0 /* ADCR_ENA */ | ||
848 | #define WM8915_ADCR_ENA_WIDTH 1 /* ADCR_ENA */ | ||
849 | |||
850 | /* | ||
851 | * R4 (0x04) - Power Management (4) | ||
852 | */ | ||
853 | #define WM8915_AIF2RX_CHAN1_ENA 0x0200 /* AIF2RX_CHAN1_ENA */ | ||
854 | #define WM8915_AIF2RX_CHAN1_ENA_MASK 0x0200 /* AIF2RX_CHAN1_ENA */ | ||
855 | #define WM8915_AIF2RX_CHAN1_ENA_SHIFT 9 /* AIF2RX_CHAN1_ENA */ | ||
856 | #define WM8915_AIF2RX_CHAN1_ENA_WIDTH 1 /* AIF2RX_CHAN1_ENA */ | ||
857 | #define WM8915_AIF2RX_CHAN0_ENA 0x0100 /* AIF2RX_CHAN0_ENA */ | ||
858 | #define WM8915_AIF2RX_CHAN0_ENA_MASK 0x0100 /* AIF2RX_CHAN0_ENA */ | ||
859 | #define WM8915_AIF2RX_CHAN0_ENA_SHIFT 8 /* AIF2RX_CHAN0_ENA */ | ||
860 | #define WM8915_AIF2RX_CHAN0_ENA_WIDTH 1 /* AIF2RX_CHAN0_ENA */ | ||
861 | #define WM8915_AIF1RX_CHAN5_ENA 0x0020 /* AIF1RX_CHAN5_ENA */ | ||
862 | #define WM8915_AIF1RX_CHAN5_ENA_MASK 0x0020 /* AIF1RX_CHAN5_ENA */ | ||
863 | #define WM8915_AIF1RX_CHAN5_ENA_SHIFT 5 /* AIF1RX_CHAN5_ENA */ | ||
864 | #define WM8915_AIF1RX_CHAN5_ENA_WIDTH 1 /* AIF1RX_CHAN5_ENA */ | ||
865 | #define WM8915_AIF1RX_CHAN4_ENA 0x0010 /* AIF1RX_CHAN4_ENA */ | ||
866 | #define WM8915_AIF1RX_CHAN4_ENA_MASK 0x0010 /* AIF1RX_CHAN4_ENA */ | ||
867 | #define WM8915_AIF1RX_CHAN4_ENA_SHIFT 4 /* AIF1RX_CHAN4_ENA */ | ||
868 | #define WM8915_AIF1RX_CHAN4_ENA_WIDTH 1 /* AIF1RX_CHAN4_ENA */ | ||
869 | #define WM8915_AIF1RX_CHAN3_ENA 0x0008 /* AIF1RX_CHAN3_ENA */ | ||
870 | #define WM8915_AIF1RX_CHAN3_ENA_MASK 0x0008 /* AIF1RX_CHAN3_ENA */ | ||
871 | #define WM8915_AIF1RX_CHAN3_ENA_SHIFT 3 /* AIF1RX_CHAN3_ENA */ | ||
872 | #define WM8915_AIF1RX_CHAN3_ENA_WIDTH 1 /* AIF1RX_CHAN3_ENA */ | ||
873 | #define WM8915_AIF1RX_CHAN2_ENA 0x0004 /* AIF1RX_CHAN2_ENA */ | ||
874 | #define WM8915_AIF1RX_CHAN2_ENA_MASK 0x0004 /* AIF1RX_CHAN2_ENA */ | ||
875 | #define WM8915_AIF1RX_CHAN2_ENA_SHIFT 2 /* AIF1RX_CHAN2_ENA */ | ||
876 | #define WM8915_AIF1RX_CHAN2_ENA_WIDTH 1 /* AIF1RX_CHAN2_ENA */ | ||
877 | #define WM8915_AIF1RX_CHAN1_ENA 0x0002 /* AIF1RX_CHAN1_ENA */ | ||
878 | #define WM8915_AIF1RX_CHAN1_ENA_MASK 0x0002 /* AIF1RX_CHAN1_ENA */ | ||
879 | #define WM8915_AIF1RX_CHAN1_ENA_SHIFT 1 /* AIF1RX_CHAN1_ENA */ | ||
880 | #define WM8915_AIF1RX_CHAN1_ENA_WIDTH 1 /* AIF1RX_CHAN1_ENA */ | ||
881 | #define WM8915_AIF1RX_CHAN0_ENA 0x0001 /* AIF1RX_CHAN0_ENA */ | ||
882 | #define WM8915_AIF1RX_CHAN0_ENA_MASK 0x0001 /* AIF1RX_CHAN0_ENA */ | ||
883 | #define WM8915_AIF1RX_CHAN0_ENA_SHIFT 0 /* AIF1RX_CHAN0_ENA */ | ||
884 | #define WM8915_AIF1RX_CHAN0_ENA_WIDTH 1 /* AIF1RX_CHAN0_ENA */ | ||
885 | |||
886 | /* | ||
887 | * R5 (0x05) - Power Management (5) | ||
888 | */ | ||
889 | #define WM8915_DSP2TXL_ENA 0x0800 /* DSP2TXL_ENA */ | ||
890 | #define WM8915_DSP2TXL_ENA_MASK 0x0800 /* DSP2TXL_ENA */ | ||
891 | #define WM8915_DSP2TXL_ENA_SHIFT 11 /* DSP2TXL_ENA */ | ||
892 | #define WM8915_DSP2TXL_ENA_WIDTH 1 /* DSP2TXL_ENA */ | ||
893 | #define WM8915_DSP2TXR_ENA 0x0400 /* DSP2TXR_ENA */ | ||
894 | #define WM8915_DSP2TXR_ENA_MASK 0x0400 /* DSP2TXR_ENA */ | ||
895 | #define WM8915_DSP2TXR_ENA_SHIFT 10 /* DSP2TXR_ENA */ | ||
896 | #define WM8915_DSP2TXR_ENA_WIDTH 1 /* DSP2TXR_ENA */ | ||
897 | #define WM8915_DSP1TXL_ENA 0x0200 /* DSP1TXL_ENA */ | ||
898 | #define WM8915_DSP1TXL_ENA_MASK 0x0200 /* DSP1TXL_ENA */ | ||
899 | #define WM8915_DSP1TXL_ENA_SHIFT 9 /* DSP1TXL_ENA */ | ||
900 | #define WM8915_DSP1TXL_ENA_WIDTH 1 /* DSP1TXL_ENA */ | ||
901 | #define WM8915_DSP1TXR_ENA 0x0100 /* DSP1TXR_ENA */ | ||
902 | #define WM8915_DSP1TXR_ENA_MASK 0x0100 /* DSP1TXR_ENA */ | ||
903 | #define WM8915_DSP1TXR_ENA_SHIFT 8 /* DSP1TXR_ENA */ | ||
904 | #define WM8915_DSP1TXR_ENA_WIDTH 1 /* DSP1TXR_ENA */ | ||
905 | #define WM8915_DAC2L_ENA 0x0008 /* DAC2L_ENA */ | ||
906 | #define WM8915_DAC2L_ENA_MASK 0x0008 /* DAC2L_ENA */ | ||
907 | #define WM8915_DAC2L_ENA_SHIFT 3 /* DAC2L_ENA */ | ||
908 | #define WM8915_DAC2L_ENA_WIDTH 1 /* DAC2L_ENA */ | ||
909 | #define WM8915_DAC2R_ENA 0x0004 /* DAC2R_ENA */ | ||
910 | #define WM8915_DAC2R_ENA_MASK 0x0004 /* DAC2R_ENA */ | ||
911 | #define WM8915_DAC2R_ENA_SHIFT 2 /* DAC2R_ENA */ | ||
912 | #define WM8915_DAC2R_ENA_WIDTH 1 /* DAC2R_ENA */ | ||
913 | #define WM8915_DAC1L_ENA 0x0002 /* DAC1L_ENA */ | ||
914 | #define WM8915_DAC1L_ENA_MASK 0x0002 /* DAC1L_ENA */ | ||
915 | #define WM8915_DAC1L_ENA_SHIFT 1 /* DAC1L_ENA */ | ||
916 | #define WM8915_DAC1L_ENA_WIDTH 1 /* DAC1L_ENA */ | ||
917 | #define WM8915_DAC1R_ENA 0x0001 /* DAC1R_ENA */ | ||
918 | #define WM8915_DAC1R_ENA_MASK 0x0001 /* DAC1R_ENA */ | ||
919 | #define WM8915_DAC1R_ENA_SHIFT 0 /* DAC1R_ENA */ | ||
920 | #define WM8915_DAC1R_ENA_WIDTH 1 /* DAC1R_ENA */ | ||
921 | |||
922 | /* | ||
923 | * R6 (0x06) - Power Management (6) | ||
924 | */ | ||
925 | #define WM8915_AIF2TX_CHAN1_ENA 0x0200 /* AIF2TX_CHAN1_ENA */ | ||
926 | #define WM8915_AIF2TX_CHAN1_ENA_MASK 0x0200 /* AIF2TX_CHAN1_ENA */ | ||
927 | #define WM8915_AIF2TX_CHAN1_ENA_SHIFT 9 /* AIF2TX_CHAN1_ENA */ | ||
928 | #define WM8915_AIF2TX_CHAN1_ENA_WIDTH 1 /* AIF2TX_CHAN1_ENA */ | ||
929 | #define WM8915_AIF2TX_CHAN0_ENA 0x0100 /* AIF2TX_CHAN0_ENA */ | ||
930 | #define WM8915_AIF2TX_CHAN0_ENA_MASK 0x0100 /* AIF2TX_CHAN0_ENA */ | ||
931 | #define WM8915_AIF2TX_CHAN0_ENA_SHIFT 8 /* AIF2TX_CHAN0_ENA */ | ||
932 | #define WM8915_AIF2TX_CHAN0_ENA_WIDTH 1 /* AIF2TX_CHAN0_ENA */ | ||
933 | #define WM8915_AIF1TX_CHAN5_ENA 0x0020 /* AIF1TX_CHAN5_ENA */ | ||
934 | #define WM8915_AIF1TX_CHAN5_ENA_MASK 0x0020 /* AIF1TX_CHAN5_ENA */ | ||
935 | #define WM8915_AIF1TX_CHAN5_ENA_SHIFT 5 /* AIF1TX_CHAN5_ENA */ | ||
936 | #define WM8915_AIF1TX_CHAN5_ENA_WIDTH 1 /* AIF1TX_CHAN5_ENA */ | ||
937 | #define WM8915_AIF1TX_CHAN4_ENA 0x0010 /* AIF1TX_CHAN4_ENA */ | ||
938 | #define WM8915_AIF1TX_CHAN4_ENA_MASK 0x0010 /* AIF1TX_CHAN4_ENA */ | ||
939 | #define WM8915_AIF1TX_CHAN4_ENA_SHIFT 4 /* AIF1TX_CHAN4_ENA */ | ||
940 | #define WM8915_AIF1TX_CHAN4_ENA_WIDTH 1 /* AIF1TX_CHAN4_ENA */ | ||
941 | #define WM8915_AIF1TX_CHAN3_ENA 0x0008 /* AIF1TX_CHAN3_ENA */ | ||
942 | #define WM8915_AIF1TX_CHAN3_ENA_MASK 0x0008 /* AIF1TX_CHAN3_ENA */ | ||
943 | #define WM8915_AIF1TX_CHAN3_ENA_SHIFT 3 /* AIF1TX_CHAN3_ENA */ | ||
944 | #define WM8915_AIF1TX_CHAN3_ENA_WIDTH 1 /* AIF1TX_CHAN3_ENA */ | ||
945 | #define WM8915_AIF1TX_CHAN2_ENA 0x0004 /* AIF1TX_CHAN2_ENA */ | ||
946 | #define WM8915_AIF1TX_CHAN2_ENA_MASK 0x0004 /* AIF1TX_CHAN2_ENA */ | ||
947 | #define WM8915_AIF1TX_CHAN2_ENA_SHIFT 2 /* AIF1TX_CHAN2_ENA */ | ||
948 | #define WM8915_AIF1TX_CHAN2_ENA_WIDTH 1 /* AIF1TX_CHAN2_ENA */ | ||
949 | #define WM8915_AIF1TX_CHAN1_ENA 0x0002 /* AIF1TX_CHAN1_ENA */ | ||
950 | #define WM8915_AIF1TX_CHAN1_ENA_MASK 0x0002 /* AIF1TX_CHAN1_ENA */ | ||
951 | #define WM8915_AIF1TX_CHAN1_ENA_SHIFT 1 /* AIF1TX_CHAN1_ENA */ | ||
952 | #define WM8915_AIF1TX_CHAN1_ENA_WIDTH 1 /* AIF1TX_CHAN1_ENA */ | ||
953 | #define WM8915_AIF1TX_CHAN0_ENA 0x0001 /* AIF1TX_CHAN0_ENA */ | ||
954 | #define WM8915_AIF1TX_CHAN0_ENA_MASK 0x0001 /* AIF1TX_CHAN0_ENA */ | ||
955 | #define WM8915_AIF1TX_CHAN0_ENA_SHIFT 0 /* AIF1TX_CHAN0_ENA */ | ||
956 | #define WM8915_AIF1TX_CHAN0_ENA_WIDTH 1 /* AIF1TX_CHAN0_ENA */ | ||
957 | |||
958 | /* | ||
959 | * R7 (0x07) - Power Management (7) | ||
960 | */ | ||
961 | #define WM8915_DMIC2_FN 0x0200 /* DMIC2_FN */ | ||
962 | #define WM8915_DMIC2_FN_MASK 0x0200 /* DMIC2_FN */ | ||
963 | #define WM8915_DMIC2_FN_SHIFT 9 /* DMIC2_FN */ | ||
964 | #define WM8915_DMIC2_FN_WIDTH 1 /* DMIC2_FN */ | ||
965 | #define WM8915_DMIC1_FN 0x0100 /* DMIC1_FN */ | ||
966 | #define WM8915_DMIC1_FN_MASK 0x0100 /* DMIC1_FN */ | ||
967 | #define WM8915_DMIC1_FN_SHIFT 8 /* DMIC1_FN */ | ||
968 | #define WM8915_DMIC1_FN_WIDTH 1 /* DMIC1_FN */ | ||
969 | #define WM8915_ADC_DMIC_DSP2R_ENA 0x0080 /* ADC_DMIC_DSP2R_ENA */ | ||
970 | #define WM8915_ADC_DMIC_DSP2R_ENA_MASK 0x0080 /* ADC_DMIC_DSP2R_ENA */ | ||
971 | #define WM8915_ADC_DMIC_DSP2R_ENA_SHIFT 7 /* ADC_DMIC_DSP2R_ENA */ | ||
972 | #define WM8915_ADC_DMIC_DSP2R_ENA_WIDTH 1 /* ADC_DMIC_DSP2R_ENA */ | ||
973 | #define WM8915_ADC_DMIC_DSP2L_ENA 0x0040 /* ADC_DMIC_DSP2L_ENA */ | ||
974 | #define WM8915_ADC_DMIC_DSP2L_ENA_MASK 0x0040 /* ADC_DMIC_DSP2L_ENA */ | ||
975 | #define WM8915_ADC_DMIC_DSP2L_ENA_SHIFT 6 /* ADC_DMIC_DSP2L_ENA */ | ||
976 | #define WM8915_ADC_DMIC_DSP2L_ENA_WIDTH 1 /* ADC_DMIC_DSP2L_ENA */ | ||
977 | #define WM8915_ADC_DMIC_SRC2_MASK 0x0030 /* ADC_DMIC_SRC2 - [5:4] */ | ||
978 | #define WM8915_ADC_DMIC_SRC2_SHIFT 4 /* ADC_DMIC_SRC2 - [5:4] */ | ||
979 | #define WM8915_ADC_DMIC_SRC2_WIDTH 2 /* ADC_DMIC_SRC2 - [5:4] */ | ||
980 | #define WM8915_ADC_DMIC_DSP1R_ENA 0x0008 /* ADC_DMIC_DSP1R_ENA */ | ||
981 | #define WM8915_ADC_DMIC_DSP1R_ENA_MASK 0x0008 /* ADC_DMIC_DSP1R_ENA */ | ||
982 | #define WM8915_ADC_DMIC_DSP1R_ENA_SHIFT 3 /* ADC_DMIC_DSP1R_ENA */ | ||
983 | #define WM8915_ADC_DMIC_DSP1R_ENA_WIDTH 1 /* ADC_DMIC_DSP1R_ENA */ | ||
984 | #define WM8915_ADC_DMIC_DSP1L_ENA 0x0004 /* ADC_DMIC_DSP1L_ENA */ | ||
985 | #define WM8915_ADC_DMIC_DSP1L_ENA_MASK 0x0004 /* ADC_DMIC_DSP1L_ENA */ | ||
986 | #define WM8915_ADC_DMIC_DSP1L_ENA_SHIFT 2 /* ADC_DMIC_DSP1L_ENA */ | ||
987 | #define WM8915_ADC_DMIC_DSP1L_ENA_WIDTH 1 /* ADC_DMIC_DSP1L_ENA */ | ||
988 | #define WM8915_ADC_DMIC_SRC1_MASK 0x0003 /* ADC_DMIC_SRC1 - [1:0] */ | ||
989 | #define WM8915_ADC_DMIC_SRC1_SHIFT 0 /* ADC_DMIC_SRC1 - [1:0] */ | ||
990 | #define WM8915_ADC_DMIC_SRC1_WIDTH 2 /* ADC_DMIC_SRC1 - [1:0] */ | ||
991 | |||
992 | /* | ||
993 | * R8 (0x08) - Power Management (8) | ||
994 | */ | ||
995 | #define WM8915_AIF2TX_SRC_MASK 0x00C0 /* AIF2TX_SRC - [7:6] */ | ||
996 | #define WM8915_AIF2TX_SRC_SHIFT 6 /* AIF2TX_SRC - [7:6] */ | ||
997 | #define WM8915_AIF2TX_SRC_WIDTH 2 /* AIF2TX_SRC - [7:6] */ | ||
998 | #define WM8915_DSP2RX_SRC 0x0010 /* DSP2RX_SRC */ | ||
999 | #define WM8915_DSP2RX_SRC_MASK 0x0010 /* DSP2RX_SRC */ | ||
1000 | #define WM8915_DSP2RX_SRC_SHIFT 4 /* DSP2RX_SRC */ | ||
1001 | #define WM8915_DSP2RX_SRC_WIDTH 1 /* DSP2RX_SRC */ | ||
1002 | #define WM8915_DSP1RX_SRC 0x0001 /* DSP1RX_SRC */ | ||
1003 | #define WM8915_DSP1RX_SRC_MASK 0x0001 /* DSP1RX_SRC */ | ||
1004 | #define WM8915_DSP1RX_SRC_SHIFT 0 /* DSP1RX_SRC */ | ||
1005 | #define WM8915_DSP1RX_SRC_WIDTH 1 /* DSP1RX_SRC */ | ||
1006 | |||
1007 | /* | ||
1008 | * R16 (0x10) - Left Line Input Volume | ||
1009 | */ | ||
1010 | #define WM8915_IN1_VU 0x0080 /* IN1_VU */ | ||
1011 | #define WM8915_IN1_VU_MASK 0x0080 /* IN1_VU */ | ||
1012 | #define WM8915_IN1_VU_SHIFT 7 /* IN1_VU */ | ||
1013 | #define WM8915_IN1_VU_WIDTH 1 /* IN1_VU */ | ||
1014 | #define WM8915_IN1L_ZC 0x0020 /* IN1L_ZC */ | ||
1015 | #define WM8915_IN1L_ZC_MASK 0x0020 /* IN1L_ZC */ | ||
1016 | #define WM8915_IN1L_ZC_SHIFT 5 /* IN1L_ZC */ | ||
1017 | #define WM8915_IN1L_ZC_WIDTH 1 /* IN1L_ZC */ | ||
1018 | #define WM8915_IN1L_VOL_MASK 0x001F /* IN1L_VOL - [4:0] */ | ||
1019 | #define WM8915_IN1L_VOL_SHIFT 0 /* IN1L_VOL - [4:0] */ | ||
1020 | #define WM8915_IN1L_VOL_WIDTH 5 /* IN1L_VOL - [4:0] */ | ||
1021 | |||
1022 | /* | ||
1023 | * R17 (0x11) - Right Line Input Volume | ||
1024 | */ | ||
1025 | #define WM8915_IN1_VU 0x0080 /* IN1_VU */ | ||
1026 | #define WM8915_IN1_VU_MASK 0x0080 /* IN1_VU */ | ||
1027 | #define WM8915_IN1_VU_SHIFT 7 /* IN1_VU */ | ||
1028 | #define WM8915_IN1_VU_WIDTH 1 /* IN1_VU */ | ||
1029 | #define WM8915_IN1R_ZC 0x0020 /* IN1R_ZC */ | ||
1030 | #define WM8915_IN1R_ZC_MASK 0x0020 /* IN1R_ZC */ | ||
1031 | #define WM8915_IN1R_ZC_SHIFT 5 /* IN1R_ZC */ | ||
1032 | #define WM8915_IN1R_ZC_WIDTH 1 /* IN1R_ZC */ | ||
1033 | #define WM8915_IN1R_VOL_MASK 0x001F /* IN1R_VOL - [4:0] */ | ||
1034 | #define WM8915_IN1R_VOL_SHIFT 0 /* IN1R_VOL - [4:0] */ | ||
1035 | #define WM8915_IN1R_VOL_WIDTH 5 /* IN1R_VOL - [4:0] */ | ||
1036 | |||
1037 | /* | ||
1038 | * R18 (0x12) - Line Input Control | ||
1039 | */ | ||
1040 | #define WM8915_INL_MODE_MASK 0x000C /* INL_MODE - [3:2] */ | ||
1041 | #define WM8915_INL_MODE_SHIFT 2 /* INL_MODE - [3:2] */ | ||
1042 | #define WM8915_INL_MODE_WIDTH 2 /* INL_MODE - [3:2] */ | ||
1043 | #define WM8915_INR_MODE_MASK 0x0003 /* INR_MODE - [1:0] */ | ||
1044 | #define WM8915_INR_MODE_SHIFT 0 /* INR_MODE - [1:0] */ | ||
1045 | #define WM8915_INR_MODE_WIDTH 2 /* INR_MODE - [1:0] */ | ||
1046 | |||
1047 | /* | ||
1048 | * R21 (0x15) - DAC1 HPOUT1 Volume | ||
1049 | */ | ||
1050 | #define WM8915_DAC1R_HPOUT1R_VOL_MASK 0x00F0 /* DAC1R_HPOUT1R_VOL - [7:4] */ | ||
1051 | #define WM8915_DAC1R_HPOUT1R_VOL_SHIFT 4 /* DAC1R_HPOUT1R_VOL - [7:4] */ | ||
1052 | #define WM8915_DAC1R_HPOUT1R_VOL_WIDTH 4 /* DAC1R_HPOUT1R_VOL - [7:4] */ | ||
1053 | #define WM8915_DAC1L_HPOUT1L_VOL_MASK 0x000F /* DAC1L_HPOUT1L_VOL - [3:0] */ | ||
1054 | #define WM8915_DAC1L_HPOUT1L_VOL_SHIFT 0 /* DAC1L_HPOUT1L_VOL - [3:0] */ | ||
1055 | #define WM8915_DAC1L_HPOUT1L_VOL_WIDTH 4 /* DAC1L_HPOUT1L_VOL - [3:0] */ | ||
1056 | |||
1057 | /* | ||
1058 | * R22 (0x16) - DAC2 HPOUT2 Volume | ||
1059 | */ | ||
1060 | #define WM8915_DAC2R_HPOUT2R_VOL_MASK 0x00F0 /* DAC2R_HPOUT2R_VOL - [7:4] */ | ||
1061 | #define WM8915_DAC2R_HPOUT2R_VOL_SHIFT 4 /* DAC2R_HPOUT2R_VOL - [7:4] */ | ||
1062 | #define WM8915_DAC2R_HPOUT2R_VOL_WIDTH 4 /* DAC2R_HPOUT2R_VOL - [7:4] */ | ||
1063 | #define WM8915_DAC2L_HPOUT2L_VOL_MASK 0x000F /* DAC2L_HPOUT2L_VOL - [3:0] */ | ||
1064 | #define WM8915_DAC2L_HPOUT2L_VOL_SHIFT 0 /* DAC2L_HPOUT2L_VOL - [3:0] */ | ||
1065 | #define WM8915_DAC2L_HPOUT2L_VOL_WIDTH 4 /* DAC2L_HPOUT2L_VOL - [3:0] */ | ||
1066 | |||
1067 | /* | ||
1068 | * R24 (0x18) - DAC1 Left Volume | ||
1069 | */ | ||
1070 | #define WM8915_DAC1L_MUTE 0x0200 /* DAC1L_MUTE */ | ||
1071 | #define WM8915_DAC1L_MUTE_MASK 0x0200 /* DAC1L_MUTE */ | ||
1072 | #define WM8915_DAC1L_MUTE_SHIFT 9 /* DAC1L_MUTE */ | ||
1073 | #define WM8915_DAC1L_MUTE_WIDTH 1 /* DAC1L_MUTE */ | ||
1074 | #define WM8915_DAC1_VU 0x0100 /* DAC1_VU */ | ||
1075 | #define WM8915_DAC1_VU_MASK 0x0100 /* DAC1_VU */ | ||
1076 | #define WM8915_DAC1_VU_SHIFT 8 /* DAC1_VU */ | ||
1077 | #define WM8915_DAC1_VU_WIDTH 1 /* DAC1_VU */ | ||
1078 | #define WM8915_DAC1L_VOL_MASK 0x00FF /* DAC1L_VOL - [7:0] */ | ||
1079 | #define WM8915_DAC1L_VOL_SHIFT 0 /* DAC1L_VOL - [7:0] */ | ||
1080 | #define WM8915_DAC1L_VOL_WIDTH 8 /* DAC1L_VOL - [7:0] */ | ||
1081 | |||
1082 | /* | ||
1083 | * R25 (0x19) - DAC1 Right Volume | ||
1084 | */ | ||
1085 | #define WM8915_DAC1R_MUTE 0x0200 /* DAC1R_MUTE */ | ||
1086 | #define WM8915_DAC1R_MUTE_MASK 0x0200 /* DAC1R_MUTE */ | ||
1087 | #define WM8915_DAC1R_MUTE_SHIFT 9 /* DAC1R_MUTE */ | ||
1088 | #define WM8915_DAC1R_MUTE_WIDTH 1 /* DAC1R_MUTE */ | ||
1089 | #define WM8915_DAC1_VU 0x0100 /* DAC1_VU */ | ||
1090 | #define WM8915_DAC1_VU_MASK 0x0100 /* DAC1_VU */ | ||
1091 | #define WM8915_DAC1_VU_SHIFT 8 /* DAC1_VU */ | ||
1092 | #define WM8915_DAC1_VU_WIDTH 1 /* DAC1_VU */ | ||
1093 | #define WM8915_DAC1R_VOL_MASK 0x00FF /* DAC1R_VOL - [7:0] */ | ||
1094 | #define WM8915_DAC1R_VOL_SHIFT 0 /* DAC1R_VOL - [7:0] */ | ||
1095 | #define WM8915_DAC1R_VOL_WIDTH 8 /* DAC1R_VOL - [7:0] */ | ||
1096 | |||
1097 | /* | ||
1098 | * R26 (0x1A) - DAC2 Left Volume | ||
1099 | */ | ||
1100 | #define WM8915_DAC2L_MUTE 0x0200 /* DAC2L_MUTE */ | ||
1101 | #define WM8915_DAC2L_MUTE_MASK 0x0200 /* DAC2L_MUTE */ | ||
1102 | #define WM8915_DAC2L_MUTE_SHIFT 9 /* DAC2L_MUTE */ | ||
1103 | #define WM8915_DAC2L_MUTE_WIDTH 1 /* DAC2L_MUTE */ | ||
1104 | #define WM8915_DAC2_VU 0x0100 /* DAC2_VU */ | ||
1105 | #define WM8915_DAC2_VU_MASK 0x0100 /* DAC2_VU */ | ||
1106 | #define WM8915_DAC2_VU_SHIFT 8 /* DAC2_VU */ | ||
1107 | #define WM8915_DAC2_VU_WIDTH 1 /* DAC2_VU */ | ||
1108 | #define WM8915_DAC2L_VOL_MASK 0x00FF /* DAC2L_VOL - [7:0] */ | ||
1109 | #define WM8915_DAC2L_VOL_SHIFT 0 /* DAC2L_VOL - [7:0] */ | ||
1110 | #define WM8915_DAC2L_VOL_WIDTH 8 /* DAC2L_VOL - [7:0] */ | ||
1111 | |||
1112 | /* | ||
1113 | * R27 (0x1B) - DAC2 Right Volume | ||
1114 | */ | ||
1115 | #define WM8915_DAC2R_MUTE 0x0200 /* DAC2R_MUTE */ | ||
1116 | #define WM8915_DAC2R_MUTE_MASK 0x0200 /* DAC2R_MUTE */ | ||
1117 | #define WM8915_DAC2R_MUTE_SHIFT 9 /* DAC2R_MUTE */ | ||
1118 | #define WM8915_DAC2R_MUTE_WIDTH 1 /* DAC2R_MUTE */ | ||
1119 | #define WM8915_DAC2_VU 0x0100 /* DAC2_VU */ | ||
1120 | #define WM8915_DAC2_VU_MASK 0x0100 /* DAC2_VU */ | ||
1121 | #define WM8915_DAC2_VU_SHIFT 8 /* DAC2_VU */ | ||
1122 | #define WM8915_DAC2_VU_WIDTH 1 /* DAC2_VU */ | ||
1123 | #define WM8915_DAC2R_VOL_MASK 0x00FF /* DAC2R_VOL - [7:0] */ | ||
1124 | #define WM8915_DAC2R_VOL_SHIFT 0 /* DAC2R_VOL - [7:0] */ | ||
1125 | #define WM8915_DAC2R_VOL_WIDTH 8 /* DAC2R_VOL - [7:0] */ | ||
1126 | |||
1127 | /* | ||
1128 | * R28 (0x1C) - Output1 Left Volume | ||
1129 | */ | ||
1130 | #define WM8915_DAC1_VU 0x0100 /* DAC1_VU */ | ||
1131 | #define WM8915_DAC1_VU_MASK 0x0100 /* DAC1_VU */ | ||
1132 | #define WM8915_DAC1_VU_SHIFT 8 /* DAC1_VU */ | ||
1133 | #define WM8915_DAC1_VU_WIDTH 1 /* DAC1_VU */ | ||
1134 | #define WM8915_HPOUT1L_ZC 0x0080 /* HPOUT1L_ZC */ | ||
1135 | #define WM8915_HPOUT1L_ZC_MASK 0x0080 /* HPOUT1L_ZC */ | ||
1136 | #define WM8915_HPOUT1L_ZC_SHIFT 7 /* HPOUT1L_ZC */ | ||
1137 | #define WM8915_HPOUT1L_ZC_WIDTH 1 /* HPOUT1L_ZC */ | ||
1138 | #define WM8915_HPOUT1L_VOL_MASK 0x000F /* HPOUT1L_VOL - [3:0] */ | ||
1139 | #define WM8915_HPOUT1L_VOL_SHIFT 0 /* HPOUT1L_VOL - [3:0] */ | ||
1140 | #define WM8915_HPOUT1L_VOL_WIDTH 4 /* HPOUT1L_VOL - [3:0] */ | ||
1141 | |||
1142 | /* | ||
1143 | * R29 (0x1D) - Output1 Right Volume | ||
1144 | */ | ||
1145 | #define WM8915_DAC1_VU 0x0100 /* DAC1_VU */ | ||
1146 | #define WM8915_DAC1_VU_MASK 0x0100 /* DAC1_VU */ | ||
1147 | #define WM8915_DAC1_VU_SHIFT 8 /* DAC1_VU */ | ||
1148 | #define WM8915_DAC1_VU_WIDTH 1 /* DAC1_VU */ | ||
1149 | #define WM8915_HPOUT1R_ZC 0x0080 /* HPOUT1R_ZC */ | ||
1150 | #define WM8915_HPOUT1R_ZC_MASK 0x0080 /* HPOUT1R_ZC */ | ||
1151 | #define WM8915_HPOUT1R_ZC_SHIFT 7 /* HPOUT1R_ZC */ | ||
1152 | #define WM8915_HPOUT1R_ZC_WIDTH 1 /* HPOUT1R_ZC */ | ||
1153 | #define WM8915_HPOUT1R_VOL_MASK 0x000F /* HPOUT1R_VOL - [3:0] */ | ||
1154 | #define WM8915_HPOUT1R_VOL_SHIFT 0 /* HPOUT1R_VOL - [3:0] */ | ||
1155 | #define WM8915_HPOUT1R_VOL_WIDTH 4 /* HPOUT1R_VOL - [3:0] */ | ||
1156 | |||
1157 | /* | ||
1158 | * R30 (0x1E) - Output2 Left Volume | ||
1159 | */ | ||
1160 | #define WM8915_DAC2_VU 0x0100 /* DAC2_VU */ | ||
1161 | #define WM8915_DAC2_VU_MASK 0x0100 /* DAC2_VU */ | ||
1162 | #define WM8915_DAC2_VU_SHIFT 8 /* DAC2_VU */ | ||
1163 | #define WM8915_DAC2_VU_WIDTH 1 /* DAC2_VU */ | ||
1164 | #define WM8915_HPOUT2L_ZC 0x0080 /* HPOUT2L_ZC */ | ||
1165 | #define WM8915_HPOUT2L_ZC_MASK 0x0080 /* HPOUT2L_ZC */ | ||
1166 | #define WM8915_HPOUT2L_ZC_SHIFT 7 /* HPOUT2L_ZC */ | ||
1167 | #define WM8915_HPOUT2L_ZC_WIDTH 1 /* HPOUT2L_ZC */ | ||
1168 | #define WM8915_HPOUT2L_VOL_MASK 0x000F /* HPOUT2L_VOL - [3:0] */ | ||
1169 | #define WM8915_HPOUT2L_VOL_SHIFT 0 /* HPOUT2L_VOL - [3:0] */ | ||
1170 | #define WM8915_HPOUT2L_VOL_WIDTH 4 /* HPOUT2L_VOL - [3:0] */ | ||
1171 | |||
1172 | /* | ||
1173 | * R31 (0x1F) - Output2 Right Volume | ||
1174 | */ | ||
1175 | #define WM8915_DAC2_VU 0x0100 /* DAC2_VU */ | ||
1176 | #define WM8915_DAC2_VU_MASK 0x0100 /* DAC2_VU */ | ||
1177 | #define WM8915_DAC2_VU_SHIFT 8 /* DAC2_VU */ | ||
1178 | #define WM8915_DAC2_VU_WIDTH 1 /* DAC2_VU */ | ||
1179 | #define WM8915_HPOUT2R_ZC 0x0080 /* HPOUT2R_ZC */ | ||
1180 | #define WM8915_HPOUT2R_ZC_MASK 0x0080 /* HPOUT2R_ZC */ | ||
1181 | #define WM8915_HPOUT2R_ZC_SHIFT 7 /* HPOUT2R_ZC */ | ||
1182 | #define WM8915_HPOUT2R_ZC_WIDTH 1 /* HPOUT2R_ZC */ | ||
1183 | #define WM8915_HPOUT2R_VOL_MASK 0x000F /* HPOUT2R_VOL - [3:0] */ | ||
1184 | #define WM8915_HPOUT2R_VOL_SHIFT 0 /* HPOUT2R_VOL - [3:0] */ | ||
1185 | #define WM8915_HPOUT2R_VOL_WIDTH 4 /* HPOUT2R_VOL - [3:0] */ | ||
1186 | |||
1187 | /* | ||
1188 | * R32 (0x20) - MICBIAS (1) | ||
1189 | */ | ||
1190 | #define WM8915_MICB1_RATE 0x0020 /* MICB1_RATE */ | ||
1191 | #define WM8915_MICB1_RATE_MASK 0x0020 /* MICB1_RATE */ | ||
1192 | #define WM8915_MICB1_RATE_SHIFT 5 /* MICB1_RATE */ | ||
1193 | #define WM8915_MICB1_RATE_WIDTH 1 /* MICB1_RATE */ | ||
1194 | #define WM8915_MICB1_MODE 0x0010 /* MICB1_MODE */ | ||
1195 | #define WM8915_MICB1_MODE_MASK 0x0010 /* MICB1_MODE */ | ||
1196 | #define WM8915_MICB1_MODE_SHIFT 4 /* MICB1_MODE */ | ||
1197 | #define WM8915_MICB1_MODE_WIDTH 1 /* MICB1_MODE */ | ||
1198 | #define WM8915_MICB1_LVL_MASK 0x000E /* MICB1_LVL - [3:1] */ | ||
1199 | #define WM8915_MICB1_LVL_SHIFT 1 /* MICB1_LVL - [3:1] */ | ||
1200 | #define WM8915_MICB1_LVL_WIDTH 3 /* MICB1_LVL - [3:1] */ | ||
1201 | #define WM8915_MICB1_DISCH 0x0001 /* MICB1_DISCH */ | ||
1202 | #define WM8915_MICB1_DISCH_MASK 0x0001 /* MICB1_DISCH */ | ||
1203 | #define WM8915_MICB1_DISCH_SHIFT 0 /* MICB1_DISCH */ | ||
1204 | #define WM8915_MICB1_DISCH_WIDTH 1 /* MICB1_DISCH */ | ||
1205 | |||
1206 | /* | ||
1207 | * R33 (0x21) - MICBIAS (2) | ||
1208 | */ | ||
1209 | #define WM8915_MICB2_RATE 0x0020 /* MICB2_RATE */ | ||
1210 | #define WM8915_MICB2_RATE_MASK 0x0020 /* MICB2_RATE */ | ||
1211 | #define WM8915_MICB2_RATE_SHIFT 5 /* MICB2_RATE */ | ||
1212 | #define WM8915_MICB2_RATE_WIDTH 1 /* MICB2_RATE */ | ||
1213 | #define WM8915_MICB2_MODE 0x0010 /* MICB2_MODE */ | ||
1214 | #define WM8915_MICB2_MODE_MASK 0x0010 /* MICB2_MODE */ | ||
1215 | #define WM8915_MICB2_MODE_SHIFT 4 /* MICB2_MODE */ | ||
1216 | #define WM8915_MICB2_MODE_WIDTH 1 /* MICB2_MODE */ | ||
1217 | #define WM8915_MICB2_LVL_MASK 0x000E /* MICB2_LVL - [3:1] */ | ||
1218 | #define WM8915_MICB2_LVL_SHIFT 1 /* MICB2_LVL - [3:1] */ | ||
1219 | #define WM8915_MICB2_LVL_WIDTH 3 /* MICB2_LVL - [3:1] */ | ||
1220 | #define WM8915_MICB2_DISCH 0x0001 /* MICB2_DISCH */ | ||
1221 | #define WM8915_MICB2_DISCH_MASK 0x0001 /* MICB2_DISCH */ | ||
1222 | #define WM8915_MICB2_DISCH_SHIFT 0 /* MICB2_DISCH */ | ||
1223 | #define WM8915_MICB2_DISCH_WIDTH 1 /* MICB2_DISCH */ | ||
1224 | |||
1225 | /* | ||
1226 | * R40 (0x28) - LDO 1 | ||
1227 | */ | ||
1228 | #define WM8915_LDO1_MODE 0x0020 /* LDO1_MODE */ | ||
1229 | #define WM8915_LDO1_MODE_MASK 0x0020 /* LDO1_MODE */ | ||
1230 | #define WM8915_LDO1_MODE_SHIFT 5 /* LDO1_MODE */ | ||
1231 | #define WM8915_LDO1_MODE_WIDTH 1 /* LDO1_MODE */ | ||
1232 | #define WM8915_LDO1_VSEL_MASK 0x0006 /* LDO1_VSEL - [2:1] */ | ||
1233 | #define WM8915_LDO1_VSEL_SHIFT 1 /* LDO1_VSEL - [2:1] */ | ||
1234 | #define WM8915_LDO1_VSEL_WIDTH 2 /* LDO1_VSEL - [2:1] */ | ||
1235 | #define WM8915_LDO1_DISCH 0x0001 /* LDO1_DISCH */ | ||
1236 | #define WM8915_LDO1_DISCH_MASK 0x0001 /* LDO1_DISCH */ | ||
1237 | #define WM8915_LDO1_DISCH_SHIFT 0 /* LDO1_DISCH */ | ||
1238 | #define WM8915_LDO1_DISCH_WIDTH 1 /* LDO1_DISCH */ | ||
1239 | |||
1240 | /* | ||
1241 | * R41 (0x29) - LDO 2 | ||
1242 | */ | ||
1243 | #define WM8915_LDO2_MODE 0x0020 /* LDO2_MODE */ | ||
1244 | #define WM8915_LDO2_MODE_MASK 0x0020 /* LDO2_MODE */ | ||
1245 | #define WM8915_LDO2_MODE_SHIFT 5 /* LDO2_MODE */ | ||
1246 | #define WM8915_LDO2_MODE_WIDTH 1 /* LDO2_MODE */ | ||
1247 | #define WM8915_LDO2_VSEL_MASK 0x001E /* LDO2_VSEL - [4:1] */ | ||
1248 | #define WM8915_LDO2_VSEL_SHIFT 1 /* LDO2_VSEL - [4:1] */ | ||
1249 | #define WM8915_LDO2_VSEL_WIDTH 4 /* LDO2_VSEL - [4:1] */ | ||
1250 | #define WM8915_LDO2_DISCH 0x0001 /* LDO2_DISCH */ | ||
1251 | #define WM8915_LDO2_DISCH_MASK 0x0001 /* LDO2_DISCH */ | ||
1252 | #define WM8915_LDO2_DISCH_SHIFT 0 /* LDO2_DISCH */ | ||
1253 | #define WM8915_LDO2_DISCH_WIDTH 1 /* LDO2_DISCH */ | ||
1254 | |||
1255 | /* | ||
1256 | * R48 (0x30) - Accessory Detect Mode 1 | ||
1257 | */ | ||
1258 | #define WM8915_JD_MODE_MASK 0x0003 /* JD_MODE - [1:0] */ | ||
1259 | #define WM8915_JD_MODE_SHIFT 0 /* JD_MODE - [1:0] */ | ||
1260 | #define WM8915_JD_MODE_WIDTH 2 /* JD_MODE - [1:0] */ | ||
1261 | |||
1262 | /* | ||
1263 | * R49 (0x31) - Accessory Detect Mode 2 | ||
1264 | */ | ||
1265 | #define WM8915_HPOUT1FB_SRC 0x0004 /* HPOUT1FB_SRC */ | ||
1266 | #define WM8915_HPOUT1FB_SRC_MASK 0x0004 /* HPOUT1FB_SRC */ | ||
1267 | #define WM8915_HPOUT1FB_SRC_SHIFT 2 /* HPOUT1FB_SRC */ | ||
1268 | #define WM8915_HPOUT1FB_SRC_WIDTH 1 /* HPOUT1FB_SRC */ | ||
1269 | #define WM8915_MICD_SRC 0x0002 /* MICD_SRC */ | ||
1270 | #define WM8915_MICD_SRC_MASK 0x0002 /* MICD_SRC */ | ||
1271 | #define WM8915_MICD_SRC_SHIFT 1 /* MICD_SRC */ | ||
1272 | #define WM8915_MICD_SRC_WIDTH 1 /* MICD_SRC */ | ||
1273 | #define WM8915_MICD_BIAS_SRC 0x0001 /* MICD_BIAS_SRC */ | ||
1274 | #define WM8915_MICD_BIAS_SRC_MASK 0x0001 /* MICD_BIAS_SRC */ | ||
1275 | #define WM8915_MICD_BIAS_SRC_SHIFT 0 /* MICD_BIAS_SRC */ | ||
1276 | #define WM8915_MICD_BIAS_SRC_WIDTH 1 /* MICD_BIAS_SRC */ | ||
1277 | |||
1278 | /* | ||
1279 | * R52 (0x34) - Headphone Detect 1 | ||
1280 | */ | ||
1281 | #define WM8915_HP_HOLDTIME_MASK 0x00E0 /* HP_HOLDTIME - [7:5] */ | ||
1282 | #define WM8915_HP_HOLDTIME_SHIFT 5 /* HP_HOLDTIME - [7:5] */ | ||
1283 | #define WM8915_HP_HOLDTIME_WIDTH 3 /* HP_HOLDTIME - [7:5] */ | ||
1284 | #define WM8915_HP_CLK_DIV_MASK 0x0018 /* HP_CLK_DIV - [4:3] */ | ||
1285 | #define WM8915_HP_CLK_DIV_SHIFT 3 /* HP_CLK_DIV - [4:3] */ | ||
1286 | #define WM8915_HP_CLK_DIV_WIDTH 2 /* HP_CLK_DIV - [4:3] */ | ||
1287 | #define WM8915_HP_STEP_SIZE 0x0002 /* HP_STEP_SIZE */ | ||
1288 | #define WM8915_HP_STEP_SIZE_MASK 0x0002 /* HP_STEP_SIZE */ | ||
1289 | #define WM8915_HP_STEP_SIZE_SHIFT 1 /* HP_STEP_SIZE */ | ||
1290 | #define WM8915_HP_STEP_SIZE_WIDTH 1 /* HP_STEP_SIZE */ | ||
1291 | #define WM8915_HP_POLL 0x0001 /* HP_POLL */ | ||
1292 | #define WM8915_HP_POLL_MASK 0x0001 /* HP_POLL */ | ||
1293 | #define WM8915_HP_POLL_SHIFT 0 /* HP_POLL */ | ||
1294 | #define WM8915_HP_POLL_WIDTH 1 /* HP_POLL */ | ||
1295 | |||
1296 | /* | ||
1297 | * R53 (0x35) - Headphone Detect 2 | ||
1298 | */ | ||
1299 | #define WM8915_HP_DONE 0x0080 /* HP_DONE */ | ||
1300 | #define WM8915_HP_DONE_MASK 0x0080 /* HP_DONE */ | ||
1301 | #define WM8915_HP_DONE_SHIFT 7 /* HP_DONE */ | ||
1302 | #define WM8915_HP_DONE_WIDTH 1 /* HP_DONE */ | ||
1303 | #define WM8915_HP_LVL_MASK 0x007F /* HP_LVL - [6:0] */ | ||
1304 | #define WM8915_HP_LVL_SHIFT 0 /* HP_LVL - [6:0] */ | ||
1305 | #define WM8915_HP_LVL_WIDTH 7 /* HP_LVL - [6:0] */ | ||
1306 | |||
1307 | /* | ||
1308 | * R56 (0x38) - Mic Detect 1 | ||
1309 | */ | ||
1310 | #define WM8915_MICD_BIAS_STARTTIME_MASK 0xF000 /* MICD_BIAS_STARTTIME - [15:12] */ | ||
1311 | #define WM8915_MICD_BIAS_STARTTIME_SHIFT 12 /* MICD_BIAS_STARTTIME - [15:12] */ | ||
1312 | #define WM8915_MICD_BIAS_STARTTIME_WIDTH 4 /* MICD_BIAS_STARTTIME - [15:12] */ | ||
1313 | #define WM8915_MICD_RATE_MASK 0x0F00 /* MICD_RATE - [11:8] */ | ||
1314 | #define WM8915_MICD_RATE_SHIFT 8 /* MICD_RATE - [11:8] */ | ||
1315 | #define WM8915_MICD_RATE_WIDTH 4 /* MICD_RATE - [11:8] */ | ||
1316 | #define WM8915_MICD_DBTIME 0x0002 /* MICD_DBTIME */ | ||
1317 | #define WM8915_MICD_DBTIME_MASK 0x0002 /* MICD_DBTIME */ | ||
1318 | #define WM8915_MICD_DBTIME_SHIFT 1 /* MICD_DBTIME */ | ||
1319 | #define WM8915_MICD_DBTIME_WIDTH 1 /* MICD_DBTIME */ | ||
1320 | #define WM8915_MICD_ENA 0x0001 /* MICD_ENA */ | ||
1321 | #define WM8915_MICD_ENA_MASK 0x0001 /* MICD_ENA */ | ||
1322 | #define WM8915_MICD_ENA_SHIFT 0 /* MICD_ENA */ | ||
1323 | #define WM8915_MICD_ENA_WIDTH 1 /* MICD_ENA */ | ||
1324 | |||
1325 | /* | ||
1326 | * R57 (0x39) - Mic Detect 2 | ||
1327 | */ | ||
1328 | #define WM8915_MICD_LVL_SEL_MASK 0x00FF /* MICD_LVL_SEL - [7:0] */ | ||
1329 | #define WM8915_MICD_LVL_SEL_SHIFT 0 /* MICD_LVL_SEL - [7:0] */ | ||
1330 | #define WM8915_MICD_LVL_SEL_WIDTH 8 /* MICD_LVL_SEL - [7:0] */ | ||
1331 | |||
1332 | /* | ||
1333 | * R58 (0x3A) - Mic Detect 3 | ||
1334 | */ | ||
1335 | #define WM8915_MICD_LVL_MASK 0x07FC /* MICD_LVL - [10:2] */ | ||
1336 | #define WM8915_MICD_LVL_SHIFT 2 /* MICD_LVL - [10:2] */ | ||
1337 | #define WM8915_MICD_LVL_WIDTH 9 /* MICD_LVL - [10:2] */ | ||
1338 | #define WM8915_MICD_VALID 0x0002 /* MICD_VALID */ | ||
1339 | #define WM8915_MICD_VALID_MASK 0x0002 /* MICD_VALID */ | ||
1340 | #define WM8915_MICD_VALID_SHIFT 1 /* MICD_VALID */ | ||
1341 | #define WM8915_MICD_VALID_WIDTH 1 /* MICD_VALID */ | ||
1342 | #define WM8915_MICD_STS 0x0001 /* MICD_STS */ | ||
1343 | #define WM8915_MICD_STS_MASK 0x0001 /* MICD_STS */ | ||
1344 | #define WM8915_MICD_STS_SHIFT 0 /* MICD_STS */ | ||
1345 | #define WM8915_MICD_STS_WIDTH 1 /* MICD_STS */ | ||
1346 | |||
1347 | /* | ||
1348 | * R64 (0x40) - Charge Pump (1) | ||
1349 | */ | ||
1350 | #define WM8915_CP_ENA 0x8000 /* CP_ENA */ | ||
1351 | #define WM8915_CP_ENA_MASK 0x8000 /* CP_ENA */ | ||
1352 | #define WM8915_CP_ENA_SHIFT 15 /* CP_ENA */ | ||
1353 | #define WM8915_CP_ENA_WIDTH 1 /* CP_ENA */ | ||
1354 | |||
1355 | /* | ||
1356 | * R65 (0x41) - Charge Pump (2) | ||
1357 | */ | ||
1358 | #define WM8915_CP_DISCH 0x8000 /* CP_DISCH */ | ||
1359 | #define WM8915_CP_DISCH_MASK 0x8000 /* CP_DISCH */ | ||
1360 | #define WM8915_CP_DISCH_SHIFT 15 /* CP_DISCH */ | ||
1361 | #define WM8915_CP_DISCH_WIDTH 1 /* CP_DISCH */ | ||
1362 | |||
1363 | /* | ||
1364 | * R80 (0x50) - DC Servo (1) | ||
1365 | */ | ||
1366 | #define WM8915_DCS_ENA_CHAN_3 0x0008 /* DCS_ENA_CHAN_3 */ | ||
1367 | #define WM8915_DCS_ENA_CHAN_3_MASK 0x0008 /* DCS_ENA_CHAN_3 */ | ||
1368 | #define WM8915_DCS_ENA_CHAN_3_SHIFT 3 /* DCS_ENA_CHAN_3 */ | ||
1369 | #define WM8915_DCS_ENA_CHAN_3_WIDTH 1 /* DCS_ENA_CHAN_3 */ | ||
1370 | #define WM8915_DCS_ENA_CHAN_2 0x0004 /* DCS_ENA_CHAN_2 */ | ||
1371 | #define WM8915_DCS_ENA_CHAN_2_MASK 0x0004 /* DCS_ENA_CHAN_2 */ | ||
1372 | #define WM8915_DCS_ENA_CHAN_2_SHIFT 2 /* DCS_ENA_CHAN_2 */ | ||
1373 | #define WM8915_DCS_ENA_CHAN_2_WIDTH 1 /* DCS_ENA_CHAN_2 */ | ||
1374 | #define WM8915_DCS_ENA_CHAN_1 0x0002 /* DCS_ENA_CHAN_1 */ | ||
1375 | #define WM8915_DCS_ENA_CHAN_1_MASK 0x0002 /* DCS_ENA_CHAN_1 */ | ||
1376 | #define WM8915_DCS_ENA_CHAN_1_SHIFT 1 /* DCS_ENA_CHAN_1 */ | ||
1377 | #define WM8915_DCS_ENA_CHAN_1_WIDTH 1 /* DCS_ENA_CHAN_1 */ | ||
1378 | #define WM8915_DCS_ENA_CHAN_0 0x0001 /* DCS_ENA_CHAN_0 */ | ||
1379 | #define WM8915_DCS_ENA_CHAN_0_MASK 0x0001 /* DCS_ENA_CHAN_0 */ | ||
1380 | #define WM8915_DCS_ENA_CHAN_0_SHIFT 0 /* DCS_ENA_CHAN_0 */ | ||
1381 | #define WM8915_DCS_ENA_CHAN_0_WIDTH 1 /* DCS_ENA_CHAN_0 */ | ||
1382 | |||
1383 | /* | ||
1384 | * R81 (0x51) - DC Servo (2) | ||
1385 | */ | ||
1386 | #define WM8915_DCS_TRIG_SINGLE_3 0x8000 /* DCS_TRIG_SINGLE_3 */ | ||
1387 | #define WM8915_DCS_TRIG_SINGLE_3_MASK 0x8000 /* DCS_TRIG_SINGLE_3 */ | ||
1388 | #define WM8915_DCS_TRIG_SINGLE_3_SHIFT 15 /* DCS_TRIG_SINGLE_3 */ | ||
1389 | #define WM8915_DCS_TRIG_SINGLE_3_WIDTH 1 /* DCS_TRIG_SINGLE_3 */ | ||
1390 | #define WM8915_DCS_TRIG_SINGLE_2 0x4000 /* DCS_TRIG_SINGLE_2 */ | ||
1391 | #define WM8915_DCS_TRIG_SINGLE_2_MASK 0x4000 /* DCS_TRIG_SINGLE_2 */ | ||
1392 | #define WM8915_DCS_TRIG_SINGLE_2_SHIFT 14 /* DCS_TRIG_SINGLE_2 */ | ||
1393 | #define WM8915_DCS_TRIG_SINGLE_2_WIDTH 1 /* DCS_TRIG_SINGLE_2 */ | ||
1394 | #define WM8915_DCS_TRIG_SINGLE_1 0x2000 /* DCS_TRIG_SINGLE_1 */ | ||
1395 | #define WM8915_DCS_TRIG_SINGLE_1_MASK 0x2000 /* DCS_TRIG_SINGLE_1 */ | ||
1396 | #define WM8915_DCS_TRIG_SINGLE_1_SHIFT 13 /* DCS_TRIG_SINGLE_1 */ | ||
1397 | #define WM8915_DCS_TRIG_SINGLE_1_WIDTH 1 /* DCS_TRIG_SINGLE_1 */ | ||
1398 | #define WM8915_DCS_TRIG_SINGLE_0 0x1000 /* DCS_TRIG_SINGLE_0 */ | ||
1399 | #define WM8915_DCS_TRIG_SINGLE_0_MASK 0x1000 /* DCS_TRIG_SINGLE_0 */ | ||
1400 | #define WM8915_DCS_TRIG_SINGLE_0_SHIFT 12 /* DCS_TRIG_SINGLE_0 */ | ||
1401 | #define WM8915_DCS_TRIG_SINGLE_0_WIDTH 1 /* DCS_TRIG_SINGLE_0 */ | ||
1402 | #define WM8915_DCS_TRIG_SERIES_3 0x0800 /* DCS_TRIG_SERIES_3 */ | ||
1403 | #define WM8915_DCS_TRIG_SERIES_3_MASK 0x0800 /* DCS_TRIG_SERIES_3 */ | ||
1404 | #define WM8915_DCS_TRIG_SERIES_3_SHIFT 11 /* DCS_TRIG_SERIES_3 */ | ||
1405 | #define WM8915_DCS_TRIG_SERIES_3_WIDTH 1 /* DCS_TRIG_SERIES_3 */ | ||
1406 | #define WM8915_DCS_TRIG_SERIES_2 0x0400 /* DCS_TRIG_SERIES_2 */ | ||
1407 | #define WM8915_DCS_TRIG_SERIES_2_MASK 0x0400 /* DCS_TRIG_SERIES_2 */ | ||
1408 | #define WM8915_DCS_TRIG_SERIES_2_SHIFT 10 /* DCS_TRIG_SERIES_2 */ | ||
1409 | #define WM8915_DCS_TRIG_SERIES_2_WIDTH 1 /* DCS_TRIG_SERIES_2 */ | ||
1410 | #define WM8915_DCS_TRIG_SERIES_1 0x0200 /* DCS_TRIG_SERIES_1 */ | ||
1411 | #define WM8915_DCS_TRIG_SERIES_1_MASK 0x0200 /* DCS_TRIG_SERIES_1 */ | ||
1412 | #define WM8915_DCS_TRIG_SERIES_1_SHIFT 9 /* DCS_TRIG_SERIES_1 */ | ||
1413 | #define WM8915_DCS_TRIG_SERIES_1_WIDTH 1 /* DCS_TRIG_SERIES_1 */ | ||
1414 | #define WM8915_DCS_TRIG_SERIES_0 0x0100 /* DCS_TRIG_SERIES_0 */ | ||
1415 | #define WM8915_DCS_TRIG_SERIES_0_MASK 0x0100 /* DCS_TRIG_SERIES_0 */ | ||
1416 | #define WM8915_DCS_TRIG_SERIES_0_SHIFT 8 /* DCS_TRIG_SERIES_0 */ | ||
1417 | #define WM8915_DCS_TRIG_SERIES_0_WIDTH 1 /* DCS_TRIG_SERIES_0 */ | ||
1418 | #define WM8915_DCS_TRIG_STARTUP_3 0x0080 /* DCS_TRIG_STARTUP_3 */ | ||
1419 | #define WM8915_DCS_TRIG_STARTUP_3_MASK 0x0080 /* DCS_TRIG_STARTUP_3 */ | ||
1420 | #define WM8915_DCS_TRIG_STARTUP_3_SHIFT 7 /* DCS_TRIG_STARTUP_3 */ | ||
1421 | #define WM8915_DCS_TRIG_STARTUP_3_WIDTH 1 /* DCS_TRIG_STARTUP_3 */ | ||
1422 | #define WM8915_DCS_TRIG_STARTUP_2 0x0040 /* DCS_TRIG_STARTUP_2 */ | ||
1423 | #define WM8915_DCS_TRIG_STARTUP_2_MASK 0x0040 /* DCS_TRIG_STARTUP_2 */ | ||
1424 | #define WM8915_DCS_TRIG_STARTUP_2_SHIFT 6 /* DCS_TRIG_STARTUP_2 */ | ||
1425 | #define WM8915_DCS_TRIG_STARTUP_2_WIDTH 1 /* DCS_TRIG_STARTUP_2 */ | ||
1426 | #define WM8915_DCS_TRIG_STARTUP_1 0x0020 /* DCS_TRIG_STARTUP_1 */ | ||
1427 | #define WM8915_DCS_TRIG_STARTUP_1_MASK 0x0020 /* DCS_TRIG_STARTUP_1 */ | ||
1428 | #define WM8915_DCS_TRIG_STARTUP_1_SHIFT 5 /* DCS_TRIG_STARTUP_1 */ | ||
1429 | #define WM8915_DCS_TRIG_STARTUP_1_WIDTH 1 /* DCS_TRIG_STARTUP_1 */ | ||
1430 | #define WM8915_DCS_TRIG_STARTUP_0 0x0010 /* DCS_TRIG_STARTUP_0 */ | ||
1431 | #define WM8915_DCS_TRIG_STARTUP_0_MASK 0x0010 /* DCS_TRIG_STARTUP_0 */ | ||
1432 | #define WM8915_DCS_TRIG_STARTUP_0_SHIFT 4 /* DCS_TRIG_STARTUP_0 */ | ||
1433 | #define WM8915_DCS_TRIG_STARTUP_0_WIDTH 1 /* DCS_TRIG_STARTUP_0 */ | ||
1434 | #define WM8915_DCS_TRIG_DAC_WR_3 0x0008 /* DCS_TRIG_DAC_WR_3 */ | ||
1435 | #define WM8915_DCS_TRIG_DAC_WR_3_MASK 0x0008 /* DCS_TRIG_DAC_WR_3 */ | ||
1436 | #define WM8915_DCS_TRIG_DAC_WR_3_SHIFT 3 /* DCS_TRIG_DAC_WR_3 */ | ||
1437 | #define WM8915_DCS_TRIG_DAC_WR_3_WIDTH 1 /* DCS_TRIG_DAC_WR_3 */ | ||
1438 | #define WM8915_DCS_TRIG_DAC_WR_2 0x0004 /* DCS_TRIG_DAC_WR_2 */ | ||
1439 | #define WM8915_DCS_TRIG_DAC_WR_2_MASK 0x0004 /* DCS_TRIG_DAC_WR_2 */ | ||
1440 | #define WM8915_DCS_TRIG_DAC_WR_2_SHIFT 2 /* DCS_TRIG_DAC_WR_2 */ | ||
1441 | #define WM8915_DCS_TRIG_DAC_WR_2_WIDTH 1 /* DCS_TRIG_DAC_WR_2 */ | ||
1442 | #define WM8915_DCS_TRIG_DAC_WR_1 0x0002 /* DCS_TRIG_DAC_WR_1 */ | ||
1443 | #define WM8915_DCS_TRIG_DAC_WR_1_MASK 0x0002 /* DCS_TRIG_DAC_WR_1 */ | ||
1444 | #define WM8915_DCS_TRIG_DAC_WR_1_SHIFT 1 /* DCS_TRIG_DAC_WR_1 */ | ||
1445 | #define WM8915_DCS_TRIG_DAC_WR_1_WIDTH 1 /* DCS_TRIG_DAC_WR_1 */ | ||
1446 | #define WM8915_DCS_TRIG_DAC_WR_0 0x0001 /* DCS_TRIG_DAC_WR_0 */ | ||
1447 | #define WM8915_DCS_TRIG_DAC_WR_0_MASK 0x0001 /* DCS_TRIG_DAC_WR_0 */ | ||
1448 | #define WM8915_DCS_TRIG_DAC_WR_0_SHIFT 0 /* DCS_TRIG_DAC_WR_0 */ | ||
1449 | #define WM8915_DCS_TRIG_DAC_WR_0_WIDTH 1 /* DCS_TRIG_DAC_WR_0 */ | ||
1450 | |||
1451 | /* | ||
1452 | * R82 (0x52) - DC Servo (3) | ||
1453 | */ | ||
1454 | #define WM8915_DCS_TIMER_PERIOD_23_MASK 0x0F00 /* DCS_TIMER_PERIOD_23 - [11:8] */ | ||
1455 | #define WM8915_DCS_TIMER_PERIOD_23_SHIFT 8 /* DCS_TIMER_PERIOD_23 - [11:8] */ | ||
1456 | #define WM8915_DCS_TIMER_PERIOD_23_WIDTH 4 /* DCS_TIMER_PERIOD_23 - [11:8] */ | ||
1457 | #define WM8915_DCS_TIMER_PERIOD_01_MASK 0x000F /* DCS_TIMER_PERIOD_01 - [3:0] */ | ||
1458 | #define WM8915_DCS_TIMER_PERIOD_01_SHIFT 0 /* DCS_TIMER_PERIOD_01 - [3:0] */ | ||
1459 | #define WM8915_DCS_TIMER_PERIOD_01_WIDTH 4 /* DCS_TIMER_PERIOD_01 - [3:0] */ | ||
1460 | |||
1461 | /* | ||
1462 | * R84 (0x54) - DC Servo (5) | ||
1463 | */ | ||
1464 | #define WM8915_DCS_SERIES_NO_23_MASK 0x7F00 /* DCS_SERIES_NO_23 - [14:8] */ | ||
1465 | #define WM8915_DCS_SERIES_NO_23_SHIFT 8 /* DCS_SERIES_NO_23 - [14:8] */ | ||
1466 | #define WM8915_DCS_SERIES_NO_23_WIDTH 7 /* DCS_SERIES_NO_23 - [14:8] */ | ||
1467 | #define WM8915_DCS_SERIES_NO_01_MASK 0x007F /* DCS_SERIES_NO_01 - [6:0] */ | ||
1468 | #define WM8915_DCS_SERIES_NO_01_SHIFT 0 /* DCS_SERIES_NO_01 - [6:0] */ | ||
1469 | #define WM8915_DCS_SERIES_NO_01_WIDTH 7 /* DCS_SERIES_NO_01 - [6:0] */ | ||
1470 | |||
1471 | /* | ||
1472 | * R85 (0x55) - DC Servo (6) | ||
1473 | */ | ||
1474 | #define WM8915_DCS_DAC_WR_VAL_3_MASK 0xFF00 /* DCS_DAC_WR_VAL_3 - [15:8] */ | ||
1475 | #define WM8915_DCS_DAC_WR_VAL_3_SHIFT 8 /* DCS_DAC_WR_VAL_3 - [15:8] */ | ||
1476 | #define WM8915_DCS_DAC_WR_VAL_3_WIDTH 8 /* DCS_DAC_WR_VAL_3 - [15:8] */ | ||
1477 | #define WM8915_DCS_DAC_WR_VAL_2_MASK 0x00FF /* DCS_DAC_WR_VAL_2 - [7:0] */ | ||
1478 | #define WM8915_DCS_DAC_WR_VAL_2_SHIFT 0 /* DCS_DAC_WR_VAL_2 - [7:0] */ | ||
1479 | #define WM8915_DCS_DAC_WR_VAL_2_WIDTH 8 /* DCS_DAC_WR_VAL_2 - [7:0] */ | ||
1480 | |||
1481 | /* | ||
1482 | * R86 (0x56) - DC Servo (7) | ||
1483 | */ | ||
1484 | #define WM8915_DCS_DAC_WR_VAL_1_MASK 0xFF00 /* DCS_DAC_WR_VAL_1 - [15:8] */ | ||
1485 | #define WM8915_DCS_DAC_WR_VAL_1_SHIFT 8 /* DCS_DAC_WR_VAL_1 - [15:8] */ | ||
1486 | #define WM8915_DCS_DAC_WR_VAL_1_WIDTH 8 /* DCS_DAC_WR_VAL_1 - [15:8] */ | ||
1487 | #define WM8915_DCS_DAC_WR_VAL_0_MASK 0x00FF /* DCS_DAC_WR_VAL_0 - [7:0] */ | ||
1488 | #define WM8915_DCS_DAC_WR_VAL_0_SHIFT 0 /* DCS_DAC_WR_VAL_0 - [7:0] */ | ||
1489 | #define WM8915_DCS_DAC_WR_VAL_0_WIDTH 8 /* DCS_DAC_WR_VAL_0 - [7:0] */ | ||
1490 | |||
1491 | /* | ||
1492 | * R87 (0x57) - DC Servo Readback 0 | ||
1493 | */ | ||
1494 | #define WM8915_DCS_CAL_COMPLETE_MASK 0x0F00 /* DCS_CAL_COMPLETE - [11:8] */ | ||
1495 | #define WM8915_DCS_CAL_COMPLETE_SHIFT 8 /* DCS_CAL_COMPLETE - [11:8] */ | ||
1496 | #define WM8915_DCS_CAL_COMPLETE_WIDTH 4 /* DCS_CAL_COMPLETE - [11:8] */ | ||
1497 | #define WM8915_DCS_DAC_WR_COMPLETE_MASK 0x00F0 /* DCS_DAC_WR_COMPLETE - [7:4] */ | ||
1498 | #define WM8915_DCS_DAC_WR_COMPLETE_SHIFT 4 /* DCS_DAC_WR_COMPLETE - [7:4] */ | ||
1499 | #define WM8915_DCS_DAC_WR_COMPLETE_WIDTH 4 /* DCS_DAC_WR_COMPLETE - [7:4] */ | ||
1500 | #define WM8915_DCS_STARTUP_COMPLETE_MASK 0x000F /* DCS_STARTUP_COMPLETE - [3:0] */ | ||
1501 | #define WM8915_DCS_STARTUP_COMPLETE_SHIFT 0 /* DCS_STARTUP_COMPLETE - [3:0] */ | ||
1502 | #define WM8915_DCS_STARTUP_COMPLETE_WIDTH 4 /* DCS_STARTUP_COMPLETE - [3:0] */ | ||
1503 | |||
1504 | /* | ||
1505 | * R96 (0x60) - Analogue HP (1) | ||
1506 | */ | ||
1507 | #define WM8915_HPOUT1L_RMV_SHORT 0x0080 /* HPOUT1L_RMV_SHORT */ | ||
1508 | #define WM8915_HPOUT1L_RMV_SHORT_MASK 0x0080 /* HPOUT1L_RMV_SHORT */ | ||
1509 | #define WM8915_HPOUT1L_RMV_SHORT_SHIFT 7 /* HPOUT1L_RMV_SHORT */ | ||
1510 | #define WM8915_HPOUT1L_RMV_SHORT_WIDTH 1 /* HPOUT1L_RMV_SHORT */ | ||
1511 | #define WM8915_HPOUT1L_OUTP 0x0040 /* HPOUT1L_OUTP */ | ||
1512 | #define WM8915_HPOUT1L_OUTP_MASK 0x0040 /* HPOUT1L_OUTP */ | ||
1513 | #define WM8915_HPOUT1L_OUTP_SHIFT 6 /* HPOUT1L_OUTP */ | ||
1514 | #define WM8915_HPOUT1L_OUTP_WIDTH 1 /* HPOUT1L_OUTP */ | ||
1515 | #define WM8915_HPOUT1L_DLY 0x0020 /* HPOUT1L_DLY */ | ||
1516 | #define WM8915_HPOUT1L_DLY_MASK 0x0020 /* HPOUT1L_DLY */ | ||
1517 | #define WM8915_HPOUT1L_DLY_SHIFT 5 /* HPOUT1L_DLY */ | ||
1518 | #define WM8915_HPOUT1L_DLY_WIDTH 1 /* HPOUT1L_DLY */ | ||
1519 | #define WM8915_HPOUT1R_RMV_SHORT 0x0008 /* HPOUT1R_RMV_SHORT */ | ||
1520 | #define WM8915_HPOUT1R_RMV_SHORT_MASK 0x0008 /* HPOUT1R_RMV_SHORT */ | ||
1521 | #define WM8915_HPOUT1R_RMV_SHORT_SHIFT 3 /* HPOUT1R_RMV_SHORT */ | ||
1522 | #define WM8915_HPOUT1R_RMV_SHORT_WIDTH 1 /* HPOUT1R_RMV_SHORT */ | ||
1523 | #define WM8915_HPOUT1R_OUTP 0x0004 /* HPOUT1R_OUTP */ | ||
1524 | #define WM8915_HPOUT1R_OUTP_MASK 0x0004 /* HPOUT1R_OUTP */ | ||
1525 | #define WM8915_HPOUT1R_OUTP_SHIFT 2 /* HPOUT1R_OUTP */ | ||
1526 | #define WM8915_HPOUT1R_OUTP_WIDTH 1 /* HPOUT1R_OUTP */ | ||
1527 | #define WM8915_HPOUT1R_DLY 0x0002 /* HPOUT1R_DLY */ | ||
1528 | #define WM8915_HPOUT1R_DLY_MASK 0x0002 /* HPOUT1R_DLY */ | ||
1529 | #define WM8915_HPOUT1R_DLY_SHIFT 1 /* HPOUT1R_DLY */ | ||
1530 | #define WM8915_HPOUT1R_DLY_WIDTH 1 /* HPOUT1R_DLY */ | ||
1531 | |||
1532 | /* | ||
1533 | * R97 (0x61) - Analogue HP (2) | ||
1534 | */ | ||
1535 | #define WM8915_HPOUT2L_RMV_SHORT 0x0080 /* HPOUT2L_RMV_SHORT */ | ||
1536 | #define WM8915_HPOUT2L_RMV_SHORT_MASK 0x0080 /* HPOUT2L_RMV_SHORT */ | ||
1537 | #define WM8915_HPOUT2L_RMV_SHORT_SHIFT 7 /* HPOUT2L_RMV_SHORT */ | ||
1538 | #define WM8915_HPOUT2L_RMV_SHORT_WIDTH 1 /* HPOUT2L_RMV_SHORT */ | ||
1539 | #define WM8915_HPOUT2L_OUTP 0x0040 /* HPOUT2L_OUTP */ | ||
1540 | #define WM8915_HPOUT2L_OUTP_MASK 0x0040 /* HPOUT2L_OUTP */ | ||
1541 | #define WM8915_HPOUT2L_OUTP_SHIFT 6 /* HPOUT2L_OUTP */ | ||
1542 | #define WM8915_HPOUT2L_OUTP_WIDTH 1 /* HPOUT2L_OUTP */ | ||
1543 | #define WM8915_HPOUT2L_DLY 0x0020 /* HPOUT2L_DLY */ | ||
1544 | #define WM8915_HPOUT2L_DLY_MASK 0x0020 /* HPOUT2L_DLY */ | ||
1545 | #define WM8915_HPOUT2L_DLY_SHIFT 5 /* HPOUT2L_DLY */ | ||
1546 | #define WM8915_HPOUT2L_DLY_WIDTH 1 /* HPOUT2L_DLY */ | ||
1547 | #define WM8915_HPOUT2R_RMV_SHORT 0x0008 /* HPOUT2R_RMV_SHORT */ | ||
1548 | #define WM8915_HPOUT2R_RMV_SHORT_MASK 0x0008 /* HPOUT2R_RMV_SHORT */ | ||
1549 | #define WM8915_HPOUT2R_RMV_SHORT_SHIFT 3 /* HPOUT2R_RMV_SHORT */ | ||
1550 | #define WM8915_HPOUT2R_RMV_SHORT_WIDTH 1 /* HPOUT2R_RMV_SHORT */ | ||
1551 | #define WM8915_HPOUT2R_OUTP 0x0004 /* HPOUT2R_OUTP */ | ||
1552 | #define WM8915_HPOUT2R_OUTP_MASK 0x0004 /* HPOUT2R_OUTP */ | ||
1553 | #define WM8915_HPOUT2R_OUTP_SHIFT 2 /* HPOUT2R_OUTP */ | ||
1554 | #define WM8915_HPOUT2R_OUTP_WIDTH 1 /* HPOUT2R_OUTP */ | ||
1555 | #define WM8915_HPOUT2R_DLY 0x0002 /* HPOUT2R_DLY */ | ||
1556 | #define WM8915_HPOUT2R_DLY_MASK 0x0002 /* HPOUT2R_DLY */ | ||
1557 | #define WM8915_HPOUT2R_DLY_SHIFT 1 /* HPOUT2R_DLY */ | ||
1558 | #define WM8915_HPOUT2R_DLY_WIDTH 1 /* HPOUT2R_DLY */ | ||
1559 | |||
1560 | /* | ||
1561 | * R256 (0x100) - Chip Revision | ||
1562 | */ | ||
1563 | #define WM8915_CHIP_REV_MASK 0x000F /* CHIP_REV - [3:0] */ | ||
1564 | #define WM8915_CHIP_REV_SHIFT 0 /* CHIP_REV - [3:0] */ | ||
1565 | #define WM8915_CHIP_REV_WIDTH 4 /* CHIP_REV - [3:0] */ | ||
1566 | |||
1567 | /* | ||
1568 | * R257 (0x101) - Control Interface (1) | ||
1569 | */ | ||
1570 | #define WM8915_AUTO_INC 0x0004 /* AUTO_INC */ | ||
1571 | #define WM8915_AUTO_INC_MASK 0x0004 /* AUTO_INC */ | ||
1572 | #define WM8915_AUTO_INC_SHIFT 2 /* AUTO_INC */ | ||
1573 | #define WM8915_AUTO_INC_WIDTH 1 /* AUTO_INC */ | ||
1574 | |||
1575 | /* | ||
1576 | * R272 (0x110) - Write Sequencer Ctrl (1) | ||
1577 | */ | ||
1578 | #define WM8915_WSEQ_ENA 0x8000 /* WSEQ_ENA */ | ||
1579 | #define WM8915_WSEQ_ENA_MASK 0x8000 /* WSEQ_ENA */ | ||
1580 | #define WM8915_WSEQ_ENA_SHIFT 15 /* WSEQ_ENA */ | ||
1581 | #define WM8915_WSEQ_ENA_WIDTH 1 /* WSEQ_ENA */ | ||
1582 | #define WM8915_WSEQ_ABORT 0x0200 /* WSEQ_ABORT */ | ||
1583 | #define WM8915_WSEQ_ABORT_MASK 0x0200 /* WSEQ_ABORT */ | ||
1584 | #define WM8915_WSEQ_ABORT_SHIFT 9 /* WSEQ_ABORT */ | ||
1585 | #define WM8915_WSEQ_ABORT_WIDTH 1 /* WSEQ_ABORT */ | ||
1586 | #define WM8915_WSEQ_START 0x0100 /* WSEQ_START */ | ||
1587 | #define WM8915_WSEQ_START_MASK 0x0100 /* WSEQ_START */ | ||
1588 | #define WM8915_WSEQ_START_SHIFT 8 /* WSEQ_START */ | ||
1589 | #define WM8915_WSEQ_START_WIDTH 1 /* WSEQ_START */ | ||
1590 | #define WM8915_WSEQ_START_INDEX_MASK 0x007F /* WSEQ_START_INDEX - [6:0] */ | ||
1591 | #define WM8915_WSEQ_START_INDEX_SHIFT 0 /* WSEQ_START_INDEX - [6:0] */ | ||
1592 | #define WM8915_WSEQ_START_INDEX_WIDTH 7 /* WSEQ_START_INDEX - [6:0] */ | ||
1593 | |||
1594 | /* | ||
1595 | * R273 (0x111) - Write Sequencer Ctrl (2) | ||
1596 | */ | ||
1597 | #define WM8915_WSEQ_BUSY 0x0100 /* WSEQ_BUSY */ | ||
1598 | #define WM8915_WSEQ_BUSY_MASK 0x0100 /* WSEQ_BUSY */ | ||
1599 | #define WM8915_WSEQ_BUSY_SHIFT 8 /* WSEQ_BUSY */ | ||
1600 | #define WM8915_WSEQ_BUSY_WIDTH 1 /* WSEQ_BUSY */ | ||
1601 | #define WM8915_WSEQ_CURRENT_INDEX_MASK 0x007F /* WSEQ_CURRENT_INDEX - [6:0] */ | ||
1602 | #define WM8915_WSEQ_CURRENT_INDEX_SHIFT 0 /* WSEQ_CURRENT_INDEX - [6:0] */ | ||
1603 | #define WM8915_WSEQ_CURRENT_INDEX_WIDTH 7 /* WSEQ_CURRENT_INDEX - [6:0] */ | ||
1604 | |||
1605 | /* | ||
1606 | * R512 (0x200) - AIF Clocking (1) | ||
1607 | */ | ||
1608 | #define WM8915_SYSCLK_SRC_MASK 0x0018 /* SYSCLK_SRC - [4:3] */ | ||
1609 | #define WM8915_SYSCLK_SRC_SHIFT 3 /* SYSCLK_SRC - [4:3] */ | ||
1610 | #define WM8915_SYSCLK_SRC_WIDTH 2 /* SYSCLK_SRC - [4:3] */ | ||
1611 | #define WM8915_SYSCLK_INV 0x0004 /* SYSCLK_INV */ | ||
1612 | #define WM8915_SYSCLK_INV_MASK 0x0004 /* SYSCLK_INV */ | ||
1613 | #define WM8915_SYSCLK_INV_SHIFT 2 /* SYSCLK_INV */ | ||
1614 | #define WM8915_SYSCLK_INV_WIDTH 1 /* SYSCLK_INV */ | ||
1615 | #define WM8915_SYSCLK_DIV 0x0002 /* SYSCLK_DIV */ | ||
1616 | #define WM8915_SYSCLK_DIV_MASK 0x0002 /* SYSCLK_DIV */ | ||
1617 | #define WM8915_SYSCLK_DIV_SHIFT 1 /* SYSCLK_DIV */ | ||
1618 | #define WM8915_SYSCLK_DIV_WIDTH 1 /* SYSCLK_DIV */ | ||
1619 | #define WM8915_SYSCLK_ENA 0x0001 /* SYSCLK_ENA */ | ||
1620 | #define WM8915_SYSCLK_ENA_MASK 0x0001 /* SYSCLK_ENA */ | ||
1621 | #define WM8915_SYSCLK_ENA_SHIFT 0 /* SYSCLK_ENA */ | ||
1622 | #define WM8915_SYSCLK_ENA_WIDTH 1 /* SYSCLK_ENA */ | ||
1623 | |||
1624 | /* | ||
1625 | * R513 (0x201) - AIF Clocking (2) | ||
1626 | */ | ||
1627 | #define WM8915_DSP2_DIV_MASK 0x0018 /* DSP2_DIV - [4:3] */ | ||
1628 | #define WM8915_DSP2_DIV_SHIFT 3 /* DSP2_DIV - [4:3] */ | ||
1629 | #define WM8915_DSP2_DIV_WIDTH 2 /* DSP2_DIV - [4:3] */ | ||
1630 | #define WM8915_DSP1_DIV_MASK 0x0003 /* DSP1_DIV - [1:0] */ | ||
1631 | #define WM8915_DSP1_DIV_SHIFT 0 /* DSP1_DIV - [1:0] */ | ||
1632 | #define WM8915_DSP1_DIV_WIDTH 2 /* DSP1_DIV - [1:0] */ | ||
1633 | |||
1634 | /* | ||
1635 | * R520 (0x208) - Clocking (1) | ||
1636 | */ | ||
1637 | #define WM8915_LFCLK_ENA 0x0020 /* LFCLK_ENA */ | ||
1638 | #define WM8915_LFCLK_ENA_MASK 0x0020 /* LFCLK_ENA */ | ||
1639 | #define WM8915_LFCLK_ENA_SHIFT 5 /* LFCLK_ENA */ | ||
1640 | #define WM8915_LFCLK_ENA_WIDTH 1 /* LFCLK_ENA */ | ||
1641 | #define WM8915_TOCLK_ENA 0x0010 /* TOCLK_ENA */ | ||
1642 | #define WM8915_TOCLK_ENA_MASK 0x0010 /* TOCLK_ENA */ | ||
1643 | #define WM8915_TOCLK_ENA_SHIFT 4 /* TOCLK_ENA */ | ||
1644 | #define WM8915_TOCLK_ENA_WIDTH 1 /* TOCLK_ENA */ | ||
1645 | #define WM8915_AIFCLK_ENA 0x0004 /* AIFCLK_ENA */ | ||
1646 | #define WM8915_AIFCLK_ENA_MASK 0x0004 /* AIFCLK_ENA */ | ||
1647 | #define WM8915_AIFCLK_ENA_SHIFT 2 /* AIFCLK_ENA */ | ||
1648 | #define WM8915_AIFCLK_ENA_WIDTH 1 /* AIFCLK_ENA */ | ||
1649 | #define WM8915_SYSDSPCLK_ENA 0x0002 /* SYSDSPCLK_ENA */ | ||
1650 | #define WM8915_SYSDSPCLK_ENA_MASK 0x0002 /* SYSDSPCLK_ENA */ | ||
1651 | #define WM8915_SYSDSPCLK_ENA_SHIFT 1 /* SYSDSPCLK_ENA */ | ||
1652 | #define WM8915_SYSDSPCLK_ENA_WIDTH 1 /* SYSDSPCLK_ENA */ | ||
1653 | |||
1654 | /* | ||
1655 | * R521 (0x209) - Clocking (2) | ||
1656 | */ | ||
1657 | #define WM8915_TOCLK_DIV_MASK 0x0700 /* TOCLK_DIV - [10:8] */ | ||
1658 | #define WM8915_TOCLK_DIV_SHIFT 8 /* TOCLK_DIV - [10:8] */ | ||
1659 | #define WM8915_TOCLK_DIV_WIDTH 3 /* TOCLK_DIV - [10:8] */ | ||
1660 | #define WM8915_DBCLK_DIV_MASK 0x00F0 /* DBCLK_DIV - [7:4] */ | ||
1661 | #define WM8915_DBCLK_DIV_SHIFT 4 /* DBCLK_DIV - [7:4] */ | ||
1662 | #define WM8915_DBCLK_DIV_WIDTH 4 /* DBCLK_DIV - [7:4] */ | ||
1663 | #define WM8915_OPCLK_DIV_MASK 0x0007 /* OPCLK_DIV - [2:0] */ | ||
1664 | #define WM8915_OPCLK_DIV_SHIFT 0 /* OPCLK_DIV - [2:0] */ | ||
1665 | #define WM8915_OPCLK_DIV_WIDTH 3 /* OPCLK_DIV - [2:0] */ | ||
1666 | |||
1667 | /* | ||
1668 | * R528 (0x210) - AIF Rate | ||
1669 | */ | ||
1670 | #define WM8915_SYSCLK_RATE 0x0001 /* SYSCLK_RATE */ | ||
1671 | #define WM8915_SYSCLK_RATE_MASK 0x0001 /* SYSCLK_RATE */ | ||
1672 | #define WM8915_SYSCLK_RATE_SHIFT 0 /* SYSCLK_RATE */ | ||
1673 | #define WM8915_SYSCLK_RATE_WIDTH 1 /* SYSCLK_RATE */ | ||
1674 | |||
1675 | /* | ||
1676 | * R544 (0x220) - FLL Control (1) | ||
1677 | */ | ||
1678 | #define WM8915_FLL_OSC_ENA 0x0002 /* FLL_OSC_ENA */ | ||
1679 | #define WM8915_FLL_OSC_ENA_MASK 0x0002 /* FLL_OSC_ENA */ | ||
1680 | #define WM8915_FLL_OSC_ENA_SHIFT 1 /* FLL_OSC_ENA */ | ||
1681 | #define WM8915_FLL_OSC_ENA_WIDTH 1 /* FLL_OSC_ENA */ | ||
1682 | #define WM8915_FLL_ENA 0x0001 /* FLL_ENA */ | ||
1683 | #define WM8915_FLL_ENA_MASK 0x0001 /* FLL_ENA */ | ||
1684 | #define WM8915_FLL_ENA_SHIFT 0 /* FLL_ENA */ | ||
1685 | #define WM8915_FLL_ENA_WIDTH 1 /* FLL_ENA */ | ||
1686 | |||
1687 | /* | ||
1688 | * R545 (0x221) - FLL Control (2) | ||
1689 | */ | ||
1690 | #define WM8915_FLL_OUTDIV_MASK 0x3F00 /* FLL_OUTDIV - [13:8] */ | ||
1691 | #define WM8915_FLL_OUTDIV_SHIFT 8 /* FLL_OUTDIV - [13:8] */ | ||
1692 | #define WM8915_FLL_OUTDIV_WIDTH 6 /* FLL_OUTDIV - [13:8] */ | ||
1693 | #define WM8915_FLL_FRATIO_MASK 0x0007 /* FLL_FRATIO - [2:0] */ | ||
1694 | #define WM8915_FLL_FRATIO_SHIFT 0 /* FLL_FRATIO - [2:0] */ | ||
1695 | #define WM8915_FLL_FRATIO_WIDTH 3 /* FLL_FRATIO - [2:0] */ | ||
1696 | |||
1697 | /* | ||
1698 | * R546 (0x222) - FLL Control (3) | ||
1699 | */ | ||
1700 | #define WM8915_FLL_THETA_MASK 0xFFFF /* FLL_THETA - [15:0] */ | ||
1701 | #define WM8915_FLL_THETA_SHIFT 0 /* FLL_THETA - [15:0] */ | ||
1702 | #define WM8915_FLL_THETA_WIDTH 16 /* FLL_THETA - [15:0] */ | ||
1703 | |||
1704 | /* | ||
1705 | * R547 (0x223) - FLL Control (4) | ||
1706 | */ | ||
1707 | #define WM8915_FLL_N_MASK 0x7FE0 /* FLL_N - [14:5] */ | ||
1708 | #define WM8915_FLL_N_SHIFT 5 /* FLL_N - [14:5] */ | ||
1709 | #define WM8915_FLL_N_WIDTH 10 /* FLL_N - [14:5] */ | ||
1710 | #define WM8915_FLL_LOOP_GAIN_MASK 0x000F /* FLL_LOOP_GAIN - [3:0] */ | ||
1711 | #define WM8915_FLL_LOOP_GAIN_SHIFT 0 /* FLL_LOOP_GAIN - [3:0] */ | ||
1712 | #define WM8915_FLL_LOOP_GAIN_WIDTH 4 /* FLL_LOOP_GAIN - [3:0] */ | ||
1713 | |||
1714 | /* | ||
1715 | * R548 (0x224) - FLL Control (5) | ||
1716 | */ | ||
1717 | #define WM8915_FLL_FRC_NCO_VAL_MASK 0x1F80 /* FLL_FRC_NCO_VAL - [12:7] */ | ||
1718 | #define WM8915_FLL_FRC_NCO_VAL_SHIFT 7 /* FLL_FRC_NCO_VAL - [12:7] */ | ||
1719 | #define WM8915_FLL_FRC_NCO_VAL_WIDTH 6 /* FLL_FRC_NCO_VAL - [12:7] */ | ||
1720 | #define WM8915_FLL_FRC_NCO 0x0040 /* FLL_FRC_NCO */ | ||
1721 | #define WM8915_FLL_FRC_NCO_MASK 0x0040 /* FLL_FRC_NCO */ | ||
1722 | #define WM8915_FLL_FRC_NCO_SHIFT 6 /* FLL_FRC_NCO */ | ||
1723 | #define WM8915_FLL_FRC_NCO_WIDTH 1 /* FLL_FRC_NCO */ | ||
1724 | #define WM8915_FLL_REFCLK_DIV_MASK 0x0018 /* FLL_REFCLK_DIV - [4:3] */ | ||
1725 | #define WM8915_FLL_REFCLK_DIV_SHIFT 3 /* FLL_REFCLK_DIV - [4:3] */ | ||
1726 | #define WM8915_FLL_REFCLK_DIV_WIDTH 2 /* FLL_REFCLK_DIV - [4:3] */ | ||
1727 | #define WM8915_FLL_REF_FREQ 0x0004 /* FLL_REF_FREQ */ | ||
1728 | #define WM8915_FLL_REF_FREQ_MASK 0x0004 /* FLL_REF_FREQ */ | ||
1729 | #define WM8915_FLL_REF_FREQ_SHIFT 2 /* FLL_REF_FREQ */ | ||
1730 | #define WM8915_FLL_REF_FREQ_WIDTH 1 /* FLL_REF_FREQ */ | ||
1731 | #define WM8915_FLL_REFCLK_SRC_MASK 0x0003 /* FLL_REFCLK_SRC - [1:0] */ | ||
1732 | #define WM8915_FLL_REFCLK_SRC_SHIFT 0 /* FLL_REFCLK_SRC - [1:0] */ | ||
1733 | #define WM8915_FLL_REFCLK_SRC_WIDTH 2 /* FLL_REFCLK_SRC - [1:0] */ | ||
1734 | |||
1735 | /* | ||
1736 | * R549 (0x225) - FLL Control (6) | ||
1737 | */ | ||
1738 | #define WM8915_FLL_REFCLK_SRC_STS_MASK 0x000C /* FLL_REFCLK_SRC_STS - [3:2] */ | ||
1739 | #define WM8915_FLL_REFCLK_SRC_STS_SHIFT 2 /* FLL_REFCLK_SRC_STS - [3:2] */ | ||
1740 | #define WM8915_FLL_REFCLK_SRC_STS_WIDTH 2 /* FLL_REFCLK_SRC_STS - [3:2] */ | ||
1741 | #define WM8915_FLL_SWITCH_CLK 0x0001 /* FLL_SWITCH_CLK */ | ||
1742 | #define WM8915_FLL_SWITCH_CLK_MASK 0x0001 /* FLL_SWITCH_CLK */ | ||
1743 | #define WM8915_FLL_SWITCH_CLK_SHIFT 0 /* FLL_SWITCH_CLK */ | ||
1744 | #define WM8915_FLL_SWITCH_CLK_WIDTH 1 /* FLL_SWITCH_CLK */ | ||
1745 | |||
1746 | /* | ||
1747 | * R550 (0x226) - FLL EFS 1 | ||
1748 | */ | ||
1749 | #define WM8915_FLL_LAMBDA_MASK 0xFFFF /* FLL_LAMBDA - [15:0] */ | ||
1750 | #define WM8915_FLL_LAMBDA_SHIFT 0 /* FLL_LAMBDA - [15:0] */ | ||
1751 | #define WM8915_FLL_LAMBDA_WIDTH 16 /* FLL_LAMBDA - [15:0] */ | ||
1752 | |||
1753 | /* | ||
1754 | * R551 (0x227) - FLL EFS 2 | ||
1755 | */ | ||
1756 | #define WM8915_FLL_LFSR_SEL_MASK 0x0006 /* FLL_LFSR_SEL - [2:1] */ | ||
1757 | #define WM8915_FLL_LFSR_SEL_SHIFT 1 /* FLL_LFSR_SEL - [2:1] */ | ||
1758 | #define WM8915_FLL_LFSR_SEL_WIDTH 2 /* FLL_LFSR_SEL - [2:1] */ | ||
1759 | #define WM8915_FLL_EFS_ENA 0x0001 /* FLL_EFS_ENA */ | ||
1760 | #define WM8915_FLL_EFS_ENA_MASK 0x0001 /* FLL_EFS_ENA */ | ||
1761 | #define WM8915_FLL_EFS_ENA_SHIFT 0 /* FLL_EFS_ENA */ | ||
1762 | #define WM8915_FLL_EFS_ENA_WIDTH 1 /* FLL_EFS_ENA */ | ||
1763 | |||
1764 | /* | ||
1765 | * R768 (0x300) - AIF1 Control | ||
1766 | */ | ||
1767 | #define WM8915_AIF1_TRI 0x0004 /* AIF1_TRI */ | ||
1768 | #define WM8915_AIF1_TRI_MASK 0x0004 /* AIF1_TRI */ | ||
1769 | #define WM8915_AIF1_TRI_SHIFT 2 /* AIF1_TRI */ | ||
1770 | #define WM8915_AIF1_TRI_WIDTH 1 /* AIF1_TRI */ | ||
1771 | #define WM8915_AIF1_FMT_MASK 0x0003 /* AIF1_FMT - [1:0] */ | ||
1772 | #define WM8915_AIF1_FMT_SHIFT 0 /* AIF1_FMT - [1:0] */ | ||
1773 | #define WM8915_AIF1_FMT_WIDTH 2 /* AIF1_FMT - [1:0] */ | ||
1774 | |||
1775 | /* | ||
1776 | * R769 (0x301) - AIF1 BCLK | ||
1777 | */ | ||
1778 | #define WM8915_AIF1_BCLK_INV 0x0400 /* AIF1_BCLK_INV */ | ||
1779 | #define WM8915_AIF1_BCLK_INV_MASK 0x0400 /* AIF1_BCLK_INV */ | ||
1780 | #define WM8915_AIF1_BCLK_INV_SHIFT 10 /* AIF1_BCLK_INV */ | ||
1781 | #define WM8915_AIF1_BCLK_INV_WIDTH 1 /* AIF1_BCLK_INV */ | ||
1782 | #define WM8915_AIF1_BCLK_FRC 0x0200 /* AIF1_BCLK_FRC */ | ||
1783 | #define WM8915_AIF1_BCLK_FRC_MASK 0x0200 /* AIF1_BCLK_FRC */ | ||
1784 | #define WM8915_AIF1_BCLK_FRC_SHIFT 9 /* AIF1_BCLK_FRC */ | ||
1785 | #define WM8915_AIF1_BCLK_FRC_WIDTH 1 /* AIF1_BCLK_FRC */ | ||
1786 | #define WM8915_AIF1_BCLK_MSTR 0x0100 /* AIF1_BCLK_MSTR */ | ||
1787 | #define WM8915_AIF1_BCLK_MSTR_MASK 0x0100 /* AIF1_BCLK_MSTR */ | ||
1788 | #define WM8915_AIF1_BCLK_MSTR_SHIFT 8 /* AIF1_BCLK_MSTR */ | ||
1789 | #define WM8915_AIF1_BCLK_MSTR_WIDTH 1 /* AIF1_BCLK_MSTR */ | ||
1790 | #define WM8915_AIF1_BCLK_DIV_MASK 0x000F /* AIF1_BCLK_DIV - [3:0] */ | ||
1791 | #define WM8915_AIF1_BCLK_DIV_SHIFT 0 /* AIF1_BCLK_DIV - [3:0] */ | ||
1792 | #define WM8915_AIF1_BCLK_DIV_WIDTH 4 /* AIF1_BCLK_DIV - [3:0] */ | ||
1793 | |||
1794 | /* | ||
1795 | * R770 (0x302) - AIF1 TX LRCLK(1) | ||
1796 | */ | ||
1797 | #define WM8915_AIF1TX_RATE_MASK 0x07FF /* AIF1TX_RATE - [10:0] */ | ||
1798 | #define WM8915_AIF1TX_RATE_SHIFT 0 /* AIF1TX_RATE - [10:0] */ | ||
1799 | #define WM8915_AIF1TX_RATE_WIDTH 11 /* AIF1TX_RATE - [10:0] */ | ||
1800 | |||
1801 | /* | ||
1802 | * R771 (0x303) - AIF1 TX LRCLK(2) | ||
1803 | */ | ||
1804 | #define WM8915_AIF1TX_LRCLK_MODE 0x0008 /* AIF1TX_LRCLK_MODE */ | ||
1805 | #define WM8915_AIF1TX_LRCLK_MODE_MASK 0x0008 /* AIF1TX_LRCLK_MODE */ | ||
1806 | #define WM8915_AIF1TX_LRCLK_MODE_SHIFT 3 /* AIF1TX_LRCLK_MODE */ | ||
1807 | #define WM8915_AIF1TX_LRCLK_MODE_WIDTH 1 /* AIF1TX_LRCLK_MODE */ | ||
1808 | #define WM8915_AIF1TX_LRCLK_INV 0x0004 /* AIF1TX_LRCLK_INV */ | ||
1809 | #define WM8915_AIF1TX_LRCLK_INV_MASK 0x0004 /* AIF1TX_LRCLK_INV */ | ||
1810 | #define WM8915_AIF1TX_LRCLK_INV_SHIFT 2 /* AIF1TX_LRCLK_INV */ | ||
1811 | #define WM8915_AIF1TX_LRCLK_INV_WIDTH 1 /* AIF1TX_LRCLK_INV */ | ||
1812 | #define WM8915_AIF1TX_LRCLK_FRC 0x0002 /* AIF1TX_LRCLK_FRC */ | ||
1813 | #define WM8915_AIF1TX_LRCLK_FRC_MASK 0x0002 /* AIF1TX_LRCLK_FRC */ | ||
1814 | #define WM8915_AIF1TX_LRCLK_FRC_SHIFT 1 /* AIF1TX_LRCLK_FRC */ | ||
1815 | #define WM8915_AIF1TX_LRCLK_FRC_WIDTH 1 /* AIF1TX_LRCLK_FRC */ | ||
1816 | #define WM8915_AIF1TX_LRCLK_MSTR 0x0001 /* AIF1TX_LRCLK_MSTR */ | ||
1817 | #define WM8915_AIF1TX_LRCLK_MSTR_MASK 0x0001 /* AIF1TX_LRCLK_MSTR */ | ||
1818 | #define WM8915_AIF1TX_LRCLK_MSTR_SHIFT 0 /* AIF1TX_LRCLK_MSTR */ | ||
1819 | #define WM8915_AIF1TX_LRCLK_MSTR_WIDTH 1 /* AIF1TX_LRCLK_MSTR */ | ||
1820 | |||
1821 | /* | ||
1822 | * R772 (0x304) - AIF1 RX LRCLK(1) | ||
1823 | */ | ||
1824 | #define WM8915_AIF1RX_RATE_MASK 0x07FF /* AIF1RX_RATE - [10:0] */ | ||
1825 | #define WM8915_AIF1RX_RATE_SHIFT 0 /* AIF1RX_RATE - [10:0] */ | ||
1826 | #define WM8915_AIF1RX_RATE_WIDTH 11 /* AIF1RX_RATE - [10:0] */ | ||
1827 | |||
1828 | /* | ||
1829 | * R773 (0x305) - AIF1 RX LRCLK(2) | ||
1830 | */ | ||
1831 | #define WM8915_AIF1RX_LRCLK_INV 0x0004 /* AIF1RX_LRCLK_INV */ | ||
1832 | #define WM8915_AIF1RX_LRCLK_INV_MASK 0x0004 /* AIF1RX_LRCLK_INV */ | ||
1833 | #define WM8915_AIF1RX_LRCLK_INV_SHIFT 2 /* AIF1RX_LRCLK_INV */ | ||
1834 | #define WM8915_AIF1RX_LRCLK_INV_WIDTH 1 /* AIF1RX_LRCLK_INV */ | ||
1835 | #define WM8915_AIF1RX_LRCLK_FRC 0x0002 /* AIF1RX_LRCLK_FRC */ | ||
1836 | #define WM8915_AIF1RX_LRCLK_FRC_MASK 0x0002 /* AIF1RX_LRCLK_FRC */ | ||
1837 | #define WM8915_AIF1RX_LRCLK_FRC_SHIFT 1 /* AIF1RX_LRCLK_FRC */ | ||
1838 | #define WM8915_AIF1RX_LRCLK_FRC_WIDTH 1 /* AIF1RX_LRCLK_FRC */ | ||
1839 | #define WM8915_AIF1RX_LRCLK_MSTR 0x0001 /* AIF1RX_LRCLK_MSTR */ | ||
1840 | #define WM8915_AIF1RX_LRCLK_MSTR_MASK 0x0001 /* AIF1RX_LRCLK_MSTR */ | ||
1841 | #define WM8915_AIF1RX_LRCLK_MSTR_SHIFT 0 /* AIF1RX_LRCLK_MSTR */ | ||
1842 | #define WM8915_AIF1RX_LRCLK_MSTR_WIDTH 1 /* AIF1RX_LRCLK_MSTR */ | ||
1843 | |||
1844 | /* | ||
1845 | * R774 (0x306) - AIF1TX Data Configuration (1) | ||
1846 | */ | ||
1847 | #define WM8915_AIF1TX_WL_MASK 0xFF00 /* AIF1TX_WL - [15:8] */ | ||
1848 | #define WM8915_AIF1TX_WL_SHIFT 8 /* AIF1TX_WL - [15:8] */ | ||
1849 | #define WM8915_AIF1TX_WL_WIDTH 8 /* AIF1TX_WL - [15:8] */ | ||
1850 | #define WM8915_AIF1TX_SLOT_LEN_MASK 0x00FF /* AIF1TX_SLOT_LEN - [7:0] */ | ||
1851 | #define WM8915_AIF1TX_SLOT_LEN_SHIFT 0 /* AIF1TX_SLOT_LEN - [7:0] */ | ||
1852 | #define WM8915_AIF1TX_SLOT_LEN_WIDTH 8 /* AIF1TX_SLOT_LEN - [7:0] */ | ||
1853 | |||
1854 | /* | ||
1855 | * R775 (0x307) - AIF1TX Data Configuration (2) | ||
1856 | */ | ||
1857 | #define WM8915_AIF1TX_DAT_TRI 0x0001 /* AIF1TX_DAT_TRI */ | ||
1858 | #define WM8915_AIF1TX_DAT_TRI_MASK 0x0001 /* AIF1TX_DAT_TRI */ | ||
1859 | #define WM8915_AIF1TX_DAT_TRI_SHIFT 0 /* AIF1TX_DAT_TRI */ | ||
1860 | #define WM8915_AIF1TX_DAT_TRI_WIDTH 1 /* AIF1TX_DAT_TRI */ | ||
1861 | |||
1862 | /* | ||
1863 | * R776 (0x308) - AIF1RX Data Configuration | ||
1864 | */ | ||
1865 | #define WM8915_AIF1RX_WL_MASK 0xFF00 /* AIF1RX_WL - [15:8] */ | ||
1866 | #define WM8915_AIF1RX_WL_SHIFT 8 /* AIF1RX_WL - [15:8] */ | ||
1867 | #define WM8915_AIF1RX_WL_WIDTH 8 /* AIF1RX_WL - [15:8] */ | ||
1868 | #define WM8915_AIF1RX_SLOT_LEN_MASK 0x00FF /* AIF1RX_SLOT_LEN - [7:0] */ | ||
1869 | #define WM8915_AIF1RX_SLOT_LEN_SHIFT 0 /* AIF1RX_SLOT_LEN - [7:0] */ | ||
1870 | #define WM8915_AIF1RX_SLOT_LEN_WIDTH 8 /* AIF1RX_SLOT_LEN - [7:0] */ | ||
1871 | |||
1872 | /* | ||
1873 | * R777 (0x309) - AIF1TX Channel 0 Configuration | ||
1874 | */ | ||
1875 | #define WM8915_AIF1TX_CHAN0_DAT_INV 0x8000 /* AIF1TX_CHAN0_DAT_INV */ | ||
1876 | #define WM8915_AIF1TX_CHAN0_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN0_DAT_INV */ | ||
1877 | #define WM8915_AIF1TX_CHAN0_DAT_INV_SHIFT 15 /* AIF1TX_CHAN0_DAT_INV */ | ||
1878 | #define WM8915_AIF1TX_CHAN0_DAT_INV_WIDTH 1 /* AIF1TX_CHAN0_DAT_INV */ | ||
1879 | #define WM8915_AIF1TX_CHAN0_SPACING_MASK 0x7E00 /* AIF1TX_CHAN0_SPACING - [14:9] */ | ||
1880 | #define WM8915_AIF1TX_CHAN0_SPACING_SHIFT 9 /* AIF1TX_CHAN0_SPACING - [14:9] */ | ||
1881 | #define WM8915_AIF1TX_CHAN0_SPACING_WIDTH 6 /* AIF1TX_CHAN0_SPACING - [14:9] */ | ||
1882 | #define WM8915_AIF1TX_CHAN0_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN0_SLOTS - [8:6] */ | ||
1883 | #define WM8915_AIF1TX_CHAN0_SLOTS_SHIFT 6 /* AIF1TX_CHAN0_SLOTS - [8:6] */ | ||
1884 | #define WM8915_AIF1TX_CHAN0_SLOTS_WIDTH 3 /* AIF1TX_CHAN0_SLOTS - [8:6] */ | ||
1885 | #define WM8915_AIF1TX_CHAN0_START_SLOT_MASK 0x003F /* AIF1TX_CHAN0_START_SLOT - [5:0] */ | ||
1886 | #define WM8915_AIF1TX_CHAN0_START_SLOT_SHIFT 0 /* AIF1TX_CHAN0_START_SLOT - [5:0] */ | ||
1887 | #define WM8915_AIF1TX_CHAN0_START_SLOT_WIDTH 6 /* AIF1TX_CHAN0_START_SLOT - [5:0] */ | ||
1888 | |||
1889 | /* | ||
1890 | * R778 (0x30A) - AIF1TX Channel 1 Configuration | ||
1891 | */ | ||
1892 | #define WM8915_AIF1TX_CHAN1_DAT_INV 0x8000 /* AIF1TX_CHAN1_DAT_INV */ | ||
1893 | #define WM8915_AIF1TX_CHAN1_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN1_DAT_INV */ | ||
1894 | #define WM8915_AIF1TX_CHAN1_DAT_INV_SHIFT 15 /* AIF1TX_CHAN1_DAT_INV */ | ||
1895 | #define WM8915_AIF1TX_CHAN1_DAT_INV_WIDTH 1 /* AIF1TX_CHAN1_DAT_INV */ | ||
1896 | #define WM8915_AIF1TX_CHAN1_SPACING_MASK 0x7E00 /* AIF1TX_CHAN1_SPACING - [14:9] */ | ||
1897 | #define WM8915_AIF1TX_CHAN1_SPACING_SHIFT 9 /* AIF1TX_CHAN1_SPACING - [14:9] */ | ||
1898 | #define WM8915_AIF1TX_CHAN1_SPACING_WIDTH 6 /* AIF1TX_CHAN1_SPACING - [14:9] */ | ||
1899 | #define WM8915_AIF1TX_CHAN1_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN1_SLOTS - [8:6] */ | ||
1900 | #define WM8915_AIF1TX_CHAN1_SLOTS_SHIFT 6 /* AIF1TX_CHAN1_SLOTS - [8:6] */ | ||
1901 | #define WM8915_AIF1TX_CHAN1_SLOTS_WIDTH 3 /* AIF1TX_CHAN1_SLOTS - [8:6] */ | ||
1902 | #define WM8915_AIF1TX_CHAN1_START_SLOT_MASK 0x003F /* AIF1TX_CHAN1_START_SLOT - [5:0] */ | ||
1903 | #define WM8915_AIF1TX_CHAN1_START_SLOT_SHIFT 0 /* AIF1TX_CHAN1_START_SLOT - [5:0] */ | ||
1904 | #define WM8915_AIF1TX_CHAN1_START_SLOT_WIDTH 6 /* AIF1TX_CHAN1_START_SLOT - [5:0] */ | ||
1905 | |||
1906 | /* | ||
1907 | * R779 (0x30B) - AIF1TX Channel 2 Configuration | ||
1908 | */ | ||
1909 | #define WM8915_AIF1TX_CHAN2_DAT_INV 0x8000 /* AIF1TX_CHAN2_DAT_INV */ | ||
1910 | #define WM8915_AIF1TX_CHAN2_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN2_DAT_INV */ | ||
1911 | #define WM8915_AIF1TX_CHAN2_DAT_INV_SHIFT 15 /* AIF1TX_CHAN2_DAT_INV */ | ||
1912 | #define WM8915_AIF1TX_CHAN2_DAT_INV_WIDTH 1 /* AIF1TX_CHAN2_DAT_INV */ | ||
1913 | #define WM8915_AIF1TX_CHAN2_SPACING_MASK 0x7E00 /* AIF1TX_CHAN2_SPACING - [14:9] */ | ||
1914 | #define WM8915_AIF1TX_CHAN2_SPACING_SHIFT 9 /* AIF1TX_CHAN2_SPACING - [14:9] */ | ||
1915 | #define WM8915_AIF1TX_CHAN2_SPACING_WIDTH 6 /* AIF1TX_CHAN2_SPACING - [14:9] */ | ||
1916 | #define WM8915_AIF1TX_CHAN2_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN2_SLOTS - [8:6] */ | ||
1917 | #define WM8915_AIF1TX_CHAN2_SLOTS_SHIFT 6 /* AIF1TX_CHAN2_SLOTS - [8:6] */ | ||
1918 | #define WM8915_AIF1TX_CHAN2_SLOTS_WIDTH 3 /* AIF1TX_CHAN2_SLOTS - [8:6] */ | ||
1919 | #define WM8915_AIF1TX_CHAN2_START_SLOT_MASK 0x003F /* AIF1TX_CHAN2_START_SLOT - [5:0] */ | ||
1920 | #define WM8915_AIF1TX_CHAN2_START_SLOT_SHIFT 0 /* AIF1TX_CHAN2_START_SLOT - [5:0] */ | ||
1921 | #define WM8915_AIF1TX_CHAN2_START_SLOT_WIDTH 6 /* AIF1TX_CHAN2_START_SLOT - [5:0] */ | ||
1922 | |||
1923 | /* | ||
1924 | * R780 (0x30C) - AIF1TX Channel 3 Configuration | ||
1925 | */ | ||
1926 | #define WM8915_AIF1TX_CHAN3_DAT_INV 0x8000 /* AIF1TX_CHAN3_DAT_INV */ | ||
1927 | #define WM8915_AIF1TX_CHAN3_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN3_DAT_INV */ | ||
1928 | #define WM8915_AIF1TX_CHAN3_DAT_INV_SHIFT 15 /* AIF1TX_CHAN3_DAT_INV */ | ||
1929 | #define WM8915_AIF1TX_CHAN3_DAT_INV_WIDTH 1 /* AIF1TX_CHAN3_DAT_INV */ | ||
1930 | #define WM8915_AIF1TX_CHAN3_SPACING_MASK 0x7E00 /* AIF1TX_CHAN3_SPACING - [14:9] */ | ||
1931 | #define WM8915_AIF1TX_CHAN3_SPACING_SHIFT 9 /* AIF1TX_CHAN3_SPACING - [14:9] */ | ||
1932 | #define WM8915_AIF1TX_CHAN3_SPACING_WIDTH 6 /* AIF1TX_CHAN3_SPACING - [14:9] */ | ||
1933 | #define WM8915_AIF1TX_CHAN3_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN3_SLOTS - [8:6] */ | ||
1934 | #define WM8915_AIF1TX_CHAN3_SLOTS_SHIFT 6 /* AIF1TX_CHAN3_SLOTS - [8:6] */ | ||
1935 | #define WM8915_AIF1TX_CHAN3_SLOTS_WIDTH 3 /* AIF1TX_CHAN3_SLOTS - [8:6] */ | ||
1936 | #define WM8915_AIF1TX_CHAN3_START_SLOT_MASK 0x003F /* AIF1TX_CHAN3_START_SLOT - [5:0] */ | ||
1937 | #define WM8915_AIF1TX_CHAN3_START_SLOT_SHIFT 0 /* AIF1TX_CHAN3_START_SLOT - [5:0] */ | ||
1938 | #define WM8915_AIF1TX_CHAN3_START_SLOT_WIDTH 6 /* AIF1TX_CHAN3_START_SLOT - [5:0] */ | ||
1939 | |||
1940 | /* | ||
1941 | * R781 (0x30D) - AIF1TX Channel 4 Configuration | ||
1942 | */ | ||
1943 | #define WM8915_AIF1TX_CHAN4_DAT_INV 0x8000 /* AIF1TX_CHAN4_DAT_INV */ | ||
1944 | #define WM8915_AIF1TX_CHAN4_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN4_DAT_INV */ | ||
1945 | #define WM8915_AIF1TX_CHAN4_DAT_INV_SHIFT 15 /* AIF1TX_CHAN4_DAT_INV */ | ||
1946 | #define WM8915_AIF1TX_CHAN4_DAT_INV_WIDTH 1 /* AIF1TX_CHAN4_DAT_INV */ | ||
1947 | #define WM8915_AIF1TX_CHAN4_SPACING_MASK 0x7E00 /* AIF1TX_CHAN4_SPACING - [14:9] */ | ||
1948 | #define WM8915_AIF1TX_CHAN4_SPACING_SHIFT 9 /* AIF1TX_CHAN4_SPACING - [14:9] */ | ||
1949 | #define WM8915_AIF1TX_CHAN4_SPACING_WIDTH 6 /* AIF1TX_CHAN4_SPACING - [14:9] */ | ||
1950 | #define WM8915_AIF1TX_CHAN4_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN4_SLOTS - [8:6] */ | ||
1951 | #define WM8915_AIF1TX_CHAN4_SLOTS_SHIFT 6 /* AIF1TX_CHAN4_SLOTS - [8:6] */ | ||
1952 | #define WM8915_AIF1TX_CHAN4_SLOTS_WIDTH 3 /* AIF1TX_CHAN4_SLOTS - [8:6] */ | ||
1953 | #define WM8915_AIF1TX_CHAN4_START_SLOT_MASK 0x003F /* AIF1TX_CHAN4_START_SLOT - [5:0] */ | ||
1954 | #define WM8915_AIF1TX_CHAN4_START_SLOT_SHIFT 0 /* AIF1TX_CHAN4_START_SLOT - [5:0] */ | ||
1955 | #define WM8915_AIF1TX_CHAN4_START_SLOT_WIDTH 6 /* AIF1TX_CHAN4_START_SLOT - [5:0] */ | ||
1956 | |||
1957 | /* | ||
1958 | * R782 (0x30E) - AIF1TX Channel 5 Configuration | ||
1959 | */ | ||
1960 | #define WM8915_AIF1TX_CHAN5_DAT_INV 0x8000 /* AIF1TX_CHAN5_DAT_INV */ | ||
1961 | #define WM8915_AIF1TX_CHAN5_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN5_DAT_INV */ | ||
1962 | #define WM8915_AIF1TX_CHAN5_DAT_INV_SHIFT 15 /* AIF1TX_CHAN5_DAT_INV */ | ||
1963 | #define WM8915_AIF1TX_CHAN5_DAT_INV_WIDTH 1 /* AIF1TX_CHAN5_DAT_INV */ | ||
1964 | #define WM8915_AIF1TX_CHAN5_SPACING_MASK 0x7E00 /* AIF1TX_CHAN5_SPACING - [14:9] */ | ||
1965 | #define WM8915_AIF1TX_CHAN5_SPACING_SHIFT 9 /* AIF1TX_CHAN5_SPACING - [14:9] */ | ||
1966 | #define WM8915_AIF1TX_CHAN5_SPACING_WIDTH 6 /* AIF1TX_CHAN5_SPACING - [14:9] */ | ||
1967 | #define WM8915_AIF1TX_CHAN5_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN5_SLOTS - [8:6] */ | ||
1968 | #define WM8915_AIF1TX_CHAN5_SLOTS_SHIFT 6 /* AIF1TX_CHAN5_SLOTS - [8:6] */ | ||
1969 | #define WM8915_AIF1TX_CHAN5_SLOTS_WIDTH 3 /* AIF1TX_CHAN5_SLOTS - [8:6] */ | ||
1970 | #define WM8915_AIF1TX_CHAN5_START_SLOT_MASK 0x003F /* AIF1TX_CHAN5_START_SLOT - [5:0] */ | ||
1971 | #define WM8915_AIF1TX_CHAN5_START_SLOT_SHIFT 0 /* AIF1TX_CHAN5_START_SLOT - [5:0] */ | ||
1972 | #define WM8915_AIF1TX_CHAN5_START_SLOT_WIDTH 6 /* AIF1TX_CHAN5_START_SLOT - [5:0] */ | ||
1973 | |||
1974 | /* | ||
1975 | * R783 (0x30F) - AIF1RX Channel 0 Configuration | ||
1976 | */ | ||
1977 | #define WM8915_AIF1RX_CHAN0_DAT_INV 0x8000 /* AIF1RX_CHAN0_DAT_INV */ | ||
1978 | #define WM8915_AIF1RX_CHAN0_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN0_DAT_INV */ | ||
1979 | #define WM8915_AIF1RX_CHAN0_DAT_INV_SHIFT 15 /* AIF1RX_CHAN0_DAT_INV */ | ||
1980 | #define WM8915_AIF1RX_CHAN0_DAT_INV_WIDTH 1 /* AIF1RX_CHAN0_DAT_INV */ | ||
1981 | #define WM8915_AIF1RX_CHAN0_SPACING_MASK 0x7E00 /* AIF1RX_CHAN0_SPACING - [14:9] */ | ||
1982 | #define WM8915_AIF1RX_CHAN0_SPACING_SHIFT 9 /* AIF1RX_CHAN0_SPACING - [14:9] */ | ||
1983 | #define WM8915_AIF1RX_CHAN0_SPACING_WIDTH 6 /* AIF1RX_CHAN0_SPACING - [14:9] */ | ||
1984 | #define WM8915_AIF1RX_CHAN0_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN0_SLOTS - [8:6] */ | ||
1985 | #define WM8915_AIF1RX_CHAN0_SLOTS_SHIFT 6 /* AIF1RX_CHAN0_SLOTS - [8:6] */ | ||
1986 | #define WM8915_AIF1RX_CHAN0_SLOTS_WIDTH 3 /* AIF1RX_CHAN0_SLOTS - [8:6] */ | ||
1987 | #define WM8915_AIF1RX_CHAN0_START_SLOT_MASK 0x003F /* AIF1RX_CHAN0_START_SLOT - [5:0] */ | ||
1988 | #define WM8915_AIF1RX_CHAN0_START_SLOT_SHIFT 0 /* AIF1RX_CHAN0_START_SLOT - [5:0] */ | ||
1989 | #define WM8915_AIF1RX_CHAN0_START_SLOT_WIDTH 6 /* AIF1RX_CHAN0_START_SLOT - [5:0] */ | ||
1990 | |||
1991 | /* | ||
1992 | * R784 (0x310) - AIF1RX Channel 1 Configuration | ||
1993 | */ | ||
1994 | #define WM8915_AIF1RX_CHAN1_DAT_INV 0x8000 /* AIF1RX_CHAN1_DAT_INV */ | ||
1995 | #define WM8915_AIF1RX_CHAN1_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN1_DAT_INV */ | ||
1996 | #define WM8915_AIF1RX_CHAN1_DAT_INV_SHIFT 15 /* AIF1RX_CHAN1_DAT_INV */ | ||
1997 | #define WM8915_AIF1RX_CHAN1_DAT_INV_WIDTH 1 /* AIF1RX_CHAN1_DAT_INV */ | ||
1998 | #define WM8915_AIF1RX_CHAN1_SPACING_MASK 0x7E00 /* AIF1RX_CHAN1_SPACING - [14:9] */ | ||
1999 | #define WM8915_AIF1RX_CHAN1_SPACING_SHIFT 9 /* AIF1RX_CHAN1_SPACING - [14:9] */ | ||
2000 | #define WM8915_AIF1RX_CHAN1_SPACING_WIDTH 6 /* AIF1RX_CHAN1_SPACING - [14:9] */ | ||
2001 | #define WM8915_AIF1RX_CHAN1_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN1_SLOTS - [8:6] */ | ||
2002 | #define WM8915_AIF1RX_CHAN1_SLOTS_SHIFT 6 /* AIF1RX_CHAN1_SLOTS - [8:6] */ | ||
2003 | #define WM8915_AIF1RX_CHAN1_SLOTS_WIDTH 3 /* AIF1RX_CHAN1_SLOTS - [8:6] */ | ||
2004 | #define WM8915_AIF1RX_CHAN1_START_SLOT_MASK 0x003F /* AIF1RX_CHAN1_START_SLOT - [5:0] */ | ||
2005 | #define WM8915_AIF1RX_CHAN1_START_SLOT_SHIFT 0 /* AIF1RX_CHAN1_START_SLOT - [5:0] */ | ||
2006 | #define WM8915_AIF1RX_CHAN1_START_SLOT_WIDTH 6 /* AIF1RX_CHAN1_START_SLOT - [5:0] */ | ||
2007 | |||
2008 | /* | ||
2009 | * R785 (0x311) - AIF1RX Channel 2 Configuration | ||
2010 | */ | ||
2011 | #define WM8915_AIF1RX_CHAN2_DAT_INV 0x8000 /* AIF1RX_CHAN2_DAT_INV */ | ||
2012 | #define WM8915_AIF1RX_CHAN2_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN2_DAT_INV */ | ||
2013 | #define WM8915_AIF1RX_CHAN2_DAT_INV_SHIFT 15 /* AIF1RX_CHAN2_DAT_INV */ | ||
2014 | #define WM8915_AIF1RX_CHAN2_DAT_INV_WIDTH 1 /* AIF1RX_CHAN2_DAT_INV */ | ||
2015 | #define WM8915_AIF1RX_CHAN2_SPACING_MASK 0x7E00 /* AIF1RX_CHAN2_SPACING - [14:9] */ | ||
2016 | #define WM8915_AIF1RX_CHAN2_SPACING_SHIFT 9 /* AIF1RX_CHAN2_SPACING - [14:9] */ | ||
2017 | #define WM8915_AIF1RX_CHAN2_SPACING_WIDTH 6 /* AIF1RX_CHAN2_SPACING - [14:9] */ | ||
2018 | #define WM8915_AIF1RX_CHAN2_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN2_SLOTS - [8:6] */ | ||
2019 | #define WM8915_AIF1RX_CHAN2_SLOTS_SHIFT 6 /* AIF1RX_CHAN2_SLOTS - [8:6] */ | ||
2020 | #define WM8915_AIF1RX_CHAN2_SLOTS_WIDTH 3 /* AIF1RX_CHAN2_SLOTS - [8:6] */ | ||
2021 | #define WM8915_AIF1RX_CHAN2_START_SLOT_MASK 0x003F /* AIF1RX_CHAN2_START_SLOT - [5:0] */ | ||
2022 | #define WM8915_AIF1RX_CHAN2_START_SLOT_SHIFT 0 /* AIF1RX_CHAN2_START_SLOT - [5:0] */ | ||
2023 | #define WM8915_AIF1RX_CHAN2_START_SLOT_WIDTH 6 /* AIF1RX_CHAN2_START_SLOT - [5:0] */ | ||
2024 | |||
2025 | /* | ||
2026 | * R786 (0x312) - AIF1RX Channel 3 Configuration | ||
2027 | */ | ||
2028 | #define WM8915_AIF1RX_CHAN3_DAT_INV 0x8000 /* AIF1RX_CHAN3_DAT_INV */ | ||
2029 | #define WM8915_AIF1RX_CHAN3_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN3_DAT_INV */ | ||
2030 | #define WM8915_AIF1RX_CHAN3_DAT_INV_SHIFT 15 /* AIF1RX_CHAN3_DAT_INV */ | ||
2031 | #define WM8915_AIF1RX_CHAN3_DAT_INV_WIDTH 1 /* AIF1RX_CHAN3_DAT_INV */ | ||
2032 | #define WM8915_AIF1RX_CHAN3_SPACING_MASK 0x7E00 /* AIF1RX_CHAN3_SPACING - [14:9] */ | ||
2033 | #define WM8915_AIF1RX_CHAN3_SPACING_SHIFT 9 /* AIF1RX_CHAN3_SPACING - [14:9] */ | ||
2034 | #define WM8915_AIF1RX_CHAN3_SPACING_WIDTH 6 /* AIF1RX_CHAN3_SPACING - [14:9] */ | ||
2035 | #define WM8915_AIF1RX_CHAN3_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN3_SLOTS - [8:6] */ | ||
2036 | #define WM8915_AIF1RX_CHAN3_SLOTS_SHIFT 6 /* AIF1RX_CHAN3_SLOTS - [8:6] */ | ||
2037 | #define WM8915_AIF1RX_CHAN3_SLOTS_WIDTH 3 /* AIF1RX_CHAN3_SLOTS - [8:6] */ | ||
2038 | #define WM8915_AIF1RX_CHAN3_START_SLOT_MASK 0x003F /* AIF1RX_CHAN3_START_SLOT - [5:0] */ | ||
2039 | #define WM8915_AIF1RX_CHAN3_START_SLOT_SHIFT 0 /* AIF1RX_CHAN3_START_SLOT - [5:0] */ | ||
2040 | #define WM8915_AIF1RX_CHAN3_START_SLOT_WIDTH 6 /* AIF1RX_CHAN3_START_SLOT - [5:0] */ | ||
2041 | |||
2042 | /* | ||
2043 | * R787 (0x313) - AIF1RX Channel 4 Configuration | ||
2044 | */ | ||
2045 | #define WM8915_AIF1RX_CHAN4_DAT_INV 0x8000 /* AIF1RX_CHAN4_DAT_INV */ | ||
2046 | #define WM8915_AIF1RX_CHAN4_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN4_DAT_INV */ | ||
2047 | #define WM8915_AIF1RX_CHAN4_DAT_INV_SHIFT 15 /* AIF1RX_CHAN4_DAT_INV */ | ||
2048 | #define WM8915_AIF1RX_CHAN4_DAT_INV_WIDTH 1 /* AIF1RX_CHAN4_DAT_INV */ | ||
2049 | #define WM8915_AIF1RX_CHAN4_SPACING_MASK 0x7E00 /* AIF1RX_CHAN4_SPACING - [14:9] */ | ||
2050 | #define WM8915_AIF1RX_CHAN4_SPACING_SHIFT 9 /* AIF1RX_CHAN4_SPACING - [14:9] */ | ||
2051 | #define WM8915_AIF1RX_CHAN4_SPACING_WIDTH 6 /* AIF1RX_CHAN4_SPACING - [14:9] */ | ||
2052 | #define WM8915_AIF1RX_CHAN4_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN4_SLOTS - [8:6] */ | ||
2053 | #define WM8915_AIF1RX_CHAN4_SLOTS_SHIFT 6 /* AIF1RX_CHAN4_SLOTS - [8:6] */ | ||
2054 | #define WM8915_AIF1RX_CHAN4_SLOTS_WIDTH 3 /* AIF1RX_CHAN4_SLOTS - [8:6] */ | ||
2055 | #define WM8915_AIF1RX_CHAN4_START_SLOT_MASK 0x003F /* AIF1RX_CHAN4_START_SLOT - [5:0] */ | ||
2056 | #define WM8915_AIF1RX_CHAN4_START_SLOT_SHIFT 0 /* AIF1RX_CHAN4_START_SLOT - [5:0] */ | ||
2057 | #define WM8915_AIF1RX_CHAN4_START_SLOT_WIDTH 6 /* AIF1RX_CHAN4_START_SLOT - [5:0] */ | ||
2058 | |||
2059 | /* | ||
2060 | * R788 (0x314) - AIF1RX Channel 5 Configuration | ||
2061 | */ | ||
2062 | #define WM8915_AIF1RX_CHAN5_DAT_INV 0x8000 /* AIF1RX_CHAN5_DAT_INV */ | ||
2063 | #define WM8915_AIF1RX_CHAN5_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN5_DAT_INV */ | ||
2064 | #define WM8915_AIF1RX_CHAN5_DAT_INV_SHIFT 15 /* AIF1RX_CHAN5_DAT_INV */ | ||
2065 | #define WM8915_AIF1RX_CHAN5_DAT_INV_WIDTH 1 /* AIF1RX_CHAN5_DAT_INV */ | ||
2066 | #define WM8915_AIF1RX_CHAN5_SPACING_MASK 0x7E00 /* AIF1RX_CHAN5_SPACING - [14:9] */ | ||
2067 | #define WM8915_AIF1RX_CHAN5_SPACING_SHIFT 9 /* AIF1RX_CHAN5_SPACING - [14:9] */ | ||
2068 | #define WM8915_AIF1RX_CHAN5_SPACING_WIDTH 6 /* AIF1RX_CHAN5_SPACING - [14:9] */ | ||
2069 | #define WM8915_AIF1RX_CHAN5_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN5_SLOTS - [8:6] */ | ||
2070 | #define WM8915_AIF1RX_CHAN5_SLOTS_SHIFT 6 /* AIF1RX_CHAN5_SLOTS - [8:6] */ | ||
2071 | #define WM8915_AIF1RX_CHAN5_SLOTS_WIDTH 3 /* AIF1RX_CHAN5_SLOTS - [8:6] */ | ||
2072 | #define WM8915_AIF1RX_CHAN5_START_SLOT_MASK 0x003F /* AIF1RX_CHAN5_START_SLOT - [5:0] */ | ||
2073 | #define WM8915_AIF1RX_CHAN5_START_SLOT_SHIFT 0 /* AIF1RX_CHAN5_START_SLOT - [5:0] */ | ||
2074 | #define WM8915_AIF1RX_CHAN5_START_SLOT_WIDTH 6 /* AIF1RX_CHAN5_START_SLOT - [5:0] */ | ||
2075 | |||
2076 | /* | ||
2077 | * R789 (0x315) - AIF1RX Mono Configuration | ||
2078 | */ | ||
2079 | #define WM8915_AIF1RX_CHAN4_MONO_MODE 0x0004 /* AIF1RX_CHAN4_MONO_MODE */ | ||
2080 | #define WM8915_AIF1RX_CHAN4_MONO_MODE_MASK 0x0004 /* AIF1RX_CHAN4_MONO_MODE */ | ||
2081 | #define WM8915_AIF1RX_CHAN4_MONO_MODE_SHIFT 2 /* AIF1RX_CHAN4_MONO_MODE */ | ||
2082 | #define WM8915_AIF1RX_CHAN4_MONO_MODE_WIDTH 1 /* AIF1RX_CHAN4_MONO_MODE */ | ||
2083 | #define WM8915_AIF1RX_CHAN2_MONO_MODE 0x0002 /* AIF1RX_CHAN2_MONO_MODE */ | ||
2084 | #define WM8915_AIF1RX_CHAN2_MONO_MODE_MASK 0x0002 /* AIF1RX_CHAN2_MONO_MODE */ | ||
2085 | #define WM8915_AIF1RX_CHAN2_MONO_MODE_SHIFT 1 /* AIF1RX_CHAN2_MONO_MODE */ | ||
2086 | #define WM8915_AIF1RX_CHAN2_MONO_MODE_WIDTH 1 /* AIF1RX_CHAN2_MONO_MODE */ | ||
2087 | #define WM8915_AIF1RX_CHAN0_MONO_MODE 0x0001 /* AIF1RX_CHAN0_MONO_MODE */ | ||
2088 | #define WM8915_AIF1RX_CHAN0_MONO_MODE_MASK 0x0001 /* AIF1RX_CHAN0_MONO_MODE */ | ||
2089 | #define WM8915_AIF1RX_CHAN0_MONO_MODE_SHIFT 0 /* AIF1RX_CHAN0_MONO_MODE */ | ||
2090 | #define WM8915_AIF1RX_CHAN0_MONO_MODE_WIDTH 1 /* AIF1RX_CHAN0_MONO_MODE */ | ||
2091 | |||
2092 | /* | ||
2093 | * R794 (0x31A) - AIF1TX Test | ||
2094 | */ | ||
2095 | #define WM8915_AIF1TX45_DITHER_ENA 0x0004 /* AIF1TX45_DITHER_ENA */ | ||
2096 | #define WM8915_AIF1TX45_DITHER_ENA_MASK 0x0004 /* AIF1TX45_DITHER_ENA */ | ||
2097 | #define WM8915_AIF1TX45_DITHER_ENA_SHIFT 2 /* AIF1TX45_DITHER_ENA */ | ||
2098 | #define WM8915_AIF1TX45_DITHER_ENA_WIDTH 1 /* AIF1TX45_DITHER_ENA */ | ||
2099 | #define WM8915_AIF1TX23_DITHER_ENA 0x0002 /* AIF1TX23_DITHER_ENA */ | ||
2100 | #define WM8915_AIF1TX23_DITHER_ENA_MASK 0x0002 /* AIF1TX23_DITHER_ENA */ | ||
2101 | #define WM8915_AIF1TX23_DITHER_ENA_SHIFT 1 /* AIF1TX23_DITHER_ENA */ | ||
2102 | #define WM8915_AIF1TX23_DITHER_ENA_WIDTH 1 /* AIF1TX23_DITHER_ENA */ | ||
2103 | #define WM8915_AIF1TX01_DITHER_ENA 0x0001 /* AIF1TX01_DITHER_ENA */ | ||
2104 | #define WM8915_AIF1TX01_DITHER_ENA_MASK 0x0001 /* AIF1TX01_DITHER_ENA */ | ||
2105 | #define WM8915_AIF1TX01_DITHER_ENA_SHIFT 0 /* AIF1TX01_DITHER_ENA */ | ||
2106 | #define WM8915_AIF1TX01_DITHER_ENA_WIDTH 1 /* AIF1TX01_DITHER_ENA */ | ||
2107 | |||
2108 | /* | ||
2109 | * R800 (0x320) - AIF2 Control | ||
2110 | */ | ||
2111 | #define WM8915_AIF2_TRI 0x0004 /* AIF2_TRI */ | ||
2112 | #define WM8915_AIF2_TRI_MASK 0x0004 /* AIF2_TRI */ | ||
2113 | #define WM8915_AIF2_TRI_SHIFT 2 /* AIF2_TRI */ | ||
2114 | #define WM8915_AIF2_TRI_WIDTH 1 /* AIF2_TRI */ | ||
2115 | #define WM8915_AIF2_FMT_MASK 0x0003 /* AIF2_FMT - [1:0] */ | ||
2116 | #define WM8915_AIF2_FMT_SHIFT 0 /* AIF2_FMT - [1:0] */ | ||
2117 | #define WM8915_AIF2_FMT_WIDTH 2 /* AIF2_FMT - [1:0] */ | ||
2118 | |||
2119 | /* | ||
2120 | * R801 (0x321) - AIF2 BCLK | ||
2121 | */ | ||
2122 | #define WM8915_AIF2_BCLK_INV 0x0400 /* AIF2_BCLK_INV */ | ||
2123 | #define WM8915_AIF2_BCLK_INV_MASK 0x0400 /* AIF2_BCLK_INV */ | ||
2124 | #define WM8915_AIF2_BCLK_INV_SHIFT 10 /* AIF2_BCLK_INV */ | ||
2125 | #define WM8915_AIF2_BCLK_INV_WIDTH 1 /* AIF2_BCLK_INV */ | ||
2126 | #define WM8915_AIF2_BCLK_FRC 0x0200 /* AIF2_BCLK_FRC */ | ||
2127 | #define WM8915_AIF2_BCLK_FRC_MASK 0x0200 /* AIF2_BCLK_FRC */ | ||
2128 | #define WM8915_AIF2_BCLK_FRC_SHIFT 9 /* AIF2_BCLK_FRC */ | ||
2129 | #define WM8915_AIF2_BCLK_FRC_WIDTH 1 /* AIF2_BCLK_FRC */ | ||
2130 | #define WM8915_AIF2_BCLK_MSTR 0x0100 /* AIF2_BCLK_MSTR */ | ||
2131 | #define WM8915_AIF2_BCLK_MSTR_MASK 0x0100 /* AIF2_BCLK_MSTR */ | ||
2132 | #define WM8915_AIF2_BCLK_MSTR_SHIFT 8 /* AIF2_BCLK_MSTR */ | ||
2133 | #define WM8915_AIF2_BCLK_MSTR_WIDTH 1 /* AIF2_BCLK_MSTR */ | ||
2134 | #define WM8915_AIF2_BCLK_DIV_MASK 0x000F /* AIF2_BCLK_DIV - [3:0] */ | ||
2135 | #define WM8915_AIF2_BCLK_DIV_SHIFT 0 /* AIF2_BCLK_DIV - [3:0] */ | ||
2136 | #define WM8915_AIF2_BCLK_DIV_WIDTH 4 /* AIF2_BCLK_DIV - [3:0] */ | ||
2137 | |||
2138 | /* | ||
2139 | * R802 (0x322) - AIF2 TX LRCLK(1) | ||
2140 | */ | ||
2141 | #define WM8915_AIF2TX_RATE_MASK 0x07FF /* AIF2TX_RATE - [10:0] */ | ||
2142 | #define WM8915_AIF2TX_RATE_SHIFT 0 /* AIF2TX_RATE - [10:0] */ | ||
2143 | #define WM8915_AIF2TX_RATE_WIDTH 11 /* AIF2TX_RATE - [10:0] */ | ||
2144 | |||
2145 | /* | ||
2146 | * R803 (0x323) - AIF2 TX LRCLK(2) | ||
2147 | */ | ||
2148 | #define WM8915_AIF2TX_LRCLK_MODE 0x0008 /* AIF2TX_LRCLK_MODE */ | ||
2149 | #define WM8915_AIF2TX_LRCLK_MODE_MASK 0x0008 /* AIF2TX_LRCLK_MODE */ | ||
2150 | #define WM8915_AIF2TX_LRCLK_MODE_SHIFT 3 /* AIF2TX_LRCLK_MODE */ | ||
2151 | #define WM8915_AIF2TX_LRCLK_MODE_WIDTH 1 /* AIF2TX_LRCLK_MODE */ | ||
2152 | #define WM8915_AIF2TX_LRCLK_INV 0x0004 /* AIF2TX_LRCLK_INV */ | ||
2153 | #define WM8915_AIF2TX_LRCLK_INV_MASK 0x0004 /* AIF2TX_LRCLK_INV */ | ||
2154 | #define WM8915_AIF2TX_LRCLK_INV_SHIFT 2 /* AIF2TX_LRCLK_INV */ | ||
2155 | #define WM8915_AIF2TX_LRCLK_INV_WIDTH 1 /* AIF2TX_LRCLK_INV */ | ||
2156 | #define WM8915_AIF2TX_LRCLK_FRC 0x0002 /* AIF2TX_LRCLK_FRC */ | ||
2157 | #define WM8915_AIF2TX_LRCLK_FRC_MASK 0x0002 /* AIF2TX_LRCLK_FRC */ | ||
2158 | #define WM8915_AIF2TX_LRCLK_FRC_SHIFT 1 /* AIF2TX_LRCLK_FRC */ | ||
2159 | #define WM8915_AIF2TX_LRCLK_FRC_WIDTH 1 /* AIF2TX_LRCLK_FRC */ | ||
2160 | #define WM8915_AIF2TX_LRCLK_MSTR 0x0001 /* AIF2TX_LRCLK_MSTR */ | ||
2161 | #define WM8915_AIF2TX_LRCLK_MSTR_MASK 0x0001 /* AIF2TX_LRCLK_MSTR */ | ||
2162 | #define WM8915_AIF2TX_LRCLK_MSTR_SHIFT 0 /* AIF2TX_LRCLK_MSTR */ | ||
2163 | #define WM8915_AIF2TX_LRCLK_MSTR_WIDTH 1 /* AIF2TX_LRCLK_MSTR */ | ||
2164 | |||
2165 | /* | ||
2166 | * R804 (0x324) - AIF2 RX LRCLK(1) | ||
2167 | */ | ||
2168 | #define WM8915_AIF2RX_RATE_MASK 0x07FF /* AIF2RX_RATE - [10:0] */ | ||
2169 | #define WM8915_AIF2RX_RATE_SHIFT 0 /* AIF2RX_RATE - [10:0] */ | ||
2170 | #define WM8915_AIF2RX_RATE_WIDTH 11 /* AIF2RX_RATE - [10:0] */ | ||
2171 | |||
2172 | /* | ||
2173 | * R805 (0x325) - AIF2 RX LRCLK(2) | ||
2174 | */ | ||
2175 | #define WM8915_AIF2RX_LRCLK_INV 0x0004 /* AIF2RX_LRCLK_INV */ | ||
2176 | #define WM8915_AIF2RX_LRCLK_INV_MASK 0x0004 /* AIF2RX_LRCLK_INV */ | ||
2177 | #define WM8915_AIF2RX_LRCLK_INV_SHIFT 2 /* AIF2RX_LRCLK_INV */ | ||
2178 | #define WM8915_AIF2RX_LRCLK_INV_WIDTH 1 /* AIF2RX_LRCLK_INV */ | ||
2179 | #define WM8915_AIF2RX_LRCLK_FRC 0x0002 /* AIF2RX_LRCLK_FRC */ | ||
2180 | #define WM8915_AIF2RX_LRCLK_FRC_MASK 0x0002 /* AIF2RX_LRCLK_FRC */ | ||
2181 | #define WM8915_AIF2RX_LRCLK_FRC_SHIFT 1 /* AIF2RX_LRCLK_FRC */ | ||
2182 | #define WM8915_AIF2RX_LRCLK_FRC_WIDTH 1 /* AIF2RX_LRCLK_FRC */ | ||
2183 | #define WM8915_AIF2RX_LRCLK_MSTR 0x0001 /* AIF2RX_LRCLK_MSTR */ | ||
2184 | #define WM8915_AIF2RX_LRCLK_MSTR_MASK 0x0001 /* AIF2RX_LRCLK_MSTR */ | ||
2185 | #define WM8915_AIF2RX_LRCLK_MSTR_SHIFT 0 /* AIF2RX_LRCLK_MSTR */ | ||
2186 | #define WM8915_AIF2RX_LRCLK_MSTR_WIDTH 1 /* AIF2RX_LRCLK_MSTR */ | ||
2187 | |||
2188 | /* | ||
2189 | * R806 (0x326) - AIF2TX Data Configuration (1) | ||
2190 | */ | ||
2191 | #define WM8915_AIF2TX_WL_MASK 0xFF00 /* AIF2TX_WL - [15:8] */ | ||
2192 | #define WM8915_AIF2TX_WL_SHIFT 8 /* AIF2TX_WL - [15:8] */ | ||
2193 | #define WM8915_AIF2TX_WL_WIDTH 8 /* AIF2TX_WL - [15:8] */ | ||
2194 | #define WM8915_AIF2TX_SLOT_LEN_MASK 0x00FF /* AIF2TX_SLOT_LEN - [7:0] */ | ||
2195 | #define WM8915_AIF2TX_SLOT_LEN_SHIFT 0 /* AIF2TX_SLOT_LEN - [7:0] */ | ||
2196 | #define WM8915_AIF2TX_SLOT_LEN_WIDTH 8 /* AIF2TX_SLOT_LEN - [7:0] */ | ||
2197 | |||
2198 | /* | ||
2199 | * R807 (0x327) - AIF2TX Data Configuration (2) | ||
2200 | */ | ||
2201 | #define WM8915_AIF2TX_DAT_TRI 0x0001 /* AIF2TX_DAT_TRI */ | ||
2202 | #define WM8915_AIF2TX_DAT_TRI_MASK 0x0001 /* AIF2TX_DAT_TRI */ | ||
2203 | #define WM8915_AIF2TX_DAT_TRI_SHIFT 0 /* AIF2TX_DAT_TRI */ | ||
2204 | #define WM8915_AIF2TX_DAT_TRI_WIDTH 1 /* AIF2TX_DAT_TRI */ | ||
2205 | |||
2206 | /* | ||
2207 | * R808 (0x328) - AIF2RX Data Configuration | ||
2208 | */ | ||
2209 | #define WM8915_AIF2RX_WL_MASK 0xFF00 /* AIF2RX_WL - [15:8] */ | ||
2210 | #define WM8915_AIF2RX_WL_SHIFT 8 /* AIF2RX_WL - [15:8] */ | ||
2211 | #define WM8915_AIF2RX_WL_WIDTH 8 /* AIF2RX_WL - [15:8] */ | ||
2212 | #define WM8915_AIF2RX_SLOT_LEN_MASK 0x00FF /* AIF2RX_SLOT_LEN - [7:0] */ | ||
2213 | #define WM8915_AIF2RX_SLOT_LEN_SHIFT 0 /* AIF2RX_SLOT_LEN - [7:0] */ | ||
2214 | #define WM8915_AIF2RX_SLOT_LEN_WIDTH 8 /* AIF2RX_SLOT_LEN - [7:0] */ | ||
2215 | |||
2216 | /* | ||
2217 | * R809 (0x329) - AIF2TX Channel 0 Configuration | ||
2218 | */ | ||
2219 | #define WM8915_AIF2TX_CHAN0_DAT_INV 0x8000 /* AIF2TX_CHAN0_DAT_INV */ | ||
2220 | #define WM8915_AIF2TX_CHAN0_DAT_INV_MASK 0x8000 /* AIF2TX_CHAN0_DAT_INV */ | ||
2221 | #define WM8915_AIF2TX_CHAN0_DAT_INV_SHIFT 15 /* AIF2TX_CHAN0_DAT_INV */ | ||
2222 | #define WM8915_AIF2TX_CHAN0_DAT_INV_WIDTH 1 /* AIF2TX_CHAN0_DAT_INV */ | ||
2223 | #define WM8915_AIF2TX_CHAN0_SPACING_MASK 0x7E00 /* AIF2TX_CHAN0_SPACING - [14:9] */ | ||
2224 | #define WM8915_AIF2TX_CHAN0_SPACING_SHIFT 9 /* AIF2TX_CHAN0_SPACING - [14:9] */ | ||
2225 | #define WM8915_AIF2TX_CHAN0_SPACING_WIDTH 6 /* AIF2TX_CHAN0_SPACING - [14:9] */ | ||
2226 | #define WM8915_AIF2TX_CHAN0_SLOTS_MASK 0x01C0 /* AIF2TX_CHAN0_SLOTS - [8:6] */ | ||
2227 | #define WM8915_AIF2TX_CHAN0_SLOTS_SHIFT 6 /* AIF2TX_CHAN0_SLOTS - [8:6] */ | ||
2228 | #define WM8915_AIF2TX_CHAN0_SLOTS_WIDTH 3 /* AIF2TX_CHAN0_SLOTS - [8:6] */ | ||
2229 | #define WM8915_AIF2TX_CHAN0_START_SLOT_MASK 0x003F /* AIF2TX_CHAN0_START_SLOT - [5:0] */ | ||
2230 | #define WM8915_AIF2TX_CHAN0_START_SLOT_SHIFT 0 /* AIF2TX_CHAN0_START_SLOT - [5:0] */ | ||
2231 | #define WM8915_AIF2TX_CHAN0_START_SLOT_WIDTH 6 /* AIF2TX_CHAN0_START_SLOT - [5:0] */ | ||
2232 | |||
2233 | /* | ||
2234 | * R810 (0x32A) - AIF2TX Channel 1 Configuration | ||
2235 | */ | ||
2236 | #define WM8915_AIF2TX_CHAN1_DAT_INV 0x8000 /* AIF2TX_CHAN1_DAT_INV */ | ||
2237 | #define WM8915_AIF2TX_CHAN1_DAT_INV_MASK 0x8000 /* AIF2TX_CHAN1_DAT_INV */ | ||
2238 | #define WM8915_AIF2TX_CHAN1_DAT_INV_SHIFT 15 /* AIF2TX_CHAN1_DAT_INV */ | ||
2239 | #define WM8915_AIF2TX_CHAN1_DAT_INV_WIDTH 1 /* AIF2TX_CHAN1_DAT_INV */ | ||
2240 | #define WM8915_AIF2TX_CHAN1_SPACING_MASK 0x7E00 /* AIF2TX_CHAN1_SPACING - [14:9] */ | ||
2241 | #define WM8915_AIF2TX_CHAN1_SPACING_SHIFT 9 /* AIF2TX_CHAN1_SPACING - [14:9] */ | ||
2242 | #define WM8915_AIF2TX_CHAN1_SPACING_WIDTH 6 /* AIF2TX_CHAN1_SPACING - [14:9] */ | ||
2243 | #define WM8915_AIF2TX_CHAN1_SLOTS_MASK 0x01C0 /* AIF2TX_CHAN1_SLOTS - [8:6] */ | ||
2244 | #define WM8915_AIF2TX_CHAN1_SLOTS_SHIFT 6 /* AIF2TX_CHAN1_SLOTS - [8:6] */ | ||
2245 | #define WM8915_AIF2TX_CHAN1_SLOTS_WIDTH 3 /* AIF2TX_CHAN1_SLOTS - [8:6] */ | ||
2246 | #define WM8915_AIF2TX_CHAN1_START_SLOT_MASK 0x003F /* AIF2TX_CHAN1_START_SLOT - [5:0] */ | ||
2247 | #define WM8915_AIF2TX_CHAN1_START_SLOT_SHIFT 0 /* AIF2TX_CHAN1_START_SLOT - [5:0] */ | ||
2248 | #define WM8915_AIF2TX_CHAN1_START_SLOT_WIDTH 6 /* AIF2TX_CHAN1_START_SLOT - [5:0] */ | ||
2249 | |||
2250 | /* | ||
2251 | * R811 (0x32B) - AIF2RX Channel 0 Configuration | ||
2252 | */ | ||
2253 | #define WM8915_AIF2RX_CHAN0_DAT_INV 0x8000 /* AIF2RX_CHAN0_DAT_INV */ | ||
2254 | #define WM8915_AIF2RX_CHAN0_DAT_INV_MASK 0x8000 /* AIF2RX_CHAN0_DAT_INV */ | ||
2255 | #define WM8915_AIF2RX_CHAN0_DAT_INV_SHIFT 15 /* AIF2RX_CHAN0_DAT_INV */ | ||
2256 | #define WM8915_AIF2RX_CHAN0_DAT_INV_WIDTH 1 /* AIF2RX_CHAN0_DAT_INV */ | ||
2257 | #define WM8915_AIF2RX_CHAN0_SPACING_MASK 0x7E00 /* AIF2RX_CHAN0_SPACING - [14:9] */ | ||
2258 | #define WM8915_AIF2RX_CHAN0_SPACING_SHIFT 9 /* AIF2RX_CHAN0_SPACING - [14:9] */ | ||
2259 | #define WM8915_AIF2RX_CHAN0_SPACING_WIDTH 6 /* AIF2RX_CHAN0_SPACING - [14:9] */ | ||
2260 | #define WM8915_AIF2RX_CHAN0_SLOTS_MASK 0x01C0 /* AIF2RX_CHAN0_SLOTS - [8:6] */ | ||
2261 | #define WM8915_AIF2RX_CHAN0_SLOTS_SHIFT 6 /* AIF2RX_CHAN0_SLOTS - [8:6] */ | ||
2262 | #define WM8915_AIF2RX_CHAN0_SLOTS_WIDTH 3 /* AIF2RX_CHAN0_SLOTS - [8:6] */ | ||
2263 | #define WM8915_AIF2RX_CHAN0_START_SLOT_MASK 0x003F /* AIF2RX_CHAN0_START_SLOT - [5:0] */ | ||
2264 | #define WM8915_AIF2RX_CHAN0_START_SLOT_SHIFT 0 /* AIF2RX_CHAN0_START_SLOT - [5:0] */ | ||
2265 | #define WM8915_AIF2RX_CHAN0_START_SLOT_WIDTH 6 /* AIF2RX_CHAN0_START_SLOT - [5:0] */ | ||
2266 | |||
2267 | /* | ||
2268 | * R812 (0x32C) - AIF2RX Channel 1 Configuration | ||
2269 | */ | ||
2270 | #define WM8915_AIF2RX_CHAN1_DAT_INV 0x8000 /* AIF2RX_CHAN1_DAT_INV */ | ||
2271 | #define WM8915_AIF2RX_CHAN1_DAT_INV_MASK 0x8000 /* AIF2RX_CHAN1_DAT_INV */ | ||
2272 | #define WM8915_AIF2RX_CHAN1_DAT_INV_SHIFT 15 /* AIF2RX_CHAN1_DAT_INV */ | ||
2273 | #define WM8915_AIF2RX_CHAN1_DAT_INV_WIDTH 1 /* AIF2RX_CHAN1_DAT_INV */ | ||
2274 | #define WM8915_AIF2RX_CHAN1_SPACING_MASK 0x7E00 /* AIF2RX_CHAN1_SPACING - [14:9] */ | ||
2275 | #define WM8915_AIF2RX_CHAN1_SPACING_SHIFT 9 /* AIF2RX_CHAN1_SPACING - [14:9] */ | ||
2276 | #define WM8915_AIF2RX_CHAN1_SPACING_WIDTH 6 /* AIF2RX_CHAN1_SPACING - [14:9] */ | ||
2277 | #define WM8915_AIF2RX_CHAN1_SLOTS_MASK 0x01C0 /* AIF2RX_CHAN1_SLOTS - [8:6] */ | ||
2278 | #define WM8915_AIF2RX_CHAN1_SLOTS_SHIFT 6 /* AIF2RX_CHAN1_SLOTS - [8:6] */ | ||
2279 | #define WM8915_AIF2RX_CHAN1_SLOTS_WIDTH 3 /* AIF2RX_CHAN1_SLOTS - [8:6] */ | ||
2280 | #define WM8915_AIF2RX_CHAN1_START_SLOT_MASK 0x003F /* AIF2RX_CHAN1_START_SLOT - [5:0] */ | ||
2281 | #define WM8915_AIF2RX_CHAN1_START_SLOT_SHIFT 0 /* AIF2RX_CHAN1_START_SLOT - [5:0] */ | ||
2282 | #define WM8915_AIF2RX_CHAN1_START_SLOT_WIDTH 6 /* AIF2RX_CHAN1_START_SLOT - [5:0] */ | ||
2283 | |||
2284 | /* | ||
2285 | * R813 (0x32D) - AIF2RX Mono Configuration | ||
2286 | */ | ||
2287 | #define WM8915_AIF2RX_CHAN0_MONO_MODE 0x0001 /* AIF2RX_CHAN0_MONO_MODE */ | ||
2288 | #define WM8915_AIF2RX_CHAN0_MONO_MODE_MASK 0x0001 /* AIF2RX_CHAN0_MONO_MODE */ | ||
2289 | #define WM8915_AIF2RX_CHAN0_MONO_MODE_SHIFT 0 /* AIF2RX_CHAN0_MONO_MODE */ | ||
2290 | #define WM8915_AIF2RX_CHAN0_MONO_MODE_WIDTH 1 /* AIF2RX_CHAN0_MONO_MODE */ | ||
2291 | |||
2292 | /* | ||
2293 | * R815 (0x32F) - AIF2TX Test | ||
2294 | */ | ||
2295 | #define WM8915_AIF2TX_DITHER_ENA 0x0001 /* AIF2TX_DITHER_ENA */ | ||
2296 | #define WM8915_AIF2TX_DITHER_ENA_MASK 0x0001 /* AIF2TX_DITHER_ENA */ | ||
2297 | #define WM8915_AIF2TX_DITHER_ENA_SHIFT 0 /* AIF2TX_DITHER_ENA */ | ||
2298 | #define WM8915_AIF2TX_DITHER_ENA_WIDTH 1 /* AIF2TX_DITHER_ENA */ | ||
2299 | |||
2300 | /* | ||
2301 | * R1024 (0x400) - DSP1 TX Left Volume | ||
2302 | */ | ||
2303 | #define WM8915_DSP1TX_VU 0x0100 /* DSP1TX_VU */ | ||
2304 | #define WM8915_DSP1TX_VU_MASK 0x0100 /* DSP1TX_VU */ | ||
2305 | #define WM8915_DSP1TX_VU_SHIFT 8 /* DSP1TX_VU */ | ||
2306 | #define WM8915_DSP1TX_VU_WIDTH 1 /* DSP1TX_VU */ | ||
2307 | #define WM8915_DSP1TXL_VOL_MASK 0x00FF /* DSP1TXL_VOL - [7:0] */ | ||
2308 | #define WM8915_DSP1TXL_VOL_SHIFT 0 /* DSP1TXL_VOL - [7:0] */ | ||
2309 | #define WM8915_DSP1TXL_VOL_WIDTH 8 /* DSP1TXL_VOL - [7:0] */ | ||
2310 | |||
2311 | /* | ||
2312 | * R1025 (0x401) - DSP1 TX Right Volume | ||
2313 | */ | ||
2314 | #define WM8915_DSP1TX_VU 0x0100 /* DSP1TX_VU */ | ||
2315 | #define WM8915_DSP1TX_VU_MASK 0x0100 /* DSP1TX_VU */ | ||
2316 | #define WM8915_DSP1TX_VU_SHIFT 8 /* DSP1TX_VU */ | ||
2317 | #define WM8915_DSP1TX_VU_WIDTH 1 /* DSP1TX_VU */ | ||
2318 | #define WM8915_DSP1TXR_VOL_MASK 0x00FF /* DSP1TXR_VOL - [7:0] */ | ||
2319 | #define WM8915_DSP1TXR_VOL_SHIFT 0 /* DSP1TXR_VOL - [7:0] */ | ||
2320 | #define WM8915_DSP1TXR_VOL_WIDTH 8 /* DSP1TXR_VOL - [7:0] */ | ||
2321 | |||
2322 | /* | ||
2323 | * R1026 (0x402) - DSP1 RX Left Volume | ||
2324 | */ | ||
2325 | #define WM8915_DSP1RX_VU 0x0100 /* DSP1RX_VU */ | ||
2326 | #define WM8915_DSP1RX_VU_MASK 0x0100 /* DSP1RX_VU */ | ||
2327 | #define WM8915_DSP1RX_VU_SHIFT 8 /* DSP1RX_VU */ | ||
2328 | #define WM8915_DSP1RX_VU_WIDTH 1 /* DSP1RX_VU */ | ||
2329 | #define WM8915_DSP1RXL_VOL_MASK 0x00FF /* DSP1RXL_VOL - [7:0] */ | ||
2330 | #define WM8915_DSP1RXL_VOL_SHIFT 0 /* DSP1RXL_VOL - [7:0] */ | ||
2331 | #define WM8915_DSP1RXL_VOL_WIDTH 8 /* DSP1RXL_VOL - [7:0] */ | ||
2332 | |||
2333 | /* | ||
2334 | * R1027 (0x403) - DSP1 RX Right Volume | ||
2335 | */ | ||
2336 | #define WM8915_DSP1RX_VU 0x0100 /* DSP1RX_VU */ | ||
2337 | #define WM8915_DSP1RX_VU_MASK 0x0100 /* DSP1RX_VU */ | ||
2338 | #define WM8915_DSP1RX_VU_SHIFT 8 /* DSP1RX_VU */ | ||
2339 | #define WM8915_DSP1RX_VU_WIDTH 1 /* DSP1RX_VU */ | ||
2340 | #define WM8915_DSP1RXR_VOL_MASK 0x00FF /* DSP1RXR_VOL - [7:0] */ | ||
2341 | #define WM8915_DSP1RXR_VOL_SHIFT 0 /* DSP1RXR_VOL - [7:0] */ | ||
2342 | #define WM8915_DSP1RXR_VOL_WIDTH 8 /* DSP1RXR_VOL - [7:0] */ | ||
2343 | |||
2344 | /* | ||
2345 | * R1040 (0x410) - DSP1 TX Filters | ||
2346 | */ | ||
2347 | #define WM8915_DSP1TX_NF 0x2000 /* DSP1TX_NF */ | ||
2348 | #define WM8915_DSP1TX_NF_MASK 0x2000 /* DSP1TX_NF */ | ||
2349 | #define WM8915_DSP1TX_NF_SHIFT 13 /* DSP1TX_NF */ | ||
2350 | #define WM8915_DSP1TX_NF_WIDTH 1 /* DSP1TX_NF */ | ||
2351 | #define WM8915_DSP1TXL_HPF 0x1000 /* DSP1TXL_HPF */ | ||
2352 | #define WM8915_DSP1TXL_HPF_MASK 0x1000 /* DSP1TXL_HPF */ | ||
2353 | #define WM8915_DSP1TXL_HPF_SHIFT 12 /* DSP1TXL_HPF */ | ||
2354 | #define WM8915_DSP1TXL_HPF_WIDTH 1 /* DSP1TXL_HPF */ | ||
2355 | #define WM8915_DSP1TXR_HPF 0x0800 /* DSP1TXR_HPF */ | ||
2356 | #define WM8915_DSP1TXR_HPF_MASK 0x0800 /* DSP1TXR_HPF */ | ||
2357 | #define WM8915_DSP1TXR_HPF_SHIFT 11 /* DSP1TXR_HPF */ | ||
2358 | #define WM8915_DSP1TXR_HPF_WIDTH 1 /* DSP1TXR_HPF */ | ||
2359 | #define WM8915_DSP1TX_HPF_MODE_MASK 0x0018 /* DSP1TX_HPF_MODE - [4:3] */ | ||
2360 | #define WM8915_DSP1TX_HPF_MODE_SHIFT 3 /* DSP1TX_HPF_MODE - [4:3] */ | ||
2361 | #define WM8915_DSP1TX_HPF_MODE_WIDTH 2 /* DSP1TX_HPF_MODE - [4:3] */ | ||
2362 | #define WM8915_DSP1TX_HPF_CUT_MASK 0x0007 /* DSP1TX_HPF_CUT - [2:0] */ | ||
2363 | #define WM8915_DSP1TX_HPF_CUT_SHIFT 0 /* DSP1TX_HPF_CUT - [2:0] */ | ||
2364 | #define WM8915_DSP1TX_HPF_CUT_WIDTH 3 /* DSP1TX_HPF_CUT - [2:0] */ | ||
2365 | |||
2366 | /* | ||
2367 | * R1056 (0x420) - DSP1 RX Filters (1) | ||
2368 | */ | ||
2369 | #define WM8915_DSP1RX_MUTE 0x0200 /* DSP1RX_MUTE */ | ||
2370 | #define WM8915_DSP1RX_MUTE_MASK 0x0200 /* DSP1RX_MUTE */ | ||
2371 | #define WM8915_DSP1RX_MUTE_SHIFT 9 /* DSP1RX_MUTE */ | ||
2372 | #define WM8915_DSP1RX_MUTE_WIDTH 1 /* DSP1RX_MUTE */ | ||
2373 | #define WM8915_DSP1RX_MONO 0x0080 /* DSP1RX_MONO */ | ||
2374 | #define WM8915_DSP1RX_MONO_MASK 0x0080 /* DSP1RX_MONO */ | ||
2375 | #define WM8915_DSP1RX_MONO_SHIFT 7 /* DSP1RX_MONO */ | ||
2376 | #define WM8915_DSP1RX_MONO_WIDTH 1 /* DSP1RX_MONO */ | ||
2377 | #define WM8915_DSP1RX_MUTERATE 0x0020 /* DSP1RX_MUTERATE */ | ||
2378 | #define WM8915_DSP1RX_MUTERATE_MASK 0x0020 /* DSP1RX_MUTERATE */ | ||
2379 | #define WM8915_DSP1RX_MUTERATE_SHIFT 5 /* DSP1RX_MUTERATE */ | ||
2380 | #define WM8915_DSP1RX_MUTERATE_WIDTH 1 /* DSP1RX_MUTERATE */ | ||
2381 | #define WM8915_DSP1RX_UNMUTE_RAMP 0x0010 /* DSP1RX_UNMUTE_RAMP */ | ||
2382 | #define WM8915_DSP1RX_UNMUTE_RAMP_MASK 0x0010 /* DSP1RX_UNMUTE_RAMP */ | ||
2383 | #define WM8915_DSP1RX_UNMUTE_RAMP_SHIFT 4 /* DSP1RX_UNMUTE_RAMP */ | ||
2384 | #define WM8915_DSP1RX_UNMUTE_RAMP_WIDTH 1 /* DSP1RX_UNMUTE_RAMP */ | ||
2385 | |||
2386 | /* | ||
2387 | * R1057 (0x421) - DSP1 RX Filters (2) | ||
2388 | */ | ||
2389 | #define WM8915_DSP1RX_3D_GAIN_MASK 0x3E00 /* DSP1RX_3D_GAIN - [13:9] */ | ||
2390 | #define WM8915_DSP1RX_3D_GAIN_SHIFT 9 /* DSP1RX_3D_GAIN - [13:9] */ | ||
2391 | #define WM8915_DSP1RX_3D_GAIN_WIDTH 5 /* DSP1RX_3D_GAIN - [13:9] */ | ||
2392 | #define WM8915_DSP1RX_3D_ENA 0x0100 /* DSP1RX_3D_ENA */ | ||
2393 | #define WM8915_DSP1RX_3D_ENA_MASK 0x0100 /* DSP1RX_3D_ENA */ | ||
2394 | #define WM8915_DSP1RX_3D_ENA_SHIFT 8 /* DSP1RX_3D_ENA */ | ||
2395 | #define WM8915_DSP1RX_3D_ENA_WIDTH 1 /* DSP1RX_3D_ENA */ | ||
2396 | |||
2397 | /* | ||
2398 | * R1088 (0x440) - DSP1 DRC (1) | ||
2399 | */ | ||
2400 | #define WM8915_DSP1DRC_SIG_DET_RMS_MASK 0xF800 /* DSP1DRC_SIG_DET_RMS - [15:11] */ | ||
2401 | #define WM8915_DSP1DRC_SIG_DET_RMS_SHIFT 11 /* DSP1DRC_SIG_DET_RMS - [15:11] */ | ||
2402 | #define WM8915_DSP1DRC_SIG_DET_RMS_WIDTH 5 /* DSP1DRC_SIG_DET_RMS - [15:11] */ | ||
2403 | #define WM8915_DSP1DRC_SIG_DET_PK_MASK 0x0600 /* DSP1DRC_SIG_DET_PK - [10:9] */ | ||
2404 | #define WM8915_DSP1DRC_SIG_DET_PK_SHIFT 9 /* DSP1DRC_SIG_DET_PK - [10:9] */ | ||
2405 | #define WM8915_DSP1DRC_SIG_DET_PK_WIDTH 2 /* DSP1DRC_SIG_DET_PK - [10:9] */ | ||
2406 | #define WM8915_DSP1DRC_NG_ENA 0x0100 /* DSP1DRC_NG_ENA */ | ||
2407 | #define WM8915_DSP1DRC_NG_ENA_MASK 0x0100 /* DSP1DRC_NG_ENA */ | ||
2408 | #define WM8915_DSP1DRC_NG_ENA_SHIFT 8 /* DSP1DRC_NG_ENA */ | ||
2409 | #define WM8915_DSP1DRC_NG_ENA_WIDTH 1 /* DSP1DRC_NG_ENA */ | ||
2410 | #define WM8915_DSP1DRC_SIG_DET_MODE 0x0080 /* DSP1DRC_SIG_DET_MODE */ | ||
2411 | #define WM8915_DSP1DRC_SIG_DET_MODE_MASK 0x0080 /* DSP1DRC_SIG_DET_MODE */ | ||
2412 | #define WM8915_DSP1DRC_SIG_DET_MODE_SHIFT 7 /* DSP1DRC_SIG_DET_MODE */ | ||
2413 | #define WM8915_DSP1DRC_SIG_DET_MODE_WIDTH 1 /* DSP1DRC_SIG_DET_MODE */ | ||
2414 | #define WM8915_DSP1DRC_SIG_DET 0x0040 /* DSP1DRC_SIG_DET */ | ||
2415 | #define WM8915_DSP1DRC_SIG_DET_MASK 0x0040 /* DSP1DRC_SIG_DET */ | ||
2416 | #define WM8915_DSP1DRC_SIG_DET_SHIFT 6 /* DSP1DRC_SIG_DET */ | ||
2417 | #define WM8915_DSP1DRC_SIG_DET_WIDTH 1 /* DSP1DRC_SIG_DET */ | ||
2418 | #define WM8915_DSP1DRC_KNEE2_OP_ENA 0x0020 /* DSP1DRC_KNEE2_OP_ENA */ | ||
2419 | #define WM8915_DSP1DRC_KNEE2_OP_ENA_MASK 0x0020 /* DSP1DRC_KNEE2_OP_ENA */ | ||
2420 | #define WM8915_DSP1DRC_KNEE2_OP_ENA_SHIFT 5 /* DSP1DRC_KNEE2_OP_ENA */ | ||
2421 | #define WM8915_DSP1DRC_KNEE2_OP_ENA_WIDTH 1 /* DSP1DRC_KNEE2_OP_ENA */ | ||
2422 | #define WM8915_DSP1DRC_QR 0x0010 /* DSP1DRC_QR */ | ||
2423 | #define WM8915_DSP1DRC_QR_MASK 0x0010 /* DSP1DRC_QR */ | ||
2424 | #define WM8915_DSP1DRC_QR_SHIFT 4 /* DSP1DRC_QR */ | ||
2425 | #define WM8915_DSP1DRC_QR_WIDTH 1 /* DSP1DRC_QR */ | ||
2426 | #define WM8915_DSP1DRC_ANTICLIP 0x0008 /* DSP1DRC_ANTICLIP */ | ||
2427 | #define WM8915_DSP1DRC_ANTICLIP_MASK 0x0008 /* DSP1DRC_ANTICLIP */ | ||
2428 | #define WM8915_DSP1DRC_ANTICLIP_SHIFT 3 /* DSP1DRC_ANTICLIP */ | ||
2429 | #define WM8915_DSP1DRC_ANTICLIP_WIDTH 1 /* DSP1DRC_ANTICLIP */ | ||
2430 | #define WM8915_DSP1RX_DRC_ENA 0x0004 /* DSP1RX_DRC_ENA */ | ||
2431 | #define WM8915_DSP1RX_DRC_ENA_MASK 0x0004 /* DSP1RX_DRC_ENA */ | ||
2432 | #define WM8915_DSP1RX_DRC_ENA_SHIFT 2 /* DSP1RX_DRC_ENA */ | ||
2433 | #define WM8915_DSP1RX_DRC_ENA_WIDTH 1 /* DSP1RX_DRC_ENA */ | ||
2434 | #define WM8915_DSP1TXL_DRC_ENA 0x0002 /* DSP1TXL_DRC_ENA */ | ||
2435 | #define WM8915_DSP1TXL_DRC_ENA_MASK 0x0002 /* DSP1TXL_DRC_ENA */ | ||
2436 | #define WM8915_DSP1TXL_DRC_ENA_SHIFT 1 /* DSP1TXL_DRC_ENA */ | ||
2437 | #define WM8915_DSP1TXL_DRC_ENA_WIDTH 1 /* DSP1TXL_DRC_ENA */ | ||
2438 | #define WM8915_DSP1TXR_DRC_ENA 0x0001 /* DSP1TXR_DRC_ENA */ | ||
2439 | #define WM8915_DSP1TXR_DRC_ENA_MASK 0x0001 /* DSP1TXR_DRC_ENA */ | ||
2440 | #define WM8915_DSP1TXR_DRC_ENA_SHIFT 0 /* DSP1TXR_DRC_ENA */ | ||
2441 | #define WM8915_DSP1TXR_DRC_ENA_WIDTH 1 /* DSP1TXR_DRC_ENA */ | ||
2442 | |||
2443 | /* | ||
2444 | * R1089 (0x441) - DSP1 DRC (2) | ||
2445 | */ | ||
2446 | #define WM8915_DSP1DRC_ATK_MASK 0x1E00 /* DSP1DRC_ATK - [12:9] */ | ||
2447 | #define WM8915_DSP1DRC_ATK_SHIFT 9 /* DSP1DRC_ATK - [12:9] */ | ||
2448 | #define WM8915_DSP1DRC_ATK_WIDTH 4 /* DSP1DRC_ATK - [12:9] */ | ||
2449 | #define WM8915_DSP1DRC_DCY_MASK 0x01E0 /* DSP1DRC_DCY - [8:5] */ | ||
2450 | #define WM8915_DSP1DRC_DCY_SHIFT 5 /* DSP1DRC_DCY - [8:5] */ | ||
2451 | #define WM8915_DSP1DRC_DCY_WIDTH 4 /* DSP1DRC_DCY - [8:5] */ | ||
2452 | #define WM8915_DSP1DRC_MINGAIN_MASK 0x001C /* DSP1DRC_MINGAIN - [4:2] */ | ||
2453 | #define WM8915_DSP1DRC_MINGAIN_SHIFT 2 /* DSP1DRC_MINGAIN - [4:2] */ | ||
2454 | #define WM8915_DSP1DRC_MINGAIN_WIDTH 3 /* DSP1DRC_MINGAIN - [4:2] */ | ||
2455 | #define WM8915_DSP1DRC_MAXGAIN_MASK 0x0003 /* DSP1DRC_MAXGAIN - [1:0] */ | ||
2456 | #define WM8915_DSP1DRC_MAXGAIN_SHIFT 0 /* DSP1DRC_MAXGAIN - [1:0] */ | ||
2457 | #define WM8915_DSP1DRC_MAXGAIN_WIDTH 2 /* DSP1DRC_MAXGAIN - [1:0] */ | ||
2458 | |||
2459 | /* | ||
2460 | * R1090 (0x442) - DSP1 DRC (3) | ||
2461 | */ | ||
2462 | #define WM8915_DSP1DRC_NG_MINGAIN_MASK 0xF000 /* DSP1DRC_NG_MINGAIN - [15:12] */ | ||
2463 | #define WM8915_DSP1DRC_NG_MINGAIN_SHIFT 12 /* DSP1DRC_NG_MINGAIN - [15:12] */ | ||
2464 | #define WM8915_DSP1DRC_NG_MINGAIN_WIDTH 4 /* DSP1DRC_NG_MINGAIN - [15:12] */ | ||
2465 | #define WM8915_DSP1DRC_NG_EXP_MASK 0x0C00 /* DSP1DRC_NG_EXP - [11:10] */ | ||
2466 | #define WM8915_DSP1DRC_NG_EXP_SHIFT 10 /* DSP1DRC_NG_EXP - [11:10] */ | ||
2467 | #define WM8915_DSP1DRC_NG_EXP_WIDTH 2 /* DSP1DRC_NG_EXP - [11:10] */ | ||
2468 | #define WM8915_DSP1DRC_QR_THR_MASK 0x0300 /* DSP1DRC_QR_THR - [9:8] */ | ||
2469 | #define WM8915_DSP1DRC_QR_THR_SHIFT 8 /* DSP1DRC_QR_THR - [9:8] */ | ||
2470 | #define WM8915_DSP1DRC_QR_THR_WIDTH 2 /* DSP1DRC_QR_THR - [9:8] */ | ||
2471 | #define WM8915_DSP1DRC_QR_DCY_MASK 0x00C0 /* DSP1DRC_QR_DCY - [7:6] */ | ||
2472 | #define WM8915_DSP1DRC_QR_DCY_SHIFT 6 /* DSP1DRC_QR_DCY - [7:6] */ | ||
2473 | #define WM8915_DSP1DRC_QR_DCY_WIDTH 2 /* DSP1DRC_QR_DCY - [7:6] */ | ||
2474 | #define WM8915_DSP1DRC_HI_COMP_MASK 0x0038 /* DSP1DRC_HI_COMP - [5:3] */ | ||
2475 | #define WM8915_DSP1DRC_HI_COMP_SHIFT 3 /* DSP1DRC_HI_COMP - [5:3] */ | ||
2476 | #define WM8915_DSP1DRC_HI_COMP_WIDTH 3 /* DSP1DRC_HI_COMP - [5:3] */ | ||
2477 | #define WM8915_DSP1DRC_LO_COMP_MASK 0x0007 /* DSP1DRC_LO_COMP - [2:0] */ | ||
2478 | #define WM8915_DSP1DRC_LO_COMP_SHIFT 0 /* DSP1DRC_LO_COMP - [2:0] */ | ||
2479 | #define WM8915_DSP1DRC_LO_COMP_WIDTH 3 /* DSP1DRC_LO_COMP - [2:0] */ | ||
2480 | |||
2481 | /* | ||
2482 | * R1091 (0x443) - DSP1 DRC (4) | ||
2483 | */ | ||
2484 | #define WM8915_DSP1DRC_KNEE_IP_MASK 0x07E0 /* DSP1DRC_KNEE_IP - [10:5] */ | ||
2485 | #define WM8915_DSP1DRC_KNEE_IP_SHIFT 5 /* DSP1DRC_KNEE_IP - [10:5] */ | ||
2486 | #define WM8915_DSP1DRC_KNEE_IP_WIDTH 6 /* DSP1DRC_KNEE_IP - [10:5] */ | ||
2487 | #define WM8915_DSP1DRC_KNEE_OP_MASK 0x001F /* DSP1DRC_KNEE_OP - [4:0] */ | ||
2488 | #define WM8915_DSP1DRC_KNEE_OP_SHIFT 0 /* DSP1DRC_KNEE_OP - [4:0] */ | ||
2489 | #define WM8915_DSP1DRC_KNEE_OP_WIDTH 5 /* DSP1DRC_KNEE_OP - [4:0] */ | ||
2490 | |||
2491 | /* | ||
2492 | * R1092 (0x444) - DSP1 DRC (5) | ||
2493 | */ | ||
2494 | #define WM8915_DSP1DRC_KNEE2_IP_MASK 0x03E0 /* DSP1DRC_KNEE2_IP - [9:5] */ | ||
2495 | #define WM8915_DSP1DRC_KNEE2_IP_SHIFT 5 /* DSP1DRC_KNEE2_IP - [9:5] */ | ||
2496 | #define WM8915_DSP1DRC_KNEE2_IP_WIDTH 5 /* DSP1DRC_KNEE2_IP - [9:5] */ | ||
2497 | #define WM8915_DSP1DRC_KNEE2_OP_MASK 0x001F /* DSP1DRC_KNEE2_OP - [4:0] */ | ||
2498 | #define WM8915_DSP1DRC_KNEE2_OP_SHIFT 0 /* DSP1DRC_KNEE2_OP - [4:0] */ | ||
2499 | #define WM8915_DSP1DRC_KNEE2_OP_WIDTH 5 /* DSP1DRC_KNEE2_OP - [4:0] */ | ||
2500 | |||
2501 | /* | ||
2502 | * R1152 (0x480) - DSP1 RX EQ Gains (1) | ||
2503 | */ | ||
2504 | #define WM8915_DSP1RX_EQ_B1_GAIN_MASK 0xF800 /* DSP1RX_EQ_B1_GAIN - [15:11] */ | ||
2505 | #define WM8915_DSP1RX_EQ_B1_GAIN_SHIFT 11 /* DSP1RX_EQ_B1_GAIN - [15:11] */ | ||
2506 | #define WM8915_DSP1RX_EQ_B1_GAIN_WIDTH 5 /* DSP1RX_EQ_B1_GAIN - [15:11] */ | ||
2507 | #define WM8915_DSP1RX_EQ_B2_GAIN_MASK 0x07C0 /* DSP1RX_EQ_B2_GAIN - [10:6] */ | ||
2508 | #define WM8915_DSP1RX_EQ_B2_GAIN_SHIFT 6 /* DSP1RX_EQ_B2_GAIN - [10:6] */ | ||
2509 | #define WM8915_DSP1RX_EQ_B2_GAIN_WIDTH 5 /* DSP1RX_EQ_B2_GAIN - [10:6] */ | ||
2510 | #define WM8915_DSP1RX_EQ_B3_GAIN_MASK 0x003E /* DSP1RX_EQ_B3_GAIN - [5:1] */ | ||
2511 | #define WM8915_DSP1RX_EQ_B3_GAIN_SHIFT 1 /* DSP1RX_EQ_B3_GAIN - [5:1] */ | ||
2512 | #define WM8915_DSP1RX_EQ_B3_GAIN_WIDTH 5 /* DSP1RX_EQ_B3_GAIN - [5:1] */ | ||
2513 | #define WM8915_DSP1RX_EQ_ENA 0x0001 /* DSP1RX_EQ_ENA */ | ||
2514 | #define WM8915_DSP1RX_EQ_ENA_MASK 0x0001 /* DSP1RX_EQ_ENA */ | ||
2515 | #define WM8915_DSP1RX_EQ_ENA_SHIFT 0 /* DSP1RX_EQ_ENA */ | ||
2516 | #define WM8915_DSP1RX_EQ_ENA_WIDTH 1 /* DSP1RX_EQ_ENA */ | ||
2517 | |||
2518 | /* | ||
2519 | * R1153 (0x481) - DSP1 RX EQ Gains (2) | ||
2520 | */ | ||
2521 | #define WM8915_DSP1RX_EQ_B4_GAIN_MASK 0xF800 /* DSP1RX_EQ_B4_GAIN - [15:11] */ | ||
2522 | #define WM8915_DSP1RX_EQ_B4_GAIN_SHIFT 11 /* DSP1RX_EQ_B4_GAIN - [15:11] */ | ||
2523 | #define WM8915_DSP1RX_EQ_B4_GAIN_WIDTH 5 /* DSP1RX_EQ_B4_GAIN - [15:11] */ | ||
2524 | #define WM8915_DSP1RX_EQ_B5_GAIN_MASK 0x07C0 /* DSP1RX_EQ_B5_GAIN - [10:6] */ | ||
2525 | #define WM8915_DSP1RX_EQ_B5_GAIN_SHIFT 6 /* DSP1RX_EQ_B5_GAIN - [10:6] */ | ||
2526 | #define WM8915_DSP1RX_EQ_B5_GAIN_WIDTH 5 /* DSP1RX_EQ_B5_GAIN - [10:6] */ | ||
2527 | |||
2528 | /* | ||
2529 | * R1154 (0x482) - DSP1 RX EQ Band 1 A | ||
2530 | */ | ||
2531 | #define WM8915_DSP1RX_EQ_B1_A_MASK 0xFFFF /* DSP1RX_EQ_B1_A - [15:0] */ | ||
2532 | #define WM8915_DSP1RX_EQ_B1_A_SHIFT 0 /* DSP1RX_EQ_B1_A - [15:0] */ | ||
2533 | #define WM8915_DSP1RX_EQ_B1_A_WIDTH 16 /* DSP1RX_EQ_B1_A - [15:0] */ | ||
2534 | |||
2535 | /* | ||
2536 | * R1155 (0x483) - DSP1 RX EQ Band 1 B | ||
2537 | */ | ||
2538 | #define WM8915_DSP1RX_EQ_B1_B_MASK 0xFFFF /* DSP1RX_EQ_B1_B - [15:0] */ | ||
2539 | #define WM8915_DSP1RX_EQ_B1_B_SHIFT 0 /* DSP1RX_EQ_B1_B - [15:0] */ | ||
2540 | #define WM8915_DSP1RX_EQ_B1_B_WIDTH 16 /* DSP1RX_EQ_B1_B - [15:0] */ | ||
2541 | |||
2542 | /* | ||
2543 | * R1156 (0x484) - DSP1 RX EQ Band 1 PG | ||
2544 | */ | ||
2545 | #define WM8915_DSP1RX_EQ_B1_PG_MASK 0xFFFF /* DSP1RX_EQ_B1_PG - [15:0] */ | ||
2546 | #define WM8915_DSP1RX_EQ_B1_PG_SHIFT 0 /* DSP1RX_EQ_B1_PG - [15:0] */ | ||
2547 | #define WM8915_DSP1RX_EQ_B1_PG_WIDTH 16 /* DSP1RX_EQ_B1_PG - [15:0] */ | ||
2548 | |||
2549 | /* | ||
2550 | * R1157 (0x485) - DSP1 RX EQ Band 2 A | ||
2551 | */ | ||
2552 | #define WM8915_DSP1RX_EQ_B2_A_MASK 0xFFFF /* DSP1RX_EQ_B2_A - [15:0] */ | ||
2553 | #define WM8915_DSP1RX_EQ_B2_A_SHIFT 0 /* DSP1RX_EQ_B2_A - [15:0] */ | ||
2554 | #define WM8915_DSP1RX_EQ_B2_A_WIDTH 16 /* DSP1RX_EQ_B2_A - [15:0] */ | ||
2555 | |||
2556 | /* | ||
2557 | * R1158 (0x486) - DSP1 RX EQ Band 2 B | ||
2558 | */ | ||
2559 | #define WM8915_DSP1RX_EQ_B2_B_MASK 0xFFFF /* DSP1RX_EQ_B2_B - [15:0] */ | ||
2560 | #define WM8915_DSP1RX_EQ_B2_B_SHIFT 0 /* DSP1RX_EQ_B2_B - [15:0] */ | ||
2561 | #define WM8915_DSP1RX_EQ_B2_B_WIDTH 16 /* DSP1RX_EQ_B2_B - [15:0] */ | ||
2562 | |||
2563 | /* | ||
2564 | * R1159 (0x487) - DSP1 RX EQ Band 2 C | ||
2565 | */ | ||
2566 | #define WM8915_DSP1RX_EQ_B2_C_MASK 0xFFFF /* DSP1RX_EQ_B2_C - [15:0] */ | ||
2567 | #define WM8915_DSP1RX_EQ_B2_C_SHIFT 0 /* DSP1RX_EQ_B2_C - [15:0] */ | ||
2568 | #define WM8915_DSP1RX_EQ_B2_C_WIDTH 16 /* DSP1RX_EQ_B2_C - [15:0] */ | ||
2569 | |||
2570 | /* | ||
2571 | * R1160 (0x488) - DSP1 RX EQ Band 2 PG | ||
2572 | */ | ||
2573 | #define WM8915_DSP1RX_EQ_B2_PG_MASK 0xFFFF /* DSP1RX_EQ_B2_PG - [15:0] */ | ||
2574 | #define WM8915_DSP1RX_EQ_B2_PG_SHIFT 0 /* DSP1RX_EQ_B2_PG - [15:0] */ | ||
2575 | #define WM8915_DSP1RX_EQ_B2_PG_WIDTH 16 /* DSP1RX_EQ_B2_PG - [15:0] */ | ||
2576 | |||
2577 | /* | ||
2578 | * R1161 (0x489) - DSP1 RX EQ Band 3 A | ||
2579 | */ | ||
2580 | #define WM8915_DSP1RX_EQ_B3_A_MASK 0xFFFF /* DSP1RX_EQ_B3_A - [15:0] */ | ||
2581 | #define WM8915_DSP1RX_EQ_B3_A_SHIFT 0 /* DSP1RX_EQ_B3_A - [15:0] */ | ||
2582 | #define WM8915_DSP1RX_EQ_B3_A_WIDTH 16 /* DSP1RX_EQ_B3_A - [15:0] */ | ||
2583 | |||
2584 | /* | ||
2585 | * R1162 (0x48A) - DSP1 RX EQ Band 3 B | ||
2586 | */ | ||
2587 | #define WM8915_DSP1RX_EQ_B3_B_MASK 0xFFFF /* DSP1RX_EQ_B3_B - [15:0] */ | ||
2588 | #define WM8915_DSP1RX_EQ_B3_B_SHIFT 0 /* DSP1RX_EQ_B3_B - [15:0] */ | ||
2589 | #define WM8915_DSP1RX_EQ_B3_B_WIDTH 16 /* DSP1RX_EQ_B3_B - [15:0] */ | ||
2590 | |||
2591 | /* | ||
2592 | * R1163 (0x48B) - DSP1 RX EQ Band 3 C | ||
2593 | */ | ||
2594 | #define WM8915_DSP1RX_EQ_B3_C_MASK 0xFFFF /* DSP1RX_EQ_B3_C - [15:0] */ | ||
2595 | #define WM8915_DSP1RX_EQ_B3_C_SHIFT 0 /* DSP1RX_EQ_B3_C - [15:0] */ | ||
2596 | #define WM8915_DSP1RX_EQ_B3_C_WIDTH 16 /* DSP1RX_EQ_B3_C - [15:0] */ | ||
2597 | |||
2598 | /* | ||
2599 | * R1164 (0x48C) - DSP1 RX EQ Band 3 PG | ||
2600 | */ | ||
2601 | #define WM8915_DSP1RX_EQ_B3_PG_MASK 0xFFFF /* DSP1RX_EQ_B3_PG - [15:0] */ | ||
2602 | #define WM8915_DSP1RX_EQ_B3_PG_SHIFT 0 /* DSP1RX_EQ_B3_PG - [15:0] */ | ||
2603 | #define WM8915_DSP1RX_EQ_B3_PG_WIDTH 16 /* DSP1RX_EQ_B3_PG - [15:0] */ | ||
2604 | |||
2605 | /* | ||
2606 | * R1165 (0x48D) - DSP1 RX EQ Band 4 A | ||
2607 | */ | ||
2608 | #define WM8915_DSP1RX_EQ_B4_A_MASK 0xFFFF /* DSP1RX_EQ_B4_A - [15:0] */ | ||
2609 | #define WM8915_DSP1RX_EQ_B4_A_SHIFT 0 /* DSP1RX_EQ_B4_A - [15:0] */ | ||
2610 | #define WM8915_DSP1RX_EQ_B4_A_WIDTH 16 /* DSP1RX_EQ_B4_A - [15:0] */ | ||
2611 | |||
2612 | /* | ||
2613 | * R1166 (0x48E) - DSP1 RX EQ Band 4 B | ||
2614 | */ | ||
2615 | #define WM8915_DSP1RX_EQ_B4_B_MASK 0xFFFF /* DSP1RX_EQ_B4_B - [15:0] */ | ||
2616 | #define WM8915_DSP1RX_EQ_B4_B_SHIFT 0 /* DSP1RX_EQ_B4_B - [15:0] */ | ||
2617 | #define WM8915_DSP1RX_EQ_B4_B_WIDTH 16 /* DSP1RX_EQ_B4_B - [15:0] */ | ||
2618 | |||
2619 | /* | ||
2620 | * R1167 (0x48F) - DSP1 RX EQ Band 4 C | ||
2621 | */ | ||
2622 | #define WM8915_DSP1RX_EQ_B4_C_MASK 0xFFFF /* DSP1RX_EQ_B4_C - [15:0] */ | ||
2623 | #define WM8915_DSP1RX_EQ_B4_C_SHIFT 0 /* DSP1RX_EQ_B4_C - [15:0] */ | ||
2624 | #define WM8915_DSP1RX_EQ_B4_C_WIDTH 16 /* DSP1RX_EQ_B4_C - [15:0] */ | ||
2625 | |||
2626 | /* | ||
2627 | * R1168 (0x490) - DSP1 RX EQ Band 4 PG | ||
2628 | */ | ||
2629 | #define WM8915_DSP1RX_EQ_B4_PG_MASK 0xFFFF /* DSP1RX_EQ_B4_PG - [15:0] */ | ||
2630 | #define WM8915_DSP1RX_EQ_B4_PG_SHIFT 0 /* DSP1RX_EQ_B4_PG - [15:0] */ | ||
2631 | #define WM8915_DSP1RX_EQ_B4_PG_WIDTH 16 /* DSP1RX_EQ_B4_PG - [15:0] */ | ||
2632 | |||
2633 | /* | ||
2634 | * R1169 (0x491) - DSP1 RX EQ Band 5 A | ||
2635 | */ | ||
2636 | #define WM8915_DSP1RX_EQ_B5_A_MASK 0xFFFF /* DSP1RX_EQ_B5_A - [15:0] */ | ||
2637 | #define WM8915_DSP1RX_EQ_B5_A_SHIFT 0 /* DSP1RX_EQ_B5_A - [15:0] */ | ||
2638 | #define WM8915_DSP1RX_EQ_B5_A_WIDTH 16 /* DSP1RX_EQ_B5_A - [15:0] */ | ||
2639 | |||
2640 | /* | ||
2641 | * R1170 (0x492) - DSP1 RX EQ Band 5 B | ||
2642 | */ | ||
2643 | #define WM8915_DSP1RX_EQ_B5_B_MASK 0xFFFF /* DSP1RX_EQ_B5_B - [15:0] */ | ||
2644 | #define WM8915_DSP1RX_EQ_B5_B_SHIFT 0 /* DSP1RX_EQ_B5_B - [15:0] */ | ||
2645 | #define WM8915_DSP1RX_EQ_B5_B_WIDTH 16 /* DSP1RX_EQ_B5_B - [15:0] */ | ||
2646 | |||
2647 | /* | ||
2648 | * R1171 (0x493) - DSP1 RX EQ Band 5 PG | ||
2649 | */ | ||
2650 | #define WM8915_DSP1RX_EQ_B5_PG_MASK 0xFFFF /* DSP1RX_EQ_B5_PG - [15:0] */ | ||
2651 | #define WM8915_DSP1RX_EQ_B5_PG_SHIFT 0 /* DSP1RX_EQ_B5_PG - [15:0] */ | ||
2652 | #define WM8915_DSP1RX_EQ_B5_PG_WIDTH 16 /* DSP1RX_EQ_B5_PG - [15:0] */ | ||
2653 | |||
2654 | /* | ||
2655 | * R1280 (0x500) - DSP2 TX Left Volume | ||
2656 | */ | ||
2657 | #define WM8915_DSP2TX_VU 0x0100 /* DSP2TX_VU */ | ||
2658 | #define WM8915_DSP2TX_VU_MASK 0x0100 /* DSP2TX_VU */ | ||
2659 | #define WM8915_DSP2TX_VU_SHIFT 8 /* DSP2TX_VU */ | ||
2660 | #define WM8915_DSP2TX_VU_WIDTH 1 /* DSP2TX_VU */ | ||
2661 | #define WM8915_DSP2TXL_VOL_MASK 0x00FF /* DSP2TXL_VOL - [7:0] */ | ||
2662 | #define WM8915_DSP2TXL_VOL_SHIFT 0 /* DSP2TXL_VOL - [7:0] */ | ||
2663 | #define WM8915_DSP2TXL_VOL_WIDTH 8 /* DSP2TXL_VOL - [7:0] */ | ||
2664 | |||
2665 | /* | ||
2666 | * R1281 (0x501) - DSP2 TX Right Volume | ||
2667 | */ | ||
2668 | #define WM8915_DSP2TX_VU 0x0100 /* DSP2TX_VU */ | ||
2669 | #define WM8915_DSP2TX_VU_MASK 0x0100 /* DSP2TX_VU */ | ||
2670 | #define WM8915_DSP2TX_VU_SHIFT 8 /* DSP2TX_VU */ | ||
2671 | #define WM8915_DSP2TX_VU_WIDTH 1 /* DSP2TX_VU */ | ||
2672 | #define WM8915_DSP2TXR_VOL_MASK 0x00FF /* DSP2TXR_VOL - [7:0] */ | ||
2673 | #define WM8915_DSP2TXR_VOL_SHIFT 0 /* DSP2TXR_VOL - [7:0] */ | ||
2674 | #define WM8915_DSP2TXR_VOL_WIDTH 8 /* DSP2TXR_VOL - [7:0] */ | ||
2675 | |||
2676 | /* | ||
2677 | * R1282 (0x502) - DSP2 RX Left Volume | ||
2678 | */ | ||
2679 | #define WM8915_DSP2RX_VU 0x0100 /* DSP2RX_VU */ | ||
2680 | #define WM8915_DSP2RX_VU_MASK 0x0100 /* DSP2RX_VU */ | ||
2681 | #define WM8915_DSP2RX_VU_SHIFT 8 /* DSP2RX_VU */ | ||
2682 | #define WM8915_DSP2RX_VU_WIDTH 1 /* DSP2RX_VU */ | ||
2683 | #define WM8915_DSP2RXL_VOL_MASK 0x00FF /* DSP2RXL_VOL - [7:0] */ | ||
2684 | #define WM8915_DSP2RXL_VOL_SHIFT 0 /* DSP2RXL_VOL - [7:0] */ | ||
2685 | #define WM8915_DSP2RXL_VOL_WIDTH 8 /* DSP2RXL_VOL - [7:0] */ | ||
2686 | |||
2687 | /* | ||
2688 | * R1283 (0x503) - DSP2 RX Right Volume | ||
2689 | */ | ||
2690 | #define WM8915_DSP2RX_VU 0x0100 /* DSP2RX_VU */ | ||
2691 | #define WM8915_DSP2RX_VU_MASK 0x0100 /* DSP2RX_VU */ | ||
2692 | #define WM8915_DSP2RX_VU_SHIFT 8 /* DSP2RX_VU */ | ||
2693 | #define WM8915_DSP2RX_VU_WIDTH 1 /* DSP2RX_VU */ | ||
2694 | #define WM8915_DSP2RXR_VOL_MASK 0x00FF /* DSP2RXR_VOL - [7:0] */ | ||
2695 | #define WM8915_DSP2RXR_VOL_SHIFT 0 /* DSP2RXR_VOL - [7:0] */ | ||
2696 | #define WM8915_DSP2RXR_VOL_WIDTH 8 /* DSP2RXR_VOL - [7:0] */ | ||
2697 | |||
2698 | /* | ||
2699 | * R1296 (0x510) - DSP2 TX Filters | ||
2700 | */ | ||
2701 | #define WM8915_DSP2TX_NF 0x2000 /* DSP2TX_NF */ | ||
2702 | #define WM8915_DSP2TX_NF_MASK 0x2000 /* DSP2TX_NF */ | ||
2703 | #define WM8915_DSP2TX_NF_SHIFT 13 /* DSP2TX_NF */ | ||
2704 | #define WM8915_DSP2TX_NF_WIDTH 1 /* DSP2TX_NF */ | ||
2705 | #define WM8915_DSP2TXL_HPF 0x1000 /* DSP2TXL_HPF */ | ||
2706 | #define WM8915_DSP2TXL_HPF_MASK 0x1000 /* DSP2TXL_HPF */ | ||
2707 | #define WM8915_DSP2TXL_HPF_SHIFT 12 /* DSP2TXL_HPF */ | ||
2708 | #define WM8915_DSP2TXL_HPF_WIDTH 1 /* DSP2TXL_HPF */ | ||
2709 | #define WM8915_DSP2TXR_HPF 0x0800 /* DSP2TXR_HPF */ | ||
2710 | #define WM8915_DSP2TXR_HPF_MASK 0x0800 /* DSP2TXR_HPF */ | ||
2711 | #define WM8915_DSP2TXR_HPF_SHIFT 11 /* DSP2TXR_HPF */ | ||
2712 | #define WM8915_DSP2TXR_HPF_WIDTH 1 /* DSP2TXR_HPF */ | ||
2713 | #define WM8915_DSP2TX_HPF_MODE_MASK 0x0018 /* DSP2TX_HPF_MODE - [4:3] */ | ||
2714 | #define WM8915_DSP2TX_HPF_MODE_SHIFT 3 /* DSP2TX_HPF_MODE - [4:3] */ | ||
2715 | #define WM8915_DSP2TX_HPF_MODE_WIDTH 2 /* DSP2TX_HPF_MODE - [4:3] */ | ||
2716 | #define WM8915_DSP2TX_HPF_CUT_MASK 0x0007 /* DSP2TX_HPF_CUT - [2:0] */ | ||
2717 | #define WM8915_DSP2TX_HPF_CUT_SHIFT 0 /* DSP2TX_HPF_CUT - [2:0] */ | ||
2718 | #define WM8915_DSP2TX_HPF_CUT_WIDTH 3 /* DSP2TX_HPF_CUT - [2:0] */ | ||
2719 | |||
2720 | /* | ||
2721 | * R1312 (0x520) - DSP2 RX Filters (1) | ||
2722 | */ | ||
2723 | #define WM8915_DSP2RX_MUTE 0x0200 /* DSP2RX_MUTE */ | ||
2724 | #define WM8915_DSP2RX_MUTE_MASK 0x0200 /* DSP2RX_MUTE */ | ||
2725 | #define WM8915_DSP2RX_MUTE_SHIFT 9 /* DSP2RX_MUTE */ | ||
2726 | #define WM8915_DSP2RX_MUTE_WIDTH 1 /* DSP2RX_MUTE */ | ||
2727 | #define WM8915_DSP2RX_MONO 0x0080 /* DSP2RX_MONO */ | ||
2728 | #define WM8915_DSP2RX_MONO_MASK 0x0080 /* DSP2RX_MONO */ | ||
2729 | #define WM8915_DSP2RX_MONO_SHIFT 7 /* DSP2RX_MONO */ | ||
2730 | #define WM8915_DSP2RX_MONO_WIDTH 1 /* DSP2RX_MONO */ | ||
2731 | #define WM8915_DSP2RX_MUTERATE 0x0020 /* DSP2RX_MUTERATE */ | ||
2732 | #define WM8915_DSP2RX_MUTERATE_MASK 0x0020 /* DSP2RX_MUTERATE */ | ||
2733 | #define WM8915_DSP2RX_MUTERATE_SHIFT 5 /* DSP2RX_MUTERATE */ | ||
2734 | #define WM8915_DSP2RX_MUTERATE_WIDTH 1 /* DSP2RX_MUTERATE */ | ||
2735 | #define WM8915_DSP2RX_UNMUTE_RAMP 0x0010 /* DSP2RX_UNMUTE_RAMP */ | ||
2736 | #define WM8915_DSP2RX_UNMUTE_RAMP_MASK 0x0010 /* DSP2RX_UNMUTE_RAMP */ | ||
2737 | #define WM8915_DSP2RX_UNMUTE_RAMP_SHIFT 4 /* DSP2RX_UNMUTE_RAMP */ | ||
2738 | #define WM8915_DSP2RX_UNMUTE_RAMP_WIDTH 1 /* DSP2RX_UNMUTE_RAMP */ | ||
2739 | |||
2740 | /* | ||
2741 | * R1313 (0x521) - DSP2 RX Filters (2) | ||
2742 | */ | ||
2743 | #define WM8915_DSP2RX_3D_GAIN_MASK 0x3E00 /* DSP2RX_3D_GAIN - [13:9] */ | ||
2744 | #define WM8915_DSP2RX_3D_GAIN_SHIFT 9 /* DSP2RX_3D_GAIN - [13:9] */ | ||
2745 | #define WM8915_DSP2RX_3D_GAIN_WIDTH 5 /* DSP2RX_3D_GAIN - [13:9] */ | ||
2746 | #define WM8915_DSP2RX_3D_ENA 0x0100 /* DSP2RX_3D_ENA */ | ||
2747 | #define WM8915_DSP2RX_3D_ENA_MASK 0x0100 /* DSP2RX_3D_ENA */ | ||
2748 | #define WM8915_DSP2RX_3D_ENA_SHIFT 8 /* DSP2RX_3D_ENA */ | ||
2749 | #define WM8915_DSP2RX_3D_ENA_WIDTH 1 /* DSP2RX_3D_ENA */ | ||
2750 | |||
2751 | /* | ||
2752 | * R1344 (0x540) - DSP2 DRC (1) | ||
2753 | */ | ||
2754 | #define WM8915_DSP2DRC_SIG_DET_RMS_MASK 0xF800 /* DSP2DRC_SIG_DET_RMS - [15:11] */ | ||
2755 | #define WM8915_DSP2DRC_SIG_DET_RMS_SHIFT 11 /* DSP2DRC_SIG_DET_RMS - [15:11] */ | ||
2756 | #define WM8915_DSP2DRC_SIG_DET_RMS_WIDTH 5 /* DSP2DRC_SIG_DET_RMS - [15:11] */ | ||
2757 | #define WM8915_DSP2DRC_SIG_DET_PK_MASK 0x0600 /* DSP2DRC_SIG_DET_PK - [10:9] */ | ||
2758 | #define WM8915_DSP2DRC_SIG_DET_PK_SHIFT 9 /* DSP2DRC_SIG_DET_PK - [10:9] */ | ||
2759 | #define WM8915_DSP2DRC_SIG_DET_PK_WIDTH 2 /* DSP2DRC_SIG_DET_PK - [10:9] */ | ||
2760 | #define WM8915_DSP2DRC_NG_ENA 0x0100 /* DSP2DRC_NG_ENA */ | ||
2761 | #define WM8915_DSP2DRC_NG_ENA_MASK 0x0100 /* DSP2DRC_NG_ENA */ | ||
2762 | #define WM8915_DSP2DRC_NG_ENA_SHIFT 8 /* DSP2DRC_NG_ENA */ | ||
2763 | #define WM8915_DSP2DRC_NG_ENA_WIDTH 1 /* DSP2DRC_NG_ENA */ | ||
2764 | #define WM8915_DSP2DRC_SIG_DET_MODE 0x0080 /* DSP2DRC_SIG_DET_MODE */ | ||
2765 | #define WM8915_DSP2DRC_SIG_DET_MODE_MASK 0x0080 /* DSP2DRC_SIG_DET_MODE */ | ||
2766 | #define WM8915_DSP2DRC_SIG_DET_MODE_SHIFT 7 /* DSP2DRC_SIG_DET_MODE */ | ||
2767 | #define WM8915_DSP2DRC_SIG_DET_MODE_WIDTH 1 /* DSP2DRC_SIG_DET_MODE */ | ||
2768 | #define WM8915_DSP2DRC_SIG_DET 0x0040 /* DSP2DRC_SIG_DET */ | ||
2769 | #define WM8915_DSP2DRC_SIG_DET_MASK 0x0040 /* DSP2DRC_SIG_DET */ | ||
2770 | #define WM8915_DSP2DRC_SIG_DET_SHIFT 6 /* DSP2DRC_SIG_DET */ | ||
2771 | #define WM8915_DSP2DRC_SIG_DET_WIDTH 1 /* DSP2DRC_SIG_DET */ | ||
2772 | #define WM8915_DSP2DRC_KNEE2_OP_ENA 0x0020 /* DSP2DRC_KNEE2_OP_ENA */ | ||
2773 | #define WM8915_DSP2DRC_KNEE2_OP_ENA_MASK 0x0020 /* DSP2DRC_KNEE2_OP_ENA */ | ||
2774 | #define WM8915_DSP2DRC_KNEE2_OP_ENA_SHIFT 5 /* DSP2DRC_KNEE2_OP_ENA */ | ||
2775 | #define WM8915_DSP2DRC_KNEE2_OP_ENA_WIDTH 1 /* DSP2DRC_KNEE2_OP_ENA */ | ||
2776 | #define WM8915_DSP2DRC_QR 0x0010 /* DSP2DRC_QR */ | ||
2777 | #define WM8915_DSP2DRC_QR_MASK 0x0010 /* DSP2DRC_QR */ | ||
2778 | #define WM8915_DSP2DRC_QR_SHIFT 4 /* DSP2DRC_QR */ | ||
2779 | #define WM8915_DSP2DRC_QR_WIDTH 1 /* DSP2DRC_QR */ | ||
2780 | #define WM8915_DSP2DRC_ANTICLIP 0x0008 /* DSP2DRC_ANTICLIP */ | ||
2781 | #define WM8915_DSP2DRC_ANTICLIP_MASK 0x0008 /* DSP2DRC_ANTICLIP */ | ||
2782 | #define WM8915_DSP2DRC_ANTICLIP_SHIFT 3 /* DSP2DRC_ANTICLIP */ | ||
2783 | #define WM8915_DSP2DRC_ANTICLIP_WIDTH 1 /* DSP2DRC_ANTICLIP */ | ||
2784 | #define WM8915_DSP2RX_DRC_ENA 0x0004 /* DSP2RX_DRC_ENA */ | ||
2785 | #define WM8915_DSP2RX_DRC_ENA_MASK 0x0004 /* DSP2RX_DRC_ENA */ | ||
2786 | #define WM8915_DSP2RX_DRC_ENA_SHIFT 2 /* DSP2RX_DRC_ENA */ | ||
2787 | #define WM8915_DSP2RX_DRC_ENA_WIDTH 1 /* DSP2RX_DRC_ENA */ | ||
2788 | #define WM8915_DSP2TXL_DRC_ENA 0x0002 /* DSP2TXL_DRC_ENA */ | ||
2789 | #define WM8915_DSP2TXL_DRC_ENA_MASK 0x0002 /* DSP2TXL_DRC_ENA */ | ||
2790 | #define WM8915_DSP2TXL_DRC_ENA_SHIFT 1 /* DSP2TXL_DRC_ENA */ | ||
2791 | #define WM8915_DSP2TXL_DRC_ENA_WIDTH 1 /* DSP2TXL_DRC_ENA */ | ||
2792 | #define WM8915_DSP2TXR_DRC_ENA 0x0001 /* DSP2TXR_DRC_ENA */ | ||
2793 | #define WM8915_DSP2TXR_DRC_ENA_MASK 0x0001 /* DSP2TXR_DRC_ENA */ | ||
2794 | #define WM8915_DSP2TXR_DRC_ENA_SHIFT 0 /* DSP2TXR_DRC_ENA */ | ||
2795 | #define WM8915_DSP2TXR_DRC_ENA_WIDTH 1 /* DSP2TXR_DRC_ENA */ | ||
2796 | |||
2797 | /* | ||
2798 | * R1345 (0x541) - DSP2 DRC (2) | ||
2799 | */ | ||
2800 | #define WM8915_DSP2DRC_ATK_MASK 0x1E00 /* DSP2DRC_ATK - [12:9] */ | ||
2801 | #define WM8915_DSP2DRC_ATK_SHIFT 9 /* DSP2DRC_ATK - [12:9] */ | ||
2802 | #define WM8915_DSP2DRC_ATK_WIDTH 4 /* DSP2DRC_ATK - [12:9] */ | ||
2803 | #define WM8915_DSP2DRC_DCY_MASK 0x01E0 /* DSP2DRC_DCY - [8:5] */ | ||
2804 | #define WM8915_DSP2DRC_DCY_SHIFT 5 /* DSP2DRC_DCY - [8:5] */ | ||
2805 | #define WM8915_DSP2DRC_DCY_WIDTH 4 /* DSP2DRC_DCY - [8:5] */ | ||
2806 | #define WM8915_DSP2DRC_MINGAIN_MASK 0x001C /* DSP2DRC_MINGAIN - [4:2] */ | ||
2807 | #define WM8915_DSP2DRC_MINGAIN_SHIFT 2 /* DSP2DRC_MINGAIN - [4:2] */ | ||
2808 | #define WM8915_DSP2DRC_MINGAIN_WIDTH 3 /* DSP2DRC_MINGAIN - [4:2] */ | ||
2809 | #define WM8915_DSP2DRC_MAXGAIN_MASK 0x0003 /* DSP2DRC_MAXGAIN - [1:0] */ | ||
2810 | #define WM8915_DSP2DRC_MAXGAIN_SHIFT 0 /* DSP2DRC_MAXGAIN - [1:0] */ | ||
2811 | #define WM8915_DSP2DRC_MAXGAIN_WIDTH 2 /* DSP2DRC_MAXGAIN - [1:0] */ | ||
2812 | |||
2813 | /* | ||
2814 | * R1346 (0x542) - DSP2 DRC (3) | ||
2815 | */ | ||
2816 | #define WM8915_DSP2DRC_NG_MINGAIN_MASK 0xF000 /* DSP2DRC_NG_MINGAIN - [15:12] */ | ||
2817 | #define WM8915_DSP2DRC_NG_MINGAIN_SHIFT 12 /* DSP2DRC_NG_MINGAIN - [15:12] */ | ||
2818 | #define WM8915_DSP2DRC_NG_MINGAIN_WIDTH 4 /* DSP2DRC_NG_MINGAIN - [15:12] */ | ||
2819 | #define WM8915_DSP2DRC_NG_EXP_MASK 0x0C00 /* DSP2DRC_NG_EXP - [11:10] */ | ||
2820 | #define WM8915_DSP2DRC_NG_EXP_SHIFT 10 /* DSP2DRC_NG_EXP - [11:10] */ | ||
2821 | #define WM8915_DSP2DRC_NG_EXP_WIDTH 2 /* DSP2DRC_NG_EXP - [11:10] */ | ||
2822 | #define WM8915_DSP2DRC_QR_THR_MASK 0x0300 /* DSP2DRC_QR_THR - [9:8] */ | ||
2823 | #define WM8915_DSP2DRC_QR_THR_SHIFT 8 /* DSP2DRC_QR_THR - [9:8] */ | ||
2824 | #define WM8915_DSP2DRC_QR_THR_WIDTH 2 /* DSP2DRC_QR_THR - [9:8] */ | ||
2825 | #define WM8915_DSP2DRC_QR_DCY_MASK 0x00C0 /* DSP2DRC_QR_DCY - [7:6] */ | ||
2826 | #define WM8915_DSP2DRC_QR_DCY_SHIFT 6 /* DSP2DRC_QR_DCY - [7:6] */ | ||
2827 | #define WM8915_DSP2DRC_QR_DCY_WIDTH 2 /* DSP2DRC_QR_DCY - [7:6] */ | ||
2828 | #define WM8915_DSP2DRC_HI_COMP_MASK 0x0038 /* DSP2DRC_HI_COMP - [5:3] */ | ||
2829 | #define WM8915_DSP2DRC_HI_COMP_SHIFT 3 /* DSP2DRC_HI_COMP - [5:3] */ | ||
2830 | #define WM8915_DSP2DRC_HI_COMP_WIDTH 3 /* DSP2DRC_HI_COMP - [5:3] */ | ||
2831 | #define WM8915_DSP2DRC_LO_COMP_MASK 0x0007 /* DSP2DRC_LO_COMP - [2:0] */ | ||
2832 | #define WM8915_DSP2DRC_LO_COMP_SHIFT 0 /* DSP2DRC_LO_COMP - [2:0] */ | ||
2833 | #define WM8915_DSP2DRC_LO_COMP_WIDTH 3 /* DSP2DRC_LO_COMP - [2:0] */ | ||
2834 | |||
2835 | /* | ||
2836 | * R1347 (0x543) - DSP2 DRC (4) | ||
2837 | */ | ||
2838 | #define WM8915_DSP2DRC_KNEE_IP_MASK 0x07E0 /* DSP2DRC_KNEE_IP - [10:5] */ | ||
2839 | #define WM8915_DSP2DRC_KNEE_IP_SHIFT 5 /* DSP2DRC_KNEE_IP - [10:5] */ | ||
2840 | #define WM8915_DSP2DRC_KNEE_IP_WIDTH 6 /* DSP2DRC_KNEE_IP - [10:5] */ | ||
2841 | #define WM8915_DSP2DRC_KNEE_OP_MASK 0x001F /* DSP2DRC_KNEE_OP - [4:0] */ | ||
2842 | #define WM8915_DSP2DRC_KNEE_OP_SHIFT 0 /* DSP2DRC_KNEE_OP - [4:0] */ | ||
2843 | #define WM8915_DSP2DRC_KNEE_OP_WIDTH 5 /* DSP2DRC_KNEE_OP - [4:0] */ | ||
2844 | |||
2845 | /* | ||
2846 | * R1348 (0x544) - DSP2 DRC (5) | ||
2847 | */ | ||
2848 | #define WM8915_DSP2DRC_KNEE2_IP_MASK 0x03E0 /* DSP2DRC_KNEE2_IP - [9:5] */ | ||
2849 | #define WM8915_DSP2DRC_KNEE2_IP_SHIFT 5 /* DSP2DRC_KNEE2_IP - [9:5] */ | ||
2850 | #define WM8915_DSP2DRC_KNEE2_IP_WIDTH 5 /* DSP2DRC_KNEE2_IP - [9:5] */ | ||
2851 | #define WM8915_DSP2DRC_KNEE2_OP_MASK 0x001F /* DSP2DRC_KNEE2_OP - [4:0] */ | ||
2852 | #define WM8915_DSP2DRC_KNEE2_OP_SHIFT 0 /* DSP2DRC_KNEE2_OP - [4:0] */ | ||
2853 | #define WM8915_DSP2DRC_KNEE2_OP_WIDTH 5 /* DSP2DRC_KNEE2_OP - [4:0] */ | ||
2854 | |||
2855 | /* | ||
2856 | * R1408 (0x580) - DSP2 RX EQ Gains (1) | ||
2857 | */ | ||
2858 | #define WM8915_DSP2RX_EQ_B1_GAIN_MASK 0xF800 /* DSP2RX_EQ_B1_GAIN - [15:11] */ | ||
2859 | #define WM8915_DSP2RX_EQ_B1_GAIN_SHIFT 11 /* DSP2RX_EQ_B1_GAIN - [15:11] */ | ||
2860 | #define WM8915_DSP2RX_EQ_B1_GAIN_WIDTH 5 /* DSP2RX_EQ_B1_GAIN - [15:11] */ | ||
2861 | #define WM8915_DSP2RX_EQ_B2_GAIN_MASK 0x07C0 /* DSP2RX_EQ_B2_GAIN - [10:6] */ | ||
2862 | #define WM8915_DSP2RX_EQ_B2_GAIN_SHIFT 6 /* DSP2RX_EQ_B2_GAIN - [10:6] */ | ||
2863 | #define WM8915_DSP2RX_EQ_B2_GAIN_WIDTH 5 /* DSP2RX_EQ_B2_GAIN - [10:6] */ | ||
2864 | #define WM8915_DSP2RX_EQ_B3_GAIN_MASK 0x003E /* DSP2RX_EQ_B3_GAIN - [5:1] */ | ||
2865 | #define WM8915_DSP2RX_EQ_B3_GAIN_SHIFT 1 /* DSP2RX_EQ_B3_GAIN - [5:1] */ | ||
2866 | #define WM8915_DSP2RX_EQ_B3_GAIN_WIDTH 5 /* DSP2RX_EQ_B3_GAIN - [5:1] */ | ||
2867 | #define WM8915_DSP2RX_EQ_ENA 0x0001 /* DSP2RX_EQ_ENA */ | ||
2868 | #define WM8915_DSP2RX_EQ_ENA_MASK 0x0001 /* DSP2RX_EQ_ENA */ | ||
2869 | #define WM8915_DSP2RX_EQ_ENA_SHIFT 0 /* DSP2RX_EQ_ENA */ | ||
2870 | #define WM8915_DSP2RX_EQ_ENA_WIDTH 1 /* DSP2RX_EQ_ENA */ | ||
2871 | |||
2872 | /* | ||
2873 | * R1409 (0x581) - DSP2 RX EQ Gains (2) | ||
2874 | */ | ||
2875 | #define WM8915_DSP2RX_EQ_B4_GAIN_MASK 0xF800 /* DSP2RX_EQ_B4_GAIN - [15:11] */ | ||
2876 | #define WM8915_DSP2RX_EQ_B4_GAIN_SHIFT 11 /* DSP2RX_EQ_B4_GAIN - [15:11] */ | ||
2877 | #define WM8915_DSP2RX_EQ_B4_GAIN_WIDTH 5 /* DSP2RX_EQ_B4_GAIN - [15:11] */ | ||
2878 | #define WM8915_DSP2RX_EQ_B5_GAIN_MASK 0x07C0 /* DSP2RX_EQ_B5_GAIN - [10:6] */ | ||
2879 | #define WM8915_DSP2RX_EQ_B5_GAIN_SHIFT 6 /* DSP2RX_EQ_B5_GAIN - [10:6] */ | ||
2880 | #define WM8915_DSP2RX_EQ_B5_GAIN_WIDTH 5 /* DSP2RX_EQ_B5_GAIN - [10:6] */ | ||
2881 | |||
2882 | /* | ||
2883 | * R1410 (0x582) - DSP2 RX EQ Band 1 A | ||
2884 | */ | ||
2885 | #define WM8915_DSP2RX_EQ_B1_A_MASK 0xFFFF /* DSP2RX_EQ_B1_A - [15:0] */ | ||
2886 | #define WM8915_DSP2RX_EQ_B1_A_SHIFT 0 /* DSP2RX_EQ_B1_A - [15:0] */ | ||
2887 | #define WM8915_DSP2RX_EQ_B1_A_WIDTH 16 /* DSP2RX_EQ_B1_A - [15:0] */ | ||
2888 | |||
2889 | /* | ||
2890 | * R1411 (0x583) - DSP2 RX EQ Band 1 B | ||
2891 | */ | ||
2892 | #define WM8915_DSP2RX_EQ_B1_B_MASK 0xFFFF /* DSP2RX_EQ_B1_B - [15:0] */ | ||
2893 | #define WM8915_DSP2RX_EQ_B1_B_SHIFT 0 /* DSP2RX_EQ_B1_B - [15:0] */ | ||
2894 | #define WM8915_DSP2RX_EQ_B1_B_WIDTH 16 /* DSP2RX_EQ_B1_B - [15:0] */ | ||
2895 | |||
2896 | /* | ||
2897 | * R1412 (0x584) - DSP2 RX EQ Band 1 PG | ||
2898 | */ | ||
2899 | #define WM8915_DSP2RX_EQ_B1_PG_MASK 0xFFFF /* DSP2RX_EQ_B1_PG - [15:0] */ | ||
2900 | #define WM8915_DSP2RX_EQ_B1_PG_SHIFT 0 /* DSP2RX_EQ_B1_PG - [15:0] */ | ||
2901 | #define WM8915_DSP2RX_EQ_B1_PG_WIDTH 16 /* DSP2RX_EQ_B1_PG - [15:0] */ | ||
2902 | |||
2903 | /* | ||
2904 | * R1413 (0x585) - DSP2 RX EQ Band 2 A | ||
2905 | */ | ||
2906 | #define WM8915_DSP2RX_EQ_B2_A_MASK 0xFFFF /* DSP2RX_EQ_B2_A - [15:0] */ | ||
2907 | #define WM8915_DSP2RX_EQ_B2_A_SHIFT 0 /* DSP2RX_EQ_B2_A - [15:0] */ | ||
2908 | #define WM8915_DSP2RX_EQ_B2_A_WIDTH 16 /* DSP2RX_EQ_B2_A - [15:0] */ | ||
2909 | |||
2910 | /* | ||
2911 | * R1414 (0x586) - DSP2 RX EQ Band 2 B | ||
2912 | */ | ||
2913 | #define WM8915_DSP2RX_EQ_B2_B_MASK 0xFFFF /* DSP2RX_EQ_B2_B - [15:0] */ | ||
2914 | #define WM8915_DSP2RX_EQ_B2_B_SHIFT 0 /* DSP2RX_EQ_B2_B - [15:0] */ | ||
2915 | #define WM8915_DSP2RX_EQ_B2_B_WIDTH 16 /* DSP2RX_EQ_B2_B - [15:0] */ | ||
2916 | |||
2917 | /* | ||
2918 | * R1415 (0x587) - DSP2 RX EQ Band 2 C | ||
2919 | */ | ||
2920 | #define WM8915_DSP2RX_EQ_B2_C_MASK 0xFFFF /* DSP2RX_EQ_B2_C - [15:0] */ | ||
2921 | #define WM8915_DSP2RX_EQ_B2_C_SHIFT 0 /* DSP2RX_EQ_B2_C - [15:0] */ | ||
2922 | #define WM8915_DSP2RX_EQ_B2_C_WIDTH 16 /* DSP2RX_EQ_B2_C - [15:0] */ | ||
2923 | |||
2924 | /* | ||
2925 | * R1416 (0x588) - DSP2 RX EQ Band 2 PG | ||
2926 | */ | ||
2927 | #define WM8915_DSP2RX_EQ_B2_PG_MASK 0xFFFF /* DSP2RX_EQ_B2_PG - [15:0] */ | ||
2928 | #define WM8915_DSP2RX_EQ_B2_PG_SHIFT 0 /* DSP2RX_EQ_B2_PG - [15:0] */ | ||
2929 | #define WM8915_DSP2RX_EQ_B2_PG_WIDTH 16 /* DSP2RX_EQ_B2_PG - [15:0] */ | ||
2930 | |||
2931 | /* | ||
2932 | * R1417 (0x589) - DSP2 RX EQ Band 3 A | ||
2933 | */ | ||
2934 | #define WM8915_DSP2RX_EQ_B3_A_MASK 0xFFFF /* DSP2RX_EQ_B3_A - [15:0] */ | ||
2935 | #define WM8915_DSP2RX_EQ_B3_A_SHIFT 0 /* DSP2RX_EQ_B3_A - [15:0] */ | ||
2936 | #define WM8915_DSP2RX_EQ_B3_A_WIDTH 16 /* DSP2RX_EQ_B3_A - [15:0] */ | ||
2937 | |||
2938 | /* | ||
2939 | * R1418 (0x58A) - DSP2 RX EQ Band 3 B | ||
2940 | */ | ||
2941 | #define WM8915_DSP2RX_EQ_B3_B_MASK 0xFFFF /* DSP2RX_EQ_B3_B - [15:0] */ | ||
2942 | #define WM8915_DSP2RX_EQ_B3_B_SHIFT 0 /* DSP2RX_EQ_B3_B - [15:0] */ | ||
2943 | #define WM8915_DSP2RX_EQ_B3_B_WIDTH 16 /* DSP2RX_EQ_B3_B - [15:0] */ | ||
2944 | |||
2945 | /* | ||
2946 | * R1419 (0x58B) - DSP2 RX EQ Band 3 C | ||
2947 | */ | ||
2948 | #define WM8915_DSP2RX_EQ_B3_C_MASK 0xFFFF /* DSP2RX_EQ_B3_C - [15:0] */ | ||
2949 | #define WM8915_DSP2RX_EQ_B3_C_SHIFT 0 /* DSP2RX_EQ_B3_C - [15:0] */ | ||
2950 | #define WM8915_DSP2RX_EQ_B3_C_WIDTH 16 /* DSP2RX_EQ_B3_C - [15:0] */ | ||
2951 | |||
2952 | /* | ||
2953 | * R1420 (0x58C) - DSP2 RX EQ Band 3 PG | ||
2954 | */ | ||
2955 | #define WM8915_DSP2RX_EQ_B3_PG_MASK 0xFFFF /* DSP2RX_EQ_B3_PG - [15:0] */ | ||
2956 | #define WM8915_DSP2RX_EQ_B3_PG_SHIFT 0 /* DSP2RX_EQ_B3_PG - [15:0] */ | ||
2957 | #define WM8915_DSP2RX_EQ_B3_PG_WIDTH 16 /* DSP2RX_EQ_B3_PG - [15:0] */ | ||
2958 | |||
2959 | /* | ||
2960 | * R1421 (0x58D) - DSP2 RX EQ Band 4 A | ||
2961 | */ | ||
2962 | #define WM8915_DSP2RX_EQ_B4_A_MASK 0xFFFF /* DSP2RX_EQ_B4_A - [15:0] */ | ||
2963 | #define WM8915_DSP2RX_EQ_B4_A_SHIFT 0 /* DSP2RX_EQ_B4_A - [15:0] */ | ||
2964 | #define WM8915_DSP2RX_EQ_B4_A_WIDTH 16 /* DSP2RX_EQ_B4_A - [15:0] */ | ||
2965 | |||
2966 | /* | ||
2967 | * R1422 (0x58E) - DSP2 RX EQ Band 4 B | ||
2968 | */ | ||
2969 | #define WM8915_DSP2RX_EQ_B4_B_MASK 0xFFFF /* DSP2RX_EQ_B4_B - [15:0] */ | ||
2970 | #define WM8915_DSP2RX_EQ_B4_B_SHIFT 0 /* DSP2RX_EQ_B4_B - [15:0] */ | ||
2971 | #define WM8915_DSP2RX_EQ_B4_B_WIDTH 16 /* DSP2RX_EQ_B4_B - [15:0] */ | ||
2972 | |||
2973 | /* | ||
2974 | * R1423 (0x58F) - DSP2 RX EQ Band 4 C | ||
2975 | */ | ||
2976 | #define WM8915_DSP2RX_EQ_B4_C_MASK 0xFFFF /* DSP2RX_EQ_B4_C - [15:0] */ | ||
2977 | #define WM8915_DSP2RX_EQ_B4_C_SHIFT 0 /* DSP2RX_EQ_B4_C - [15:0] */ | ||
2978 | #define WM8915_DSP2RX_EQ_B4_C_WIDTH 16 /* DSP2RX_EQ_B4_C - [15:0] */ | ||
2979 | |||
2980 | /* | ||
2981 | * R1424 (0x590) - DSP2 RX EQ Band 4 PG | ||
2982 | */ | ||
2983 | #define WM8915_DSP2RX_EQ_B4_PG_MASK 0xFFFF /* DSP2RX_EQ_B4_PG - [15:0] */ | ||
2984 | #define WM8915_DSP2RX_EQ_B4_PG_SHIFT 0 /* DSP2RX_EQ_B4_PG - [15:0] */ | ||
2985 | #define WM8915_DSP2RX_EQ_B4_PG_WIDTH 16 /* DSP2RX_EQ_B4_PG - [15:0] */ | ||
2986 | |||
2987 | /* | ||
2988 | * R1425 (0x591) - DSP2 RX EQ Band 5 A | ||
2989 | */ | ||
2990 | #define WM8915_DSP2RX_EQ_B5_A_MASK 0xFFFF /* DSP2RX_EQ_B5_A - [15:0] */ | ||
2991 | #define WM8915_DSP2RX_EQ_B5_A_SHIFT 0 /* DSP2RX_EQ_B5_A - [15:0] */ | ||
2992 | #define WM8915_DSP2RX_EQ_B5_A_WIDTH 16 /* DSP2RX_EQ_B5_A - [15:0] */ | ||
2993 | |||
2994 | /* | ||
2995 | * R1426 (0x592) - DSP2 RX EQ Band 5 B | ||
2996 | */ | ||
2997 | #define WM8915_DSP2RX_EQ_B5_B_MASK 0xFFFF /* DSP2RX_EQ_B5_B - [15:0] */ | ||
2998 | #define WM8915_DSP2RX_EQ_B5_B_SHIFT 0 /* DSP2RX_EQ_B5_B - [15:0] */ | ||
2999 | #define WM8915_DSP2RX_EQ_B5_B_WIDTH 16 /* DSP2RX_EQ_B5_B - [15:0] */ | ||
3000 | |||
3001 | /* | ||
3002 | * R1427 (0x593) - DSP2 RX EQ Band 5 PG | ||
3003 | */ | ||
3004 | #define WM8915_DSP2RX_EQ_B5_PG_MASK 0xFFFF /* DSP2RX_EQ_B5_PG - [15:0] */ | ||
3005 | #define WM8915_DSP2RX_EQ_B5_PG_SHIFT 0 /* DSP2RX_EQ_B5_PG - [15:0] */ | ||
3006 | #define WM8915_DSP2RX_EQ_B5_PG_WIDTH 16 /* DSP2RX_EQ_B5_PG - [15:0] */ | ||
3007 | |||
3008 | /* | ||
3009 | * R1536 (0x600) - DAC1 Mixer Volumes | ||
3010 | */ | ||
3011 | #define WM8915_ADCR_DAC1_VOL_MASK 0x03E0 /* ADCR_DAC1_VOL - [9:5] */ | ||
3012 | #define WM8915_ADCR_DAC1_VOL_SHIFT 5 /* ADCR_DAC1_VOL - [9:5] */ | ||
3013 | #define WM8915_ADCR_DAC1_VOL_WIDTH 5 /* ADCR_DAC1_VOL - [9:5] */ | ||
3014 | #define WM8915_ADCL_DAC1_VOL_MASK 0x001F /* ADCL_DAC1_VOL - [4:0] */ | ||
3015 | #define WM8915_ADCL_DAC1_VOL_SHIFT 0 /* ADCL_DAC1_VOL - [4:0] */ | ||
3016 | #define WM8915_ADCL_DAC1_VOL_WIDTH 5 /* ADCL_DAC1_VOL - [4:0] */ | ||
3017 | |||
3018 | /* | ||
3019 | * R1537 (0x601) - DAC1 Left Mixer Routing | ||
3020 | */ | ||
3021 | #define WM8915_ADCR_TO_DAC1L 0x0020 /* ADCR_TO_DAC1L */ | ||
3022 | #define WM8915_ADCR_TO_DAC1L_MASK 0x0020 /* ADCR_TO_DAC1L */ | ||
3023 | #define WM8915_ADCR_TO_DAC1L_SHIFT 5 /* ADCR_TO_DAC1L */ | ||
3024 | #define WM8915_ADCR_TO_DAC1L_WIDTH 1 /* ADCR_TO_DAC1L */ | ||
3025 | #define WM8915_ADCL_TO_DAC1L 0x0010 /* ADCL_TO_DAC1L */ | ||
3026 | #define WM8915_ADCL_TO_DAC1L_MASK 0x0010 /* ADCL_TO_DAC1L */ | ||
3027 | #define WM8915_ADCL_TO_DAC1L_SHIFT 4 /* ADCL_TO_DAC1L */ | ||
3028 | #define WM8915_ADCL_TO_DAC1L_WIDTH 1 /* ADCL_TO_DAC1L */ | ||
3029 | #define WM8915_DSP2RXL_TO_DAC1L 0x0002 /* DSP2RXL_TO_DAC1L */ | ||
3030 | #define WM8915_DSP2RXL_TO_DAC1L_MASK 0x0002 /* DSP2RXL_TO_DAC1L */ | ||
3031 | #define WM8915_DSP2RXL_TO_DAC1L_SHIFT 1 /* DSP2RXL_TO_DAC1L */ | ||
3032 | #define WM8915_DSP2RXL_TO_DAC1L_WIDTH 1 /* DSP2RXL_TO_DAC1L */ | ||
3033 | #define WM8915_DSP1RXL_TO_DAC1L 0x0001 /* DSP1RXL_TO_DAC1L */ | ||
3034 | #define WM8915_DSP1RXL_TO_DAC1L_MASK 0x0001 /* DSP1RXL_TO_DAC1L */ | ||
3035 | #define WM8915_DSP1RXL_TO_DAC1L_SHIFT 0 /* DSP1RXL_TO_DAC1L */ | ||
3036 | #define WM8915_DSP1RXL_TO_DAC1L_WIDTH 1 /* DSP1RXL_TO_DAC1L */ | ||
3037 | |||
3038 | /* | ||
3039 | * R1538 (0x602) - DAC1 Right Mixer Routing | ||
3040 | */ | ||
3041 | #define WM8915_ADCR_TO_DAC1R 0x0020 /* ADCR_TO_DAC1R */ | ||
3042 | #define WM8915_ADCR_TO_DAC1R_MASK 0x0020 /* ADCR_TO_DAC1R */ | ||
3043 | #define WM8915_ADCR_TO_DAC1R_SHIFT 5 /* ADCR_TO_DAC1R */ | ||
3044 | #define WM8915_ADCR_TO_DAC1R_WIDTH 1 /* ADCR_TO_DAC1R */ | ||
3045 | #define WM8915_ADCL_TO_DAC1R 0x0010 /* ADCL_TO_DAC1R */ | ||
3046 | #define WM8915_ADCL_TO_DAC1R_MASK 0x0010 /* ADCL_TO_DAC1R */ | ||
3047 | #define WM8915_ADCL_TO_DAC1R_SHIFT 4 /* ADCL_TO_DAC1R */ | ||
3048 | #define WM8915_ADCL_TO_DAC1R_WIDTH 1 /* ADCL_TO_DAC1R */ | ||
3049 | #define WM8915_DSP2RXR_TO_DAC1R 0x0002 /* DSP2RXR_TO_DAC1R */ | ||
3050 | #define WM8915_DSP2RXR_TO_DAC1R_MASK 0x0002 /* DSP2RXR_TO_DAC1R */ | ||
3051 | #define WM8915_DSP2RXR_TO_DAC1R_SHIFT 1 /* DSP2RXR_TO_DAC1R */ | ||
3052 | #define WM8915_DSP2RXR_TO_DAC1R_WIDTH 1 /* DSP2RXR_TO_DAC1R */ | ||
3053 | #define WM8915_DSP1RXR_TO_DAC1R 0x0001 /* DSP1RXR_TO_DAC1R */ | ||
3054 | #define WM8915_DSP1RXR_TO_DAC1R_MASK 0x0001 /* DSP1RXR_TO_DAC1R */ | ||
3055 | #define WM8915_DSP1RXR_TO_DAC1R_SHIFT 0 /* DSP1RXR_TO_DAC1R */ | ||
3056 | #define WM8915_DSP1RXR_TO_DAC1R_WIDTH 1 /* DSP1RXR_TO_DAC1R */ | ||
3057 | |||
3058 | /* | ||
3059 | * R1539 (0x603) - DAC2 Mixer Volumes | ||
3060 | */ | ||
3061 | #define WM8915_ADCR_DAC2_VOL_MASK 0x03E0 /* ADCR_DAC2_VOL - [9:5] */ | ||
3062 | #define WM8915_ADCR_DAC2_VOL_SHIFT 5 /* ADCR_DAC2_VOL - [9:5] */ | ||
3063 | #define WM8915_ADCR_DAC2_VOL_WIDTH 5 /* ADCR_DAC2_VOL - [9:5] */ | ||
3064 | #define WM8915_ADCL_DAC2_VOL_MASK 0x001F /* ADCL_DAC2_VOL - [4:0] */ | ||
3065 | #define WM8915_ADCL_DAC2_VOL_SHIFT 0 /* ADCL_DAC2_VOL - [4:0] */ | ||
3066 | #define WM8915_ADCL_DAC2_VOL_WIDTH 5 /* ADCL_DAC2_VOL - [4:0] */ | ||
3067 | |||
3068 | /* | ||
3069 | * R1540 (0x604) - DAC2 Left Mixer Routing | ||
3070 | */ | ||
3071 | #define WM8915_ADCR_TO_DAC2L 0x0020 /* ADCR_TO_DAC2L */ | ||
3072 | #define WM8915_ADCR_TO_DAC2L_MASK 0x0020 /* ADCR_TO_DAC2L */ | ||
3073 | #define WM8915_ADCR_TO_DAC2L_SHIFT 5 /* ADCR_TO_DAC2L */ | ||
3074 | #define WM8915_ADCR_TO_DAC2L_WIDTH 1 /* ADCR_TO_DAC2L */ | ||
3075 | #define WM8915_ADCL_TO_DAC2L 0x0010 /* ADCL_TO_DAC2L */ | ||
3076 | #define WM8915_ADCL_TO_DAC2L_MASK 0x0010 /* ADCL_TO_DAC2L */ | ||
3077 | #define WM8915_ADCL_TO_DAC2L_SHIFT 4 /* ADCL_TO_DAC2L */ | ||
3078 | #define WM8915_ADCL_TO_DAC2L_WIDTH 1 /* ADCL_TO_DAC2L */ | ||
3079 | #define WM8915_DSP2RXL_TO_DAC2L 0x0002 /* DSP2RXL_TO_DAC2L */ | ||
3080 | #define WM8915_DSP2RXL_TO_DAC2L_MASK 0x0002 /* DSP2RXL_TO_DAC2L */ | ||
3081 | #define WM8915_DSP2RXL_TO_DAC2L_SHIFT 1 /* DSP2RXL_TO_DAC2L */ | ||
3082 | #define WM8915_DSP2RXL_TO_DAC2L_WIDTH 1 /* DSP2RXL_TO_DAC2L */ | ||
3083 | #define WM8915_DSP1RXL_TO_DAC2L 0x0001 /* DSP1RXL_TO_DAC2L */ | ||
3084 | #define WM8915_DSP1RXL_TO_DAC2L_MASK 0x0001 /* DSP1RXL_TO_DAC2L */ | ||
3085 | #define WM8915_DSP1RXL_TO_DAC2L_SHIFT 0 /* DSP1RXL_TO_DAC2L */ | ||
3086 | #define WM8915_DSP1RXL_TO_DAC2L_WIDTH 1 /* DSP1RXL_TO_DAC2L */ | ||
3087 | |||
3088 | /* | ||
3089 | * R1541 (0x605) - DAC2 Right Mixer Routing | ||
3090 | */ | ||
3091 | #define WM8915_ADCR_TO_DAC2R 0x0020 /* ADCR_TO_DAC2R */ | ||
3092 | #define WM8915_ADCR_TO_DAC2R_MASK 0x0020 /* ADCR_TO_DAC2R */ | ||
3093 | #define WM8915_ADCR_TO_DAC2R_SHIFT 5 /* ADCR_TO_DAC2R */ | ||
3094 | #define WM8915_ADCR_TO_DAC2R_WIDTH 1 /* ADCR_TO_DAC2R */ | ||
3095 | #define WM8915_ADCL_TO_DAC2R 0x0010 /* ADCL_TO_DAC2R */ | ||
3096 | #define WM8915_ADCL_TO_DAC2R_MASK 0x0010 /* ADCL_TO_DAC2R */ | ||
3097 | #define WM8915_ADCL_TO_DAC2R_SHIFT 4 /* ADCL_TO_DAC2R */ | ||
3098 | #define WM8915_ADCL_TO_DAC2R_WIDTH 1 /* ADCL_TO_DAC2R */ | ||
3099 | #define WM8915_DSP2RXR_TO_DAC2R 0x0002 /* DSP2RXR_TO_DAC2R */ | ||
3100 | #define WM8915_DSP2RXR_TO_DAC2R_MASK 0x0002 /* DSP2RXR_TO_DAC2R */ | ||
3101 | #define WM8915_DSP2RXR_TO_DAC2R_SHIFT 1 /* DSP2RXR_TO_DAC2R */ | ||
3102 | #define WM8915_DSP2RXR_TO_DAC2R_WIDTH 1 /* DSP2RXR_TO_DAC2R */ | ||
3103 | #define WM8915_DSP1RXR_TO_DAC2R 0x0001 /* DSP1RXR_TO_DAC2R */ | ||
3104 | #define WM8915_DSP1RXR_TO_DAC2R_MASK 0x0001 /* DSP1RXR_TO_DAC2R */ | ||
3105 | #define WM8915_DSP1RXR_TO_DAC2R_SHIFT 0 /* DSP1RXR_TO_DAC2R */ | ||
3106 | #define WM8915_DSP1RXR_TO_DAC2R_WIDTH 1 /* DSP1RXR_TO_DAC2R */ | ||
3107 | |||
3108 | /* | ||
3109 | * R1542 (0x606) - DSP1 TX Left Mixer Routing | ||
3110 | */ | ||
3111 | #define WM8915_ADC1L_TO_DSP1TXL 0x0002 /* ADC1L_TO_DSP1TXL */ | ||
3112 | #define WM8915_ADC1L_TO_DSP1TXL_MASK 0x0002 /* ADC1L_TO_DSP1TXL */ | ||
3113 | #define WM8915_ADC1L_TO_DSP1TXL_SHIFT 1 /* ADC1L_TO_DSP1TXL */ | ||
3114 | #define WM8915_ADC1L_TO_DSP1TXL_WIDTH 1 /* ADC1L_TO_DSP1TXL */ | ||
3115 | #define WM8915_DACL_TO_DSP1TXL 0x0001 /* DACL_TO_DSP1TXL */ | ||
3116 | #define WM8915_DACL_TO_DSP1TXL_MASK 0x0001 /* DACL_TO_DSP1TXL */ | ||
3117 | #define WM8915_DACL_TO_DSP1TXL_SHIFT 0 /* DACL_TO_DSP1TXL */ | ||
3118 | #define WM8915_DACL_TO_DSP1TXL_WIDTH 1 /* DACL_TO_DSP1TXL */ | ||
3119 | |||
3120 | /* | ||
3121 | * R1543 (0x607) - DSP1 TX Right Mixer Routing | ||
3122 | */ | ||
3123 | #define WM8915_ADC1R_TO_DSP1TXR 0x0002 /* ADC1R_TO_DSP1TXR */ | ||
3124 | #define WM8915_ADC1R_TO_DSP1TXR_MASK 0x0002 /* ADC1R_TO_DSP1TXR */ | ||
3125 | #define WM8915_ADC1R_TO_DSP1TXR_SHIFT 1 /* ADC1R_TO_DSP1TXR */ | ||
3126 | #define WM8915_ADC1R_TO_DSP1TXR_WIDTH 1 /* ADC1R_TO_DSP1TXR */ | ||
3127 | #define WM8915_DACR_TO_DSP1TXR 0x0001 /* DACR_TO_DSP1TXR */ | ||
3128 | #define WM8915_DACR_TO_DSP1TXR_MASK 0x0001 /* DACR_TO_DSP1TXR */ | ||
3129 | #define WM8915_DACR_TO_DSP1TXR_SHIFT 0 /* DACR_TO_DSP1TXR */ | ||
3130 | #define WM8915_DACR_TO_DSP1TXR_WIDTH 1 /* DACR_TO_DSP1TXR */ | ||
3131 | |||
3132 | /* | ||
3133 | * R1544 (0x608) - DSP2 TX Left Mixer Routing | ||
3134 | */ | ||
3135 | #define WM8915_ADC2L_TO_DSP2TXL 0x0002 /* ADC2L_TO_DSP2TXL */ | ||
3136 | #define WM8915_ADC2L_TO_DSP2TXL_MASK 0x0002 /* ADC2L_TO_DSP2TXL */ | ||
3137 | #define WM8915_ADC2L_TO_DSP2TXL_SHIFT 1 /* ADC2L_TO_DSP2TXL */ | ||
3138 | #define WM8915_ADC2L_TO_DSP2TXL_WIDTH 1 /* ADC2L_TO_DSP2TXL */ | ||
3139 | #define WM8915_DACL_TO_DSP2TXL 0x0001 /* DACL_TO_DSP2TXL */ | ||
3140 | #define WM8915_DACL_TO_DSP2TXL_MASK 0x0001 /* DACL_TO_DSP2TXL */ | ||
3141 | #define WM8915_DACL_TO_DSP2TXL_SHIFT 0 /* DACL_TO_DSP2TXL */ | ||
3142 | #define WM8915_DACL_TO_DSP2TXL_WIDTH 1 /* DACL_TO_DSP2TXL */ | ||
3143 | |||
3144 | /* | ||
3145 | * R1545 (0x609) - DSP2 TX Right Mixer Routing | ||
3146 | */ | ||
3147 | #define WM8915_ADC2R_TO_DSP2TXR 0x0002 /* ADC2R_TO_DSP2TXR */ | ||
3148 | #define WM8915_ADC2R_TO_DSP2TXR_MASK 0x0002 /* ADC2R_TO_DSP2TXR */ | ||
3149 | #define WM8915_ADC2R_TO_DSP2TXR_SHIFT 1 /* ADC2R_TO_DSP2TXR */ | ||
3150 | #define WM8915_ADC2R_TO_DSP2TXR_WIDTH 1 /* ADC2R_TO_DSP2TXR */ | ||
3151 | #define WM8915_DACR_TO_DSP2TXR 0x0001 /* DACR_TO_DSP2TXR */ | ||
3152 | #define WM8915_DACR_TO_DSP2TXR_MASK 0x0001 /* DACR_TO_DSP2TXR */ | ||
3153 | #define WM8915_DACR_TO_DSP2TXR_SHIFT 0 /* DACR_TO_DSP2TXR */ | ||
3154 | #define WM8915_DACR_TO_DSP2TXR_WIDTH 1 /* DACR_TO_DSP2TXR */ | ||
3155 | |||
3156 | /* | ||
3157 | * R1546 (0x60A) - DSP TX Mixer Select | ||
3158 | */ | ||
3159 | #define WM8915_DAC_TO_DSPTX_SRC 0x0001 /* DAC_TO_DSPTX_SRC */ | ||
3160 | #define WM8915_DAC_TO_DSPTX_SRC_MASK 0x0001 /* DAC_TO_DSPTX_SRC */ | ||
3161 | #define WM8915_DAC_TO_DSPTX_SRC_SHIFT 0 /* DAC_TO_DSPTX_SRC */ | ||
3162 | #define WM8915_DAC_TO_DSPTX_SRC_WIDTH 1 /* DAC_TO_DSPTX_SRC */ | ||
3163 | |||
3164 | /* | ||
3165 | * R1552 (0x610) - DAC Softmute | ||
3166 | */ | ||
3167 | #define WM8915_DAC_SOFTMUTEMODE 0x0002 /* DAC_SOFTMUTEMODE */ | ||
3168 | #define WM8915_DAC_SOFTMUTEMODE_MASK 0x0002 /* DAC_SOFTMUTEMODE */ | ||
3169 | #define WM8915_DAC_SOFTMUTEMODE_SHIFT 1 /* DAC_SOFTMUTEMODE */ | ||
3170 | #define WM8915_DAC_SOFTMUTEMODE_WIDTH 1 /* DAC_SOFTMUTEMODE */ | ||
3171 | #define WM8915_DAC_MUTERATE 0x0001 /* DAC_MUTERATE */ | ||
3172 | #define WM8915_DAC_MUTERATE_MASK 0x0001 /* DAC_MUTERATE */ | ||
3173 | #define WM8915_DAC_MUTERATE_SHIFT 0 /* DAC_MUTERATE */ | ||
3174 | #define WM8915_DAC_MUTERATE_WIDTH 1 /* DAC_MUTERATE */ | ||
3175 | |||
3176 | /* | ||
3177 | * R1568 (0x620) - Oversampling | ||
3178 | */ | ||
3179 | #define WM8915_SPK_OSR128 0x0008 /* SPK_OSR128 */ | ||
3180 | #define WM8915_SPK_OSR128_MASK 0x0008 /* SPK_OSR128 */ | ||
3181 | #define WM8915_SPK_OSR128_SHIFT 3 /* SPK_OSR128 */ | ||
3182 | #define WM8915_SPK_OSR128_WIDTH 1 /* SPK_OSR128 */ | ||
3183 | #define WM8915_DMIC_OSR64 0x0004 /* DMIC_OSR64 */ | ||
3184 | #define WM8915_DMIC_OSR64_MASK 0x0004 /* DMIC_OSR64 */ | ||
3185 | #define WM8915_DMIC_OSR64_SHIFT 2 /* DMIC_OSR64 */ | ||
3186 | #define WM8915_DMIC_OSR64_WIDTH 1 /* DMIC_OSR64 */ | ||
3187 | #define WM8915_ADC_OSR128 0x0002 /* ADC_OSR128 */ | ||
3188 | #define WM8915_ADC_OSR128_MASK 0x0002 /* ADC_OSR128 */ | ||
3189 | #define WM8915_ADC_OSR128_SHIFT 1 /* ADC_OSR128 */ | ||
3190 | #define WM8915_ADC_OSR128_WIDTH 1 /* ADC_OSR128 */ | ||
3191 | #define WM8915_DAC_OSR128 0x0001 /* DAC_OSR128 */ | ||
3192 | #define WM8915_DAC_OSR128_MASK 0x0001 /* DAC_OSR128 */ | ||
3193 | #define WM8915_DAC_OSR128_SHIFT 0 /* DAC_OSR128 */ | ||
3194 | #define WM8915_DAC_OSR128_WIDTH 1 /* DAC_OSR128 */ | ||
3195 | |||
3196 | /* | ||
3197 | * R1569 (0x621) - Sidetone | ||
3198 | */ | ||
3199 | #define WM8915_ST_LPF 0x1000 /* ST_LPF */ | ||
3200 | #define WM8915_ST_LPF_MASK 0x1000 /* ST_LPF */ | ||
3201 | #define WM8915_ST_LPF_SHIFT 12 /* ST_LPF */ | ||
3202 | #define WM8915_ST_LPF_WIDTH 1 /* ST_LPF */ | ||
3203 | #define WM8915_ST_HPF_CUT_MASK 0x0380 /* ST_HPF_CUT - [9:7] */ | ||
3204 | #define WM8915_ST_HPF_CUT_SHIFT 7 /* ST_HPF_CUT - [9:7] */ | ||
3205 | #define WM8915_ST_HPF_CUT_WIDTH 3 /* ST_HPF_CUT - [9:7] */ | ||
3206 | #define WM8915_ST_HPF 0x0040 /* ST_HPF */ | ||
3207 | #define WM8915_ST_HPF_MASK 0x0040 /* ST_HPF */ | ||
3208 | #define WM8915_ST_HPF_SHIFT 6 /* ST_HPF */ | ||
3209 | #define WM8915_ST_HPF_WIDTH 1 /* ST_HPF */ | ||
3210 | #define WM8915_STR_SEL 0x0002 /* STR_SEL */ | ||
3211 | #define WM8915_STR_SEL_MASK 0x0002 /* STR_SEL */ | ||
3212 | #define WM8915_STR_SEL_SHIFT 1 /* STR_SEL */ | ||
3213 | #define WM8915_STR_SEL_WIDTH 1 /* STR_SEL */ | ||
3214 | #define WM8915_STL_SEL 0x0001 /* STL_SEL */ | ||
3215 | #define WM8915_STL_SEL_MASK 0x0001 /* STL_SEL */ | ||
3216 | #define WM8915_STL_SEL_SHIFT 0 /* STL_SEL */ | ||
3217 | #define WM8915_STL_SEL_WIDTH 1 /* STL_SEL */ | ||
3218 | |||
3219 | /* | ||
3220 | * R1792 (0x700) - GPIO 1 | ||
3221 | */ | ||
3222 | #define WM8915_GP1_DIR 0x8000 /* GP1_DIR */ | ||
3223 | #define WM8915_GP1_DIR_MASK 0x8000 /* GP1_DIR */ | ||
3224 | #define WM8915_GP1_DIR_SHIFT 15 /* GP1_DIR */ | ||
3225 | #define WM8915_GP1_DIR_WIDTH 1 /* GP1_DIR */ | ||
3226 | #define WM8915_GP1_PU 0x4000 /* GP1_PU */ | ||
3227 | #define WM8915_GP1_PU_MASK 0x4000 /* GP1_PU */ | ||
3228 | #define WM8915_GP1_PU_SHIFT 14 /* GP1_PU */ | ||
3229 | #define WM8915_GP1_PU_WIDTH 1 /* GP1_PU */ | ||
3230 | #define WM8915_GP1_PD 0x2000 /* GP1_PD */ | ||
3231 | #define WM8915_GP1_PD_MASK 0x2000 /* GP1_PD */ | ||
3232 | #define WM8915_GP1_PD_SHIFT 13 /* GP1_PD */ | ||
3233 | #define WM8915_GP1_PD_WIDTH 1 /* GP1_PD */ | ||
3234 | #define WM8915_GP1_POL 0x0400 /* GP1_POL */ | ||
3235 | #define WM8915_GP1_POL_MASK 0x0400 /* GP1_POL */ | ||
3236 | #define WM8915_GP1_POL_SHIFT 10 /* GP1_POL */ | ||
3237 | #define WM8915_GP1_POL_WIDTH 1 /* GP1_POL */ | ||
3238 | #define WM8915_GP1_OP_CFG 0x0200 /* GP1_OP_CFG */ | ||
3239 | #define WM8915_GP1_OP_CFG_MASK 0x0200 /* GP1_OP_CFG */ | ||
3240 | #define WM8915_GP1_OP_CFG_SHIFT 9 /* GP1_OP_CFG */ | ||
3241 | #define WM8915_GP1_OP_CFG_WIDTH 1 /* GP1_OP_CFG */ | ||
3242 | #define WM8915_GP1_DB 0x0100 /* GP1_DB */ | ||
3243 | #define WM8915_GP1_DB_MASK 0x0100 /* GP1_DB */ | ||
3244 | #define WM8915_GP1_DB_SHIFT 8 /* GP1_DB */ | ||
3245 | #define WM8915_GP1_DB_WIDTH 1 /* GP1_DB */ | ||
3246 | #define WM8915_GP1_LVL 0x0040 /* GP1_LVL */ | ||
3247 | #define WM8915_GP1_LVL_MASK 0x0040 /* GP1_LVL */ | ||
3248 | #define WM8915_GP1_LVL_SHIFT 6 /* GP1_LVL */ | ||
3249 | #define WM8915_GP1_LVL_WIDTH 1 /* GP1_LVL */ | ||
3250 | #define WM8915_GP1_FN_MASK 0x000F /* GP1_FN - [3:0] */ | ||
3251 | #define WM8915_GP1_FN_SHIFT 0 /* GP1_FN - [3:0] */ | ||
3252 | #define WM8915_GP1_FN_WIDTH 4 /* GP1_FN - [3:0] */ | ||
3253 | |||
3254 | /* | ||
3255 | * R1793 (0x701) - GPIO 2 | ||
3256 | */ | ||
3257 | #define WM8915_GP2_DIR 0x8000 /* GP2_DIR */ | ||
3258 | #define WM8915_GP2_DIR_MASK 0x8000 /* GP2_DIR */ | ||
3259 | #define WM8915_GP2_DIR_SHIFT 15 /* GP2_DIR */ | ||
3260 | #define WM8915_GP2_DIR_WIDTH 1 /* GP2_DIR */ | ||
3261 | #define WM8915_GP2_PU 0x4000 /* GP2_PU */ | ||
3262 | #define WM8915_GP2_PU_MASK 0x4000 /* GP2_PU */ | ||
3263 | #define WM8915_GP2_PU_SHIFT 14 /* GP2_PU */ | ||
3264 | #define WM8915_GP2_PU_WIDTH 1 /* GP2_PU */ | ||
3265 | #define WM8915_GP2_PD 0x2000 /* GP2_PD */ | ||
3266 | #define WM8915_GP2_PD_MASK 0x2000 /* GP2_PD */ | ||
3267 | #define WM8915_GP2_PD_SHIFT 13 /* GP2_PD */ | ||
3268 | #define WM8915_GP2_PD_WIDTH 1 /* GP2_PD */ | ||
3269 | #define WM8915_GP2_POL 0x0400 /* GP2_POL */ | ||
3270 | #define WM8915_GP2_POL_MASK 0x0400 /* GP2_POL */ | ||
3271 | #define WM8915_GP2_POL_SHIFT 10 /* GP2_POL */ | ||
3272 | #define WM8915_GP2_POL_WIDTH 1 /* GP2_POL */ | ||
3273 | #define WM8915_GP2_OP_CFG 0x0200 /* GP2_OP_CFG */ | ||
3274 | #define WM8915_GP2_OP_CFG_MASK 0x0200 /* GP2_OP_CFG */ | ||
3275 | #define WM8915_GP2_OP_CFG_SHIFT 9 /* GP2_OP_CFG */ | ||
3276 | #define WM8915_GP2_OP_CFG_WIDTH 1 /* GP2_OP_CFG */ | ||
3277 | #define WM8915_GP2_DB 0x0100 /* GP2_DB */ | ||
3278 | #define WM8915_GP2_DB_MASK 0x0100 /* GP2_DB */ | ||
3279 | #define WM8915_GP2_DB_SHIFT 8 /* GP2_DB */ | ||
3280 | #define WM8915_GP2_DB_WIDTH 1 /* GP2_DB */ | ||
3281 | #define WM8915_GP2_LVL 0x0040 /* GP2_LVL */ | ||
3282 | #define WM8915_GP2_LVL_MASK 0x0040 /* GP2_LVL */ | ||
3283 | #define WM8915_GP2_LVL_SHIFT 6 /* GP2_LVL */ | ||
3284 | #define WM8915_GP2_LVL_WIDTH 1 /* GP2_LVL */ | ||
3285 | #define WM8915_GP2_FN_MASK 0x000F /* GP2_FN - [3:0] */ | ||
3286 | #define WM8915_GP2_FN_SHIFT 0 /* GP2_FN - [3:0] */ | ||
3287 | #define WM8915_GP2_FN_WIDTH 4 /* GP2_FN - [3:0] */ | ||
3288 | |||
3289 | /* | ||
3290 | * R1794 (0x702) - GPIO 3 | ||
3291 | */ | ||
3292 | #define WM8915_GP3_DIR 0x8000 /* GP3_DIR */ | ||
3293 | #define WM8915_GP3_DIR_MASK 0x8000 /* GP3_DIR */ | ||
3294 | #define WM8915_GP3_DIR_SHIFT 15 /* GP3_DIR */ | ||
3295 | #define WM8915_GP3_DIR_WIDTH 1 /* GP3_DIR */ | ||
3296 | #define WM8915_GP3_PU 0x4000 /* GP3_PU */ | ||
3297 | #define WM8915_GP3_PU_MASK 0x4000 /* GP3_PU */ | ||
3298 | #define WM8915_GP3_PU_SHIFT 14 /* GP3_PU */ | ||
3299 | #define WM8915_GP3_PU_WIDTH 1 /* GP3_PU */ | ||
3300 | #define WM8915_GP3_PD 0x2000 /* GP3_PD */ | ||
3301 | #define WM8915_GP3_PD_MASK 0x2000 /* GP3_PD */ | ||
3302 | #define WM8915_GP3_PD_SHIFT 13 /* GP3_PD */ | ||
3303 | #define WM8915_GP3_PD_WIDTH 1 /* GP3_PD */ | ||
3304 | #define WM8915_GP3_POL 0x0400 /* GP3_POL */ | ||
3305 | #define WM8915_GP3_POL_MASK 0x0400 /* GP3_POL */ | ||
3306 | #define WM8915_GP3_POL_SHIFT 10 /* GP3_POL */ | ||
3307 | #define WM8915_GP3_POL_WIDTH 1 /* GP3_POL */ | ||
3308 | #define WM8915_GP3_OP_CFG 0x0200 /* GP3_OP_CFG */ | ||
3309 | #define WM8915_GP3_OP_CFG_MASK 0x0200 /* GP3_OP_CFG */ | ||
3310 | #define WM8915_GP3_OP_CFG_SHIFT 9 /* GP3_OP_CFG */ | ||
3311 | #define WM8915_GP3_OP_CFG_WIDTH 1 /* GP3_OP_CFG */ | ||
3312 | #define WM8915_GP3_DB 0x0100 /* GP3_DB */ | ||
3313 | #define WM8915_GP3_DB_MASK 0x0100 /* GP3_DB */ | ||
3314 | #define WM8915_GP3_DB_SHIFT 8 /* GP3_DB */ | ||
3315 | #define WM8915_GP3_DB_WIDTH 1 /* GP3_DB */ | ||
3316 | #define WM8915_GP3_LVL 0x0040 /* GP3_LVL */ | ||
3317 | #define WM8915_GP3_LVL_MASK 0x0040 /* GP3_LVL */ | ||
3318 | #define WM8915_GP3_LVL_SHIFT 6 /* GP3_LVL */ | ||
3319 | #define WM8915_GP3_LVL_WIDTH 1 /* GP3_LVL */ | ||
3320 | #define WM8915_GP3_FN_MASK 0x000F /* GP3_FN - [3:0] */ | ||
3321 | #define WM8915_GP3_FN_SHIFT 0 /* GP3_FN - [3:0] */ | ||
3322 | #define WM8915_GP3_FN_WIDTH 4 /* GP3_FN - [3:0] */ | ||
3323 | |||
3324 | /* | ||
3325 | * R1795 (0x703) - GPIO 4 | ||
3326 | */ | ||
3327 | #define WM8915_GP4_DIR 0x8000 /* GP4_DIR */ | ||
3328 | #define WM8915_GP4_DIR_MASK 0x8000 /* GP4_DIR */ | ||
3329 | #define WM8915_GP4_DIR_SHIFT 15 /* GP4_DIR */ | ||
3330 | #define WM8915_GP4_DIR_WIDTH 1 /* GP4_DIR */ | ||
3331 | #define WM8915_GP4_PU 0x4000 /* GP4_PU */ | ||
3332 | #define WM8915_GP4_PU_MASK 0x4000 /* GP4_PU */ | ||
3333 | #define WM8915_GP4_PU_SHIFT 14 /* GP4_PU */ | ||
3334 | #define WM8915_GP4_PU_WIDTH 1 /* GP4_PU */ | ||
3335 | #define WM8915_GP4_PD 0x2000 /* GP4_PD */ | ||
3336 | #define WM8915_GP4_PD_MASK 0x2000 /* GP4_PD */ | ||
3337 | #define WM8915_GP4_PD_SHIFT 13 /* GP4_PD */ | ||
3338 | #define WM8915_GP4_PD_WIDTH 1 /* GP4_PD */ | ||
3339 | #define WM8915_GP4_POL 0x0400 /* GP4_POL */ | ||
3340 | #define WM8915_GP4_POL_MASK 0x0400 /* GP4_POL */ | ||
3341 | #define WM8915_GP4_POL_SHIFT 10 /* GP4_POL */ | ||
3342 | #define WM8915_GP4_POL_WIDTH 1 /* GP4_POL */ | ||
3343 | #define WM8915_GP4_OP_CFG 0x0200 /* GP4_OP_CFG */ | ||
3344 | #define WM8915_GP4_OP_CFG_MASK 0x0200 /* GP4_OP_CFG */ | ||
3345 | #define WM8915_GP4_OP_CFG_SHIFT 9 /* GP4_OP_CFG */ | ||
3346 | #define WM8915_GP4_OP_CFG_WIDTH 1 /* GP4_OP_CFG */ | ||
3347 | #define WM8915_GP4_DB 0x0100 /* GP4_DB */ | ||
3348 | #define WM8915_GP4_DB_MASK 0x0100 /* GP4_DB */ | ||
3349 | #define WM8915_GP4_DB_SHIFT 8 /* GP4_DB */ | ||
3350 | #define WM8915_GP4_DB_WIDTH 1 /* GP4_DB */ | ||
3351 | #define WM8915_GP4_LVL 0x0040 /* GP4_LVL */ | ||
3352 | #define WM8915_GP4_LVL_MASK 0x0040 /* GP4_LVL */ | ||
3353 | #define WM8915_GP4_LVL_SHIFT 6 /* GP4_LVL */ | ||
3354 | #define WM8915_GP4_LVL_WIDTH 1 /* GP4_LVL */ | ||
3355 | #define WM8915_GP4_FN_MASK 0x000F /* GP4_FN - [3:0] */ | ||
3356 | #define WM8915_GP4_FN_SHIFT 0 /* GP4_FN - [3:0] */ | ||
3357 | #define WM8915_GP4_FN_WIDTH 4 /* GP4_FN - [3:0] */ | ||
3358 | |||
3359 | /* | ||
3360 | * R1796 (0x704) - GPIO 5 | ||
3361 | */ | ||
3362 | #define WM8915_GP5_DIR 0x8000 /* GP5_DIR */ | ||
3363 | #define WM8915_GP5_DIR_MASK 0x8000 /* GP5_DIR */ | ||
3364 | #define WM8915_GP5_DIR_SHIFT 15 /* GP5_DIR */ | ||
3365 | #define WM8915_GP5_DIR_WIDTH 1 /* GP5_DIR */ | ||
3366 | #define WM8915_GP5_PU 0x4000 /* GP5_PU */ | ||
3367 | #define WM8915_GP5_PU_MASK 0x4000 /* GP5_PU */ | ||
3368 | #define WM8915_GP5_PU_SHIFT 14 /* GP5_PU */ | ||
3369 | #define WM8915_GP5_PU_WIDTH 1 /* GP5_PU */ | ||
3370 | #define WM8915_GP5_PD 0x2000 /* GP5_PD */ | ||
3371 | #define WM8915_GP5_PD_MASK 0x2000 /* GP5_PD */ | ||
3372 | #define WM8915_GP5_PD_SHIFT 13 /* GP5_PD */ | ||
3373 | #define WM8915_GP5_PD_WIDTH 1 /* GP5_PD */ | ||
3374 | #define WM8915_GP5_POL 0x0400 /* GP5_POL */ | ||
3375 | #define WM8915_GP5_POL_MASK 0x0400 /* GP5_POL */ | ||
3376 | #define WM8915_GP5_POL_SHIFT 10 /* GP5_POL */ | ||
3377 | #define WM8915_GP5_POL_WIDTH 1 /* GP5_POL */ | ||
3378 | #define WM8915_GP5_OP_CFG 0x0200 /* GP5_OP_CFG */ | ||
3379 | #define WM8915_GP5_OP_CFG_MASK 0x0200 /* GP5_OP_CFG */ | ||
3380 | #define WM8915_GP5_OP_CFG_SHIFT 9 /* GP5_OP_CFG */ | ||
3381 | #define WM8915_GP5_OP_CFG_WIDTH 1 /* GP5_OP_CFG */ | ||
3382 | #define WM8915_GP5_DB 0x0100 /* GP5_DB */ | ||
3383 | #define WM8915_GP5_DB_MASK 0x0100 /* GP5_DB */ | ||
3384 | #define WM8915_GP5_DB_SHIFT 8 /* GP5_DB */ | ||
3385 | #define WM8915_GP5_DB_WIDTH 1 /* GP5_DB */ | ||
3386 | #define WM8915_GP5_LVL 0x0040 /* GP5_LVL */ | ||
3387 | #define WM8915_GP5_LVL_MASK 0x0040 /* GP5_LVL */ | ||
3388 | #define WM8915_GP5_LVL_SHIFT 6 /* GP5_LVL */ | ||
3389 | #define WM8915_GP5_LVL_WIDTH 1 /* GP5_LVL */ | ||
3390 | #define WM8915_GP5_FN_MASK 0x000F /* GP5_FN - [3:0] */ | ||
3391 | #define WM8915_GP5_FN_SHIFT 0 /* GP5_FN - [3:0] */ | ||
3392 | #define WM8915_GP5_FN_WIDTH 4 /* GP5_FN - [3:0] */ | ||
3393 | |||
3394 | /* | ||
3395 | * R1824 (0x720) - Pull Control (1) | ||
3396 | */ | ||
3397 | #define WM8915_DMICDAT2_PD 0x1000 /* DMICDAT2_PD */ | ||
3398 | #define WM8915_DMICDAT2_PD_MASK 0x1000 /* DMICDAT2_PD */ | ||
3399 | #define WM8915_DMICDAT2_PD_SHIFT 12 /* DMICDAT2_PD */ | ||
3400 | #define WM8915_DMICDAT2_PD_WIDTH 1 /* DMICDAT2_PD */ | ||
3401 | #define WM8915_DMICDAT1_PD 0x0400 /* DMICDAT1_PD */ | ||
3402 | #define WM8915_DMICDAT1_PD_MASK 0x0400 /* DMICDAT1_PD */ | ||
3403 | #define WM8915_DMICDAT1_PD_SHIFT 10 /* DMICDAT1_PD */ | ||
3404 | #define WM8915_DMICDAT1_PD_WIDTH 1 /* DMICDAT1_PD */ | ||
3405 | #define WM8915_MCLK2_PU 0x0200 /* MCLK2_PU */ | ||
3406 | #define WM8915_MCLK2_PU_MASK 0x0200 /* MCLK2_PU */ | ||
3407 | #define WM8915_MCLK2_PU_SHIFT 9 /* MCLK2_PU */ | ||
3408 | #define WM8915_MCLK2_PU_WIDTH 1 /* MCLK2_PU */ | ||
3409 | #define WM8915_MCLK2_PD 0x0100 /* MCLK2_PD */ | ||
3410 | #define WM8915_MCLK2_PD_MASK 0x0100 /* MCLK2_PD */ | ||
3411 | #define WM8915_MCLK2_PD_SHIFT 8 /* MCLK2_PD */ | ||
3412 | #define WM8915_MCLK2_PD_WIDTH 1 /* MCLK2_PD */ | ||
3413 | #define WM8915_MCLK1_PU 0x0080 /* MCLK1_PU */ | ||
3414 | #define WM8915_MCLK1_PU_MASK 0x0080 /* MCLK1_PU */ | ||
3415 | #define WM8915_MCLK1_PU_SHIFT 7 /* MCLK1_PU */ | ||
3416 | #define WM8915_MCLK1_PU_WIDTH 1 /* MCLK1_PU */ | ||
3417 | #define WM8915_MCLK1_PD 0x0040 /* MCLK1_PD */ | ||
3418 | #define WM8915_MCLK1_PD_MASK 0x0040 /* MCLK1_PD */ | ||
3419 | #define WM8915_MCLK1_PD_SHIFT 6 /* MCLK1_PD */ | ||
3420 | #define WM8915_MCLK1_PD_WIDTH 1 /* MCLK1_PD */ | ||
3421 | #define WM8915_DACDAT1_PU 0x0020 /* DACDAT1_PU */ | ||
3422 | #define WM8915_DACDAT1_PU_MASK 0x0020 /* DACDAT1_PU */ | ||
3423 | #define WM8915_DACDAT1_PU_SHIFT 5 /* DACDAT1_PU */ | ||
3424 | #define WM8915_DACDAT1_PU_WIDTH 1 /* DACDAT1_PU */ | ||
3425 | #define WM8915_DACDAT1_PD 0x0010 /* DACDAT1_PD */ | ||
3426 | #define WM8915_DACDAT1_PD_MASK 0x0010 /* DACDAT1_PD */ | ||
3427 | #define WM8915_DACDAT1_PD_SHIFT 4 /* DACDAT1_PD */ | ||
3428 | #define WM8915_DACDAT1_PD_WIDTH 1 /* DACDAT1_PD */ | ||
3429 | #define WM8915_DACLRCLK1_PU 0x0008 /* DACLRCLK1_PU */ | ||
3430 | #define WM8915_DACLRCLK1_PU_MASK 0x0008 /* DACLRCLK1_PU */ | ||
3431 | #define WM8915_DACLRCLK1_PU_SHIFT 3 /* DACLRCLK1_PU */ | ||
3432 | #define WM8915_DACLRCLK1_PU_WIDTH 1 /* DACLRCLK1_PU */ | ||
3433 | #define WM8915_DACLRCLK1_PD 0x0004 /* DACLRCLK1_PD */ | ||
3434 | #define WM8915_DACLRCLK1_PD_MASK 0x0004 /* DACLRCLK1_PD */ | ||
3435 | #define WM8915_DACLRCLK1_PD_SHIFT 2 /* DACLRCLK1_PD */ | ||
3436 | #define WM8915_DACLRCLK1_PD_WIDTH 1 /* DACLRCLK1_PD */ | ||
3437 | #define WM8915_BCLK1_PU 0x0002 /* BCLK1_PU */ | ||
3438 | #define WM8915_BCLK1_PU_MASK 0x0002 /* BCLK1_PU */ | ||
3439 | #define WM8915_BCLK1_PU_SHIFT 1 /* BCLK1_PU */ | ||
3440 | #define WM8915_BCLK1_PU_WIDTH 1 /* BCLK1_PU */ | ||
3441 | #define WM8915_BCLK1_PD 0x0001 /* BCLK1_PD */ | ||
3442 | #define WM8915_BCLK1_PD_MASK 0x0001 /* BCLK1_PD */ | ||
3443 | #define WM8915_BCLK1_PD_SHIFT 0 /* BCLK1_PD */ | ||
3444 | #define WM8915_BCLK1_PD_WIDTH 1 /* BCLK1_PD */ | ||
3445 | |||
3446 | /* | ||
3447 | * R1825 (0x721) - Pull Control (2) | ||
3448 | */ | ||
3449 | #define WM8915_LDO1ENA_PD 0x0100 /* LDO1ENA_PD */ | ||
3450 | #define WM8915_LDO1ENA_PD_MASK 0x0100 /* LDO1ENA_PD */ | ||
3451 | #define WM8915_LDO1ENA_PD_SHIFT 8 /* LDO1ENA_PD */ | ||
3452 | #define WM8915_LDO1ENA_PD_WIDTH 1 /* LDO1ENA_PD */ | ||
3453 | #define WM8915_ADDR_PD 0x0040 /* ADDR_PD */ | ||
3454 | #define WM8915_ADDR_PD_MASK 0x0040 /* ADDR_PD */ | ||
3455 | #define WM8915_ADDR_PD_SHIFT 6 /* ADDR_PD */ | ||
3456 | #define WM8915_ADDR_PD_WIDTH 1 /* ADDR_PD */ | ||
3457 | #define WM8915_DACDAT2_PU 0x0020 /* DACDAT2_PU */ | ||
3458 | #define WM8915_DACDAT2_PU_MASK 0x0020 /* DACDAT2_PU */ | ||
3459 | #define WM8915_DACDAT2_PU_SHIFT 5 /* DACDAT2_PU */ | ||
3460 | #define WM8915_DACDAT2_PU_WIDTH 1 /* DACDAT2_PU */ | ||
3461 | #define WM8915_DACDAT2_PD 0x0010 /* DACDAT2_PD */ | ||
3462 | #define WM8915_DACDAT2_PD_MASK 0x0010 /* DACDAT2_PD */ | ||
3463 | #define WM8915_DACDAT2_PD_SHIFT 4 /* DACDAT2_PD */ | ||
3464 | #define WM8915_DACDAT2_PD_WIDTH 1 /* DACDAT2_PD */ | ||
3465 | #define WM8915_DACLRCLK2_PU 0x0008 /* DACLRCLK2_PU */ | ||
3466 | #define WM8915_DACLRCLK2_PU_MASK 0x0008 /* DACLRCLK2_PU */ | ||
3467 | #define WM8915_DACLRCLK2_PU_SHIFT 3 /* DACLRCLK2_PU */ | ||
3468 | #define WM8915_DACLRCLK2_PU_WIDTH 1 /* DACLRCLK2_PU */ | ||
3469 | #define WM8915_DACLRCLK2_PD 0x0004 /* DACLRCLK2_PD */ | ||
3470 | #define WM8915_DACLRCLK2_PD_MASK 0x0004 /* DACLRCLK2_PD */ | ||
3471 | #define WM8915_DACLRCLK2_PD_SHIFT 2 /* DACLRCLK2_PD */ | ||
3472 | #define WM8915_DACLRCLK2_PD_WIDTH 1 /* DACLRCLK2_PD */ | ||
3473 | #define WM8915_BCLK2_PU 0x0002 /* BCLK2_PU */ | ||
3474 | #define WM8915_BCLK2_PU_MASK 0x0002 /* BCLK2_PU */ | ||
3475 | #define WM8915_BCLK2_PU_SHIFT 1 /* BCLK2_PU */ | ||
3476 | #define WM8915_BCLK2_PU_WIDTH 1 /* BCLK2_PU */ | ||
3477 | #define WM8915_BCLK2_PD 0x0001 /* BCLK2_PD */ | ||
3478 | #define WM8915_BCLK2_PD_MASK 0x0001 /* BCLK2_PD */ | ||
3479 | #define WM8915_BCLK2_PD_SHIFT 0 /* BCLK2_PD */ | ||
3480 | #define WM8915_BCLK2_PD_WIDTH 1 /* BCLK2_PD */ | ||
3481 | |||
3482 | /* | ||
3483 | * R1840 (0x730) - Interrupt Status 1 | ||
3484 | */ | ||
3485 | #define WM8915_GP5_EINT 0x0010 /* GP5_EINT */ | ||
3486 | #define WM8915_GP5_EINT_MASK 0x0010 /* GP5_EINT */ | ||
3487 | #define WM8915_GP5_EINT_SHIFT 4 /* GP5_EINT */ | ||
3488 | #define WM8915_GP5_EINT_WIDTH 1 /* GP5_EINT */ | ||
3489 | #define WM8915_GP4_EINT 0x0008 /* GP4_EINT */ | ||
3490 | #define WM8915_GP4_EINT_MASK 0x0008 /* GP4_EINT */ | ||
3491 | #define WM8915_GP4_EINT_SHIFT 3 /* GP4_EINT */ | ||
3492 | #define WM8915_GP4_EINT_WIDTH 1 /* GP4_EINT */ | ||
3493 | #define WM8915_GP3_EINT 0x0004 /* GP3_EINT */ | ||
3494 | #define WM8915_GP3_EINT_MASK 0x0004 /* GP3_EINT */ | ||
3495 | #define WM8915_GP3_EINT_SHIFT 2 /* GP3_EINT */ | ||
3496 | #define WM8915_GP3_EINT_WIDTH 1 /* GP3_EINT */ | ||
3497 | #define WM8915_GP2_EINT 0x0002 /* GP2_EINT */ | ||
3498 | #define WM8915_GP2_EINT_MASK 0x0002 /* GP2_EINT */ | ||
3499 | #define WM8915_GP2_EINT_SHIFT 1 /* GP2_EINT */ | ||
3500 | #define WM8915_GP2_EINT_WIDTH 1 /* GP2_EINT */ | ||
3501 | #define WM8915_GP1_EINT 0x0001 /* GP1_EINT */ | ||
3502 | #define WM8915_GP1_EINT_MASK 0x0001 /* GP1_EINT */ | ||
3503 | #define WM8915_GP1_EINT_SHIFT 0 /* GP1_EINT */ | ||
3504 | #define WM8915_GP1_EINT_WIDTH 1 /* GP1_EINT */ | ||
3505 | |||
3506 | /* | ||
3507 | * R1841 (0x731) - Interrupt Status 2 | ||
3508 | */ | ||
3509 | #define WM8915_DCS_DONE_23_EINT 0x1000 /* DCS_DONE_23_EINT */ | ||
3510 | #define WM8915_DCS_DONE_23_EINT_MASK 0x1000 /* DCS_DONE_23_EINT */ | ||
3511 | #define WM8915_DCS_DONE_23_EINT_SHIFT 12 /* DCS_DONE_23_EINT */ | ||
3512 | #define WM8915_DCS_DONE_23_EINT_WIDTH 1 /* DCS_DONE_23_EINT */ | ||
3513 | #define WM8915_DCS_DONE_01_EINT 0x0800 /* DCS_DONE_01_EINT */ | ||
3514 | #define WM8915_DCS_DONE_01_EINT_MASK 0x0800 /* DCS_DONE_01_EINT */ | ||
3515 | #define WM8915_DCS_DONE_01_EINT_SHIFT 11 /* DCS_DONE_01_EINT */ | ||
3516 | #define WM8915_DCS_DONE_01_EINT_WIDTH 1 /* DCS_DONE_01_EINT */ | ||
3517 | #define WM8915_WSEQ_DONE_EINT 0x0400 /* WSEQ_DONE_EINT */ | ||
3518 | #define WM8915_WSEQ_DONE_EINT_MASK 0x0400 /* WSEQ_DONE_EINT */ | ||
3519 | #define WM8915_WSEQ_DONE_EINT_SHIFT 10 /* WSEQ_DONE_EINT */ | ||
3520 | #define WM8915_WSEQ_DONE_EINT_WIDTH 1 /* WSEQ_DONE_EINT */ | ||
3521 | #define WM8915_FIFOS_ERR_EINT 0x0200 /* FIFOS_ERR_EINT */ | ||
3522 | #define WM8915_FIFOS_ERR_EINT_MASK 0x0200 /* FIFOS_ERR_EINT */ | ||
3523 | #define WM8915_FIFOS_ERR_EINT_SHIFT 9 /* FIFOS_ERR_EINT */ | ||
3524 | #define WM8915_FIFOS_ERR_EINT_WIDTH 1 /* FIFOS_ERR_EINT */ | ||
3525 | #define WM8915_DSP2DRC_SIG_DET_EINT 0x0080 /* DSP2DRC_SIG_DET_EINT */ | ||
3526 | #define WM8915_DSP2DRC_SIG_DET_EINT_MASK 0x0080 /* DSP2DRC_SIG_DET_EINT */ | ||
3527 | #define WM8915_DSP2DRC_SIG_DET_EINT_SHIFT 7 /* DSP2DRC_SIG_DET_EINT */ | ||
3528 | #define WM8915_DSP2DRC_SIG_DET_EINT_WIDTH 1 /* DSP2DRC_SIG_DET_EINT */ | ||
3529 | #define WM8915_DSP1DRC_SIG_DET_EINT 0x0040 /* DSP1DRC_SIG_DET_EINT */ | ||
3530 | #define WM8915_DSP1DRC_SIG_DET_EINT_MASK 0x0040 /* DSP1DRC_SIG_DET_EINT */ | ||
3531 | #define WM8915_DSP1DRC_SIG_DET_EINT_SHIFT 6 /* DSP1DRC_SIG_DET_EINT */ | ||
3532 | #define WM8915_DSP1DRC_SIG_DET_EINT_WIDTH 1 /* DSP1DRC_SIG_DET_EINT */ | ||
3533 | #define WM8915_FLL_SW_CLK_DONE_EINT 0x0008 /* FLL_SW_CLK_DONE_EINT */ | ||
3534 | #define WM8915_FLL_SW_CLK_DONE_EINT_MASK 0x0008 /* FLL_SW_CLK_DONE_EINT */ | ||
3535 | #define WM8915_FLL_SW_CLK_DONE_EINT_SHIFT 3 /* FLL_SW_CLK_DONE_EINT */ | ||
3536 | #define WM8915_FLL_SW_CLK_DONE_EINT_WIDTH 1 /* FLL_SW_CLK_DONE_EINT */ | ||
3537 | #define WM8915_FLL_LOCK_EINT 0x0004 /* FLL_LOCK_EINT */ | ||
3538 | #define WM8915_FLL_LOCK_EINT_MASK 0x0004 /* FLL_LOCK_EINT */ | ||
3539 | #define WM8915_FLL_LOCK_EINT_SHIFT 2 /* FLL_LOCK_EINT */ | ||
3540 | #define WM8915_FLL_LOCK_EINT_WIDTH 1 /* FLL_LOCK_EINT */ | ||
3541 | #define WM8915_HP_DONE_EINT 0x0002 /* HP_DONE_EINT */ | ||
3542 | #define WM8915_HP_DONE_EINT_MASK 0x0002 /* HP_DONE_EINT */ | ||
3543 | #define WM8915_HP_DONE_EINT_SHIFT 1 /* HP_DONE_EINT */ | ||
3544 | #define WM8915_HP_DONE_EINT_WIDTH 1 /* HP_DONE_EINT */ | ||
3545 | #define WM8915_MICD_EINT 0x0001 /* MICD_EINT */ | ||
3546 | #define WM8915_MICD_EINT_MASK 0x0001 /* MICD_EINT */ | ||
3547 | #define WM8915_MICD_EINT_SHIFT 0 /* MICD_EINT */ | ||
3548 | #define WM8915_MICD_EINT_WIDTH 1 /* MICD_EINT */ | ||
3549 | |||
3550 | /* | ||
3551 | * R1842 (0x732) - Interrupt Raw Status 2 | ||
3552 | */ | ||
3553 | #define WM8915_DCS_DONE_23_STS 0x1000 /* DCS_DONE_23_STS */ | ||
3554 | #define WM8915_DCS_DONE_23_STS_MASK 0x1000 /* DCS_DONE_23_STS */ | ||
3555 | #define WM8915_DCS_DONE_23_STS_SHIFT 12 /* DCS_DONE_23_STS */ | ||
3556 | #define WM8915_DCS_DONE_23_STS_WIDTH 1 /* DCS_DONE_23_STS */ | ||
3557 | #define WM8915_DCS_DONE_01_STS 0x0800 /* DCS_DONE_01_STS */ | ||
3558 | #define WM8915_DCS_DONE_01_STS_MASK 0x0800 /* DCS_DONE_01_STS */ | ||
3559 | #define WM8915_DCS_DONE_01_STS_SHIFT 11 /* DCS_DONE_01_STS */ | ||
3560 | #define WM8915_DCS_DONE_01_STS_WIDTH 1 /* DCS_DONE_01_STS */ | ||
3561 | #define WM8915_WSEQ_DONE_STS 0x0400 /* WSEQ_DONE_STS */ | ||
3562 | #define WM8915_WSEQ_DONE_STS_MASK 0x0400 /* WSEQ_DONE_STS */ | ||
3563 | #define WM8915_WSEQ_DONE_STS_SHIFT 10 /* WSEQ_DONE_STS */ | ||
3564 | #define WM8915_WSEQ_DONE_STS_WIDTH 1 /* WSEQ_DONE_STS */ | ||
3565 | #define WM8915_FIFOS_ERR_STS 0x0200 /* FIFOS_ERR_STS */ | ||
3566 | #define WM8915_FIFOS_ERR_STS_MASK 0x0200 /* FIFOS_ERR_STS */ | ||
3567 | #define WM8915_FIFOS_ERR_STS_SHIFT 9 /* FIFOS_ERR_STS */ | ||
3568 | #define WM8915_FIFOS_ERR_STS_WIDTH 1 /* FIFOS_ERR_STS */ | ||
3569 | #define WM8915_DSP2DRC_SIG_DET_STS 0x0080 /* DSP2DRC_SIG_DET_STS */ | ||
3570 | #define WM8915_DSP2DRC_SIG_DET_STS_MASK 0x0080 /* DSP2DRC_SIG_DET_STS */ | ||
3571 | #define WM8915_DSP2DRC_SIG_DET_STS_SHIFT 7 /* DSP2DRC_SIG_DET_STS */ | ||
3572 | #define WM8915_DSP2DRC_SIG_DET_STS_WIDTH 1 /* DSP2DRC_SIG_DET_STS */ | ||
3573 | #define WM8915_DSP1DRC_SIG_DET_STS 0x0040 /* DSP1DRC_SIG_DET_STS */ | ||
3574 | #define WM8915_DSP1DRC_SIG_DET_STS_MASK 0x0040 /* DSP1DRC_SIG_DET_STS */ | ||
3575 | #define WM8915_DSP1DRC_SIG_DET_STS_SHIFT 6 /* DSP1DRC_SIG_DET_STS */ | ||
3576 | #define WM8915_DSP1DRC_SIG_DET_STS_WIDTH 1 /* DSP1DRC_SIG_DET_STS */ | ||
3577 | #define WM8915_FLL_LOCK_STS 0x0004 /* FLL_LOCK_STS */ | ||
3578 | #define WM8915_FLL_LOCK_STS_MASK 0x0004 /* FLL_LOCK_STS */ | ||
3579 | #define WM8915_FLL_LOCK_STS_SHIFT 2 /* FLL_LOCK_STS */ | ||
3580 | #define WM8915_FLL_LOCK_STS_WIDTH 1 /* FLL_LOCK_STS */ | ||
3581 | |||
3582 | /* | ||
3583 | * R1848 (0x738) - Interrupt Status 1 Mask | ||
3584 | */ | ||
3585 | #define WM8915_IM_GP5_EINT 0x0010 /* IM_GP5_EINT */ | ||
3586 | #define WM8915_IM_GP5_EINT_MASK 0x0010 /* IM_GP5_EINT */ | ||
3587 | #define WM8915_IM_GP5_EINT_SHIFT 4 /* IM_GP5_EINT */ | ||
3588 | #define WM8915_IM_GP5_EINT_WIDTH 1 /* IM_GP5_EINT */ | ||
3589 | #define WM8915_IM_GP4_EINT 0x0008 /* IM_GP4_EINT */ | ||
3590 | #define WM8915_IM_GP4_EINT_MASK 0x0008 /* IM_GP4_EINT */ | ||
3591 | #define WM8915_IM_GP4_EINT_SHIFT 3 /* IM_GP4_EINT */ | ||
3592 | #define WM8915_IM_GP4_EINT_WIDTH 1 /* IM_GP4_EINT */ | ||
3593 | #define WM8915_IM_GP3_EINT 0x0004 /* IM_GP3_EINT */ | ||
3594 | #define WM8915_IM_GP3_EINT_MASK 0x0004 /* IM_GP3_EINT */ | ||
3595 | #define WM8915_IM_GP3_EINT_SHIFT 2 /* IM_GP3_EINT */ | ||
3596 | #define WM8915_IM_GP3_EINT_WIDTH 1 /* IM_GP3_EINT */ | ||
3597 | #define WM8915_IM_GP2_EINT 0x0002 /* IM_GP2_EINT */ | ||
3598 | #define WM8915_IM_GP2_EINT_MASK 0x0002 /* IM_GP2_EINT */ | ||
3599 | #define WM8915_IM_GP2_EINT_SHIFT 1 /* IM_GP2_EINT */ | ||
3600 | #define WM8915_IM_GP2_EINT_WIDTH 1 /* IM_GP2_EINT */ | ||
3601 | #define WM8915_IM_GP1_EINT 0x0001 /* IM_GP1_EINT */ | ||
3602 | #define WM8915_IM_GP1_EINT_MASK 0x0001 /* IM_GP1_EINT */ | ||
3603 | #define WM8915_IM_GP1_EINT_SHIFT 0 /* IM_GP1_EINT */ | ||
3604 | #define WM8915_IM_GP1_EINT_WIDTH 1 /* IM_GP1_EINT */ | ||
3605 | |||
3606 | /* | ||
3607 | * R1849 (0x739) - Interrupt Status 2 Mask | ||
3608 | */ | ||
3609 | #define WM8915_IM_DCS_DONE_23_EINT 0x1000 /* IM_DCS_DONE_23_EINT */ | ||
3610 | #define WM8915_IM_DCS_DONE_23_EINT_MASK 0x1000 /* IM_DCS_DONE_23_EINT */ | ||
3611 | #define WM8915_IM_DCS_DONE_23_EINT_SHIFT 12 /* IM_DCS_DONE_23_EINT */ | ||
3612 | #define WM8915_IM_DCS_DONE_23_EINT_WIDTH 1 /* IM_DCS_DONE_23_EINT */ | ||
3613 | #define WM8915_IM_DCS_DONE_01_EINT 0x0800 /* IM_DCS_DONE_01_EINT */ | ||
3614 | #define WM8915_IM_DCS_DONE_01_EINT_MASK 0x0800 /* IM_DCS_DONE_01_EINT */ | ||
3615 | #define WM8915_IM_DCS_DONE_01_EINT_SHIFT 11 /* IM_DCS_DONE_01_EINT */ | ||
3616 | #define WM8915_IM_DCS_DONE_01_EINT_WIDTH 1 /* IM_DCS_DONE_01_EINT */ | ||
3617 | #define WM8915_IM_WSEQ_DONE_EINT 0x0400 /* IM_WSEQ_DONE_EINT */ | ||
3618 | #define WM8915_IM_WSEQ_DONE_EINT_MASK 0x0400 /* IM_WSEQ_DONE_EINT */ | ||
3619 | #define WM8915_IM_WSEQ_DONE_EINT_SHIFT 10 /* IM_WSEQ_DONE_EINT */ | ||
3620 | #define WM8915_IM_WSEQ_DONE_EINT_WIDTH 1 /* IM_WSEQ_DONE_EINT */ | ||
3621 | #define WM8915_IM_FIFOS_ERR_EINT 0x0200 /* IM_FIFOS_ERR_EINT */ | ||
3622 | #define WM8915_IM_FIFOS_ERR_EINT_MASK 0x0200 /* IM_FIFOS_ERR_EINT */ | ||
3623 | #define WM8915_IM_FIFOS_ERR_EINT_SHIFT 9 /* IM_FIFOS_ERR_EINT */ | ||
3624 | #define WM8915_IM_FIFOS_ERR_EINT_WIDTH 1 /* IM_FIFOS_ERR_EINT */ | ||
3625 | #define WM8915_IM_DSP2DRC_SIG_DET_EINT 0x0080 /* IM_DSP2DRC_SIG_DET_EINT */ | ||
3626 | #define WM8915_IM_DSP2DRC_SIG_DET_EINT_MASK 0x0080 /* IM_DSP2DRC_SIG_DET_EINT */ | ||
3627 | #define WM8915_IM_DSP2DRC_SIG_DET_EINT_SHIFT 7 /* IM_DSP2DRC_SIG_DET_EINT */ | ||
3628 | #define WM8915_IM_DSP2DRC_SIG_DET_EINT_WIDTH 1 /* IM_DSP2DRC_SIG_DET_EINT */ | ||
3629 | #define WM8915_IM_DSP1DRC_SIG_DET_EINT 0x0040 /* IM_DSP1DRC_SIG_DET_EINT */ | ||
3630 | #define WM8915_IM_DSP1DRC_SIG_DET_EINT_MASK 0x0040 /* IM_DSP1DRC_SIG_DET_EINT */ | ||
3631 | #define WM8915_IM_DSP1DRC_SIG_DET_EINT_SHIFT 6 /* IM_DSP1DRC_SIG_DET_EINT */ | ||
3632 | #define WM8915_IM_DSP1DRC_SIG_DET_EINT_WIDTH 1 /* IM_DSP1DRC_SIG_DET_EINT */ | ||
3633 | #define WM8915_IM_FLL_SW_CLK_DONE_EINT 0x0008 /* IM_FLL_SW_CLK_DONE_EINT */ | ||
3634 | #define WM8915_IM_FLL_SW_CLK_DONE_EINT_MASK 0x0008 /* IM_FLL_SW_CLK_DONE_EINT */ | ||
3635 | #define WM8915_IM_FLL_SW_CLK_DONE_EINT_SHIFT 3 /* IM_FLL_SW_CLK_DONE_EINT */ | ||
3636 | #define WM8915_IM_FLL_SW_CLK_DONE_EINT_WIDTH 1 /* IM_FLL_SW_CLK_DONE_EINT */ | ||
3637 | #define WM8915_IM_FLL_LOCK_EINT 0x0004 /* IM_FLL_LOCK_EINT */ | ||
3638 | #define WM8915_IM_FLL_LOCK_EINT_MASK 0x0004 /* IM_FLL_LOCK_EINT */ | ||
3639 | #define WM8915_IM_FLL_LOCK_EINT_SHIFT 2 /* IM_FLL_LOCK_EINT */ | ||
3640 | #define WM8915_IM_FLL_LOCK_EINT_WIDTH 1 /* IM_FLL_LOCK_EINT */ | ||
3641 | #define WM8915_IM_HP_DONE_EINT 0x0002 /* IM_HP_DONE_EINT */ | ||
3642 | #define WM8915_IM_HP_DONE_EINT_MASK 0x0002 /* IM_HP_DONE_EINT */ | ||
3643 | #define WM8915_IM_HP_DONE_EINT_SHIFT 1 /* IM_HP_DONE_EINT */ | ||
3644 | #define WM8915_IM_HP_DONE_EINT_WIDTH 1 /* IM_HP_DONE_EINT */ | ||
3645 | #define WM8915_IM_MICD_EINT 0x0001 /* IM_MICD_EINT */ | ||
3646 | #define WM8915_IM_MICD_EINT_MASK 0x0001 /* IM_MICD_EINT */ | ||
3647 | #define WM8915_IM_MICD_EINT_SHIFT 0 /* IM_MICD_EINT */ | ||
3648 | #define WM8915_IM_MICD_EINT_WIDTH 1 /* IM_MICD_EINT */ | ||
3649 | |||
3650 | /* | ||
3651 | * R1856 (0x740) - Interrupt Control | ||
3652 | */ | ||
3653 | #define WM8915_IM_IRQ 0x0001 /* IM_IRQ */ | ||
3654 | #define WM8915_IM_IRQ_MASK 0x0001 /* IM_IRQ */ | ||
3655 | #define WM8915_IM_IRQ_SHIFT 0 /* IM_IRQ */ | ||
3656 | #define WM8915_IM_IRQ_WIDTH 1 /* IM_IRQ */ | ||
3657 | |||
3658 | /* | ||
3659 | * R2048 (0x800) - Left PDM Speaker | ||
3660 | */ | ||
3661 | #define WM8915_SPKL_ENA 0x0010 /* SPKL_ENA */ | ||
3662 | #define WM8915_SPKL_ENA_MASK 0x0010 /* SPKL_ENA */ | ||
3663 | #define WM8915_SPKL_ENA_SHIFT 4 /* SPKL_ENA */ | ||
3664 | #define WM8915_SPKL_ENA_WIDTH 1 /* SPKL_ENA */ | ||
3665 | #define WM8915_SPKL_MUTE 0x0008 /* SPKL_MUTE */ | ||
3666 | #define WM8915_SPKL_MUTE_MASK 0x0008 /* SPKL_MUTE */ | ||
3667 | #define WM8915_SPKL_MUTE_SHIFT 3 /* SPKL_MUTE */ | ||
3668 | #define WM8915_SPKL_MUTE_WIDTH 1 /* SPKL_MUTE */ | ||
3669 | #define WM8915_SPKL_MUTE_ZC 0x0004 /* SPKL_MUTE_ZC */ | ||
3670 | #define WM8915_SPKL_MUTE_ZC_MASK 0x0004 /* SPKL_MUTE_ZC */ | ||
3671 | #define WM8915_SPKL_MUTE_ZC_SHIFT 2 /* SPKL_MUTE_ZC */ | ||
3672 | #define WM8915_SPKL_MUTE_ZC_WIDTH 1 /* SPKL_MUTE_ZC */ | ||
3673 | #define WM8915_SPKL_SRC_MASK 0x0003 /* SPKL_SRC - [1:0] */ | ||
3674 | #define WM8915_SPKL_SRC_SHIFT 0 /* SPKL_SRC - [1:0] */ | ||
3675 | #define WM8915_SPKL_SRC_WIDTH 2 /* SPKL_SRC - [1:0] */ | ||
3676 | |||
3677 | /* | ||
3678 | * R2049 (0x801) - Right PDM Speaker | ||
3679 | */ | ||
3680 | #define WM8915_SPKR_ENA 0x0010 /* SPKR_ENA */ | ||
3681 | #define WM8915_SPKR_ENA_MASK 0x0010 /* SPKR_ENA */ | ||
3682 | #define WM8915_SPKR_ENA_SHIFT 4 /* SPKR_ENA */ | ||
3683 | #define WM8915_SPKR_ENA_WIDTH 1 /* SPKR_ENA */ | ||
3684 | #define WM8915_SPKR_MUTE 0x0008 /* SPKR_MUTE */ | ||
3685 | #define WM8915_SPKR_MUTE_MASK 0x0008 /* SPKR_MUTE */ | ||
3686 | #define WM8915_SPKR_MUTE_SHIFT 3 /* SPKR_MUTE */ | ||
3687 | #define WM8915_SPKR_MUTE_WIDTH 1 /* SPKR_MUTE */ | ||
3688 | #define WM8915_SPKR_MUTE_ZC 0x0004 /* SPKR_MUTE_ZC */ | ||
3689 | #define WM8915_SPKR_MUTE_ZC_MASK 0x0004 /* SPKR_MUTE_ZC */ | ||
3690 | #define WM8915_SPKR_MUTE_ZC_SHIFT 2 /* SPKR_MUTE_ZC */ | ||
3691 | #define WM8915_SPKR_MUTE_ZC_WIDTH 1 /* SPKR_MUTE_ZC */ | ||
3692 | #define WM8915_SPKR_SRC_MASK 0x0003 /* SPKR_SRC - [1:0] */ | ||
3693 | #define WM8915_SPKR_SRC_SHIFT 0 /* SPKR_SRC - [1:0] */ | ||
3694 | #define WM8915_SPKR_SRC_WIDTH 2 /* SPKR_SRC - [1:0] */ | ||
3695 | |||
3696 | /* | ||
3697 | * R2050 (0x802) - PDM Speaker Mute Sequence | ||
3698 | */ | ||
3699 | #define WM8915_SPK_MUTE_ENDIAN 0x0100 /* SPK_MUTE_ENDIAN */ | ||
3700 | #define WM8915_SPK_MUTE_ENDIAN_MASK 0x0100 /* SPK_MUTE_ENDIAN */ | ||
3701 | #define WM8915_SPK_MUTE_ENDIAN_SHIFT 8 /* SPK_MUTE_ENDIAN */ | ||
3702 | #define WM8915_SPK_MUTE_ENDIAN_WIDTH 1 /* SPK_MUTE_ENDIAN */ | ||
3703 | #define WM8915_SPK_MUTE_SEQ1_MASK 0x00FF /* SPK_MUTE_SEQ1 - [7:0] */ | ||
3704 | #define WM8915_SPK_MUTE_SEQ1_SHIFT 0 /* SPK_MUTE_SEQ1 - [7:0] */ | ||
3705 | #define WM8915_SPK_MUTE_SEQ1_WIDTH 8 /* SPK_MUTE_SEQ1 - [7:0] */ | ||
3706 | |||
3707 | /* | ||
3708 | * R2051 (0x803) - PDM Speaker Volume | ||
3709 | */ | ||
3710 | #define WM8915_SPKR_VOL_MASK 0x00F0 /* SPKR_VOL - [7:4] */ | ||
3711 | #define WM8915_SPKR_VOL_SHIFT 4 /* SPKR_VOL - [7:4] */ | ||
3712 | #define WM8915_SPKR_VOL_WIDTH 4 /* SPKR_VOL - [7:4] */ | ||
3713 | #define WM8915_SPKL_VOL_MASK 0x000F /* SPKL_VOL - [3:0] */ | ||
3714 | #define WM8915_SPKL_VOL_SHIFT 0 /* SPKL_VOL - [3:0] */ | ||
3715 | #define WM8915_SPKL_VOL_WIDTH 4 /* SPKL_VOL - [3:0] */ | ||
3716 | |||
3717 | #endif | ||
diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c new file mode 100644 index 000000000000..ab8e9d1aaff0 --- /dev/null +++ b/sound/soc/codecs/wm8996.c | |||
@@ -0,0 +1,2994 @@ | |||
1 | /* | ||
2 | * wm8996.c - WM8996 audio codec interface | ||
3 | * | ||
4 | * Copyright 2011 Wolfson Microelectronics PLC. | ||
5 | * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | */ | ||
12 | |||
13 | #include <linux/module.h> | ||
14 | #include <linux/moduleparam.h> | ||
15 | #include <linux/init.h> | ||
16 | #include <linux/completion.h> | ||
17 | #include <linux/delay.h> | ||
18 | #include <linux/pm.h> | ||
19 | #include <linux/gcd.h> | ||
20 | #include <linux/gpio.h> | ||
21 | #include <linux/i2c.h> | ||
22 | #include <linux/regulator/consumer.h> | ||
23 | #include <linux/slab.h> | ||
24 | #include <linux/workqueue.h> | ||
25 | #include <sound/core.h> | ||
26 | #include <sound/jack.h> | ||
27 | #include <sound/pcm.h> | ||
28 | #include <sound/pcm_params.h> | ||
29 | #include <sound/soc.h> | ||
30 | #include <sound/initval.h> | ||
31 | #include <sound/tlv.h> | ||
32 | #include <trace/events/asoc.h> | ||
33 | |||
34 | #include <sound/wm8996.h> | ||
35 | #include "wm8996.h" | ||
36 | |||
37 | #define WM8996_AIFS 2 | ||
38 | |||
39 | #define HPOUT1L 1 | ||
40 | #define HPOUT1R 2 | ||
41 | #define HPOUT2L 4 | ||
42 | #define HPOUT2R 8 | ||
43 | |||
44 | #define WM8996_NUM_SUPPLIES 4 | ||
45 | static const char *wm8996_supply_names[WM8996_NUM_SUPPLIES] = { | ||
46 | "DBVDD", | ||
47 | "AVDD1", | ||
48 | "AVDD2", | ||
49 | "CPVDD", | ||
50 | }; | ||
51 | |||
52 | struct wm8996_priv { | ||
53 | struct snd_soc_codec *codec; | ||
54 | |||
55 | int ldo1ena; | ||
56 | |||
57 | int sysclk; | ||
58 | int sysclk_src; | ||
59 | |||
60 | int fll_src; | ||
61 | int fll_fref; | ||
62 | int fll_fout; | ||
63 | |||
64 | struct completion fll_lock; | ||
65 | |||
66 | u16 dcs_pending; | ||
67 | struct completion dcs_done; | ||
68 | |||
69 | u16 hpout_ena; | ||
70 | u16 hpout_pending; | ||
71 | |||
72 | struct regulator_bulk_data supplies[WM8996_NUM_SUPPLIES]; | ||
73 | struct notifier_block disable_nb[WM8996_NUM_SUPPLIES]; | ||
74 | |||
75 | struct wm8996_pdata pdata; | ||
76 | |||
77 | int rx_rate[WM8996_AIFS]; | ||
78 | int bclk_rate[WM8996_AIFS]; | ||
79 | |||
80 | /* Platform dependant ReTune mobile configuration */ | ||
81 | int num_retune_mobile_texts; | ||
82 | const char **retune_mobile_texts; | ||
83 | int retune_mobile_cfg[2]; | ||
84 | struct soc_enum retune_mobile_enum; | ||
85 | |||
86 | struct snd_soc_jack *jack; | ||
87 | bool detecting; | ||
88 | bool jack_mic; | ||
89 | wm8996_polarity_fn polarity_cb; | ||
90 | |||
91 | #ifdef CONFIG_GPIOLIB | ||
92 | struct gpio_chip gpio_chip; | ||
93 | #endif | ||
94 | }; | ||
95 | |||
96 | /* We can't use the same notifier block for more than one supply and | ||
97 | * there's no way I can see to get from a callback to the caller | ||
98 | * except container_of(). | ||
99 | */ | ||
100 | #define WM8996_REGULATOR_EVENT(n) \ | ||
101 | static int wm8996_regulator_event_##n(struct notifier_block *nb, \ | ||
102 | unsigned long event, void *data) \ | ||
103 | { \ | ||
104 | struct wm8996_priv *wm8996 = container_of(nb, struct wm8996_priv, \ | ||
105 | disable_nb[n]); \ | ||
106 | if (event & REGULATOR_EVENT_DISABLE) { \ | ||
107 | wm8996->codec->cache_sync = 1; \ | ||
108 | } \ | ||
109 | return 0; \ | ||
110 | } | ||
111 | |||
112 | WM8996_REGULATOR_EVENT(0) | ||
113 | WM8996_REGULATOR_EVENT(1) | ||
114 | WM8996_REGULATOR_EVENT(2) | ||
115 | WM8996_REGULATOR_EVENT(3) | ||
116 | |||
117 | static const u16 wm8996_reg[WM8996_MAX_REGISTER] = { | ||
118 | [WM8996_SOFTWARE_RESET] = 0x8996, | ||
119 | [WM8996_POWER_MANAGEMENT_7] = 0x10, | ||
120 | [WM8996_DAC1_HPOUT1_VOLUME] = 0x88, | ||
121 | [WM8996_DAC2_HPOUT2_VOLUME] = 0x88, | ||
122 | [WM8996_DAC1_LEFT_VOLUME] = 0x2c0, | ||
123 | [WM8996_DAC1_RIGHT_VOLUME] = 0x2c0, | ||
124 | [WM8996_DAC2_LEFT_VOLUME] = 0x2c0, | ||
125 | [WM8996_DAC2_RIGHT_VOLUME] = 0x2c0, | ||
126 | [WM8996_OUTPUT1_LEFT_VOLUME] = 0x80, | ||
127 | [WM8996_OUTPUT1_RIGHT_VOLUME] = 0x80, | ||
128 | [WM8996_OUTPUT2_LEFT_VOLUME] = 0x80, | ||
129 | [WM8996_OUTPUT2_RIGHT_VOLUME] = 0x80, | ||
130 | [WM8996_MICBIAS_1] = 0x39, | ||
131 | [WM8996_MICBIAS_2] = 0x39, | ||
132 | [WM8996_LDO_1] = 0x3, | ||
133 | [WM8996_LDO_2] = 0x13, | ||
134 | [WM8996_ACCESSORY_DETECT_MODE_1] = 0x4, | ||
135 | [WM8996_HEADPHONE_DETECT_1] = 0x20, | ||
136 | [WM8996_MIC_DETECT_1] = 0x7600, | ||
137 | [WM8996_MIC_DETECT_2] = 0xbf, | ||
138 | [WM8996_CHARGE_PUMP_1] = 0x1f25, | ||
139 | [WM8996_CHARGE_PUMP_2] = 0xab19, | ||
140 | [WM8996_DC_SERVO_5] = 0x2a2a, | ||
141 | [WM8996_CONTROL_INTERFACE_1] = 0x8004, | ||
142 | [WM8996_CLOCKING_1] = 0x10, | ||
143 | [WM8996_AIF_RATE] = 0x83, | ||
144 | [WM8996_FLL_CONTROL_4] = 0x5dc0, | ||
145 | [WM8996_FLL_CONTROL_5] = 0xc84, | ||
146 | [WM8996_FLL_EFS_2] = 0x2, | ||
147 | [WM8996_AIF1_TX_LRCLK_1] = 0x80, | ||
148 | [WM8996_AIF1_TX_LRCLK_2] = 0x8, | ||
149 | [WM8996_AIF1_RX_LRCLK_1] = 0x80, | ||
150 | [WM8996_AIF1TX_DATA_CONFIGURATION_1] = 0x1818, | ||
151 | [WM8996_AIF1RX_DATA_CONFIGURATION] = 0x1818, | ||
152 | [WM8996_AIF1TX_TEST] = 0x7, | ||
153 | [WM8996_AIF2_TX_LRCLK_1] = 0x80, | ||
154 | [WM8996_AIF2_TX_LRCLK_2] = 0x8, | ||
155 | [WM8996_AIF2_RX_LRCLK_1] = 0x80, | ||
156 | [WM8996_AIF2TX_DATA_CONFIGURATION_1] = 0x1818, | ||
157 | [WM8996_AIF2RX_DATA_CONFIGURATION] = 0x1818, | ||
158 | [WM8996_AIF2TX_TEST] = 0x1, | ||
159 | [WM8996_DSP1_TX_LEFT_VOLUME] = 0xc0, | ||
160 | [WM8996_DSP1_TX_RIGHT_VOLUME] = 0xc0, | ||
161 | [WM8996_DSP1_RX_LEFT_VOLUME] = 0xc0, | ||
162 | [WM8996_DSP1_RX_RIGHT_VOLUME] = 0xc0, | ||
163 | [WM8996_DSP1_TX_FILTERS] = 0x2000, | ||
164 | [WM8996_DSP1_RX_FILTERS_1] = 0x200, | ||
165 | [WM8996_DSP1_RX_FILTERS_2] = 0x10, | ||
166 | [WM8996_DSP1_DRC_1] = 0x98, | ||
167 | [WM8996_DSP1_DRC_2] = 0x845, | ||
168 | [WM8996_DSP1_RX_EQ_GAINS_1] = 0x6318, | ||
169 | [WM8996_DSP1_RX_EQ_GAINS_2] = 0x6300, | ||
170 | [WM8996_DSP1_RX_EQ_BAND_1_A] = 0xfca, | ||
171 | [WM8996_DSP1_RX_EQ_BAND_1_B] = 0x400, | ||
172 | [WM8996_DSP1_RX_EQ_BAND_1_PG] = 0xd8, | ||
173 | [WM8996_DSP1_RX_EQ_BAND_2_A] = 0x1eb5, | ||
174 | [WM8996_DSP1_RX_EQ_BAND_2_B] = 0xf145, | ||
175 | [WM8996_DSP1_RX_EQ_BAND_2_C] = 0xb75, | ||
176 | [WM8996_DSP1_RX_EQ_BAND_2_PG] = 0x1c5, | ||
177 | [WM8996_DSP1_RX_EQ_BAND_3_A] = 0x1c58, | ||
178 | [WM8996_DSP1_RX_EQ_BAND_3_B] = 0xf373, | ||
179 | [WM8996_DSP1_RX_EQ_BAND_3_C] = 0xa54, | ||
180 | [WM8996_DSP1_RX_EQ_BAND_3_PG] = 0x558, | ||
181 | [WM8996_DSP1_RX_EQ_BAND_4_A] = 0x168e, | ||
182 | [WM8996_DSP1_RX_EQ_BAND_4_B] = 0xf829, | ||
183 | [WM8996_DSP1_RX_EQ_BAND_4_C] = 0x7ad, | ||
184 | [WM8996_DSP1_RX_EQ_BAND_4_PG] = 0x1103, | ||
185 | [WM8996_DSP1_RX_EQ_BAND_5_A] = 0x564, | ||
186 | [WM8996_DSP1_RX_EQ_BAND_5_B] = 0x559, | ||
187 | [WM8996_DSP1_RX_EQ_BAND_5_PG] = 0x4000, | ||
188 | [WM8996_DSP2_TX_LEFT_VOLUME] = 0xc0, | ||
189 | [WM8996_DSP2_TX_RIGHT_VOLUME] = 0xc0, | ||
190 | [WM8996_DSP2_RX_LEFT_VOLUME] = 0xc0, | ||
191 | [WM8996_DSP2_RX_RIGHT_VOLUME] = 0xc0, | ||
192 | [WM8996_DSP2_TX_FILTERS] = 0x2000, | ||
193 | [WM8996_DSP2_RX_FILTERS_1] = 0x200, | ||
194 | [WM8996_DSP2_RX_FILTERS_2] = 0x10, | ||
195 | [WM8996_DSP2_DRC_1] = 0x98, | ||
196 | [WM8996_DSP2_DRC_2] = 0x845, | ||
197 | [WM8996_DSP2_RX_EQ_GAINS_1] = 0x6318, | ||
198 | [WM8996_DSP2_RX_EQ_GAINS_2] = 0x6300, | ||
199 | [WM8996_DSP2_RX_EQ_BAND_1_A] = 0xfca, | ||
200 | [WM8996_DSP2_RX_EQ_BAND_1_B] = 0x400, | ||
201 | [WM8996_DSP2_RX_EQ_BAND_1_PG] = 0xd8, | ||
202 | [WM8996_DSP2_RX_EQ_BAND_2_A] = 0x1eb5, | ||
203 | [WM8996_DSP2_RX_EQ_BAND_2_B] = 0xf145, | ||
204 | [WM8996_DSP2_RX_EQ_BAND_2_C] = 0xb75, | ||
205 | [WM8996_DSP2_RX_EQ_BAND_2_PG] = 0x1c5, | ||
206 | [WM8996_DSP2_RX_EQ_BAND_3_A] = 0x1c58, | ||
207 | [WM8996_DSP2_RX_EQ_BAND_3_B] = 0xf373, | ||
208 | [WM8996_DSP2_RX_EQ_BAND_3_C] = 0xa54, | ||
209 | [WM8996_DSP2_RX_EQ_BAND_3_PG] = 0x558, | ||
210 | [WM8996_DSP2_RX_EQ_BAND_4_A] = 0x168e, | ||
211 | [WM8996_DSP2_RX_EQ_BAND_4_B] = 0xf829, | ||
212 | [WM8996_DSP2_RX_EQ_BAND_4_C] = 0x7ad, | ||
213 | [WM8996_DSP2_RX_EQ_BAND_4_PG] = 0x1103, | ||
214 | [WM8996_DSP2_RX_EQ_BAND_5_A] = 0x564, | ||
215 | [WM8996_DSP2_RX_EQ_BAND_5_B] = 0x559, | ||
216 | [WM8996_DSP2_RX_EQ_BAND_5_PG] = 0x4000, | ||
217 | [WM8996_OVERSAMPLING] = 0xd, | ||
218 | [WM8996_SIDETONE] = 0x1040, | ||
219 | [WM8996_GPIO_1] = 0xa101, | ||
220 | [WM8996_GPIO_2] = 0xa101, | ||
221 | [WM8996_GPIO_3] = 0xa101, | ||
222 | [WM8996_GPIO_4] = 0xa101, | ||
223 | [WM8996_GPIO_5] = 0xa101, | ||
224 | [WM8996_PULL_CONTROL_2] = 0x140, | ||
225 | [WM8996_INTERRUPT_STATUS_1_MASK] = 0x1f, | ||
226 | [WM8996_INTERRUPT_STATUS_2_MASK] = 0x1ecf, | ||
227 | [WM8996_RIGHT_PDM_SPEAKER] = 0x1, | ||
228 | [WM8996_PDM_SPEAKER_MUTE_SEQUENCE] = 0x69, | ||
229 | [WM8996_PDM_SPEAKER_VOLUME] = 0x66, | ||
230 | [WM8996_WRITE_SEQUENCER_0] = 0x1, | ||
231 | [WM8996_WRITE_SEQUENCER_1] = 0x1, | ||
232 | [WM8996_WRITE_SEQUENCER_3] = 0x6, | ||
233 | [WM8996_WRITE_SEQUENCER_4] = 0x40, | ||
234 | [WM8996_WRITE_SEQUENCER_5] = 0x1, | ||
235 | [WM8996_WRITE_SEQUENCER_6] = 0xf, | ||
236 | [WM8996_WRITE_SEQUENCER_7] = 0x6, | ||
237 | [WM8996_WRITE_SEQUENCER_8] = 0x1, | ||
238 | [WM8996_WRITE_SEQUENCER_9] = 0x3, | ||
239 | [WM8996_WRITE_SEQUENCER_10] = 0x104, | ||
240 | [WM8996_WRITE_SEQUENCER_12] = 0x60, | ||
241 | [WM8996_WRITE_SEQUENCER_13] = 0x11, | ||
242 | [WM8996_WRITE_SEQUENCER_14] = 0x401, | ||
243 | [WM8996_WRITE_SEQUENCER_16] = 0x50, | ||
244 | [WM8996_WRITE_SEQUENCER_17] = 0x3, | ||
245 | [WM8996_WRITE_SEQUENCER_18] = 0x100, | ||
246 | [WM8996_WRITE_SEQUENCER_20] = 0x51, | ||
247 | [WM8996_WRITE_SEQUENCER_21] = 0x3, | ||
248 | [WM8996_WRITE_SEQUENCER_22] = 0x104, | ||
249 | [WM8996_WRITE_SEQUENCER_23] = 0xa, | ||
250 | [WM8996_WRITE_SEQUENCER_24] = 0x60, | ||
251 | [WM8996_WRITE_SEQUENCER_25] = 0x3b, | ||
252 | [WM8996_WRITE_SEQUENCER_26] = 0x502, | ||
253 | [WM8996_WRITE_SEQUENCER_27] = 0x100, | ||
254 | [WM8996_WRITE_SEQUENCER_28] = 0x2fff, | ||
255 | [WM8996_WRITE_SEQUENCER_32] = 0x2fff, | ||
256 | [WM8996_WRITE_SEQUENCER_36] = 0x2fff, | ||
257 | [WM8996_WRITE_SEQUENCER_40] = 0x2fff, | ||
258 | [WM8996_WRITE_SEQUENCER_44] = 0x2fff, | ||
259 | [WM8996_WRITE_SEQUENCER_48] = 0x2fff, | ||
260 | [WM8996_WRITE_SEQUENCER_52] = 0x2fff, | ||
261 | [WM8996_WRITE_SEQUENCER_56] = 0x2fff, | ||
262 | [WM8996_WRITE_SEQUENCER_60] = 0x2fff, | ||
263 | [WM8996_WRITE_SEQUENCER_64] = 0x1, | ||
264 | [WM8996_WRITE_SEQUENCER_65] = 0x1, | ||
265 | [WM8996_WRITE_SEQUENCER_67] = 0x6, | ||
266 | [WM8996_WRITE_SEQUENCER_68] = 0x40, | ||
267 | [WM8996_WRITE_SEQUENCER_69] = 0x1, | ||
268 | [WM8996_WRITE_SEQUENCER_70] = 0xf, | ||
269 | [WM8996_WRITE_SEQUENCER_71] = 0x6, | ||
270 | [WM8996_WRITE_SEQUENCER_72] = 0x1, | ||
271 | [WM8996_WRITE_SEQUENCER_73] = 0x3, | ||
272 | [WM8996_WRITE_SEQUENCER_74] = 0x104, | ||
273 | [WM8996_WRITE_SEQUENCER_76] = 0x60, | ||
274 | [WM8996_WRITE_SEQUENCER_77] = 0x11, | ||
275 | [WM8996_WRITE_SEQUENCER_78] = 0x401, | ||
276 | [WM8996_WRITE_SEQUENCER_80] = 0x50, | ||
277 | [WM8996_WRITE_SEQUENCER_81] = 0x3, | ||
278 | [WM8996_WRITE_SEQUENCER_82] = 0x100, | ||
279 | [WM8996_WRITE_SEQUENCER_84] = 0x60, | ||
280 | [WM8996_WRITE_SEQUENCER_85] = 0x3b, | ||
281 | [WM8996_WRITE_SEQUENCER_86] = 0x502, | ||
282 | [WM8996_WRITE_SEQUENCER_87] = 0x100, | ||
283 | [WM8996_WRITE_SEQUENCER_88] = 0x2fff, | ||
284 | [WM8996_WRITE_SEQUENCER_92] = 0x2fff, | ||
285 | [WM8996_WRITE_SEQUENCER_96] = 0x2fff, | ||
286 | [WM8996_WRITE_SEQUENCER_100] = 0x2fff, | ||
287 | [WM8996_WRITE_SEQUENCER_104] = 0x2fff, | ||
288 | [WM8996_WRITE_SEQUENCER_108] = 0x2fff, | ||
289 | [WM8996_WRITE_SEQUENCER_112] = 0x2fff, | ||
290 | [WM8996_WRITE_SEQUENCER_116] = 0x2fff, | ||
291 | [WM8996_WRITE_SEQUENCER_120] = 0x2fff, | ||
292 | [WM8996_WRITE_SEQUENCER_124] = 0x2fff, | ||
293 | [WM8996_WRITE_SEQUENCER_128] = 0x1, | ||
294 | [WM8996_WRITE_SEQUENCER_129] = 0x1, | ||
295 | [WM8996_WRITE_SEQUENCER_131] = 0x6, | ||
296 | [WM8996_WRITE_SEQUENCER_132] = 0x40, | ||
297 | [WM8996_WRITE_SEQUENCER_133] = 0x1, | ||
298 | [WM8996_WRITE_SEQUENCER_134] = 0xf, | ||
299 | [WM8996_WRITE_SEQUENCER_135] = 0x6, | ||
300 | [WM8996_WRITE_SEQUENCER_136] = 0x1, | ||
301 | [WM8996_WRITE_SEQUENCER_137] = 0x3, | ||
302 | [WM8996_WRITE_SEQUENCER_138] = 0x106, | ||
303 | [WM8996_WRITE_SEQUENCER_140] = 0x61, | ||
304 | [WM8996_WRITE_SEQUENCER_141] = 0x11, | ||
305 | [WM8996_WRITE_SEQUENCER_142] = 0x401, | ||
306 | [WM8996_WRITE_SEQUENCER_144] = 0x50, | ||
307 | [WM8996_WRITE_SEQUENCER_145] = 0x3, | ||
308 | [WM8996_WRITE_SEQUENCER_146] = 0x102, | ||
309 | [WM8996_WRITE_SEQUENCER_148] = 0x51, | ||
310 | [WM8996_WRITE_SEQUENCER_149] = 0x3, | ||
311 | [WM8996_WRITE_SEQUENCER_150] = 0x106, | ||
312 | [WM8996_WRITE_SEQUENCER_151] = 0xa, | ||
313 | [WM8996_WRITE_SEQUENCER_152] = 0x61, | ||
314 | [WM8996_WRITE_SEQUENCER_153] = 0x3b, | ||
315 | [WM8996_WRITE_SEQUENCER_154] = 0x502, | ||
316 | [WM8996_WRITE_SEQUENCER_155] = 0x100, | ||
317 | [WM8996_WRITE_SEQUENCER_156] = 0x2fff, | ||
318 | [WM8996_WRITE_SEQUENCER_160] = 0x2fff, | ||
319 | [WM8996_WRITE_SEQUENCER_164] = 0x2fff, | ||
320 | [WM8996_WRITE_SEQUENCER_168] = 0x2fff, | ||
321 | [WM8996_WRITE_SEQUENCER_172] = 0x2fff, | ||
322 | [WM8996_WRITE_SEQUENCER_176] = 0x2fff, | ||
323 | [WM8996_WRITE_SEQUENCER_180] = 0x2fff, | ||
324 | [WM8996_WRITE_SEQUENCER_184] = 0x2fff, | ||
325 | [WM8996_WRITE_SEQUENCER_188] = 0x2fff, | ||
326 | [WM8996_WRITE_SEQUENCER_192] = 0x1, | ||
327 | [WM8996_WRITE_SEQUENCER_193] = 0x1, | ||
328 | [WM8996_WRITE_SEQUENCER_195] = 0x6, | ||
329 | [WM8996_WRITE_SEQUENCER_196] = 0x40, | ||
330 | [WM8996_WRITE_SEQUENCER_197] = 0x1, | ||
331 | [WM8996_WRITE_SEQUENCER_198] = 0xf, | ||
332 | [WM8996_WRITE_SEQUENCER_199] = 0x6, | ||
333 | [WM8996_WRITE_SEQUENCER_200] = 0x1, | ||
334 | [WM8996_WRITE_SEQUENCER_201] = 0x3, | ||
335 | [WM8996_WRITE_SEQUENCER_202] = 0x106, | ||
336 | [WM8996_WRITE_SEQUENCER_204] = 0x61, | ||
337 | [WM8996_WRITE_SEQUENCER_205] = 0x11, | ||
338 | [WM8996_WRITE_SEQUENCER_206] = 0x401, | ||
339 | [WM8996_WRITE_SEQUENCER_208] = 0x50, | ||
340 | [WM8996_WRITE_SEQUENCER_209] = 0x3, | ||
341 | [WM8996_WRITE_SEQUENCER_210] = 0x102, | ||
342 | [WM8996_WRITE_SEQUENCER_212] = 0x61, | ||
343 | [WM8996_WRITE_SEQUENCER_213] = 0x3b, | ||
344 | [WM8996_WRITE_SEQUENCER_214] = 0x502, | ||
345 | [WM8996_WRITE_SEQUENCER_215] = 0x100, | ||
346 | [WM8996_WRITE_SEQUENCER_216] = 0x2fff, | ||
347 | [WM8996_WRITE_SEQUENCER_220] = 0x2fff, | ||
348 | [WM8996_WRITE_SEQUENCER_224] = 0x2fff, | ||
349 | [WM8996_WRITE_SEQUENCER_228] = 0x2fff, | ||
350 | [WM8996_WRITE_SEQUENCER_232] = 0x2fff, | ||
351 | [WM8996_WRITE_SEQUENCER_236] = 0x2fff, | ||
352 | [WM8996_WRITE_SEQUENCER_240] = 0x2fff, | ||
353 | [WM8996_WRITE_SEQUENCER_244] = 0x2fff, | ||
354 | [WM8996_WRITE_SEQUENCER_248] = 0x2fff, | ||
355 | [WM8996_WRITE_SEQUENCER_252] = 0x2fff, | ||
356 | [WM8996_WRITE_SEQUENCER_256] = 0x60, | ||
357 | [WM8996_WRITE_SEQUENCER_258] = 0x601, | ||
358 | [WM8996_WRITE_SEQUENCER_260] = 0x50, | ||
359 | [WM8996_WRITE_SEQUENCER_262] = 0x100, | ||
360 | [WM8996_WRITE_SEQUENCER_264] = 0x1, | ||
361 | [WM8996_WRITE_SEQUENCER_266] = 0x104, | ||
362 | [WM8996_WRITE_SEQUENCER_267] = 0x100, | ||
363 | [WM8996_WRITE_SEQUENCER_268] = 0x2fff, | ||
364 | [WM8996_WRITE_SEQUENCER_272] = 0x2fff, | ||
365 | [WM8996_WRITE_SEQUENCER_276] = 0x2fff, | ||
366 | [WM8996_WRITE_SEQUENCER_280] = 0x2fff, | ||
367 | [WM8996_WRITE_SEQUENCER_284] = 0x2fff, | ||
368 | [WM8996_WRITE_SEQUENCER_288] = 0x2fff, | ||
369 | [WM8996_WRITE_SEQUENCER_292] = 0x2fff, | ||
370 | [WM8996_WRITE_SEQUENCER_296] = 0x2fff, | ||
371 | [WM8996_WRITE_SEQUENCER_300] = 0x2fff, | ||
372 | [WM8996_WRITE_SEQUENCER_304] = 0x2fff, | ||
373 | [WM8996_WRITE_SEQUENCER_308] = 0x2fff, | ||
374 | [WM8996_WRITE_SEQUENCER_312] = 0x2fff, | ||
375 | [WM8996_WRITE_SEQUENCER_316] = 0x2fff, | ||
376 | [WM8996_WRITE_SEQUENCER_320] = 0x61, | ||
377 | [WM8996_WRITE_SEQUENCER_322] = 0x601, | ||
378 | [WM8996_WRITE_SEQUENCER_324] = 0x50, | ||
379 | [WM8996_WRITE_SEQUENCER_326] = 0x102, | ||
380 | [WM8996_WRITE_SEQUENCER_328] = 0x1, | ||
381 | [WM8996_WRITE_SEQUENCER_330] = 0x106, | ||
382 | [WM8996_WRITE_SEQUENCER_331] = 0x100, | ||
383 | [WM8996_WRITE_SEQUENCER_332] = 0x2fff, | ||
384 | [WM8996_WRITE_SEQUENCER_336] = 0x2fff, | ||
385 | [WM8996_WRITE_SEQUENCER_340] = 0x2fff, | ||
386 | [WM8996_WRITE_SEQUENCER_344] = 0x2fff, | ||
387 | [WM8996_WRITE_SEQUENCER_348] = 0x2fff, | ||
388 | [WM8996_WRITE_SEQUENCER_352] = 0x2fff, | ||
389 | [WM8996_WRITE_SEQUENCER_356] = 0x2fff, | ||
390 | [WM8996_WRITE_SEQUENCER_360] = 0x2fff, | ||
391 | [WM8996_WRITE_SEQUENCER_364] = 0x2fff, | ||
392 | [WM8996_WRITE_SEQUENCER_368] = 0x2fff, | ||
393 | [WM8996_WRITE_SEQUENCER_372] = 0x2fff, | ||
394 | [WM8996_WRITE_SEQUENCER_376] = 0x2fff, | ||
395 | [WM8996_WRITE_SEQUENCER_380] = 0x2fff, | ||
396 | [WM8996_WRITE_SEQUENCER_384] = 0x60, | ||
397 | [WM8996_WRITE_SEQUENCER_386] = 0x601, | ||
398 | [WM8996_WRITE_SEQUENCER_388] = 0x61, | ||
399 | [WM8996_WRITE_SEQUENCER_390] = 0x601, | ||
400 | [WM8996_WRITE_SEQUENCER_392] = 0x50, | ||
401 | [WM8996_WRITE_SEQUENCER_394] = 0x300, | ||
402 | [WM8996_WRITE_SEQUENCER_396] = 0x1, | ||
403 | [WM8996_WRITE_SEQUENCER_398] = 0x304, | ||
404 | [WM8996_WRITE_SEQUENCER_400] = 0x40, | ||
405 | [WM8996_WRITE_SEQUENCER_402] = 0xf, | ||
406 | [WM8996_WRITE_SEQUENCER_404] = 0x1, | ||
407 | [WM8996_WRITE_SEQUENCER_407] = 0x100, | ||
408 | }; | ||
409 | |||
410 | static const DECLARE_TLV_DB_SCALE(inpga_tlv, 0, 100, 0); | ||
411 | static const DECLARE_TLV_DB_SCALE(sidetone_tlv, -3600, 150, 0); | ||
412 | static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1); | ||
413 | static const DECLARE_TLV_DB_SCALE(out_digital_tlv, -1200, 150, 0); | ||
414 | static const DECLARE_TLV_DB_SCALE(out_tlv, -900, 75, 0); | ||
415 | static const DECLARE_TLV_DB_SCALE(spk_tlv, -900, 150, 0); | ||
416 | static const DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0); | ||
417 | |||
418 | static const char *sidetone_hpf_text[] = { | ||
419 | "2.9kHz", "1.5kHz", "735Hz", "403Hz", "196Hz", "98Hz", "49Hz" | ||
420 | }; | ||
421 | |||
422 | static const struct soc_enum sidetone_hpf = | ||
423 | SOC_ENUM_SINGLE(WM8996_SIDETONE, 7, 6, sidetone_hpf_text); | ||
424 | |||
425 | static const char *hpf_mode_text[] = { | ||
426 | "HiFi", "Custom", "Voice" | ||
427 | }; | ||
428 | |||
429 | static const struct soc_enum dsp1tx_hpf_mode = | ||
430 | SOC_ENUM_SINGLE(WM8996_DSP1_TX_FILTERS, 3, 3, hpf_mode_text); | ||
431 | |||
432 | static const struct soc_enum dsp2tx_hpf_mode = | ||
433 | SOC_ENUM_SINGLE(WM8996_DSP2_TX_FILTERS, 3, 3, hpf_mode_text); | ||
434 | |||
435 | static const char *hpf_cutoff_text[] = { | ||
436 | "50Hz", "75Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz" | ||
437 | }; | ||
438 | |||
439 | static const struct soc_enum dsp1tx_hpf_cutoff = | ||
440 | SOC_ENUM_SINGLE(WM8996_DSP1_TX_FILTERS, 0, 7, hpf_cutoff_text); | ||
441 | |||
442 | static const struct soc_enum dsp2tx_hpf_cutoff = | ||
443 | SOC_ENUM_SINGLE(WM8996_DSP2_TX_FILTERS, 0, 7, hpf_cutoff_text); | ||
444 | |||
445 | static void wm8996_set_retune_mobile(struct snd_soc_codec *codec, int block) | ||
446 | { | ||
447 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
448 | struct wm8996_pdata *pdata = &wm8996->pdata; | ||
449 | int base, best, best_val, save, i, cfg, iface; | ||
450 | |||
451 | if (!wm8996->num_retune_mobile_texts) | ||
452 | return; | ||
453 | |||
454 | switch (block) { | ||
455 | case 0: | ||
456 | base = WM8996_DSP1_RX_EQ_GAINS_1; | ||
457 | if (snd_soc_read(codec, WM8996_POWER_MANAGEMENT_8) & | ||
458 | WM8996_DSP1RX_SRC) | ||
459 | iface = 1; | ||
460 | else | ||
461 | iface = 0; | ||
462 | break; | ||
463 | case 1: | ||
464 | base = WM8996_DSP1_RX_EQ_GAINS_2; | ||
465 | if (snd_soc_read(codec, WM8996_POWER_MANAGEMENT_8) & | ||
466 | WM8996_DSP2RX_SRC) | ||
467 | iface = 1; | ||
468 | else | ||
469 | iface = 0; | ||
470 | break; | ||
471 | default: | ||
472 | return; | ||
473 | } | ||
474 | |||
475 | /* Find the version of the currently selected configuration | ||
476 | * with the nearest sample rate. */ | ||
477 | cfg = wm8996->retune_mobile_cfg[block]; | ||
478 | best = 0; | ||
479 | best_val = INT_MAX; | ||
480 | for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { | ||
481 | if (strcmp(pdata->retune_mobile_cfgs[i].name, | ||
482 | wm8996->retune_mobile_texts[cfg]) == 0 && | ||
483 | abs(pdata->retune_mobile_cfgs[i].rate | ||
484 | - wm8996->rx_rate[iface]) < best_val) { | ||
485 | best = i; | ||
486 | best_val = abs(pdata->retune_mobile_cfgs[i].rate | ||
487 | - wm8996->rx_rate[iface]); | ||
488 | } | ||
489 | } | ||
490 | |||
491 | dev_dbg(codec->dev, "ReTune Mobile %d %s/%dHz for %dHz sample rate\n", | ||
492 | block, | ||
493 | pdata->retune_mobile_cfgs[best].name, | ||
494 | pdata->retune_mobile_cfgs[best].rate, | ||
495 | wm8996->rx_rate[iface]); | ||
496 | |||
497 | /* The EQ will be disabled while reconfiguring it, remember the | ||
498 | * current configuration. | ||
499 | */ | ||
500 | save = snd_soc_read(codec, base); | ||
501 | save &= WM8996_DSP1RX_EQ_ENA; | ||
502 | |||
503 | for (i = 0; i < ARRAY_SIZE(pdata->retune_mobile_cfgs[best].regs); i++) | ||
504 | snd_soc_update_bits(codec, base + i, 0xffff, | ||
505 | pdata->retune_mobile_cfgs[best].regs[i]); | ||
506 | |||
507 | snd_soc_update_bits(codec, base, WM8996_DSP1RX_EQ_ENA, save); | ||
508 | } | ||
509 | |||
510 | /* Icky as hell but saves code duplication */ | ||
511 | static int wm8996_get_retune_mobile_block(const char *name) | ||
512 | { | ||
513 | if (strcmp(name, "DSP1 EQ Mode") == 0) | ||
514 | return 0; | ||
515 | if (strcmp(name, "DSP2 EQ Mode") == 0) | ||
516 | return 1; | ||
517 | return -EINVAL; | ||
518 | } | ||
519 | |||
520 | static int wm8996_put_retune_mobile_enum(struct snd_kcontrol *kcontrol, | ||
521 | struct snd_ctl_elem_value *ucontrol) | ||
522 | { | ||
523 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
524 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
525 | struct wm8996_pdata *pdata = &wm8996->pdata; | ||
526 | int block = wm8996_get_retune_mobile_block(kcontrol->id.name); | ||
527 | int value = ucontrol->value.integer.value[0]; | ||
528 | |||
529 | if (block < 0) | ||
530 | return block; | ||
531 | |||
532 | if (value >= pdata->num_retune_mobile_cfgs) | ||
533 | return -EINVAL; | ||
534 | |||
535 | wm8996->retune_mobile_cfg[block] = value; | ||
536 | |||
537 | wm8996_set_retune_mobile(codec, block); | ||
538 | |||
539 | return 0; | ||
540 | } | ||
541 | |||
542 | static int wm8996_get_retune_mobile_enum(struct snd_kcontrol *kcontrol, | ||
543 | struct snd_ctl_elem_value *ucontrol) | ||
544 | { | ||
545 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | ||
546 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
547 | int block = wm8996_get_retune_mobile_block(kcontrol->id.name); | ||
548 | |||
549 | ucontrol->value.enumerated.item[0] = wm8996->retune_mobile_cfg[block]; | ||
550 | |||
551 | return 0; | ||
552 | } | ||
553 | |||
554 | static const struct snd_kcontrol_new wm8996_snd_controls[] = { | ||
555 | SOC_DOUBLE_R_TLV("Capture Volume", WM8996_LEFT_LINE_INPUT_VOLUME, | ||
556 | WM8996_RIGHT_LINE_INPUT_VOLUME, 0, 31, 0, inpga_tlv), | ||
557 | SOC_DOUBLE_R("Capture ZC Switch", WM8996_LEFT_LINE_INPUT_VOLUME, | ||
558 | WM8996_RIGHT_LINE_INPUT_VOLUME, 5, 1, 0), | ||
559 | |||
560 | SOC_DOUBLE_TLV("DAC1 Sidetone Volume", WM8996_DAC1_MIXER_VOLUMES, | ||
561 | 0, 5, 24, 0, sidetone_tlv), | ||
562 | SOC_DOUBLE_TLV("DAC2 Sidetone Volume", WM8996_DAC2_MIXER_VOLUMES, | ||
563 | 0, 5, 24, 0, sidetone_tlv), | ||
564 | SOC_SINGLE("Sidetone LPF Switch", WM8996_SIDETONE, 12, 1, 0), | ||
565 | SOC_ENUM("Sidetone HPF Cut-off", sidetone_hpf), | ||
566 | SOC_SINGLE("Sidetone HPF Switch", WM8996_SIDETONE, 6, 1, 0), | ||
567 | |||
568 | SOC_DOUBLE_R_TLV("DSP1 Capture Volume", WM8996_DSP1_TX_LEFT_VOLUME, | ||
569 | WM8996_DSP1_TX_RIGHT_VOLUME, 1, 96, 0, digital_tlv), | ||
570 | SOC_DOUBLE_R_TLV("DSP2 Capture Volume", WM8996_DSP2_TX_LEFT_VOLUME, | ||
571 | WM8996_DSP2_TX_RIGHT_VOLUME, 1, 96, 0, digital_tlv), | ||
572 | |||
573 | SOC_SINGLE("DSP1 Capture Notch Filter Switch", WM8996_DSP1_TX_FILTERS, | ||
574 | 13, 1, 0), | ||
575 | SOC_DOUBLE("DSP1 Capture HPF Switch", WM8996_DSP1_TX_FILTERS, 12, 11, 1, 0), | ||
576 | SOC_ENUM("DSP1 Capture HPF Mode", dsp1tx_hpf_mode), | ||
577 | SOC_ENUM("DSP1 Capture HPF Cutoff", dsp1tx_hpf_cutoff), | ||
578 | |||
579 | SOC_SINGLE("DSP2 Capture Notch Filter Switch", WM8996_DSP2_TX_FILTERS, | ||
580 | 13, 1, 0), | ||
581 | SOC_DOUBLE("DSP2 Capture HPF Switch", WM8996_DSP2_TX_FILTERS, 12, 11, 1, 0), | ||
582 | SOC_ENUM("DSP2 Capture HPF Mode", dsp2tx_hpf_mode), | ||
583 | SOC_ENUM("DSP2 Capture HPF Cutoff", dsp2tx_hpf_cutoff), | ||
584 | |||
585 | SOC_DOUBLE_R_TLV("DSP1 Playback Volume", WM8996_DSP1_RX_LEFT_VOLUME, | ||
586 | WM8996_DSP1_RX_RIGHT_VOLUME, 1, 112, 0, digital_tlv), | ||
587 | SOC_SINGLE("DSP1 Playback Switch", WM8996_DSP1_RX_FILTERS_1, 9, 1, 1), | ||
588 | |||
589 | SOC_DOUBLE_R_TLV("DSP2 Playback Volume", WM8996_DSP2_RX_LEFT_VOLUME, | ||
590 | WM8996_DSP2_RX_RIGHT_VOLUME, 1, 112, 0, digital_tlv), | ||
591 | SOC_SINGLE("DSP2 Playback Switch", WM8996_DSP2_RX_FILTERS_1, 9, 1, 1), | ||
592 | |||
593 | SOC_DOUBLE_R_TLV("DAC1 Volume", WM8996_DAC1_LEFT_VOLUME, | ||
594 | WM8996_DAC1_RIGHT_VOLUME, 1, 112, 0, digital_tlv), | ||
595 | SOC_DOUBLE_R("DAC1 Switch", WM8996_DAC1_LEFT_VOLUME, | ||
596 | WM8996_DAC1_RIGHT_VOLUME, 9, 1, 1), | ||
597 | |||
598 | SOC_DOUBLE_R_TLV("DAC2 Volume", WM8996_DAC2_LEFT_VOLUME, | ||
599 | WM8996_DAC2_RIGHT_VOLUME, 1, 112, 0, digital_tlv), | ||
600 | SOC_DOUBLE_R("DAC2 Switch", WM8996_DAC2_LEFT_VOLUME, | ||
601 | WM8996_DAC2_RIGHT_VOLUME, 9, 1, 1), | ||
602 | |||
603 | SOC_SINGLE("Speaker High Performance Switch", WM8996_OVERSAMPLING, 3, 1, 0), | ||
604 | SOC_SINGLE("DMIC High Performance Switch", WM8996_OVERSAMPLING, 2, 1, 0), | ||
605 | SOC_SINGLE("ADC High Performance Switch", WM8996_OVERSAMPLING, 1, 1, 0), | ||
606 | SOC_SINGLE("DAC High Performance Switch", WM8996_OVERSAMPLING, 0, 1, 0), | ||
607 | |||
608 | SOC_SINGLE("DAC Soft Mute Switch", WM8996_DAC_SOFTMUTE, 1, 1, 0), | ||
609 | SOC_SINGLE("DAC Slow Soft Mute Switch", WM8996_DAC_SOFTMUTE, 0, 1, 0), | ||
610 | |||
611 | SOC_DOUBLE_TLV("Digital Output 1 Volume", WM8996_DAC1_HPOUT1_VOLUME, 0, 4, | ||
612 | 8, 0, out_digital_tlv), | ||
613 | SOC_DOUBLE_TLV("Digital Output 2 Volume", WM8996_DAC2_HPOUT2_VOLUME, 0, 4, | ||
614 | 8, 0, out_digital_tlv), | ||
615 | |||
616 | SOC_DOUBLE_R_TLV("Output 1 Volume", WM8996_OUTPUT1_LEFT_VOLUME, | ||
617 | WM8996_OUTPUT1_RIGHT_VOLUME, 0, 12, 0, out_tlv), | ||
618 | SOC_DOUBLE_R("Output 1 ZC Switch", WM8996_OUTPUT1_LEFT_VOLUME, | ||
619 | WM8996_OUTPUT1_RIGHT_VOLUME, 7, 1, 0), | ||
620 | |||
621 | SOC_DOUBLE_R_TLV("Output 2 Volume", WM8996_OUTPUT2_LEFT_VOLUME, | ||
622 | WM8996_OUTPUT2_RIGHT_VOLUME, 0, 12, 0, out_tlv), | ||
623 | SOC_DOUBLE_R("Output 2 ZC Switch", WM8996_OUTPUT2_LEFT_VOLUME, | ||
624 | WM8996_OUTPUT2_RIGHT_VOLUME, 7, 1, 0), | ||
625 | |||
626 | SOC_DOUBLE_TLV("Speaker Volume", WM8996_PDM_SPEAKER_VOLUME, 0, 4, 8, 0, | ||
627 | spk_tlv), | ||
628 | SOC_DOUBLE_R("Speaker Switch", WM8996_LEFT_PDM_SPEAKER, | ||
629 | WM8996_RIGHT_PDM_SPEAKER, 3, 1, 1), | ||
630 | SOC_DOUBLE_R("Speaker ZC Switch", WM8996_LEFT_PDM_SPEAKER, | ||
631 | WM8996_RIGHT_PDM_SPEAKER, 2, 1, 0), | ||
632 | |||
633 | SOC_SINGLE("DSP1 EQ Switch", WM8996_DSP1_RX_EQ_GAINS_1, 0, 1, 0), | ||
634 | SOC_SINGLE("DSP2 EQ Switch", WM8996_DSP2_RX_EQ_GAINS_1, 0, 1, 0), | ||
635 | }; | ||
636 | |||
637 | static const struct snd_kcontrol_new wm8996_eq_controls[] = { | ||
638 | SOC_SINGLE_TLV("DSP1 EQ B1 Volume", WM8996_DSP1_RX_EQ_GAINS_1, 11, 31, 0, | ||
639 | eq_tlv), | ||
640 | SOC_SINGLE_TLV("DSP1 EQ B2 Volume", WM8996_DSP1_RX_EQ_GAINS_1, 6, 31, 0, | ||
641 | eq_tlv), | ||
642 | SOC_SINGLE_TLV("DSP1 EQ B3 Volume", WM8996_DSP1_RX_EQ_GAINS_1, 1, 31, 0, | ||
643 | eq_tlv), | ||
644 | SOC_SINGLE_TLV("DSP1 EQ B4 Volume", WM8996_DSP1_RX_EQ_GAINS_2, 11, 31, 0, | ||
645 | eq_tlv), | ||
646 | SOC_SINGLE_TLV("DSP1 EQ B5 Volume", WM8996_DSP1_RX_EQ_GAINS_2, 6, 31, 0, | ||
647 | eq_tlv), | ||
648 | |||
649 | SOC_SINGLE_TLV("DSP2 EQ B1 Volume", WM8996_DSP2_RX_EQ_GAINS_1, 11, 31, 0, | ||
650 | eq_tlv), | ||
651 | SOC_SINGLE_TLV("DSP2 EQ B2 Volume", WM8996_DSP2_RX_EQ_GAINS_1, 6, 31, 0, | ||
652 | eq_tlv), | ||
653 | SOC_SINGLE_TLV("DSP2 EQ B3 Volume", WM8996_DSP2_RX_EQ_GAINS_1, 1, 31, 0, | ||
654 | eq_tlv), | ||
655 | SOC_SINGLE_TLV("DSP2 EQ B4 Volume", WM8996_DSP2_RX_EQ_GAINS_2, 11, 31, 0, | ||
656 | eq_tlv), | ||
657 | SOC_SINGLE_TLV("DSP2 EQ B5 Volume", WM8996_DSP2_RX_EQ_GAINS_2, 6, 31, 0, | ||
658 | eq_tlv), | ||
659 | }; | ||
660 | |||
661 | static int cp_event(struct snd_soc_dapm_widget *w, | ||
662 | struct snd_kcontrol *kcontrol, int event) | ||
663 | { | ||
664 | switch (event) { | ||
665 | case SND_SOC_DAPM_POST_PMU: | ||
666 | msleep(5); | ||
667 | break; | ||
668 | default: | ||
669 | BUG(); | ||
670 | return -EINVAL; | ||
671 | } | ||
672 | |||
673 | return 0; | ||
674 | } | ||
675 | |||
676 | static int rmv_short_event(struct snd_soc_dapm_widget *w, | ||
677 | struct snd_kcontrol *kcontrol, int event) | ||
678 | { | ||
679 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(w->codec); | ||
680 | |||
681 | /* Record which outputs we enabled */ | ||
682 | switch (event) { | ||
683 | case SND_SOC_DAPM_PRE_PMD: | ||
684 | wm8996->hpout_pending &= ~w->shift; | ||
685 | break; | ||
686 | case SND_SOC_DAPM_PRE_PMU: | ||
687 | wm8996->hpout_pending |= w->shift; | ||
688 | break; | ||
689 | default: | ||
690 | BUG(); | ||
691 | return -EINVAL; | ||
692 | } | ||
693 | |||
694 | return 0; | ||
695 | } | ||
696 | |||
697 | static void wait_for_dc_servo(struct snd_soc_codec *codec, u16 mask) | ||
698 | { | ||
699 | struct i2c_client *i2c = to_i2c_client(codec->dev); | ||
700 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
701 | int i, ret; | ||
702 | unsigned long timeout = 200; | ||
703 | |||
704 | snd_soc_write(codec, WM8996_DC_SERVO_2, mask); | ||
705 | |||
706 | /* Use the interrupt if possible */ | ||
707 | do { | ||
708 | if (i2c->irq) { | ||
709 | timeout = wait_for_completion_timeout(&wm8996->dcs_done, | ||
710 | msecs_to_jiffies(200)); | ||
711 | if (timeout == 0) | ||
712 | dev_err(codec->dev, "DC servo timed out\n"); | ||
713 | |||
714 | } else { | ||
715 | msleep(1); | ||
716 | if (--i) { | ||
717 | timeout = 0; | ||
718 | break; | ||
719 | } | ||
720 | } | ||
721 | |||
722 | ret = snd_soc_read(codec, WM8996_DC_SERVO_2); | ||
723 | dev_dbg(codec->dev, "DC servo state: %x\n", ret); | ||
724 | } while (ret & mask); | ||
725 | |||
726 | if (timeout == 0) | ||
727 | dev_err(codec->dev, "DC servo timed out for %x\n", mask); | ||
728 | else | ||
729 | dev_dbg(codec->dev, "DC servo complete for %x\n", mask); | ||
730 | } | ||
731 | |||
732 | static void wm8996_seq_notifier(struct snd_soc_dapm_context *dapm, | ||
733 | enum snd_soc_dapm_type event, int subseq) | ||
734 | { | ||
735 | struct snd_soc_codec *codec = container_of(dapm, | ||
736 | struct snd_soc_codec, dapm); | ||
737 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
738 | u16 val, mask; | ||
739 | |||
740 | /* Complete any pending DC servo starts */ | ||
741 | if (wm8996->dcs_pending) { | ||
742 | dev_dbg(codec->dev, "Starting DC servo for %x\n", | ||
743 | wm8996->dcs_pending); | ||
744 | |||
745 | /* Trigger a startup sequence */ | ||
746 | wait_for_dc_servo(codec, wm8996->dcs_pending | ||
747 | << WM8996_DCS_TRIG_STARTUP_0_SHIFT); | ||
748 | |||
749 | wm8996->dcs_pending = 0; | ||
750 | } | ||
751 | |||
752 | if (wm8996->hpout_pending != wm8996->hpout_ena) { | ||
753 | dev_dbg(codec->dev, "Applying RMV_SHORTs %x->%x\n", | ||
754 | wm8996->hpout_ena, wm8996->hpout_pending); | ||
755 | |||
756 | val = 0; | ||
757 | mask = 0; | ||
758 | if (wm8996->hpout_pending & HPOUT1L) { | ||
759 | val |= WM8996_HPOUT1L_RMV_SHORT; | ||
760 | mask |= WM8996_HPOUT1L_RMV_SHORT; | ||
761 | } else { | ||
762 | mask |= WM8996_HPOUT1L_RMV_SHORT | | ||
763 | WM8996_HPOUT1L_OUTP | | ||
764 | WM8996_HPOUT1L_DLY; | ||
765 | } | ||
766 | |||
767 | if (wm8996->hpout_pending & HPOUT1R) { | ||
768 | val |= WM8996_HPOUT1R_RMV_SHORT; | ||
769 | mask |= WM8996_HPOUT1R_RMV_SHORT; | ||
770 | } else { | ||
771 | mask |= WM8996_HPOUT1R_RMV_SHORT | | ||
772 | WM8996_HPOUT1R_OUTP | | ||
773 | WM8996_HPOUT1R_DLY; | ||
774 | } | ||
775 | |||
776 | snd_soc_update_bits(codec, WM8996_ANALOGUE_HP_1, mask, val); | ||
777 | |||
778 | val = 0; | ||
779 | mask = 0; | ||
780 | if (wm8996->hpout_pending & HPOUT2L) { | ||
781 | val |= WM8996_HPOUT2L_RMV_SHORT; | ||
782 | mask |= WM8996_HPOUT2L_RMV_SHORT; | ||
783 | } else { | ||
784 | mask |= WM8996_HPOUT2L_RMV_SHORT | | ||
785 | WM8996_HPOUT2L_OUTP | | ||
786 | WM8996_HPOUT2L_DLY; | ||
787 | } | ||
788 | |||
789 | if (wm8996->hpout_pending & HPOUT2R) { | ||
790 | val |= WM8996_HPOUT2R_RMV_SHORT; | ||
791 | mask |= WM8996_HPOUT2R_RMV_SHORT; | ||
792 | } else { | ||
793 | mask |= WM8996_HPOUT2R_RMV_SHORT | | ||
794 | WM8996_HPOUT2R_OUTP | | ||
795 | WM8996_HPOUT2R_DLY; | ||
796 | } | ||
797 | |||
798 | snd_soc_update_bits(codec, WM8996_ANALOGUE_HP_2, mask, val); | ||
799 | |||
800 | wm8996->hpout_ena = wm8996->hpout_pending; | ||
801 | } | ||
802 | } | ||
803 | |||
804 | static int dcs_start(struct snd_soc_dapm_widget *w, | ||
805 | struct snd_kcontrol *kcontrol, int event) | ||
806 | { | ||
807 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(w->codec); | ||
808 | |||
809 | switch (event) { | ||
810 | case SND_SOC_DAPM_POST_PMU: | ||
811 | wm8996->dcs_pending |= 1 << w->shift; | ||
812 | break; | ||
813 | default: | ||
814 | BUG(); | ||
815 | return -EINVAL; | ||
816 | } | ||
817 | |||
818 | return 0; | ||
819 | } | ||
820 | |||
821 | static const char *sidetone_text[] = { | ||
822 | "IN1", "IN2", | ||
823 | }; | ||
824 | |||
825 | static const struct soc_enum left_sidetone_enum = | ||
826 | SOC_ENUM_SINGLE(WM8996_SIDETONE, 0, 2, sidetone_text); | ||
827 | |||
828 | static const struct snd_kcontrol_new left_sidetone = | ||
829 | SOC_DAPM_ENUM("Left Sidetone", left_sidetone_enum); | ||
830 | |||
831 | static const struct soc_enum right_sidetone_enum = | ||
832 | SOC_ENUM_SINGLE(WM8996_SIDETONE, 1, 2, sidetone_text); | ||
833 | |||
834 | static const struct snd_kcontrol_new right_sidetone = | ||
835 | SOC_DAPM_ENUM("Right Sidetone", right_sidetone_enum); | ||
836 | |||
837 | static const char *spk_text[] = { | ||
838 | "DAC1L", "DAC1R", "DAC2L", "DAC2R" | ||
839 | }; | ||
840 | |||
841 | static const struct soc_enum spkl_enum = | ||
842 | SOC_ENUM_SINGLE(WM8996_LEFT_PDM_SPEAKER, 0, 4, spk_text); | ||
843 | |||
844 | static const struct snd_kcontrol_new spkl_mux = | ||
845 | SOC_DAPM_ENUM("SPKL", spkl_enum); | ||
846 | |||
847 | static const struct soc_enum spkr_enum = | ||
848 | SOC_ENUM_SINGLE(WM8996_RIGHT_PDM_SPEAKER, 0, 4, spk_text); | ||
849 | |||
850 | static const struct snd_kcontrol_new spkr_mux = | ||
851 | SOC_DAPM_ENUM("SPKR", spkr_enum); | ||
852 | |||
853 | static const char *dsp1rx_text[] = { | ||
854 | "AIF1", "AIF2" | ||
855 | }; | ||
856 | |||
857 | static const struct soc_enum dsp1rx_enum = | ||
858 | SOC_ENUM_SINGLE(WM8996_POWER_MANAGEMENT_8, 0, 2, dsp1rx_text); | ||
859 | |||
860 | static const struct snd_kcontrol_new dsp1rx = | ||
861 | SOC_DAPM_ENUM("DSP1RX", dsp1rx_enum); | ||
862 | |||
863 | static const char *dsp2rx_text[] = { | ||
864 | "AIF2", "AIF1" | ||
865 | }; | ||
866 | |||
867 | static const struct soc_enum dsp2rx_enum = | ||
868 | SOC_ENUM_SINGLE(WM8996_POWER_MANAGEMENT_8, 4, 2, dsp2rx_text); | ||
869 | |||
870 | static const struct snd_kcontrol_new dsp2rx = | ||
871 | SOC_DAPM_ENUM("DSP2RX", dsp2rx_enum); | ||
872 | |||
873 | static const char *aif2tx_text[] = { | ||
874 | "DSP2", "DSP1", "AIF1" | ||
875 | }; | ||
876 | |||
877 | static const struct soc_enum aif2tx_enum = | ||
878 | SOC_ENUM_SINGLE(WM8996_POWER_MANAGEMENT_8, 6, 3, aif2tx_text); | ||
879 | |||
880 | static const struct snd_kcontrol_new aif2tx = | ||
881 | SOC_DAPM_ENUM("AIF2TX", aif2tx_enum); | ||
882 | |||
883 | static const char *inmux_text[] = { | ||
884 | "ADC", "DMIC1", "DMIC2" | ||
885 | }; | ||
886 | |||
887 | static const struct soc_enum in1_enum = | ||
888 | SOC_ENUM_SINGLE(WM8996_POWER_MANAGEMENT_7, 0, 3, inmux_text); | ||
889 | |||
890 | static const struct snd_kcontrol_new in1_mux = | ||
891 | SOC_DAPM_ENUM("IN1 Mux", in1_enum); | ||
892 | |||
893 | static const struct soc_enum in2_enum = | ||
894 | SOC_ENUM_SINGLE(WM8996_POWER_MANAGEMENT_7, 4, 3, inmux_text); | ||
895 | |||
896 | static const struct snd_kcontrol_new in2_mux = | ||
897 | SOC_DAPM_ENUM("IN2 Mux", in2_enum); | ||
898 | |||
899 | static const struct snd_kcontrol_new dac2r_mix[] = { | ||
900 | SOC_DAPM_SINGLE("Right Sidetone Switch", WM8996_DAC2_RIGHT_MIXER_ROUTING, | ||
901 | 5, 1, 0), | ||
902 | SOC_DAPM_SINGLE("Left Sidetone Switch", WM8996_DAC2_RIGHT_MIXER_ROUTING, | ||
903 | 4, 1, 0), | ||
904 | SOC_DAPM_SINGLE("DSP2 Switch", WM8996_DAC2_RIGHT_MIXER_ROUTING, 1, 1, 0), | ||
905 | SOC_DAPM_SINGLE("DSP1 Switch", WM8996_DAC2_RIGHT_MIXER_ROUTING, 0, 1, 0), | ||
906 | }; | ||
907 | |||
908 | static const struct snd_kcontrol_new dac2l_mix[] = { | ||
909 | SOC_DAPM_SINGLE("Right Sidetone Switch", WM8996_DAC2_LEFT_MIXER_ROUTING, | ||
910 | 5, 1, 0), | ||
911 | SOC_DAPM_SINGLE("Left Sidetone Switch", WM8996_DAC2_LEFT_MIXER_ROUTING, | ||
912 | 4, 1, 0), | ||
913 | SOC_DAPM_SINGLE("DSP2 Switch", WM8996_DAC2_LEFT_MIXER_ROUTING, 1, 1, 0), | ||
914 | SOC_DAPM_SINGLE("DSP1 Switch", WM8996_DAC2_LEFT_MIXER_ROUTING, 0, 1, 0), | ||
915 | }; | ||
916 | |||
917 | static const struct snd_kcontrol_new dac1r_mix[] = { | ||
918 | SOC_DAPM_SINGLE("Right Sidetone Switch", WM8996_DAC1_RIGHT_MIXER_ROUTING, | ||
919 | 5, 1, 0), | ||
920 | SOC_DAPM_SINGLE("Left Sidetone Switch", WM8996_DAC1_RIGHT_MIXER_ROUTING, | ||
921 | 4, 1, 0), | ||
922 | SOC_DAPM_SINGLE("DSP2 Switch", WM8996_DAC1_RIGHT_MIXER_ROUTING, 1, 1, 0), | ||
923 | SOC_DAPM_SINGLE("DSP1 Switch", WM8996_DAC1_RIGHT_MIXER_ROUTING, 0, 1, 0), | ||
924 | }; | ||
925 | |||
926 | static const struct snd_kcontrol_new dac1l_mix[] = { | ||
927 | SOC_DAPM_SINGLE("Right Sidetone Switch", WM8996_DAC1_LEFT_MIXER_ROUTING, | ||
928 | 5, 1, 0), | ||
929 | SOC_DAPM_SINGLE("Left Sidetone Switch", WM8996_DAC1_LEFT_MIXER_ROUTING, | ||
930 | 4, 1, 0), | ||
931 | SOC_DAPM_SINGLE("DSP2 Switch", WM8996_DAC1_LEFT_MIXER_ROUTING, 1, 1, 0), | ||
932 | SOC_DAPM_SINGLE("DSP1 Switch", WM8996_DAC1_LEFT_MIXER_ROUTING, 0, 1, 0), | ||
933 | }; | ||
934 | |||
935 | static const struct snd_kcontrol_new dsp1txl[] = { | ||
936 | SOC_DAPM_SINGLE("IN1 Switch", WM8996_DSP1_TX_LEFT_MIXER_ROUTING, | ||
937 | 1, 1, 0), | ||
938 | SOC_DAPM_SINGLE("DAC Switch", WM8996_DSP1_TX_LEFT_MIXER_ROUTING, | ||
939 | 0, 1, 0), | ||
940 | }; | ||
941 | |||
942 | static const struct snd_kcontrol_new dsp1txr[] = { | ||
943 | SOC_DAPM_SINGLE("IN1 Switch", WM8996_DSP1_TX_RIGHT_MIXER_ROUTING, | ||
944 | 1, 1, 0), | ||
945 | SOC_DAPM_SINGLE("DAC Switch", WM8996_DSP1_TX_RIGHT_MIXER_ROUTING, | ||
946 | 0, 1, 0), | ||
947 | }; | ||
948 | |||
949 | static const struct snd_kcontrol_new dsp2txl[] = { | ||
950 | SOC_DAPM_SINGLE("IN1 Switch", WM8996_DSP2_TX_LEFT_MIXER_ROUTING, | ||
951 | 1, 1, 0), | ||
952 | SOC_DAPM_SINGLE("DAC Switch", WM8996_DSP2_TX_LEFT_MIXER_ROUTING, | ||
953 | 0, 1, 0), | ||
954 | }; | ||
955 | |||
956 | static const struct snd_kcontrol_new dsp2txr[] = { | ||
957 | SOC_DAPM_SINGLE("IN1 Switch", WM8996_DSP2_TX_RIGHT_MIXER_ROUTING, | ||
958 | 1, 1, 0), | ||
959 | SOC_DAPM_SINGLE("DAC Switch", WM8996_DSP2_TX_RIGHT_MIXER_ROUTING, | ||
960 | 0, 1, 0), | ||
961 | }; | ||
962 | |||
963 | |||
964 | static const struct snd_soc_dapm_widget wm8996_dapm_widgets[] = { | ||
965 | SND_SOC_DAPM_INPUT("IN1LN"), | ||
966 | SND_SOC_DAPM_INPUT("IN1LP"), | ||
967 | SND_SOC_DAPM_INPUT("IN1RN"), | ||
968 | SND_SOC_DAPM_INPUT("IN1RP"), | ||
969 | |||
970 | SND_SOC_DAPM_INPUT("IN2LN"), | ||
971 | SND_SOC_DAPM_INPUT("IN2LP"), | ||
972 | SND_SOC_DAPM_INPUT("IN2RN"), | ||
973 | SND_SOC_DAPM_INPUT("IN2RP"), | ||
974 | |||
975 | SND_SOC_DAPM_INPUT("DMIC1DAT"), | ||
976 | SND_SOC_DAPM_INPUT("DMIC2DAT"), | ||
977 | |||
978 | SND_SOC_DAPM_SUPPLY_S("SYSCLK", 1, WM8996_AIF_CLOCKING_1, 0, 0, NULL, 0), | ||
979 | SND_SOC_DAPM_SUPPLY_S("SYSDSPCLK", 2, WM8996_CLOCKING_1, 1, 0, NULL, 0), | ||
980 | SND_SOC_DAPM_SUPPLY_S("AIFCLK", 2, WM8996_CLOCKING_1, 2, 0, NULL, 0), | ||
981 | SND_SOC_DAPM_SUPPLY_S("Charge Pump", 2, WM8996_CHARGE_PUMP_1, 15, 0, cp_event, | ||
982 | SND_SOC_DAPM_POST_PMU), | ||
983 | |||
984 | SND_SOC_DAPM_SUPPLY("LDO2", WM8996_POWER_MANAGEMENT_2, 1, 0, NULL, 0), | ||
985 | SND_SOC_DAPM_MICBIAS("MICB2", WM8996_POWER_MANAGEMENT_1, 9, 0), | ||
986 | SND_SOC_DAPM_MICBIAS("MICB1", WM8996_POWER_MANAGEMENT_1, 8, 0), | ||
987 | |||
988 | SND_SOC_DAPM_PGA("IN1L PGA", WM8996_POWER_MANAGEMENT_2, 5, 0, NULL, 0), | ||
989 | SND_SOC_DAPM_PGA("IN1R PGA", WM8996_POWER_MANAGEMENT_2, 4, 0, NULL, 0), | ||
990 | |||
991 | SND_SOC_DAPM_MUX("IN1L Mux", SND_SOC_NOPM, 0, 0, &in1_mux), | ||
992 | SND_SOC_DAPM_MUX("IN1R Mux", SND_SOC_NOPM, 0, 0, &in1_mux), | ||
993 | SND_SOC_DAPM_MUX("IN2L Mux", SND_SOC_NOPM, 0, 0, &in2_mux), | ||
994 | SND_SOC_DAPM_MUX("IN2R Mux", SND_SOC_NOPM, 0, 0, &in2_mux), | ||
995 | |||
996 | SND_SOC_DAPM_PGA("IN1L", WM8996_POWER_MANAGEMENT_7, 2, 0, NULL, 0), | ||
997 | SND_SOC_DAPM_PGA("IN1R", WM8996_POWER_MANAGEMENT_7, 3, 0, NULL, 0), | ||
998 | SND_SOC_DAPM_PGA("IN2L", WM8996_POWER_MANAGEMENT_7, 6, 0, NULL, 0), | ||
999 | SND_SOC_DAPM_PGA("IN2R", WM8996_POWER_MANAGEMENT_7, 7, 0, NULL, 0), | ||
1000 | |||
1001 | SND_SOC_DAPM_SUPPLY("DMIC2", WM8996_POWER_MANAGEMENT_7, 9, 0, NULL, 0), | ||
1002 | SND_SOC_DAPM_SUPPLY("DMIC1", WM8996_POWER_MANAGEMENT_7, 8, 0, NULL, 0), | ||
1003 | |||
1004 | SND_SOC_DAPM_ADC("DMIC2L", NULL, WM8996_POWER_MANAGEMENT_3, 5, 0), | ||
1005 | SND_SOC_DAPM_ADC("DMIC2R", NULL, WM8996_POWER_MANAGEMENT_3, 4, 0), | ||
1006 | SND_SOC_DAPM_ADC("DMIC1L", NULL, WM8996_POWER_MANAGEMENT_3, 3, 0), | ||
1007 | SND_SOC_DAPM_ADC("DMIC1R", NULL, WM8996_POWER_MANAGEMENT_3, 2, 0), | ||
1008 | |||
1009 | SND_SOC_DAPM_ADC("ADCL", NULL, WM8996_POWER_MANAGEMENT_3, 1, 0), | ||
1010 | SND_SOC_DAPM_ADC("ADCR", NULL, WM8996_POWER_MANAGEMENT_3, 0, 0), | ||
1011 | |||
1012 | SND_SOC_DAPM_MUX("Left Sidetone", SND_SOC_NOPM, 0, 0, &left_sidetone), | ||
1013 | SND_SOC_DAPM_MUX("Right Sidetone", SND_SOC_NOPM, 0, 0, &right_sidetone), | ||
1014 | |||
1015 | SND_SOC_DAPM_AIF_IN("DSP2RXL", NULL, 0, WM8996_POWER_MANAGEMENT_3, 11, 0), | ||
1016 | SND_SOC_DAPM_AIF_IN("DSP2RXR", NULL, 1, WM8996_POWER_MANAGEMENT_3, 10, 0), | ||
1017 | SND_SOC_DAPM_AIF_IN("DSP1RXL", NULL, 0, WM8996_POWER_MANAGEMENT_3, 9, 0), | ||
1018 | SND_SOC_DAPM_AIF_IN("DSP1RXR", NULL, 1, WM8996_POWER_MANAGEMENT_3, 8, 0), | ||
1019 | |||
1020 | SND_SOC_DAPM_MIXER("DSP2TXL", WM8996_POWER_MANAGEMENT_5, 11, 0, | ||
1021 | dsp2txl, ARRAY_SIZE(dsp2txl)), | ||
1022 | SND_SOC_DAPM_MIXER("DSP2TXR", WM8996_POWER_MANAGEMENT_5, 10, 0, | ||
1023 | dsp2txr, ARRAY_SIZE(dsp2txr)), | ||
1024 | SND_SOC_DAPM_MIXER("DSP1TXL", WM8996_POWER_MANAGEMENT_5, 9, 0, | ||
1025 | dsp1txl, ARRAY_SIZE(dsp1txl)), | ||
1026 | SND_SOC_DAPM_MIXER("DSP1TXR", WM8996_POWER_MANAGEMENT_5, 8, 0, | ||
1027 | dsp1txr, ARRAY_SIZE(dsp1txr)), | ||
1028 | |||
1029 | SND_SOC_DAPM_MIXER("DAC2L Mixer", SND_SOC_NOPM, 0, 0, | ||
1030 | dac2l_mix, ARRAY_SIZE(dac2l_mix)), | ||
1031 | SND_SOC_DAPM_MIXER("DAC2R Mixer", SND_SOC_NOPM, 0, 0, | ||
1032 | dac2r_mix, ARRAY_SIZE(dac2r_mix)), | ||
1033 | SND_SOC_DAPM_MIXER("DAC1L Mixer", SND_SOC_NOPM, 0, 0, | ||
1034 | dac1l_mix, ARRAY_SIZE(dac1l_mix)), | ||
1035 | SND_SOC_DAPM_MIXER("DAC1R Mixer", SND_SOC_NOPM, 0, 0, | ||
1036 | dac1r_mix, ARRAY_SIZE(dac1r_mix)), | ||
1037 | |||
1038 | SND_SOC_DAPM_DAC("DAC2L", NULL, WM8996_POWER_MANAGEMENT_5, 3, 0), | ||
1039 | SND_SOC_DAPM_DAC("DAC2R", NULL, WM8996_POWER_MANAGEMENT_5, 2, 0), | ||
1040 | SND_SOC_DAPM_DAC("DAC1L", NULL, WM8996_POWER_MANAGEMENT_5, 1, 0), | ||
1041 | SND_SOC_DAPM_DAC("DAC1R", NULL, WM8996_POWER_MANAGEMENT_5, 0, 0), | ||
1042 | |||
1043 | SND_SOC_DAPM_AIF_IN("AIF2RX1", "AIF2 Playback", 1, | ||
1044 | WM8996_POWER_MANAGEMENT_4, 9, 0), | ||
1045 | SND_SOC_DAPM_AIF_IN("AIF2RX0", "AIF2 Playback", 2, | ||
1046 | WM8996_POWER_MANAGEMENT_4, 8, 0), | ||
1047 | |||
1048 | SND_SOC_DAPM_AIF_IN("AIF2TX1", "AIF2 Capture", 1, | ||
1049 | WM8996_POWER_MANAGEMENT_6, 9, 0), | ||
1050 | SND_SOC_DAPM_AIF_IN("AIF2TX0", "AIF2 Capture", 2, | ||
1051 | WM8996_POWER_MANAGEMENT_6, 8, 0), | ||
1052 | |||
1053 | SND_SOC_DAPM_AIF_IN("AIF1RX5", "AIF1 Playback", 5, | ||
1054 | WM8996_POWER_MANAGEMENT_4, 5, 0), | ||
1055 | SND_SOC_DAPM_AIF_IN("AIF1RX4", "AIF1 Playback", 4, | ||
1056 | WM8996_POWER_MANAGEMENT_4, 4, 0), | ||
1057 | SND_SOC_DAPM_AIF_IN("AIF1RX3", "AIF1 Playback", 3, | ||
1058 | WM8996_POWER_MANAGEMENT_4, 3, 0), | ||
1059 | SND_SOC_DAPM_AIF_IN("AIF1RX2", "AIF1 Playback", 2, | ||
1060 | WM8996_POWER_MANAGEMENT_4, 2, 0), | ||
1061 | SND_SOC_DAPM_AIF_IN("AIF1RX1", "AIF1 Playback", 1, | ||
1062 | WM8996_POWER_MANAGEMENT_4, 1, 0), | ||
1063 | SND_SOC_DAPM_AIF_IN("AIF1RX0", "AIF1 Playback", 0, | ||
1064 | WM8996_POWER_MANAGEMENT_4, 0, 0), | ||
1065 | |||
1066 | SND_SOC_DAPM_AIF_OUT("AIF1TX5", "AIF1 Capture", 5, | ||
1067 | WM8996_POWER_MANAGEMENT_6, 5, 0), | ||
1068 | SND_SOC_DAPM_AIF_OUT("AIF1TX4", "AIF1 Capture", 4, | ||
1069 | WM8996_POWER_MANAGEMENT_6, 4, 0), | ||
1070 | SND_SOC_DAPM_AIF_OUT("AIF1TX3", "AIF1 Capture", 3, | ||
1071 | WM8996_POWER_MANAGEMENT_6, 3, 0), | ||
1072 | SND_SOC_DAPM_AIF_OUT("AIF1TX2", "AIF1 Capture", 2, | ||
1073 | WM8996_POWER_MANAGEMENT_6, 2, 0), | ||
1074 | SND_SOC_DAPM_AIF_OUT("AIF1TX1", "AIF1 Capture", 1, | ||
1075 | WM8996_POWER_MANAGEMENT_6, 1, 0), | ||
1076 | SND_SOC_DAPM_AIF_OUT("AIF1TX0", "AIF1 Capture", 0, | ||
1077 | WM8996_POWER_MANAGEMENT_6, 0, 0), | ||
1078 | |||
1079 | /* We route as stereo pairs so define some dummy widgets to squash | ||
1080 | * things down for now. RXA = 0,1, RXB = 2,3 and so on */ | ||
1081 | SND_SOC_DAPM_PGA("AIF1RXA", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1082 | SND_SOC_DAPM_PGA("AIF1RXB", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1083 | SND_SOC_DAPM_PGA("AIF1RXC", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1084 | SND_SOC_DAPM_PGA("AIF2RX", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1085 | SND_SOC_DAPM_PGA("DSP2TX", SND_SOC_NOPM, 0, 0, NULL, 0), | ||
1086 | |||
1087 | SND_SOC_DAPM_MUX("DSP1RX", SND_SOC_NOPM, 0, 0, &dsp1rx), | ||
1088 | SND_SOC_DAPM_MUX("DSP2RX", SND_SOC_NOPM, 0, 0, &dsp2rx), | ||
1089 | SND_SOC_DAPM_MUX("AIF2TX", SND_SOC_NOPM, 0, 0, &aif2tx), | ||
1090 | |||
1091 | SND_SOC_DAPM_MUX("SPKL", SND_SOC_NOPM, 0, 0, &spkl_mux), | ||
1092 | SND_SOC_DAPM_MUX("SPKR", SND_SOC_NOPM, 0, 0, &spkr_mux), | ||
1093 | SND_SOC_DAPM_PGA("SPKL PGA", WM8996_LEFT_PDM_SPEAKER, 4, 0, NULL, 0), | ||
1094 | SND_SOC_DAPM_PGA("SPKR PGA", WM8996_RIGHT_PDM_SPEAKER, 4, 0, NULL, 0), | ||
1095 | |||
1096 | SND_SOC_DAPM_PGA_S("HPOUT2L PGA", 0, WM8996_POWER_MANAGEMENT_1, 7, 0, NULL, 0), | ||
1097 | SND_SOC_DAPM_PGA_S("HPOUT2L_DLY", 1, WM8996_ANALOGUE_HP_2, 5, 0, NULL, 0), | ||
1098 | SND_SOC_DAPM_PGA_S("HPOUT2L_DCS", 2, WM8996_DC_SERVO_1, 2, 0, dcs_start, | ||
1099 | SND_SOC_DAPM_POST_PMU), | ||
1100 | SND_SOC_DAPM_PGA_S("HPOUT2L_OUTP", 3, WM8996_ANALOGUE_HP_2, 6, 0, NULL, 0), | ||
1101 | SND_SOC_DAPM_PGA_S("HPOUT2L_RMV_SHORT", 3, SND_SOC_NOPM, HPOUT2L, 0, | ||
1102 | rmv_short_event, | ||
1103 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1104 | |||
1105 | SND_SOC_DAPM_PGA_S("HPOUT2R PGA", 0, WM8996_POWER_MANAGEMENT_1, 6, 0,NULL, 0), | ||
1106 | SND_SOC_DAPM_PGA_S("HPOUT2R_DLY", 1, WM8996_ANALOGUE_HP_2, 1, 0, NULL, 0), | ||
1107 | SND_SOC_DAPM_PGA_S("HPOUT2R_DCS", 2, WM8996_DC_SERVO_1, 3, 0, dcs_start, | ||
1108 | SND_SOC_DAPM_POST_PMU), | ||
1109 | SND_SOC_DAPM_PGA_S("HPOUT2R_OUTP", 3, WM8996_ANALOGUE_HP_2, 2, 0, NULL, 0), | ||
1110 | SND_SOC_DAPM_PGA_S("HPOUT2R_RMV_SHORT", 3, SND_SOC_NOPM, HPOUT2R, 0, | ||
1111 | rmv_short_event, | ||
1112 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1113 | |||
1114 | SND_SOC_DAPM_PGA_S("HPOUT1L PGA", 0, WM8996_POWER_MANAGEMENT_1, 5, 0, NULL, 0), | ||
1115 | SND_SOC_DAPM_PGA_S("HPOUT1L_DLY", 1, WM8996_ANALOGUE_HP_1, 5, 0, NULL, 0), | ||
1116 | SND_SOC_DAPM_PGA_S("HPOUT1L_DCS", 2, WM8996_DC_SERVO_1, 0, 0, dcs_start, | ||
1117 | SND_SOC_DAPM_POST_PMU), | ||
1118 | SND_SOC_DAPM_PGA_S("HPOUT1L_OUTP", 3, WM8996_ANALOGUE_HP_1, 6, 0, NULL, 0), | ||
1119 | SND_SOC_DAPM_PGA_S("HPOUT1L_RMV_SHORT", 3, SND_SOC_NOPM, HPOUT1L, 0, | ||
1120 | rmv_short_event, | ||
1121 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1122 | |||
1123 | SND_SOC_DAPM_PGA_S("HPOUT1R PGA", 0, WM8996_POWER_MANAGEMENT_1, 4, 0, NULL, 0), | ||
1124 | SND_SOC_DAPM_PGA_S("HPOUT1R_DLY", 1, WM8996_ANALOGUE_HP_1, 1, 0, NULL, 0), | ||
1125 | SND_SOC_DAPM_PGA_S("HPOUT1R_DCS", 2, WM8996_DC_SERVO_1, 1, 0, dcs_start, | ||
1126 | SND_SOC_DAPM_POST_PMU), | ||
1127 | SND_SOC_DAPM_PGA_S("HPOUT1R_OUTP", 3, WM8996_ANALOGUE_HP_1, 2, 0, NULL, 0), | ||
1128 | SND_SOC_DAPM_PGA_S("HPOUT1R_RMV_SHORT", 3, SND_SOC_NOPM, HPOUT1R, 0, | ||
1129 | rmv_short_event, | ||
1130 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), | ||
1131 | |||
1132 | SND_SOC_DAPM_OUTPUT("HPOUT1L"), | ||
1133 | SND_SOC_DAPM_OUTPUT("HPOUT1R"), | ||
1134 | SND_SOC_DAPM_OUTPUT("HPOUT2L"), | ||
1135 | SND_SOC_DAPM_OUTPUT("HPOUT2R"), | ||
1136 | SND_SOC_DAPM_OUTPUT("SPKDAT"), | ||
1137 | }; | ||
1138 | |||
1139 | static const struct snd_soc_dapm_route wm8996_dapm_routes[] = { | ||
1140 | { "AIFCLK", NULL, "SYSCLK" }, | ||
1141 | { "SYSDSPCLK", NULL, "SYSCLK" }, | ||
1142 | { "Charge Pump", NULL, "SYSCLK" }, | ||
1143 | |||
1144 | { "MICB1", NULL, "LDO2" }, | ||
1145 | { "MICB2", NULL, "LDO2" }, | ||
1146 | |||
1147 | { "IN1L PGA", NULL, "IN2LN" }, | ||
1148 | { "IN1L PGA", NULL, "IN2LP" }, | ||
1149 | { "IN1L PGA", NULL, "IN1LN" }, | ||
1150 | { "IN1L PGA", NULL, "IN1LP" }, | ||
1151 | |||
1152 | { "IN1R PGA", NULL, "IN2RN" }, | ||
1153 | { "IN1R PGA", NULL, "IN2RP" }, | ||
1154 | { "IN1R PGA", NULL, "IN1RN" }, | ||
1155 | { "IN1R PGA", NULL, "IN1RP" }, | ||
1156 | |||
1157 | { "ADCL", NULL, "IN1L PGA" }, | ||
1158 | |||
1159 | { "ADCR", NULL, "IN1R PGA" }, | ||
1160 | |||
1161 | { "DMIC1L", NULL, "DMIC1DAT" }, | ||
1162 | { "DMIC1R", NULL, "DMIC1DAT" }, | ||
1163 | { "DMIC2L", NULL, "DMIC2DAT" }, | ||
1164 | { "DMIC2R", NULL, "DMIC2DAT" }, | ||
1165 | |||
1166 | { "DMIC2L", NULL, "DMIC2" }, | ||
1167 | { "DMIC2R", NULL, "DMIC2" }, | ||
1168 | { "DMIC1L", NULL, "DMIC1" }, | ||
1169 | { "DMIC1R", NULL, "DMIC1" }, | ||
1170 | |||
1171 | { "IN1L Mux", "ADC", "ADCL" }, | ||
1172 | { "IN1L Mux", "DMIC1", "DMIC1L" }, | ||
1173 | { "IN1L Mux", "DMIC2", "DMIC2L" }, | ||
1174 | |||
1175 | { "IN1R Mux", "ADC", "ADCR" }, | ||
1176 | { "IN1R Mux", "DMIC1", "DMIC1R" }, | ||
1177 | { "IN1R Mux", "DMIC2", "DMIC2R" }, | ||
1178 | |||
1179 | { "IN2L Mux", "ADC", "ADCL" }, | ||
1180 | { "IN2L Mux", "DMIC1", "DMIC1L" }, | ||
1181 | { "IN2L Mux", "DMIC2", "DMIC2L" }, | ||
1182 | |||
1183 | { "IN2R Mux", "ADC", "ADCR" }, | ||
1184 | { "IN2R Mux", "DMIC1", "DMIC1R" }, | ||
1185 | { "IN2R Mux", "DMIC2", "DMIC2R" }, | ||
1186 | |||
1187 | { "Left Sidetone", "IN1", "IN1L Mux" }, | ||
1188 | { "Left Sidetone", "IN2", "IN2L Mux" }, | ||
1189 | |||
1190 | { "Right Sidetone", "IN1", "IN1R Mux" }, | ||
1191 | { "Right Sidetone", "IN2", "IN2R Mux" }, | ||
1192 | |||
1193 | { "DSP1TXL", "IN1 Switch", "IN1L Mux" }, | ||
1194 | { "DSP1TXR", "IN1 Switch", "IN1R Mux" }, | ||
1195 | |||
1196 | { "DSP2TXL", "IN1 Switch", "IN2L Mux" }, | ||
1197 | { "DSP2TXR", "IN1 Switch", "IN2R Mux" }, | ||
1198 | |||
1199 | { "AIF1TX0", NULL, "DSP1TXL" }, | ||
1200 | { "AIF1TX1", NULL, "DSP1TXR" }, | ||
1201 | { "AIF1TX2", NULL, "DSP2TXL" }, | ||
1202 | { "AIF1TX3", NULL, "DSP2TXR" }, | ||
1203 | { "AIF1TX4", NULL, "AIF2RX0" }, | ||
1204 | { "AIF1TX5", NULL, "AIF2RX1" }, | ||
1205 | |||
1206 | { "AIF1RX0", NULL, "AIFCLK" }, | ||
1207 | { "AIF1RX1", NULL, "AIFCLK" }, | ||
1208 | { "AIF1RX2", NULL, "AIFCLK" }, | ||
1209 | { "AIF1RX3", NULL, "AIFCLK" }, | ||
1210 | { "AIF1RX4", NULL, "AIFCLK" }, | ||
1211 | { "AIF1RX5", NULL, "AIFCLK" }, | ||
1212 | |||
1213 | { "AIF2RX0", NULL, "AIFCLK" }, | ||
1214 | { "AIF2RX1", NULL, "AIFCLK" }, | ||
1215 | |||
1216 | { "DSP1RXL", NULL, "SYSDSPCLK" }, | ||
1217 | { "DSP1RXR", NULL, "SYSDSPCLK" }, | ||
1218 | { "DSP2RXL", NULL, "SYSDSPCLK" }, | ||
1219 | { "DSP2RXR", NULL, "SYSDSPCLK" }, | ||
1220 | { "DSP1TXL", NULL, "SYSDSPCLK" }, | ||
1221 | { "DSP1TXR", NULL, "SYSDSPCLK" }, | ||
1222 | { "DSP2TXL", NULL, "SYSDSPCLK" }, | ||
1223 | { "DSP2TXR", NULL, "SYSDSPCLK" }, | ||
1224 | |||
1225 | { "AIF1RXA", NULL, "AIF1RX0" }, | ||
1226 | { "AIF1RXA", NULL, "AIF1RX1" }, | ||
1227 | { "AIF1RXB", NULL, "AIF1RX2" }, | ||
1228 | { "AIF1RXB", NULL, "AIF1RX3" }, | ||
1229 | { "AIF1RXC", NULL, "AIF1RX4" }, | ||
1230 | { "AIF1RXC", NULL, "AIF1RX5" }, | ||
1231 | |||
1232 | { "AIF2RX", NULL, "AIF2RX0" }, | ||
1233 | { "AIF2RX", NULL, "AIF2RX1" }, | ||
1234 | |||
1235 | { "AIF2TX", "DSP2", "DSP2TX" }, | ||
1236 | { "AIF2TX", "DSP1", "DSP1RX" }, | ||
1237 | { "AIF2TX", "AIF1", "AIF1RXC" }, | ||
1238 | |||
1239 | { "DSP1RXL", NULL, "DSP1RX" }, | ||
1240 | { "DSP1RXR", NULL, "DSP1RX" }, | ||
1241 | { "DSP2RXL", NULL, "DSP2RX" }, | ||
1242 | { "DSP2RXR", NULL, "DSP2RX" }, | ||
1243 | |||
1244 | { "DSP2TX", NULL, "DSP2TXL" }, | ||
1245 | { "DSP2TX", NULL, "DSP2TXR" }, | ||
1246 | |||
1247 | { "DSP1RX", "AIF1", "AIF1RXA" }, | ||
1248 | { "DSP1RX", "AIF2", "AIF2RX" }, | ||
1249 | |||
1250 | { "DSP2RX", "AIF1", "AIF1RXB" }, | ||
1251 | { "DSP2RX", "AIF2", "AIF2RX" }, | ||
1252 | |||
1253 | { "DAC2L Mixer", "DSP2 Switch", "DSP2RXL" }, | ||
1254 | { "DAC2L Mixer", "DSP1 Switch", "DSP1RXL" }, | ||
1255 | { "DAC2L Mixer", "Right Sidetone Switch", "Right Sidetone" }, | ||
1256 | { "DAC2L Mixer", "Left Sidetone Switch", "Left Sidetone" }, | ||
1257 | |||
1258 | { "DAC2R Mixer", "DSP2 Switch", "DSP2RXR" }, | ||
1259 | { "DAC2R Mixer", "DSP1 Switch", "DSP1RXR" }, | ||
1260 | { "DAC2R Mixer", "Right Sidetone Switch", "Right Sidetone" }, | ||
1261 | { "DAC2R Mixer", "Left Sidetone Switch", "Left Sidetone" }, | ||
1262 | |||
1263 | { "DAC1L Mixer", "DSP2 Switch", "DSP2RXL" }, | ||
1264 | { "DAC1L Mixer", "DSP1 Switch", "DSP1RXL" }, | ||
1265 | { "DAC1L Mixer", "Right Sidetone Switch", "Right Sidetone" }, | ||
1266 | { "DAC1L Mixer", "Left Sidetone Switch", "Left Sidetone" }, | ||
1267 | |||
1268 | { "DAC1R Mixer", "DSP2 Switch", "DSP2RXR" }, | ||
1269 | { "DAC1R Mixer", "DSP1 Switch", "DSP1RXR" }, | ||
1270 | { "DAC1R Mixer", "Right Sidetone Switch", "Right Sidetone" }, | ||
1271 | { "DAC1R Mixer", "Left Sidetone Switch", "Left Sidetone" }, | ||
1272 | |||
1273 | { "DAC1L", NULL, "DAC1L Mixer" }, | ||
1274 | { "DAC1R", NULL, "DAC1R Mixer" }, | ||
1275 | { "DAC2L", NULL, "DAC2L Mixer" }, | ||
1276 | { "DAC2R", NULL, "DAC2R Mixer" }, | ||
1277 | |||
1278 | { "HPOUT2L PGA", NULL, "Charge Pump" }, | ||
1279 | { "HPOUT2L PGA", NULL, "DAC2L" }, | ||
1280 | { "HPOUT2L_DLY", NULL, "HPOUT2L PGA" }, | ||
1281 | { "HPOUT2L_DCS", NULL, "HPOUT2L_DLY" }, | ||
1282 | { "HPOUT2L_OUTP", NULL, "HPOUT2L_DCS" }, | ||
1283 | { "HPOUT2L_RMV_SHORT", NULL, "HPOUT2L_OUTP" }, | ||
1284 | |||
1285 | { "HPOUT2R PGA", NULL, "Charge Pump" }, | ||
1286 | { "HPOUT2R PGA", NULL, "DAC2R" }, | ||
1287 | { "HPOUT2R_DLY", NULL, "HPOUT2R PGA" }, | ||
1288 | { "HPOUT2R_DCS", NULL, "HPOUT2R_DLY" }, | ||
1289 | { "HPOUT2R_OUTP", NULL, "HPOUT2R_DCS" }, | ||
1290 | { "HPOUT2R_RMV_SHORT", NULL, "HPOUT2R_OUTP" }, | ||
1291 | |||
1292 | { "HPOUT1L PGA", NULL, "Charge Pump" }, | ||
1293 | { "HPOUT1L PGA", NULL, "DAC1L" }, | ||
1294 | { "HPOUT1L_DLY", NULL, "HPOUT1L PGA" }, | ||
1295 | { "HPOUT1L_DCS", NULL, "HPOUT1L_DLY" }, | ||
1296 | { "HPOUT1L_OUTP", NULL, "HPOUT1L_DCS" }, | ||
1297 | { "HPOUT1L_RMV_SHORT", NULL, "HPOUT1L_OUTP" }, | ||
1298 | |||
1299 | { "HPOUT1R PGA", NULL, "Charge Pump" }, | ||
1300 | { "HPOUT1R PGA", NULL, "DAC1R" }, | ||
1301 | { "HPOUT1R_DLY", NULL, "HPOUT1R PGA" }, | ||
1302 | { "HPOUT1R_DCS", NULL, "HPOUT1R_DLY" }, | ||
1303 | { "HPOUT1R_OUTP", NULL, "HPOUT1R_DCS" }, | ||
1304 | { "HPOUT1R_RMV_SHORT", NULL, "HPOUT1R_OUTP" }, | ||
1305 | |||
1306 | { "HPOUT2L", NULL, "HPOUT2L_RMV_SHORT" }, | ||
1307 | { "HPOUT2R", NULL, "HPOUT2R_RMV_SHORT" }, | ||
1308 | { "HPOUT1L", NULL, "HPOUT1L_RMV_SHORT" }, | ||
1309 | { "HPOUT1R", NULL, "HPOUT1R_RMV_SHORT" }, | ||
1310 | |||
1311 | { "SPKL", "DAC1L", "DAC1L" }, | ||
1312 | { "SPKL", "DAC1R", "DAC1R" }, | ||
1313 | { "SPKL", "DAC2L", "DAC2L" }, | ||
1314 | { "SPKL", "DAC2R", "DAC2R" }, | ||
1315 | |||
1316 | { "SPKR", "DAC1L", "DAC1L" }, | ||
1317 | { "SPKR", "DAC1R", "DAC1R" }, | ||
1318 | { "SPKR", "DAC2L", "DAC2L" }, | ||
1319 | { "SPKR", "DAC2R", "DAC2R" }, | ||
1320 | |||
1321 | { "SPKL PGA", NULL, "SPKL" }, | ||
1322 | { "SPKR PGA", NULL, "SPKR" }, | ||
1323 | |||
1324 | { "SPKDAT", NULL, "SPKL PGA" }, | ||
1325 | { "SPKDAT", NULL, "SPKR PGA" }, | ||
1326 | }; | ||
1327 | |||
1328 | static int wm8996_readable_register(struct snd_soc_codec *codec, | ||
1329 | unsigned int reg) | ||
1330 | { | ||
1331 | /* Due to the sparseness of the register map the compiler | ||
1332 | * output from an explicit switch statement ends up being much | ||
1333 | * more efficient than a table. | ||
1334 | */ | ||
1335 | switch (reg) { | ||
1336 | case WM8996_SOFTWARE_RESET: | ||
1337 | case WM8996_POWER_MANAGEMENT_1: | ||
1338 | case WM8996_POWER_MANAGEMENT_2: | ||
1339 | case WM8996_POWER_MANAGEMENT_3: | ||
1340 | case WM8996_POWER_MANAGEMENT_4: | ||
1341 | case WM8996_POWER_MANAGEMENT_5: | ||
1342 | case WM8996_POWER_MANAGEMENT_6: | ||
1343 | case WM8996_POWER_MANAGEMENT_7: | ||
1344 | case WM8996_POWER_MANAGEMENT_8: | ||
1345 | case WM8996_LEFT_LINE_INPUT_VOLUME: | ||
1346 | case WM8996_RIGHT_LINE_INPUT_VOLUME: | ||
1347 | case WM8996_LINE_INPUT_CONTROL: | ||
1348 | case WM8996_DAC1_HPOUT1_VOLUME: | ||
1349 | case WM8996_DAC2_HPOUT2_VOLUME: | ||
1350 | case WM8996_DAC1_LEFT_VOLUME: | ||
1351 | case WM8996_DAC1_RIGHT_VOLUME: | ||
1352 | case WM8996_DAC2_LEFT_VOLUME: | ||
1353 | case WM8996_DAC2_RIGHT_VOLUME: | ||
1354 | case WM8996_OUTPUT1_LEFT_VOLUME: | ||
1355 | case WM8996_OUTPUT1_RIGHT_VOLUME: | ||
1356 | case WM8996_OUTPUT2_LEFT_VOLUME: | ||
1357 | case WM8996_OUTPUT2_RIGHT_VOLUME: | ||
1358 | case WM8996_MICBIAS_1: | ||
1359 | case WM8996_MICBIAS_2: | ||
1360 | case WM8996_LDO_1: | ||
1361 | case WM8996_LDO_2: | ||
1362 | case WM8996_ACCESSORY_DETECT_MODE_1: | ||
1363 | case WM8996_ACCESSORY_DETECT_MODE_2: | ||
1364 | case WM8996_HEADPHONE_DETECT_1: | ||
1365 | case WM8996_HEADPHONE_DETECT_2: | ||
1366 | case WM8996_MIC_DETECT_1: | ||
1367 | case WM8996_MIC_DETECT_2: | ||
1368 | case WM8996_MIC_DETECT_3: | ||
1369 | case WM8996_CHARGE_PUMP_1: | ||
1370 | case WM8996_CHARGE_PUMP_2: | ||
1371 | case WM8996_DC_SERVO_1: | ||
1372 | case WM8996_DC_SERVO_2: | ||
1373 | case WM8996_DC_SERVO_3: | ||
1374 | case WM8996_DC_SERVO_5: | ||
1375 | case WM8996_DC_SERVO_6: | ||
1376 | case WM8996_DC_SERVO_7: | ||
1377 | case WM8996_DC_SERVO_READBACK_0: | ||
1378 | case WM8996_ANALOGUE_HP_1: | ||
1379 | case WM8996_ANALOGUE_HP_2: | ||
1380 | case WM8996_CHIP_REVISION: | ||
1381 | case WM8996_CONTROL_INTERFACE_1: | ||
1382 | case WM8996_WRITE_SEQUENCER_CTRL_1: | ||
1383 | case WM8996_WRITE_SEQUENCER_CTRL_2: | ||
1384 | case WM8996_AIF_CLOCKING_1: | ||
1385 | case WM8996_AIF_CLOCKING_2: | ||
1386 | case WM8996_CLOCKING_1: | ||
1387 | case WM8996_CLOCKING_2: | ||
1388 | case WM8996_AIF_RATE: | ||
1389 | case WM8996_FLL_CONTROL_1: | ||
1390 | case WM8996_FLL_CONTROL_2: | ||
1391 | case WM8996_FLL_CONTROL_3: | ||
1392 | case WM8996_FLL_CONTROL_4: | ||
1393 | case WM8996_FLL_CONTROL_5: | ||
1394 | case WM8996_FLL_CONTROL_6: | ||
1395 | case WM8996_FLL_EFS_1: | ||
1396 | case WM8996_FLL_EFS_2: | ||
1397 | case WM8996_AIF1_CONTROL: | ||
1398 | case WM8996_AIF1_BCLK: | ||
1399 | case WM8996_AIF1_TX_LRCLK_1: | ||
1400 | case WM8996_AIF1_TX_LRCLK_2: | ||
1401 | case WM8996_AIF1_RX_LRCLK_1: | ||
1402 | case WM8996_AIF1_RX_LRCLK_2: | ||
1403 | case WM8996_AIF1TX_DATA_CONFIGURATION_1: | ||
1404 | case WM8996_AIF1TX_DATA_CONFIGURATION_2: | ||
1405 | case WM8996_AIF1RX_DATA_CONFIGURATION: | ||
1406 | case WM8996_AIF1TX_CHANNEL_0_CONFIGURATION: | ||
1407 | case WM8996_AIF1TX_CHANNEL_1_CONFIGURATION: | ||
1408 | case WM8996_AIF1TX_CHANNEL_2_CONFIGURATION: | ||
1409 | case WM8996_AIF1TX_CHANNEL_3_CONFIGURATION: | ||
1410 | case WM8996_AIF1TX_CHANNEL_4_CONFIGURATION: | ||
1411 | case WM8996_AIF1TX_CHANNEL_5_CONFIGURATION: | ||
1412 | case WM8996_AIF1RX_CHANNEL_0_CONFIGURATION: | ||
1413 | case WM8996_AIF1RX_CHANNEL_1_CONFIGURATION: | ||
1414 | case WM8996_AIF1RX_CHANNEL_2_CONFIGURATION: | ||
1415 | case WM8996_AIF1RX_CHANNEL_3_CONFIGURATION: | ||
1416 | case WM8996_AIF1RX_CHANNEL_4_CONFIGURATION: | ||
1417 | case WM8996_AIF1RX_CHANNEL_5_CONFIGURATION: | ||
1418 | case WM8996_AIF1RX_MONO_CONFIGURATION: | ||
1419 | case WM8996_AIF1TX_TEST: | ||
1420 | case WM8996_AIF2_CONTROL: | ||
1421 | case WM8996_AIF2_BCLK: | ||
1422 | case WM8996_AIF2_TX_LRCLK_1: | ||
1423 | case WM8996_AIF2_TX_LRCLK_2: | ||
1424 | case WM8996_AIF2_RX_LRCLK_1: | ||
1425 | case WM8996_AIF2_RX_LRCLK_2: | ||
1426 | case WM8996_AIF2TX_DATA_CONFIGURATION_1: | ||
1427 | case WM8996_AIF2TX_DATA_CONFIGURATION_2: | ||
1428 | case WM8996_AIF2RX_DATA_CONFIGURATION: | ||
1429 | case WM8996_AIF2TX_CHANNEL_0_CONFIGURATION: | ||
1430 | case WM8996_AIF2TX_CHANNEL_1_CONFIGURATION: | ||
1431 | case WM8996_AIF2RX_CHANNEL_0_CONFIGURATION: | ||
1432 | case WM8996_AIF2RX_CHANNEL_1_CONFIGURATION: | ||
1433 | case WM8996_AIF2RX_MONO_CONFIGURATION: | ||
1434 | case WM8996_AIF2TX_TEST: | ||
1435 | case WM8996_DSP1_TX_LEFT_VOLUME: | ||
1436 | case WM8996_DSP1_TX_RIGHT_VOLUME: | ||
1437 | case WM8996_DSP1_RX_LEFT_VOLUME: | ||
1438 | case WM8996_DSP1_RX_RIGHT_VOLUME: | ||
1439 | case WM8996_DSP1_TX_FILTERS: | ||
1440 | case WM8996_DSP1_RX_FILTERS_1: | ||
1441 | case WM8996_DSP1_RX_FILTERS_2: | ||
1442 | case WM8996_DSP1_DRC_1: | ||
1443 | case WM8996_DSP1_DRC_2: | ||
1444 | case WM8996_DSP1_DRC_3: | ||
1445 | case WM8996_DSP1_DRC_4: | ||
1446 | case WM8996_DSP1_DRC_5: | ||
1447 | case WM8996_DSP1_RX_EQ_GAINS_1: | ||
1448 | case WM8996_DSP1_RX_EQ_GAINS_2: | ||
1449 | case WM8996_DSP1_RX_EQ_BAND_1_A: | ||
1450 | case WM8996_DSP1_RX_EQ_BAND_1_B: | ||
1451 | case WM8996_DSP1_RX_EQ_BAND_1_PG: | ||
1452 | case WM8996_DSP1_RX_EQ_BAND_2_A: | ||
1453 | case WM8996_DSP1_RX_EQ_BAND_2_B: | ||
1454 | case WM8996_DSP1_RX_EQ_BAND_2_C: | ||
1455 | case WM8996_DSP1_RX_EQ_BAND_2_PG: | ||
1456 | case WM8996_DSP1_RX_EQ_BAND_3_A: | ||
1457 | case WM8996_DSP1_RX_EQ_BAND_3_B: | ||
1458 | case WM8996_DSP1_RX_EQ_BAND_3_C: | ||
1459 | case WM8996_DSP1_RX_EQ_BAND_3_PG: | ||
1460 | case WM8996_DSP1_RX_EQ_BAND_4_A: | ||
1461 | case WM8996_DSP1_RX_EQ_BAND_4_B: | ||
1462 | case WM8996_DSP1_RX_EQ_BAND_4_C: | ||
1463 | case WM8996_DSP1_RX_EQ_BAND_4_PG: | ||
1464 | case WM8996_DSP1_RX_EQ_BAND_5_A: | ||
1465 | case WM8996_DSP1_RX_EQ_BAND_5_B: | ||
1466 | case WM8996_DSP1_RX_EQ_BAND_5_PG: | ||
1467 | case WM8996_DSP2_TX_LEFT_VOLUME: | ||
1468 | case WM8996_DSP2_TX_RIGHT_VOLUME: | ||
1469 | case WM8996_DSP2_RX_LEFT_VOLUME: | ||
1470 | case WM8996_DSP2_RX_RIGHT_VOLUME: | ||
1471 | case WM8996_DSP2_TX_FILTERS: | ||
1472 | case WM8996_DSP2_RX_FILTERS_1: | ||
1473 | case WM8996_DSP2_RX_FILTERS_2: | ||
1474 | case WM8996_DSP2_DRC_1: | ||
1475 | case WM8996_DSP2_DRC_2: | ||
1476 | case WM8996_DSP2_DRC_3: | ||
1477 | case WM8996_DSP2_DRC_4: | ||
1478 | case WM8996_DSP2_DRC_5: | ||
1479 | case WM8996_DSP2_RX_EQ_GAINS_1: | ||
1480 | case WM8996_DSP2_RX_EQ_GAINS_2: | ||
1481 | case WM8996_DSP2_RX_EQ_BAND_1_A: | ||
1482 | case WM8996_DSP2_RX_EQ_BAND_1_B: | ||
1483 | case WM8996_DSP2_RX_EQ_BAND_1_PG: | ||
1484 | case WM8996_DSP2_RX_EQ_BAND_2_A: | ||
1485 | case WM8996_DSP2_RX_EQ_BAND_2_B: | ||
1486 | case WM8996_DSP2_RX_EQ_BAND_2_C: | ||
1487 | case WM8996_DSP2_RX_EQ_BAND_2_PG: | ||
1488 | case WM8996_DSP2_RX_EQ_BAND_3_A: | ||
1489 | case WM8996_DSP2_RX_EQ_BAND_3_B: | ||
1490 | case WM8996_DSP2_RX_EQ_BAND_3_C: | ||
1491 | case WM8996_DSP2_RX_EQ_BAND_3_PG: | ||
1492 | case WM8996_DSP2_RX_EQ_BAND_4_A: | ||
1493 | case WM8996_DSP2_RX_EQ_BAND_4_B: | ||
1494 | case WM8996_DSP2_RX_EQ_BAND_4_C: | ||
1495 | case WM8996_DSP2_RX_EQ_BAND_4_PG: | ||
1496 | case WM8996_DSP2_RX_EQ_BAND_5_A: | ||
1497 | case WM8996_DSP2_RX_EQ_BAND_5_B: | ||
1498 | case WM8996_DSP2_RX_EQ_BAND_5_PG: | ||
1499 | case WM8996_DAC1_MIXER_VOLUMES: | ||
1500 | case WM8996_DAC1_LEFT_MIXER_ROUTING: | ||
1501 | case WM8996_DAC1_RIGHT_MIXER_ROUTING: | ||
1502 | case WM8996_DAC2_MIXER_VOLUMES: | ||
1503 | case WM8996_DAC2_LEFT_MIXER_ROUTING: | ||
1504 | case WM8996_DAC2_RIGHT_MIXER_ROUTING: | ||
1505 | case WM8996_DSP1_TX_LEFT_MIXER_ROUTING: | ||
1506 | case WM8996_DSP1_TX_RIGHT_MIXER_ROUTING: | ||
1507 | case WM8996_DSP2_TX_LEFT_MIXER_ROUTING: | ||
1508 | case WM8996_DSP2_TX_RIGHT_MIXER_ROUTING: | ||
1509 | case WM8996_DSP_TX_MIXER_SELECT: | ||
1510 | case WM8996_DAC_SOFTMUTE: | ||
1511 | case WM8996_OVERSAMPLING: | ||
1512 | case WM8996_SIDETONE: | ||
1513 | case WM8996_GPIO_1: | ||
1514 | case WM8996_GPIO_2: | ||
1515 | case WM8996_GPIO_3: | ||
1516 | case WM8996_GPIO_4: | ||
1517 | case WM8996_GPIO_5: | ||
1518 | case WM8996_PULL_CONTROL_1: | ||
1519 | case WM8996_PULL_CONTROL_2: | ||
1520 | case WM8996_INTERRUPT_STATUS_1: | ||
1521 | case WM8996_INTERRUPT_STATUS_2: | ||
1522 | case WM8996_INTERRUPT_RAW_STATUS_2: | ||
1523 | case WM8996_INTERRUPT_STATUS_1_MASK: | ||
1524 | case WM8996_INTERRUPT_STATUS_2_MASK: | ||
1525 | case WM8996_INTERRUPT_CONTROL: | ||
1526 | case WM8996_LEFT_PDM_SPEAKER: | ||
1527 | case WM8996_RIGHT_PDM_SPEAKER: | ||
1528 | case WM8996_PDM_SPEAKER_MUTE_SEQUENCE: | ||
1529 | case WM8996_PDM_SPEAKER_VOLUME: | ||
1530 | return 1; | ||
1531 | default: | ||
1532 | return 0; | ||
1533 | } | ||
1534 | } | ||
1535 | |||
1536 | static int wm8996_volatile_register(struct snd_soc_codec *codec, | ||
1537 | unsigned int reg) | ||
1538 | { | ||
1539 | switch (reg) { | ||
1540 | case WM8996_SOFTWARE_RESET: | ||
1541 | case WM8996_CHIP_REVISION: | ||
1542 | case WM8996_LDO_1: | ||
1543 | case WM8996_LDO_2: | ||
1544 | case WM8996_INTERRUPT_STATUS_1: | ||
1545 | case WM8996_INTERRUPT_STATUS_2: | ||
1546 | case WM8996_INTERRUPT_RAW_STATUS_2: | ||
1547 | case WM8996_DC_SERVO_READBACK_0: | ||
1548 | case WM8996_DC_SERVO_2: | ||
1549 | case WM8996_DC_SERVO_6: | ||
1550 | case WM8996_DC_SERVO_7: | ||
1551 | case WM8996_FLL_CONTROL_6: | ||
1552 | case WM8996_MIC_DETECT_3: | ||
1553 | case WM8996_HEADPHONE_DETECT_1: | ||
1554 | case WM8996_HEADPHONE_DETECT_2: | ||
1555 | return 1; | ||
1556 | default: | ||
1557 | return 0; | ||
1558 | } | ||
1559 | } | ||
1560 | |||
1561 | static int wm8996_reset(struct snd_soc_codec *codec) | ||
1562 | { | ||
1563 | return snd_soc_write(codec, WM8996_SOFTWARE_RESET, 0x8915); | ||
1564 | } | ||
1565 | |||
1566 | static const int bclk_divs[] = { | ||
1567 | 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96 | ||
1568 | }; | ||
1569 | |||
1570 | static void wm8996_update_bclk(struct snd_soc_codec *codec) | ||
1571 | { | ||
1572 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
1573 | int aif, best, cur_val, bclk_rate, bclk_reg, i; | ||
1574 | |||
1575 | /* Don't bother if we're in a low frequency idle mode that | ||
1576 | * can't support audio. | ||
1577 | */ | ||
1578 | if (wm8996->sysclk < 64000) | ||
1579 | return; | ||
1580 | |||
1581 | for (aif = 0; aif < WM8996_AIFS; aif++) { | ||
1582 | switch (aif) { | ||
1583 | case 0: | ||
1584 | bclk_reg = WM8996_AIF1_BCLK; | ||
1585 | break; | ||
1586 | case 1: | ||
1587 | bclk_reg = WM8996_AIF2_BCLK; | ||
1588 | break; | ||
1589 | } | ||
1590 | |||
1591 | bclk_rate = wm8996->bclk_rate[aif]; | ||
1592 | |||
1593 | /* Pick a divisor for BCLK as close as we can get to ideal */ | ||
1594 | best = 0; | ||
1595 | for (i = 0; i < ARRAY_SIZE(bclk_divs); i++) { | ||
1596 | cur_val = (wm8996->sysclk / bclk_divs[i]) - bclk_rate; | ||
1597 | if (cur_val < 0) /* BCLK table is sorted */ | ||
1598 | break; | ||
1599 | best = i; | ||
1600 | } | ||
1601 | bclk_rate = wm8996->sysclk / bclk_divs[best]; | ||
1602 | dev_dbg(codec->dev, "Using BCLK_DIV %d for actual BCLK %dHz\n", | ||
1603 | bclk_divs[best], bclk_rate); | ||
1604 | |||
1605 | snd_soc_update_bits(codec, bclk_reg, | ||
1606 | WM8996_AIF1_BCLK_DIV_MASK, best); | ||
1607 | } | ||
1608 | } | ||
1609 | |||
1610 | static int wm8996_set_bias_level(struct snd_soc_codec *codec, | ||
1611 | enum snd_soc_bias_level level) | ||
1612 | { | ||
1613 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
1614 | int ret; | ||
1615 | |||
1616 | switch (level) { | ||
1617 | case SND_SOC_BIAS_ON: | ||
1618 | break; | ||
1619 | |||
1620 | case SND_SOC_BIAS_PREPARE: | ||
1621 | if (codec->dapm.bias_level == SND_SOC_BIAS_STANDBY) { | ||
1622 | snd_soc_update_bits(codec, WM8996_POWER_MANAGEMENT_1, | ||
1623 | WM8996_BG_ENA, WM8996_BG_ENA); | ||
1624 | msleep(2); | ||
1625 | } | ||
1626 | break; | ||
1627 | |||
1628 | case SND_SOC_BIAS_STANDBY: | ||
1629 | if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { | ||
1630 | ret = regulator_bulk_enable(ARRAY_SIZE(wm8996->supplies), | ||
1631 | wm8996->supplies); | ||
1632 | if (ret != 0) { | ||
1633 | dev_err(codec->dev, | ||
1634 | "Failed to enable supplies: %d\n", | ||
1635 | ret); | ||
1636 | return ret; | ||
1637 | } | ||
1638 | |||
1639 | if (wm8996->pdata.ldo_ena >= 0) { | ||
1640 | gpio_set_value_cansleep(wm8996->pdata.ldo_ena, | ||
1641 | 1); | ||
1642 | msleep(5); | ||
1643 | } | ||
1644 | |||
1645 | codec->cache_only = false; | ||
1646 | snd_soc_cache_sync(codec); | ||
1647 | } | ||
1648 | |||
1649 | snd_soc_update_bits(codec, WM8996_POWER_MANAGEMENT_1, | ||
1650 | WM8996_BG_ENA, 0); | ||
1651 | break; | ||
1652 | |||
1653 | case SND_SOC_BIAS_OFF: | ||
1654 | codec->cache_only = true; | ||
1655 | if (wm8996->pdata.ldo_ena >= 0) | ||
1656 | gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0); | ||
1657 | regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), | ||
1658 | wm8996->supplies); | ||
1659 | break; | ||
1660 | } | ||
1661 | |||
1662 | codec->dapm.bias_level = level; | ||
1663 | |||
1664 | return 0; | ||
1665 | } | ||
1666 | |||
1667 | static int wm8996_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
1668 | { | ||
1669 | struct snd_soc_codec *codec = dai->codec; | ||
1670 | int aifctrl = 0; | ||
1671 | int bclk = 0; | ||
1672 | int lrclk_tx = 0; | ||
1673 | int lrclk_rx = 0; | ||
1674 | int aifctrl_reg, bclk_reg, lrclk_tx_reg, lrclk_rx_reg; | ||
1675 | |||
1676 | switch (dai->id) { | ||
1677 | case 0: | ||
1678 | aifctrl_reg = WM8996_AIF1_CONTROL; | ||
1679 | bclk_reg = WM8996_AIF1_BCLK; | ||
1680 | lrclk_tx_reg = WM8996_AIF1_TX_LRCLK_2; | ||
1681 | lrclk_rx_reg = WM8996_AIF1_RX_LRCLK_2; | ||
1682 | break; | ||
1683 | case 1: | ||
1684 | aifctrl_reg = WM8996_AIF2_CONTROL; | ||
1685 | bclk_reg = WM8996_AIF2_BCLK; | ||
1686 | lrclk_tx_reg = WM8996_AIF2_TX_LRCLK_2; | ||
1687 | lrclk_rx_reg = WM8996_AIF2_RX_LRCLK_2; | ||
1688 | break; | ||
1689 | default: | ||
1690 | BUG(); | ||
1691 | return -EINVAL; | ||
1692 | } | ||
1693 | |||
1694 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { | ||
1695 | case SND_SOC_DAIFMT_NB_NF: | ||
1696 | break; | ||
1697 | case SND_SOC_DAIFMT_IB_NF: | ||
1698 | bclk |= WM8996_AIF1_BCLK_INV; | ||
1699 | break; | ||
1700 | case SND_SOC_DAIFMT_NB_IF: | ||
1701 | lrclk_tx |= WM8996_AIF1TX_LRCLK_INV; | ||
1702 | lrclk_rx |= WM8996_AIF1RX_LRCLK_INV; | ||
1703 | break; | ||
1704 | case SND_SOC_DAIFMT_IB_IF: | ||
1705 | bclk |= WM8996_AIF1_BCLK_INV; | ||
1706 | lrclk_tx |= WM8996_AIF1TX_LRCLK_INV; | ||
1707 | lrclk_rx |= WM8996_AIF1RX_LRCLK_INV; | ||
1708 | break; | ||
1709 | } | ||
1710 | |||
1711 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | ||
1712 | case SND_SOC_DAIFMT_CBS_CFS: | ||
1713 | break; | ||
1714 | case SND_SOC_DAIFMT_CBS_CFM: | ||
1715 | lrclk_tx |= WM8996_AIF1TX_LRCLK_MSTR; | ||
1716 | lrclk_rx |= WM8996_AIF1RX_LRCLK_MSTR; | ||
1717 | break; | ||
1718 | case SND_SOC_DAIFMT_CBM_CFS: | ||
1719 | bclk |= WM8996_AIF1_BCLK_MSTR; | ||
1720 | break; | ||
1721 | case SND_SOC_DAIFMT_CBM_CFM: | ||
1722 | bclk |= WM8996_AIF1_BCLK_MSTR; | ||
1723 | lrclk_tx |= WM8996_AIF1TX_LRCLK_MSTR; | ||
1724 | lrclk_rx |= WM8996_AIF1RX_LRCLK_MSTR; | ||
1725 | break; | ||
1726 | default: | ||
1727 | return -EINVAL; | ||
1728 | } | ||
1729 | |||
1730 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | ||
1731 | case SND_SOC_DAIFMT_DSP_A: | ||
1732 | break; | ||
1733 | case SND_SOC_DAIFMT_DSP_B: | ||
1734 | aifctrl |= 1; | ||
1735 | break; | ||
1736 | case SND_SOC_DAIFMT_I2S: | ||
1737 | aifctrl |= 2; | ||
1738 | break; | ||
1739 | case SND_SOC_DAIFMT_LEFT_J: | ||
1740 | aifctrl |= 3; | ||
1741 | break; | ||
1742 | default: | ||
1743 | return -EINVAL; | ||
1744 | } | ||
1745 | |||
1746 | snd_soc_update_bits(codec, aifctrl_reg, WM8996_AIF1_FMT_MASK, aifctrl); | ||
1747 | snd_soc_update_bits(codec, bclk_reg, | ||
1748 | WM8996_AIF1_BCLK_INV | WM8996_AIF1_BCLK_MSTR, | ||
1749 | bclk); | ||
1750 | snd_soc_update_bits(codec, lrclk_tx_reg, | ||
1751 | WM8996_AIF1TX_LRCLK_INV | | ||
1752 | WM8996_AIF1TX_LRCLK_MSTR, | ||
1753 | lrclk_tx); | ||
1754 | snd_soc_update_bits(codec, lrclk_rx_reg, | ||
1755 | WM8996_AIF1RX_LRCLK_INV | | ||
1756 | WM8996_AIF1RX_LRCLK_MSTR, | ||
1757 | lrclk_rx); | ||
1758 | |||
1759 | return 0; | ||
1760 | } | ||
1761 | |||
1762 | static const int dsp_divs[] = { | ||
1763 | 48000, 32000, 16000, 8000 | ||
1764 | }; | ||
1765 | |||
1766 | static int wm8996_hw_params(struct snd_pcm_substream *substream, | ||
1767 | struct snd_pcm_hw_params *params, | ||
1768 | struct snd_soc_dai *dai) | ||
1769 | { | ||
1770 | struct snd_soc_codec *codec = dai->codec; | ||
1771 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
1772 | int bits, i, bclk_rate; | ||
1773 | int aifdata = 0; | ||
1774 | int lrclk = 0; | ||
1775 | int dsp = 0; | ||
1776 | int aifdata_reg, lrclk_reg, dsp_shift; | ||
1777 | |||
1778 | switch (dai->id) { | ||
1779 | case 0: | ||
1780 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || | ||
1781 | (snd_soc_read(codec, WM8996_GPIO_1)) & WM8996_GP1_FN_MASK) { | ||
1782 | aifdata_reg = WM8996_AIF1RX_DATA_CONFIGURATION; | ||
1783 | lrclk_reg = WM8996_AIF1_RX_LRCLK_1; | ||
1784 | } else { | ||
1785 | aifdata_reg = WM8996_AIF1TX_DATA_CONFIGURATION_1; | ||
1786 | lrclk_reg = WM8996_AIF1_TX_LRCLK_1; | ||
1787 | } | ||
1788 | dsp_shift = 0; | ||
1789 | break; | ||
1790 | case 1: | ||
1791 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || | ||
1792 | (snd_soc_read(codec, WM8996_GPIO_2)) & WM8996_GP2_FN_MASK) { | ||
1793 | aifdata_reg = WM8996_AIF2RX_DATA_CONFIGURATION; | ||
1794 | lrclk_reg = WM8996_AIF2_RX_LRCLK_1; | ||
1795 | } else { | ||
1796 | aifdata_reg = WM8996_AIF2TX_DATA_CONFIGURATION_1; | ||
1797 | lrclk_reg = WM8996_AIF2_TX_LRCLK_1; | ||
1798 | } | ||
1799 | dsp_shift = WM8996_DSP2_DIV_SHIFT; | ||
1800 | break; | ||
1801 | default: | ||
1802 | BUG(); | ||
1803 | return -EINVAL; | ||
1804 | } | ||
1805 | |||
1806 | bclk_rate = snd_soc_params_to_bclk(params); | ||
1807 | if (bclk_rate < 0) { | ||
1808 | dev_err(codec->dev, "Unsupported BCLK rate: %d\n", bclk_rate); | ||
1809 | return bclk_rate; | ||
1810 | } | ||
1811 | |||
1812 | wm8996->bclk_rate[dai->id] = bclk_rate; | ||
1813 | wm8996->rx_rate[dai->id] = params_rate(params); | ||
1814 | |||
1815 | /* Needs looking at for TDM */ | ||
1816 | bits = snd_pcm_format_width(params_format(params)); | ||
1817 | if (bits < 0) | ||
1818 | return bits; | ||
1819 | aifdata |= (bits << WM8996_AIF1TX_WL_SHIFT) | bits; | ||
1820 | |||
1821 | for (i = 0; i < ARRAY_SIZE(dsp_divs); i++) { | ||
1822 | if (dsp_divs[i] == params_rate(params)) | ||
1823 | break; | ||
1824 | } | ||
1825 | if (i == ARRAY_SIZE(dsp_divs)) { | ||
1826 | dev_err(codec->dev, "Unsupported sample rate %dHz\n", | ||
1827 | params_rate(params)); | ||
1828 | return -EINVAL; | ||
1829 | } | ||
1830 | dsp |= i << dsp_shift; | ||
1831 | |||
1832 | wm8996_update_bclk(codec); | ||
1833 | |||
1834 | lrclk = bclk_rate / params_rate(params); | ||
1835 | dev_dbg(dai->dev, "Using LRCLK rate %d for actual LRCLK %dHz\n", | ||
1836 | lrclk, bclk_rate / lrclk); | ||
1837 | |||
1838 | snd_soc_update_bits(codec, aifdata_reg, | ||
1839 | WM8996_AIF1TX_WL_MASK | | ||
1840 | WM8996_AIF1TX_SLOT_LEN_MASK, | ||
1841 | aifdata); | ||
1842 | snd_soc_update_bits(codec, lrclk_reg, WM8996_AIF1RX_RATE_MASK, | ||
1843 | lrclk); | ||
1844 | snd_soc_update_bits(codec, WM8996_AIF_CLOCKING_2, | ||
1845 | WM8996_DSP1_DIV_SHIFT << dsp_shift, dsp); | ||
1846 | |||
1847 | return 0; | ||
1848 | } | ||
1849 | |||
1850 | static int wm8996_set_sysclk(struct snd_soc_dai *dai, | ||
1851 | int clk_id, unsigned int freq, int dir) | ||
1852 | { | ||
1853 | struct snd_soc_codec *codec = dai->codec; | ||
1854 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
1855 | int lfclk = 0; | ||
1856 | int ratediv = 0; | ||
1857 | int src; | ||
1858 | int old; | ||
1859 | |||
1860 | if (freq == wm8996->sysclk && clk_id == wm8996->sysclk_src) | ||
1861 | return 0; | ||
1862 | |||
1863 | /* Disable SYSCLK while we reconfigure */ | ||
1864 | old = snd_soc_read(codec, WM8996_AIF_CLOCKING_1) & WM8996_SYSCLK_ENA; | ||
1865 | snd_soc_update_bits(codec, WM8996_AIF_CLOCKING_1, | ||
1866 | WM8996_SYSCLK_ENA, 0); | ||
1867 | |||
1868 | switch (clk_id) { | ||
1869 | case WM8996_SYSCLK_MCLK1: | ||
1870 | wm8996->sysclk = freq; | ||
1871 | src = 0; | ||
1872 | break; | ||
1873 | case WM8996_SYSCLK_MCLK2: | ||
1874 | wm8996->sysclk = freq; | ||
1875 | src = 1; | ||
1876 | break; | ||
1877 | case WM8996_SYSCLK_FLL: | ||
1878 | wm8996->sysclk = freq; | ||
1879 | src = 2; | ||
1880 | break; | ||
1881 | default: | ||
1882 | dev_err(codec->dev, "Unsupported clock source %d\n", clk_id); | ||
1883 | return -EINVAL; | ||
1884 | } | ||
1885 | |||
1886 | switch (wm8996->sysclk) { | ||
1887 | case 6144000: | ||
1888 | snd_soc_update_bits(codec, WM8996_AIF_RATE, | ||
1889 | WM8996_SYSCLK_RATE, 0); | ||
1890 | break; | ||
1891 | case 24576000: | ||
1892 | ratediv = WM8996_SYSCLK_DIV; | ||
1893 | case 12288000: | ||
1894 | snd_soc_update_bits(codec, WM8996_AIF_RATE, | ||
1895 | WM8996_SYSCLK_RATE, WM8996_SYSCLK_RATE); | ||
1896 | break; | ||
1897 | case 32000: | ||
1898 | case 32768: | ||
1899 | lfclk = WM8996_LFCLK_ENA; | ||
1900 | break; | ||
1901 | default: | ||
1902 | dev_warn(codec->dev, "Unsupported clock rate %dHz\n", | ||
1903 | wm8996->sysclk); | ||
1904 | return -EINVAL; | ||
1905 | } | ||
1906 | |||
1907 | wm8996_update_bclk(codec); | ||
1908 | |||
1909 | snd_soc_update_bits(codec, WM8996_AIF_CLOCKING_1, | ||
1910 | WM8996_SYSCLK_SRC_MASK | WM8996_SYSCLK_DIV_MASK, | ||
1911 | src << WM8996_SYSCLK_SRC_SHIFT | ratediv); | ||
1912 | snd_soc_update_bits(codec, WM8996_CLOCKING_1, WM8996_LFCLK_ENA, lfclk); | ||
1913 | snd_soc_update_bits(codec, WM8996_AIF_CLOCKING_1, | ||
1914 | WM8996_SYSCLK_ENA, old); | ||
1915 | |||
1916 | wm8996->sysclk_src = clk_id; | ||
1917 | |||
1918 | return 0; | ||
1919 | } | ||
1920 | |||
1921 | struct _fll_div { | ||
1922 | u16 fll_fratio; | ||
1923 | u16 fll_outdiv; | ||
1924 | u16 fll_refclk_div; | ||
1925 | u16 fll_loop_gain; | ||
1926 | u16 fll_ref_freq; | ||
1927 | u16 n; | ||
1928 | u16 theta; | ||
1929 | u16 lambda; | ||
1930 | }; | ||
1931 | |||
1932 | static struct { | ||
1933 | unsigned int min; | ||
1934 | unsigned int max; | ||
1935 | u16 fll_fratio; | ||
1936 | int ratio; | ||
1937 | } fll_fratios[] = { | ||
1938 | { 0, 64000, 4, 16 }, | ||
1939 | { 64000, 128000, 3, 8 }, | ||
1940 | { 128000, 256000, 2, 4 }, | ||
1941 | { 256000, 1000000, 1, 2 }, | ||
1942 | { 1000000, 13500000, 0, 1 }, | ||
1943 | }; | ||
1944 | |||
1945 | static int fll_factors(struct _fll_div *fll_div, unsigned int Fref, | ||
1946 | unsigned int Fout) | ||
1947 | { | ||
1948 | unsigned int target; | ||
1949 | unsigned int div; | ||
1950 | unsigned int fratio, gcd_fll; | ||
1951 | int i; | ||
1952 | |||
1953 | /* Fref must be <=13.5MHz */ | ||
1954 | div = 1; | ||
1955 | fll_div->fll_refclk_div = 0; | ||
1956 | while ((Fref / div) > 13500000) { | ||
1957 | div *= 2; | ||
1958 | fll_div->fll_refclk_div++; | ||
1959 | |||
1960 | if (div > 8) { | ||
1961 | pr_err("Can't scale %dMHz input down to <=13.5MHz\n", | ||
1962 | Fref); | ||
1963 | return -EINVAL; | ||
1964 | } | ||
1965 | } | ||
1966 | |||
1967 | pr_debug("FLL Fref=%u Fout=%u\n", Fref, Fout); | ||
1968 | |||
1969 | /* Apply the division for our remaining calculations */ | ||
1970 | Fref /= div; | ||
1971 | |||
1972 | if (Fref >= 3000000) | ||
1973 | fll_div->fll_loop_gain = 5; | ||
1974 | else | ||
1975 | fll_div->fll_loop_gain = 0; | ||
1976 | |||
1977 | if (Fref >= 48000) | ||
1978 | fll_div->fll_ref_freq = 0; | ||
1979 | else | ||
1980 | fll_div->fll_ref_freq = 1; | ||
1981 | |||
1982 | /* Fvco should be 90-100MHz; don't check the upper bound */ | ||
1983 | div = 2; | ||
1984 | while (Fout * div < 90000000) { | ||
1985 | div++; | ||
1986 | if (div > 64) { | ||
1987 | pr_err("Unable to find FLL_OUTDIV for Fout=%uHz\n", | ||
1988 | Fout); | ||
1989 | return -EINVAL; | ||
1990 | } | ||
1991 | } | ||
1992 | target = Fout * div; | ||
1993 | fll_div->fll_outdiv = div - 1; | ||
1994 | |||
1995 | pr_debug("FLL Fvco=%dHz\n", target); | ||
1996 | |||
1997 | /* Find an appropraite FLL_FRATIO and factor it out of the target */ | ||
1998 | for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) { | ||
1999 | if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) { | ||
2000 | fll_div->fll_fratio = fll_fratios[i].fll_fratio; | ||
2001 | fratio = fll_fratios[i].ratio; | ||
2002 | break; | ||
2003 | } | ||
2004 | } | ||
2005 | if (i == ARRAY_SIZE(fll_fratios)) { | ||
2006 | pr_err("Unable to find FLL_FRATIO for Fref=%uHz\n", Fref); | ||
2007 | return -EINVAL; | ||
2008 | } | ||
2009 | |||
2010 | fll_div->n = target / (fratio * Fref); | ||
2011 | |||
2012 | if (target % Fref == 0) { | ||
2013 | fll_div->theta = 0; | ||
2014 | fll_div->lambda = 0; | ||
2015 | } else { | ||
2016 | gcd_fll = gcd(target, fratio * Fref); | ||
2017 | |||
2018 | fll_div->theta = (target - (fll_div->n * fratio * Fref)) | ||
2019 | / gcd_fll; | ||
2020 | fll_div->lambda = (fratio * Fref) / gcd_fll; | ||
2021 | } | ||
2022 | |||
2023 | pr_debug("FLL N=%x THETA=%x LAMBDA=%x\n", | ||
2024 | fll_div->n, fll_div->theta, fll_div->lambda); | ||
2025 | pr_debug("FLL_FRATIO=%x FLL_OUTDIV=%x FLL_REFCLK_DIV=%x\n", | ||
2026 | fll_div->fll_fratio, fll_div->fll_outdiv, | ||
2027 | fll_div->fll_refclk_div); | ||
2028 | |||
2029 | return 0; | ||
2030 | } | ||
2031 | |||
2032 | static int wm8996_set_fll(struct snd_soc_codec *codec, int fll_id, int source, | ||
2033 | unsigned int Fref, unsigned int Fout) | ||
2034 | { | ||
2035 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
2036 | struct i2c_client *i2c = to_i2c_client(codec->dev); | ||
2037 | struct _fll_div fll_div; | ||
2038 | unsigned long timeout; | ||
2039 | int ret, reg; | ||
2040 | |||
2041 | /* Any change? */ | ||
2042 | if (source == wm8996->fll_src && Fref == wm8996->fll_fref && | ||
2043 | Fout == wm8996->fll_fout) | ||
2044 | return 0; | ||
2045 | |||
2046 | if (Fout == 0) { | ||
2047 | dev_dbg(codec->dev, "FLL disabled\n"); | ||
2048 | |||
2049 | wm8996->fll_fref = 0; | ||
2050 | wm8996->fll_fout = 0; | ||
2051 | |||
2052 | snd_soc_update_bits(codec, WM8996_FLL_CONTROL_1, | ||
2053 | WM8996_FLL_ENA, 0); | ||
2054 | |||
2055 | return 0; | ||
2056 | } | ||
2057 | |||
2058 | ret = fll_factors(&fll_div, Fref, Fout); | ||
2059 | if (ret != 0) | ||
2060 | return ret; | ||
2061 | |||
2062 | switch (source) { | ||
2063 | case WM8996_FLL_MCLK1: | ||
2064 | reg = 0; | ||
2065 | break; | ||
2066 | case WM8996_FLL_MCLK2: | ||
2067 | reg = 1; | ||
2068 | break; | ||
2069 | case WM8996_FLL_DACLRCLK1: | ||
2070 | reg = 2; | ||
2071 | break; | ||
2072 | case WM8996_FLL_BCLK1: | ||
2073 | reg = 3; | ||
2074 | break; | ||
2075 | default: | ||
2076 | dev_err(codec->dev, "Unknown FLL source %d\n", ret); | ||
2077 | return -EINVAL; | ||
2078 | } | ||
2079 | |||
2080 | reg |= fll_div.fll_refclk_div << WM8996_FLL_REFCLK_DIV_SHIFT; | ||
2081 | reg |= fll_div.fll_ref_freq << WM8996_FLL_REF_FREQ_SHIFT; | ||
2082 | |||
2083 | snd_soc_update_bits(codec, WM8996_FLL_CONTROL_5, | ||
2084 | WM8996_FLL_REFCLK_DIV_MASK | WM8996_FLL_REF_FREQ | | ||
2085 | WM8996_FLL_REFCLK_SRC_MASK, reg); | ||
2086 | |||
2087 | reg = 0; | ||
2088 | if (fll_div.theta || fll_div.lambda) | ||
2089 | reg |= WM8996_FLL_EFS_ENA | (3 << WM8996_FLL_LFSR_SEL_SHIFT); | ||
2090 | else | ||
2091 | reg |= 1 << WM8996_FLL_LFSR_SEL_SHIFT; | ||
2092 | snd_soc_write(codec, WM8996_FLL_EFS_2, reg); | ||
2093 | |||
2094 | snd_soc_update_bits(codec, WM8996_FLL_CONTROL_2, | ||
2095 | WM8996_FLL_OUTDIV_MASK | | ||
2096 | WM8996_FLL_FRATIO_MASK, | ||
2097 | (fll_div.fll_outdiv << WM8996_FLL_OUTDIV_SHIFT) | | ||
2098 | (fll_div.fll_fratio)); | ||
2099 | |||
2100 | snd_soc_write(codec, WM8996_FLL_CONTROL_3, fll_div.theta); | ||
2101 | |||
2102 | snd_soc_update_bits(codec, WM8996_FLL_CONTROL_4, | ||
2103 | WM8996_FLL_N_MASK | WM8996_FLL_LOOP_GAIN_MASK, | ||
2104 | (fll_div.n << WM8996_FLL_N_SHIFT) | | ||
2105 | fll_div.fll_loop_gain); | ||
2106 | |||
2107 | snd_soc_write(codec, WM8996_FLL_EFS_1, fll_div.lambda); | ||
2108 | |||
2109 | snd_soc_update_bits(codec, WM8996_FLL_CONTROL_1, | ||
2110 | WM8996_FLL_ENA, WM8996_FLL_ENA); | ||
2111 | |||
2112 | /* The FLL supports live reconfiguration - kick that in case we were | ||
2113 | * already enabled. | ||
2114 | */ | ||
2115 | snd_soc_write(codec, WM8996_FLL_CONTROL_6, WM8996_FLL_SWITCH_CLK); | ||
2116 | |||
2117 | /* Wait for the FLL to lock, using the interrupt if possible */ | ||
2118 | if (Fref > 1000000) | ||
2119 | timeout = usecs_to_jiffies(300); | ||
2120 | else | ||
2121 | timeout = msecs_to_jiffies(2); | ||
2122 | |||
2123 | /* Allow substantially longer if we've actually got the IRQ */ | ||
2124 | if (i2c->irq) | ||
2125 | timeout *= 1000; | ||
2126 | |||
2127 | ret = wait_for_completion_timeout(&wm8996->fll_lock, timeout); | ||
2128 | |||
2129 | if (ret == 0 && i2c->irq) { | ||
2130 | dev_err(codec->dev, "Timed out waiting for FLL\n"); | ||
2131 | ret = -ETIMEDOUT; | ||
2132 | } else { | ||
2133 | ret = 0; | ||
2134 | } | ||
2135 | |||
2136 | dev_dbg(codec->dev, "FLL configured for %dHz->%dHz\n", Fref, Fout); | ||
2137 | |||
2138 | wm8996->fll_fref = Fref; | ||
2139 | wm8996->fll_fout = Fout; | ||
2140 | wm8996->fll_src = source; | ||
2141 | |||
2142 | return ret; | ||
2143 | } | ||
2144 | |||
2145 | #ifdef CONFIG_GPIOLIB | ||
2146 | static inline struct wm8996_priv *gpio_to_wm8996(struct gpio_chip *chip) | ||
2147 | { | ||
2148 | return container_of(chip, struct wm8996_priv, gpio_chip); | ||
2149 | } | ||
2150 | |||
2151 | static void wm8996_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | ||
2152 | { | ||
2153 | struct wm8996_priv *wm8996 = gpio_to_wm8996(chip); | ||
2154 | struct snd_soc_codec *codec = wm8996->codec; | ||
2155 | |||
2156 | snd_soc_update_bits(codec, WM8996_GPIO_1 + offset, | ||
2157 | WM8996_GP1_LVL, !!value << WM8996_GP1_LVL_SHIFT); | ||
2158 | } | ||
2159 | |||
2160 | static int wm8996_gpio_direction_out(struct gpio_chip *chip, | ||
2161 | unsigned offset, int value) | ||
2162 | { | ||
2163 | struct wm8996_priv *wm8996 = gpio_to_wm8996(chip); | ||
2164 | struct snd_soc_codec *codec = wm8996->codec; | ||
2165 | int val; | ||
2166 | |||
2167 | val = (1 << WM8996_GP1_FN_SHIFT) | (!!value << WM8996_GP1_LVL_SHIFT); | ||
2168 | |||
2169 | return snd_soc_update_bits(codec, WM8996_GPIO_1 + offset, | ||
2170 | WM8996_GP1_FN_MASK | WM8996_GP1_DIR | | ||
2171 | WM8996_GP1_LVL, val); | ||
2172 | } | ||
2173 | |||
2174 | static int wm8996_gpio_get(struct gpio_chip *chip, unsigned offset) | ||
2175 | { | ||
2176 | struct wm8996_priv *wm8996 = gpio_to_wm8996(chip); | ||
2177 | struct snd_soc_codec *codec = wm8996->codec; | ||
2178 | int ret; | ||
2179 | |||
2180 | ret = snd_soc_read(codec, WM8996_GPIO_1 + offset); | ||
2181 | if (ret < 0) | ||
2182 | return ret; | ||
2183 | |||
2184 | return (ret & WM8996_GP1_LVL) != 0; | ||
2185 | } | ||
2186 | |||
2187 | static int wm8996_gpio_direction_in(struct gpio_chip *chip, unsigned offset) | ||
2188 | { | ||
2189 | struct wm8996_priv *wm8996 = gpio_to_wm8996(chip); | ||
2190 | struct snd_soc_codec *codec = wm8996->codec; | ||
2191 | |||
2192 | return snd_soc_update_bits(codec, WM8996_GPIO_1 + offset, | ||
2193 | WM8996_GP1_FN_MASK | WM8996_GP1_DIR, | ||
2194 | (1 << WM8996_GP1_FN_SHIFT) | | ||
2195 | (1 << WM8996_GP1_DIR_SHIFT)); | ||
2196 | } | ||
2197 | |||
2198 | static struct gpio_chip wm8996_template_chip = { | ||
2199 | .label = "wm8996", | ||
2200 | .owner = THIS_MODULE, | ||
2201 | .direction_output = wm8996_gpio_direction_out, | ||
2202 | .set = wm8996_gpio_set, | ||
2203 | .direction_input = wm8996_gpio_direction_in, | ||
2204 | .get = wm8996_gpio_get, | ||
2205 | .can_sleep = 1, | ||
2206 | }; | ||
2207 | |||
2208 | static void wm8996_init_gpio(struct snd_soc_codec *codec) | ||
2209 | { | ||
2210 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
2211 | int ret; | ||
2212 | |||
2213 | wm8996->gpio_chip = wm8996_template_chip; | ||
2214 | wm8996->gpio_chip.ngpio = 5; | ||
2215 | wm8996->gpio_chip.dev = codec->dev; | ||
2216 | |||
2217 | if (wm8996->pdata.gpio_base) | ||
2218 | wm8996->gpio_chip.base = wm8996->pdata.gpio_base; | ||
2219 | else | ||
2220 | wm8996->gpio_chip.base = -1; | ||
2221 | |||
2222 | ret = gpiochip_add(&wm8996->gpio_chip); | ||
2223 | if (ret != 0) | ||
2224 | dev_err(codec->dev, "Failed to add GPIOs: %d\n", ret); | ||
2225 | } | ||
2226 | |||
2227 | static void wm8996_free_gpio(struct snd_soc_codec *codec) | ||
2228 | { | ||
2229 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
2230 | int ret; | ||
2231 | |||
2232 | ret = gpiochip_remove(&wm8996->gpio_chip); | ||
2233 | if (ret != 0) | ||
2234 | dev_err(codec->dev, "Failed to remove GPIOs: %d\n", ret); | ||
2235 | } | ||
2236 | #else | ||
2237 | static void wm8996_init_gpio(struct snd_soc_codec *codec) | ||
2238 | { | ||
2239 | } | ||
2240 | |||
2241 | static void wm8996_free_gpio(struct snd_soc_codec *codec) | ||
2242 | { | ||
2243 | } | ||
2244 | #endif | ||
2245 | |||
2246 | /** | ||
2247 | * wm8996_detect - Enable default WM8996 jack detection | ||
2248 | * | ||
2249 | * The WM8996 has advanced accessory detection support for headsets. | ||
2250 | * This function provides a default implementation which integrates | ||
2251 | * the majority of this functionality with minimal user configuration. | ||
2252 | * | ||
2253 | * This will detect headset, headphone and short circuit button and | ||
2254 | * will also detect inverted microphone ground connections and update | ||
2255 | * the polarity of the connections. | ||
2256 | */ | ||
2257 | int wm8996_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | ||
2258 | wm8996_polarity_fn polarity_cb) | ||
2259 | { | ||
2260 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
2261 | |||
2262 | wm8996->jack = jack; | ||
2263 | wm8996->detecting = true; | ||
2264 | wm8996->polarity_cb = polarity_cb; | ||
2265 | |||
2266 | if (wm8996->polarity_cb) | ||
2267 | wm8996->polarity_cb(codec, 0); | ||
2268 | |||
2269 | /* Clear discarge to avoid noise during detection */ | ||
2270 | snd_soc_update_bits(codec, WM8996_MICBIAS_1, | ||
2271 | WM8996_MICB1_DISCH, 0); | ||
2272 | snd_soc_update_bits(codec, WM8996_MICBIAS_2, | ||
2273 | WM8996_MICB2_DISCH, 0); | ||
2274 | |||
2275 | /* LDO2 powers the microphones, SYSCLK clocks detection */ | ||
2276 | snd_soc_dapm_force_enable_pin(&codec->dapm, "LDO2"); | ||
2277 | snd_soc_dapm_force_enable_pin(&codec->dapm, "SYSCLK"); | ||
2278 | |||
2279 | /* We start off just enabling microphone detection - even a | ||
2280 | * plain headphone will trigger detection. | ||
2281 | */ | ||
2282 | snd_soc_update_bits(codec, WM8996_MIC_DETECT_1, | ||
2283 | WM8996_MICD_ENA, WM8996_MICD_ENA); | ||
2284 | |||
2285 | /* Slowest detection rate, gives debounce for initial detection */ | ||
2286 | snd_soc_update_bits(codec, WM8996_MIC_DETECT_1, | ||
2287 | WM8996_MICD_RATE_MASK, | ||
2288 | WM8996_MICD_RATE_MASK); | ||
2289 | |||
2290 | /* Enable interrupts and we're off */ | ||
2291 | snd_soc_update_bits(codec, WM8996_INTERRUPT_STATUS_2_MASK, | ||
2292 | WM8996_IM_MICD_EINT, 0); | ||
2293 | |||
2294 | return 0; | ||
2295 | } | ||
2296 | EXPORT_SYMBOL_GPL(wm8996_detect); | ||
2297 | |||
2298 | static void wm8996_micd(struct snd_soc_codec *codec) | ||
2299 | { | ||
2300 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
2301 | int val, reg; | ||
2302 | |||
2303 | val = snd_soc_read(codec, WM8996_MIC_DETECT_3); | ||
2304 | |||
2305 | dev_dbg(codec->dev, "Microphone event: %x\n", val); | ||
2306 | |||
2307 | if (!(val & WM8996_MICD_VALID)) { | ||
2308 | dev_warn(codec->dev, "Microphone detection state invalid\n"); | ||
2309 | return; | ||
2310 | } | ||
2311 | |||
2312 | /* No accessory, reset everything and report removal */ | ||
2313 | if (!(val & WM8996_MICD_STS)) { | ||
2314 | dev_dbg(codec->dev, "Jack removal detected\n"); | ||
2315 | wm8996->jack_mic = false; | ||
2316 | wm8996->detecting = true; | ||
2317 | snd_soc_jack_report(wm8996->jack, 0, | ||
2318 | SND_JACK_HEADSET | SND_JACK_BTN_0); | ||
2319 | snd_soc_update_bits(codec, WM8996_MIC_DETECT_1, | ||
2320 | WM8996_MICD_RATE_MASK, | ||
2321 | WM8996_MICD_RATE_MASK); | ||
2322 | return; | ||
2323 | } | ||
2324 | |||
2325 | /* If the measurement is very high we've got a microphone but | ||
2326 | * do a little debounce to account for mechanical issues. | ||
2327 | */ | ||
2328 | if (val & 0x400) { | ||
2329 | dev_dbg(codec->dev, "Microphone detected\n"); | ||
2330 | snd_soc_jack_report(wm8996->jack, SND_JACK_HEADSET, | ||
2331 | SND_JACK_HEADSET | SND_JACK_BTN_0); | ||
2332 | wm8996->jack_mic = true; | ||
2333 | wm8996->detecting = false; | ||
2334 | |||
2335 | /* Increase poll rate to give better responsiveness | ||
2336 | * for buttons */ | ||
2337 | snd_soc_update_bits(codec, WM8996_MIC_DETECT_1, | ||
2338 | WM8996_MICD_RATE_MASK, | ||
2339 | 5 << WM8996_MICD_RATE_SHIFT); | ||
2340 | } | ||
2341 | |||
2342 | /* If we detected a lower impedence during initial startup | ||
2343 | * then we probably have the wrong polarity, flip it. Don't | ||
2344 | * do this for the lowest impedences to speed up detection of | ||
2345 | * plain headphones. | ||
2346 | */ | ||
2347 | if (wm8996->detecting && (val & 0x3f0)) { | ||
2348 | reg = snd_soc_read(codec, WM8996_ACCESSORY_DETECT_MODE_2); | ||
2349 | reg ^= WM8996_HPOUT1FB_SRC | WM8996_MICD_SRC | | ||
2350 | WM8996_MICD_BIAS_SRC; | ||
2351 | snd_soc_update_bits(codec, WM8996_ACCESSORY_DETECT_MODE_2, | ||
2352 | WM8996_HPOUT1FB_SRC | WM8996_MICD_SRC | | ||
2353 | WM8996_MICD_BIAS_SRC, reg); | ||
2354 | |||
2355 | if (wm8996->polarity_cb) | ||
2356 | wm8996->polarity_cb(codec, | ||
2357 | (reg & WM8996_MICD_SRC) != 0); | ||
2358 | |||
2359 | dev_dbg(codec->dev, "Set microphone polarity to %d\n", | ||
2360 | (reg & WM8996_MICD_SRC) != 0); | ||
2361 | |||
2362 | return; | ||
2363 | } | ||
2364 | |||
2365 | /* Don't distinguish between buttons, just report any low | ||
2366 | * impedence as BTN_0. | ||
2367 | */ | ||
2368 | if (val & 0x3fc) { | ||
2369 | if (wm8996->jack_mic) { | ||
2370 | dev_dbg(codec->dev, "Mic button detected\n"); | ||
2371 | snd_soc_jack_report(wm8996->jack, | ||
2372 | SND_JACK_HEADSET | SND_JACK_BTN_0, | ||
2373 | SND_JACK_HEADSET | SND_JACK_BTN_0); | ||
2374 | } else { | ||
2375 | dev_dbg(codec->dev, "Headphone detected\n"); | ||
2376 | snd_soc_jack_report(wm8996->jack, | ||
2377 | SND_JACK_HEADPHONE, | ||
2378 | SND_JACK_HEADSET | | ||
2379 | SND_JACK_BTN_0); | ||
2380 | |||
2381 | /* Increase the detection rate a bit for | ||
2382 | * responsiveness. | ||
2383 | */ | ||
2384 | snd_soc_update_bits(codec, WM8996_MIC_DETECT_1, | ||
2385 | WM8996_MICD_RATE_MASK, | ||
2386 | 7 << WM8996_MICD_RATE_SHIFT); | ||
2387 | |||
2388 | wm8996->detecting = false; | ||
2389 | } | ||
2390 | } | ||
2391 | } | ||
2392 | |||
2393 | static irqreturn_t wm8996_irq(int irq, void *data) | ||
2394 | { | ||
2395 | struct snd_soc_codec *codec = data; | ||
2396 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
2397 | int irq_val; | ||
2398 | |||
2399 | irq_val = snd_soc_read(codec, WM8996_INTERRUPT_STATUS_2); | ||
2400 | if (irq_val < 0) { | ||
2401 | dev_err(codec->dev, "Failed to read IRQ status: %d\n", | ||
2402 | irq_val); | ||
2403 | return IRQ_NONE; | ||
2404 | } | ||
2405 | irq_val &= ~snd_soc_read(codec, WM8996_INTERRUPT_STATUS_2_MASK); | ||
2406 | |||
2407 | snd_soc_write(codec, WM8996_INTERRUPT_STATUS_2, irq_val); | ||
2408 | |||
2409 | if (irq_val & (WM8996_DCS_DONE_01_EINT | WM8996_DCS_DONE_23_EINT)) { | ||
2410 | dev_dbg(codec->dev, "DC servo IRQ\n"); | ||
2411 | complete(&wm8996->dcs_done); | ||
2412 | } | ||
2413 | |||
2414 | if (irq_val & WM8996_FIFOS_ERR_EINT) | ||
2415 | dev_err(codec->dev, "Digital core FIFO error\n"); | ||
2416 | |||
2417 | if (irq_val & WM8996_FLL_LOCK_EINT) { | ||
2418 | dev_dbg(codec->dev, "FLL locked\n"); | ||
2419 | complete(&wm8996->fll_lock); | ||
2420 | } | ||
2421 | |||
2422 | if (irq_val & WM8996_MICD_EINT) | ||
2423 | wm8996_micd(codec); | ||
2424 | |||
2425 | if (irq_val) | ||
2426 | return IRQ_HANDLED; | ||
2427 | else | ||
2428 | return IRQ_NONE; | ||
2429 | } | ||
2430 | |||
2431 | static irqreturn_t wm8996_edge_irq(int irq, void *data) | ||
2432 | { | ||
2433 | irqreturn_t ret = IRQ_NONE; | ||
2434 | irqreturn_t val; | ||
2435 | |||
2436 | do { | ||
2437 | val = wm8996_irq(irq, data); | ||
2438 | if (val != IRQ_NONE) | ||
2439 | ret = val; | ||
2440 | } while (val != IRQ_NONE); | ||
2441 | |||
2442 | return ret; | ||
2443 | } | ||
2444 | |||
2445 | static void wm8996_retune_mobile_pdata(struct snd_soc_codec *codec) | ||
2446 | { | ||
2447 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
2448 | struct wm8996_pdata *pdata = &wm8996->pdata; | ||
2449 | |||
2450 | struct snd_kcontrol_new controls[] = { | ||
2451 | SOC_ENUM_EXT("DSP1 EQ Mode", | ||
2452 | wm8996->retune_mobile_enum, | ||
2453 | wm8996_get_retune_mobile_enum, | ||
2454 | wm8996_put_retune_mobile_enum), | ||
2455 | SOC_ENUM_EXT("DSP2 EQ Mode", | ||
2456 | wm8996->retune_mobile_enum, | ||
2457 | wm8996_get_retune_mobile_enum, | ||
2458 | wm8996_put_retune_mobile_enum), | ||
2459 | }; | ||
2460 | int ret, i, j; | ||
2461 | const char **t; | ||
2462 | |||
2463 | /* We need an array of texts for the enum API but the number | ||
2464 | * of texts is likely to be less than the number of | ||
2465 | * configurations due to the sample rate dependency of the | ||
2466 | * configurations. */ | ||
2467 | wm8996->num_retune_mobile_texts = 0; | ||
2468 | wm8996->retune_mobile_texts = NULL; | ||
2469 | for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { | ||
2470 | for (j = 0; j < wm8996->num_retune_mobile_texts; j++) { | ||
2471 | if (strcmp(pdata->retune_mobile_cfgs[i].name, | ||
2472 | wm8996->retune_mobile_texts[j]) == 0) | ||
2473 | break; | ||
2474 | } | ||
2475 | |||
2476 | if (j != wm8996->num_retune_mobile_texts) | ||
2477 | continue; | ||
2478 | |||
2479 | /* Expand the array... */ | ||
2480 | t = krealloc(wm8996->retune_mobile_texts, | ||
2481 | sizeof(char *) * | ||
2482 | (wm8996->num_retune_mobile_texts + 1), | ||
2483 | GFP_KERNEL); | ||
2484 | if (t == NULL) | ||
2485 | continue; | ||
2486 | |||
2487 | /* ...store the new entry... */ | ||
2488 | t[wm8996->num_retune_mobile_texts] = | ||
2489 | pdata->retune_mobile_cfgs[i].name; | ||
2490 | |||
2491 | /* ...and remember the new version. */ | ||
2492 | wm8996->num_retune_mobile_texts++; | ||
2493 | wm8996->retune_mobile_texts = t; | ||
2494 | } | ||
2495 | |||
2496 | dev_dbg(codec->dev, "Allocated %d unique ReTune Mobile names\n", | ||
2497 | wm8996->num_retune_mobile_texts); | ||
2498 | |||
2499 | wm8996->retune_mobile_enum.max = wm8996->num_retune_mobile_texts; | ||
2500 | wm8996->retune_mobile_enum.texts = wm8996->retune_mobile_texts; | ||
2501 | |||
2502 | ret = snd_soc_add_controls(codec, controls, ARRAY_SIZE(controls)); | ||
2503 | if (ret != 0) | ||
2504 | dev_err(codec->dev, | ||
2505 | "Failed to add ReTune Mobile controls: %d\n", ret); | ||
2506 | } | ||
2507 | |||
2508 | static int wm8996_probe(struct snd_soc_codec *codec) | ||
2509 | { | ||
2510 | int ret; | ||
2511 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
2512 | struct i2c_client *i2c = to_i2c_client(codec->dev); | ||
2513 | struct snd_soc_dapm_context *dapm = &codec->dapm; | ||
2514 | int i, irq_flags; | ||
2515 | |||
2516 | wm8996->codec = codec; | ||
2517 | |||
2518 | init_completion(&wm8996->dcs_done); | ||
2519 | init_completion(&wm8996->fll_lock); | ||
2520 | |||
2521 | dapm->idle_bias_off = true; | ||
2522 | dapm->bias_level = SND_SOC_BIAS_OFF; | ||
2523 | |||
2524 | ret = snd_soc_codec_set_cache_io(codec, 16, 16, SND_SOC_I2C); | ||
2525 | if (ret != 0) { | ||
2526 | dev_err(codec->dev, "Failed to set cache I/O: %d\n", ret); | ||
2527 | goto err; | ||
2528 | } | ||
2529 | |||
2530 | for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++) | ||
2531 | wm8996->supplies[i].supply = wm8996_supply_names[i]; | ||
2532 | |||
2533 | ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8996->supplies), | ||
2534 | wm8996->supplies); | ||
2535 | if (ret != 0) { | ||
2536 | dev_err(codec->dev, "Failed to request supplies: %d\n", ret); | ||
2537 | goto err; | ||
2538 | } | ||
2539 | |||
2540 | wm8996->disable_nb[0].notifier_call = wm8996_regulator_event_0; | ||
2541 | wm8996->disable_nb[1].notifier_call = wm8996_regulator_event_1; | ||
2542 | wm8996->disable_nb[2].notifier_call = wm8996_regulator_event_2; | ||
2543 | wm8996->disable_nb[3].notifier_call = wm8996_regulator_event_3; | ||
2544 | |||
2545 | /* This should really be moved into the regulator core */ | ||
2546 | for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++) { | ||
2547 | ret = regulator_register_notifier(wm8996->supplies[i].consumer, | ||
2548 | &wm8996->disable_nb[i]); | ||
2549 | if (ret != 0) { | ||
2550 | dev_err(codec->dev, | ||
2551 | "Failed to register regulator notifier: %d\n", | ||
2552 | ret); | ||
2553 | } | ||
2554 | } | ||
2555 | |||
2556 | ret = regulator_bulk_enable(ARRAY_SIZE(wm8996->supplies), | ||
2557 | wm8996->supplies); | ||
2558 | if (ret != 0) { | ||
2559 | dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); | ||
2560 | goto err_get; | ||
2561 | } | ||
2562 | |||
2563 | if (wm8996->pdata.ldo_ena >= 0) { | ||
2564 | gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 1); | ||
2565 | msleep(5); | ||
2566 | } | ||
2567 | |||
2568 | ret = snd_soc_read(codec, WM8996_SOFTWARE_RESET); | ||
2569 | if (ret < 0) { | ||
2570 | dev_err(codec->dev, "Failed to read ID register: %d\n", ret); | ||
2571 | goto err_enable; | ||
2572 | } | ||
2573 | if (ret != 0x8915) { | ||
2574 | dev_err(codec->dev, "Device is not a WM8996, ID %x\n", ret); | ||
2575 | ret = -EINVAL; | ||
2576 | goto err_enable; | ||
2577 | } | ||
2578 | |||
2579 | ret = snd_soc_read(codec, WM8996_CHIP_REVISION); | ||
2580 | if (ret < 0) { | ||
2581 | dev_err(codec->dev, "Failed to read device revision: %d\n", | ||
2582 | ret); | ||
2583 | goto err_enable; | ||
2584 | } | ||
2585 | |||
2586 | dev_info(codec->dev, "revision %c\n", | ||
2587 | (ret & WM8996_CHIP_REV_MASK) + 'A'); | ||
2588 | |||
2589 | if (wm8996->pdata.ldo_ena >= 0) { | ||
2590 | gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0); | ||
2591 | } else { | ||
2592 | ret = wm8996_reset(codec); | ||
2593 | if (ret < 0) { | ||
2594 | dev_err(codec->dev, "Failed to issue reset\n"); | ||
2595 | goto err_enable; | ||
2596 | } | ||
2597 | } | ||
2598 | |||
2599 | codec->cache_only = true; | ||
2600 | |||
2601 | /* Apply platform data settings */ | ||
2602 | snd_soc_update_bits(codec, WM8996_LINE_INPUT_CONTROL, | ||
2603 | WM8996_INL_MODE_MASK | WM8996_INR_MODE_MASK, | ||
2604 | wm8996->pdata.inl_mode << WM8996_INL_MODE_SHIFT | | ||
2605 | wm8996->pdata.inr_mode); | ||
2606 | |||
2607 | for (i = 0; i < ARRAY_SIZE(wm8996->pdata.gpio_default); i++) { | ||
2608 | if (!wm8996->pdata.gpio_default[i]) | ||
2609 | continue; | ||
2610 | |||
2611 | snd_soc_write(codec, WM8996_GPIO_1 + i, | ||
2612 | wm8996->pdata.gpio_default[i] & 0xffff); | ||
2613 | } | ||
2614 | |||
2615 | if (wm8996->pdata.spkmute_seq) | ||
2616 | snd_soc_update_bits(codec, WM8996_PDM_SPEAKER_MUTE_SEQUENCE, | ||
2617 | WM8996_SPK_MUTE_ENDIAN | | ||
2618 | WM8996_SPK_MUTE_SEQ1_MASK, | ||
2619 | wm8996->pdata.spkmute_seq); | ||
2620 | |||
2621 | snd_soc_update_bits(codec, WM8996_ACCESSORY_DETECT_MODE_2, | ||
2622 | WM8996_MICD_BIAS_SRC | WM8996_HPOUT1FB_SRC | | ||
2623 | WM8996_MICD_SRC, wm8996->pdata.micdet_def); | ||
2624 | |||
2625 | /* Latch volume update bits */ | ||
2626 | snd_soc_update_bits(codec, WM8996_LEFT_LINE_INPUT_VOLUME, | ||
2627 | WM8996_IN1_VU, WM8996_IN1_VU); | ||
2628 | snd_soc_update_bits(codec, WM8996_RIGHT_LINE_INPUT_VOLUME, | ||
2629 | WM8996_IN1_VU, WM8996_IN1_VU); | ||
2630 | |||
2631 | snd_soc_update_bits(codec, WM8996_DAC1_LEFT_VOLUME, | ||
2632 | WM8996_DAC1_VU, WM8996_DAC1_VU); | ||
2633 | snd_soc_update_bits(codec, WM8996_DAC1_RIGHT_VOLUME, | ||
2634 | WM8996_DAC1_VU, WM8996_DAC1_VU); | ||
2635 | snd_soc_update_bits(codec, WM8996_DAC2_LEFT_VOLUME, | ||
2636 | WM8996_DAC2_VU, WM8996_DAC2_VU); | ||
2637 | snd_soc_update_bits(codec, WM8996_DAC2_RIGHT_VOLUME, | ||
2638 | WM8996_DAC2_VU, WM8996_DAC2_VU); | ||
2639 | |||
2640 | snd_soc_update_bits(codec, WM8996_OUTPUT1_LEFT_VOLUME, | ||
2641 | WM8996_DAC1_VU, WM8996_DAC1_VU); | ||
2642 | snd_soc_update_bits(codec, WM8996_OUTPUT1_RIGHT_VOLUME, | ||
2643 | WM8996_DAC1_VU, WM8996_DAC1_VU); | ||
2644 | snd_soc_update_bits(codec, WM8996_OUTPUT2_LEFT_VOLUME, | ||
2645 | WM8996_DAC2_VU, WM8996_DAC2_VU); | ||
2646 | snd_soc_update_bits(codec, WM8996_OUTPUT2_RIGHT_VOLUME, | ||
2647 | WM8996_DAC2_VU, WM8996_DAC2_VU); | ||
2648 | |||
2649 | snd_soc_update_bits(codec, WM8996_DSP1_TX_LEFT_VOLUME, | ||
2650 | WM8996_DSP1TX_VU, WM8996_DSP1TX_VU); | ||
2651 | snd_soc_update_bits(codec, WM8996_DSP1_TX_RIGHT_VOLUME, | ||
2652 | WM8996_DSP1TX_VU, WM8996_DSP1TX_VU); | ||
2653 | snd_soc_update_bits(codec, WM8996_DSP2_TX_LEFT_VOLUME, | ||
2654 | WM8996_DSP2TX_VU, WM8996_DSP2TX_VU); | ||
2655 | snd_soc_update_bits(codec, WM8996_DSP2_TX_RIGHT_VOLUME, | ||
2656 | WM8996_DSP2TX_VU, WM8996_DSP2TX_VU); | ||
2657 | |||
2658 | snd_soc_update_bits(codec, WM8996_DSP1_RX_LEFT_VOLUME, | ||
2659 | WM8996_DSP1RX_VU, WM8996_DSP1RX_VU); | ||
2660 | snd_soc_update_bits(codec, WM8996_DSP1_RX_RIGHT_VOLUME, | ||
2661 | WM8996_DSP1RX_VU, WM8996_DSP1RX_VU); | ||
2662 | snd_soc_update_bits(codec, WM8996_DSP2_RX_LEFT_VOLUME, | ||
2663 | WM8996_DSP2RX_VU, WM8996_DSP2RX_VU); | ||
2664 | snd_soc_update_bits(codec, WM8996_DSP2_RX_RIGHT_VOLUME, | ||
2665 | WM8996_DSP2RX_VU, WM8996_DSP2RX_VU); | ||
2666 | |||
2667 | /* No support currently for the underclocked TDM modes and | ||
2668 | * pick a default TDM layout with each channel pair working with | ||
2669 | * slots 0 and 1. */ | ||
2670 | snd_soc_update_bits(codec, WM8996_AIF1RX_CHANNEL_0_CONFIGURATION, | ||
2671 | WM8996_AIF1RX_CHAN0_SLOTS_MASK | | ||
2672 | WM8996_AIF1RX_CHAN0_START_SLOT_MASK, | ||
2673 | 1 << WM8996_AIF1RX_CHAN0_SLOTS_SHIFT | 0); | ||
2674 | snd_soc_update_bits(codec, WM8996_AIF1RX_CHANNEL_1_CONFIGURATION, | ||
2675 | WM8996_AIF1RX_CHAN1_SLOTS_MASK | | ||
2676 | WM8996_AIF1RX_CHAN1_START_SLOT_MASK, | ||
2677 | 1 << WM8996_AIF1RX_CHAN1_SLOTS_SHIFT | 1); | ||
2678 | snd_soc_update_bits(codec, WM8996_AIF1RX_CHANNEL_2_CONFIGURATION, | ||
2679 | WM8996_AIF1RX_CHAN2_SLOTS_MASK | | ||
2680 | WM8996_AIF1RX_CHAN2_START_SLOT_MASK, | ||
2681 | 1 << WM8996_AIF1RX_CHAN2_SLOTS_SHIFT | 0); | ||
2682 | snd_soc_update_bits(codec, WM8996_AIF1RX_CHANNEL_3_CONFIGURATION, | ||
2683 | WM8996_AIF1RX_CHAN3_SLOTS_MASK | | ||
2684 | WM8996_AIF1RX_CHAN0_START_SLOT_MASK, | ||
2685 | 1 << WM8996_AIF1RX_CHAN3_SLOTS_SHIFT | 1); | ||
2686 | snd_soc_update_bits(codec, WM8996_AIF1RX_CHANNEL_4_CONFIGURATION, | ||
2687 | WM8996_AIF1RX_CHAN4_SLOTS_MASK | | ||
2688 | WM8996_AIF1RX_CHAN0_START_SLOT_MASK, | ||
2689 | 1 << WM8996_AIF1RX_CHAN4_SLOTS_SHIFT | 0); | ||
2690 | snd_soc_update_bits(codec, WM8996_AIF1RX_CHANNEL_5_CONFIGURATION, | ||
2691 | WM8996_AIF1RX_CHAN5_SLOTS_MASK | | ||
2692 | WM8996_AIF1RX_CHAN0_START_SLOT_MASK, | ||
2693 | 1 << WM8996_AIF1RX_CHAN5_SLOTS_SHIFT | 1); | ||
2694 | |||
2695 | snd_soc_update_bits(codec, WM8996_AIF2RX_CHANNEL_0_CONFIGURATION, | ||
2696 | WM8996_AIF2RX_CHAN0_SLOTS_MASK | | ||
2697 | WM8996_AIF2RX_CHAN0_START_SLOT_MASK, | ||
2698 | 1 << WM8996_AIF2RX_CHAN0_SLOTS_SHIFT | 0); | ||
2699 | snd_soc_update_bits(codec, WM8996_AIF2RX_CHANNEL_1_CONFIGURATION, | ||
2700 | WM8996_AIF2RX_CHAN1_SLOTS_MASK | | ||
2701 | WM8996_AIF2RX_CHAN1_START_SLOT_MASK, | ||
2702 | 1 << WM8996_AIF2RX_CHAN1_SLOTS_SHIFT | 1); | ||
2703 | |||
2704 | snd_soc_update_bits(codec, WM8996_AIF1TX_CHANNEL_0_CONFIGURATION, | ||
2705 | WM8996_AIF1TX_CHAN0_SLOTS_MASK | | ||
2706 | WM8996_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2707 | 1 << WM8996_AIF1TX_CHAN0_SLOTS_SHIFT | 0); | ||
2708 | snd_soc_update_bits(codec, WM8996_AIF1TX_CHANNEL_1_CONFIGURATION, | ||
2709 | WM8996_AIF1TX_CHAN1_SLOTS_MASK | | ||
2710 | WM8996_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2711 | 1 << WM8996_AIF1TX_CHAN1_SLOTS_SHIFT | 1); | ||
2712 | snd_soc_update_bits(codec, WM8996_AIF1TX_CHANNEL_2_CONFIGURATION, | ||
2713 | WM8996_AIF1TX_CHAN2_SLOTS_MASK | | ||
2714 | WM8996_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2715 | 1 << WM8996_AIF1TX_CHAN2_SLOTS_SHIFT | 0); | ||
2716 | snd_soc_update_bits(codec, WM8996_AIF1TX_CHANNEL_3_CONFIGURATION, | ||
2717 | WM8996_AIF1TX_CHAN3_SLOTS_MASK | | ||
2718 | WM8996_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2719 | 1 << WM8996_AIF1TX_CHAN3_SLOTS_SHIFT | 1); | ||
2720 | snd_soc_update_bits(codec, WM8996_AIF1TX_CHANNEL_4_CONFIGURATION, | ||
2721 | WM8996_AIF1TX_CHAN4_SLOTS_MASK | | ||
2722 | WM8996_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2723 | 1 << WM8996_AIF1TX_CHAN4_SLOTS_SHIFT | 0); | ||
2724 | snd_soc_update_bits(codec, WM8996_AIF1TX_CHANNEL_5_CONFIGURATION, | ||
2725 | WM8996_AIF1TX_CHAN5_SLOTS_MASK | | ||
2726 | WM8996_AIF1TX_CHAN0_START_SLOT_MASK, | ||
2727 | 1 << WM8996_AIF1TX_CHAN5_SLOTS_SHIFT | 1); | ||
2728 | |||
2729 | snd_soc_update_bits(codec, WM8996_AIF2TX_CHANNEL_0_CONFIGURATION, | ||
2730 | WM8996_AIF2TX_CHAN0_SLOTS_MASK | | ||
2731 | WM8996_AIF2TX_CHAN0_START_SLOT_MASK, | ||
2732 | 1 << WM8996_AIF2TX_CHAN0_SLOTS_SHIFT | 0); | ||
2733 | snd_soc_update_bits(codec, WM8996_AIF1TX_CHANNEL_1_CONFIGURATION, | ||
2734 | WM8996_AIF2TX_CHAN1_SLOTS_MASK | | ||
2735 | WM8996_AIF2TX_CHAN1_START_SLOT_MASK, | ||
2736 | 1 << WM8996_AIF1TX_CHAN1_SLOTS_SHIFT | 1); | ||
2737 | |||
2738 | if (wm8996->pdata.num_retune_mobile_cfgs) | ||
2739 | wm8996_retune_mobile_pdata(codec); | ||
2740 | else | ||
2741 | snd_soc_add_controls(codec, wm8996_eq_controls, | ||
2742 | ARRAY_SIZE(wm8996_eq_controls)); | ||
2743 | |||
2744 | /* If the TX LRCLK pins are not in LRCLK mode configure the | ||
2745 | * AIFs to source their clocks from the RX LRCLKs. | ||
2746 | */ | ||
2747 | if ((snd_soc_read(codec, WM8996_GPIO_1))) | ||
2748 | snd_soc_update_bits(codec, WM8996_AIF1_TX_LRCLK_2, | ||
2749 | WM8996_AIF1TX_LRCLK_MODE, | ||
2750 | WM8996_AIF1TX_LRCLK_MODE); | ||
2751 | |||
2752 | if ((snd_soc_read(codec, WM8996_GPIO_2))) | ||
2753 | snd_soc_update_bits(codec, WM8996_AIF2_TX_LRCLK_2, | ||
2754 | WM8996_AIF2TX_LRCLK_MODE, | ||
2755 | WM8996_AIF2TX_LRCLK_MODE); | ||
2756 | |||
2757 | regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies); | ||
2758 | |||
2759 | wm8996_init_gpio(codec); | ||
2760 | |||
2761 | if (i2c->irq) { | ||
2762 | if (wm8996->pdata.irq_flags) | ||
2763 | irq_flags = wm8996->pdata.irq_flags; | ||
2764 | else | ||
2765 | irq_flags = IRQF_TRIGGER_LOW; | ||
2766 | |||
2767 | irq_flags |= IRQF_ONESHOT; | ||
2768 | |||
2769 | if (irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) | ||
2770 | ret = request_threaded_irq(i2c->irq, NULL, | ||
2771 | wm8996_edge_irq, | ||
2772 | irq_flags, "wm8996", codec); | ||
2773 | else | ||
2774 | ret = request_threaded_irq(i2c->irq, NULL, wm8996_irq, | ||
2775 | irq_flags, "wm8996", codec); | ||
2776 | |||
2777 | if (ret == 0) { | ||
2778 | /* Unmask the interrupt */ | ||
2779 | snd_soc_update_bits(codec, WM8996_INTERRUPT_CONTROL, | ||
2780 | WM8996_IM_IRQ, 0); | ||
2781 | |||
2782 | /* Enable error reporting and DC servo status */ | ||
2783 | snd_soc_update_bits(codec, | ||
2784 | WM8996_INTERRUPT_STATUS_2_MASK, | ||
2785 | WM8996_IM_DCS_DONE_23_EINT | | ||
2786 | WM8996_IM_DCS_DONE_01_EINT | | ||
2787 | WM8996_IM_FLL_LOCK_EINT | | ||
2788 | WM8996_IM_FIFOS_ERR_EINT, | ||
2789 | 0); | ||
2790 | } else { | ||
2791 | dev_err(codec->dev, "Failed to request IRQ: %d\n", | ||
2792 | ret); | ||
2793 | } | ||
2794 | } | ||
2795 | |||
2796 | return 0; | ||
2797 | |||
2798 | err_enable: | ||
2799 | if (wm8996->pdata.ldo_ena >= 0) | ||
2800 | gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0); | ||
2801 | |||
2802 | regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies); | ||
2803 | err_get: | ||
2804 | regulator_bulk_free(ARRAY_SIZE(wm8996->supplies), wm8996->supplies); | ||
2805 | err: | ||
2806 | return ret; | ||
2807 | } | ||
2808 | |||
2809 | static int wm8996_remove(struct snd_soc_codec *codec) | ||
2810 | { | ||
2811 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); | ||
2812 | struct i2c_client *i2c = to_i2c_client(codec->dev); | ||
2813 | int i; | ||
2814 | |||
2815 | snd_soc_update_bits(codec, WM8996_INTERRUPT_CONTROL, | ||
2816 | WM8996_IM_IRQ, WM8996_IM_IRQ); | ||
2817 | |||
2818 | if (i2c->irq) | ||
2819 | free_irq(i2c->irq, codec); | ||
2820 | |||
2821 | wm8996_free_gpio(codec); | ||
2822 | |||
2823 | for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++) | ||
2824 | regulator_unregister_notifier(wm8996->supplies[i].consumer, | ||
2825 | &wm8996->disable_nb[i]); | ||
2826 | regulator_bulk_free(ARRAY_SIZE(wm8996->supplies), wm8996->supplies); | ||
2827 | |||
2828 | return 0; | ||
2829 | } | ||
2830 | |||
2831 | static struct snd_soc_codec_driver soc_codec_dev_wm8996 = { | ||
2832 | .probe = wm8996_probe, | ||
2833 | .remove = wm8996_remove, | ||
2834 | .set_bias_level = wm8996_set_bias_level, | ||
2835 | .seq_notifier = wm8996_seq_notifier, | ||
2836 | .reg_cache_size = WM8996_MAX_REGISTER + 1, | ||
2837 | .reg_word_size = sizeof(u16), | ||
2838 | .reg_cache_default = wm8996_reg, | ||
2839 | .volatile_register = wm8996_volatile_register, | ||
2840 | .readable_register = wm8996_readable_register, | ||
2841 | .compress_type = SND_SOC_RBTREE_COMPRESSION, | ||
2842 | .controls = wm8996_snd_controls, | ||
2843 | .num_controls = ARRAY_SIZE(wm8996_snd_controls), | ||
2844 | .dapm_widgets = wm8996_dapm_widgets, | ||
2845 | .num_dapm_widgets = ARRAY_SIZE(wm8996_dapm_widgets), | ||
2846 | .dapm_routes = wm8996_dapm_routes, | ||
2847 | .num_dapm_routes = ARRAY_SIZE(wm8996_dapm_routes), | ||
2848 | .set_pll = wm8996_set_fll, | ||
2849 | }; | ||
2850 | |||
2851 | #define WM8996_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\ | ||
2852 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000) | ||
2853 | #define WM8996_FORMATS (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |\ | ||
2854 | SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE |\ | ||
2855 | SNDRV_PCM_FMTBIT_S32_LE) | ||
2856 | |||
2857 | static struct snd_soc_dai_ops wm8996_dai_ops = { | ||
2858 | .set_fmt = wm8996_set_fmt, | ||
2859 | .hw_params = wm8996_hw_params, | ||
2860 | .set_sysclk = wm8996_set_sysclk, | ||
2861 | }; | ||
2862 | |||
2863 | static struct snd_soc_dai_driver wm8996_dai[] = { | ||
2864 | { | ||
2865 | .name = "wm8996-aif1", | ||
2866 | .playback = { | ||
2867 | .stream_name = "AIF1 Playback", | ||
2868 | .channels_min = 1, | ||
2869 | .channels_max = 6, | ||
2870 | .rates = WM8996_RATES, | ||
2871 | .formats = WM8996_FORMATS, | ||
2872 | }, | ||
2873 | .capture = { | ||
2874 | .stream_name = "AIF1 Capture", | ||
2875 | .channels_min = 1, | ||
2876 | .channels_max = 6, | ||
2877 | .rates = WM8996_RATES, | ||
2878 | .formats = WM8996_FORMATS, | ||
2879 | }, | ||
2880 | .ops = &wm8996_dai_ops, | ||
2881 | }, | ||
2882 | { | ||
2883 | .name = "wm8996-aif2", | ||
2884 | .playback = { | ||
2885 | .stream_name = "AIF2 Playback", | ||
2886 | .channels_min = 1, | ||
2887 | .channels_max = 2, | ||
2888 | .rates = WM8996_RATES, | ||
2889 | .formats = WM8996_FORMATS, | ||
2890 | }, | ||
2891 | .capture = { | ||
2892 | .stream_name = "AIF2 Capture", | ||
2893 | .channels_min = 1, | ||
2894 | .channels_max = 2, | ||
2895 | .rates = WM8996_RATES, | ||
2896 | .formats = WM8996_FORMATS, | ||
2897 | }, | ||
2898 | .ops = &wm8996_dai_ops, | ||
2899 | }, | ||
2900 | }; | ||
2901 | |||
2902 | static __devinit int wm8996_i2c_probe(struct i2c_client *i2c, | ||
2903 | const struct i2c_device_id *id) | ||
2904 | { | ||
2905 | struct wm8996_priv *wm8996; | ||
2906 | int ret; | ||
2907 | |||
2908 | wm8996 = kzalloc(sizeof(struct wm8996_priv), GFP_KERNEL); | ||
2909 | if (wm8996 == NULL) | ||
2910 | return -ENOMEM; | ||
2911 | |||
2912 | i2c_set_clientdata(i2c, wm8996); | ||
2913 | |||
2914 | if (dev_get_platdata(&i2c->dev)) | ||
2915 | memcpy(&wm8996->pdata, dev_get_platdata(&i2c->dev), | ||
2916 | sizeof(wm8996->pdata)); | ||
2917 | |||
2918 | if (wm8996->pdata.ldo_ena > 0) { | ||
2919 | ret = gpio_request_one(wm8996->pdata.ldo_ena, | ||
2920 | GPIOF_OUT_INIT_LOW, "WM8996 ENA"); | ||
2921 | if (ret < 0) { | ||
2922 | dev_err(&i2c->dev, "Failed to request GPIO %d: %d\n", | ||
2923 | wm8996->pdata.ldo_ena, ret); | ||
2924 | goto err; | ||
2925 | } | ||
2926 | } | ||
2927 | |||
2928 | ret = snd_soc_register_codec(&i2c->dev, | ||
2929 | &soc_codec_dev_wm8996, wm8996_dai, | ||
2930 | ARRAY_SIZE(wm8996_dai)); | ||
2931 | if (ret < 0) | ||
2932 | goto err_gpio; | ||
2933 | |||
2934 | return ret; | ||
2935 | |||
2936 | err_gpio: | ||
2937 | if (wm8996->pdata.ldo_ena > 0) | ||
2938 | gpio_free(wm8996->pdata.ldo_ena); | ||
2939 | err: | ||
2940 | kfree(wm8996); | ||
2941 | |||
2942 | return ret; | ||
2943 | } | ||
2944 | |||
2945 | static __devexit int wm8996_i2c_remove(struct i2c_client *client) | ||
2946 | { | ||
2947 | struct wm8996_priv *wm8996 = i2c_get_clientdata(client); | ||
2948 | |||
2949 | snd_soc_unregister_codec(&client->dev); | ||
2950 | if (wm8996->pdata.ldo_ena > 0) | ||
2951 | gpio_free(wm8996->pdata.ldo_ena); | ||
2952 | kfree(i2c_get_clientdata(client)); | ||
2953 | return 0; | ||
2954 | } | ||
2955 | |||
2956 | static const struct i2c_device_id wm8996_i2c_id[] = { | ||
2957 | { "wm8996", 0 }, | ||
2958 | { } | ||
2959 | }; | ||
2960 | MODULE_DEVICE_TABLE(i2c, wm8996_i2c_id); | ||
2961 | |||
2962 | static struct i2c_driver wm8996_i2c_driver = { | ||
2963 | .driver = { | ||
2964 | .name = "wm8996", | ||
2965 | .owner = THIS_MODULE, | ||
2966 | }, | ||
2967 | .probe = wm8996_i2c_probe, | ||
2968 | .remove = __devexit_p(wm8996_i2c_remove), | ||
2969 | .id_table = wm8996_i2c_id, | ||
2970 | }; | ||
2971 | |||
2972 | static int __init wm8996_modinit(void) | ||
2973 | { | ||
2974 | int ret; | ||
2975 | |||
2976 | ret = i2c_add_driver(&wm8996_i2c_driver); | ||
2977 | if (ret != 0) { | ||
2978 | printk(KERN_ERR "Failed to register WM8996 I2C driver: %d\n", | ||
2979 | ret); | ||
2980 | } | ||
2981 | |||
2982 | return ret; | ||
2983 | } | ||
2984 | module_init(wm8996_modinit); | ||
2985 | |||
2986 | static void __exit wm8996_exit(void) | ||
2987 | { | ||
2988 | i2c_del_driver(&wm8996_i2c_driver); | ||
2989 | } | ||
2990 | module_exit(wm8996_exit); | ||
2991 | |||
2992 | MODULE_DESCRIPTION("ASoC WM8996 driver"); | ||
2993 | MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); | ||
2994 | MODULE_LICENSE("GPL"); | ||
diff --git a/sound/soc/codecs/wm8996.h b/sound/soc/codecs/wm8996.h new file mode 100644 index 000000000000..0fde643194ce --- /dev/null +++ b/sound/soc/codecs/wm8996.h | |||
@@ -0,0 +1,3717 @@ | |||
1 | /* | ||
2 | * wm8996.h - WM8996 audio codec interface | ||
3 | * | ||
4 | * Copyright 2011 Wolfson Microelectronics PLC. | ||
5 | * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef _WM8996_H | ||
14 | #define _WM8996_H | ||
15 | |||
16 | #define WM8996_SYSCLK_MCLK1 1 | ||
17 | #define WM8996_SYSCLK_MCLK2 2 | ||
18 | #define WM8996_SYSCLK_FLL 3 | ||
19 | |||
20 | #define WM8996_FLL_MCLK1 1 | ||
21 | #define WM8996_FLL_MCLK2 2 | ||
22 | #define WM8996_FLL_DACLRCLK1 3 | ||
23 | #define WM8996_FLL_BCLK1 4 | ||
24 | |||
25 | typedef void (*wm8996_polarity_fn)(struct snd_soc_codec *codec, int polarity); | ||
26 | |||
27 | int wm8996_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, | ||
28 | wm8996_polarity_fn polarity_cb); | ||
29 | |||
30 | /* | ||
31 | * Register values. | ||
32 | */ | ||
33 | #define WM8996_SOFTWARE_RESET 0x00 | ||
34 | #define WM8996_POWER_MANAGEMENT_1 0x01 | ||
35 | #define WM8996_POWER_MANAGEMENT_2 0x02 | ||
36 | #define WM8996_POWER_MANAGEMENT_3 0x03 | ||
37 | #define WM8996_POWER_MANAGEMENT_4 0x04 | ||
38 | #define WM8996_POWER_MANAGEMENT_5 0x05 | ||
39 | #define WM8996_POWER_MANAGEMENT_6 0x06 | ||
40 | #define WM8996_POWER_MANAGEMENT_7 0x07 | ||
41 | #define WM8996_POWER_MANAGEMENT_8 0x08 | ||
42 | #define WM8996_LEFT_LINE_INPUT_VOLUME 0x10 | ||
43 | #define WM8996_RIGHT_LINE_INPUT_VOLUME 0x11 | ||
44 | #define WM8996_LINE_INPUT_CONTROL 0x12 | ||
45 | #define WM8996_DAC1_HPOUT1_VOLUME 0x15 | ||
46 | #define WM8996_DAC2_HPOUT2_VOLUME 0x16 | ||
47 | #define WM8996_DAC1_LEFT_VOLUME 0x18 | ||
48 | #define WM8996_DAC1_RIGHT_VOLUME 0x19 | ||
49 | #define WM8996_DAC2_LEFT_VOLUME 0x1A | ||
50 | #define WM8996_DAC2_RIGHT_VOLUME 0x1B | ||
51 | #define WM8996_OUTPUT1_LEFT_VOLUME 0x1C | ||
52 | #define WM8996_OUTPUT1_RIGHT_VOLUME 0x1D | ||
53 | #define WM8996_OUTPUT2_LEFT_VOLUME 0x1E | ||
54 | #define WM8996_OUTPUT2_RIGHT_VOLUME 0x1F | ||
55 | #define WM8996_MICBIAS_1 0x20 | ||
56 | #define WM8996_MICBIAS_2 0x21 | ||
57 | #define WM8996_LDO_1 0x28 | ||
58 | #define WM8996_LDO_2 0x29 | ||
59 | #define WM8996_ACCESSORY_DETECT_MODE_1 0x30 | ||
60 | #define WM8996_ACCESSORY_DETECT_MODE_2 0x31 | ||
61 | #define WM8996_HEADPHONE_DETECT_1 0x34 | ||
62 | #define WM8996_HEADPHONE_DETECT_2 0x35 | ||
63 | #define WM8996_MIC_DETECT_1 0x38 | ||
64 | #define WM8996_MIC_DETECT_2 0x39 | ||
65 | #define WM8996_MIC_DETECT_3 0x3A | ||
66 | #define WM8996_CHARGE_PUMP_1 0x40 | ||
67 | #define WM8996_CHARGE_PUMP_2 0x41 | ||
68 | #define WM8996_DC_SERVO_1 0x50 | ||
69 | #define WM8996_DC_SERVO_2 0x51 | ||
70 | #define WM8996_DC_SERVO_3 0x52 | ||
71 | #define WM8996_DC_SERVO_5 0x54 | ||
72 | #define WM8996_DC_SERVO_6 0x55 | ||
73 | #define WM8996_DC_SERVO_7 0x56 | ||
74 | #define WM8996_DC_SERVO_READBACK_0 0x57 | ||
75 | #define WM8996_ANALOGUE_HP_1 0x60 | ||
76 | #define WM8996_ANALOGUE_HP_2 0x61 | ||
77 | #define WM8996_CHIP_REVISION 0x100 | ||
78 | #define WM8996_CONTROL_INTERFACE_1 0x101 | ||
79 | #define WM8996_WRITE_SEQUENCER_CTRL_1 0x110 | ||
80 | #define WM8996_WRITE_SEQUENCER_CTRL_2 0x111 | ||
81 | #define WM8996_AIF_CLOCKING_1 0x200 | ||
82 | #define WM8996_AIF_CLOCKING_2 0x201 | ||
83 | #define WM8996_CLOCKING_1 0x208 | ||
84 | #define WM8996_CLOCKING_2 0x209 | ||
85 | #define WM8996_AIF_RATE 0x210 | ||
86 | #define WM8996_FLL_CONTROL_1 0x220 | ||
87 | #define WM8996_FLL_CONTROL_2 0x221 | ||
88 | #define WM8996_FLL_CONTROL_3 0x222 | ||
89 | #define WM8996_FLL_CONTROL_4 0x223 | ||
90 | #define WM8996_FLL_CONTROL_5 0x224 | ||
91 | #define WM8996_FLL_CONTROL_6 0x225 | ||
92 | #define WM8996_FLL_EFS_1 0x226 | ||
93 | #define WM8996_FLL_EFS_2 0x227 | ||
94 | #define WM8996_AIF1_CONTROL 0x300 | ||
95 | #define WM8996_AIF1_BCLK 0x301 | ||
96 | #define WM8996_AIF1_TX_LRCLK_1 0x302 | ||
97 | #define WM8996_AIF1_TX_LRCLK_2 0x303 | ||
98 | #define WM8996_AIF1_RX_LRCLK_1 0x304 | ||
99 | #define WM8996_AIF1_RX_LRCLK_2 0x305 | ||
100 | #define WM8996_AIF1TX_DATA_CONFIGURATION_1 0x306 | ||
101 | #define WM8996_AIF1TX_DATA_CONFIGURATION_2 0x307 | ||
102 | #define WM8996_AIF1RX_DATA_CONFIGURATION 0x308 | ||
103 | #define WM8996_AIF1TX_CHANNEL_0_CONFIGURATION 0x309 | ||
104 | #define WM8996_AIF1TX_CHANNEL_1_CONFIGURATION 0x30A | ||
105 | #define WM8996_AIF1TX_CHANNEL_2_CONFIGURATION 0x30B | ||
106 | #define WM8996_AIF1TX_CHANNEL_3_CONFIGURATION 0x30C | ||
107 | #define WM8996_AIF1TX_CHANNEL_4_CONFIGURATION 0x30D | ||
108 | #define WM8996_AIF1TX_CHANNEL_5_CONFIGURATION 0x30E | ||
109 | #define WM8996_AIF1RX_CHANNEL_0_CONFIGURATION 0x30F | ||
110 | #define WM8996_AIF1RX_CHANNEL_1_CONFIGURATION 0x310 | ||
111 | #define WM8996_AIF1RX_CHANNEL_2_CONFIGURATION 0x311 | ||
112 | #define WM8996_AIF1RX_CHANNEL_3_CONFIGURATION 0x312 | ||
113 | #define WM8996_AIF1RX_CHANNEL_4_CONFIGURATION 0x313 | ||
114 | #define WM8996_AIF1RX_CHANNEL_5_CONFIGURATION 0x314 | ||
115 | #define WM8996_AIF1RX_MONO_CONFIGURATION 0x315 | ||
116 | #define WM8996_AIF1TX_TEST 0x31A | ||
117 | #define WM8996_AIF2_CONTROL 0x320 | ||
118 | #define WM8996_AIF2_BCLK 0x321 | ||
119 | #define WM8996_AIF2_TX_LRCLK_1 0x322 | ||
120 | #define WM8996_AIF2_TX_LRCLK_2 0x323 | ||
121 | #define WM8996_AIF2_RX_LRCLK_1 0x324 | ||
122 | #define WM8996_AIF2_RX_LRCLK_2 0x325 | ||
123 | #define WM8996_AIF2TX_DATA_CONFIGURATION_1 0x326 | ||
124 | #define WM8996_AIF2TX_DATA_CONFIGURATION_2 0x327 | ||
125 | #define WM8996_AIF2RX_DATA_CONFIGURATION 0x328 | ||
126 | #define WM8996_AIF2TX_CHANNEL_0_CONFIGURATION 0x329 | ||
127 | #define WM8996_AIF2TX_CHANNEL_1_CONFIGURATION 0x32A | ||
128 | #define WM8996_AIF2RX_CHANNEL_0_CONFIGURATION 0x32B | ||
129 | #define WM8996_AIF2RX_CHANNEL_1_CONFIGURATION 0x32C | ||
130 | #define WM8996_AIF2RX_MONO_CONFIGURATION 0x32D | ||
131 | #define WM8996_AIF2TX_TEST 0x32F | ||
132 | #define WM8996_DSP1_TX_LEFT_VOLUME 0x400 | ||
133 | #define WM8996_DSP1_TX_RIGHT_VOLUME 0x401 | ||
134 | #define WM8996_DSP1_RX_LEFT_VOLUME 0x402 | ||
135 | #define WM8996_DSP1_RX_RIGHT_VOLUME 0x403 | ||
136 | #define WM8996_DSP1_TX_FILTERS 0x410 | ||
137 | #define WM8996_DSP1_RX_FILTERS_1 0x420 | ||
138 | #define WM8996_DSP1_RX_FILTERS_2 0x421 | ||
139 | #define WM8996_DSP1_DRC_1 0x440 | ||
140 | #define WM8996_DSP1_DRC_2 0x441 | ||
141 | #define WM8996_DSP1_DRC_3 0x442 | ||
142 | #define WM8996_DSP1_DRC_4 0x443 | ||
143 | #define WM8996_DSP1_DRC_5 0x444 | ||
144 | #define WM8996_DSP1_RX_EQ_GAINS_1 0x480 | ||
145 | #define WM8996_DSP1_RX_EQ_GAINS_2 0x481 | ||
146 | #define WM8996_DSP1_RX_EQ_BAND_1_A 0x482 | ||
147 | #define WM8996_DSP1_RX_EQ_BAND_1_B 0x483 | ||
148 | #define WM8996_DSP1_RX_EQ_BAND_1_PG 0x484 | ||
149 | #define WM8996_DSP1_RX_EQ_BAND_2_A 0x485 | ||
150 | #define WM8996_DSP1_RX_EQ_BAND_2_B 0x486 | ||
151 | #define WM8996_DSP1_RX_EQ_BAND_2_C 0x487 | ||
152 | #define WM8996_DSP1_RX_EQ_BAND_2_PG 0x488 | ||
153 | #define WM8996_DSP1_RX_EQ_BAND_3_A 0x489 | ||
154 | #define WM8996_DSP1_RX_EQ_BAND_3_B 0x48A | ||
155 | #define WM8996_DSP1_RX_EQ_BAND_3_C 0x48B | ||
156 | #define WM8996_DSP1_RX_EQ_BAND_3_PG 0x48C | ||
157 | #define WM8996_DSP1_RX_EQ_BAND_4_A 0x48D | ||
158 | #define WM8996_DSP1_RX_EQ_BAND_4_B 0x48E | ||
159 | #define WM8996_DSP1_RX_EQ_BAND_4_C 0x48F | ||
160 | #define WM8996_DSP1_RX_EQ_BAND_4_PG 0x490 | ||
161 | #define WM8996_DSP1_RX_EQ_BAND_5_A 0x491 | ||
162 | #define WM8996_DSP1_RX_EQ_BAND_5_B 0x492 | ||
163 | #define WM8996_DSP1_RX_EQ_BAND_5_PG 0x493 | ||
164 | #define WM8996_DSP2_TX_LEFT_VOLUME 0x500 | ||
165 | #define WM8996_DSP2_TX_RIGHT_VOLUME 0x501 | ||
166 | #define WM8996_DSP2_RX_LEFT_VOLUME 0x502 | ||
167 | #define WM8996_DSP2_RX_RIGHT_VOLUME 0x503 | ||
168 | #define WM8996_DSP2_TX_FILTERS 0x510 | ||
169 | #define WM8996_DSP2_RX_FILTERS_1 0x520 | ||
170 | #define WM8996_DSP2_RX_FILTERS_2 0x521 | ||
171 | #define WM8996_DSP2_DRC_1 0x540 | ||
172 | #define WM8996_DSP2_DRC_2 0x541 | ||
173 | #define WM8996_DSP2_DRC_3 0x542 | ||
174 | #define WM8996_DSP2_DRC_4 0x543 | ||
175 | #define WM8996_DSP2_DRC_5 0x544 | ||
176 | #define WM8996_DSP2_RX_EQ_GAINS_1 0x580 | ||
177 | #define WM8996_DSP2_RX_EQ_GAINS_2 0x581 | ||
178 | #define WM8996_DSP2_RX_EQ_BAND_1_A 0x582 | ||
179 | #define WM8996_DSP2_RX_EQ_BAND_1_B 0x583 | ||
180 | #define WM8996_DSP2_RX_EQ_BAND_1_PG 0x584 | ||
181 | #define WM8996_DSP2_RX_EQ_BAND_2_A 0x585 | ||
182 | #define WM8996_DSP2_RX_EQ_BAND_2_B 0x586 | ||
183 | #define WM8996_DSP2_RX_EQ_BAND_2_C 0x587 | ||
184 | #define WM8996_DSP2_RX_EQ_BAND_2_PG 0x588 | ||
185 | #define WM8996_DSP2_RX_EQ_BAND_3_A 0x589 | ||
186 | #define WM8996_DSP2_RX_EQ_BAND_3_B 0x58A | ||
187 | #define WM8996_DSP2_RX_EQ_BAND_3_C 0x58B | ||
188 | #define WM8996_DSP2_RX_EQ_BAND_3_PG 0x58C | ||
189 | #define WM8996_DSP2_RX_EQ_BAND_4_A 0x58D | ||
190 | #define WM8996_DSP2_RX_EQ_BAND_4_B 0x58E | ||
191 | #define WM8996_DSP2_RX_EQ_BAND_4_C 0x58F | ||
192 | #define WM8996_DSP2_RX_EQ_BAND_4_PG 0x590 | ||
193 | #define WM8996_DSP2_RX_EQ_BAND_5_A 0x591 | ||
194 | #define WM8996_DSP2_RX_EQ_BAND_5_B 0x592 | ||
195 | #define WM8996_DSP2_RX_EQ_BAND_5_PG 0x593 | ||
196 | #define WM8996_DAC1_MIXER_VOLUMES 0x600 | ||
197 | #define WM8996_DAC1_LEFT_MIXER_ROUTING 0x601 | ||
198 | #define WM8996_DAC1_RIGHT_MIXER_ROUTING 0x602 | ||
199 | #define WM8996_DAC2_MIXER_VOLUMES 0x603 | ||
200 | #define WM8996_DAC2_LEFT_MIXER_ROUTING 0x604 | ||
201 | #define WM8996_DAC2_RIGHT_MIXER_ROUTING 0x605 | ||
202 | #define WM8996_DSP1_TX_LEFT_MIXER_ROUTING 0x606 | ||
203 | #define WM8996_DSP1_TX_RIGHT_MIXER_ROUTING 0x607 | ||
204 | #define WM8996_DSP2_TX_LEFT_MIXER_ROUTING 0x608 | ||
205 | #define WM8996_DSP2_TX_RIGHT_MIXER_ROUTING 0x609 | ||
206 | #define WM8996_DSP_TX_MIXER_SELECT 0x60A | ||
207 | #define WM8996_DAC_SOFTMUTE 0x610 | ||
208 | #define WM8996_OVERSAMPLING 0x620 | ||
209 | #define WM8996_SIDETONE 0x621 | ||
210 | #define WM8996_GPIO_1 0x700 | ||
211 | #define WM8996_GPIO_2 0x701 | ||
212 | #define WM8996_GPIO_3 0x702 | ||
213 | #define WM8996_GPIO_4 0x703 | ||
214 | #define WM8996_GPIO_5 0x704 | ||
215 | #define WM8996_PULL_CONTROL_1 0x720 | ||
216 | #define WM8996_PULL_CONTROL_2 0x721 | ||
217 | #define WM8996_INTERRUPT_STATUS_1 0x730 | ||
218 | #define WM8996_INTERRUPT_STATUS_2 0x731 | ||
219 | #define WM8996_INTERRUPT_RAW_STATUS_2 0x732 | ||
220 | #define WM8996_INTERRUPT_STATUS_1_MASK 0x738 | ||
221 | #define WM8996_INTERRUPT_STATUS_2_MASK 0x739 | ||
222 | #define WM8996_INTERRUPT_CONTROL 0x740 | ||
223 | #define WM8996_LEFT_PDM_SPEAKER 0x800 | ||
224 | #define WM8996_RIGHT_PDM_SPEAKER 0x801 | ||
225 | #define WM8996_PDM_SPEAKER_MUTE_SEQUENCE 0x802 | ||
226 | #define WM8996_PDM_SPEAKER_VOLUME 0x803 | ||
227 | #define WM8996_WRITE_SEQUENCER_0 0x3000 | ||
228 | #define WM8996_WRITE_SEQUENCER_1 0x3001 | ||
229 | #define WM8996_WRITE_SEQUENCER_2 0x3002 | ||
230 | #define WM8996_WRITE_SEQUENCER_3 0x3003 | ||
231 | #define WM8996_WRITE_SEQUENCER_4 0x3004 | ||
232 | #define WM8996_WRITE_SEQUENCER_5 0x3005 | ||
233 | #define WM8996_WRITE_SEQUENCER_6 0x3006 | ||
234 | #define WM8996_WRITE_SEQUENCER_7 0x3007 | ||
235 | #define WM8996_WRITE_SEQUENCER_8 0x3008 | ||
236 | #define WM8996_WRITE_SEQUENCER_9 0x3009 | ||
237 | #define WM8996_WRITE_SEQUENCER_10 0x300A | ||
238 | #define WM8996_WRITE_SEQUENCER_11 0x300B | ||
239 | #define WM8996_WRITE_SEQUENCER_12 0x300C | ||
240 | #define WM8996_WRITE_SEQUENCER_13 0x300D | ||
241 | #define WM8996_WRITE_SEQUENCER_14 0x300E | ||
242 | #define WM8996_WRITE_SEQUENCER_15 0x300F | ||
243 | #define WM8996_WRITE_SEQUENCER_16 0x3010 | ||
244 | #define WM8996_WRITE_SEQUENCER_17 0x3011 | ||
245 | #define WM8996_WRITE_SEQUENCER_18 0x3012 | ||
246 | #define WM8996_WRITE_SEQUENCER_19 0x3013 | ||
247 | #define WM8996_WRITE_SEQUENCER_20 0x3014 | ||
248 | #define WM8996_WRITE_SEQUENCER_21 0x3015 | ||
249 | #define WM8996_WRITE_SEQUENCER_22 0x3016 | ||
250 | #define WM8996_WRITE_SEQUENCER_23 0x3017 | ||
251 | #define WM8996_WRITE_SEQUENCER_24 0x3018 | ||
252 | #define WM8996_WRITE_SEQUENCER_25 0x3019 | ||
253 | #define WM8996_WRITE_SEQUENCER_26 0x301A | ||
254 | #define WM8996_WRITE_SEQUENCER_27 0x301B | ||
255 | #define WM8996_WRITE_SEQUENCER_28 0x301C | ||
256 | #define WM8996_WRITE_SEQUENCER_29 0x301D | ||
257 | #define WM8996_WRITE_SEQUENCER_30 0x301E | ||
258 | #define WM8996_WRITE_SEQUENCER_31 0x301F | ||
259 | #define WM8996_WRITE_SEQUENCER_32 0x3020 | ||
260 | #define WM8996_WRITE_SEQUENCER_33 0x3021 | ||
261 | #define WM8996_WRITE_SEQUENCER_34 0x3022 | ||
262 | #define WM8996_WRITE_SEQUENCER_35 0x3023 | ||
263 | #define WM8996_WRITE_SEQUENCER_36 0x3024 | ||
264 | #define WM8996_WRITE_SEQUENCER_37 0x3025 | ||
265 | #define WM8996_WRITE_SEQUENCER_38 0x3026 | ||
266 | #define WM8996_WRITE_SEQUENCER_39 0x3027 | ||
267 | #define WM8996_WRITE_SEQUENCER_40 0x3028 | ||
268 | #define WM8996_WRITE_SEQUENCER_41 0x3029 | ||
269 | #define WM8996_WRITE_SEQUENCER_42 0x302A | ||
270 | #define WM8996_WRITE_SEQUENCER_43 0x302B | ||
271 | #define WM8996_WRITE_SEQUENCER_44 0x302C | ||
272 | #define WM8996_WRITE_SEQUENCER_45 0x302D | ||
273 | #define WM8996_WRITE_SEQUENCER_46 0x302E | ||
274 | #define WM8996_WRITE_SEQUENCER_47 0x302F | ||
275 | #define WM8996_WRITE_SEQUENCER_48 0x3030 | ||
276 | #define WM8996_WRITE_SEQUENCER_49 0x3031 | ||
277 | #define WM8996_WRITE_SEQUENCER_50 0x3032 | ||
278 | #define WM8996_WRITE_SEQUENCER_51 0x3033 | ||
279 | #define WM8996_WRITE_SEQUENCER_52 0x3034 | ||
280 | #define WM8996_WRITE_SEQUENCER_53 0x3035 | ||
281 | #define WM8996_WRITE_SEQUENCER_54 0x3036 | ||
282 | #define WM8996_WRITE_SEQUENCER_55 0x3037 | ||
283 | #define WM8996_WRITE_SEQUENCER_56 0x3038 | ||
284 | #define WM8996_WRITE_SEQUENCER_57 0x3039 | ||
285 | #define WM8996_WRITE_SEQUENCER_58 0x303A | ||
286 | #define WM8996_WRITE_SEQUENCER_59 0x303B | ||
287 | #define WM8996_WRITE_SEQUENCER_60 0x303C | ||
288 | #define WM8996_WRITE_SEQUENCER_61 0x303D | ||
289 | #define WM8996_WRITE_SEQUENCER_62 0x303E | ||
290 | #define WM8996_WRITE_SEQUENCER_63 0x303F | ||
291 | #define WM8996_WRITE_SEQUENCER_64 0x3040 | ||
292 | #define WM8996_WRITE_SEQUENCER_65 0x3041 | ||
293 | #define WM8996_WRITE_SEQUENCER_66 0x3042 | ||
294 | #define WM8996_WRITE_SEQUENCER_67 0x3043 | ||
295 | #define WM8996_WRITE_SEQUENCER_68 0x3044 | ||
296 | #define WM8996_WRITE_SEQUENCER_69 0x3045 | ||
297 | #define WM8996_WRITE_SEQUENCER_70 0x3046 | ||
298 | #define WM8996_WRITE_SEQUENCER_71 0x3047 | ||
299 | #define WM8996_WRITE_SEQUENCER_72 0x3048 | ||
300 | #define WM8996_WRITE_SEQUENCER_73 0x3049 | ||
301 | #define WM8996_WRITE_SEQUENCER_74 0x304A | ||
302 | #define WM8996_WRITE_SEQUENCER_75 0x304B | ||
303 | #define WM8996_WRITE_SEQUENCER_76 0x304C | ||
304 | #define WM8996_WRITE_SEQUENCER_77 0x304D | ||
305 | #define WM8996_WRITE_SEQUENCER_78 0x304E | ||
306 | #define WM8996_WRITE_SEQUENCER_79 0x304F | ||
307 | #define WM8996_WRITE_SEQUENCER_80 0x3050 | ||
308 | #define WM8996_WRITE_SEQUENCER_81 0x3051 | ||
309 | #define WM8996_WRITE_SEQUENCER_82 0x3052 | ||
310 | #define WM8996_WRITE_SEQUENCER_83 0x3053 | ||
311 | #define WM8996_WRITE_SEQUENCER_84 0x3054 | ||
312 | #define WM8996_WRITE_SEQUENCER_85 0x3055 | ||
313 | #define WM8996_WRITE_SEQUENCER_86 0x3056 | ||
314 | #define WM8996_WRITE_SEQUENCER_87 0x3057 | ||
315 | #define WM8996_WRITE_SEQUENCER_88 0x3058 | ||
316 | #define WM8996_WRITE_SEQUENCER_89 0x3059 | ||
317 | #define WM8996_WRITE_SEQUENCER_90 0x305A | ||
318 | #define WM8996_WRITE_SEQUENCER_91 0x305B | ||
319 | #define WM8996_WRITE_SEQUENCER_92 0x305C | ||
320 | #define WM8996_WRITE_SEQUENCER_93 0x305D | ||
321 | #define WM8996_WRITE_SEQUENCER_94 0x305E | ||
322 | #define WM8996_WRITE_SEQUENCER_95 0x305F | ||
323 | #define WM8996_WRITE_SEQUENCER_96 0x3060 | ||
324 | #define WM8996_WRITE_SEQUENCER_97 0x3061 | ||
325 | #define WM8996_WRITE_SEQUENCER_98 0x3062 | ||
326 | #define WM8996_WRITE_SEQUENCER_99 0x3063 | ||
327 | #define WM8996_WRITE_SEQUENCER_100 0x3064 | ||
328 | #define WM8996_WRITE_SEQUENCER_101 0x3065 | ||
329 | #define WM8996_WRITE_SEQUENCER_102 0x3066 | ||
330 | #define WM8996_WRITE_SEQUENCER_103 0x3067 | ||
331 | #define WM8996_WRITE_SEQUENCER_104 0x3068 | ||
332 | #define WM8996_WRITE_SEQUENCER_105 0x3069 | ||
333 | #define WM8996_WRITE_SEQUENCER_106 0x306A | ||
334 | #define WM8996_WRITE_SEQUENCER_107 0x306B | ||
335 | #define WM8996_WRITE_SEQUENCER_108 0x306C | ||
336 | #define WM8996_WRITE_SEQUENCER_109 0x306D | ||
337 | #define WM8996_WRITE_SEQUENCER_110 0x306E | ||
338 | #define WM8996_WRITE_SEQUENCER_111 0x306F | ||
339 | #define WM8996_WRITE_SEQUENCER_112 0x3070 | ||
340 | #define WM8996_WRITE_SEQUENCER_113 0x3071 | ||
341 | #define WM8996_WRITE_SEQUENCER_114 0x3072 | ||
342 | #define WM8996_WRITE_SEQUENCER_115 0x3073 | ||
343 | #define WM8996_WRITE_SEQUENCER_116 0x3074 | ||
344 | #define WM8996_WRITE_SEQUENCER_117 0x3075 | ||
345 | #define WM8996_WRITE_SEQUENCER_118 0x3076 | ||
346 | #define WM8996_WRITE_SEQUENCER_119 0x3077 | ||
347 | #define WM8996_WRITE_SEQUENCER_120 0x3078 | ||
348 | #define WM8996_WRITE_SEQUENCER_121 0x3079 | ||
349 | #define WM8996_WRITE_SEQUENCER_122 0x307A | ||
350 | #define WM8996_WRITE_SEQUENCER_123 0x307B | ||
351 | #define WM8996_WRITE_SEQUENCER_124 0x307C | ||
352 | #define WM8996_WRITE_SEQUENCER_125 0x307D | ||
353 | #define WM8996_WRITE_SEQUENCER_126 0x307E | ||
354 | #define WM8996_WRITE_SEQUENCER_127 0x307F | ||
355 | #define WM8996_WRITE_SEQUENCER_128 0x3080 | ||
356 | #define WM8996_WRITE_SEQUENCER_129 0x3081 | ||
357 | #define WM8996_WRITE_SEQUENCER_130 0x3082 | ||
358 | #define WM8996_WRITE_SEQUENCER_131 0x3083 | ||
359 | #define WM8996_WRITE_SEQUENCER_132 0x3084 | ||
360 | #define WM8996_WRITE_SEQUENCER_133 0x3085 | ||
361 | #define WM8996_WRITE_SEQUENCER_134 0x3086 | ||
362 | #define WM8996_WRITE_SEQUENCER_135 0x3087 | ||
363 | #define WM8996_WRITE_SEQUENCER_136 0x3088 | ||
364 | #define WM8996_WRITE_SEQUENCER_137 0x3089 | ||
365 | #define WM8996_WRITE_SEQUENCER_138 0x308A | ||
366 | #define WM8996_WRITE_SEQUENCER_139 0x308B | ||
367 | #define WM8996_WRITE_SEQUENCER_140 0x308C | ||
368 | #define WM8996_WRITE_SEQUENCER_141 0x308D | ||
369 | #define WM8996_WRITE_SEQUENCER_142 0x308E | ||
370 | #define WM8996_WRITE_SEQUENCER_143 0x308F | ||
371 | #define WM8996_WRITE_SEQUENCER_144 0x3090 | ||
372 | #define WM8996_WRITE_SEQUENCER_145 0x3091 | ||
373 | #define WM8996_WRITE_SEQUENCER_146 0x3092 | ||
374 | #define WM8996_WRITE_SEQUENCER_147 0x3093 | ||
375 | #define WM8996_WRITE_SEQUENCER_148 0x3094 | ||
376 | #define WM8996_WRITE_SEQUENCER_149 0x3095 | ||
377 | #define WM8996_WRITE_SEQUENCER_150 0x3096 | ||
378 | #define WM8996_WRITE_SEQUENCER_151 0x3097 | ||
379 | #define WM8996_WRITE_SEQUENCER_152 0x3098 | ||
380 | #define WM8996_WRITE_SEQUENCER_153 0x3099 | ||
381 | #define WM8996_WRITE_SEQUENCER_154 0x309A | ||
382 | #define WM8996_WRITE_SEQUENCER_155 0x309B | ||
383 | #define WM8996_WRITE_SEQUENCER_156 0x309C | ||
384 | #define WM8996_WRITE_SEQUENCER_157 0x309D | ||
385 | #define WM8996_WRITE_SEQUENCER_158 0x309E | ||
386 | #define WM8996_WRITE_SEQUENCER_159 0x309F | ||
387 | #define WM8996_WRITE_SEQUENCER_160 0x30A0 | ||
388 | #define WM8996_WRITE_SEQUENCER_161 0x30A1 | ||
389 | #define WM8996_WRITE_SEQUENCER_162 0x30A2 | ||
390 | #define WM8996_WRITE_SEQUENCER_163 0x30A3 | ||
391 | #define WM8996_WRITE_SEQUENCER_164 0x30A4 | ||
392 | #define WM8996_WRITE_SEQUENCER_165 0x30A5 | ||
393 | #define WM8996_WRITE_SEQUENCER_166 0x30A6 | ||
394 | #define WM8996_WRITE_SEQUENCER_167 0x30A7 | ||
395 | #define WM8996_WRITE_SEQUENCER_168 0x30A8 | ||
396 | #define WM8996_WRITE_SEQUENCER_169 0x30A9 | ||
397 | #define WM8996_WRITE_SEQUENCER_170 0x30AA | ||
398 | #define WM8996_WRITE_SEQUENCER_171 0x30AB | ||
399 | #define WM8996_WRITE_SEQUENCER_172 0x30AC | ||
400 | #define WM8996_WRITE_SEQUENCER_173 0x30AD | ||
401 | #define WM8996_WRITE_SEQUENCER_174 0x30AE | ||
402 | #define WM8996_WRITE_SEQUENCER_175 0x30AF | ||
403 | #define WM8996_WRITE_SEQUENCER_176 0x30B0 | ||
404 | #define WM8996_WRITE_SEQUENCER_177 0x30B1 | ||
405 | #define WM8996_WRITE_SEQUENCER_178 0x30B2 | ||
406 | #define WM8996_WRITE_SEQUENCER_179 0x30B3 | ||
407 | #define WM8996_WRITE_SEQUENCER_180 0x30B4 | ||
408 | #define WM8996_WRITE_SEQUENCER_181 0x30B5 | ||
409 | #define WM8996_WRITE_SEQUENCER_182 0x30B6 | ||
410 | #define WM8996_WRITE_SEQUENCER_183 0x30B7 | ||
411 | #define WM8996_WRITE_SEQUENCER_184 0x30B8 | ||
412 | #define WM8996_WRITE_SEQUENCER_185 0x30B9 | ||
413 | #define WM8996_WRITE_SEQUENCER_186 0x30BA | ||
414 | #define WM8996_WRITE_SEQUENCER_187 0x30BB | ||
415 | #define WM8996_WRITE_SEQUENCER_188 0x30BC | ||
416 | #define WM8996_WRITE_SEQUENCER_189 0x30BD | ||
417 | #define WM8996_WRITE_SEQUENCER_190 0x30BE | ||
418 | #define WM8996_WRITE_SEQUENCER_191 0x30BF | ||
419 | #define WM8996_WRITE_SEQUENCER_192 0x30C0 | ||
420 | #define WM8996_WRITE_SEQUENCER_193 0x30C1 | ||
421 | #define WM8996_WRITE_SEQUENCER_194 0x30C2 | ||
422 | #define WM8996_WRITE_SEQUENCER_195 0x30C3 | ||
423 | #define WM8996_WRITE_SEQUENCER_196 0x30C4 | ||
424 | #define WM8996_WRITE_SEQUENCER_197 0x30C5 | ||
425 | #define WM8996_WRITE_SEQUENCER_198 0x30C6 | ||
426 | #define WM8996_WRITE_SEQUENCER_199 0x30C7 | ||
427 | #define WM8996_WRITE_SEQUENCER_200 0x30C8 | ||
428 | #define WM8996_WRITE_SEQUENCER_201 0x30C9 | ||
429 | #define WM8996_WRITE_SEQUENCER_202 0x30CA | ||
430 | #define WM8996_WRITE_SEQUENCER_203 0x30CB | ||
431 | #define WM8996_WRITE_SEQUENCER_204 0x30CC | ||
432 | #define WM8996_WRITE_SEQUENCER_205 0x30CD | ||
433 | #define WM8996_WRITE_SEQUENCER_206 0x30CE | ||
434 | #define WM8996_WRITE_SEQUENCER_207 0x30CF | ||
435 | #define WM8996_WRITE_SEQUENCER_208 0x30D0 | ||
436 | #define WM8996_WRITE_SEQUENCER_209 0x30D1 | ||
437 | #define WM8996_WRITE_SEQUENCER_210 0x30D2 | ||
438 | #define WM8996_WRITE_SEQUENCER_211 0x30D3 | ||
439 | #define WM8996_WRITE_SEQUENCER_212 0x30D4 | ||
440 | #define WM8996_WRITE_SEQUENCER_213 0x30D5 | ||
441 | #define WM8996_WRITE_SEQUENCER_214 0x30D6 | ||
442 | #define WM8996_WRITE_SEQUENCER_215 0x30D7 | ||
443 | #define WM8996_WRITE_SEQUENCER_216 0x30D8 | ||
444 | #define WM8996_WRITE_SEQUENCER_217 0x30D9 | ||
445 | #define WM8996_WRITE_SEQUENCER_218 0x30DA | ||
446 | #define WM8996_WRITE_SEQUENCER_219 0x30DB | ||
447 | #define WM8996_WRITE_SEQUENCER_220 0x30DC | ||
448 | #define WM8996_WRITE_SEQUENCER_221 0x30DD | ||
449 | #define WM8996_WRITE_SEQUENCER_222 0x30DE | ||
450 | #define WM8996_WRITE_SEQUENCER_223 0x30DF | ||
451 | #define WM8996_WRITE_SEQUENCER_224 0x30E0 | ||
452 | #define WM8996_WRITE_SEQUENCER_225 0x30E1 | ||
453 | #define WM8996_WRITE_SEQUENCER_226 0x30E2 | ||
454 | #define WM8996_WRITE_SEQUENCER_227 0x30E3 | ||
455 | #define WM8996_WRITE_SEQUENCER_228 0x30E4 | ||
456 | #define WM8996_WRITE_SEQUENCER_229 0x30E5 | ||
457 | #define WM8996_WRITE_SEQUENCER_230 0x30E6 | ||
458 | #define WM8996_WRITE_SEQUENCER_231 0x30E7 | ||
459 | #define WM8996_WRITE_SEQUENCER_232 0x30E8 | ||
460 | #define WM8996_WRITE_SEQUENCER_233 0x30E9 | ||
461 | #define WM8996_WRITE_SEQUENCER_234 0x30EA | ||
462 | #define WM8996_WRITE_SEQUENCER_235 0x30EB | ||
463 | #define WM8996_WRITE_SEQUENCER_236 0x30EC | ||
464 | #define WM8996_WRITE_SEQUENCER_237 0x30ED | ||
465 | #define WM8996_WRITE_SEQUENCER_238 0x30EE | ||
466 | #define WM8996_WRITE_SEQUENCER_239 0x30EF | ||
467 | #define WM8996_WRITE_SEQUENCER_240 0x30F0 | ||
468 | #define WM8996_WRITE_SEQUENCER_241 0x30F1 | ||
469 | #define WM8996_WRITE_SEQUENCER_242 0x30F2 | ||
470 | #define WM8996_WRITE_SEQUENCER_243 0x30F3 | ||
471 | #define WM8996_WRITE_SEQUENCER_244 0x30F4 | ||
472 | #define WM8996_WRITE_SEQUENCER_245 0x30F5 | ||
473 | #define WM8996_WRITE_SEQUENCER_246 0x30F6 | ||
474 | #define WM8996_WRITE_SEQUENCER_247 0x30F7 | ||
475 | #define WM8996_WRITE_SEQUENCER_248 0x30F8 | ||
476 | #define WM8996_WRITE_SEQUENCER_249 0x30F9 | ||
477 | #define WM8996_WRITE_SEQUENCER_250 0x30FA | ||
478 | #define WM8996_WRITE_SEQUENCER_251 0x30FB | ||
479 | #define WM8996_WRITE_SEQUENCER_252 0x30FC | ||
480 | #define WM8996_WRITE_SEQUENCER_253 0x30FD | ||
481 | #define WM8996_WRITE_SEQUENCER_254 0x30FE | ||
482 | #define WM8996_WRITE_SEQUENCER_255 0x30FF | ||
483 | #define WM8996_WRITE_SEQUENCER_256 0x3100 | ||
484 | #define WM8996_WRITE_SEQUENCER_257 0x3101 | ||
485 | #define WM8996_WRITE_SEQUENCER_258 0x3102 | ||
486 | #define WM8996_WRITE_SEQUENCER_259 0x3103 | ||
487 | #define WM8996_WRITE_SEQUENCER_260 0x3104 | ||
488 | #define WM8996_WRITE_SEQUENCER_261 0x3105 | ||
489 | #define WM8996_WRITE_SEQUENCER_262 0x3106 | ||
490 | #define WM8996_WRITE_SEQUENCER_263 0x3107 | ||
491 | #define WM8996_WRITE_SEQUENCER_264 0x3108 | ||
492 | #define WM8996_WRITE_SEQUENCER_265 0x3109 | ||
493 | #define WM8996_WRITE_SEQUENCER_266 0x310A | ||
494 | #define WM8996_WRITE_SEQUENCER_267 0x310B | ||
495 | #define WM8996_WRITE_SEQUENCER_268 0x310C | ||
496 | #define WM8996_WRITE_SEQUENCER_269 0x310D | ||
497 | #define WM8996_WRITE_SEQUENCER_270 0x310E | ||
498 | #define WM8996_WRITE_SEQUENCER_271 0x310F | ||
499 | #define WM8996_WRITE_SEQUENCER_272 0x3110 | ||
500 | #define WM8996_WRITE_SEQUENCER_273 0x3111 | ||
501 | #define WM8996_WRITE_SEQUENCER_274 0x3112 | ||
502 | #define WM8996_WRITE_SEQUENCER_275 0x3113 | ||
503 | #define WM8996_WRITE_SEQUENCER_276 0x3114 | ||
504 | #define WM8996_WRITE_SEQUENCER_277 0x3115 | ||
505 | #define WM8996_WRITE_SEQUENCER_278 0x3116 | ||
506 | #define WM8996_WRITE_SEQUENCER_279 0x3117 | ||
507 | #define WM8996_WRITE_SEQUENCER_280 0x3118 | ||
508 | #define WM8996_WRITE_SEQUENCER_281 0x3119 | ||
509 | #define WM8996_WRITE_SEQUENCER_282 0x311A | ||
510 | #define WM8996_WRITE_SEQUENCER_283 0x311B | ||
511 | #define WM8996_WRITE_SEQUENCER_284 0x311C | ||
512 | #define WM8996_WRITE_SEQUENCER_285 0x311D | ||
513 | #define WM8996_WRITE_SEQUENCER_286 0x311E | ||
514 | #define WM8996_WRITE_SEQUENCER_287 0x311F | ||
515 | #define WM8996_WRITE_SEQUENCER_288 0x3120 | ||
516 | #define WM8996_WRITE_SEQUENCER_289 0x3121 | ||
517 | #define WM8996_WRITE_SEQUENCER_290 0x3122 | ||
518 | #define WM8996_WRITE_SEQUENCER_291 0x3123 | ||
519 | #define WM8996_WRITE_SEQUENCER_292 0x3124 | ||
520 | #define WM8996_WRITE_SEQUENCER_293 0x3125 | ||
521 | #define WM8996_WRITE_SEQUENCER_294 0x3126 | ||
522 | #define WM8996_WRITE_SEQUENCER_295 0x3127 | ||
523 | #define WM8996_WRITE_SEQUENCER_296 0x3128 | ||
524 | #define WM8996_WRITE_SEQUENCER_297 0x3129 | ||
525 | #define WM8996_WRITE_SEQUENCER_298 0x312A | ||
526 | #define WM8996_WRITE_SEQUENCER_299 0x312B | ||
527 | #define WM8996_WRITE_SEQUENCER_300 0x312C | ||
528 | #define WM8996_WRITE_SEQUENCER_301 0x312D | ||
529 | #define WM8996_WRITE_SEQUENCER_302 0x312E | ||
530 | #define WM8996_WRITE_SEQUENCER_303 0x312F | ||
531 | #define WM8996_WRITE_SEQUENCER_304 0x3130 | ||
532 | #define WM8996_WRITE_SEQUENCER_305 0x3131 | ||
533 | #define WM8996_WRITE_SEQUENCER_306 0x3132 | ||
534 | #define WM8996_WRITE_SEQUENCER_307 0x3133 | ||
535 | #define WM8996_WRITE_SEQUENCER_308 0x3134 | ||
536 | #define WM8996_WRITE_SEQUENCER_309 0x3135 | ||
537 | #define WM8996_WRITE_SEQUENCER_310 0x3136 | ||
538 | #define WM8996_WRITE_SEQUENCER_311 0x3137 | ||
539 | #define WM8996_WRITE_SEQUENCER_312 0x3138 | ||
540 | #define WM8996_WRITE_SEQUENCER_313 0x3139 | ||
541 | #define WM8996_WRITE_SEQUENCER_314 0x313A | ||
542 | #define WM8996_WRITE_SEQUENCER_315 0x313B | ||
543 | #define WM8996_WRITE_SEQUENCER_316 0x313C | ||
544 | #define WM8996_WRITE_SEQUENCER_317 0x313D | ||
545 | #define WM8996_WRITE_SEQUENCER_318 0x313E | ||
546 | #define WM8996_WRITE_SEQUENCER_319 0x313F | ||
547 | #define WM8996_WRITE_SEQUENCER_320 0x3140 | ||
548 | #define WM8996_WRITE_SEQUENCER_321 0x3141 | ||
549 | #define WM8996_WRITE_SEQUENCER_322 0x3142 | ||
550 | #define WM8996_WRITE_SEQUENCER_323 0x3143 | ||
551 | #define WM8996_WRITE_SEQUENCER_324 0x3144 | ||
552 | #define WM8996_WRITE_SEQUENCER_325 0x3145 | ||
553 | #define WM8996_WRITE_SEQUENCER_326 0x3146 | ||
554 | #define WM8996_WRITE_SEQUENCER_327 0x3147 | ||
555 | #define WM8996_WRITE_SEQUENCER_328 0x3148 | ||
556 | #define WM8996_WRITE_SEQUENCER_329 0x3149 | ||
557 | #define WM8996_WRITE_SEQUENCER_330 0x314A | ||
558 | #define WM8996_WRITE_SEQUENCER_331 0x314B | ||
559 | #define WM8996_WRITE_SEQUENCER_332 0x314C | ||
560 | #define WM8996_WRITE_SEQUENCER_333 0x314D | ||
561 | #define WM8996_WRITE_SEQUENCER_334 0x314E | ||
562 | #define WM8996_WRITE_SEQUENCER_335 0x314F | ||
563 | #define WM8996_WRITE_SEQUENCER_336 0x3150 | ||
564 | #define WM8996_WRITE_SEQUENCER_337 0x3151 | ||
565 | #define WM8996_WRITE_SEQUENCER_338 0x3152 | ||
566 | #define WM8996_WRITE_SEQUENCER_339 0x3153 | ||
567 | #define WM8996_WRITE_SEQUENCER_340 0x3154 | ||
568 | #define WM8996_WRITE_SEQUENCER_341 0x3155 | ||
569 | #define WM8996_WRITE_SEQUENCER_342 0x3156 | ||
570 | #define WM8996_WRITE_SEQUENCER_343 0x3157 | ||
571 | #define WM8996_WRITE_SEQUENCER_344 0x3158 | ||
572 | #define WM8996_WRITE_SEQUENCER_345 0x3159 | ||
573 | #define WM8996_WRITE_SEQUENCER_346 0x315A | ||
574 | #define WM8996_WRITE_SEQUENCER_347 0x315B | ||
575 | #define WM8996_WRITE_SEQUENCER_348 0x315C | ||
576 | #define WM8996_WRITE_SEQUENCER_349 0x315D | ||
577 | #define WM8996_WRITE_SEQUENCER_350 0x315E | ||
578 | #define WM8996_WRITE_SEQUENCER_351 0x315F | ||
579 | #define WM8996_WRITE_SEQUENCER_352 0x3160 | ||
580 | #define WM8996_WRITE_SEQUENCER_353 0x3161 | ||
581 | #define WM8996_WRITE_SEQUENCER_354 0x3162 | ||
582 | #define WM8996_WRITE_SEQUENCER_355 0x3163 | ||
583 | #define WM8996_WRITE_SEQUENCER_356 0x3164 | ||
584 | #define WM8996_WRITE_SEQUENCER_357 0x3165 | ||
585 | #define WM8996_WRITE_SEQUENCER_358 0x3166 | ||
586 | #define WM8996_WRITE_SEQUENCER_359 0x3167 | ||
587 | #define WM8996_WRITE_SEQUENCER_360 0x3168 | ||
588 | #define WM8996_WRITE_SEQUENCER_361 0x3169 | ||
589 | #define WM8996_WRITE_SEQUENCER_362 0x316A | ||
590 | #define WM8996_WRITE_SEQUENCER_363 0x316B | ||
591 | #define WM8996_WRITE_SEQUENCER_364 0x316C | ||
592 | #define WM8996_WRITE_SEQUENCER_365 0x316D | ||
593 | #define WM8996_WRITE_SEQUENCER_366 0x316E | ||
594 | #define WM8996_WRITE_SEQUENCER_367 0x316F | ||
595 | #define WM8996_WRITE_SEQUENCER_368 0x3170 | ||
596 | #define WM8996_WRITE_SEQUENCER_369 0x3171 | ||
597 | #define WM8996_WRITE_SEQUENCER_370 0x3172 | ||
598 | #define WM8996_WRITE_SEQUENCER_371 0x3173 | ||
599 | #define WM8996_WRITE_SEQUENCER_372 0x3174 | ||
600 | #define WM8996_WRITE_SEQUENCER_373 0x3175 | ||
601 | #define WM8996_WRITE_SEQUENCER_374 0x3176 | ||
602 | #define WM8996_WRITE_SEQUENCER_375 0x3177 | ||
603 | #define WM8996_WRITE_SEQUENCER_376 0x3178 | ||
604 | #define WM8996_WRITE_SEQUENCER_377 0x3179 | ||
605 | #define WM8996_WRITE_SEQUENCER_378 0x317A | ||
606 | #define WM8996_WRITE_SEQUENCER_379 0x317B | ||
607 | #define WM8996_WRITE_SEQUENCER_380 0x317C | ||
608 | #define WM8996_WRITE_SEQUENCER_381 0x317D | ||
609 | #define WM8996_WRITE_SEQUENCER_382 0x317E | ||
610 | #define WM8996_WRITE_SEQUENCER_383 0x317F | ||
611 | #define WM8996_WRITE_SEQUENCER_384 0x3180 | ||
612 | #define WM8996_WRITE_SEQUENCER_385 0x3181 | ||
613 | #define WM8996_WRITE_SEQUENCER_386 0x3182 | ||
614 | #define WM8996_WRITE_SEQUENCER_387 0x3183 | ||
615 | #define WM8996_WRITE_SEQUENCER_388 0x3184 | ||
616 | #define WM8996_WRITE_SEQUENCER_389 0x3185 | ||
617 | #define WM8996_WRITE_SEQUENCER_390 0x3186 | ||
618 | #define WM8996_WRITE_SEQUENCER_391 0x3187 | ||
619 | #define WM8996_WRITE_SEQUENCER_392 0x3188 | ||
620 | #define WM8996_WRITE_SEQUENCER_393 0x3189 | ||
621 | #define WM8996_WRITE_SEQUENCER_394 0x318A | ||
622 | #define WM8996_WRITE_SEQUENCER_395 0x318B | ||
623 | #define WM8996_WRITE_SEQUENCER_396 0x318C | ||
624 | #define WM8996_WRITE_SEQUENCER_397 0x318D | ||
625 | #define WM8996_WRITE_SEQUENCER_398 0x318E | ||
626 | #define WM8996_WRITE_SEQUENCER_399 0x318F | ||
627 | #define WM8996_WRITE_SEQUENCER_400 0x3190 | ||
628 | #define WM8996_WRITE_SEQUENCER_401 0x3191 | ||
629 | #define WM8996_WRITE_SEQUENCER_402 0x3192 | ||
630 | #define WM8996_WRITE_SEQUENCER_403 0x3193 | ||
631 | #define WM8996_WRITE_SEQUENCER_404 0x3194 | ||
632 | #define WM8996_WRITE_SEQUENCER_405 0x3195 | ||
633 | #define WM8996_WRITE_SEQUENCER_406 0x3196 | ||
634 | #define WM8996_WRITE_SEQUENCER_407 0x3197 | ||
635 | #define WM8996_WRITE_SEQUENCER_408 0x3198 | ||
636 | #define WM8996_WRITE_SEQUENCER_409 0x3199 | ||
637 | #define WM8996_WRITE_SEQUENCER_410 0x319A | ||
638 | #define WM8996_WRITE_SEQUENCER_411 0x319B | ||
639 | #define WM8996_WRITE_SEQUENCER_412 0x319C | ||
640 | #define WM8996_WRITE_SEQUENCER_413 0x319D | ||
641 | #define WM8996_WRITE_SEQUENCER_414 0x319E | ||
642 | #define WM8996_WRITE_SEQUENCER_415 0x319F | ||
643 | #define WM8996_WRITE_SEQUENCER_416 0x31A0 | ||
644 | #define WM8996_WRITE_SEQUENCER_417 0x31A1 | ||
645 | #define WM8996_WRITE_SEQUENCER_418 0x31A2 | ||
646 | #define WM8996_WRITE_SEQUENCER_419 0x31A3 | ||
647 | #define WM8996_WRITE_SEQUENCER_420 0x31A4 | ||
648 | #define WM8996_WRITE_SEQUENCER_421 0x31A5 | ||
649 | #define WM8996_WRITE_SEQUENCER_422 0x31A6 | ||
650 | #define WM8996_WRITE_SEQUENCER_423 0x31A7 | ||
651 | #define WM8996_WRITE_SEQUENCER_424 0x31A8 | ||
652 | #define WM8996_WRITE_SEQUENCER_425 0x31A9 | ||
653 | #define WM8996_WRITE_SEQUENCER_426 0x31AA | ||
654 | #define WM8996_WRITE_SEQUENCER_427 0x31AB | ||
655 | #define WM8996_WRITE_SEQUENCER_428 0x31AC | ||
656 | #define WM8996_WRITE_SEQUENCER_429 0x31AD | ||
657 | #define WM8996_WRITE_SEQUENCER_430 0x31AE | ||
658 | #define WM8996_WRITE_SEQUENCER_431 0x31AF | ||
659 | #define WM8996_WRITE_SEQUENCER_432 0x31B0 | ||
660 | #define WM8996_WRITE_SEQUENCER_433 0x31B1 | ||
661 | #define WM8996_WRITE_SEQUENCER_434 0x31B2 | ||
662 | #define WM8996_WRITE_SEQUENCER_435 0x31B3 | ||
663 | #define WM8996_WRITE_SEQUENCER_436 0x31B4 | ||
664 | #define WM8996_WRITE_SEQUENCER_437 0x31B5 | ||
665 | #define WM8996_WRITE_SEQUENCER_438 0x31B6 | ||
666 | #define WM8996_WRITE_SEQUENCER_439 0x31B7 | ||
667 | #define WM8996_WRITE_SEQUENCER_440 0x31B8 | ||
668 | #define WM8996_WRITE_SEQUENCER_441 0x31B9 | ||
669 | #define WM8996_WRITE_SEQUENCER_442 0x31BA | ||
670 | #define WM8996_WRITE_SEQUENCER_443 0x31BB | ||
671 | #define WM8996_WRITE_SEQUENCER_444 0x31BC | ||
672 | #define WM8996_WRITE_SEQUENCER_445 0x31BD | ||
673 | #define WM8996_WRITE_SEQUENCER_446 0x31BE | ||
674 | #define WM8996_WRITE_SEQUENCER_447 0x31BF | ||
675 | #define WM8996_WRITE_SEQUENCER_448 0x31C0 | ||
676 | #define WM8996_WRITE_SEQUENCER_449 0x31C1 | ||
677 | #define WM8996_WRITE_SEQUENCER_450 0x31C2 | ||
678 | #define WM8996_WRITE_SEQUENCER_451 0x31C3 | ||
679 | #define WM8996_WRITE_SEQUENCER_452 0x31C4 | ||
680 | #define WM8996_WRITE_SEQUENCER_453 0x31C5 | ||
681 | #define WM8996_WRITE_SEQUENCER_454 0x31C6 | ||
682 | #define WM8996_WRITE_SEQUENCER_455 0x31C7 | ||
683 | #define WM8996_WRITE_SEQUENCER_456 0x31C8 | ||
684 | #define WM8996_WRITE_SEQUENCER_457 0x31C9 | ||
685 | #define WM8996_WRITE_SEQUENCER_458 0x31CA | ||
686 | #define WM8996_WRITE_SEQUENCER_459 0x31CB | ||
687 | #define WM8996_WRITE_SEQUENCER_460 0x31CC | ||
688 | #define WM8996_WRITE_SEQUENCER_461 0x31CD | ||
689 | #define WM8996_WRITE_SEQUENCER_462 0x31CE | ||
690 | #define WM8996_WRITE_SEQUENCER_463 0x31CF | ||
691 | #define WM8996_WRITE_SEQUENCER_464 0x31D0 | ||
692 | #define WM8996_WRITE_SEQUENCER_465 0x31D1 | ||
693 | #define WM8996_WRITE_SEQUENCER_466 0x31D2 | ||
694 | #define WM8996_WRITE_SEQUENCER_467 0x31D3 | ||
695 | #define WM8996_WRITE_SEQUENCER_468 0x31D4 | ||
696 | #define WM8996_WRITE_SEQUENCER_469 0x31D5 | ||
697 | #define WM8996_WRITE_SEQUENCER_470 0x31D6 | ||
698 | #define WM8996_WRITE_SEQUENCER_471 0x31D7 | ||
699 | #define WM8996_WRITE_SEQUENCER_472 0x31D8 | ||
700 | #define WM8996_WRITE_SEQUENCER_473 0x31D9 | ||
701 | #define WM8996_WRITE_SEQUENCER_474 0x31DA | ||
702 | #define WM8996_WRITE_SEQUENCER_475 0x31DB | ||
703 | #define WM8996_WRITE_SEQUENCER_476 0x31DC | ||
704 | #define WM8996_WRITE_SEQUENCER_477 0x31DD | ||
705 | #define WM8996_WRITE_SEQUENCER_478 0x31DE | ||
706 | #define WM8996_WRITE_SEQUENCER_479 0x31DF | ||
707 | #define WM8996_WRITE_SEQUENCER_480 0x31E0 | ||
708 | #define WM8996_WRITE_SEQUENCER_481 0x31E1 | ||
709 | #define WM8996_WRITE_SEQUENCER_482 0x31E2 | ||
710 | #define WM8996_WRITE_SEQUENCER_483 0x31E3 | ||
711 | #define WM8996_WRITE_SEQUENCER_484 0x31E4 | ||
712 | #define WM8996_WRITE_SEQUENCER_485 0x31E5 | ||
713 | #define WM8996_WRITE_SEQUENCER_486 0x31E6 | ||
714 | #define WM8996_WRITE_SEQUENCER_487 0x31E7 | ||
715 | #define WM8996_WRITE_SEQUENCER_488 0x31E8 | ||
716 | #define WM8996_WRITE_SEQUENCER_489 0x31E9 | ||
717 | #define WM8996_WRITE_SEQUENCER_490 0x31EA | ||
718 | #define WM8996_WRITE_SEQUENCER_491 0x31EB | ||
719 | #define WM8996_WRITE_SEQUENCER_492 0x31EC | ||
720 | #define WM8996_WRITE_SEQUENCER_493 0x31ED | ||
721 | #define WM8996_WRITE_SEQUENCER_494 0x31EE | ||
722 | #define WM8996_WRITE_SEQUENCER_495 0x31EF | ||
723 | #define WM8996_WRITE_SEQUENCER_496 0x31F0 | ||
724 | #define WM8996_WRITE_SEQUENCER_497 0x31F1 | ||
725 | #define WM8996_WRITE_SEQUENCER_498 0x31F2 | ||
726 | #define WM8996_WRITE_SEQUENCER_499 0x31F3 | ||
727 | #define WM8996_WRITE_SEQUENCER_500 0x31F4 | ||
728 | #define WM8996_WRITE_SEQUENCER_501 0x31F5 | ||
729 | #define WM8996_WRITE_SEQUENCER_502 0x31F6 | ||
730 | #define WM8996_WRITE_SEQUENCER_503 0x31F7 | ||
731 | #define WM8996_WRITE_SEQUENCER_504 0x31F8 | ||
732 | #define WM8996_WRITE_SEQUENCER_505 0x31F9 | ||
733 | #define WM8996_WRITE_SEQUENCER_506 0x31FA | ||
734 | #define WM8996_WRITE_SEQUENCER_507 0x31FB | ||
735 | #define WM8996_WRITE_SEQUENCER_508 0x31FC | ||
736 | #define WM8996_WRITE_SEQUENCER_509 0x31FD | ||
737 | #define WM8996_WRITE_SEQUENCER_510 0x31FE | ||
738 | #define WM8996_WRITE_SEQUENCER_511 0x31FF | ||
739 | |||
740 | #define WM8996_REGISTER_COUNT 706 | ||
741 | #define WM8996_MAX_REGISTER 0x31FF | ||
742 | |||
743 | /* | ||
744 | * Field Definitions. | ||
745 | */ | ||
746 | |||
747 | /* | ||
748 | * R0 (0x00) - Software Reset | ||
749 | */ | ||
750 | #define WM8996_SW_RESET_MASK 0xFFFF /* SW_RESET - [15:0] */ | ||
751 | #define WM8996_SW_RESET_SHIFT 0 /* SW_RESET - [15:0] */ | ||
752 | #define WM8996_SW_RESET_WIDTH 16 /* SW_RESET - [15:0] */ | ||
753 | |||
754 | /* | ||
755 | * R1 (0x01) - Power Management (1) | ||
756 | */ | ||
757 | #define WM8996_MICB2_ENA 0x0200 /* MICB2_ENA */ | ||
758 | #define WM8996_MICB2_ENA_MASK 0x0200 /* MICB2_ENA */ | ||
759 | #define WM8996_MICB2_ENA_SHIFT 9 /* MICB2_ENA */ | ||
760 | #define WM8996_MICB2_ENA_WIDTH 1 /* MICB2_ENA */ | ||
761 | #define WM8996_MICB1_ENA 0x0100 /* MICB1_ENA */ | ||
762 | #define WM8996_MICB1_ENA_MASK 0x0100 /* MICB1_ENA */ | ||
763 | #define WM8996_MICB1_ENA_SHIFT 8 /* MICB1_ENA */ | ||
764 | #define WM8996_MICB1_ENA_WIDTH 1 /* MICB1_ENA */ | ||
765 | #define WM8996_HPOUT2L_ENA 0x0080 /* HPOUT2L_ENA */ | ||
766 | #define WM8996_HPOUT2L_ENA_MASK 0x0080 /* HPOUT2L_ENA */ | ||
767 | #define WM8996_HPOUT2L_ENA_SHIFT 7 /* HPOUT2L_ENA */ | ||
768 | #define WM8996_HPOUT2L_ENA_WIDTH 1 /* HPOUT2L_ENA */ | ||
769 | #define WM8996_HPOUT2R_ENA 0x0040 /* HPOUT2R_ENA */ | ||
770 | #define WM8996_HPOUT2R_ENA_MASK 0x0040 /* HPOUT2R_ENA */ | ||
771 | #define WM8996_HPOUT2R_ENA_SHIFT 6 /* HPOUT2R_ENA */ | ||
772 | #define WM8996_HPOUT2R_ENA_WIDTH 1 /* HPOUT2R_ENA */ | ||
773 | #define WM8996_HPOUT1L_ENA 0x0020 /* HPOUT1L_ENA */ | ||
774 | #define WM8996_HPOUT1L_ENA_MASK 0x0020 /* HPOUT1L_ENA */ | ||
775 | #define WM8996_HPOUT1L_ENA_SHIFT 5 /* HPOUT1L_ENA */ | ||
776 | #define WM8996_HPOUT1L_ENA_WIDTH 1 /* HPOUT1L_ENA */ | ||
777 | #define WM8996_HPOUT1R_ENA 0x0010 /* HPOUT1R_ENA */ | ||
778 | #define WM8996_HPOUT1R_ENA_MASK 0x0010 /* HPOUT1R_ENA */ | ||
779 | #define WM8996_HPOUT1R_ENA_SHIFT 4 /* HPOUT1R_ENA */ | ||
780 | #define WM8996_HPOUT1R_ENA_WIDTH 1 /* HPOUT1R_ENA */ | ||
781 | #define WM8996_BG_ENA 0x0001 /* BG_ENA */ | ||
782 | #define WM8996_BG_ENA_MASK 0x0001 /* BG_ENA */ | ||
783 | #define WM8996_BG_ENA_SHIFT 0 /* BG_ENA */ | ||
784 | #define WM8996_BG_ENA_WIDTH 1 /* BG_ENA */ | ||
785 | |||
786 | /* | ||
787 | * R2 (0x02) - Power Management (2) | ||
788 | */ | ||
789 | #define WM8996_OPCLK_ENA 0x0800 /* OPCLK_ENA */ | ||
790 | #define WM8996_OPCLK_ENA_MASK 0x0800 /* OPCLK_ENA */ | ||
791 | #define WM8996_OPCLK_ENA_SHIFT 11 /* OPCLK_ENA */ | ||
792 | #define WM8996_OPCLK_ENA_WIDTH 1 /* OPCLK_ENA */ | ||
793 | #define WM8996_INL_ENA 0x0020 /* INL_ENA */ | ||
794 | #define WM8996_INL_ENA_MASK 0x0020 /* INL_ENA */ | ||
795 | #define WM8996_INL_ENA_SHIFT 5 /* INL_ENA */ | ||
796 | #define WM8996_INL_ENA_WIDTH 1 /* INL_ENA */ | ||
797 | #define WM8996_INR_ENA 0x0010 /* INR_ENA */ | ||
798 | #define WM8996_INR_ENA_MASK 0x0010 /* INR_ENA */ | ||
799 | #define WM8996_INR_ENA_SHIFT 4 /* INR_ENA */ | ||
800 | #define WM8996_INR_ENA_WIDTH 1 /* INR_ENA */ | ||
801 | #define WM8996_LDO2_ENA 0x0002 /* LDO2_ENA */ | ||
802 | #define WM8996_LDO2_ENA_MASK 0x0002 /* LDO2_ENA */ | ||
803 | #define WM8996_LDO2_ENA_SHIFT 1 /* LDO2_ENA */ | ||
804 | #define WM8996_LDO2_ENA_WIDTH 1 /* LDO2_ENA */ | ||
805 | |||
806 | /* | ||
807 | * R3 (0x03) - Power Management (3) | ||
808 | */ | ||
809 | #define WM8996_DSP2RXL_ENA 0x0800 /* DSP2RXL_ENA */ | ||
810 | #define WM8996_DSP2RXL_ENA_MASK 0x0800 /* DSP2RXL_ENA */ | ||
811 | #define WM8996_DSP2RXL_ENA_SHIFT 11 /* DSP2RXL_ENA */ | ||
812 | #define WM8996_DSP2RXL_ENA_WIDTH 1 /* DSP2RXL_ENA */ | ||
813 | #define WM8996_DSP2RXR_ENA 0x0400 /* DSP2RXR_ENA */ | ||
814 | #define WM8996_DSP2RXR_ENA_MASK 0x0400 /* DSP2RXR_ENA */ | ||
815 | #define WM8996_DSP2RXR_ENA_SHIFT 10 /* DSP2RXR_ENA */ | ||
816 | #define WM8996_DSP2RXR_ENA_WIDTH 1 /* DSP2RXR_ENA */ | ||
817 | #define WM8996_DSP1RXL_ENA 0x0200 /* DSP1RXL_ENA */ | ||
818 | #define WM8996_DSP1RXL_ENA_MASK 0x0200 /* DSP1RXL_ENA */ | ||
819 | #define WM8996_DSP1RXL_ENA_SHIFT 9 /* DSP1RXL_ENA */ | ||
820 | #define WM8996_DSP1RXL_ENA_WIDTH 1 /* DSP1RXL_ENA */ | ||
821 | #define WM8996_DSP1RXR_ENA 0x0100 /* DSP1RXR_ENA */ | ||
822 | #define WM8996_DSP1RXR_ENA_MASK 0x0100 /* DSP1RXR_ENA */ | ||
823 | #define WM8996_DSP1RXR_ENA_SHIFT 8 /* DSP1RXR_ENA */ | ||
824 | #define WM8996_DSP1RXR_ENA_WIDTH 1 /* DSP1RXR_ENA */ | ||
825 | #define WM8996_DMIC2L_ENA 0x0020 /* DMIC2L_ENA */ | ||
826 | #define WM8996_DMIC2L_ENA_MASK 0x0020 /* DMIC2L_ENA */ | ||
827 | #define WM8996_DMIC2L_ENA_SHIFT 5 /* DMIC2L_ENA */ | ||
828 | #define WM8996_DMIC2L_ENA_WIDTH 1 /* DMIC2L_ENA */ | ||
829 | #define WM8996_DMIC2R_ENA 0x0010 /* DMIC2R_ENA */ | ||
830 | #define WM8996_DMIC2R_ENA_MASK 0x0010 /* DMIC2R_ENA */ | ||
831 | #define WM8996_DMIC2R_ENA_SHIFT 4 /* DMIC2R_ENA */ | ||
832 | #define WM8996_DMIC2R_ENA_WIDTH 1 /* DMIC2R_ENA */ | ||
833 | #define WM8996_DMIC1L_ENA 0x0008 /* DMIC1L_ENA */ | ||
834 | #define WM8996_DMIC1L_ENA_MASK 0x0008 /* DMIC1L_ENA */ | ||
835 | #define WM8996_DMIC1L_ENA_SHIFT 3 /* DMIC1L_ENA */ | ||
836 | #define WM8996_DMIC1L_ENA_WIDTH 1 /* DMIC1L_ENA */ | ||
837 | #define WM8996_DMIC1R_ENA 0x0004 /* DMIC1R_ENA */ | ||
838 | #define WM8996_DMIC1R_ENA_MASK 0x0004 /* DMIC1R_ENA */ | ||
839 | #define WM8996_DMIC1R_ENA_SHIFT 2 /* DMIC1R_ENA */ | ||
840 | #define WM8996_DMIC1R_ENA_WIDTH 1 /* DMIC1R_ENA */ | ||
841 | #define WM8996_ADCL_ENA 0x0002 /* ADCL_ENA */ | ||
842 | #define WM8996_ADCL_ENA_MASK 0x0002 /* ADCL_ENA */ | ||
843 | #define WM8996_ADCL_ENA_SHIFT 1 /* ADCL_ENA */ | ||
844 | #define WM8996_ADCL_ENA_WIDTH 1 /* ADCL_ENA */ | ||
845 | #define WM8996_ADCR_ENA 0x0001 /* ADCR_ENA */ | ||
846 | #define WM8996_ADCR_ENA_MASK 0x0001 /* ADCR_ENA */ | ||
847 | #define WM8996_ADCR_ENA_SHIFT 0 /* ADCR_ENA */ | ||
848 | #define WM8996_ADCR_ENA_WIDTH 1 /* ADCR_ENA */ | ||
849 | |||
850 | /* | ||
851 | * R4 (0x04) - Power Management (4) | ||
852 | */ | ||
853 | #define WM8996_AIF2RX_CHAN1_ENA 0x0200 /* AIF2RX_CHAN1_ENA */ | ||
854 | #define WM8996_AIF2RX_CHAN1_ENA_MASK 0x0200 /* AIF2RX_CHAN1_ENA */ | ||
855 | #define WM8996_AIF2RX_CHAN1_ENA_SHIFT 9 /* AIF2RX_CHAN1_ENA */ | ||
856 | #define WM8996_AIF2RX_CHAN1_ENA_WIDTH 1 /* AIF2RX_CHAN1_ENA */ | ||
857 | #define WM8996_AIF2RX_CHAN0_ENA 0x0100 /* AIF2RX_CHAN0_ENA */ | ||
858 | #define WM8996_AIF2RX_CHAN0_ENA_MASK 0x0100 /* AIF2RX_CHAN0_ENA */ | ||
859 | #define WM8996_AIF2RX_CHAN0_ENA_SHIFT 8 /* AIF2RX_CHAN0_ENA */ | ||
860 | #define WM8996_AIF2RX_CHAN0_ENA_WIDTH 1 /* AIF2RX_CHAN0_ENA */ | ||
861 | #define WM8996_AIF1RX_CHAN5_ENA 0x0020 /* AIF1RX_CHAN5_ENA */ | ||
862 | #define WM8996_AIF1RX_CHAN5_ENA_MASK 0x0020 /* AIF1RX_CHAN5_ENA */ | ||
863 | #define WM8996_AIF1RX_CHAN5_ENA_SHIFT 5 /* AIF1RX_CHAN5_ENA */ | ||
864 | #define WM8996_AIF1RX_CHAN5_ENA_WIDTH 1 /* AIF1RX_CHAN5_ENA */ | ||
865 | #define WM8996_AIF1RX_CHAN4_ENA 0x0010 /* AIF1RX_CHAN4_ENA */ | ||
866 | #define WM8996_AIF1RX_CHAN4_ENA_MASK 0x0010 /* AIF1RX_CHAN4_ENA */ | ||
867 | #define WM8996_AIF1RX_CHAN4_ENA_SHIFT 4 /* AIF1RX_CHAN4_ENA */ | ||
868 | #define WM8996_AIF1RX_CHAN4_ENA_WIDTH 1 /* AIF1RX_CHAN4_ENA */ | ||
869 | #define WM8996_AIF1RX_CHAN3_ENA 0x0008 /* AIF1RX_CHAN3_ENA */ | ||
870 | #define WM8996_AIF1RX_CHAN3_ENA_MASK 0x0008 /* AIF1RX_CHAN3_ENA */ | ||
871 | #define WM8996_AIF1RX_CHAN3_ENA_SHIFT 3 /* AIF1RX_CHAN3_ENA */ | ||
872 | #define WM8996_AIF1RX_CHAN3_ENA_WIDTH 1 /* AIF1RX_CHAN3_ENA */ | ||
873 | #define WM8996_AIF1RX_CHAN2_ENA 0x0004 /* AIF1RX_CHAN2_ENA */ | ||
874 | #define WM8996_AIF1RX_CHAN2_ENA_MASK 0x0004 /* AIF1RX_CHAN2_ENA */ | ||
875 | #define WM8996_AIF1RX_CHAN2_ENA_SHIFT 2 /* AIF1RX_CHAN2_ENA */ | ||
876 | #define WM8996_AIF1RX_CHAN2_ENA_WIDTH 1 /* AIF1RX_CHAN2_ENA */ | ||
877 | #define WM8996_AIF1RX_CHAN1_ENA 0x0002 /* AIF1RX_CHAN1_ENA */ | ||
878 | #define WM8996_AIF1RX_CHAN1_ENA_MASK 0x0002 /* AIF1RX_CHAN1_ENA */ | ||
879 | #define WM8996_AIF1RX_CHAN1_ENA_SHIFT 1 /* AIF1RX_CHAN1_ENA */ | ||
880 | #define WM8996_AIF1RX_CHAN1_ENA_WIDTH 1 /* AIF1RX_CHAN1_ENA */ | ||
881 | #define WM8996_AIF1RX_CHAN0_ENA 0x0001 /* AIF1RX_CHAN0_ENA */ | ||
882 | #define WM8996_AIF1RX_CHAN0_ENA_MASK 0x0001 /* AIF1RX_CHAN0_ENA */ | ||
883 | #define WM8996_AIF1RX_CHAN0_ENA_SHIFT 0 /* AIF1RX_CHAN0_ENA */ | ||
884 | #define WM8996_AIF1RX_CHAN0_ENA_WIDTH 1 /* AIF1RX_CHAN0_ENA */ | ||
885 | |||
886 | /* | ||
887 | * R5 (0x05) - Power Management (5) | ||
888 | */ | ||
889 | #define WM8996_DSP2TXL_ENA 0x0800 /* DSP2TXL_ENA */ | ||
890 | #define WM8996_DSP2TXL_ENA_MASK 0x0800 /* DSP2TXL_ENA */ | ||
891 | #define WM8996_DSP2TXL_ENA_SHIFT 11 /* DSP2TXL_ENA */ | ||
892 | #define WM8996_DSP2TXL_ENA_WIDTH 1 /* DSP2TXL_ENA */ | ||
893 | #define WM8996_DSP2TXR_ENA 0x0400 /* DSP2TXR_ENA */ | ||
894 | #define WM8996_DSP2TXR_ENA_MASK 0x0400 /* DSP2TXR_ENA */ | ||
895 | #define WM8996_DSP2TXR_ENA_SHIFT 10 /* DSP2TXR_ENA */ | ||
896 | #define WM8996_DSP2TXR_ENA_WIDTH 1 /* DSP2TXR_ENA */ | ||
897 | #define WM8996_DSP1TXL_ENA 0x0200 /* DSP1TXL_ENA */ | ||
898 | #define WM8996_DSP1TXL_ENA_MASK 0x0200 /* DSP1TXL_ENA */ | ||
899 | #define WM8996_DSP1TXL_ENA_SHIFT 9 /* DSP1TXL_ENA */ | ||
900 | #define WM8996_DSP1TXL_ENA_WIDTH 1 /* DSP1TXL_ENA */ | ||
901 | #define WM8996_DSP1TXR_ENA 0x0100 /* DSP1TXR_ENA */ | ||
902 | #define WM8996_DSP1TXR_ENA_MASK 0x0100 /* DSP1TXR_ENA */ | ||
903 | #define WM8996_DSP1TXR_ENA_SHIFT 8 /* DSP1TXR_ENA */ | ||
904 | #define WM8996_DSP1TXR_ENA_WIDTH 1 /* DSP1TXR_ENA */ | ||
905 | #define WM8996_DAC2L_ENA 0x0008 /* DAC2L_ENA */ | ||
906 | #define WM8996_DAC2L_ENA_MASK 0x0008 /* DAC2L_ENA */ | ||
907 | #define WM8996_DAC2L_ENA_SHIFT 3 /* DAC2L_ENA */ | ||
908 | #define WM8996_DAC2L_ENA_WIDTH 1 /* DAC2L_ENA */ | ||
909 | #define WM8996_DAC2R_ENA 0x0004 /* DAC2R_ENA */ | ||
910 | #define WM8996_DAC2R_ENA_MASK 0x0004 /* DAC2R_ENA */ | ||
911 | #define WM8996_DAC2R_ENA_SHIFT 2 /* DAC2R_ENA */ | ||
912 | #define WM8996_DAC2R_ENA_WIDTH 1 /* DAC2R_ENA */ | ||
913 | #define WM8996_DAC1L_ENA 0x0002 /* DAC1L_ENA */ | ||
914 | #define WM8996_DAC1L_ENA_MASK 0x0002 /* DAC1L_ENA */ | ||
915 | #define WM8996_DAC1L_ENA_SHIFT 1 /* DAC1L_ENA */ | ||
916 | #define WM8996_DAC1L_ENA_WIDTH 1 /* DAC1L_ENA */ | ||
917 | #define WM8996_DAC1R_ENA 0x0001 /* DAC1R_ENA */ | ||
918 | #define WM8996_DAC1R_ENA_MASK 0x0001 /* DAC1R_ENA */ | ||
919 | #define WM8996_DAC1R_ENA_SHIFT 0 /* DAC1R_ENA */ | ||
920 | #define WM8996_DAC1R_ENA_WIDTH 1 /* DAC1R_ENA */ | ||
921 | |||
922 | /* | ||
923 | * R6 (0x06) - Power Management (6) | ||
924 | */ | ||
925 | #define WM8996_AIF2TX_CHAN1_ENA 0x0200 /* AIF2TX_CHAN1_ENA */ | ||
926 | #define WM8996_AIF2TX_CHAN1_ENA_MASK 0x0200 /* AIF2TX_CHAN1_ENA */ | ||
927 | #define WM8996_AIF2TX_CHAN1_ENA_SHIFT 9 /* AIF2TX_CHAN1_ENA */ | ||
928 | #define WM8996_AIF2TX_CHAN1_ENA_WIDTH 1 /* AIF2TX_CHAN1_ENA */ | ||
929 | #define WM8996_AIF2TX_CHAN0_ENA 0x0100 /* AIF2TX_CHAN0_ENA */ | ||
930 | #define WM8996_AIF2TX_CHAN0_ENA_MASK 0x0100 /* AIF2TX_CHAN0_ENA */ | ||
931 | #define WM8996_AIF2TX_CHAN0_ENA_SHIFT 8 /* AIF2TX_CHAN0_ENA */ | ||
932 | #define WM8996_AIF2TX_CHAN0_ENA_WIDTH 1 /* AIF2TX_CHAN0_ENA */ | ||
933 | #define WM8996_AIF1TX_CHAN5_ENA 0x0020 /* AIF1TX_CHAN5_ENA */ | ||
934 | #define WM8996_AIF1TX_CHAN5_ENA_MASK 0x0020 /* AIF1TX_CHAN5_ENA */ | ||
935 | #define WM8996_AIF1TX_CHAN5_ENA_SHIFT 5 /* AIF1TX_CHAN5_ENA */ | ||
936 | #define WM8996_AIF1TX_CHAN5_ENA_WIDTH 1 /* AIF1TX_CHAN5_ENA */ | ||
937 | #define WM8996_AIF1TX_CHAN4_ENA 0x0010 /* AIF1TX_CHAN4_ENA */ | ||
938 | #define WM8996_AIF1TX_CHAN4_ENA_MASK 0x0010 /* AIF1TX_CHAN4_ENA */ | ||
939 | #define WM8996_AIF1TX_CHAN4_ENA_SHIFT 4 /* AIF1TX_CHAN4_ENA */ | ||
940 | #define WM8996_AIF1TX_CHAN4_ENA_WIDTH 1 /* AIF1TX_CHAN4_ENA */ | ||
941 | #define WM8996_AIF1TX_CHAN3_ENA 0x0008 /* AIF1TX_CHAN3_ENA */ | ||
942 | #define WM8996_AIF1TX_CHAN3_ENA_MASK 0x0008 /* AIF1TX_CHAN3_ENA */ | ||
943 | #define WM8996_AIF1TX_CHAN3_ENA_SHIFT 3 /* AIF1TX_CHAN3_ENA */ | ||
944 | #define WM8996_AIF1TX_CHAN3_ENA_WIDTH 1 /* AIF1TX_CHAN3_ENA */ | ||
945 | #define WM8996_AIF1TX_CHAN2_ENA 0x0004 /* AIF1TX_CHAN2_ENA */ | ||
946 | #define WM8996_AIF1TX_CHAN2_ENA_MASK 0x0004 /* AIF1TX_CHAN2_ENA */ | ||
947 | #define WM8996_AIF1TX_CHAN2_ENA_SHIFT 2 /* AIF1TX_CHAN2_ENA */ | ||
948 | #define WM8996_AIF1TX_CHAN2_ENA_WIDTH 1 /* AIF1TX_CHAN2_ENA */ | ||
949 | #define WM8996_AIF1TX_CHAN1_ENA 0x0002 /* AIF1TX_CHAN1_ENA */ | ||
950 | #define WM8996_AIF1TX_CHAN1_ENA_MASK 0x0002 /* AIF1TX_CHAN1_ENA */ | ||
951 | #define WM8996_AIF1TX_CHAN1_ENA_SHIFT 1 /* AIF1TX_CHAN1_ENA */ | ||
952 | #define WM8996_AIF1TX_CHAN1_ENA_WIDTH 1 /* AIF1TX_CHAN1_ENA */ | ||
953 | #define WM8996_AIF1TX_CHAN0_ENA 0x0001 /* AIF1TX_CHAN0_ENA */ | ||
954 | #define WM8996_AIF1TX_CHAN0_ENA_MASK 0x0001 /* AIF1TX_CHAN0_ENA */ | ||
955 | #define WM8996_AIF1TX_CHAN0_ENA_SHIFT 0 /* AIF1TX_CHAN0_ENA */ | ||
956 | #define WM8996_AIF1TX_CHAN0_ENA_WIDTH 1 /* AIF1TX_CHAN0_ENA */ | ||
957 | |||
958 | /* | ||
959 | * R7 (0x07) - Power Management (7) | ||
960 | */ | ||
961 | #define WM8996_DMIC2_FN 0x0200 /* DMIC2_FN */ | ||
962 | #define WM8996_DMIC2_FN_MASK 0x0200 /* DMIC2_FN */ | ||
963 | #define WM8996_DMIC2_FN_SHIFT 9 /* DMIC2_FN */ | ||
964 | #define WM8996_DMIC2_FN_WIDTH 1 /* DMIC2_FN */ | ||
965 | #define WM8996_DMIC1_FN 0x0100 /* DMIC1_FN */ | ||
966 | #define WM8996_DMIC1_FN_MASK 0x0100 /* DMIC1_FN */ | ||
967 | #define WM8996_DMIC1_FN_SHIFT 8 /* DMIC1_FN */ | ||
968 | #define WM8996_DMIC1_FN_WIDTH 1 /* DMIC1_FN */ | ||
969 | #define WM8996_ADC_DMIC_DSP2R_ENA 0x0080 /* ADC_DMIC_DSP2R_ENA */ | ||
970 | #define WM8996_ADC_DMIC_DSP2R_ENA_MASK 0x0080 /* ADC_DMIC_DSP2R_ENA */ | ||
971 | #define WM8996_ADC_DMIC_DSP2R_ENA_SHIFT 7 /* ADC_DMIC_DSP2R_ENA */ | ||
972 | #define WM8996_ADC_DMIC_DSP2R_ENA_WIDTH 1 /* ADC_DMIC_DSP2R_ENA */ | ||
973 | #define WM8996_ADC_DMIC_DSP2L_ENA 0x0040 /* ADC_DMIC_DSP2L_ENA */ | ||
974 | #define WM8996_ADC_DMIC_DSP2L_ENA_MASK 0x0040 /* ADC_DMIC_DSP2L_ENA */ | ||
975 | #define WM8996_ADC_DMIC_DSP2L_ENA_SHIFT 6 /* ADC_DMIC_DSP2L_ENA */ | ||
976 | #define WM8996_ADC_DMIC_DSP2L_ENA_WIDTH 1 /* ADC_DMIC_DSP2L_ENA */ | ||
977 | #define WM8996_ADC_DMIC_SRC2_MASK 0x0030 /* ADC_DMIC_SRC2 - [5:4] */ | ||
978 | #define WM8996_ADC_DMIC_SRC2_SHIFT 4 /* ADC_DMIC_SRC2 - [5:4] */ | ||
979 | #define WM8996_ADC_DMIC_SRC2_WIDTH 2 /* ADC_DMIC_SRC2 - [5:4] */ | ||
980 | #define WM8996_ADC_DMIC_DSP1R_ENA 0x0008 /* ADC_DMIC_DSP1R_ENA */ | ||
981 | #define WM8996_ADC_DMIC_DSP1R_ENA_MASK 0x0008 /* ADC_DMIC_DSP1R_ENA */ | ||
982 | #define WM8996_ADC_DMIC_DSP1R_ENA_SHIFT 3 /* ADC_DMIC_DSP1R_ENA */ | ||
983 | #define WM8996_ADC_DMIC_DSP1R_ENA_WIDTH 1 /* ADC_DMIC_DSP1R_ENA */ | ||
984 | #define WM8996_ADC_DMIC_DSP1L_ENA 0x0004 /* ADC_DMIC_DSP1L_ENA */ | ||
985 | #define WM8996_ADC_DMIC_DSP1L_ENA_MASK 0x0004 /* ADC_DMIC_DSP1L_ENA */ | ||
986 | #define WM8996_ADC_DMIC_DSP1L_ENA_SHIFT 2 /* ADC_DMIC_DSP1L_ENA */ | ||
987 | #define WM8996_ADC_DMIC_DSP1L_ENA_WIDTH 1 /* ADC_DMIC_DSP1L_ENA */ | ||
988 | #define WM8996_ADC_DMIC_SRC1_MASK 0x0003 /* ADC_DMIC_SRC1 - [1:0] */ | ||
989 | #define WM8996_ADC_DMIC_SRC1_SHIFT 0 /* ADC_DMIC_SRC1 - [1:0] */ | ||
990 | #define WM8996_ADC_DMIC_SRC1_WIDTH 2 /* ADC_DMIC_SRC1 - [1:0] */ | ||
991 | |||
992 | /* | ||
993 | * R8 (0x08) - Power Management (8) | ||
994 | */ | ||
995 | #define WM8996_AIF2TX_SRC_MASK 0x00C0 /* AIF2TX_SRC - [7:6] */ | ||
996 | #define WM8996_AIF2TX_SRC_SHIFT 6 /* AIF2TX_SRC - [7:6] */ | ||
997 | #define WM8996_AIF2TX_SRC_WIDTH 2 /* AIF2TX_SRC - [7:6] */ | ||
998 | #define WM8996_DSP2RX_SRC 0x0010 /* DSP2RX_SRC */ | ||
999 | #define WM8996_DSP2RX_SRC_MASK 0x0010 /* DSP2RX_SRC */ | ||
1000 | #define WM8996_DSP2RX_SRC_SHIFT 4 /* DSP2RX_SRC */ | ||
1001 | #define WM8996_DSP2RX_SRC_WIDTH 1 /* DSP2RX_SRC */ | ||
1002 | #define WM8996_DSP1RX_SRC 0x0001 /* DSP1RX_SRC */ | ||
1003 | #define WM8996_DSP1RX_SRC_MASK 0x0001 /* DSP1RX_SRC */ | ||
1004 | #define WM8996_DSP1RX_SRC_SHIFT 0 /* DSP1RX_SRC */ | ||
1005 | #define WM8996_DSP1RX_SRC_WIDTH 1 /* DSP1RX_SRC */ | ||
1006 | |||
1007 | /* | ||
1008 | * R16 (0x10) - Left Line Input Volume | ||
1009 | */ | ||
1010 | #define WM8996_IN1_VU 0x0080 /* IN1_VU */ | ||
1011 | #define WM8996_IN1_VU_MASK 0x0080 /* IN1_VU */ | ||
1012 | #define WM8996_IN1_VU_SHIFT 7 /* IN1_VU */ | ||
1013 | #define WM8996_IN1_VU_WIDTH 1 /* IN1_VU */ | ||
1014 | #define WM8996_IN1L_ZC 0x0020 /* IN1L_ZC */ | ||
1015 | #define WM8996_IN1L_ZC_MASK 0x0020 /* IN1L_ZC */ | ||
1016 | #define WM8996_IN1L_ZC_SHIFT 5 /* IN1L_ZC */ | ||
1017 | #define WM8996_IN1L_ZC_WIDTH 1 /* IN1L_ZC */ | ||
1018 | #define WM8996_IN1L_VOL_MASK 0x001F /* IN1L_VOL - [4:0] */ | ||
1019 | #define WM8996_IN1L_VOL_SHIFT 0 /* IN1L_VOL - [4:0] */ | ||
1020 | #define WM8996_IN1L_VOL_WIDTH 5 /* IN1L_VOL - [4:0] */ | ||
1021 | |||
1022 | /* | ||
1023 | * R17 (0x11) - Right Line Input Volume | ||
1024 | */ | ||
1025 | #define WM8996_IN1_VU 0x0080 /* IN1_VU */ | ||
1026 | #define WM8996_IN1_VU_MASK 0x0080 /* IN1_VU */ | ||
1027 | #define WM8996_IN1_VU_SHIFT 7 /* IN1_VU */ | ||
1028 | #define WM8996_IN1_VU_WIDTH 1 /* IN1_VU */ | ||
1029 | #define WM8996_IN1R_ZC 0x0020 /* IN1R_ZC */ | ||
1030 | #define WM8996_IN1R_ZC_MASK 0x0020 /* IN1R_ZC */ | ||
1031 | #define WM8996_IN1R_ZC_SHIFT 5 /* IN1R_ZC */ | ||
1032 | #define WM8996_IN1R_ZC_WIDTH 1 /* IN1R_ZC */ | ||
1033 | #define WM8996_IN1R_VOL_MASK 0x001F /* IN1R_VOL - [4:0] */ | ||
1034 | #define WM8996_IN1R_VOL_SHIFT 0 /* IN1R_VOL - [4:0] */ | ||
1035 | #define WM8996_IN1R_VOL_WIDTH 5 /* IN1R_VOL - [4:0] */ | ||
1036 | |||
1037 | /* | ||
1038 | * R18 (0x12) - Line Input Control | ||
1039 | */ | ||
1040 | #define WM8996_INL_MODE_MASK 0x000C /* INL_MODE - [3:2] */ | ||
1041 | #define WM8996_INL_MODE_SHIFT 2 /* INL_MODE - [3:2] */ | ||
1042 | #define WM8996_INL_MODE_WIDTH 2 /* INL_MODE - [3:2] */ | ||
1043 | #define WM8996_INR_MODE_MASK 0x0003 /* INR_MODE - [1:0] */ | ||
1044 | #define WM8996_INR_MODE_SHIFT 0 /* INR_MODE - [1:0] */ | ||
1045 | #define WM8996_INR_MODE_WIDTH 2 /* INR_MODE - [1:0] */ | ||
1046 | |||
1047 | /* | ||
1048 | * R21 (0x15) - DAC1 HPOUT1 Volume | ||
1049 | */ | ||
1050 | #define WM8996_DAC1R_HPOUT1R_VOL_MASK 0x00F0 /* DAC1R_HPOUT1R_VOL - [7:4] */ | ||
1051 | #define WM8996_DAC1R_HPOUT1R_VOL_SHIFT 4 /* DAC1R_HPOUT1R_VOL - [7:4] */ | ||
1052 | #define WM8996_DAC1R_HPOUT1R_VOL_WIDTH 4 /* DAC1R_HPOUT1R_VOL - [7:4] */ | ||
1053 | #define WM8996_DAC1L_HPOUT1L_VOL_MASK 0x000F /* DAC1L_HPOUT1L_VOL - [3:0] */ | ||
1054 | #define WM8996_DAC1L_HPOUT1L_VOL_SHIFT 0 /* DAC1L_HPOUT1L_VOL - [3:0] */ | ||
1055 | #define WM8996_DAC1L_HPOUT1L_VOL_WIDTH 4 /* DAC1L_HPOUT1L_VOL - [3:0] */ | ||
1056 | |||
1057 | /* | ||
1058 | * R22 (0x16) - DAC2 HPOUT2 Volume | ||
1059 | */ | ||
1060 | #define WM8996_DAC2R_HPOUT2R_VOL_MASK 0x00F0 /* DAC2R_HPOUT2R_VOL - [7:4] */ | ||
1061 | #define WM8996_DAC2R_HPOUT2R_VOL_SHIFT 4 /* DAC2R_HPOUT2R_VOL - [7:4] */ | ||
1062 | #define WM8996_DAC2R_HPOUT2R_VOL_WIDTH 4 /* DAC2R_HPOUT2R_VOL - [7:4] */ | ||
1063 | #define WM8996_DAC2L_HPOUT2L_VOL_MASK 0x000F /* DAC2L_HPOUT2L_VOL - [3:0] */ | ||
1064 | #define WM8996_DAC2L_HPOUT2L_VOL_SHIFT 0 /* DAC2L_HPOUT2L_VOL - [3:0] */ | ||
1065 | #define WM8996_DAC2L_HPOUT2L_VOL_WIDTH 4 /* DAC2L_HPOUT2L_VOL - [3:0] */ | ||
1066 | |||
1067 | /* | ||
1068 | * R24 (0x18) - DAC1 Left Volume | ||
1069 | */ | ||
1070 | #define WM8996_DAC1L_MUTE 0x0200 /* DAC1L_MUTE */ | ||
1071 | #define WM8996_DAC1L_MUTE_MASK 0x0200 /* DAC1L_MUTE */ | ||
1072 | #define WM8996_DAC1L_MUTE_SHIFT 9 /* DAC1L_MUTE */ | ||
1073 | #define WM8996_DAC1L_MUTE_WIDTH 1 /* DAC1L_MUTE */ | ||
1074 | #define WM8996_DAC1_VU 0x0100 /* DAC1_VU */ | ||
1075 | #define WM8996_DAC1_VU_MASK 0x0100 /* DAC1_VU */ | ||
1076 | #define WM8996_DAC1_VU_SHIFT 8 /* DAC1_VU */ | ||
1077 | #define WM8996_DAC1_VU_WIDTH 1 /* DAC1_VU */ | ||
1078 | #define WM8996_DAC1L_VOL_MASK 0x00FF /* DAC1L_VOL - [7:0] */ | ||
1079 | #define WM8996_DAC1L_VOL_SHIFT 0 /* DAC1L_VOL - [7:0] */ | ||
1080 | #define WM8996_DAC1L_VOL_WIDTH 8 /* DAC1L_VOL - [7:0] */ | ||
1081 | |||
1082 | /* | ||
1083 | * R25 (0x19) - DAC1 Right Volume | ||
1084 | */ | ||
1085 | #define WM8996_DAC1R_MUTE 0x0200 /* DAC1R_MUTE */ | ||
1086 | #define WM8996_DAC1R_MUTE_MASK 0x0200 /* DAC1R_MUTE */ | ||
1087 | #define WM8996_DAC1R_MUTE_SHIFT 9 /* DAC1R_MUTE */ | ||
1088 | #define WM8996_DAC1R_MUTE_WIDTH 1 /* DAC1R_MUTE */ | ||
1089 | #define WM8996_DAC1_VU 0x0100 /* DAC1_VU */ | ||
1090 | #define WM8996_DAC1_VU_MASK 0x0100 /* DAC1_VU */ | ||
1091 | #define WM8996_DAC1_VU_SHIFT 8 /* DAC1_VU */ | ||
1092 | #define WM8996_DAC1_VU_WIDTH 1 /* DAC1_VU */ | ||
1093 | #define WM8996_DAC1R_VOL_MASK 0x00FF /* DAC1R_VOL - [7:0] */ | ||
1094 | #define WM8996_DAC1R_VOL_SHIFT 0 /* DAC1R_VOL - [7:0] */ | ||
1095 | #define WM8996_DAC1R_VOL_WIDTH 8 /* DAC1R_VOL - [7:0] */ | ||
1096 | |||
1097 | /* | ||
1098 | * R26 (0x1A) - DAC2 Left Volume | ||
1099 | */ | ||
1100 | #define WM8996_DAC2L_MUTE 0x0200 /* DAC2L_MUTE */ | ||
1101 | #define WM8996_DAC2L_MUTE_MASK 0x0200 /* DAC2L_MUTE */ | ||
1102 | #define WM8996_DAC2L_MUTE_SHIFT 9 /* DAC2L_MUTE */ | ||
1103 | #define WM8996_DAC2L_MUTE_WIDTH 1 /* DAC2L_MUTE */ | ||
1104 | #define WM8996_DAC2_VU 0x0100 /* DAC2_VU */ | ||
1105 | #define WM8996_DAC2_VU_MASK 0x0100 /* DAC2_VU */ | ||
1106 | #define WM8996_DAC2_VU_SHIFT 8 /* DAC2_VU */ | ||
1107 | #define WM8996_DAC2_VU_WIDTH 1 /* DAC2_VU */ | ||
1108 | #define WM8996_DAC2L_VOL_MASK 0x00FF /* DAC2L_VOL - [7:0] */ | ||
1109 | #define WM8996_DAC2L_VOL_SHIFT 0 /* DAC2L_VOL - [7:0] */ | ||
1110 | #define WM8996_DAC2L_VOL_WIDTH 8 /* DAC2L_VOL - [7:0] */ | ||
1111 | |||
1112 | /* | ||
1113 | * R27 (0x1B) - DAC2 Right Volume | ||
1114 | */ | ||
1115 | #define WM8996_DAC2R_MUTE 0x0200 /* DAC2R_MUTE */ | ||
1116 | #define WM8996_DAC2R_MUTE_MASK 0x0200 /* DAC2R_MUTE */ | ||
1117 | #define WM8996_DAC2R_MUTE_SHIFT 9 /* DAC2R_MUTE */ | ||
1118 | #define WM8996_DAC2R_MUTE_WIDTH 1 /* DAC2R_MUTE */ | ||
1119 | #define WM8996_DAC2_VU 0x0100 /* DAC2_VU */ | ||
1120 | #define WM8996_DAC2_VU_MASK 0x0100 /* DAC2_VU */ | ||
1121 | #define WM8996_DAC2_VU_SHIFT 8 /* DAC2_VU */ | ||
1122 | #define WM8996_DAC2_VU_WIDTH 1 /* DAC2_VU */ | ||
1123 | #define WM8996_DAC2R_VOL_MASK 0x00FF /* DAC2R_VOL - [7:0] */ | ||
1124 | #define WM8996_DAC2R_VOL_SHIFT 0 /* DAC2R_VOL - [7:0] */ | ||
1125 | #define WM8996_DAC2R_VOL_WIDTH 8 /* DAC2R_VOL - [7:0] */ | ||
1126 | |||
1127 | /* | ||
1128 | * R28 (0x1C) - Output1 Left Volume | ||
1129 | */ | ||
1130 | #define WM8996_DAC1_VU 0x0100 /* DAC1_VU */ | ||
1131 | #define WM8996_DAC1_VU_MASK 0x0100 /* DAC1_VU */ | ||
1132 | #define WM8996_DAC1_VU_SHIFT 8 /* DAC1_VU */ | ||
1133 | #define WM8996_DAC1_VU_WIDTH 1 /* DAC1_VU */ | ||
1134 | #define WM8996_HPOUT1L_ZC 0x0080 /* HPOUT1L_ZC */ | ||
1135 | #define WM8996_HPOUT1L_ZC_MASK 0x0080 /* HPOUT1L_ZC */ | ||
1136 | #define WM8996_HPOUT1L_ZC_SHIFT 7 /* HPOUT1L_ZC */ | ||
1137 | #define WM8996_HPOUT1L_ZC_WIDTH 1 /* HPOUT1L_ZC */ | ||
1138 | #define WM8996_HPOUT1L_VOL_MASK 0x000F /* HPOUT1L_VOL - [3:0] */ | ||
1139 | #define WM8996_HPOUT1L_VOL_SHIFT 0 /* HPOUT1L_VOL - [3:0] */ | ||
1140 | #define WM8996_HPOUT1L_VOL_WIDTH 4 /* HPOUT1L_VOL - [3:0] */ | ||
1141 | |||
1142 | /* | ||
1143 | * R29 (0x1D) - Output1 Right Volume | ||
1144 | */ | ||
1145 | #define WM8996_DAC1_VU 0x0100 /* DAC1_VU */ | ||
1146 | #define WM8996_DAC1_VU_MASK 0x0100 /* DAC1_VU */ | ||
1147 | #define WM8996_DAC1_VU_SHIFT 8 /* DAC1_VU */ | ||
1148 | #define WM8996_DAC1_VU_WIDTH 1 /* DAC1_VU */ | ||
1149 | #define WM8996_HPOUT1R_ZC 0x0080 /* HPOUT1R_ZC */ | ||
1150 | #define WM8996_HPOUT1R_ZC_MASK 0x0080 /* HPOUT1R_ZC */ | ||
1151 | #define WM8996_HPOUT1R_ZC_SHIFT 7 /* HPOUT1R_ZC */ | ||
1152 | #define WM8996_HPOUT1R_ZC_WIDTH 1 /* HPOUT1R_ZC */ | ||
1153 | #define WM8996_HPOUT1R_VOL_MASK 0x000F /* HPOUT1R_VOL - [3:0] */ | ||
1154 | #define WM8996_HPOUT1R_VOL_SHIFT 0 /* HPOUT1R_VOL - [3:0] */ | ||
1155 | #define WM8996_HPOUT1R_VOL_WIDTH 4 /* HPOUT1R_VOL - [3:0] */ | ||
1156 | |||
1157 | /* | ||
1158 | * R30 (0x1E) - Output2 Left Volume | ||
1159 | */ | ||
1160 | #define WM8996_DAC2_VU 0x0100 /* DAC2_VU */ | ||
1161 | #define WM8996_DAC2_VU_MASK 0x0100 /* DAC2_VU */ | ||
1162 | #define WM8996_DAC2_VU_SHIFT 8 /* DAC2_VU */ | ||
1163 | #define WM8996_DAC2_VU_WIDTH 1 /* DAC2_VU */ | ||
1164 | #define WM8996_HPOUT2L_ZC 0x0080 /* HPOUT2L_ZC */ | ||
1165 | #define WM8996_HPOUT2L_ZC_MASK 0x0080 /* HPOUT2L_ZC */ | ||
1166 | #define WM8996_HPOUT2L_ZC_SHIFT 7 /* HPOUT2L_ZC */ | ||
1167 | #define WM8996_HPOUT2L_ZC_WIDTH 1 /* HPOUT2L_ZC */ | ||
1168 | #define WM8996_HPOUT2L_VOL_MASK 0x000F /* HPOUT2L_VOL - [3:0] */ | ||
1169 | #define WM8996_HPOUT2L_VOL_SHIFT 0 /* HPOUT2L_VOL - [3:0] */ | ||
1170 | #define WM8996_HPOUT2L_VOL_WIDTH 4 /* HPOUT2L_VOL - [3:0] */ | ||
1171 | |||
1172 | /* | ||
1173 | * R31 (0x1F) - Output2 Right Volume | ||
1174 | */ | ||
1175 | #define WM8996_DAC2_VU 0x0100 /* DAC2_VU */ | ||
1176 | #define WM8996_DAC2_VU_MASK 0x0100 /* DAC2_VU */ | ||
1177 | #define WM8996_DAC2_VU_SHIFT 8 /* DAC2_VU */ | ||
1178 | #define WM8996_DAC2_VU_WIDTH 1 /* DAC2_VU */ | ||
1179 | #define WM8996_HPOUT2R_ZC 0x0080 /* HPOUT2R_ZC */ | ||
1180 | #define WM8996_HPOUT2R_ZC_MASK 0x0080 /* HPOUT2R_ZC */ | ||
1181 | #define WM8996_HPOUT2R_ZC_SHIFT 7 /* HPOUT2R_ZC */ | ||
1182 | #define WM8996_HPOUT2R_ZC_WIDTH 1 /* HPOUT2R_ZC */ | ||
1183 | #define WM8996_HPOUT2R_VOL_MASK 0x000F /* HPOUT2R_VOL - [3:0] */ | ||
1184 | #define WM8996_HPOUT2R_VOL_SHIFT 0 /* HPOUT2R_VOL - [3:0] */ | ||
1185 | #define WM8996_HPOUT2R_VOL_WIDTH 4 /* HPOUT2R_VOL - [3:0] */ | ||
1186 | |||
1187 | /* | ||
1188 | * R32 (0x20) - MICBIAS (1) | ||
1189 | */ | ||
1190 | #define WM8996_MICB1_RATE 0x0020 /* MICB1_RATE */ | ||
1191 | #define WM8996_MICB1_RATE_MASK 0x0020 /* MICB1_RATE */ | ||
1192 | #define WM8996_MICB1_RATE_SHIFT 5 /* MICB1_RATE */ | ||
1193 | #define WM8996_MICB1_RATE_WIDTH 1 /* MICB1_RATE */ | ||
1194 | #define WM8996_MICB1_MODE 0x0010 /* MICB1_MODE */ | ||
1195 | #define WM8996_MICB1_MODE_MASK 0x0010 /* MICB1_MODE */ | ||
1196 | #define WM8996_MICB1_MODE_SHIFT 4 /* MICB1_MODE */ | ||
1197 | #define WM8996_MICB1_MODE_WIDTH 1 /* MICB1_MODE */ | ||
1198 | #define WM8996_MICB1_LVL_MASK 0x000E /* MICB1_LVL - [3:1] */ | ||
1199 | #define WM8996_MICB1_LVL_SHIFT 1 /* MICB1_LVL - [3:1] */ | ||
1200 | #define WM8996_MICB1_LVL_WIDTH 3 /* MICB1_LVL - [3:1] */ | ||
1201 | #define WM8996_MICB1_DISCH 0x0001 /* MICB1_DISCH */ | ||
1202 | #define WM8996_MICB1_DISCH_MASK 0x0001 /* MICB1_DISCH */ | ||
1203 | #define WM8996_MICB1_DISCH_SHIFT 0 /* MICB1_DISCH */ | ||
1204 | #define WM8996_MICB1_DISCH_WIDTH 1 /* MICB1_DISCH */ | ||
1205 | |||
1206 | /* | ||
1207 | * R33 (0x21) - MICBIAS (2) | ||
1208 | */ | ||
1209 | #define WM8996_MICB2_RATE 0x0020 /* MICB2_RATE */ | ||
1210 | #define WM8996_MICB2_RATE_MASK 0x0020 /* MICB2_RATE */ | ||
1211 | #define WM8996_MICB2_RATE_SHIFT 5 /* MICB2_RATE */ | ||
1212 | #define WM8996_MICB2_RATE_WIDTH 1 /* MICB2_RATE */ | ||
1213 | #define WM8996_MICB2_MODE 0x0010 /* MICB2_MODE */ | ||
1214 | #define WM8996_MICB2_MODE_MASK 0x0010 /* MICB2_MODE */ | ||
1215 | #define WM8996_MICB2_MODE_SHIFT 4 /* MICB2_MODE */ | ||
1216 | #define WM8996_MICB2_MODE_WIDTH 1 /* MICB2_MODE */ | ||
1217 | #define WM8996_MICB2_LVL_MASK 0x000E /* MICB2_LVL - [3:1] */ | ||
1218 | #define WM8996_MICB2_LVL_SHIFT 1 /* MICB2_LVL - [3:1] */ | ||
1219 | #define WM8996_MICB2_LVL_WIDTH 3 /* MICB2_LVL - [3:1] */ | ||
1220 | #define WM8996_MICB2_DISCH 0x0001 /* MICB2_DISCH */ | ||
1221 | #define WM8996_MICB2_DISCH_MASK 0x0001 /* MICB2_DISCH */ | ||
1222 | #define WM8996_MICB2_DISCH_SHIFT 0 /* MICB2_DISCH */ | ||
1223 | #define WM8996_MICB2_DISCH_WIDTH 1 /* MICB2_DISCH */ | ||
1224 | |||
1225 | /* | ||
1226 | * R40 (0x28) - LDO 1 | ||
1227 | */ | ||
1228 | #define WM8996_LDO1_MODE 0x0020 /* LDO1_MODE */ | ||
1229 | #define WM8996_LDO1_MODE_MASK 0x0020 /* LDO1_MODE */ | ||
1230 | #define WM8996_LDO1_MODE_SHIFT 5 /* LDO1_MODE */ | ||
1231 | #define WM8996_LDO1_MODE_WIDTH 1 /* LDO1_MODE */ | ||
1232 | #define WM8996_LDO1_VSEL_MASK 0x0006 /* LDO1_VSEL - [2:1] */ | ||
1233 | #define WM8996_LDO1_VSEL_SHIFT 1 /* LDO1_VSEL - [2:1] */ | ||
1234 | #define WM8996_LDO1_VSEL_WIDTH 2 /* LDO1_VSEL - [2:1] */ | ||
1235 | #define WM8996_LDO1_DISCH 0x0001 /* LDO1_DISCH */ | ||
1236 | #define WM8996_LDO1_DISCH_MASK 0x0001 /* LDO1_DISCH */ | ||
1237 | #define WM8996_LDO1_DISCH_SHIFT 0 /* LDO1_DISCH */ | ||
1238 | #define WM8996_LDO1_DISCH_WIDTH 1 /* LDO1_DISCH */ | ||
1239 | |||
1240 | /* | ||
1241 | * R41 (0x29) - LDO 2 | ||
1242 | */ | ||
1243 | #define WM8996_LDO2_MODE 0x0020 /* LDO2_MODE */ | ||
1244 | #define WM8996_LDO2_MODE_MASK 0x0020 /* LDO2_MODE */ | ||
1245 | #define WM8996_LDO2_MODE_SHIFT 5 /* LDO2_MODE */ | ||
1246 | #define WM8996_LDO2_MODE_WIDTH 1 /* LDO2_MODE */ | ||
1247 | #define WM8996_LDO2_VSEL_MASK 0x001E /* LDO2_VSEL - [4:1] */ | ||
1248 | #define WM8996_LDO2_VSEL_SHIFT 1 /* LDO2_VSEL - [4:1] */ | ||
1249 | #define WM8996_LDO2_VSEL_WIDTH 4 /* LDO2_VSEL - [4:1] */ | ||
1250 | #define WM8996_LDO2_DISCH 0x0001 /* LDO2_DISCH */ | ||
1251 | #define WM8996_LDO2_DISCH_MASK 0x0001 /* LDO2_DISCH */ | ||
1252 | #define WM8996_LDO2_DISCH_SHIFT 0 /* LDO2_DISCH */ | ||
1253 | #define WM8996_LDO2_DISCH_WIDTH 1 /* LDO2_DISCH */ | ||
1254 | |||
1255 | /* | ||
1256 | * R48 (0x30) - Accessory Detect Mode 1 | ||
1257 | */ | ||
1258 | #define WM8996_JD_MODE_MASK 0x0003 /* JD_MODE - [1:0] */ | ||
1259 | #define WM8996_JD_MODE_SHIFT 0 /* JD_MODE - [1:0] */ | ||
1260 | #define WM8996_JD_MODE_WIDTH 2 /* JD_MODE - [1:0] */ | ||
1261 | |||
1262 | /* | ||
1263 | * R49 (0x31) - Accessory Detect Mode 2 | ||
1264 | */ | ||
1265 | #define WM8996_HPOUT1FB_SRC 0x0004 /* HPOUT1FB_SRC */ | ||
1266 | #define WM8996_HPOUT1FB_SRC_MASK 0x0004 /* HPOUT1FB_SRC */ | ||
1267 | #define WM8996_HPOUT1FB_SRC_SHIFT 2 /* HPOUT1FB_SRC */ | ||
1268 | #define WM8996_HPOUT1FB_SRC_WIDTH 1 /* HPOUT1FB_SRC */ | ||
1269 | #define WM8996_MICD_SRC 0x0002 /* MICD_SRC */ | ||
1270 | #define WM8996_MICD_SRC_MASK 0x0002 /* MICD_SRC */ | ||
1271 | #define WM8996_MICD_SRC_SHIFT 1 /* MICD_SRC */ | ||
1272 | #define WM8996_MICD_SRC_WIDTH 1 /* MICD_SRC */ | ||
1273 | #define WM8996_MICD_BIAS_SRC 0x0001 /* MICD_BIAS_SRC */ | ||
1274 | #define WM8996_MICD_BIAS_SRC_MASK 0x0001 /* MICD_BIAS_SRC */ | ||
1275 | #define WM8996_MICD_BIAS_SRC_SHIFT 0 /* MICD_BIAS_SRC */ | ||
1276 | #define WM8996_MICD_BIAS_SRC_WIDTH 1 /* MICD_BIAS_SRC */ | ||
1277 | |||
1278 | /* | ||
1279 | * R52 (0x34) - Headphone Detect 1 | ||
1280 | */ | ||
1281 | #define WM8996_HP_HOLDTIME_MASK 0x00E0 /* HP_HOLDTIME - [7:5] */ | ||
1282 | #define WM8996_HP_HOLDTIME_SHIFT 5 /* HP_HOLDTIME - [7:5] */ | ||
1283 | #define WM8996_HP_HOLDTIME_WIDTH 3 /* HP_HOLDTIME - [7:5] */ | ||
1284 | #define WM8996_HP_CLK_DIV_MASK 0x0018 /* HP_CLK_DIV - [4:3] */ | ||
1285 | #define WM8996_HP_CLK_DIV_SHIFT 3 /* HP_CLK_DIV - [4:3] */ | ||
1286 | #define WM8996_HP_CLK_DIV_WIDTH 2 /* HP_CLK_DIV - [4:3] */ | ||
1287 | #define WM8996_HP_STEP_SIZE 0x0002 /* HP_STEP_SIZE */ | ||
1288 | #define WM8996_HP_STEP_SIZE_MASK 0x0002 /* HP_STEP_SIZE */ | ||
1289 | #define WM8996_HP_STEP_SIZE_SHIFT 1 /* HP_STEP_SIZE */ | ||
1290 | #define WM8996_HP_STEP_SIZE_WIDTH 1 /* HP_STEP_SIZE */ | ||
1291 | #define WM8996_HP_POLL 0x0001 /* HP_POLL */ | ||
1292 | #define WM8996_HP_POLL_MASK 0x0001 /* HP_POLL */ | ||
1293 | #define WM8996_HP_POLL_SHIFT 0 /* HP_POLL */ | ||
1294 | #define WM8996_HP_POLL_WIDTH 1 /* HP_POLL */ | ||
1295 | |||
1296 | /* | ||
1297 | * R53 (0x35) - Headphone Detect 2 | ||
1298 | */ | ||
1299 | #define WM8996_HP_DONE 0x0080 /* HP_DONE */ | ||
1300 | #define WM8996_HP_DONE_MASK 0x0080 /* HP_DONE */ | ||
1301 | #define WM8996_HP_DONE_SHIFT 7 /* HP_DONE */ | ||
1302 | #define WM8996_HP_DONE_WIDTH 1 /* HP_DONE */ | ||
1303 | #define WM8996_HP_LVL_MASK 0x007F /* HP_LVL - [6:0] */ | ||
1304 | #define WM8996_HP_LVL_SHIFT 0 /* HP_LVL - [6:0] */ | ||
1305 | #define WM8996_HP_LVL_WIDTH 7 /* HP_LVL - [6:0] */ | ||
1306 | |||
1307 | /* | ||
1308 | * R56 (0x38) - Mic Detect 1 | ||
1309 | */ | ||
1310 | #define WM8996_MICD_BIAS_STARTTIME_MASK 0xF000 /* MICD_BIAS_STARTTIME - [15:12] */ | ||
1311 | #define WM8996_MICD_BIAS_STARTTIME_SHIFT 12 /* MICD_BIAS_STARTTIME - [15:12] */ | ||
1312 | #define WM8996_MICD_BIAS_STARTTIME_WIDTH 4 /* MICD_BIAS_STARTTIME - [15:12] */ | ||
1313 | #define WM8996_MICD_RATE_MASK 0x0F00 /* MICD_RATE - [11:8] */ | ||
1314 | #define WM8996_MICD_RATE_SHIFT 8 /* MICD_RATE - [11:8] */ | ||
1315 | #define WM8996_MICD_RATE_WIDTH 4 /* MICD_RATE - [11:8] */ | ||
1316 | #define WM8996_MICD_DBTIME 0x0002 /* MICD_DBTIME */ | ||
1317 | #define WM8996_MICD_DBTIME_MASK 0x0002 /* MICD_DBTIME */ | ||
1318 | #define WM8996_MICD_DBTIME_SHIFT 1 /* MICD_DBTIME */ | ||
1319 | #define WM8996_MICD_DBTIME_WIDTH 1 /* MICD_DBTIME */ | ||
1320 | #define WM8996_MICD_ENA 0x0001 /* MICD_ENA */ | ||
1321 | #define WM8996_MICD_ENA_MASK 0x0001 /* MICD_ENA */ | ||
1322 | #define WM8996_MICD_ENA_SHIFT 0 /* MICD_ENA */ | ||
1323 | #define WM8996_MICD_ENA_WIDTH 1 /* MICD_ENA */ | ||
1324 | |||
1325 | /* | ||
1326 | * R57 (0x39) - Mic Detect 2 | ||
1327 | */ | ||
1328 | #define WM8996_MICD_LVL_SEL_MASK 0x00FF /* MICD_LVL_SEL - [7:0] */ | ||
1329 | #define WM8996_MICD_LVL_SEL_SHIFT 0 /* MICD_LVL_SEL - [7:0] */ | ||
1330 | #define WM8996_MICD_LVL_SEL_WIDTH 8 /* MICD_LVL_SEL - [7:0] */ | ||
1331 | |||
1332 | /* | ||
1333 | * R58 (0x3A) - Mic Detect 3 | ||
1334 | */ | ||
1335 | #define WM8996_MICD_LVL_MASK 0x07FC /* MICD_LVL - [10:2] */ | ||
1336 | #define WM8996_MICD_LVL_SHIFT 2 /* MICD_LVL - [10:2] */ | ||
1337 | #define WM8996_MICD_LVL_WIDTH 9 /* MICD_LVL - [10:2] */ | ||
1338 | #define WM8996_MICD_VALID 0x0002 /* MICD_VALID */ | ||
1339 | #define WM8996_MICD_VALID_MASK 0x0002 /* MICD_VALID */ | ||
1340 | #define WM8996_MICD_VALID_SHIFT 1 /* MICD_VALID */ | ||
1341 | #define WM8996_MICD_VALID_WIDTH 1 /* MICD_VALID */ | ||
1342 | #define WM8996_MICD_STS 0x0001 /* MICD_STS */ | ||
1343 | #define WM8996_MICD_STS_MASK 0x0001 /* MICD_STS */ | ||
1344 | #define WM8996_MICD_STS_SHIFT 0 /* MICD_STS */ | ||
1345 | #define WM8996_MICD_STS_WIDTH 1 /* MICD_STS */ | ||
1346 | |||
1347 | /* | ||
1348 | * R64 (0x40) - Charge Pump (1) | ||
1349 | */ | ||
1350 | #define WM8996_CP_ENA 0x8000 /* CP_ENA */ | ||
1351 | #define WM8996_CP_ENA_MASK 0x8000 /* CP_ENA */ | ||
1352 | #define WM8996_CP_ENA_SHIFT 15 /* CP_ENA */ | ||
1353 | #define WM8996_CP_ENA_WIDTH 1 /* CP_ENA */ | ||
1354 | |||
1355 | /* | ||
1356 | * R65 (0x41) - Charge Pump (2) | ||
1357 | */ | ||
1358 | #define WM8996_CP_DISCH 0x8000 /* CP_DISCH */ | ||
1359 | #define WM8996_CP_DISCH_MASK 0x8000 /* CP_DISCH */ | ||
1360 | #define WM8996_CP_DISCH_SHIFT 15 /* CP_DISCH */ | ||
1361 | #define WM8996_CP_DISCH_WIDTH 1 /* CP_DISCH */ | ||
1362 | |||
1363 | /* | ||
1364 | * R80 (0x50) - DC Servo (1) | ||
1365 | */ | ||
1366 | #define WM8996_DCS_ENA_CHAN_3 0x0008 /* DCS_ENA_CHAN_3 */ | ||
1367 | #define WM8996_DCS_ENA_CHAN_3_MASK 0x0008 /* DCS_ENA_CHAN_3 */ | ||
1368 | #define WM8996_DCS_ENA_CHAN_3_SHIFT 3 /* DCS_ENA_CHAN_3 */ | ||
1369 | #define WM8996_DCS_ENA_CHAN_3_WIDTH 1 /* DCS_ENA_CHAN_3 */ | ||
1370 | #define WM8996_DCS_ENA_CHAN_2 0x0004 /* DCS_ENA_CHAN_2 */ | ||
1371 | #define WM8996_DCS_ENA_CHAN_2_MASK 0x0004 /* DCS_ENA_CHAN_2 */ | ||
1372 | #define WM8996_DCS_ENA_CHAN_2_SHIFT 2 /* DCS_ENA_CHAN_2 */ | ||
1373 | #define WM8996_DCS_ENA_CHAN_2_WIDTH 1 /* DCS_ENA_CHAN_2 */ | ||
1374 | #define WM8996_DCS_ENA_CHAN_1 0x0002 /* DCS_ENA_CHAN_1 */ | ||
1375 | #define WM8996_DCS_ENA_CHAN_1_MASK 0x0002 /* DCS_ENA_CHAN_1 */ | ||
1376 | #define WM8996_DCS_ENA_CHAN_1_SHIFT 1 /* DCS_ENA_CHAN_1 */ | ||
1377 | #define WM8996_DCS_ENA_CHAN_1_WIDTH 1 /* DCS_ENA_CHAN_1 */ | ||
1378 | #define WM8996_DCS_ENA_CHAN_0 0x0001 /* DCS_ENA_CHAN_0 */ | ||
1379 | #define WM8996_DCS_ENA_CHAN_0_MASK 0x0001 /* DCS_ENA_CHAN_0 */ | ||
1380 | #define WM8996_DCS_ENA_CHAN_0_SHIFT 0 /* DCS_ENA_CHAN_0 */ | ||
1381 | #define WM8996_DCS_ENA_CHAN_0_WIDTH 1 /* DCS_ENA_CHAN_0 */ | ||
1382 | |||
1383 | /* | ||
1384 | * R81 (0x51) - DC Servo (2) | ||
1385 | */ | ||
1386 | #define WM8996_DCS_TRIG_SINGLE_3 0x8000 /* DCS_TRIG_SINGLE_3 */ | ||
1387 | #define WM8996_DCS_TRIG_SINGLE_3_MASK 0x8000 /* DCS_TRIG_SINGLE_3 */ | ||
1388 | #define WM8996_DCS_TRIG_SINGLE_3_SHIFT 15 /* DCS_TRIG_SINGLE_3 */ | ||
1389 | #define WM8996_DCS_TRIG_SINGLE_3_WIDTH 1 /* DCS_TRIG_SINGLE_3 */ | ||
1390 | #define WM8996_DCS_TRIG_SINGLE_2 0x4000 /* DCS_TRIG_SINGLE_2 */ | ||
1391 | #define WM8996_DCS_TRIG_SINGLE_2_MASK 0x4000 /* DCS_TRIG_SINGLE_2 */ | ||
1392 | #define WM8996_DCS_TRIG_SINGLE_2_SHIFT 14 /* DCS_TRIG_SINGLE_2 */ | ||
1393 | #define WM8996_DCS_TRIG_SINGLE_2_WIDTH 1 /* DCS_TRIG_SINGLE_2 */ | ||
1394 | #define WM8996_DCS_TRIG_SINGLE_1 0x2000 /* DCS_TRIG_SINGLE_1 */ | ||
1395 | #define WM8996_DCS_TRIG_SINGLE_1_MASK 0x2000 /* DCS_TRIG_SINGLE_1 */ | ||
1396 | #define WM8996_DCS_TRIG_SINGLE_1_SHIFT 13 /* DCS_TRIG_SINGLE_1 */ | ||
1397 | #define WM8996_DCS_TRIG_SINGLE_1_WIDTH 1 /* DCS_TRIG_SINGLE_1 */ | ||
1398 | #define WM8996_DCS_TRIG_SINGLE_0 0x1000 /* DCS_TRIG_SINGLE_0 */ | ||
1399 | #define WM8996_DCS_TRIG_SINGLE_0_MASK 0x1000 /* DCS_TRIG_SINGLE_0 */ | ||
1400 | #define WM8996_DCS_TRIG_SINGLE_0_SHIFT 12 /* DCS_TRIG_SINGLE_0 */ | ||
1401 | #define WM8996_DCS_TRIG_SINGLE_0_WIDTH 1 /* DCS_TRIG_SINGLE_0 */ | ||
1402 | #define WM8996_DCS_TRIG_SERIES_3 0x0800 /* DCS_TRIG_SERIES_3 */ | ||
1403 | #define WM8996_DCS_TRIG_SERIES_3_MASK 0x0800 /* DCS_TRIG_SERIES_3 */ | ||
1404 | #define WM8996_DCS_TRIG_SERIES_3_SHIFT 11 /* DCS_TRIG_SERIES_3 */ | ||
1405 | #define WM8996_DCS_TRIG_SERIES_3_WIDTH 1 /* DCS_TRIG_SERIES_3 */ | ||
1406 | #define WM8996_DCS_TRIG_SERIES_2 0x0400 /* DCS_TRIG_SERIES_2 */ | ||
1407 | #define WM8996_DCS_TRIG_SERIES_2_MASK 0x0400 /* DCS_TRIG_SERIES_2 */ | ||
1408 | #define WM8996_DCS_TRIG_SERIES_2_SHIFT 10 /* DCS_TRIG_SERIES_2 */ | ||
1409 | #define WM8996_DCS_TRIG_SERIES_2_WIDTH 1 /* DCS_TRIG_SERIES_2 */ | ||
1410 | #define WM8996_DCS_TRIG_SERIES_1 0x0200 /* DCS_TRIG_SERIES_1 */ | ||
1411 | #define WM8996_DCS_TRIG_SERIES_1_MASK 0x0200 /* DCS_TRIG_SERIES_1 */ | ||
1412 | #define WM8996_DCS_TRIG_SERIES_1_SHIFT 9 /* DCS_TRIG_SERIES_1 */ | ||
1413 | #define WM8996_DCS_TRIG_SERIES_1_WIDTH 1 /* DCS_TRIG_SERIES_1 */ | ||
1414 | #define WM8996_DCS_TRIG_SERIES_0 0x0100 /* DCS_TRIG_SERIES_0 */ | ||
1415 | #define WM8996_DCS_TRIG_SERIES_0_MASK 0x0100 /* DCS_TRIG_SERIES_0 */ | ||
1416 | #define WM8996_DCS_TRIG_SERIES_0_SHIFT 8 /* DCS_TRIG_SERIES_0 */ | ||
1417 | #define WM8996_DCS_TRIG_SERIES_0_WIDTH 1 /* DCS_TRIG_SERIES_0 */ | ||
1418 | #define WM8996_DCS_TRIG_STARTUP_3 0x0080 /* DCS_TRIG_STARTUP_3 */ | ||
1419 | #define WM8996_DCS_TRIG_STARTUP_3_MASK 0x0080 /* DCS_TRIG_STARTUP_3 */ | ||
1420 | #define WM8996_DCS_TRIG_STARTUP_3_SHIFT 7 /* DCS_TRIG_STARTUP_3 */ | ||
1421 | #define WM8996_DCS_TRIG_STARTUP_3_WIDTH 1 /* DCS_TRIG_STARTUP_3 */ | ||
1422 | #define WM8996_DCS_TRIG_STARTUP_2 0x0040 /* DCS_TRIG_STARTUP_2 */ | ||
1423 | #define WM8996_DCS_TRIG_STARTUP_2_MASK 0x0040 /* DCS_TRIG_STARTUP_2 */ | ||
1424 | #define WM8996_DCS_TRIG_STARTUP_2_SHIFT 6 /* DCS_TRIG_STARTUP_2 */ | ||
1425 | #define WM8996_DCS_TRIG_STARTUP_2_WIDTH 1 /* DCS_TRIG_STARTUP_2 */ | ||
1426 | #define WM8996_DCS_TRIG_STARTUP_1 0x0020 /* DCS_TRIG_STARTUP_1 */ | ||
1427 | #define WM8996_DCS_TRIG_STARTUP_1_MASK 0x0020 /* DCS_TRIG_STARTUP_1 */ | ||
1428 | #define WM8996_DCS_TRIG_STARTUP_1_SHIFT 5 /* DCS_TRIG_STARTUP_1 */ | ||
1429 | #define WM8996_DCS_TRIG_STARTUP_1_WIDTH 1 /* DCS_TRIG_STARTUP_1 */ | ||
1430 | #define WM8996_DCS_TRIG_STARTUP_0 0x0010 /* DCS_TRIG_STARTUP_0 */ | ||
1431 | #define WM8996_DCS_TRIG_STARTUP_0_MASK 0x0010 /* DCS_TRIG_STARTUP_0 */ | ||
1432 | #define WM8996_DCS_TRIG_STARTUP_0_SHIFT 4 /* DCS_TRIG_STARTUP_0 */ | ||
1433 | #define WM8996_DCS_TRIG_STARTUP_0_WIDTH 1 /* DCS_TRIG_STARTUP_0 */ | ||
1434 | #define WM8996_DCS_TRIG_DAC_WR_3 0x0008 /* DCS_TRIG_DAC_WR_3 */ | ||
1435 | #define WM8996_DCS_TRIG_DAC_WR_3_MASK 0x0008 /* DCS_TRIG_DAC_WR_3 */ | ||
1436 | #define WM8996_DCS_TRIG_DAC_WR_3_SHIFT 3 /* DCS_TRIG_DAC_WR_3 */ | ||
1437 | #define WM8996_DCS_TRIG_DAC_WR_3_WIDTH 1 /* DCS_TRIG_DAC_WR_3 */ | ||
1438 | #define WM8996_DCS_TRIG_DAC_WR_2 0x0004 /* DCS_TRIG_DAC_WR_2 */ | ||
1439 | #define WM8996_DCS_TRIG_DAC_WR_2_MASK 0x0004 /* DCS_TRIG_DAC_WR_2 */ | ||
1440 | #define WM8996_DCS_TRIG_DAC_WR_2_SHIFT 2 /* DCS_TRIG_DAC_WR_2 */ | ||
1441 | #define WM8996_DCS_TRIG_DAC_WR_2_WIDTH 1 /* DCS_TRIG_DAC_WR_2 */ | ||
1442 | #define WM8996_DCS_TRIG_DAC_WR_1 0x0002 /* DCS_TRIG_DAC_WR_1 */ | ||
1443 | #define WM8996_DCS_TRIG_DAC_WR_1_MASK 0x0002 /* DCS_TRIG_DAC_WR_1 */ | ||
1444 | #define WM8996_DCS_TRIG_DAC_WR_1_SHIFT 1 /* DCS_TRIG_DAC_WR_1 */ | ||
1445 | #define WM8996_DCS_TRIG_DAC_WR_1_WIDTH 1 /* DCS_TRIG_DAC_WR_1 */ | ||
1446 | #define WM8996_DCS_TRIG_DAC_WR_0 0x0001 /* DCS_TRIG_DAC_WR_0 */ | ||
1447 | #define WM8996_DCS_TRIG_DAC_WR_0_MASK 0x0001 /* DCS_TRIG_DAC_WR_0 */ | ||
1448 | #define WM8996_DCS_TRIG_DAC_WR_0_SHIFT 0 /* DCS_TRIG_DAC_WR_0 */ | ||
1449 | #define WM8996_DCS_TRIG_DAC_WR_0_WIDTH 1 /* DCS_TRIG_DAC_WR_0 */ | ||
1450 | |||
1451 | /* | ||
1452 | * R82 (0x52) - DC Servo (3) | ||
1453 | */ | ||
1454 | #define WM8996_DCS_TIMER_PERIOD_23_MASK 0x0F00 /* DCS_TIMER_PERIOD_23 - [11:8] */ | ||
1455 | #define WM8996_DCS_TIMER_PERIOD_23_SHIFT 8 /* DCS_TIMER_PERIOD_23 - [11:8] */ | ||
1456 | #define WM8996_DCS_TIMER_PERIOD_23_WIDTH 4 /* DCS_TIMER_PERIOD_23 - [11:8] */ | ||
1457 | #define WM8996_DCS_TIMER_PERIOD_01_MASK 0x000F /* DCS_TIMER_PERIOD_01 - [3:0] */ | ||
1458 | #define WM8996_DCS_TIMER_PERIOD_01_SHIFT 0 /* DCS_TIMER_PERIOD_01 - [3:0] */ | ||
1459 | #define WM8996_DCS_TIMER_PERIOD_01_WIDTH 4 /* DCS_TIMER_PERIOD_01 - [3:0] */ | ||
1460 | |||
1461 | /* | ||
1462 | * R84 (0x54) - DC Servo (5) | ||
1463 | */ | ||
1464 | #define WM8996_DCS_SERIES_NO_23_MASK 0x7F00 /* DCS_SERIES_NO_23 - [14:8] */ | ||
1465 | #define WM8996_DCS_SERIES_NO_23_SHIFT 8 /* DCS_SERIES_NO_23 - [14:8] */ | ||
1466 | #define WM8996_DCS_SERIES_NO_23_WIDTH 7 /* DCS_SERIES_NO_23 - [14:8] */ | ||
1467 | #define WM8996_DCS_SERIES_NO_01_MASK 0x007F /* DCS_SERIES_NO_01 - [6:0] */ | ||
1468 | #define WM8996_DCS_SERIES_NO_01_SHIFT 0 /* DCS_SERIES_NO_01 - [6:0] */ | ||
1469 | #define WM8996_DCS_SERIES_NO_01_WIDTH 7 /* DCS_SERIES_NO_01 - [6:0] */ | ||
1470 | |||
1471 | /* | ||
1472 | * R85 (0x55) - DC Servo (6) | ||
1473 | */ | ||
1474 | #define WM8996_DCS_DAC_WR_VAL_3_MASK 0xFF00 /* DCS_DAC_WR_VAL_3 - [15:8] */ | ||
1475 | #define WM8996_DCS_DAC_WR_VAL_3_SHIFT 8 /* DCS_DAC_WR_VAL_3 - [15:8] */ | ||
1476 | #define WM8996_DCS_DAC_WR_VAL_3_WIDTH 8 /* DCS_DAC_WR_VAL_3 - [15:8] */ | ||
1477 | #define WM8996_DCS_DAC_WR_VAL_2_MASK 0x00FF /* DCS_DAC_WR_VAL_2 - [7:0] */ | ||
1478 | #define WM8996_DCS_DAC_WR_VAL_2_SHIFT 0 /* DCS_DAC_WR_VAL_2 - [7:0] */ | ||
1479 | #define WM8996_DCS_DAC_WR_VAL_2_WIDTH 8 /* DCS_DAC_WR_VAL_2 - [7:0] */ | ||
1480 | |||
1481 | /* | ||
1482 | * R86 (0x56) - DC Servo (7) | ||
1483 | */ | ||
1484 | #define WM8996_DCS_DAC_WR_VAL_1_MASK 0xFF00 /* DCS_DAC_WR_VAL_1 - [15:8] */ | ||
1485 | #define WM8996_DCS_DAC_WR_VAL_1_SHIFT 8 /* DCS_DAC_WR_VAL_1 - [15:8] */ | ||
1486 | #define WM8996_DCS_DAC_WR_VAL_1_WIDTH 8 /* DCS_DAC_WR_VAL_1 - [15:8] */ | ||
1487 | #define WM8996_DCS_DAC_WR_VAL_0_MASK 0x00FF /* DCS_DAC_WR_VAL_0 - [7:0] */ | ||
1488 | #define WM8996_DCS_DAC_WR_VAL_0_SHIFT 0 /* DCS_DAC_WR_VAL_0 - [7:0] */ | ||
1489 | #define WM8996_DCS_DAC_WR_VAL_0_WIDTH 8 /* DCS_DAC_WR_VAL_0 - [7:0] */ | ||
1490 | |||
1491 | /* | ||
1492 | * R87 (0x57) - DC Servo Readback 0 | ||
1493 | */ | ||
1494 | #define WM8996_DCS_CAL_COMPLETE_MASK 0x0F00 /* DCS_CAL_COMPLETE - [11:8] */ | ||
1495 | #define WM8996_DCS_CAL_COMPLETE_SHIFT 8 /* DCS_CAL_COMPLETE - [11:8] */ | ||
1496 | #define WM8996_DCS_CAL_COMPLETE_WIDTH 4 /* DCS_CAL_COMPLETE - [11:8] */ | ||
1497 | #define WM8996_DCS_DAC_WR_COMPLETE_MASK 0x00F0 /* DCS_DAC_WR_COMPLETE - [7:4] */ | ||
1498 | #define WM8996_DCS_DAC_WR_COMPLETE_SHIFT 4 /* DCS_DAC_WR_COMPLETE - [7:4] */ | ||
1499 | #define WM8996_DCS_DAC_WR_COMPLETE_WIDTH 4 /* DCS_DAC_WR_COMPLETE - [7:4] */ | ||
1500 | #define WM8996_DCS_STARTUP_COMPLETE_MASK 0x000F /* DCS_STARTUP_COMPLETE - [3:0] */ | ||
1501 | #define WM8996_DCS_STARTUP_COMPLETE_SHIFT 0 /* DCS_STARTUP_COMPLETE - [3:0] */ | ||
1502 | #define WM8996_DCS_STARTUP_COMPLETE_WIDTH 4 /* DCS_STARTUP_COMPLETE - [3:0] */ | ||
1503 | |||
1504 | /* | ||
1505 | * R96 (0x60) - Analogue HP (1) | ||
1506 | */ | ||
1507 | #define WM8996_HPOUT1L_RMV_SHORT 0x0080 /* HPOUT1L_RMV_SHORT */ | ||
1508 | #define WM8996_HPOUT1L_RMV_SHORT_MASK 0x0080 /* HPOUT1L_RMV_SHORT */ | ||
1509 | #define WM8996_HPOUT1L_RMV_SHORT_SHIFT 7 /* HPOUT1L_RMV_SHORT */ | ||
1510 | #define WM8996_HPOUT1L_RMV_SHORT_WIDTH 1 /* HPOUT1L_RMV_SHORT */ | ||
1511 | #define WM8996_HPOUT1L_OUTP 0x0040 /* HPOUT1L_OUTP */ | ||
1512 | #define WM8996_HPOUT1L_OUTP_MASK 0x0040 /* HPOUT1L_OUTP */ | ||
1513 | #define WM8996_HPOUT1L_OUTP_SHIFT 6 /* HPOUT1L_OUTP */ | ||
1514 | #define WM8996_HPOUT1L_OUTP_WIDTH 1 /* HPOUT1L_OUTP */ | ||
1515 | #define WM8996_HPOUT1L_DLY 0x0020 /* HPOUT1L_DLY */ | ||
1516 | #define WM8996_HPOUT1L_DLY_MASK 0x0020 /* HPOUT1L_DLY */ | ||
1517 | #define WM8996_HPOUT1L_DLY_SHIFT 5 /* HPOUT1L_DLY */ | ||
1518 | #define WM8996_HPOUT1L_DLY_WIDTH 1 /* HPOUT1L_DLY */ | ||
1519 | #define WM8996_HPOUT1R_RMV_SHORT 0x0008 /* HPOUT1R_RMV_SHORT */ | ||
1520 | #define WM8996_HPOUT1R_RMV_SHORT_MASK 0x0008 /* HPOUT1R_RMV_SHORT */ | ||
1521 | #define WM8996_HPOUT1R_RMV_SHORT_SHIFT 3 /* HPOUT1R_RMV_SHORT */ | ||
1522 | #define WM8996_HPOUT1R_RMV_SHORT_WIDTH 1 /* HPOUT1R_RMV_SHORT */ | ||
1523 | #define WM8996_HPOUT1R_OUTP 0x0004 /* HPOUT1R_OUTP */ | ||
1524 | #define WM8996_HPOUT1R_OUTP_MASK 0x0004 /* HPOUT1R_OUTP */ | ||
1525 | #define WM8996_HPOUT1R_OUTP_SHIFT 2 /* HPOUT1R_OUTP */ | ||
1526 | #define WM8996_HPOUT1R_OUTP_WIDTH 1 /* HPOUT1R_OUTP */ | ||
1527 | #define WM8996_HPOUT1R_DLY 0x0002 /* HPOUT1R_DLY */ | ||
1528 | #define WM8996_HPOUT1R_DLY_MASK 0x0002 /* HPOUT1R_DLY */ | ||
1529 | #define WM8996_HPOUT1R_DLY_SHIFT 1 /* HPOUT1R_DLY */ | ||
1530 | #define WM8996_HPOUT1R_DLY_WIDTH 1 /* HPOUT1R_DLY */ | ||
1531 | |||
1532 | /* | ||
1533 | * R97 (0x61) - Analogue HP (2) | ||
1534 | */ | ||
1535 | #define WM8996_HPOUT2L_RMV_SHORT 0x0080 /* HPOUT2L_RMV_SHORT */ | ||
1536 | #define WM8996_HPOUT2L_RMV_SHORT_MASK 0x0080 /* HPOUT2L_RMV_SHORT */ | ||
1537 | #define WM8996_HPOUT2L_RMV_SHORT_SHIFT 7 /* HPOUT2L_RMV_SHORT */ | ||
1538 | #define WM8996_HPOUT2L_RMV_SHORT_WIDTH 1 /* HPOUT2L_RMV_SHORT */ | ||
1539 | #define WM8996_HPOUT2L_OUTP 0x0040 /* HPOUT2L_OUTP */ | ||
1540 | #define WM8996_HPOUT2L_OUTP_MASK 0x0040 /* HPOUT2L_OUTP */ | ||
1541 | #define WM8996_HPOUT2L_OUTP_SHIFT 6 /* HPOUT2L_OUTP */ | ||
1542 | #define WM8996_HPOUT2L_OUTP_WIDTH 1 /* HPOUT2L_OUTP */ | ||
1543 | #define WM8996_HPOUT2L_DLY 0x0020 /* HPOUT2L_DLY */ | ||
1544 | #define WM8996_HPOUT2L_DLY_MASK 0x0020 /* HPOUT2L_DLY */ | ||
1545 | #define WM8996_HPOUT2L_DLY_SHIFT 5 /* HPOUT2L_DLY */ | ||
1546 | #define WM8996_HPOUT2L_DLY_WIDTH 1 /* HPOUT2L_DLY */ | ||
1547 | #define WM8996_HPOUT2R_RMV_SHORT 0x0008 /* HPOUT2R_RMV_SHORT */ | ||
1548 | #define WM8996_HPOUT2R_RMV_SHORT_MASK 0x0008 /* HPOUT2R_RMV_SHORT */ | ||
1549 | #define WM8996_HPOUT2R_RMV_SHORT_SHIFT 3 /* HPOUT2R_RMV_SHORT */ | ||
1550 | #define WM8996_HPOUT2R_RMV_SHORT_WIDTH 1 /* HPOUT2R_RMV_SHORT */ | ||
1551 | #define WM8996_HPOUT2R_OUTP 0x0004 /* HPOUT2R_OUTP */ | ||
1552 | #define WM8996_HPOUT2R_OUTP_MASK 0x0004 /* HPOUT2R_OUTP */ | ||
1553 | #define WM8996_HPOUT2R_OUTP_SHIFT 2 /* HPOUT2R_OUTP */ | ||
1554 | #define WM8996_HPOUT2R_OUTP_WIDTH 1 /* HPOUT2R_OUTP */ | ||
1555 | #define WM8996_HPOUT2R_DLY 0x0002 /* HPOUT2R_DLY */ | ||
1556 | #define WM8996_HPOUT2R_DLY_MASK 0x0002 /* HPOUT2R_DLY */ | ||
1557 | #define WM8996_HPOUT2R_DLY_SHIFT 1 /* HPOUT2R_DLY */ | ||
1558 | #define WM8996_HPOUT2R_DLY_WIDTH 1 /* HPOUT2R_DLY */ | ||
1559 | |||
1560 | /* | ||
1561 | * R256 (0x100) - Chip Revision | ||
1562 | */ | ||
1563 | #define WM8996_CHIP_REV_MASK 0x000F /* CHIP_REV - [3:0] */ | ||
1564 | #define WM8996_CHIP_REV_SHIFT 0 /* CHIP_REV - [3:0] */ | ||
1565 | #define WM8996_CHIP_REV_WIDTH 4 /* CHIP_REV - [3:0] */ | ||
1566 | |||
1567 | /* | ||
1568 | * R257 (0x101) - Control Interface (1) | ||
1569 | */ | ||
1570 | #define WM8996_AUTO_INC 0x0004 /* AUTO_INC */ | ||
1571 | #define WM8996_AUTO_INC_MASK 0x0004 /* AUTO_INC */ | ||
1572 | #define WM8996_AUTO_INC_SHIFT 2 /* AUTO_INC */ | ||
1573 | #define WM8996_AUTO_INC_WIDTH 1 /* AUTO_INC */ | ||
1574 | |||
1575 | /* | ||
1576 | * R272 (0x110) - Write Sequencer Ctrl (1) | ||
1577 | */ | ||
1578 | #define WM8996_WSEQ_ENA 0x8000 /* WSEQ_ENA */ | ||
1579 | #define WM8996_WSEQ_ENA_MASK 0x8000 /* WSEQ_ENA */ | ||
1580 | #define WM8996_WSEQ_ENA_SHIFT 15 /* WSEQ_ENA */ | ||
1581 | #define WM8996_WSEQ_ENA_WIDTH 1 /* WSEQ_ENA */ | ||
1582 | #define WM8996_WSEQ_ABORT 0x0200 /* WSEQ_ABORT */ | ||
1583 | #define WM8996_WSEQ_ABORT_MASK 0x0200 /* WSEQ_ABORT */ | ||
1584 | #define WM8996_WSEQ_ABORT_SHIFT 9 /* WSEQ_ABORT */ | ||
1585 | #define WM8996_WSEQ_ABORT_WIDTH 1 /* WSEQ_ABORT */ | ||
1586 | #define WM8996_WSEQ_START 0x0100 /* WSEQ_START */ | ||
1587 | #define WM8996_WSEQ_START_MASK 0x0100 /* WSEQ_START */ | ||
1588 | #define WM8996_WSEQ_START_SHIFT 8 /* WSEQ_START */ | ||
1589 | #define WM8996_WSEQ_START_WIDTH 1 /* WSEQ_START */ | ||
1590 | #define WM8996_WSEQ_START_INDEX_MASK 0x007F /* WSEQ_START_INDEX - [6:0] */ | ||
1591 | #define WM8996_WSEQ_START_INDEX_SHIFT 0 /* WSEQ_START_INDEX - [6:0] */ | ||
1592 | #define WM8996_WSEQ_START_INDEX_WIDTH 7 /* WSEQ_START_INDEX - [6:0] */ | ||
1593 | |||
1594 | /* | ||
1595 | * R273 (0x111) - Write Sequencer Ctrl (2) | ||
1596 | */ | ||
1597 | #define WM8996_WSEQ_BUSY 0x0100 /* WSEQ_BUSY */ | ||
1598 | #define WM8996_WSEQ_BUSY_MASK 0x0100 /* WSEQ_BUSY */ | ||
1599 | #define WM8996_WSEQ_BUSY_SHIFT 8 /* WSEQ_BUSY */ | ||
1600 | #define WM8996_WSEQ_BUSY_WIDTH 1 /* WSEQ_BUSY */ | ||
1601 | #define WM8996_WSEQ_CURRENT_INDEX_MASK 0x007F /* WSEQ_CURRENT_INDEX - [6:0] */ | ||
1602 | #define WM8996_WSEQ_CURRENT_INDEX_SHIFT 0 /* WSEQ_CURRENT_INDEX - [6:0] */ | ||
1603 | #define WM8996_WSEQ_CURRENT_INDEX_WIDTH 7 /* WSEQ_CURRENT_INDEX - [6:0] */ | ||
1604 | |||
1605 | /* | ||
1606 | * R512 (0x200) - AIF Clocking (1) | ||
1607 | */ | ||
1608 | #define WM8996_SYSCLK_SRC_MASK 0x0018 /* SYSCLK_SRC - [4:3] */ | ||
1609 | #define WM8996_SYSCLK_SRC_SHIFT 3 /* SYSCLK_SRC - [4:3] */ | ||
1610 | #define WM8996_SYSCLK_SRC_WIDTH 2 /* SYSCLK_SRC - [4:3] */ | ||
1611 | #define WM8996_SYSCLK_INV 0x0004 /* SYSCLK_INV */ | ||
1612 | #define WM8996_SYSCLK_INV_MASK 0x0004 /* SYSCLK_INV */ | ||
1613 | #define WM8996_SYSCLK_INV_SHIFT 2 /* SYSCLK_INV */ | ||
1614 | #define WM8996_SYSCLK_INV_WIDTH 1 /* SYSCLK_INV */ | ||
1615 | #define WM8996_SYSCLK_DIV 0x0002 /* SYSCLK_DIV */ | ||
1616 | #define WM8996_SYSCLK_DIV_MASK 0x0002 /* SYSCLK_DIV */ | ||
1617 | #define WM8996_SYSCLK_DIV_SHIFT 1 /* SYSCLK_DIV */ | ||
1618 | #define WM8996_SYSCLK_DIV_WIDTH 1 /* SYSCLK_DIV */ | ||
1619 | #define WM8996_SYSCLK_ENA 0x0001 /* SYSCLK_ENA */ | ||
1620 | #define WM8996_SYSCLK_ENA_MASK 0x0001 /* SYSCLK_ENA */ | ||
1621 | #define WM8996_SYSCLK_ENA_SHIFT 0 /* SYSCLK_ENA */ | ||
1622 | #define WM8996_SYSCLK_ENA_WIDTH 1 /* SYSCLK_ENA */ | ||
1623 | |||
1624 | /* | ||
1625 | * R513 (0x201) - AIF Clocking (2) | ||
1626 | */ | ||
1627 | #define WM8996_DSP2_DIV_MASK 0x0018 /* DSP2_DIV - [4:3] */ | ||
1628 | #define WM8996_DSP2_DIV_SHIFT 3 /* DSP2_DIV - [4:3] */ | ||
1629 | #define WM8996_DSP2_DIV_WIDTH 2 /* DSP2_DIV - [4:3] */ | ||
1630 | #define WM8996_DSP1_DIV_MASK 0x0003 /* DSP1_DIV - [1:0] */ | ||
1631 | #define WM8996_DSP1_DIV_SHIFT 0 /* DSP1_DIV - [1:0] */ | ||
1632 | #define WM8996_DSP1_DIV_WIDTH 2 /* DSP1_DIV - [1:0] */ | ||
1633 | |||
1634 | /* | ||
1635 | * R520 (0x208) - Clocking (1) | ||
1636 | */ | ||
1637 | #define WM8996_LFCLK_ENA 0x0020 /* LFCLK_ENA */ | ||
1638 | #define WM8996_LFCLK_ENA_MASK 0x0020 /* LFCLK_ENA */ | ||
1639 | #define WM8996_LFCLK_ENA_SHIFT 5 /* LFCLK_ENA */ | ||
1640 | #define WM8996_LFCLK_ENA_WIDTH 1 /* LFCLK_ENA */ | ||
1641 | #define WM8996_TOCLK_ENA 0x0010 /* TOCLK_ENA */ | ||
1642 | #define WM8996_TOCLK_ENA_MASK 0x0010 /* TOCLK_ENA */ | ||
1643 | #define WM8996_TOCLK_ENA_SHIFT 4 /* TOCLK_ENA */ | ||
1644 | #define WM8996_TOCLK_ENA_WIDTH 1 /* TOCLK_ENA */ | ||
1645 | #define WM8996_AIFCLK_ENA 0x0004 /* AIFCLK_ENA */ | ||
1646 | #define WM8996_AIFCLK_ENA_MASK 0x0004 /* AIFCLK_ENA */ | ||
1647 | #define WM8996_AIFCLK_ENA_SHIFT 2 /* AIFCLK_ENA */ | ||
1648 | #define WM8996_AIFCLK_ENA_WIDTH 1 /* AIFCLK_ENA */ | ||
1649 | #define WM8996_SYSDSPCLK_ENA 0x0002 /* SYSDSPCLK_ENA */ | ||
1650 | #define WM8996_SYSDSPCLK_ENA_MASK 0x0002 /* SYSDSPCLK_ENA */ | ||
1651 | #define WM8996_SYSDSPCLK_ENA_SHIFT 1 /* SYSDSPCLK_ENA */ | ||
1652 | #define WM8996_SYSDSPCLK_ENA_WIDTH 1 /* SYSDSPCLK_ENA */ | ||
1653 | |||
1654 | /* | ||
1655 | * R521 (0x209) - Clocking (2) | ||
1656 | */ | ||
1657 | #define WM8996_TOCLK_DIV_MASK 0x0700 /* TOCLK_DIV - [10:8] */ | ||
1658 | #define WM8996_TOCLK_DIV_SHIFT 8 /* TOCLK_DIV - [10:8] */ | ||
1659 | #define WM8996_TOCLK_DIV_WIDTH 3 /* TOCLK_DIV - [10:8] */ | ||
1660 | #define WM8996_DBCLK_DIV_MASK 0x00F0 /* DBCLK_DIV - [7:4] */ | ||
1661 | #define WM8996_DBCLK_DIV_SHIFT 4 /* DBCLK_DIV - [7:4] */ | ||
1662 | #define WM8996_DBCLK_DIV_WIDTH 4 /* DBCLK_DIV - [7:4] */ | ||
1663 | #define WM8996_OPCLK_DIV_MASK 0x0007 /* OPCLK_DIV - [2:0] */ | ||
1664 | #define WM8996_OPCLK_DIV_SHIFT 0 /* OPCLK_DIV - [2:0] */ | ||
1665 | #define WM8996_OPCLK_DIV_WIDTH 3 /* OPCLK_DIV - [2:0] */ | ||
1666 | |||
1667 | /* | ||
1668 | * R528 (0x210) - AIF Rate | ||
1669 | */ | ||
1670 | #define WM8996_SYSCLK_RATE 0x0001 /* SYSCLK_RATE */ | ||
1671 | #define WM8996_SYSCLK_RATE_MASK 0x0001 /* SYSCLK_RATE */ | ||
1672 | #define WM8996_SYSCLK_RATE_SHIFT 0 /* SYSCLK_RATE */ | ||
1673 | #define WM8996_SYSCLK_RATE_WIDTH 1 /* SYSCLK_RATE */ | ||
1674 | |||
1675 | /* | ||
1676 | * R544 (0x220) - FLL Control (1) | ||
1677 | */ | ||
1678 | #define WM8996_FLL_OSC_ENA 0x0002 /* FLL_OSC_ENA */ | ||
1679 | #define WM8996_FLL_OSC_ENA_MASK 0x0002 /* FLL_OSC_ENA */ | ||
1680 | #define WM8996_FLL_OSC_ENA_SHIFT 1 /* FLL_OSC_ENA */ | ||
1681 | #define WM8996_FLL_OSC_ENA_WIDTH 1 /* FLL_OSC_ENA */ | ||
1682 | #define WM8996_FLL_ENA 0x0001 /* FLL_ENA */ | ||
1683 | #define WM8996_FLL_ENA_MASK 0x0001 /* FLL_ENA */ | ||
1684 | #define WM8996_FLL_ENA_SHIFT 0 /* FLL_ENA */ | ||
1685 | #define WM8996_FLL_ENA_WIDTH 1 /* FLL_ENA */ | ||
1686 | |||
1687 | /* | ||
1688 | * R545 (0x221) - FLL Control (2) | ||
1689 | */ | ||
1690 | #define WM8996_FLL_OUTDIV_MASK 0x3F00 /* FLL_OUTDIV - [13:8] */ | ||
1691 | #define WM8996_FLL_OUTDIV_SHIFT 8 /* FLL_OUTDIV - [13:8] */ | ||
1692 | #define WM8996_FLL_OUTDIV_WIDTH 6 /* FLL_OUTDIV - [13:8] */ | ||
1693 | #define WM8996_FLL_FRATIO_MASK 0x0007 /* FLL_FRATIO - [2:0] */ | ||
1694 | #define WM8996_FLL_FRATIO_SHIFT 0 /* FLL_FRATIO - [2:0] */ | ||
1695 | #define WM8996_FLL_FRATIO_WIDTH 3 /* FLL_FRATIO - [2:0] */ | ||
1696 | |||
1697 | /* | ||
1698 | * R546 (0x222) - FLL Control (3) | ||
1699 | */ | ||
1700 | #define WM8996_FLL_THETA_MASK 0xFFFF /* FLL_THETA - [15:0] */ | ||
1701 | #define WM8996_FLL_THETA_SHIFT 0 /* FLL_THETA - [15:0] */ | ||
1702 | #define WM8996_FLL_THETA_WIDTH 16 /* FLL_THETA - [15:0] */ | ||
1703 | |||
1704 | /* | ||
1705 | * R547 (0x223) - FLL Control (4) | ||
1706 | */ | ||
1707 | #define WM8996_FLL_N_MASK 0x7FE0 /* FLL_N - [14:5] */ | ||
1708 | #define WM8996_FLL_N_SHIFT 5 /* FLL_N - [14:5] */ | ||
1709 | #define WM8996_FLL_N_WIDTH 10 /* FLL_N - [14:5] */ | ||
1710 | #define WM8996_FLL_LOOP_GAIN_MASK 0x000F /* FLL_LOOP_GAIN - [3:0] */ | ||
1711 | #define WM8996_FLL_LOOP_GAIN_SHIFT 0 /* FLL_LOOP_GAIN - [3:0] */ | ||
1712 | #define WM8996_FLL_LOOP_GAIN_WIDTH 4 /* FLL_LOOP_GAIN - [3:0] */ | ||
1713 | |||
1714 | /* | ||
1715 | * R548 (0x224) - FLL Control (5) | ||
1716 | */ | ||
1717 | #define WM8996_FLL_FRC_NCO_VAL_MASK 0x1F80 /* FLL_FRC_NCO_VAL - [12:7] */ | ||
1718 | #define WM8996_FLL_FRC_NCO_VAL_SHIFT 7 /* FLL_FRC_NCO_VAL - [12:7] */ | ||
1719 | #define WM8996_FLL_FRC_NCO_VAL_WIDTH 6 /* FLL_FRC_NCO_VAL - [12:7] */ | ||
1720 | #define WM8996_FLL_FRC_NCO 0x0040 /* FLL_FRC_NCO */ | ||
1721 | #define WM8996_FLL_FRC_NCO_MASK 0x0040 /* FLL_FRC_NCO */ | ||
1722 | #define WM8996_FLL_FRC_NCO_SHIFT 6 /* FLL_FRC_NCO */ | ||
1723 | #define WM8996_FLL_FRC_NCO_WIDTH 1 /* FLL_FRC_NCO */ | ||
1724 | #define WM8996_FLL_REFCLK_DIV_MASK 0x0018 /* FLL_REFCLK_DIV - [4:3] */ | ||
1725 | #define WM8996_FLL_REFCLK_DIV_SHIFT 3 /* FLL_REFCLK_DIV - [4:3] */ | ||
1726 | #define WM8996_FLL_REFCLK_DIV_WIDTH 2 /* FLL_REFCLK_DIV - [4:3] */ | ||
1727 | #define WM8996_FLL_REF_FREQ 0x0004 /* FLL_REF_FREQ */ | ||
1728 | #define WM8996_FLL_REF_FREQ_MASK 0x0004 /* FLL_REF_FREQ */ | ||
1729 | #define WM8996_FLL_REF_FREQ_SHIFT 2 /* FLL_REF_FREQ */ | ||
1730 | #define WM8996_FLL_REF_FREQ_WIDTH 1 /* FLL_REF_FREQ */ | ||
1731 | #define WM8996_FLL_REFCLK_SRC_MASK 0x0003 /* FLL_REFCLK_SRC - [1:0] */ | ||
1732 | #define WM8996_FLL_REFCLK_SRC_SHIFT 0 /* FLL_REFCLK_SRC - [1:0] */ | ||
1733 | #define WM8996_FLL_REFCLK_SRC_WIDTH 2 /* FLL_REFCLK_SRC - [1:0] */ | ||
1734 | |||
1735 | /* | ||
1736 | * R549 (0x225) - FLL Control (6) | ||
1737 | */ | ||
1738 | #define WM8996_FLL_REFCLK_SRC_STS_MASK 0x000C /* FLL_REFCLK_SRC_STS - [3:2] */ | ||
1739 | #define WM8996_FLL_REFCLK_SRC_STS_SHIFT 2 /* FLL_REFCLK_SRC_STS - [3:2] */ | ||
1740 | #define WM8996_FLL_REFCLK_SRC_STS_WIDTH 2 /* FLL_REFCLK_SRC_STS - [3:2] */ | ||
1741 | #define WM8996_FLL_SWITCH_CLK 0x0001 /* FLL_SWITCH_CLK */ | ||
1742 | #define WM8996_FLL_SWITCH_CLK_MASK 0x0001 /* FLL_SWITCH_CLK */ | ||
1743 | #define WM8996_FLL_SWITCH_CLK_SHIFT 0 /* FLL_SWITCH_CLK */ | ||
1744 | #define WM8996_FLL_SWITCH_CLK_WIDTH 1 /* FLL_SWITCH_CLK */ | ||
1745 | |||
1746 | /* | ||
1747 | * R550 (0x226) - FLL EFS 1 | ||
1748 | */ | ||
1749 | #define WM8996_FLL_LAMBDA_MASK 0xFFFF /* FLL_LAMBDA - [15:0] */ | ||
1750 | #define WM8996_FLL_LAMBDA_SHIFT 0 /* FLL_LAMBDA - [15:0] */ | ||
1751 | #define WM8996_FLL_LAMBDA_WIDTH 16 /* FLL_LAMBDA - [15:0] */ | ||
1752 | |||
1753 | /* | ||
1754 | * R551 (0x227) - FLL EFS 2 | ||
1755 | */ | ||
1756 | #define WM8996_FLL_LFSR_SEL_MASK 0x0006 /* FLL_LFSR_SEL - [2:1] */ | ||
1757 | #define WM8996_FLL_LFSR_SEL_SHIFT 1 /* FLL_LFSR_SEL - [2:1] */ | ||
1758 | #define WM8996_FLL_LFSR_SEL_WIDTH 2 /* FLL_LFSR_SEL - [2:1] */ | ||
1759 | #define WM8996_FLL_EFS_ENA 0x0001 /* FLL_EFS_ENA */ | ||
1760 | #define WM8996_FLL_EFS_ENA_MASK 0x0001 /* FLL_EFS_ENA */ | ||
1761 | #define WM8996_FLL_EFS_ENA_SHIFT 0 /* FLL_EFS_ENA */ | ||
1762 | #define WM8996_FLL_EFS_ENA_WIDTH 1 /* FLL_EFS_ENA */ | ||
1763 | |||
1764 | /* | ||
1765 | * R768 (0x300) - AIF1 Control | ||
1766 | */ | ||
1767 | #define WM8996_AIF1_TRI 0x0004 /* AIF1_TRI */ | ||
1768 | #define WM8996_AIF1_TRI_MASK 0x0004 /* AIF1_TRI */ | ||
1769 | #define WM8996_AIF1_TRI_SHIFT 2 /* AIF1_TRI */ | ||
1770 | #define WM8996_AIF1_TRI_WIDTH 1 /* AIF1_TRI */ | ||
1771 | #define WM8996_AIF1_FMT_MASK 0x0003 /* AIF1_FMT - [1:0] */ | ||
1772 | #define WM8996_AIF1_FMT_SHIFT 0 /* AIF1_FMT - [1:0] */ | ||
1773 | #define WM8996_AIF1_FMT_WIDTH 2 /* AIF1_FMT - [1:0] */ | ||
1774 | |||
1775 | /* | ||
1776 | * R769 (0x301) - AIF1 BCLK | ||
1777 | */ | ||
1778 | #define WM8996_AIF1_BCLK_INV 0x0400 /* AIF1_BCLK_INV */ | ||
1779 | #define WM8996_AIF1_BCLK_INV_MASK 0x0400 /* AIF1_BCLK_INV */ | ||
1780 | #define WM8996_AIF1_BCLK_INV_SHIFT 10 /* AIF1_BCLK_INV */ | ||
1781 | #define WM8996_AIF1_BCLK_INV_WIDTH 1 /* AIF1_BCLK_INV */ | ||
1782 | #define WM8996_AIF1_BCLK_FRC 0x0200 /* AIF1_BCLK_FRC */ | ||
1783 | #define WM8996_AIF1_BCLK_FRC_MASK 0x0200 /* AIF1_BCLK_FRC */ | ||
1784 | #define WM8996_AIF1_BCLK_FRC_SHIFT 9 /* AIF1_BCLK_FRC */ | ||
1785 | #define WM8996_AIF1_BCLK_FRC_WIDTH 1 /* AIF1_BCLK_FRC */ | ||
1786 | #define WM8996_AIF1_BCLK_MSTR 0x0100 /* AIF1_BCLK_MSTR */ | ||
1787 | #define WM8996_AIF1_BCLK_MSTR_MASK 0x0100 /* AIF1_BCLK_MSTR */ | ||
1788 | #define WM8996_AIF1_BCLK_MSTR_SHIFT 8 /* AIF1_BCLK_MSTR */ | ||
1789 | #define WM8996_AIF1_BCLK_MSTR_WIDTH 1 /* AIF1_BCLK_MSTR */ | ||
1790 | #define WM8996_AIF1_BCLK_DIV_MASK 0x000F /* AIF1_BCLK_DIV - [3:0] */ | ||
1791 | #define WM8996_AIF1_BCLK_DIV_SHIFT 0 /* AIF1_BCLK_DIV - [3:0] */ | ||
1792 | #define WM8996_AIF1_BCLK_DIV_WIDTH 4 /* AIF1_BCLK_DIV - [3:0] */ | ||
1793 | |||
1794 | /* | ||
1795 | * R770 (0x302) - AIF1 TX LRCLK(1) | ||
1796 | */ | ||
1797 | #define WM8996_AIF1TX_RATE_MASK 0x07FF /* AIF1TX_RATE - [10:0] */ | ||
1798 | #define WM8996_AIF1TX_RATE_SHIFT 0 /* AIF1TX_RATE - [10:0] */ | ||
1799 | #define WM8996_AIF1TX_RATE_WIDTH 11 /* AIF1TX_RATE - [10:0] */ | ||
1800 | |||
1801 | /* | ||
1802 | * R771 (0x303) - AIF1 TX LRCLK(2) | ||
1803 | */ | ||
1804 | #define WM8996_AIF1TX_LRCLK_MODE 0x0008 /* AIF1TX_LRCLK_MODE */ | ||
1805 | #define WM8996_AIF1TX_LRCLK_MODE_MASK 0x0008 /* AIF1TX_LRCLK_MODE */ | ||
1806 | #define WM8996_AIF1TX_LRCLK_MODE_SHIFT 3 /* AIF1TX_LRCLK_MODE */ | ||
1807 | #define WM8996_AIF1TX_LRCLK_MODE_WIDTH 1 /* AIF1TX_LRCLK_MODE */ | ||
1808 | #define WM8996_AIF1TX_LRCLK_INV 0x0004 /* AIF1TX_LRCLK_INV */ | ||
1809 | #define WM8996_AIF1TX_LRCLK_INV_MASK 0x0004 /* AIF1TX_LRCLK_INV */ | ||
1810 | #define WM8996_AIF1TX_LRCLK_INV_SHIFT 2 /* AIF1TX_LRCLK_INV */ | ||
1811 | #define WM8996_AIF1TX_LRCLK_INV_WIDTH 1 /* AIF1TX_LRCLK_INV */ | ||
1812 | #define WM8996_AIF1TX_LRCLK_FRC 0x0002 /* AIF1TX_LRCLK_FRC */ | ||
1813 | #define WM8996_AIF1TX_LRCLK_FRC_MASK 0x0002 /* AIF1TX_LRCLK_FRC */ | ||
1814 | #define WM8996_AIF1TX_LRCLK_FRC_SHIFT 1 /* AIF1TX_LRCLK_FRC */ | ||
1815 | #define WM8996_AIF1TX_LRCLK_FRC_WIDTH 1 /* AIF1TX_LRCLK_FRC */ | ||
1816 | #define WM8996_AIF1TX_LRCLK_MSTR 0x0001 /* AIF1TX_LRCLK_MSTR */ | ||
1817 | #define WM8996_AIF1TX_LRCLK_MSTR_MASK 0x0001 /* AIF1TX_LRCLK_MSTR */ | ||
1818 | #define WM8996_AIF1TX_LRCLK_MSTR_SHIFT 0 /* AIF1TX_LRCLK_MSTR */ | ||
1819 | #define WM8996_AIF1TX_LRCLK_MSTR_WIDTH 1 /* AIF1TX_LRCLK_MSTR */ | ||
1820 | |||
1821 | /* | ||
1822 | * R772 (0x304) - AIF1 RX LRCLK(1) | ||
1823 | */ | ||
1824 | #define WM8996_AIF1RX_RATE_MASK 0x07FF /* AIF1RX_RATE - [10:0] */ | ||
1825 | #define WM8996_AIF1RX_RATE_SHIFT 0 /* AIF1RX_RATE - [10:0] */ | ||
1826 | #define WM8996_AIF1RX_RATE_WIDTH 11 /* AIF1RX_RATE - [10:0] */ | ||
1827 | |||
1828 | /* | ||
1829 | * R773 (0x305) - AIF1 RX LRCLK(2) | ||
1830 | */ | ||
1831 | #define WM8996_AIF1RX_LRCLK_INV 0x0004 /* AIF1RX_LRCLK_INV */ | ||
1832 | #define WM8996_AIF1RX_LRCLK_INV_MASK 0x0004 /* AIF1RX_LRCLK_INV */ | ||
1833 | #define WM8996_AIF1RX_LRCLK_INV_SHIFT 2 /* AIF1RX_LRCLK_INV */ | ||
1834 | #define WM8996_AIF1RX_LRCLK_INV_WIDTH 1 /* AIF1RX_LRCLK_INV */ | ||
1835 | #define WM8996_AIF1RX_LRCLK_FRC 0x0002 /* AIF1RX_LRCLK_FRC */ | ||
1836 | #define WM8996_AIF1RX_LRCLK_FRC_MASK 0x0002 /* AIF1RX_LRCLK_FRC */ | ||
1837 | #define WM8996_AIF1RX_LRCLK_FRC_SHIFT 1 /* AIF1RX_LRCLK_FRC */ | ||
1838 | #define WM8996_AIF1RX_LRCLK_FRC_WIDTH 1 /* AIF1RX_LRCLK_FRC */ | ||
1839 | #define WM8996_AIF1RX_LRCLK_MSTR 0x0001 /* AIF1RX_LRCLK_MSTR */ | ||
1840 | #define WM8996_AIF1RX_LRCLK_MSTR_MASK 0x0001 /* AIF1RX_LRCLK_MSTR */ | ||
1841 | #define WM8996_AIF1RX_LRCLK_MSTR_SHIFT 0 /* AIF1RX_LRCLK_MSTR */ | ||
1842 | #define WM8996_AIF1RX_LRCLK_MSTR_WIDTH 1 /* AIF1RX_LRCLK_MSTR */ | ||
1843 | |||
1844 | /* | ||
1845 | * R774 (0x306) - AIF1TX Data Configuration (1) | ||
1846 | */ | ||
1847 | #define WM8996_AIF1TX_WL_MASK 0xFF00 /* AIF1TX_WL - [15:8] */ | ||
1848 | #define WM8996_AIF1TX_WL_SHIFT 8 /* AIF1TX_WL - [15:8] */ | ||
1849 | #define WM8996_AIF1TX_WL_WIDTH 8 /* AIF1TX_WL - [15:8] */ | ||
1850 | #define WM8996_AIF1TX_SLOT_LEN_MASK 0x00FF /* AIF1TX_SLOT_LEN - [7:0] */ | ||
1851 | #define WM8996_AIF1TX_SLOT_LEN_SHIFT 0 /* AIF1TX_SLOT_LEN - [7:0] */ | ||
1852 | #define WM8996_AIF1TX_SLOT_LEN_WIDTH 8 /* AIF1TX_SLOT_LEN - [7:0] */ | ||
1853 | |||
1854 | /* | ||
1855 | * R775 (0x307) - AIF1TX Data Configuration (2) | ||
1856 | */ | ||
1857 | #define WM8996_AIF1TX_DAT_TRI 0x0001 /* AIF1TX_DAT_TRI */ | ||
1858 | #define WM8996_AIF1TX_DAT_TRI_MASK 0x0001 /* AIF1TX_DAT_TRI */ | ||
1859 | #define WM8996_AIF1TX_DAT_TRI_SHIFT 0 /* AIF1TX_DAT_TRI */ | ||
1860 | #define WM8996_AIF1TX_DAT_TRI_WIDTH 1 /* AIF1TX_DAT_TRI */ | ||
1861 | |||
1862 | /* | ||
1863 | * R776 (0x308) - AIF1RX Data Configuration | ||
1864 | */ | ||
1865 | #define WM8996_AIF1RX_WL_MASK 0xFF00 /* AIF1RX_WL - [15:8] */ | ||
1866 | #define WM8996_AIF1RX_WL_SHIFT 8 /* AIF1RX_WL - [15:8] */ | ||
1867 | #define WM8996_AIF1RX_WL_WIDTH 8 /* AIF1RX_WL - [15:8] */ | ||
1868 | #define WM8996_AIF1RX_SLOT_LEN_MASK 0x00FF /* AIF1RX_SLOT_LEN - [7:0] */ | ||
1869 | #define WM8996_AIF1RX_SLOT_LEN_SHIFT 0 /* AIF1RX_SLOT_LEN - [7:0] */ | ||
1870 | #define WM8996_AIF1RX_SLOT_LEN_WIDTH 8 /* AIF1RX_SLOT_LEN - [7:0] */ | ||
1871 | |||
1872 | /* | ||
1873 | * R777 (0x309) - AIF1TX Channel 0 Configuration | ||
1874 | */ | ||
1875 | #define WM8996_AIF1TX_CHAN0_DAT_INV 0x8000 /* AIF1TX_CHAN0_DAT_INV */ | ||
1876 | #define WM8996_AIF1TX_CHAN0_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN0_DAT_INV */ | ||
1877 | #define WM8996_AIF1TX_CHAN0_DAT_INV_SHIFT 15 /* AIF1TX_CHAN0_DAT_INV */ | ||
1878 | #define WM8996_AIF1TX_CHAN0_DAT_INV_WIDTH 1 /* AIF1TX_CHAN0_DAT_INV */ | ||
1879 | #define WM8996_AIF1TX_CHAN0_SPACING_MASK 0x7E00 /* AIF1TX_CHAN0_SPACING - [14:9] */ | ||
1880 | #define WM8996_AIF1TX_CHAN0_SPACING_SHIFT 9 /* AIF1TX_CHAN0_SPACING - [14:9] */ | ||
1881 | #define WM8996_AIF1TX_CHAN0_SPACING_WIDTH 6 /* AIF1TX_CHAN0_SPACING - [14:9] */ | ||
1882 | #define WM8996_AIF1TX_CHAN0_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN0_SLOTS - [8:6] */ | ||
1883 | #define WM8996_AIF1TX_CHAN0_SLOTS_SHIFT 6 /* AIF1TX_CHAN0_SLOTS - [8:6] */ | ||
1884 | #define WM8996_AIF1TX_CHAN0_SLOTS_WIDTH 3 /* AIF1TX_CHAN0_SLOTS - [8:6] */ | ||
1885 | #define WM8996_AIF1TX_CHAN0_START_SLOT_MASK 0x003F /* AIF1TX_CHAN0_START_SLOT - [5:0] */ | ||
1886 | #define WM8996_AIF1TX_CHAN0_START_SLOT_SHIFT 0 /* AIF1TX_CHAN0_START_SLOT - [5:0] */ | ||
1887 | #define WM8996_AIF1TX_CHAN0_START_SLOT_WIDTH 6 /* AIF1TX_CHAN0_START_SLOT - [5:0] */ | ||
1888 | |||
1889 | /* | ||
1890 | * R778 (0x30A) - AIF1TX Channel 1 Configuration | ||
1891 | */ | ||
1892 | #define WM8996_AIF1TX_CHAN1_DAT_INV 0x8000 /* AIF1TX_CHAN1_DAT_INV */ | ||
1893 | #define WM8996_AIF1TX_CHAN1_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN1_DAT_INV */ | ||
1894 | #define WM8996_AIF1TX_CHAN1_DAT_INV_SHIFT 15 /* AIF1TX_CHAN1_DAT_INV */ | ||
1895 | #define WM8996_AIF1TX_CHAN1_DAT_INV_WIDTH 1 /* AIF1TX_CHAN1_DAT_INV */ | ||
1896 | #define WM8996_AIF1TX_CHAN1_SPACING_MASK 0x7E00 /* AIF1TX_CHAN1_SPACING - [14:9] */ | ||
1897 | #define WM8996_AIF1TX_CHAN1_SPACING_SHIFT 9 /* AIF1TX_CHAN1_SPACING - [14:9] */ | ||
1898 | #define WM8996_AIF1TX_CHAN1_SPACING_WIDTH 6 /* AIF1TX_CHAN1_SPACING - [14:9] */ | ||
1899 | #define WM8996_AIF1TX_CHAN1_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN1_SLOTS - [8:6] */ | ||
1900 | #define WM8996_AIF1TX_CHAN1_SLOTS_SHIFT 6 /* AIF1TX_CHAN1_SLOTS - [8:6] */ | ||
1901 | #define WM8996_AIF1TX_CHAN1_SLOTS_WIDTH 3 /* AIF1TX_CHAN1_SLOTS - [8:6] */ | ||
1902 | #define WM8996_AIF1TX_CHAN1_START_SLOT_MASK 0x003F /* AIF1TX_CHAN1_START_SLOT - [5:0] */ | ||
1903 | #define WM8996_AIF1TX_CHAN1_START_SLOT_SHIFT 0 /* AIF1TX_CHAN1_START_SLOT - [5:0] */ | ||
1904 | #define WM8996_AIF1TX_CHAN1_START_SLOT_WIDTH 6 /* AIF1TX_CHAN1_START_SLOT - [5:0] */ | ||
1905 | |||
1906 | /* | ||
1907 | * R779 (0x30B) - AIF1TX Channel 2 Configuration | ||
1908 | */ | ||
1909 | #define WM8996_AIF1TX_CHAN2_DAT_INV 0x8000 /* AIF1TX_CHAN2_DAT_INV */ | ||
1910 | #define WM8996_AIF1TX_CHAN2_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN2_DAT_INV */ | ||
1911 | #define WM8996_AIF1TX_CHAN2_DAT_INV_SHIFT 15 /* AIF1TX_CHAN2_DAT_INV */ | ||
1912 | #define WM8996_AIF1TX_CHAN2_DAT_INV_WIDTH 1 /* AIF1TX_CHAN2_DAT_INV */ | ||
1913 | #define WM8996_AIF1TX_CHAN2_SPACING_MASK 0x7E00 /* AIF1TX_CHAN2_SPACING - [14:9] */ | ||
1914 | #define WM8996_AIF1TX_CHAN2_SPACING_SHIFT 9 /* AIF1TX_CHAN2_SPACING - [14:9] */ | ||
1915 | #define WM8996_AIF1TX_CHAN2_SPACING_WIDTH 6 /* AIF1TX_CHAN2_SPACING - [14:9] */ | ||
1916 | #define WM8996_AIF1TX_CHAN2_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN2_SLOTS - [8:6] */ | ||
1917 | #define WM8996_AIF1TX_CHAN2_SLOTS_SHIFT 6 /* AIF1TX_CHAN2_SLOTS - [8:6] */ | ||
1918 | #define WM8996_AIF1TX_CHAN2_SLOTS_WIDTH 3 /* AIF1TX_CHAN2_SLOTS - [8:6] */ | ||
1919 | #define WM8996_AIF1TX_CHAN2_START_SLOT_MASK 0x003F /* AIF1TX_CHAN2_START_SLOT - [5:0] */ | ||
1920 | #define WM8996_AIF1TX_CHAN2_START_SLOT_SHIFT 0 /* AIF1TX_CHAN2_START_SLOT - [5:0] */ | ||
1921 | #define WM8996_AIF1TX_CHAN2_START_SLOT_WIDTH 6 /* AIF1TX_CHAN2_START_SLOT - [5:0] */ | ||
1922 | |||
1923 | /* | ||
1924 | * R780 (0x30C) - AIF1TX Channel 3 Configuration | ||
1925 | */ | ||
1926 | #define WM8996_AIF1TX_CHAN3_DAT_INV 0x8000 /* AIF1TX_CHAN3_DAT_INV */ | ||
1927 | #define WM8996_AIF1TX_CHAN3_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN3_DAT_INV */ | ||
1928 | #define WM8996_AIF1TX_CHAN3_DAT_INV_SHIFT 15 /* AIF1TX_CHAN3_DAT_INV */ | ||
1929 | #define WM8996_AIF1TX_CHAN3_DAT_INV_WIDTH 1 /* AIF1TX_CHAN3_DAT_INV */ | ||
1930 | #define WM8996_AIF1TX_CHAN3_SPACING_MASK 0x7E00 /* AIF1TX_CHAN3_SPACING - [14:9] */ | ||
1931 | #define WM8996_AIF1TX_CHAN3_SPACING_SHIFT 9 /* AIF1TX_CHAN3_SPACING - [14:9] */ | ||
1932 | #define WM8996_AIF1TX_CHAN3_SPACING_WIDTH 6 /* AIF1TX_CHAN3_SPACING - [14:9] */ | ||
1933 | #define WM8996_AIF1TX_CHAN3_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN3_SLOTS - [8:6] */ | ||
1934 | #define WM8996_AIF1TX_CHAN3_SLOTS_SHIFT 6 /* AIF1TX_CHAN3_SLOTS - [8:6] */ | ||
1935 | #define WM8996_AIF1TX_CHAN3_SLOTS_WIDTH 3 /* AIF1TX_CHAN3_SLOTS - [8:6] */ | ||
1936 | #define WM8996_AIF1TX_CHAN3_START_SLOT_MASK 0x003F /* AIF1TX_CHAN3_START_SLOT - [5:0] */ | ||
1937 | #define WM8996_AIF1TX_CHAN3_START_SLOT_SHIFT 0 /* AIF1TX_CHAN3_START_SLOT - [5:0] */ | ||
1938 | #define WM8996_AIF1TX_CHAN3_START_SLOT_WIDTH 6 /* AIF1TX_CHAN3_START_SLOT - [5:0] */ | ||
1939 | |||
1940 | /* | ||
1941 | * R781 (0x30D) - AIF1TX Channel 4 Configuration | ||
1942 | */ | ||
1943 | #define WM8996_AIF1TX_CHAN4_DAT_INV 0x8000 /* AIF1TX_CHAN4_DAT_INV */ | ||
1944 | #define WM8996_AIF1TX_CHAN4_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN4_DAT_INV */ | ||
1945 | #define WM8996_AIF1TX_CHAN4_DAT_INV_SHIFT 15 /* AIF1TX_CHAN4_DAT_INV */ | ||
1946 | #define WM8996_AIF1TX_CHAN4_DAT_INV_WIDTH 1 /* AIF1TX_CHAN4_DAT_INV */ | ||
1947 | #define WM8996_AIF1TX_CHAN4_SPACING_MASK 0x7E00 /* AIF1TX_CHAN4_SPACING - [14:9] */ | ||
1948 | #define WM8996_AIF1TX_CHAN4_SPACING_SHIFT 9 /* AIF1TX_CHAN4_SPACING - [14:9] */ | ||
1949 | #define WM8996_AIF1TX_CHAN4_SPACING_WIDTH 6 /* AIF1TX_CHAN4_SPACING - [14:9] */ | ||
1950 | #define WM8996_AIF1TX_CHAN4_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN4_SLOTS - [8:6] */ | ||
1951 | #define WM8996_AIF1TX_CHAN4_SLOTS_SHIFT 6 /* AIF1TX_CHAN4_SLOTS - [8:6] */ | ||
1952 | #define WM8996_AIF1TX_CHAN4_SLOTS_WIDTH 3 /* AIF1TX_CHAN4_SLOTS - [8:6] */ | ||
1953 | #define WM8996_AIF1TX_CHAN4_START_SLOT_MASK 0x003F /* AIF1TX_CHAN4_START_SLOT - [5:0] */ | ||
1954 | #define WM8996_AIF1TX_CHAN4_START_SLOT_SHIFT 0 /* AIF1TX_CHAN4_START_SLOT - [5:0] */ | ||
1955 | #define WM8996_AIF1TX_CHAN4_START_SLOT_WIDTH 6 /* AIF1TX_CHAN4_START_SLOT - [5:0] */ | ||
1956 | |||
1957 | /* | ||
1958 | * R782 (0x30E) - AIF1TX Channel 5 Configuration | ||
1959 | */ | ||
1960 | #define WM8996_AIF1TX_CHAN5_DAT_INV 0x8000 /* AIF1TX_CHAN5_DAT_INV */ | ||
1961 | #define WM8996_AIF1TX_CHAN5_DAT_INV_MASK 0x8000 /* AIF1TX_CHAN5_DAT_INV */ | ||
1962 | #define WM8996_AIF1TX_CHAN5_DAT_INV_SHIFT 15 /* AIF1TX_CHAN5_DAT_INV */ | ||
1963 | #define WM8996_AIF1TX_CHAN5_DAT_INV_WIDTH 1 /* AIF1TX_CHAN5_DAT_INV */ | ||
1964 | #define WM8996_AIF1TX_CHAN5_SPACING_MASK 0x7E00 /* AIF1TX_CHAN5_SPACING - [14:9] */ | ||
1965 | #define WM8996_AIF1TX_CHAN5_SPACING_SHIFT 9 /* AIF1TX_CHAN5_SPACING - [14:9] */ | ||
1966 | #define WM8996_AIF1TX_CHAN5_SPACING_WIDTH 6 /* AIF1TX_CHAN5_SPACING - [14:9] */ | ||
1967 | #define WM8996_AIF1TX_CHAN5_SLOTS_MASK 0x01C0 /* AIF1TX_CHAN5_SLOTS - [8:6] */ | ||
1968 | #define WM8996_AIF1TX_CHAN5_SLOTS_SHIFT 6 /* AIF1TX_CHAN5_SLOTS - [8:6] */ | ||
1969 | #define WM8996_AIF1TX_CHAN5_SLOTS_WIDTH 3 /* AIF1TX_CHAN5_SLOTS - [8:6] */ | ||
1970 | #define WM8996_AIF1TX_CHAN5_START_SLOT_MASK 0x003F /* AIF1TX_CHAN5_START_SLOT - [5:0] */ | ||
1971 | #define WM8996_AIF1TX_CHAN5_START_SLOT_SHIFT 0 /* AIF1TX_CHAN5_START_SLOT - [5:0] */ | ||
1972 | #define WM8996_AIF1TX_CHAN5_START_SLOT_WIDTH 6 /* AIF1TX_CHAN5_START_SLOT - [5:0] */ | ||
1973 | |||
1974 | /* | ||
1975 | * R783 (0x30F) - AIF1RX Channel 0 Configuration | ||
1976 | */ | ||
1977 | #define WM8996_AIF1RX_CHAN0_DAT_INV 0x8000 /* AIF1RX_CHAN0_DAT_INV */ | ||
1978 | #define WM8996_AIF1RX_CHAN0_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN0_DAT_INV */ | ||
1979 | #define WM8996_AIF1RX_CHAN0_DAT_INV_SHIFT 15 /* AIF1RX_CHAN0_DAT_INV */ | ||
1980 | #define WM8996_AIF1RX_CHAN0_DAT_INV_WIDTH 1 /* AIF1RX_CHAN0_DAT_INV */ | ||
1981 | #define WM8996_AIF1RX_CHAN0_SPACING_MASK 0x7E00 /* AIF1RX_CHAN0_SPACING - [14:9] */ | ||
1982 | #define WM8996_AIF1RX_CHAN0_SPACING_SHIFT 9 /* AIF1RX_CHAN0_SPACING - [14:9] */ | ||
1983 | #define WM8996_AIF1RX_CHAN0_SPACING_WIDTH 6 /* AIF1RX_CHAN0_SPACING - [14:9] */ | ||
1984 | #define WM8996_AIF1RX_CHAN0_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN0_SLOTS - [8:6] */ | ||
1985 | #define WM8996_AIF1RX_CHAN0_SLOTS_SHIFT 6 /* AIF1RX_CHAN0_SLOTS - [8:6] */ | ||
1986 | #define WM8996_AIF1RX_CHAN0_SLOTS_WIDTH 3 /* AIF1RX_CHAN0_SLOTS - [8:6] */ | ||
1987 | #define WM8996_AIF1RX_CHAN0_START_SLOT_MASK 0x003F /* AIF1RX_CHAN0_START_SLOT - [5:0] */ | ||
1988 | #define WM8996_AIF1RX_CHAN0_START_SLOT_SHIFT 0 /* AIF1RX_CHAN0_START_SLOT - [5:0] */ | ||
1989 | #define WM8996_AIF1RX_CHAN0_START_SLOT_WIDTH 6 /* AIF1RX_CHAN0_START_SLOT - [5:0] */ | ||
1990 | |||
1991 | /* | ||
1992 | * R784 (0x310) - AIF1RX Channel 1 Configuration | ||
1993 | */ | ||
1994 | #define WM8996_AIF1RX_CHAN1_DAT_INV 0x8000 /* AIF1RX_CHAN1_DAT_INV */ | ||
1995 | #define WM8996_AIF1RX_CHAN1_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN1_DAT_INV */ | ||
1996 | #define WM8996_AIF1RX_CHAN1_DAT_INV_SHIFT 15 /* AIF1RX_CHAN1_DAT_INV */ | ||
1997 | #define WM8996_AIF1RX_CHAN1_DAT_INV_WIDTH 1 /* AIF1RX_CHAN1_DAT_INV */ | ||
1998 | #define WM8996_AIF1RX_CHAN1_SPACING_MASK 0x7E00 /* AIF1RX_CHAN1_SPACING - [14:9] */ | ||
1999 | #define WM8996_AIF1RX_CHAN1_SPACING_SHIFT 9 /* AIF1RX_CHAN1_SPACING - [14:9] */ | ||
2000 | #define WM8996_AIF1RX_CHAN1_SPACING_WIDTH 6 /* AIF1RX_CHAN1_SPACING - [14:9] */ | ||
2001 | #define WM8996_AIF1RX_CHAN1_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN1_SLOTS - [8:6] */ | ||
2002 | #define WM8996_AIF1RX_CHAN1_SLOTS_SHIFT 6 /* AIF1RX_CHAN1_SLOTS - [8:6] */ | ||
2003 | #define WM8996_AIF1RX_CHAN1_SLOTS_WIDTH 3 /* AIF1RX_CHAN1_SLOTS - [8:6] */ | ||
2004 | #define WM8996_AIF1RX_CHAN1_START_SLOT_MASK 0x003F /* AIF1RX_CHAN1_START_SLOT - [5:0] */ | ||
2005 | #define WM8996_AIF1RX_CHAN1_START_SLOT_SHIFT 0 /* AIF1RX_CHAN1_START_SLOT - [5:0] */ | ||
2006 | #define WM8996_AIF1RX_CHAN1_START_SLOT_WIDTH 6 /* AIF1RX_CHAN1_START_SLOT - [5:0] */ | ||
2007 | |||
2008 | /* | ||
2009 | * R785 (0x311) - AIF1RX Channel 2 Configuration | ||
2010 | */ | ||
2011 | #define WM8996_AIF1RX_CHAN2_DAT_INV 0x8000 /* AIF1RX_CHAN2_DAT_INV */ | ||
2012 | #define WM8996_AIF1RX_CHAN2_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN2_DAT_INV */ | ||
2013 | #define WM8996_AIF1RX_CHAN2_DAT_INV_SHIFT 15 /* AIF1RX_CHAN2_DAT_INV */ | ||
2014 | #define WM8996_AIF1RX_CHAN2_DAT_INV_WIDTH 1 /* AIF1RX_CHAN2_DAT_INV */ | ||
2015 | #define WM8996_AIF1RX_CHAN2_SPACING_MASK 0x7E00 /* AIF1RX_CHAN2_SPACING - [14:9] */ | ||
2016 | #define WM8996_AIF1RX_CHAN2_SPACING_SHIFT 9 /* AIF1RX_CHAN2_SPACING - [14:9] */ | ||
2017 | #define WM8996_AIF1RX_CHAN2_SPACING_WIDTH 6 /* AIF1RX_CHAN2_SPACING - [14:9] */ | ||
2018 | #define WM8996_AIF1RX_CHAN2_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN2_SLOTS - [8:6] */ | ||
2019 | #define WM8996_AIF1RX_CHAN2_SLOTS_SHIFT 6 /* AIF1RX_CHAN2_SLOTS - [8:6] */ | ||
2020 | #define WM8996_AIF1RX_CHAN2_SLOTS_WIDTH 3 /* AIF1RX_CHAN2_SLOTS - [8:6] */ | ||
2021 | #define WM8996_AIF1RX_CHAN2_START_SLOT_MASK 0x003F /* AIF1RX_CHAN2_START_SLOT - [5:0] */ | ||
2022 | #define WM8996_AIF1RX_CHAN2_START_SLOT_SHIFT 0 /* AIF1RX_CHAN2_START_SLOT - [5:0] */ | ||
2023 | #define WM8996_AIF1RX_CHAN2_START_SLOT_WIDTH 6 /* AIF1RX_CHAN2_START_SLOT - [5:0] */ | ||
2024 | |||
2025 | /* | ||
2026 | * R786 (0x312) - AIF1RX Channel 3 Configuration | ||
2027 | */ | ||
2028 | #define WM8996_AIF1RX_CHAN3_DAT_INV 0x8000 /* AIF1RX_CHAN3_DAT_INV */ | ||
2029 | #define WM8996_AIF1RX_CHAN3_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN3_DAT_INV */ | ||
2030 | #define WM8996_AIF1RX_CHAN3_DAT_INV_SHIFT 15 /* AIF1RX_CHAN3_DAT_INV */ | ||
2031 | #define WM8996_AIF1RX_CHAN3_DAT_INV_WIDTH 1 /* AIF1RX_CHAN3_DAT_INV */ | ||
2032 | #define WM8996_AIF1RX_CHAN3_SPACING_MASK 0x7E00 /* AIF1RX_CHAN3_SPACING - [14:9] */ | ||
2033 | #define WM8996_AIF1RX_CHAN3_SPACING_SHIFT 9 /* AIF1RX_CHAN3_SPACING - [14:9] */ | ||
2034 | #define WM8996_AIF1RX_CHAN3_SPACING_WIDTH 6 /* AIF1RX_CHAN3_SPACING - [14:9] */ | ||
2035 | #define WM8996_AIF1RX_CHAN3_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN3_SLOTS - [8:6] */ | ||
2036 | #define WM8996_AIF1RX_CHAN3_SLOTS_SHIFT 6 /* AIF1RX_CHAN3_SLOTS - [8:6] */ | ||
2037 | #define WM8996_AIF1RX_CHAN3_SLOTS_WIDTH 3 /* AIF1RX_CHAN3_SLOTS - [8:6] */ | ||
2038 | #define WM8996_AIF1RX_CHAN3_START_SLOT_MASK 0x003F /* AIF1RX_CHAN3_START_SLOT - [5:0] */ | ||
2039 | #define WM8996_AIF1RX_CHAN3_START_SLOT_SHIFT 0 /* AIF1RX_CHAN3_START_SLOT - [5:0] */ | ||
2040 | #define WM8996_AIF1RX_CHAN3_START_SLOT_WIDTH 6 /* AIF1RX_CHAN3_START_SLOT - [5:0] */ | ||
2041 | |||
2042 | /* | ||
2043 | * R787 (0x313) - AIF1RX Channel 4 Configuration | ||
2044 | */ | ||
2045 | #define WM8996_AIF1RX_CHAN4_DAT_INV 0x8000 /* AIF1RX_CHAN4_DAT_INV */ | ||
2046 | #define WM8996_AIF1RX_CHAN4_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN4_DAT_INV */ | ||
2047 | #define WM8996_AIF1RX_CHAN4_DAT_INV_SHIFT 15 /* AIF1RX_CHAN4_DAT_INV */ | ||
2048 | #define WM8996_AIF1RX_CHAN4_DAT_INV_WIDTH 1 /* AIF1RX_CHAN4_DAT_INV */ | ||
2049 | #define WM8996_AIF1RX_CHAN4_SPACING_MASK 0x7E00 /* AIF1RX_CHAN4_SPACING - [14:9] */ | ||
2050 | #define WM8996_AIF1RX_CHAN4_SPACING_SHIFT 9 /* AIF1RX_CHAN4_SPACING - [14:9] */ | ||
2051 | #define WM8996_AIF1RX_CHAN4_SPACING_WIDTH 6 /* AIF1RX_CHAN4_SPACING - [14:9] */ | ||
2052 | #define WM8996_AIF1RX_CHAN4_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN4_SLOTS - [8:6] */ | ||
2053 | #define WM8996_AIF1RX_CHAN4_SLOTS_SHIFT 6 /* AIF1RX_CHAN4_SLOTS - [8:6] */ | ||
2054 | #define WM8996_AIF1RX_CHAN4_SLOTS_WIDTH 3 /* AIF1RX_CHAN4_SLOTS - [8:6] */ | ||
2055 | #define WM8996_AIF1RX_CHAN4_START_SLOT_MASK 0x003F /* AIF1RX_CHAN4_START_SLOT - [5:0] */ | ||
2056 | #define WM8996_AIF1RX_CHAN4_START_SLOT_SHIFT 0 /* AIF1RX_CHAN4_START_SLOT - [5:0] */ | ||
2057 | #define WM8996_AIF1RX_CHAN4_START_SLOT_WIDTH 6 /* AIF1RX_CHAN4_START_SLOT - [5:0] */ | ||
2058 | |||
2059 | /* | ||
2060 | * R788 (0x314) - AIF1RX Channel 5 Configuration | ||
2061 | */ | ||
2062 | #define WM8996_AIF1RX_CHAN5_DAT_INV 0x8000 /* AIF1RX_CHAN5_DAT_INV */ | ||
2063 | #define WM8996_AIF1RX_CHAN5_DAT_INV_MASK 0x8000 /* AIF1RX_CHAN5_DAT_INV */ | ||
2064 | #define WM8996_AIF1RX_CHAN5_DAT_INV_SHIFT 15 /* AIF1RX_CHAN5_DAT_INV */ | ||
2065 | #define WM8996_AIF1RX_CHAN5_DAT_INV_WIDTH 1 /* AIF1RX_CHAN5_DAT_INV */ | ||
2066 | #define WM8996_AIF1RX_CHAN5_SPACING_MASK 0x7E00 /* AIF1RX_CHAN5_SPACING - [14:9] */ | ||
2067 | #define WM8996_AIF1RX_CHAN5_SPACING_SHIFT 9 /* AIF1RX_CHAN5_SPACING - [14:9] */ | ||
2068 | #define WM8996_AIF1RX_CHAN5_SPACING_WIDTH 6 /* AIF1RX_CHAN5_SPACING - [14:9] */ | ||
2069 | #define WM8996_AIF1RX_CHAN5_SLOTS_MASK 0x01C0 /* AIF1RX_CHAN5_SLOTS - [8:6] */ | ||
2070 | #define WM8996_AIF1RX_CHAN5_SLOTS_SHIFT 6 /* AIF1RX_CHAN5_SLOTS - [8:6] */ | ||
2071 | #define WM8996_AIF1RX_CHAN5_SLOTS_WIDTH 3 /* AIF1RX_CHAN5_SLOTS - [8:6] */ | ||
2072 | #define WM8996_AIF1RX_CHAN5_START_SLOT_MASK 0x003F /* AIF1RX_CHAN5_START_SLOT - [5:0] */ | ||
2073 | #define WM8996_AIF1RX_CHAN5_START_SLOT_SHIFT 0 /* AIF1RX_CHAN5_START_SLOT - [5:0] */ | ||
2074 | #define WM8996_AIF1RX_CHAN5_START_SLOT_WIDTH 6 /* AIF1RX_CHAN5_START_SLOT - [5:0] */ | ||
2075 | |||
2076 | /* | ||
2077 | * R789 (0x315) - AIF1RX Mono Configuration | ||
2078 | */ | ||
2079 | #define WM8996_AIF1RX_CHAN4_MONO_MODE 0x0004 /* AIF1RX_CHAN4_MONO_MODE */ | ||
2080 | #define WM8996_AIF1RX_CHAN4_MONO_MODE_MASK 0x0004 /* AIF1RX_CHAN4_MONO_MODE */ | ||
2081 | #define WM8996_AIF1RX_CHAN4_MONO_MODE_SHIFT 2 /* AIF1RX_CHAN4_MONO_MODE */ | ||
2082 | #define WM8996_AIF1RX_CHAN4_MONO_MODE_WIDTH 1 /* AIF1RX_CHAN4_MONO_MODE */ | ||
2083 | #define WM8996_AIF1RX_CHAN2_MONO_MODE 0x0002 /* AIF1RX_CHAN2_MONO_MODE */ | ||
2084 | #define WM8996_AIF1RX_CHAN2_MONO_MODE_MASK 0x0002 /* AIF1RX_CHAN2_MONO_MODE */ | ||
2085 | #define WM8996_AIF1RX_CHAN2_MONO_MODE_SHIFT 1 /* AIF1RX_CHAN2_MONO_MODE */ | ||
2086 | #define WM8996_AIF1RX_CHAN2_MONO_MODE_WIDTH 1 /* AIF1RX_CHAN2_MONO_MODE */ | ||
2087 | #define WM8996_AIF1RX_CHAN0_MONO_MODE 0x0001 /* AIF1RX_CHAN0_MONO_MODE */ | ||
2088 | #define WM8996_AIF1RX_CHAN0_MONO_MODE_MASK 0x0001 /* AIF1RX_CHAN0_MONO_MODE */ | ||
2089 | #define WM8996_AIF1RX_CHAN0_MONO_MODE_SHIFT 0 /* AIF1RX_CHAN0_MONO_MODE */ | ||
2090 | #define WM8996_AIF1RX_CHAN0_MONO_MODE_WIDTH 1 /* AIF1RX_CHAN0_MONO_MODE */ | ||
2091 | |||
2092 | /* | ||
2093 | * R794 (0x31A) - AIF1TX Test | ||
2094 | */ | ||
2095 | #define WM8996_AIF1TX45_DITHER_ENA 0x0004 /* AIF1TX45_DITHER_ENA */ | ||
2096 | #define WM8996_AIF1TX45_DITHER_ENA_MASK 0x0004 /* AIF1TX45_DITHER_ENA */ | ||
2097 | #define WM8996_AIF1TX45_DITHER_ENA_SHIFT 2 /* AIF1TX45_DITHER_ENA */ | ||
2098 | #define WM8996_AIF1TX45_DITHER_ENA_WIDTH 1 /* AIF1TX45_DITHER_ENA */ | ||
2099 | #define WM8996_AIF1TX23_DITHER_ENA 0x0002 /* AIF1TX23_DITHER_ENA */ | ||
2100 | #define WM8996_AIF1TX23_DITHER_ENA_MASK 0x0002 /* AIF1TX23_DITHER_ENA */ | ||
2101 | #define WM8996_AIF1TX23_DITHER_ENA_SHIFT 1 /* AIF1TX23_DITHER_ENA */ | ||
2102 | #define WM8996_AIF1TX23_DITHER_ENA_WIDTH 1 /* AIF1TX23_DITHER_ENA */ | ||
2103 | #define WM8996_AIF1TX01_DITHER_ENA 0x0001 /* AIF1TX01_DITHER_ENA */ | ||
2104 | #define WM8996_AIF1TX01_DITHER_ENA_MASK 0x0001 /* AIF1TX01_DITHER_ENA */ | ||
2105 | #define WM8996_AIF1TX01_DITHER_ENA_SHIFT 0 /* AIF1TX01_DITHER_ENA */ | ||
2106 | #define WM8996_AIF1TX01_DITHER_ENA_WIDTH 1 /* AIF1TX01_DITHER_ENA */ | ||
2107 | |||
2108 | /* | ||
2109 | * R800 (0x320) - AIF2 Control | ||
2110 | */ | ||
2111 | #define WM8996_AIF2_TRI 0x0004 /* AIF2_TRI */ | ||
2112 | #define WM8996_AIF2_TRI_MASK 0x0004 /* AIF2_TRI */ | ||
2113 | #define WM8996_AIF2_TRI_SHIFT 2 /* AIF2_TRI */ | ||
2114 | #define WM8996_AIF2_TRI_WIDTH 1 /* AIF2_TRI */ | ||
2115 | #define WM8996_AIF2_FMT_MASK 0x0003 /* AIF2_FMT - [1:0] */ | ||
2116 | #define WM8996_AIF2_FMT_SHIFT 0 /* AIF2_FMT - [1:0] */ | ||
2117 | #define WM8996_AIF2_FMT_WIDTH 2 /* AIF2_FMT - [1:0] */ | ||
2118 | |||
2119 | /* | ||
2120 | * R801 (0x321) - AIF2 BCLK | ||
2121 | */ | ||
2122 | #define WM8996_AIF2_BCLK_INV 0x0400 /* AIF2_BCLK_INV */ | ||
2123 | #define WM8996_AIF2_BCLK_INV_MASK 0x0400 /* AIF2_BCLK_INV */ | ||
2124 | #define WM8996_AIF2_BCLK_INV_SHIFT 10 /* AIF2_BCLK_INV */ | ||
2125 | #define WM8996_AIF2_BCLK_INV_WIDTH 1 /* AIF2_BCLK_INV */ | ||
2126 | #define WM8996_AIF2_BCLK_FRC 0x0200 /* AIF2_BCLK_FRC */ | ||
2127 | #define WM8996_AIF2_BCLK_FRC_MASK 0x0200 /* AIF2_BCLK_FRC */ | ||
2128 | #define WM8996_AIF2_BCLK_FRC_SHIFT 9 /* AIF2_BCLK_FRC */ | ||
2129 | #define WM8996_AIF2_BCLK_FRC_WIDTH 1 /* AIF2_BCLK_FRC */ | ||
2130 | #define WM8996_AIF2_BCLK_MSTR 0x0100 /* AIF2_BCLK_MSTR */ | ||
2131 | #define WM8996_AIF2_BCLK_MSTR_MASK 0x0100 /* AIF2_BCLK_MSTR */ | ||
2132 | #define WM8996_AIF2_BCLK_MSTR_SHIFT 8 /* AIF2_BCLK_MSTR */ | ||
2133 | #define WM8996_AIF2_BCLK_MSTR_WIDTH 1 /* AIF2_BCLK_MSTR */ | ||
2134 | #define WM8996_AIF2_BCLK_DIV_MASK 0x000F /* AIF2_BCLK_DIV - [3:0] */ | ||
2135 | #define WM8996_AIF2_BCLK_DIV_SHIFT 0 /* AIF2_BCLK_DIV - [3:0] */ | ||
2136 | #define WM8996_AIF2_BCLK_DIV_WIDTH 4 /* AIF2_BCLK_DIV - [3:0] */ | ||
2137 | |||
2138 | /* | ||
2139 | * R802 (0x322) - AIF2 TX LRCLK(1) | ||
2140 | */ | ||
2141 | #define WM8996_AIF2TX_RATE_MASK 0x07FF /* AIF2TX_RATE - [10:0] */ | ||
2142 | #define WM8996_AIF2TX_RATE_SHIFT 0 /* AIF2TX_RATE - [10:0] */ | ||
2143 | #define WM8996_AIF2TX_RATE_WIDTH 11 /* AIF2TX_RATE - [10:0] */ | ||
2144 | |||
2145 | /* | ||
2146 | * R803 (0x323) - AIF2 TX LRCLK(2) | ||
2147 | */ | ||
2148 | #define WM8996_AIF2TX_LRCLK_MODE 0x0008 /* AIF2TX_LRCLK_MODE */ | ||
2149 | #define WM8996_AIF2TX_LRCLK_MODE_MASK 0x0008 /* AIF2TX_LRCLK_MODE */ | ||
2150 | #define WM8996_AIF2TX_LRCLK_MODE_SHIFT 3 /* AIF2TX_LRCLK_MODE */ | ||
2151 | #define WM8996_AIF2TX_LRCLK_MODE_WIDTH 1 /* AIF2TX_LRCLK_MODE */ | ||
2152 | #define WM8996_AIF2TX_LRCLK_INV 0x0004 /* AIF2TX_LRCLK_INV */ | ||
2153 | #define WM8996_AIF2TX_LRCLK_INV_MASK 0x0004 /* AIF2TX_LRCLK_INV */ | ||
2154 | #define WM8996_AIF2TX_LRCLK_INV_SHIFT 2 /* AIF2TX_LRCLK_INV */ | ||
2155 | #define WM8996_AIF2TX_LRCLK_INV_WIDTH 1 /* AIF2TX_LRCLK_INV */ | ||
2156 | #define WM8996_AIF2TX_LRCLK_FRC 0x0002 /* AIF2TX_LRCLK_FRC */ | ||
2157 | #define WM8996_AIF2TX_LRCLK_FRC_MASK 0x0002 /* AIF2TX_LRCLK_FRC */ | ||
2158 | #define WM8996_AIF2TX_LRCLK_FRC_SHIFT 1 /* AIF2TX_LRCLK_FRC */ | ||
2159 | #define WM8996_AIF2TX_LRCLK_FRC_WIDTH 1 /* AIF2TX_LRCLK_FRC */ | ||
2160 | #define WM8996_AIF2TX_LRCLK_MSTR 0x0001 /* AIF2TX_LRCLK_MSTR */ | ||
2161 | #define WM8996_AIF2TX_LRCLK_MSTR_MASK 0x0001 /* AIF2TX_LRCLK_MSTR */ | ||
2162 | #define WM8996_AIF2TX_LRCLK_MSTR_SHIFT 0 /* AIF2TX_LRCLK_MSTR */ | ||
2163 | #define WM8996_AIF2TX_LRCLK_MSTR_WIDTH 1 /* AIF2TX_LRCLK_MSTR */ | ||
2164 | |||
2165 | /* | ||
2166 | * R804 (0x324) - AIF2 RX LRCLK(1) | ||
2167 | */ | ||
2168 | #define WM8996_AIF2RX_RATE_MASK 0x07FF /* AIF2RX_RATE - [10:0] */ | ||
2169 | #define WM8996_AIF2RX_RATE_SHIFT 0 /* AIF2RX_RATE - [10:0] */ | ||
2170 | #define WM8996_AIF2RX_RATE_WIDTH 11 /* AIF2RX_RATE - [10:0] */ | ||
2171 | |||
2172 | /* | ||
2173 | * R805 (0x325) - AIF2 RX LRCLK(2) | ||
2174 | */ | ||
2175 | #define WM8996_AIF2RX_LRCLK_INV 0x0004 /* AIF2RX_LRCLK_INV */ | ||
2176 | #define WM8996_AIF2RX_LRCLK_INV_MASK 0x0004 /* AIF2RX_LRCLK_INV */ | ||
2177 | #define WM8996_AIF2RX_LRCLK_INV_SHIFT 2 /* AIF2RX_LRCLK_INV */ | ||
2178 | #define WM8996_AIF2RX_LRCLK_INV_WIDTH 1 /* AIF2RX_LRCLK_INV */ | ||
2179 | #define WM8996_AIF2RX_LRCLK_FRC 0x0002 /* AIF2RX_LRCLK_FRC */ | ||
2180 | #define WM8996_AIF2RX_LRCLK_FRC_MASK 0x0002 /* AIF2RX_LRCLK_FRC */ | ||
2181 | #define WM8996_AIF2RX_LRCLK_FRC_SHIFT 1 /* AIF2RX_LRCLK_FRC */ | ||
2182 | #define WM8996_AIF2RX_LRCLK_FRC_WIDTH 1 /* AIF2RX_LRCLK_FRC */ | ||
2183 | #define WM8996_AIF2RX_LRCLK_MSTR 0x0001 /* AIF2RX_LRCLK_MSTR */ | ||
2184 | #define WM8996_AIF2RX_LRCLK_MSTR_MASK 0x0001 /* AIF2RX_LRCLK_MSTR */ | ||
2185 | #define WM8996_AIF2RX_LRCLK_MSTR_SHIFT 0 /* AIF2RX_LRCLK_MSTR */ | ||
2186 | #define WM8996_AIF2RX_LRCLK_MSTR_WIDTH 1 /* AIF2RX_LRCLK_MSTR */ | ||
2187 | |||
2188 | /* | ||
2189 | * R806 (0x326) - AIF2TX Data Configuration (1) | ||
2190 | */ | ||
2191 | #define WM8996_AIF2TX_WL_MASK 0xFF00 /* AIF2TX_WL - [15:8] */ | ||
2192 | #define WM8996_AIF2TX_WL_SHIFT 8 /* AIF2TX_WL - [15:8] */ | ||
2193 | #define WM8996_AIF2TX_WL_WIDTH 8 /* AIF2TX_WL - [15:8] */ | ||
2194 | #define WM8996_AIF2TX_SLOT_LEN_MASK 0x00FF /* AIF2TX_SLOT_LEN - [7:0] */ | ||
2195 | #define WM8996_AIF2TX_SLOT_LEN_SHIFT 0 /* AIF2TX_SLOT_LEN - [7:0] */ | ||
2196 | #define WM8996_AIF2TX_SLOT_LEN_WIDTH 8 /* AIF2TX_SLOT_LEN - [7:0] */ | ||
2197 | |||
2198 | /* | ||
2199 | * R807 (0x327) - AIF2TX Data Configuration (2) | ||
2200 | */ | ||
2201 | #define WM8996_AIF2TX_DAT_TRI 0x0001 /* AIF2TX_DAT_TRI */ | ||
2202 | #define WM8996_AIF2TX_DAT_TRI_MASK 0x0001 /* AIF2TX_DAT_TRI */ | ||
2203 | #define WM8996_AIF2TX_DAT_TRI_SHIFT 0 /* AIF2TX_DAT_TRI */ | ||
2204 | #define WM8996_AIF2TX_DAT_TRI_WIDTH 1 /* AIF2TX_DAT_TRI */ | ||
2205 | |||
2206 | /* | ||
2207 | * R808 (0x328) - AIF2RX Data Configuration | ||
2208 | */ | ||
2209 | #define WM8996_AIF2RX_WL_MASK 0xFF00 /* AIF2RX_WL - [15:8] */ | ||
2210 | #define WM8996_AIF2RX_WL_SHIFT 8 /* AIF2RX_WL - [15:8] */ | ||
2211 | #define WM8996_AIF2RX_WL_WIDTH 8 /* AIF2RX_WL - [15:8] */ | ||
2212 | #define WM8996_AIF2RX_SLOT_LEN_MASK 0x00FF /* AIF2RX_SLOT_LEN - [7:0] */ | ||
2213 | #define WM8996_AIF2RX_SLOT_LEN_SHIFT 0 /* AIF2RX_SLOT_LEN - [7:0] */ | ||
2214 | #define WM8996_AIF2RX_SLOT_LEN_WIDTH 8 /* AIF2RX_SLOT_LEN - [7:0] */ | ||
2215 | |||
2216 | /* | ||
2217 | * R809 (0x329) - AIF2TX Channel 0 Configuration | ||
2218 | */ | ||
2219 | #define WM8996_AIF2TX_CHAN0_DAT_INV 0x8000 /* AIF2TX_CHAN0_DAT_INV */ | ||
2220 | #define WM8996_AIF2TX_CHAN0_DAT_INV_MASK 0x8000 /* AIF2TX_CHAN0_DAT_INV */ | ||
2221 | #define WM8996_AIF2TX_CHAN0_DAT_INV_SHIFT 15 /* AIF2TX_CHAN0_DAT_INV */ | ||
2222 | #define WM8996_AIF2TX_CHAN0_DAT_INV_WIDTH 1 /* AIF2TX_CHAN0_DAT_INV */ | ||
2223 | #define WM8996_AIF2TX_CHAN0_SPACING_MASK 0x7E00 /* AIF2TX_CHAN0_SPACING - [14:9] */ | ||
2224 | #define WM8996_AIF2TX_CHAN0_SPACING_SHIFT 9 /* AIF2TX_CHAN0_SPACING - [14:9] */ | ||
2225 | #define WM8996_AIF2TX_CHAN0_SPACING_WIDTH 6 /* AIF2TX_CHAN0_SPACING - [14:9] */ | ||
2226 | #define WM8996_AIF2TX_CHAN0_SLOTS_MASK 0x01C0 /* AIF2TX_CHAN0_SLOTS - [8:6] */ | ||
2227 | #define WM8996_AIF2TX_CHAN0_SLOTS_SHIFT 6 /* AIF2TX_CHAN0_SLOTS - [8:6] */ | ||
2228 | #define WM8996_AIF2TX_CHAN0_SLOTS_WIDTH 3 /* AIF2TX_CHAN0_SLOTS - [8:6] */ | ||
2229 | #define WM8996_AIF2TX_CHAN0_START_SLOT_MASK 0x003F /* AIF2TX_CHAN0_START_SLOT - [5:0] */ | ||
2230 | #define WM8996_AIF2TX_CHAN0_START_SLOT_SHIFT 0 /* AIF2TX_CHAN0_START_SLOT - [5:0] */ | ||
2231 | #define WM8996_AIF2TX_CHAN0_START_SLOT_WIDTH 6 /* AIF2TX_CHAN0_START_SLOT - [5:0] */ | ||
2232 | |||
2233 | /* | ||
2234 | * R810 (0x32A) - AIF2TX Channel 1 Configuration | ||
2235 | */ | ||
2236 | #define WM8996_AIF2TX_CHAN1_DAT_INV 0x8000 /* AIF2TX_CHAN1_DAT_INV */ | ||
2237 | #define WM8996_AIF2TX_CHAN1_DAT_INV_MASK 0x8000 /* AIF2TX_CHAN1_DAT_INV */ | ||
2238 | #define WM8996_AIF2TX_CHAN1_DAT_INV_SHIFT 15 /* AIF2TX_CHAN1_DAT_INV */ | ||
2239 | #define WM8996_AIF2TX_CHAN1_DAT_INV_WIDTH 1 /* AIF2TX_CHAN1_DAT_INV */ | ||
2240 | #define WM8996_AIF2TX_CHAN1_SPACING_MASK 0x7E00 /* AIF2TX_CHAN1_SPACING - [14:9] */ | ||
2241 | #define WM8996_AIF2TX_CHAN1_SPACING_SHIFT 9 /* AIF2TX_CHAN1_SPACING - [14:9] */ | ||
2242 | #define WM8996_AIF2TX_CHAN1_SPACING_WIDTH 6 /* AIF2TX_CHAN1_SPACING - [14:9] */ | ||
2243 | #define WM8996_AIF2TX_CHAN1_SLOTS_MASK 0x01C0 /* AIF2TX_CHAN1_SLOTS - [8:6] */ | ||
2244 | #define WM8996_AIF2TX_CHAN1_SLOTS_SHIFT 6 /* AIF2TX_CHAN1_SLOTS - [8:6] */ | ||
2245 | #define WM8996_AIF2TX_CHAN1_SLOTS_WIDTH 3 /* AIF2TX_CHAN1_SLOTS - [8:6] */ | ||
2246 | #define WM8996_AIF2TX_CHAN1_START_SLOT_MASK 0x003F /* AIF2TX_CHAN1_START_SLOT - [5:0] */ | ||
2247 | #define WM8996_AIF2TX_CHAN1_START_SLOT_SHIFT 0 /* AIF2TX_CHAN1_START_SLOT - [5:0] */ | ||
2248 | #define WM8996_AIF2TX_CHAN1_START_SLOT_WIDTH 6 /* AIF2TX_CHAN1_START_SLOT - [5:0] */ | ||
2249 | |||
2250 | /* | ||
2251 | * R811 (0x32B) - AIF2RX Channel 0 Configuration | ||
2252 | */ | ||
2253 | #define WM8996_AIF2RX_CHAN0_DAT_INV 0x8000 /* AIF2RX_CHAN0_DAT_INV */ | ||
2254 | #define WM8996_AIF2RX_CHAN0_DAT_INV_MASK 0x8000 /* AIF2RX_CHAN0_DAT_INV */ | ||
2255 | #define WM8996_AIF2RX_CHAN0_DAT_INV_SHIFT 15 /* AIF2RX_CHAN0_DAT_INV */ | ||
2256 | #define WM8996_AIF2RX_CHAN0_DAT_INV_WIDTH 1 /* AIF2RX_CHAN0_DAT_INV */ | ||
2257 | #define WM8996_AIF2RX_CHAN0_SPACING_MASK 0x7E00 /* AIF2RX_CHAN0_SPACING - [14:9] */ | ||
2258 | #define WM8996_AIF2RX_CHAN0_SPACING_SHIFT 9 /* AIF2RX_CHAN0_SPACING - [14:9] */ | ||
2259 | #define WM8996_AIF2RX_CHAN0_SPACING_WIDTH 6 /* AIF2RX_CHAN0_SPACING - [14:9] */ | ||
2260 | #define WM8996_AIF2RX_CHAN0_SLOTS_MASK 0x01C0 /* AIF2RX_CHAN0_SLOTS - [8:6] */ | ||
2261 | #define WM8996_AIF2RX_CHAN0_SLOTS_SHIFT 6 /* AIF2RX_CHAN0_SLOTS - [8:6] */ | ||
2262 | #define WM8996_AIF2RX_CHAN0_SLOTS_WIDTH 3 /* AIF2RX_CHAN0_SLOTS - [8:6] */ | ||
2263 | #define WM8996_AIF2RX_CHAN0_START_SLOT_MASK 0x003F /* AIF2RX_CHAN0_START_SLOT - [5:0] */ | ||
2264 | #define WM8996_AIF2RX_CHAN0_START_SLOT_SHIFT 0 /* AIF2RX_CHAN0_START_SLOT - [5:0] */ | ||
2265 | #define WM8996_AIF2RX_CHAN0_START_SLOT_WIDTH 6 /* AIF2RX_CHAN0_START_SLOT - [5:0] */ | ||
2266 | |||
2267 | /* | ||
2268 | * R812 (0x32C) - AIF2RX Channel 1 Configuration | ||
2269 | */ | ||
2270 | #define WM8996_AIF2RX_CHAN1_DAT_INV 0x8000 /* AIF2RX_CHAN1_DAT_INV */ | ||
2271 | #define WM8996_AIF2RX_CHAN1_DAT_INV_MASK 0x8000 /* AIF2RX_CHAN1_DAT_INV */ | ||
2272 | #define WM8996_AIF2RX_CHAN1_DAT_INV_SHIFT 15 /* AIF2RX_CHAN1_DAT_INV */ | ||
2273 | #define WM8996_AIF2RX_CHAN1_DAT_INV_WIDTH 1 /* AIF2RX_CHAN1_DAT_INV */ | ||
2274 | #define WM8996_AIF2RX_CHAN1_SPACING_MASK 0x7E00 /* AIF2RX_CHAN1_SPACING - [14:9] */ | ||
2275 | #define WM8996_AIF2RX_CHAN1_SPACING_SHIFT 9 /* AIF2RX_CHAN1_SPACING - [14:9] */ | ||
2276 | #define WM8996_AIF2RX_CHAN1_SPACING_WIDTH 6 /* AIF2RX_CHAN1_SPACING - [14:9] */ | ||
2277 | #define WM8996_AIF2RX_CHAN1_SLOTS_MASK 0x01C0 /* AIF2RX_CHAN1_SLOTS - [8:6] */ | ||
2278 | #define WM8996_AIF2RX_CHAN1_SLOTS_SHIFT 6 /* AIF2RX_CHAN1_SLOTS - [8:6] */ | ||
2279 | #define WM8996_AIF2RX_CHAN1_SLOTS_WIDTH 3 /* AIF2RX_CHAN1_SLOTS - [8:6] */ | ||
2280 | #define WM8996_AIF2RX_CHAN1_START_SLOT_MASK 0x003F /* AIF2RX_CHAN1_START_SLOT - [5:0] */ | ||
2281 | #define WM8996_AIF2RX_CHAN1_START_SLOT_SHIFT 0 /* AIF2RX_CHAN1_START_SLOT - [5:0] */ | ||
2282 | #define WM8996_AIF2RX_CHAN1_START_SLOT_WIDTH 6 /* AIF2RX_CHAN1_START_SLOT - [5:0] */ | ||
2283 | |||
2284 | /* | ||
2285 | * R813 (0x32D) - AIF2RX Mono Configuration | ||
2286 | */ | ||
2287 | #define WM8996_AIF2RX_CHAN0_MONO_MODE 0x0001 /* AIF2RX_CHAN0_MONO_MODE */ | ||
2288 | #define WM8996_AIF2RX_CHAN0_MONO_MODE_MASK 0x0001 /* AIF2RX_CHAN0_MONO_MODE */ | ||
2289 | #define WM8996_AIF2RX_CHAN0_MONO_MODE_SHIFT 0 /* AIF2RX_CHAN0_MONO_MODE */ | ||
2290 | #define WM8996_AIF2RX_CHAN0_MONO_MODE_WIDTH 1 /* AIF2RX_CHAN0_MONO_MODE */ | ||
2291 | |||
2292 | /* | ||
2293 | * R815 (0x32F) - AIF2TX Test | ||
2294 | */ | ||
2295 | #define WM8996_AIF2TX_DITHER_ENA 0x0001 /* AIF2TX_DITHER_ENA */ | ||
2296 | #define WM8996_AIF2TX_DITHER_ENA_MASK 0x0001 /* AIF2TX_DITHER_ENA */ | ||
2297 | #define WM8996_AIF2TX_DITHER_ENA_SHIFT 0 /* AIF2TX_DITHER_ENA */ | ||
2298 | #define WM8996_AIF2TX_DITHER_ENA_WIDTH 1 /* AIF2TX_DITHER_ENA */ | ||
2299 | |||
2300 | /* | ||
2301 | * R1024 (0x400) - DSP1 TX Left Volume | ||
2302 | */ | ||
2303 | #define WM8996_DSP1TX_VU 0x0100 /* DSP1TX_VU */ | ||
2304 | #define WM8996_DSP1TX_VU_MASK 0x0100 /* DSP1TX_VU */ | ||
2305 | #define WM8996_DSP1TX_VU_SHIFT 8 /* DSP1TX_VU */ | ||
2306 | #define WM8996_DSP1TX_VU_WIDTH 1 /* DSP1TX_VU */ | ||
2307 | #define WM8996_DSP1TXL_VOL_MASK 0x00FF /* DSP1TXL_VOL - [7:0] */ | ||
2308 | #define WM8996_DSP1TXL_VOL_SHIFT 0 /* DSP1TXL_VOL - [7:0] */ | ||
2309 | #define WM8996_DSP1TXL_VOL_WIDTH 8 /* DSP1TXL_VOL - [7:0] */ | ||
2310 | |||
2311 | /* | ||
2312 | * R1025 (0x401) - DSP1 TX Right Volume | ||
2313 | */ | ||
2314 | #define WM8996_DSP1TX_VU 0x0100 /* DSP1TX_VU */ | ||
2315 | #define WM8996_DSP1TX_VU_MASK 0x0100 /* DSP1TX_VU */ | ||
2316 | #define WM8996_DSP1TX_VU_SHIFT 8 /* DSP1TX_VU */ | ||
2317 | #define WM8996_DSP1TX_VU_WIDTH 1 /* DSP1TX_VU */ | ||
2318 | #define WM8996_DSP1TXR_VOL_MASK 0x00FF /* DSP1TXR_VOL - [7:0] */ | ||
2319 | #define WM8996_DSP1TXR_VOL_SHIFT 0 /* DSP1TXR_VOL - [7:0] */ | ||
2320 | #define WM8996_DSP1TXR_VOL_WIDTH 8 /* DSP1TXR_VOL - [7:0] */ | ||
2321 | |||
2322 | /* | ||
2323 | * R1026 (0x402) - DSP1 RX Left Volume | ||
2324 | */ | ||
2325 | #define WM8996_DSP1RX_VU 0x0100 /* DSP1RX_VU */ | ||
2326 | #define WM8996_DSP1RX_VU_MASK 0x0100 /* DSP1RX_VU */ | ||
2327 | #define WM8996_DSP1RX_VU_SHIFT 8 /* DSP1RX_VU */ | ||
2328 | #define WM8996_DSP1RX_VU_WIDTH 1 /* DSP1RX_VU */ | ||
2329 | #define WM8996_DSP1RXL_VOL_MASK 0x00FF /* DSP1RXL_VOL - [7:0] */ | ||
2330 | #define WM8996_DSP1RXL_VOL_SHIFT 0 /* DSP1RXL_VOL - [7:0] */ | ||
2331 | #define WM8996_DSP1RXL_VOL_WIDTH 8 /* DSP1RXL_VOL - [7:0] */ | ||
2332 | |||
2333 | /* | ||
2334 | * R1027 (0x403) - DSP1 RX Right Volume | ||
2335 | */ | ||
2336 | #define WM8996_DSP1RX_VU 0x0100 /* DSP1RX_VU */ | ||
2337 | #define WM8996_DSP1RX_VU_MASK 0x0100 /* DSP1RX_VU */ | ||
2338 | #define WM8996_DSP1RX_VU_SHIFT 8 /* DSP1RX_VU */ | ||
2339 | #define WM8996_DSP1RX_VU_WIDTH 1 /* DSP1RX_VU */ | ||
2340 | #define WM8996_DSP1RXR_VOL_MASK 0x00FF /* DSP1RXR_VOL - [7:0] */ | ||
2341 | #define WM8996_DSP1RXR_VOL_SHIFT 0 /* DSP1RXR_VOL - [7:0] */ | ||
2342 | #define WM8996_DSP1RXR_VOL_WIDTH 8 /* DSP1RXR_VOL - [7:0] */ | ||
2343 | |||
2344 | /* | ||
2345 | * R1040 (0x410) - DSP1 TX Filters | ||
2346 | */ | ||
2347 | #define WM8996_DSP1TX_NF 0x2000 /* DSP1TX_NF */ | ||
2348 | #define WM8996_DSP1TX_NF_MASK 0x2000 /* DSP1TX_NF */ | ||
2349 | #define WM8996_DSP1TX_NF_SHIFT 13 /* DSP1TX_NF */ | ||
2350 | #define WM8996_DSP1TX_NF_WIDTH 1 /* DSP1TX_NF */ | ||
2351 | #define WM8996_DSP1TXL_HPF 0x1000 /* DSP1TXL_HPF */ | ||
2352 | #define WM8996_DSP1TXL_HPF_MASK 0x1000 /* DSP1TXL_HPF */ | ||
2353 | #define WM8996_DSP1TXL_HPF_SHIFT 12 /* DSP1TXL_HPF */ | ||
2354 | #define WM8996_DSP1TXL_HPF_WIDTH 1 /* DSP1TXL_HPF */ | ||
2355 | #define WM8996_DSP1TXR_HPF 0x0800 /* DSP1TXR_HPF */ | ||
2356 | #define WM8996_DSP1TXR_HPF_MASK 0x0800 /* DSP1TXR_HPF */ | ||
2357 | #define WM8996_DSP1TXR_HPF_SHIFT 11 /* DSP1TXR_HPF */ | ||
2358 | #define WM8996_DSP1TXR_HPF_WIDTH 1 /* DSP1TXR_HPF */ | ||
2359 | #define WM8996_DSP1TX_HPF_MODE_MASK 0x0018 /* DSP1TX_HPF_MODE - [4:3] */ | ||
2360 | #define WM8996_DSP1TX_HPF_MODE_SHIFT 3 /* DSP1TX_HPF_MODE - [4:3] */ | ||
2361 | #define WM8996_DSP1TX_HPF_MODE_WIDTH 2 /* DSP1TX_HPF_MODE - [4:3] */ | ||
2362 | #define WM8996_DSP1TX_HPF_CUT_MASK 0x0007 /* DSP1TX_HPF_CUT - [2:0] */ | ||
2363 | #define WM8996_DSP1TX_HPF_CUT_SHIFT 0 /* DSP1TX_HPF_CUT - [2:0] */ | ||
2364 | #define WM8996_DSP1TX_HPF_CUT_WIDTH 3 /* DSP1TX_HPF_CUT - [2:0] */ | ||
2365 | |||
2366 | /* | ||
2367 | * R1056 (0x420) - DSP1 RX Filters (1) | ||
2368 | */ | ||
2369 | #define WM8996_DSP1RX_MUTE 0x0200 /* DSP1RX_MUTE */ | ||
2370 | #define WM8996_DSP1RX_MUTE_MASK 0x0200 /* DSP1RX_MUTE */ | ||
2371 | #define WM8996_DSP1RX_MUTE_SHIFT 9 /* DSP1RX_MUTE */ | ||
2372 | #define WM8996_DSP1RX_MUTE_WIDTH 1 /* DSP1RX_MUTE */ | ||
2373 | #define WM8996_DSP1RX_MONO 0x0080 /* DSP1RX_MONO */ | ||
2374 | #define WM8996_DSP1RX_MONO_MASK 0x0080 /* DSP1RX_MONO */ | ||
2375 | #define WM8996_DSP1RX_MONO_SHIFT 7 /* DSP1RX_MONO */ | ||
2376 | #define WM8996_DSP1RX_MONO_WIDTH 1 /* DSP1RX_MONO */ | ||
2377 | #define WM8996_DSP1RX_MUTERATE 0x0020 /* DSP1RX_MUTERATE */ | ||
2378 | #define WM8996_DSP1RX_MUTERATE_MASK 0x0020 /* DSP1RX_MUTERATE */ | ||
2379 | #define WM8996_DSP1RX_MUTERATE_SHIFT 5 /* DSP1RX_MUTERATE */ | ||
2380 | #define WM8996_DSP1RX_MUTERATE_WIDTH 1 /* DSP1RX_MUTERATE */ | ||
2381 | #define WM8996_DSP1RX_UNMUTE_RAMP 0x0010 /* DSP1RX_UNMUTE_RAMP */ | ||
2382 | #define WM8996_DSP1RX_UNMUTE_RAMP_MASK 0x0010 /* DSP1RX_UNMUTE_RAMP */ | ||
2383 | #define WM8996_DSP1RX_UNMUTE_RAMP_SHIFT 4 /* DSP1RX_UNMUTE_RAMP */ | ||
2384 | #define WM8996_DSP1RX_UNMUTE_RAMP_WIDTH 1 /* DSP1RX_UNMUTE_RAMP */ | ||
2385 | |||
2386 | /* | ||
2387 | * R1057 (0x421) - DSP1 RX Filters (2) | ||
2388 | */ | ||
2389 | #define WM8996_DSP1RX_3D_GAIN_MASK 0x3E00 /* DSP1RX_3D_GAIN - [13:9] */ | ||
2390 | #define WM8996_DSP1RX_3D_GAIN_SHIFT 9 /* DSP1RX_3D_GAIN - [13:9] */ | ||
2391 | #define WM8996_DSP1RX_3D_GAIN_WIDTH 5 /* DSP1RX_3D_GAIN - [13:9] */ | ||
2392 | #define WM8996_DSP1RX_3D_ENA 0x0100 /* DSP1RX_3D_ENA */ | ||
2393 | #define WM8996_DSP1RX_3D_ENA_MASK 0x0100 /* DSP1RX_3D_ENA */ | ||
2394 | #define WM8996_DSP1RX_3D_ENA_SHIFT 8 /* DSP1RX_3D_ENA */ | ||
2395 | #define WM8996_DSP1RX_3D_ENA_WIDTH 1 /* DSP1RX_3D_ENA */ | ||
2396 | |||
2397 | /* | ||
2398 | * R1088 (0x440) - DSP1 DRC (1) | ||
2399 | */ | ||
2400 | #define WM8996_DSP1DRC_SIG_DET_RMS_MASK 0xF800 /* DSP1DRC_SIG_DET_RMS - [15:11] */ | ||
2401 | #define WM8996_DSP1DRC_SIG_DET_RMS_SHIFT 11 /* DSP1DRC_SIG_DET_RMS - [15:11] */ | ||
2402 | #define WM8996_DSP1DRC_SIG_DET_RMS_WIDTH 5 /* DSP1DRC_SIG_DET_RMS - [15:11] */ | ||
2403 | #define WM8996_DSP1DRC_SIG_DET_PK_MASK 0x0600 /* DSP1DRC_SIG_DET_PK - [10:9] */ | ||
2404 | #define WM8996_DSP1DRC_SIG_DET_PK_SHIFT 9 /* DSP1DRC_SIG_DET_PK - [10:9] */ | ||
2405 | #define WM8996_DSP1DRC_SIG_DET_PK_WIDTH 2 /* DSP1DRC_SIG_DET_PK - [10:9] */ | ||
2406 | #define WM8996_DSP1DRC_NG_ENA 0x0100 /* DSP1DRC_NG_ENA */ | ||
2407 | #define WM8996_DSP1DRC_NG_ENA_MASK 0x0100 /* DSP1DRC_NG_ENA */ | ||
2408 | #define WM8996_DSP1DRC_NG_ENA_SHIFT 8 /* DSP1DRC_NG_ENA */ | ||
2409 | #define WM8996_DSP1DRC_NG_ENA_WIDTH 1 /* DSP1DRC_NG_ENA */ | ||
2410 | #define WM8996_DSP1DRC_SIG_DET_MODE 0x0080 /* DSP1DRC_SIG_DET_MODE */ | ||
2411 | #define WM8996_DSP1DRC_SIG_DET_MODE_MASK 0x0080 /* DSP1DRC_SIG_DET_MODE */ | ||
2412 | #define WM8996_DSP1DRC_SIG_DET_MODE_SHIFT 7 /* DSP1DRC_SIG_DET_MODE */ | ||
2413 | #define WM8996_DSP1DRC_SIG_DET_MODE_WIDTH 1 /* DSP1DRC_SIG_DET_MODE */ | ||
2414 | #define WM8996_DSP1DRC_SIG_DET 0x0040 /* DSP1DRC_SIG_DET */ | ||
2415 | #define WM8996_DSP1DRC_SIG_DET_MASK 0x0040 /* DSP1DRC_SIG_DET */ | ||
2416 | #define WM8996_DSP1DRC_SIG_DET_SHIFT 6 /* DSP1DRC_SIG_DET */ | ||
2417 | #define WM8996_DSP1DRC_SIG_DET_WIDTH 1 /* DSP1DRC_SIG_DET */ | ||
2418 | #define WM8996_DSP1DRC_KNEE2_OP_ENA 0x0020 /* DSP1DRC_KNEE2_OP_ENA */ | ||
2419 | #define WM8996_DSP1DRC_KNEE2_OP_ENA_MASK 0x0020 /* DSP1DRC_KNEE2_OP_ENA */ | ||
2420 | #define WM8996_DSP1DRC_KNEE2_OP_ENA_SHIFT 5 /* DSP1DRC_KNEE2_OP_ENA */ | ||
2421 | #define WM8996_DSP1DRC_KNEE2_OP_ENA_WIDTH 1 /* DSP1DRC_KNEE2_OP_ENA */ | ||
2422 | #define WM8996_DSP1DRC_QR 0x0010 /* DSP1DRC_QR */ | ||
2423 | #define WM8996_DSP1DRC_QR_MASK 0x0010 /* DSP1DRC_QR */ | ||
2424 | #define WM8996_DSP1DRC_QR_SHIFT 4 /* DSP1DRC_QR */ | ||
2425 | #define WM8996_DSP1DRC_QR_WIDTH 1 /* DSP1DRC_QR */ | ||
2426 | #define WM8996_DSP1DRC_ANTICLIP 0x0008 /* DSP1DRC_ANTICLIP */ | ||
2427 | #define WM8996_DSP1DRC_ANTICLIP_MASK 0x0008 /* DSP1DRC_ANTICLIP */ | ||
2428 | #define WM8996_DSP1DRC_ANTICLIP_SHIFT 3 /* DSP1DRC_ANTICLIP */ | ||
2429 | #define WM8996_DSP1DRC_ANTICLIP_WIDTH 1 /* DSP1DRC_ANTICLIP */ | ||
2430 | #define WM8996_DSP1RX_DRC_ENA 0x0004 /* DSP1RX_DRC_ENA */ | ||
2431 | #define WM8996_DSP1RX_DRC_ENA_MASK 0x0004 /* DSP1RX_DRC_ENA */ | ||
2432 | #define WM8996_DSP1RX_DRC_ENA_SHIFT 2 /* DSP1RX_DRC_ENA */ | ||
2433 | #define WM8996_DSP1RX_DRC_ENA_WIDTH 1 /* DSP1RX_DRC_ENA */ | ||
2434 | #define WM8996_DSP1TXL_DRC_ENA 0x0002 /* DSP1TXL_DRC_ENA */ | ||
2435 | #define WM8996_DSP1TXL_DRC_ENA_MASK 0x0002 /* DSP1TXL_DRC_ENA */ | ||
2436 | #define WM8996_DSP1TXL_DRC_ENA_SHIFT 1 /* DSP1TXL_DRC_ENA */ | ||
2437 | #define WM8996_DSP1TXL_DRC_ENA_WIDTH 1 /* DSP1TXL_DRC_ENA */ | ||
2438 | #define WM8996_DSP1TXR_DRC_ENA 0x0001 /* DSP1TXR_DRC_ENA */ | ||
2439 | #define WM8996_DSP1TXR_DRC_ENA_MASK 0x0001 /* DSP1TXR_DRC_ENA */ | ||
2440 | #define WM8996_DSP1TXR_DRC_ENA_SHIFT 0 /* DSP1TXR_DRC_ENA */ | ||
2441 | #define WM8996_DSP1TXR_DRC_ENA_WIDTH 1 /* DSP1TXR_DRC_ENA */ | ||
2442 | |||
2443 | /* | ||
2444 | * R1089 (0x441) - DSP1 DRC (2) | ||
2445 | */ | ||
2446 | #define WM8996_DSP1DRC_ATK_MASK 0x1E00 /* DSP1DRC_ATK - [12:9] */ | ||
2447 | #define WM8996_DSP1DRC_ATK_SHIFT 9 /* DSP1DRC_ATK - [12:9] */ | ||
2448 | #define WM8996_DSP1DRC_ATK_WIDTH 4 /* DSP1DRC_ATK - [12:9] */ | ||
2449 | #define WM8996_DSP1DRC_DCY_MASK 0x01E0 /* DSP1DRC_DCY - [8:5] */ | ||
2450 | #define WM8996_DSP1DRC_DCY_SHIFT 5 /* DSP1DRC_DCY - [8:5] */ | ||
2451 | #define WM8996_DSP1DRC_DCY_WIDTH 4 /* DSP1DRC_DCY - [8:5] */ | ||
2452 | #define WM8996_DSP1DRC_MINGAIN_MASK 0x001C /* DSP1DRC_MINGAIN - [4:2] */ | ||
2453 | #define WM8996_DSP1DRC_MINGAIN_SHIFT 2 /* DSP1DRC_MINGAIN - [4:2] */ | ||
2454 | #define WM8996_DSP1DRC_MINGAIN_WIDTH 3 /* DSP1DRC_MINGAIN - [4:2] */ | ||
2455 | #define WM8996_DSP1DRC_MAXGAIN_MASK 0x0003 /* DSP1DRC_MAXGAIN - [1:0] */ | ||
2456 | #define WM8996_DSP1DRC_MAXGAIN_SHIFT 0 /* DSP1DRC_MAXGAIN - [1:0] */ | ||
2457 | #define WM8996_DSP1DRC_MAXGAIN_WIDTH 2 /* DSP1DRC_MAXGAIN - [1:0] */ | ||
2458 | |||
2459 | /* | ||
2460 | * R1090 (0x442) - DSP1 DRC (3) | ||
2461 | */ | ||
2462 | #define WM8996_DSP1DRC_NG_MINGAIN_MASK 0xF000 /* DSP1DRC_NG_MINGAIN - [15:12] */ | ||
2463 | #define WM8996_DSP1DRC_NG_MINGAIN_SHIFT 12 /* DSP1DRC_NG_MINGAIN - [15:12] */ | ||
2464 | #define WM8996_DSP1DRC_NG_MINGAIN_WIDTH 4 /* DSP1DRC_NG_MINGAIN - [15:12] */ | ||
2465 | #define WM8996_DSP1DRC_NG_EXP_MASK 0x0C00 /* DSP1DRC_NG_EXP - [11:10] */ | ||
2466 | #define WM8996_DSP1DRC_NG_EXP_SHIFT 10 /* DSP1DRC_NG_EXP - [11:10] */ | ||
2467 | #define WM8996_DSP1DRC_NG_EXP_WIDTH 2 /* DSP1DRC_NG_EXP - [11:10] */ | ||
2468 | #define WM8996_DSP1DRC_QR_THR_MASK 0x0300 /* DSP1DRC_QR_THR - [9:8] */ | ||
2469 | #define WM8996_DSP1DRC_QR_THR_SHIFT 8 /* DSP1DRC_QR_THR - [9:8] */ | ||
2470 | #define WM8996_DSP1DRC_QR_THR_WIDTH 2 /* DSP1DRC_QR_THR - [9:8] */ | ||
2471 | #define WM8996_DSP1DRC_QR_DCY_MASK 0x00C0 /* DSP1DRC_QR_DCY - [7:6] */ | ||
2472 | #define WM8996_DSP1DRC_QR_DCY_SHIFT 6 /* DSP1DRC_QR_DCY - [7:6] */ | ||
2473 | #define WM8996_DSP1DRC_QR_DCY_WIDTH 2 /* DSP1DRC_QR_DCY - [7:6] */ | ||
2474 | #define WM8996_DSP1DRC_HI_COMP_MASK 0x0038 /* DSP1DRC_HI_COMP - [5:3] */ | ||
2475 | #define WM8996_DSP1DRC_HI_COMP_SHIFT 3 /* DSP1DRC_HI_COMP - [5:3] */ | ||
2476 | #define WM8996_DSP1DRC_HI_COMP_WIDTH 3 /* DSP1DRC_HI_COMP - [5:3] */ | ||
2477 | #define WM8996_DSP1DRC_LO_COMP_MASK 0x0007 /* DSP1DRC_LO_COMP - [2:0] */ | ||
2478 | #define WM8996_DSP1DRC_LO_COMP_SHIFT 0 /* DSP1DRC_LO_COMP - [2:0] */ | ||
2479 | #define WM8996_DSP1DRC_LO_COMP_WIDTH 3 /* DSP1DRC_LO_COMP - [2:0] */ | ||
2480 | |||
2481 | /* | ||
2482 | * R1091 (0x443) - DSP1 DRC (4) | ||
2483 | */ | ||
2484 | #define WM8996_DSP1DRC_KNEE_IP_MASK 0x07E0 /* DSP1DRC_KNEE_IP - [10:5] */ | ||
2485 | #define WM8996_DSP1DRC_KNEE_IP_SHIFT 5 /* DSP1DRC_KNEE_IP - [10:5] */ | ||
2486 | #define WM8996_DSP1DRC_KNEE_IP_WIDTH 6 /* DSP1DRC_KNEE_IP - [10:5] */ | ||
2487 | #define WM8996_DSP1DRC_KNEE_OP_MASK 0x001F /* DSP1DRC_KNEE_OP - [4:0] */ | ||
2488 | #define WM8996_DSP1DRC_KNEE_OP_SHIFT 0 /* DSP1DRC_KNEE_OP - [4:0] */ | ||
2489 | #define WM8996_DSP1DRC_KNEE_OP_WIDTH 5 /* DSP1DRC_KNEE_OP - [4:0] */ | ||
2490 | |||
2491 | /* | ||
2492 | * R1092 (0x444) - DSP1 DRC (5) | ||
2493 | */ | ||
2494 | #define WM8996_DSP1DRC_KNEE2_IP_MASK 0x03E0 /* DSP1DRC_KNEE2_IP - [9:5] */ | ||
2495 | #define WM8996_DSP1DRC_KNEE2_IP_SHIFT 5 /* DSP1DRC_KNEE2_IP - [9:5] */ | ||
2496 | #define WM8996_DSP1DRC_KNEE2_IP_WIDTH 5 /* DSP1DRC_KNEE2_IP - [9:5] */ | ||
2497 | #define WM8996_DSP1DRC_KNEE2_OP_MASK 0x001F /* DSP1DRC_KNEE2_OP - [4:0] */ | ||
2498 | #define WM8996_DSP1DRC_KNEE2_OP_SHIFT 0 /* DSP1DRC_KNEE2_OP - [4:0] */ | ||
2499 | #define WM8996_DSP1DRC_KNEE2_OP_WIDTH 5 /* DSP1DRC_KNEE2_OP - [4:0] */ | ||
2500 | |||
2501 | /* | ||
2502 | * R1152 (0x480) - DSP1 RX EQ Gains (1) | ||
2503 | */ | ||
2504 | #define WM8996_DSP1RX_EQ_B1_GAIN_MASK 0xF800 /* DSP1RX_EQ_B1_GAIN - [15:11] */ | ||
2505 | #define WM8996_DSP1RX_EQ_B1_GAIN_SHIFT 11 /* DSP1RX_EQ_B1_GAIN - [15:11] */ | ||
2506 | #define WM8996_DSP1RX_EQ_B1_GAIN_WIDTH 5 /* DSP1RX_EQ_B1_GAIN - [15:11] */ | ||
2507 | #define WM8996_DSP1RX_EQ_B2_GAIN_MASK 0x07C0 /* DSP1RX_EQ_B2_GAIN - [10:6] */ | ||
2508 | #define WM8996_DSP1RX_EQ_B2_GAIN_SHIFT 6 /* DSP1RX_EQ_B2_GAIN - [10:6] */ | ||
2509 | #define WM8996_DSP1RX_EQ_B2_GAIN_WIDTH 5 /* DSP1RX_EQ_B2_GAIN - [10:6] */ | ||
2510 | #define WM8996_DSP1RX_EQ_B3_GAIN_MASK 0x003E /* DSP1RX_EQ_B3_GAIN - [5:1] */ | ||
2511 | #define WM8996_DSP1RX_EQ_B3_GAIN_SHIFT 1 /* DSP1RX_EQ_B3_GAIN - [5:1] */ | ||
2512 | #define WM8996_DSP1RX_EQ_B3_GAIN_WIDTH 5 /* DSP1RX_EQ_B3_GAIN - [5:1] */ | ||
2513 | #define WM8996_DSP1RX_EQ_ENA 0x0001 /* DSP1RX_EQ_ENA */ | ||
2514 | #define WM8996_DSP1RX_EQ_ENA_MASK 0x0001 /* DSP1RX_EQ_ENA */ | ||
2515 | #define WM8996_DSP1RX_EQ_ENA_SHIFT 0 /* DSP1RX_EQ_ENA */ | ||
2516 | #define WM8996_DSP1RX_EQ_ENA_WIDTH 1 /* DSP1RX_EQ_ENA */ | ||
2517 | |||
2518 | /* | ||
2519 | * R1153 (0x481) - DSP1 RX EQ Gains (2) | ||
2520 | */ | ||
2521 | #define WM8996_DSP1RX_EQ_B4_GAIN_MASK 0xF800 /* DSP1RX_EQ_B4_GAIN - [15:11] */ | ||
2522 | #define WM8996_DSP1RX_EQ_B4_GAIN_SHIFT 11 /* DSP1RX_EQ_B4_GAIN - [15:11] */ | ||
2523 | #define WM8996_DSP1RX_EQ_B4_GAIN_WIDTH 5 /* DSP1RX_EQ_B4_GAIN - [15:11] */ | ||
2524 | #define WM8996_DSP1RX_EQ_B5_GAIN_MASK 0x07C0 /* DSP1RX_EQ_B5_GAIN - [10:6] */ | ||
2525 | #define WM8996_DSP1RX_EQ_B5_GAIN_SHIFT 6 /* DSP1RX_EQ_B5_GAIN - [10:6] */ | ||
2526 | #define WM8996_DSP1RX_EQ_B5_GAIN_WIDTH 5 /* DSP1RX_EQ_B5_GAIN - [10:6] */ | ||
2527 | |||
2528 | /* | ||
2529 | * R1154 (0x482) - DSP1 RX EQ Band 1 A | ||
2530 | */ | ||
2531 | #define WM8996_DSP1RX_EQ_B1_A_MASK 0xFFFF /* DSP1RX_EQ_B1_A - [15:0] */ | ||
2532 | #define WM8996_DSP1RX_EQ_B1_A_SHIFT 0 /* DSP1RX_EQ_B1_A - [15:0] */ | ||
2533 | #define WM8996_DSP1RX_EQ_B1_A_WIDTH 16 /* DSP1RX_EQ_B1_A - [15:0] */ | ||
2534 | |||
2535 | /* | ||
2536 | * R1155 (0x483) - DSP1 RX EQ Band 1 B | ||
2537 | */ | ||
2538 | #define WM8996_DSP1RX_EQ_B1_B_MASK 0xFFFF /* DSP1RX_EQ_B1_B - [15:0] */ | ||
2539 | #define WM8996_DSP1RX_EQ_B1_B_SHIFT 0 /* DSP1RX_EQ_B1_B - [15:0] */ | ||
2540 | #define WM8996_DSP1RX_EQ_B1_B_WIDTH 16 /* DSP1RX_EQ_B1_B - [15:0] */ | ||
2541 | |||
2542 | /* | ||
2543 | * R1156 (0x484) - DSP1 RX EQ Band 1 PG | ||
2544 | */ | ||
2545 | #define WM8996_DSP1RX_EQ_B1_PG_MASK 0xFFFF /* DSP1RX_EQ_B1_PG - [15:0] */ | ||
2546 | #define WM8996_DSP1RX_EQ_B1_PG_SHIFT 0 /* DSP1RX_EQ_B1_PG - [15:0] */ | ||
2547 | #define WM8996_DSP1RX_EQ_B1_PG_WIDTH 16 /* DSP1RX_EQ_B1_PG - [15:0] */ | ||
2548 | |||
2549 | /* | ||
2550 | * R1157 (0x485) - DSP1 RX EQ Band 2 A | ||
2551 | */ | ||
2552 | #define WM8996_DSP1RX_EQ_B2_A_MASK 0xFFFF /* DSP1RX_EQ_B2_A - [15:0] */ | ||
2553 | #define WM8996_DSP1RX_EQ_B2_A_SHIFT 0 /* DSP1RX_EQ_B2_A - [15:0] */ | ||
2554 | #define WM8996_DSP1RX_EQ_B2_A_WIDTH 16 /* DSP1RX_EQ_B2_A - [15:0] */ | ||
2555 | |||
2556 | /* | ||
2557 | * R1158 (0x486) - DSP1 RX EQ Band 2 B | ||
2558 | */ | ||
2559 | #define WM8996_DSP1RX_EQ_B2_B_MASK 0xFFFF /* DSP1RX_EQ_B2_B - [15:0] */ | ||
2560 | #define WM8996_DSP1RX_EQ_B2_B_SHIFT 0 /* DSP1RX_EQ_B2_B - [15:0] */ | ||
2561 | #define WM8996_DSP1RX_EQ_B2_B_WIDTH 16 /* DSP1RX_EQ_B2_B - [15:0] */ | ||
2562 | |||
2563 | /* | ||
2564 | * R1159 (0x487) - DSP1 RX EQ Band 2 C | ||
2565 | */ | ||
2566 | #define WM8996_DSP1RX_EQ_B2_C_MASK 0xFFFF /* DSP1RX_EQ_B2_C - [15:0] */ | ||
2567 | #define WM8996_DSP1RX_EQ_B2_C_SHIFT 0 /* DSP1RX_EQ_B2_C - [15:0] */ | ||
2568 | #define WM8996_DSP1RX_EQ_B2_C_WIDTH 16 /* DSP1RX_EQ_B2_C - [15:0] */ | ||
2569 | |||
2570 | /* | ||
2571 | * R1160 (0x488) - DSP1 RX EQ Band 2 PG | ||
2572 | */ | ||
2573 | #define WM8996_DSP1RX_EQ_B2_PG_MASK 0xFFFF /* DSP1RX_EQ_B2_PG - [15:0] */ | ||
2574 | #define WM8996_DSP1RX_EQ_B2_PG_SHIFT 0 /* DSP1RX_EQ_B2_PG - [15:0] */ | ||
2575 | #define WM8996_DSP1RX_EQ_B2_PG_WIDTH 16 /* DSP1RX_EQ_B2_PG - [15:0] */ | ||
2576 | |||
2577 | /* | ||
2578 | * R1161 (0x489) - DSP1 RX EQ Band 3 A | ||
2579 | */ | ||
2580 | #define WM8996_DSP1RX_EQ_B3_A_MASK 0xFFFF /* DSP1RX_EQ_B3_A - [15:0] */ | ||
2581 | #define WM8996_DSP1RX_EQ_B3_A_SHIFT 0 /* DSP1RX_EQ_B3_A - [15:0] */ | ||
2582 | #define WM8996_DSP1RX_EQ_B3_A_WIDTH 16 /* DSP1RX_EQ_B3_A - [15:0] */ | ||
2583 | |||
2584 | /* | ||
2585 | * R1162 (0x48A) - DSP1 RX EQ Band 3 B | ||
2586 | */ | ||
2587 | #define WM8996_DSP1RX_EQ_B3_B_MASK 0xFFFF /* DSP1RX_EQ_B3_B - [15:0] */ | ||
2588 | #define WM8996_DSP1RX_EQ_B3_B_SHIFT 0 /* DSP1RX_EQ_B3_B - [15:0] */ | ||
2589 | #define WM8996_DSP1RX_EQ_B3_B_WIDTH 16 /* DSP1RX_EQ_B3_B - [15:0] */ | ||
2590 | |||
2591 | /* | ||
2592 | * R1163 (0x48B) - DSP1 RX EQ Band 3 C | ||
2593 | */ | ||
2594 | #define WM8996_DSP1RX_EQ_B3_C_MASK 0xFFFF /* DSP1RX_EQ_B3_C - [15:0] */ | ||
2595 | #define WM8996_DSP1RX_EQ_B3_C_SHIFT 0 /* DSP1RX_EQ_B3_C - [15:0] */ | ||
2596 | #define WM8996_DSP1RX_EQ_B3_C_WIDTH 16 /* DSP1RX_EQ_B3_C - [15:0] */ | ||
2597 | |||
2598 | /* | ||
2599 | * R1164 (0x48C) - DSP1 RX EQ Band 3 PG | ||
2600 | */ | ||
2601 | #define WM8996_DSP1RX_EQ_B3_PG_MASK 0xFFFF /* DSP1RX_EQ_B3_PG - [15:0] */ | ||
2602 | #define WM8996_DSP1RX_EQ_B3_PG_SHIFT 0 /* DSP1RX_EQ_B3_PG - [15:0] */ | ||
2603 | #define WM8996_DSP1RX_EQ_B3_PG_WIDTH 16 /* DSP1RX_EQ_B3_PG - [15:0] */ | ||
2604 | |||
2605 | /* | ||
2606 | * R1165 (0x48D) - DSP1 RX EQ Band 4 A | ||
2607 | */ | ||
2608 | #define WM8996_DSP1RX_EQ_B4_A_MASK 0xFFFF /* DSP1RX_EQ_B4_A - [15:0] */ | ||
2609 | #define WM8996_DSP1RX_EQ_B4_A_SHIFT 0 /* DSP1RX_EQ_B4_A - [15:0] */ | ||
2610 | #define WM8996_DSP1RX_EQ_B4_A_WIDTH 16 /* DSP1RX_EQ_B4_A - [15:0] */ | ||
2611 | |||
2612 | /* | ||
2613 | * R1166 (0x48E) - DSP1 RX EQ Band 4 B | ||
2614 | */ | ||
2615 | #define WM8996_DSP1RX_EQ_B4_B_MASK 0xFFFF /* DSP1RX_EQ_B4_B - [15:0] */ | ||
2616 | #define WM8996_DSP1RX_EQ_B4_B_SHIFT 0 /* DSP1RX_EQ_B4_B - [15:0] */ | ||
2617 | #define WM8996_DSP1RX_EQ_B4_B_WIDTH 16 /* DSP1RX_EQ_B4_B - [15:0] */ | ||
2618 | |||
2619 | /* | ||
2620 | * R1167 (0x48F) - DSP1 RX EQ Band 4 C | ||
2621 | */ | ||
2622 | #define WM8996_DSP1RX_EQ_B4_C_MASK 0xFFFF /* DSP1RX_EQ_B4_C - [15:0] */ | ||
2623 | #define WM8996_DSP1RX_EQ_B4_C_SHIFT 0 /* DSP1RX_EQ_B4_C - [15:0] */ | ||
2624 | #define WM8996_DSP1RX_EQ_B4_C_WIDTH 16 /* DSP1RX_EQ_B4_C - [15:0] */ | ||
2625 | |||
2626 | /* | ||
2627 | * R1168 (0x490) - DSP1 RX EQ Band 4 PG | ||
2628 | */ | ||
2629 | #define WM8996_DSP1RX_EQ_B4_PG_MASK 0xFFFF /* DSP1RX_EQ_B4_PG - [15:0] */ | ||
2630 | #define WM8996_DSP1RX_EQ_B4_PG_SHIFT 0 /* DSP1RX_EQ_B4_PG - [15:0] */ | ||
2631 | #define WM8996_DSP1RX_EQ_B4_PG_WIDTH 16 /* DSP1RX_EQ_B4_PG - [15:0] */ | ||
2632 | |||
2633 | /* | ||
2634 | * R1169 (0x491) - DSP1 RX EQ Band 5 A | ||
2635 | */ | ||
2636 | #define WM8996_DSP1RX_EQ_B5_A_MASK 0xFFFF /* DSP1RX_EQ_B5_A - [15:0] */ | ||
2637 | #define WM8996_DSP1RX_EQ_B5_A_SHIFT 0 /* DSP1RX_EQ_B5_A - [15:0] */ | ||
2638 | #define WM8996_DSP1RX_EQ_B5_A_WIDTH 16 /* DSP1RX_EQ_B5_A - [15:0] */ | ||
2639 | |||
2640 | /* | ||
2641 | * R1170 (0x492) - DSP1 RX EQ Band 5 B | ||
2642 | */ | ||
2643 | #define WM8996_DSP1RX_EQ_B5_B_MASK 0xFFFF /* DSP1RX_EQ_B5_B - [15:0] */ | ||
2644 | #define WM8996_DSP1RX_EQ_B5_B_SHIFT 0 /* DSP1RX_EQ_B5_B - [15:0] */ | ||
2645 | #define WM8996_DSP1RX_EQ_B5_B_WIDTH 16 /* DSP1RX_EQ_B5_B - [15:0] */ | ||
2646 | |||
2647 | /* | ||
2648 | * R1171 (0x493) - DSP1 RX EQ Band 5 PG | ||
2649 | */ | ||
2650 | #define WM8996_DSP1RX_EQ_B5_PG_MASK 0xFFFF /* DSP1RX_EQ_B5_PG - [15:0] */ | ||
2651 | #define WM8996_DSP1RX_EQ_B5_PG_SHIFT 0 /* DSP1RX_EQ_B5_PG - [15:0] */ | ||
2652 | #define WM8996_DSP1RX_EQ_B5_PG_WIDTH 16 /* DSP1RX_EQ_B5_PG - [15:0] */ | ||
2653 | |||
2654 | /* | ||
2655 | * R1280 (0x500) - DSP2 TX Left Volume | ||
2656 | */ | ||
2657 | #define WM8996_DSP2TX_VU 0x0100 /* DSP2TX_VU */ | ||
2658 | #define WM8996_DSP2TX_VU_MASK 0x0100 /* DSP2TX_VU */ | ||
2659 | #define WM8996_DSP2TX_VU_SHIFT 8 /* DSP2TX_VU */ | ||
2660 | #define WM8996_DSP2TX_VU_WIDTH 1 /* DSP2TX_VU */ | ||
2661 | #define WM8996_DSP2TXL_VOL_MASK 0x00FF /* DSP2TXL_VOL - [7:0] */ | ||
2662 | #define WM8996_DSP2TXL_VOL_SHIFT 0 /* DSP2TXL_VOL - [7:0] */ | ||
2663 | #define WM8996_DSP2TXL_VOL_WIDTH 8 /* DSP2TXL_VOL - [7:0] */ | ||
2664 | |||
2665 | /* | ||
2666 | * R1281 (0x501) - DSP2 TX Right Volume | ||
2667 | */ | ||
2668 | #define WM8996_DSP2TX_VU 0x0100 /* DSP2TX_VU */ | ||
2669 | #define WM8996_DSP2TX_VU_MASK 0x0100 /* DSP2TX_VU */ | ||
2670 | #define WM8996_DSP2TX_VU_SHIFT 8 /* DSP2TX_VU */ | ||
2671 | #define WM8996_DSP2TX_VU_WIDTH 1 /* DSP2TX_VU */ | ||
2672 | #define WM8996_DSP2TXR_VOL_MASK 0x00FF /* DSP2TXR_VOL - [7:0] */ | ||
2673 | #define WM8996_DSP2TXR_VOL_SHIFT 0 /* DSP2TXR_VOL - [7:0] */ | ||
2674 | #define WM8996_DSP2TXR_VOL_WIDTH 8 /* DSP2TXR_VOL - [7:0] */ | ||
2675 | |||
2676 | /* | ||
2677 | * R1282 (0x502) - DSP2 RX Left Volume | ||
2678 | */ | ||
2679 | #define WM8996_DSP2RX_VU 0x0100 /* DSP2RX_VU */ | ||
2680 | #define WM8996_DSP2RX_VU_MASK 0x0100 /* DSP2RX_VU */ | ||
2681 | #define WM8996_DSP2RX_VU_SHIFT 8 /* DSP2RX_VU */ | ||
2682 | #define WM8996_DSP2RX_VU_WIDTH 1 /* DSP2RX_VU */ | ||
2683 | #define WM8996_DSP2RXL_VOL_MASK 0x00FF /* DSP2RXL_VOL - [7:0] */ | ||
2684 | #define WM8996_DSP2RXL_VOL_SHIFT 0 /* DSP2RXL_VOL - [7:0] */ | ||
2685 | #define WM8996_DSP2RXL_VOL_WIDTH 8 /* DSP2RXL_VOL - [7:0] */ | ||
2686 | |||
2687 | /* | ||
2688 | * R1283 (0x503) - DSP2 RX Right Volume | ||
2689 | */ | ||
2690 | #define WM8996_DSP2RX_VU 0x0100 /* DSP2RX_VU */ | ||
2691 | #define WM8996_DSP2RX_VU_MASK 0x0100 /* DSP2RX_VU */ | ||
2692 | #define WM8996_DSP2RX_VU_SHIFT 8 /* DSP2RX_VU */ | ||
2693 | #define WM8996_DSP2RX_VU_WIDTH 1 /* DSP2RX_VU */ | ||
2694 | #define WM8996_DSP2RXR_VOL_MASK 0x00FF /* DSP2RXR_VOL - [7:0] */ | ||
2695 | #define WM8996_DSP2RXR_VOL_SHIFT 0 /* DSP2RXR_VOL - [7:0] */ | ||
2696 | #define WM8996_DSP2RXR_VOL_WIDTH 8 /* DSP2RXR_VOL - [7:0] */ | ||
2697 | |||
2698 | /* | ||
2699 | * R1296 (0x510) - DSP2 TX Filters | ||
2700 | */ | ||
2701 | #define WM8996_DSP2TX_NF 0x2000 /* DSP2TX_NF */ | ||
2702 | #define WM8996_DSP2TX_NF_MASK 0x2000 /* DSP2TX_NF */ | ||
2703 | #define WM8996_DSP2TX_NF_SHIFT 13 /* DSP2TX_NF */ | ||
2704 | #define WM8996_DSP2TX_NF_WIDTH 1 /* DSP2TX_NF */ | ||
2705 | #define WM8996_DSP2TXL_HPF 0x1000 /* DSP2TXL_HPF */ | ||
2706 | #define WM8996_DSP2TXL_HPF_MASK 0x1000 /* DSP2TXL_HPF */ | ||
2707 | #define WM8996_DSP2TXL_HPF_SHIFT 12 /* DSP2TXL_HPF */ | ||
2708 | #define WM8996_DSP2TXL_HPF_WIDTH 1 /* DSP2TXL_HPF */ | ||
2709 | #define WM8996_DSP2TXR_HPF 0x0800 /* DSP2TXR_HPF */ | ||
2710 | #define WM8996_DSP2TXR_HPF_MASK 0x0800 /* DSP2TXR_HPF */ | ||
2711 | #define WM8996_DSP2TXR_HPF_SHIFT 11 /* DSP2TXR_HPF */ | ||
2712 | #define WM8996_DSP2TXR_HPF_WIDTH 1 /* DSP2TXR_HPF */ | ||
2713 | #define WM8996_DSP2TX_HPF_MODE_MASK 0x0018 /* DSP2TX_HPF_MODE - [4:3] */ | ||
2714 | #define WM8996_DSP2TX_HPF_MODE_SHIFT 3 /* DSP2TX_HPF_MODE - [4:3] */ | ||
2715 | #define WM8996_DSP2TX_HPF_MODE_WIDTH 2 /* DSP2TX_HPF_MODE - [4:3] */ | ||
2716 | #define WM8996_DSP2TX_HPF_CUT_MASK 0x0007 /* DSP2TX_HPF_CUT - [2:0] */ | ||
2717 | #define WM8996_DSP2TX_HPF_CUT_SHIFT 0 /* DSP2TX_HPF_CUT - [2:0] */ | ||
2718 | #define WM8996_DSP2TX_HPF_CUT_WIDTH 3 /* DSP2TX_HPF_CUT - [2:0] */ | ||
2719 | |||
2720 | /* | ||
2721 | * R1312 (0x520) - DSP2 RX Filters (1) | ||
2722 | */ | ||
2723 | #define WM8996_DSP2RX_MUTE 0x0200 /* DSP2RX_MUTE */ | ||
2724 | #define WM8996_DSP2RX_MUTE_MASK 0x0200 /* DSP2RX_MUTE */ | ||
2725 | #define WM8996_DSP2RX_MUTE_SHIFT 9 /* DSP2RX_MUTE */ | ||
2726 | #define WM8996_DSP2RX_MUTE_WIDTH 1 /* DSP2RX_MUTE */ | ||
2727 | #define WM8996_DSP2RX_MONO 0x0080 /* DSP2RX_MONO */ | ||
2728 | #define WM8996_DSP2RX_MONO_MASK 0x0080 /* DSP2RX_MONO */ | ||
2729 | #define WM8996_DSP2RX_MONO_SHIFT 7 /* DSP2RX_MONO */ | ||
2730 | #define WM8996_DSP2RX_MONO_WIDTH 1 /* DSP2RX_MONO */ | ||
2731 | #define WM8996_DSP2RX_MUTERATE 0x0020 /* DSP2RX_MUTERATE */ | ||
2732 | #define WM8996_DSP2RX_MUTERATE_MASK 0x0020 /* DSP2RX_MUTERATE */ | ||
2733 | #define WM8996_DSP2RX_MUTERATE_SHIFT 5 /* DSP2RX_MUTERATE */ | ||
2734 | #define WM8996_DSP2RX_MUTERATE_WIDTH 1 /* DSP2RX_MUTERATE */ | ||
2735 | #define WM8996_DSP2RX_UNMUTE_RAMP 0x0010 /* DSP2RX_UNMUTE_RAMP */ | ||
2736 | #define WM8996_DSP2RX_UNMUTE_RAMP_MASK 0x0010 /* DSP2RX_UNMUTE_RAMP */ | ||
2737 | #define WM8996_DSP2RX_UNMUTE_RAMP_SHIFT 4 /* DSP2RX_UNMUTE_RAMP */ | ||
2738 | #define WM8996_DSP2RX_UNMUTE_RAMP_WIDTH 1 /* DSP2RX_UNMUTE_RAMP */ | ||
2739 | |||
2740 | /* | ||
2741 | * R1313 (0x521) - DSP2 RX Filters (2) | ||
2742 | */ | ||
2743 | #define WM8996_DSP2RX_3D_GAIN_MASK 0x3E00 /* DSP2RX_3D_GAIN - [13:9] */ | ||
2744 | #define WM8996_DSP2RX_3D_GAIN_SHIFT 9 /* DSP2RX_3D_GAIN - [13:9] */ | ||
2745 | #define WM8996_DSP2RX_3D_GAIN_WIDTH 5 /* DSP2RX_3D_GAIN - [13:9] */ | ||
2746 | #define WM8996_DSP2RX_3D_ENA 0x0100 /* DSP2RX_3D_ENA */ | ||
2747 | #define WM8996_DSP2RX_3D_ENA_MASK 0x0100 /* DSP2RX_3D_ENA */ | ||
2748 | #define WM8996_DSP2RX_3D_ENA_SHIFT 8 /* DSP2RX_3D_ENA */ | ||
2749 | #define WM8996_DSP2RX_3D_ENA_WIDTH 1 /* DSP2RX_3D_ENA */ | ||
2750 | |||
2751 | /* | ||
2752 | * R1344 (0x540) - DSP2 DRC (1) | ||
2753 | */ | ||
2754 | #define WM8996_DSP2DRC_SIG_DET_RMS_MASK 0xF800 /* DSP2DRC_SIG_DET_RMS - [15:11] */ | ||
2755 | #define WM8996_DSP2DRC_SIG_DET_RMS_SHIFT 11 /* DSP2DRC_SIG_DET_RMS - [15:11] */ | ||
2756 | #define WM8996_DSP2DRC_SIG_DET_RMS_WIDTH 5 /* DSP2DRC_SIG_DET_RMS - [15:11] */ | ||
2757 | #define WM8996_DSP2DRC_SIG_DET_PK_MASK 0x0600 /* DSP2DRC_SIG_DET_PK - [10:9] */ | ||
2758 | #define WM8996_DSP2DRC_SIG_DET_PK_SHIFT 9 /* DSP2DRC_SIG_DET_PK - [10:9] */ | ||
2759 | #define WM8996_DSP2DRC_SIG_DET_PK_WIDTH 2 /* DSP2DRC_SIG_DET_PK - [10:9] */ | ||
2760 | #define WM8996_DSP2DRC_NG_ENA 0x0100 /* DSP2DRC_NG_ENA */ | ||
2761 | #define WM8996_DSP2DRC_NG_ENA_MASK 0x0100 /* DSP2DRC_NG_ENA */ | ||
2762 | #define WM8996_DSP2DRC_NG_ENA_SHIFT 8 /* DSP2DRC_NG_ENA */ | ||
2763 | #define WM8996_DSP2DRC_NG_ENA_WIDTH 1 /* DSP2DRC_NG_ENA */ | ||
2764 | #define WM8996_DSP2DRC_SIG_DET_MODE 0x0080 /* DSP2DRC_SIG_DET_MODE */ | ||
2765 | #define WM8996_DSP2DRC_SIG_DET_MODE_MASK 0x0080 /* DSP2DRC_SIG_DET_MODE */ | ||
2766 | #define WM8996_DSP2DRC_SIG_DET_MODE_SHIFT 7 /* DSP2DRC_SIG_DET_MODE */ | ||
2767 | #define WM8996_DSP2DRC_SIG_DET_MODE_WIDTH 1 /* DSP2DRC_SIG_DET_MODE */ | ||
2768 | #define WM8996_DSP2DRC_SIG_DET 0x0040 /* DSP2DRC_SIG_DET */ | ||
2769 | #define WM8996_DSP2DRC_SIG_DET_MASK 0x0040 /* DSP2DRC_SIG_DET */ | ||
2770 | #define WM8996_DSP2DRC_SIG_DET_SHIFT 6 /* DSP2DRC_SIG_DET */ | ||
2771 | #define WM8996_DSP2DRC_SIG_DET_WIDTH 1 /* DSP2DRC_SIG_DET */ | ||
2772 | #define WM8996_DSP2DRC_KNEE2_OP_ENA 0x0020 /* DSP2DRC_KNEE2_OP_ENA */ | ||
2773 | #define WM8996_DSP2DRC_KNEE2_OP_ENA_MASK 0x0020 /* DSP2DRC_KNEE2_OP_ENA */ | ||
2774 | #define WM8996_DSP2DRC_KNEE2_OP_ENA_SHIFT 5 /* DSP2DRC_KNEE2_OP_ENA */ | ||
2775 | #define WM8996_DSP2DRC_KNEE2_OP_ENA_WIDTH 1 /* DSP2DRC_KNEE2_OP_ENA */ | ||
2776 | #define WM8996_DSP2DRC_QR 0x0010 /* DSP2DRC_QR */ | ||
2777 | #define WM8996_DSP2DRC_QR_MASK 0x0010 /* DSP2DRC_QR */ | ||
2778 | #define WM8996_DSP2DRC_QR_SHIFT 4 /* DSP2DRC_QR */ | ||
2779 | #define WM8996_DSP2DRC_QR_WIDTH 1 /* DSP2DRC_QR */ | ||
2780 | #define WM8996_DSP2DRC_ANTICLIP 0x0008 /* DSP2DRC_ANTICLIP */ | ||
2781 | #define WM8996_DSP2DRC_ANTICLIP_MASK 0x0008 /* DSP2DRC_ANTICLIP */ | ||
2782 | #define WM8996_DSP2DRC_ANTICLIP_SHIFT 3 /* DSP2DRC_ANTICLIP */ | ||
2783 | #define WM8996_DSP2DRC_ANTICLIP_WIDTH 1 /* DSP2DRC_ANTICLIP */ | ||
2784 | #define WM8996_DSP2RX_DRC_ENA 0x0004 /* DSP2RX_DRC_ENA */ | ||
2785 | #define WM8996_DSP2RX_DRC_ENA_MASK 0x0004 /* DSP2RX_DRC_ENA */ | ||
2786 | #define WM8996_DSP2RX_DRC_ENA_SHIFT 2 /* DSP2RX_DRC_ENA */ | ||
2787 | #define WM8996_DSP2RX_DRC_ENA_WIDTH 1 /* DSP2RX_DRC_ENA */ | ||
2788 | #define WM8996_DSP2TXL_DRC_ENA 0x0002 /* DSP2TXL_DRC_ENA */ | ||
2789 | #define WM8996_DSP2TXL_DRC_ENA_MASK 0x0002 /* DSP2TXL_DRC_ENA */ | ||
2790 | #define WM8996_DSP2TXL_DRC_ENA_SHIFT 1 /* DSP2TXL_DRC_ENA */ | ||
2791 | #define WM8996_DSP2TXL_DRC_ENA_WIDTH 1 /* DSP2TXL_DRC_ENA */ | ||
2792 | #define WM8996_DSP2TXR_DRC_ENA 0x0001 /* DSP2TXR_DRC_ENA */ | ||
2793 | #define WM8996_DSP2TXR_DRC_ENA_MASK 0x0001 /* DSP2TXR_DRC_ENA */ | ||
2794 | #define WM8996_DSP2TXR_DRC_ENA_SHIFT 0 /* DSP2TXR_DRC_ENA */ | ||
2795 | #define WM8996_DSP2TXR_DRC_ENA_WIDTH 1 /* DSP2TXR_DRC_ENA */ | ||
2796 | |||
2797 | /* | ||
2798 | * R1345 (0x541) - DSP2 DRC (2) | ||
2799 | */ | ||
2800 | #define WM8996_DSP2DRC_ATK_MASK 0x1E00 /* DSP2DRC_ATK - [12:9] */ | ||
2801 | #define WM8996_DSP2DRC_ATK_SHIFT 9 /* DSP2DRC_ATK - [12:9] */ | ||
2802 | #define WM8996_DSP2DRC_ATK_WIDTH 4 /* DSP2DRC_ATK - [12:9] */ | ||
2803 | #define WM8996_DSP2DRC_DCY_MASK 0x01E0 /* DSP2DRC_DCY - [8:5] */ | ||
2804 | #define WM8996_DSP2DRC_DCY_SHIFT 5 /* DSP2DRC_DCY - [8:5] */ | ||
2805 | #define WM8996_DSP2DRC_DCY_WIDTH 4 /* DSP2DRC_DCY - [8:5] */ | ||
2806 | #define WM8996_DSP2DRC_MINGAIN_MASK 0x001C /* DSP2DRC_MINGAIN - [4:2] */ | ||
2807 | #define WM8996_DSP2DRC_MINGAIN_SHIFT 2 /* DSP2DRC_MINGAIN - [4:2] */ | ||
2808 | #define WM8996_DSP2DRC_MINGAIN_WIDTH 3 /* DSP2DRC_MINGAIN - [4:2] */ | ||
2809 | #define WM8996_DSP2DRC_MAXGAIN_MASK 0x0003 /* DSP2DRC_MAXGAIN - [1:0] */ | ||
2810 | #define WM8996_DSP2DRC_MAXGAIN_SHIFT 0 /* DSP2DRC_MAXGAIN - [1:0] */ | ||
2811 | #define WM8996_DSP2DRC_MAXGAIN_WIDTH 2 /* DSP2DRC_MAXGAIN - [1:0] */ | ||
2812 | |||
2813 | /* | ||
2814 | * R1346 (0x542) - DSP2 DRC (3) | ||
2815 | */ | ||
2816 | #define WM8996_DSP2DRC_NG_MINGAIN_MASK 0xF000 /* DSP2DRC_NG_MINGAIN - [15:12] */ | ||
2817 | #define WM8996_DSP2DRC_NG_MINGAIN_SHIFT 12 /* DSP2DRC_NG_MINGAIN - [15:12] */ | ||
2818 | #define WM8996_DSP2DRC_NG_MINGAIN_WIDTH 4 /* DSP2DRC_NG_MINGAIN - [15:12] */ | ||
2819 | #define WM8996_DSP2DRC_NG_EXP_MASK 0x0C00 /* DSP2DRC_NG_EXP - [11:10] */ | ||
2820 | #define WM8996_DSP2DRC_NG_EXP_SHIFT 10 /* DSP2DRC_NG_EXP - [11:10] */ | ||
2821 | #define WM8996_DSP2DRC_NG_EXP_WIDTH 2 /* DSP2DRC_NG_EXP - [11:10] */ | ||
2822 | #define WM8996_DSP2DRC_QR_THR_MASK 0x0300 /* DSP2DRC_QR_THR - [9:8] */ | ||
2823 | #define WM8996_DSP2DRC_QR_THR_SHIFT 8 /* DSP2DRC_QR_THR - [9:8] */ | ||
2824 | #define WM8996_DSP2DRC_QR_THR_WIDTH 2 /* DSP2DRC_QR_THR - [9:8] */ | ||
2825 | #define WM8996_DSP2DRC_QR_DCY_MASK 0x00C0 /* DSP2DRC_QR_DCY - [7:6] */ | ||
2826 | #define WM8996_DSP2DRC_QR_DCY_SHIFT 6 /* DSP2DRC_QR_DCY - [7:6] */ | ||
2827 | #define WM8996_DSP2DRC_QR_DCY_WIDTH 2 /* DSP2DRC_QR_DCY - [7:6] */ | ||
2828 | #define WM8996_DSP2DRC_HI_COMP_MASK 0x0038 /* DSP2DRC_HI_COMP - [5:3] */ | ||
2829 | #define WM8996_DSP2DRC_HI_COMP_SHIFT 3 /* DSP2DRC_HI_COMP - [5:3] */ | ||
2830 | #define WM8996_DSP2DRC_HI_COMP_WIDTH 3 /* DSP2DRC_HI_COMP - [5:3] */ | ||
2831 | #define WM8996_DSP2DRC_LO_COMP_MASK 0x0007 /* DSP2DRC_LO_COMP - [2:0] */ | ||
2832 | #define WM8996_DSP2DRC_LO_COMP_SHIFT 0 /* DSP2DRC_LO_COMP - [2:0] */ | ||
2833 | #define WM8996_DSP2DRC_LO_COMP_WIDTH 3 /* DSP2DRC_LO_COMP - [2:0] */ | ||
2834 | |||
2835 | /* | ||
2836 | * R1347 (0x543) - DSP2 DRC (4) | ||
2837 | */ | ||
2838 | #define WM8996_DSP2DRC_KNEE_IP_MASK 0x07E0 /* DSP2DRC_KNEE_IP - [10:5] */ | ||
2839 | #define WM8996_DSP2DRC_KNEE_IP_SHIFT 5 /* DSP2DRC_KNEE_IP - [10:5] */ | ||
2840 | #define WM8996_DSP2DRC_KNEE_IP_WIDTH 6 /* DSP2DRC_KNEE_IP - [10:5] */ | ||
2841 | #define WM8996_DSP2DRC_KNEE_OP_MASK 0x001F /* DSP2DRC_KNEE_OP - [4:0] */ | ||
2842 | #define WM8996_DSP2DRC_KNEE_OP_SHIFT 0 /* DSP2DRC_KNEE_OP - [4:0] */ | ||
2843 | #define WM8996_DSP2DRC_KNEE_OP_WIDTH 5 /* DSP2DRC_KNEE_OP - [4:0] */ | ||
2844 | |||
2845 | /* | ||
2846 | * R1348 (0x544) - DSP2 DRC (5) | ||
2847 | */ | ||
2848 | #define WM8996_DSP2DRC_KNEE2_IP_MASK 0x03E0 /* DSP2DRC_KNEE2_IP - [9:5] */ | ||
2849 | #define WM8996_DSP2DRC_KNEE2_IP_SHIFT 5 /* DSP2DRC_KNEE2_IP - [9:5] */ | ||
2850 | #define WM8996_DSP2DRC_KNEE2_IP_WIDTH 5 /* DSP2DRC_KNEE2_IP - [9:5] */ | ||
2851 | #define WM8996_DSP2DRC_KNEE2_OP_MASK 0x001F /* DSP2DRC_KNEE2_OP - [4:0] */ | ||
2852 | #define WM8996_DSP2DRC_KNEE2_OP_SHIFT 0 /* DSP2DRC_KNEE2_OP - [4:0] */ | ||
2853 | #define WM8996_DSP2DRC_KNEE2_OP_WIDTH 5 /* DSP2DRC_KNEE2_OP - [4:0] */ | ||
2854 | |||
2855 | /* | ||
2856 | * R1408 (0x580) - DSP2 RX EQ Gains (1) | ||
2857 | */ | ||
2858 | #define WM8996_DSP2RX_EQ_B1_GAIN_MASK 0xF800 /* DSP2RX_EQ_B1_GAIN - [15:11] */ | ||
2859 | #define WM8996_DSP2RX_EQ_B1_GAIN_SHIFT 11 /* DSP2RX_EQ_B1_GAIN - [15:11] */ | ||
2860 | #define WM8996_DSP2RX_EQ_B1_GAIN_WIDTH 5 /* DSP2RX_EQ_B1_GAIN - [15:11] */ | ||
2861 | #define WM8996_DSP2RX_EQ_B2_GAIN_MASK 0x07C0 /* DSP2RX_EQ_B2_GAIN - [10:6] */ | ||
2862 | #define WM8996_DSP2RX_EQ_B2_GAIN_SHIFT 6 /* DSP2RX_EQ_B2_GAIN - [10:6] */ | ||
2863 | #define WM8996_DSP2RX_EQ_B2_GAIN_WIDTH 5 /* DSP2RX_EQ_B2_GAIN - [10:6] */ | ||
2864 | #define WM8996_DSP2RX_EQ_B3_GAIN_MASK 0x003E /* DSP2RX_EQ_B3_GAIN - [5:1] */ | ||
2865 | #define WM8996_DSP2RX_EQ_B3_GAIN_SHIFT 1 /* DSP2RX_EQ_B3_GAIN - [5:1] */ | ||
2866 | #define WM8996_DSP2RX_EQ_B3_GAIN_WIDTH 5 /* DSP2RX_EQ_B3_GAIN - [5:1] */ | ||
2867 | #define WM8996_DSP2RX_EQ_ENA 0x0001 /* DSP2RX_EQ_ENA */ | ||
2868 | #define WM8996_DSP2RX_EQ_ENA_MASK 0x0001 /* DSP2RX_EQ_ENA */ | ||
2869 | #define WM8996_DSP2RX_EQ_ENA_SHIFT 0 /* DSP2RX_EQ_ENA */ | ||
2870 | #define WM8996_DSP2RX_EQ_ENA_WIDTH 1 /* DSP2RX_EQ_ENA */ | ||
2871 | |||
2872 | /* | ||
2873 | * R1409 (0x581) - DSP2 RX EQ Gains (2) | ||
2874 | */ | ||
2875 | #define WM8996_DSP2RX_EQ_B4_GAIN_MASK 0xF800 /* DSP2RX_EQ_B4_GAIN - [15:11] */ | ||
2876 | #define WM8996_DSP2RX_EQ_B4_GAIN_SHIFT 11 /* DSP2RX_EQ_B4_GAIN - [15:11] */ | ||
2877 | #define WM8996_DSP2RX_EQ_B4_GAIN_WIDTH 5 /* DSP2RX_EQ_B4_GAIN - [15:11] */ | ||
2878 | #define WM8996_DSP2RX_EQ_B5_GAIN_MASK 0x07C0 /* DSP2RX_EQ_B5_GAIN - [10:6] */ | ||
2879 | #define WM8996_DSP2RX_EQ_B5_GAIN_SHIFT 6 /* DSP2RX_EQ_B5_GAIN - [10:6] */ | ||
2880 | #define WM8996_DSP2RX_EQ_B5_GAIN_WIDTH 5 /* DSP2RX_EQ_B5_GAIN - [10:6] */ | ||
2881 | |||
2882 | /* | ||
2883 | * R1410 (0x582) - DSP2 RX EQ Band 1 A | ||
2884 | */ | ||
2885 | #define WM8996_DSP2RX_EQ_B1_A_MASK 0xFFFF /* DSP2RX_EQ_B1_A - [15:0] */ | ||
2886 | #define WM8996_DSP2RX_EQ_B1_A_SHIFT 0 /* DSP2RX_EQ_B1_A - [15:0] */ | ||
2887 | #define WM8996_DSP2RX_EQ_B1_A_WIDTH 16 /* DSP2RX_EQ_B1_A - [15:0] */ | ||
2888 | |||
2889 | /* | ||
2890 | * R1411 (0x583) - DSP2 RX EQ Band 1 B | ||
2891 | */ | ||
2892 | #define WM8996_DSP2RX_EQ_B1_B_MASK 0xFFFF /* DSP2RX_EQ_B1_B - [15:0] */ | ||
2893 | #define WM8996_DSP2RX_EQ_B1_B_SHIFT 0 /* DSP2RX_EQ_B1_B - [15:0] */ | ||
2894 | #define WM8996_DSP2RX_EQ_B1_B_WIDTH 16 /* DSP2RX_EQ_B1_B - [15:0] */ | ||
2895 | |||
2896 | /* | ||
2897 | * R1412 (0x584) - DSP2 RX EQ Band 1 PG | ||
2898 | */ | ||
2899 | #define WM8996_DSP2RX_EQ_B1_PG_MASK 0xFFFF /* DSP2RX_EQ_B1_PG - [15:0] */ | ||
2900 | #define WM8996_DSP2RX_EQ_B1_PG_SHIFT 0 /* DSP2RX_EQ_B1_PG - [15:0] */ | ||
2901 | #define WM8996_DSP2RX_EQ_B1_PG_WIDTH 16 /* DSP2RX_EQ_B1_PG - [15:0] */ | ||
2902 | |||
2903 | /* | ||
2904 | * R1413 (0x585) - DSP2 RX EQ Band 2 A | ||
2905 | */ | ||
2906 | #define WM8996_DSP2RX_EQ_B2_A_MASK 0xFFFF /* DSP2RX_EQ_B2_A - [15:0] */ | ||
2907 | #define WM8996_DSP2RX_EQ_B2_A_SHIFT 0 /* DSP2RX_EQ_B2_A - [15:0] */ | ||
2908 | #define WM8996_DSP2RX_EQ_B2_A_WIDTH 16 /* DSP2RX_EQ_B2_A - [15:0] */ | ||
2909 | |||
2910 | /* | ||
2911 | * R1414 (0x586) - DSP2 RX EQ Band 2 B | ||
2912 | */ | ||
2913 | #define WM8996_DSP2RX_EQ_B2_B_MASK 0xFFFF /* DSP2RX_EQ_B2_B - [15:0] */ | ||
2914 | #define WM8996_DSP2RX_EQ_B2_B_SHIFT 0 /* DSP2RX_EQ_B2_B - [15:0] */ | ||
2915 | #define WM8996_DSP2RX_EQ_B2_B_WIDTH 16 /* DSP2RX_EQ_B2_B - [15:0] */ | ||
2916 | |||
2917 | /* | ||
2918 | * R1415 (0x587) - DSP2 RX EQ Band 2 C | ||
2919 | */ | ||
2920 | #define WM8996_DSP2RX_EQ_B2_C_MASK 0xFFFF /* DSP2RX_EQ_B2_C - [15:0] */ | ||
2921 | #define WM8996_DSP2RX_EQ_B2_C_SHIFT 0 /* DSP2RX_EQ_B2_C - [15:0] */ | ||
2922 | #define WM8996_DSP2RX_EQ_B2_C_WIDTH 16 /* DSP2RX_EQ_B2_C - [15:0] */ | ||
2923 | |||
2924 | /* | ||
2925 | * R1416 (0x588) - DSP2 RX EQ Band 2 PG | ||
2926 | */ | ||
2927 | #define WM8996_DSP2RX_EQ_B2_PG_MASK 0xFFFF /* DSP2RX_EQ_B2_PG - [15:0] */ | ||
2928 | #define WM8996_DSP2RX_EQ_B2_PG_SHIFT 0 /* DSP2RX_EQ_B2_PG - [15:0] */ | ||
2929 | #define WM8996_DSP2RX_EQ_B2_PG_WIDTH 16 /* DSP2RX_EQ_B2_PG - [15:0] */ | ||
2930 | |||
2931 | /* | ||
2932 | * R1417 (0x589) - DSP2 RX EQ Band 3 A | ||
2933 | */ | ||
2934 | #define WM8996_DSP2RX_EQ_B3_A_MASK 0xFFFF /* DSP2RX_EQ_B3_A - [15:0] */ | ||
2935 | #define WM8996_DSP2RX_EQ_B3_A_SHIFT 0 /* DSP2RX_EQ_B3_A - [15:0] */ | ||
2936 | #define WM8996_DSP2RX_EQ_B3_A_WIDTH 16 /* DSP2RX_EQ_B3_A - [15:0] */ | ||
2937 | |||
2938 | /* | ||
2939 | * R1418 (0x58A) - DSP2 RX EQ Band 3 B | ||
2940 | */ | ||
2941 | #define WM8996_DSP2RX_EQ_B3_B_MASK 0xFFFF /* DSP2RX_EQ_B3_B - [15:0] */ | ||
2942 | #define WM8996_DSP2RX_EQ_B3_B_SHIFT 0 /* DSP2RX_EQ_B3_B - [15:0] */ | ||
2943 | #define WM8996_DSP2RX_EQ_B3_B_WIDTH 16 /* DSP2RX_EQ_B3_B - [15:0] */ | ||
2944 | |||
2945 | /* | ||
2946 | * R1419 (0x58B) - DSP2 RX EQ Band 3 C | ||
2947 | */ | ||
2948 | #define WM8996_DSP2RX_EQ_B3_C_MASK 0xFFFF /* DSP2RX_EQ_B3_C - [15:0] */ | ||
2949 | #define WM8996_DSP2RX_EQ_B3_C_SHIFT 0 /* DSP2RX_EQ_B3_C - [15:0] */ | ||
2950 | #define WM8996_DSP2RX_EQ_B3_C_WIDTH 16 /* DSP2RX_EQ_B3_C - [15:0] */ | ||
2951 | |||
2952 | /* | ||
2953 | * R1420 (0x58C) - DSP2 RX EQ Band 3 PG | ||
2954 | */ | ||
2955 | #define WM8996_DSP2RX_EQ_B3_PG_MASK 0xFFFF /* DSP2RX_EQ_B3_PG - [15:0] */ | ||
2956 | #define WM8996_DSP2RX_EQ_B3_PG_SHIFT 0 /* DSP2RX_EQ_B3_PG - [15:0] */ | ||
2957 | #define WM8996_DSP2RX_EQ_B3_PG_WIDTH 16 /* DSP2RX_EQ_B3_PG - [15:0] */ | ||
2958 | |||
2959 | /* | ||
2960 | * R1421 (0x58D) - DSP2 RX EQ Band 4 A | ||
2961 | */ | ||
2962 | #define WM8996_DSP2RX_EQ_B4_A_MASK 0xFFFF /* DSP2RX_EQ_B4_A - [15:0] */ | ||
2963 | #define WM8996_DSP2RX_EQ_B4_A_SHIFT 0 /* DSP2RX_EQ_B4_A - [15:0] */ | ||
2964 | #define WM8996_DSP2RX_EQ_B4_A_WIDTH 16 /* DSP2RX_EQ_B4_A - [15:0] */ | ||
2965 | |||
2966 | /* | ||
2967 | * R1422 (0x58E) - DSP2 RX EQ Band 4 B | ||
2968 | */ | ||
2969 | #define WM8996_DSP2RX_EQ_B4_B_MASK 0xFFFF /* DSP2RX_EQ_B4_B - [15:0] */ | ||
2970 | #define WM8996_DSP2RX_EQ_B4_B_SHIFT 0 /* DSP2RX_EQ_B4_B - [15:0] */ | ||
2971 | #define WM8996_DSP2RX_EQ_B4_B_WIDTH 16 /* DSP2RX_EQ_B4_B - [15:0] */ | ||
2972 | |||
2973 | /* | ||
2974 | * R1423 (0x58F) - DSP2 RX EQ Band 4 C | ||
2975 | */ | ||
2976 | #define WM8996_DSP2RX_EQ_B4_C_MASK 0xFFFF /* DSP2RX_EQ_B4_C - [15:0] */ | ||
2977 | #define WM8996_DSP2RX_EQ_B4_C_SHIFT 0 /* DSP2RX_EQ_B4_C - [15:0] */ | ||
2978 | #define WM8996_DSP2RX_EQ_B4_C_WIDTH 16 /* DSP2RX_EQ_B4_C - [15:0] */ | ||
2979 | |||
2980 | /* | ||
2981 | * R1424 (0x590) - DSP2 RX EQ Band 4 PG | ||
2982 | */ | ||
2983 | #define WM8996_DSP2RX_EQ_B4_PG_MASK 0xFFFF /* DSP2RX_EQ_B4_PG - [15:0] */ | ||
2984 | #define WM8996_DSP2RX_EQ_B4_PG_SHIFT 0 /* DSP2RX_EQ_B4_PG - [15:0] */ | ||
2985 | #define WM8996_DSP2RX_EQ_B4_PG_WIDTH 16 /* DSP2RX_EQ_B4_PG - [15:0] */ | ||
2986 | |||
2987 | /* | ||
2988 | * R1425 (0x591) - DSP2 RX EQ Band 5 A | ||
2989 | */ | ||
2990 | #define WM8996_DSP2RX_EQ_B5_A_MASK 0xFFFF /* DSP2RX_EQ_B5_A - [15:0] */ | ||
2991 | #define WM8996_DSP2RX_EQ_B5_A_SHIFT 0 /* DSP2RX_EQ_B5_A - [15:0] */ | ||
2992 | #define WM8996_DSP2RX_EQ_B5_A_WIDTH 16 /* DSP2RX_EQ_B5_A - [15:0] */ | ||
2993 | |||
2994 | /* | ||
2995 | * R1426 (0x592) - DSP2 RX EQ Band 5 B | ||
2996 | */ | ||
2997 | #define WM8996_DSP2RX_EQ_B5_B_MASK 0xFFFF /* DSP2RX_EQ_B5_B - [15:0] */ | ||
2998 | #define WM8996_DSP2RX_EQ_B5_B_SHIFT 0 /* DSP2RX_EQ_B5_B - [15:0] */ | ||
2999 | #define WM8996_DSP2RX_EQ_B5_B_WIDTH 16 /* DSP2RX_EQ_B5_B - [15:0] */ | ||
3000 | |||
3001 | /* | ||
3002 | * R1427 (0x593) - DSP2 RX EQ Band 5 PG | ||
3003 | */ | ||
3004 | #define WM8996_DSP2RX_EQ_B5_PG_MASK 0xFFFF /* DSP2RX_EQ_B5_PG - [15:0] */ | ||
3005 | #define WM8996_DSP2RX_EQ_B5_PG_SHIFT 0 /* DSP2RX_EQ_B5_PG - [15:0] */ | ||
3006 | #define WM8996_DSP2RX_EQ_B5_PG_WIDTH 16 /* DSP2RX_EQ_B5_PG - [15:0] */ | ||
3007 | |||
3008 | /* | ||
3009 | * R1536 (0x600) - DAC1 Mixer Volumes | ||
3010 | */ | ||
3011 | #define WM8996_ADCR_DAC1_VOL_MASK 0x03E0 /* ADCR_DAC1_VOL - [9:5] */ | ||
3012 | #define WM8996_ADCR_DAC1_VOL_SHIFT 5 /* ADCR_DAC1_VOL - [9:5] */ | ||
3013 | #define WM8996_ADCR_DAC1_VOL_WIDTH 5 /* ADCR_DAC1_VOL - [9:5] */ | ||
3014 | #define WM8996_ADCL_DAC1_VOL_MASK 0x001F /* ADCL_DAC1_VOL - [4:0] */ | ||
3015 | #define WM8996_ADCL_DAC1_VOL_SHIFT 0 /* ADCL_DAC1_VOL - [4:0] */ | ||
3016 | #define WM8996_ADCL_DAC1_VOL_WIDTH 5 /* ADCL_DAC1_VOL - [4:0] */ | ||
3017 | |||
3018 | /* | ||
3019 | * R1537 (0x601) - DAC1 Left Mixer Routing | ||
3020 | */ | ||
3021 | #define WM8996_ADCR_TO_DAC1L 0x0020 /* ADCR_TO_DAC1L */ | ||
3022 | #define WM8996_ADCR_TO_DAC1L_MASK 0x0020 /* ADCR_TO_DAC1L */ | ||
3023 | #define WM8996_ADCR_TO_DAC1L_SHIFT 5 /* ADCR_TO_DAC1L */ | ||
3024 | #define WM8996_ADCR_TO_DAC1L_WIDTH 1 /* ADCR_TO_DAC1L */ | ||
3025 | #define WM8996_ADCL_TO_DAC1L 0x0010 /* ADCL_TO_DAC1L */ | ||
3026 | #define WM8996_ADCL_TO_DAC1L_MASK 0x0010 /* ADCL_TO_DAC1L */ | ||
3027 | #define WM8996_ADCL_TO_DAC1L_SHIFT 4 /* ADCL_TO_DAC1L */ | ||
3028 | #define WM8996_ADCL_TO_DAC1L_WIDTH 1 /* ADCL_TO_DAC1L */ | ||
3029 | #define WM8996_DSP2RXL_TO_DAC1L 0x0002 /* DSP2RXL_TO_DAC1L */ | ||
3030 | #define WM8996_DSP2RXL_TO_DAC1L_MASK 0x0002 /* DSP2RXL_TO_DAC1L */ | ||
3031 | #define WM8996_DSP2RXL_TO_DAC1L_SHIFT 1 /* DSP2RXL_TO_DAC1L */ | ||
3032 | #define WM8996_DSP2RXL_TO_DAC1L_WIDTH 1 /* DSP2RXL_TO_DAC1L */ | ||
3033 | #define WM8996_DSP1RXL_TO_DAC1L 0x0001 /* DSP1RXL_TO_DAC1L */ | ||
3034 | #define WM8996_DSP1RXL_TO_DAC1L_MASK 0x0001 /* DSP1RXL_TO_DAC1L */ | ||
3035 | #define WM8996_DSP1RXL_TO_DAC1L_SHIFT 0 /* DSP1RXL_TO_DAC1L */ | ||
3036 | #define WM8996_DSP1RXL_TO_DAC1L_WIDTH 1 /* DSP1RXL_TO_DAC1L */ | ||
3037 | |||
3038 | /* | ||
3039 | * R1538 (0x602) - DAC1 Right Mixer Routing | ||
3040 | */ | ||
3041 | #define WM8996_ADCR_TO_DAC1R 0x0020 /* ADCR_TO_DAC1R */ | ||
3042 | #define WM8996_ADCR_TO_DAC1R_MASK 0x0020 /* ADCR_TO_DAC1R */ | ||
3043 | #define WM8996_ADCR_TO_DAC1R_SHIFT 5 /* ADCR_TO_DAC1R */ | ||
3044 | #define WM8996_ADCR_TO_DAC1R_WIDTH 1 /* ADCR_TO_DAC1R */ | ||
3045 | #define WM8996_ADCL_TO_DAC1R 0x0010 /* ADCL_TO_DAC1R */ | ||
3046 | #define WM8996_ADCL_TO_DAC1R_MASK 0x0010 /* ADCL_TO_DAC1R */ | ||
3047 | #define WM8996_ADCL_TO_DAC1R_SHIFT 4 /* ADCL_TO_DAC1R */ | ||
3048 | #define WM8996_ADCL_TO_DAC1R_WIDTH 1 /* ADCL_TO_DAC1R */ | ||
3049 | #define WM8996_DSP2RXR_TO_DAC1R 0x0002 /* DSP2RXR_TO_DAC1R */ | ||
3050 | #define WM8996_DSP2RXR_TO_DAC1R_MASK 0x0002 /* DSP2RXR_TO_DAC1R */ | ||
3051 | #define WM8996_DSP2RXR_TO_DAC1R_SHIFT 1 /* DSP2RXR_TO_DAC1R */ | ||
3052 | #define WM8996_DSP2RXR_TO_DAC1R_WIDTH 1 /* DSP2RXR_TO_DAC1R */ | ||
3053 | #define WM8996_DSP1RXR_TO_DAC1R 0x0001 /* DSP1RXR_TO_DAC1R */ | ||
3054 | #define WM8996_DSP1RXR_TO_DAC1R_MASK 0x0001 /* DSP1RXR_TO_DAC1R */ | ||
3055 | #define WM8996_DSP1RXR_TO_DAC1R_SHIFT 0 /* DSP1RXR_TO_DAC1R */ | ||
3056 | #define WM8996_DSP1RXR_TO_DAC1R_WIDTH 1 /* DSP1RXR_TO_DAC1R */ | ||
3057 | |||
3058 | /* | ||
3059 | * R1539 (0x603) - DAC2 Mixer Volumes | ||
3060 | */ | ||
3061 | #define WM8996_ADCR_DAC2_VOL_MASK 0x03E0 /* ADCR_DAC2_VOL - [9:5] */ | ||
3062 | #define WM8996_ADCR_DAC2_VOL_SHIFT 5 /* ADCR_DAC2_VOL - [9:5] */ | ||
3063 | #define WM8996_ADCR_DAC2_VOL_WIDTH 5 /* ADCR_DAC2_VOL - [9:5] */ | ||
3064 | #define WM8996_ADCL_DAC2_VOL_MASK 0x001F /* ADCL_DAC2_VOL - [4:0] */ | ||
3065 | #define WM8996_ADCL_DAC2_VOL_SHIFT 0 /* ADCL_DAC2_VOL - [4:0] */ | ||
3066 | #define WM8996_ADCL_DAC2_VOL_WIDTH 5 /* ADCL_DAC2_VOL - [4:0] */ | ||
3067 | |||
3068 | /* | ||
3069 | * R1540 (0x604) - DAC2 Left Mixer Routing | ||
3070 | */ | ||
3071 | #define WM8996_ADCR_TO_DAC2L 0x0020 /* ADCR_TO_DAC2L */ | ||
3072 | #define WM8996_ADCR_TO_DAC2L_MASK 0x0020 /* ADCR_TO_DAC2L */ | ||
3073 | #define WM8996_ADCR_TO_DAC2L_SHIFT 5 /* ADCR_TO_DAC2L */ | ||
3074 | #define WM8996_ADCR_TO_DAC2L_WIDTH 1 /* ADCR_TO_DAC2L */ | ||
3075 | #define WM8996_ADCL_TO_DAC2L 0x0010 /* ADCL_TO_DAC2L */ | ||
3076 | #define WM8996_ADCL_TO_DAC2L_MASK 0x0010 /* ADCL_TO_DAC2L */ | ||
3077 | #define WM8996_ADCL_TO_DAC2L_SHIFT 4 /* ADCL_TO_DAC2L */ | ||
3078 | #define WM8996_ADCL_TO_DAC2L_WIDTH 1 /* ADCL_TO_DAC2L */ | ||
3079 | #define WM8996_DSP2RXL_TO_DAC2L 0x0002 /* DSP2RXL_TO_DAC2L */ | ||
3080 | #define WM8996_DSP2RXL_TO_DAC2L_MASK 0x0002 /* DSP2RXL_TO_DAC2L */ | ||
3081 | #define WM8996_DSP2RXL_TO_DAC2L_SHIFT 1 /* DSP2RXL_TO_DAC2L */ | ||
3082 | #define WM8996_DSP2RXL_TO_DAC2L_WIDTH 1 /* DSP2RXL_TO_DAC2L */ | ||
3083 | #define WM8996_DSP1RXL_TO_DAC2L 0x0001 /* DSP1RXL_TO_DAC2L */ | ||
3084 | #define WM8996_DSP1RXL_TO_DAC2L_MASK 0x0001 /* DSP1RXL_TO_DAC2L */ | ||
3085 | #define WM8996_DSP1RXL_TO_DAC2L_SHIFT 0 /* DSP1RXL_TO_DAC2L */ | ||
3086 | #define WM8996_DSP1RXL_TO_DAC2L_WIDTH 1 /* DSP1RXL_TO_DAC2L */ | ||
3087 | |||
3088 | /* | ||
3089 | * R1541 (0x605) - DAC2 Right Mixer Routing | ||
3090 | */ | ||
3091 | #define WM8996_ADCR_TO_DAC2R 0x0020 /* ADCR_TO_DAC2R */ | ||
3092 | #define WM8996_ADCR_TO_DAC2R_MASK 0x0020 /* ADCR_TO_DAC2R */ | ||
3093 | #define WM8996_ADCR_TO_DAC2R_SHIFT 5 /* ADCR_TO_DAC2R */ | ||
3094 | #define WM8996_ADCR_TO_DAC2R_WIDTH 1 /* ADCR_TO_DAC2R */ | ||
3095 | #define WM8996_ADCL_TO_DAC2R 0x0010 /* ADCL_TO_DAC2R */ | ||
3096 | #define WM8996_ADCL_TO_DAC2R_MASK 0x0010 /* ADCL_TO_DAC2R */ | ||
3097 | #define WM8996_ADCL_TO_DAC2R_SHIFT 4 /* ADCL_TO_DAC2R */ | ||
3098 | #define WM8996_ADCL_TO_DAC2R_WIDTH 1 /* ADCL_TO_DAC2R */ | ||
3099 | #define WM8996_DSP2RXR_TO_DAC2R 0x0002 /* DSP2RXR_TO_DAC2R */ | ||
3100 | #define WM8996_DSP2RXR_TO_DAC2R_MASK 0x0002 /* DSP2RXR_TO_DAC2R */ | ||
3101 | #define WM8996_DSP2RXR_TO_DAC2R_SHIFT 1 /* DSP2RXR_TO_DAC2R */ | ||
3102 | #define WM8996_DSP2RXR_TO_DAC2R_WIDTH 1 /* DSP2RXR_TO_DAC2R */ | ||
3103 | #define WM8996_DSP1RXR_TO_DAC2R 0x0001 /* DSP1RXR_TO_DAC2R */ | ||
3104 | #define WM8996_DSP1RXR_TO_DAC2R_MASK 0x0001 /* DSP1RXR_TO_DAC2R */ | ||
3105 | #define WM8996_DSP1RXR_TO_DAC2R_SHIFT 0 /* DSP1RXR_TO_DAC2R */ | ||
3106 | #define WM8996_DSP1RXR_TO_DAC2R_WIDTH 1 /* DSP1RXR_TO_DAC2R */ | ||
3107 | |||
3108 | /* | ||
3109 | * R1542 (0x606) - DSP1 TX Left Mixer Routing | ||
3110 | */ | ||
3111 | #define WM8996_ADC1L_TO_DSP1TXL 0x0002 /* ADC1L_TO_DSP1TXL */ | ||
3112 | #define WM8996_ADC1L_TO_DSP1TXL_MASK 0x0002 /* ADC1L_TO_DSP1TXL */ | ||
3113 | #define WM8996_ADC1L_TO_DSP1TXL_SHIFT 1 /* ADC1L_TO_DSP1TXL */ | ||
3114 | #define WM8996_ADC1L_TO_DSP1TXL_WIDTH 1 /* ADC1L_TO_DSP1TXL */ | ||
3115 | #define WM8996_DACL_TO_DSP1TXL 0x0001 /* DACL_TO_DSP1TXL */ | ||
3116 | #define WM8996_DACL_TO_DSP1TXL_MASK 0x0001 /* DACL_TO_DSP1TXL */ | ||
3117 | #define WM8996_DACL_TO_DSP1TXL_SHIFT 0 /* DACL_TO_DSP1TXL */ | ||
3118 | #define WM8996_DACL_TO_DSP1TXL_WIDTH 1 /* DACL_TO_DSP1TXL */ | ||
3119 | |||
3120 | /* | ||
3121 | * R1543 (0x607) - DSP1 TX Right Mixer Routing | ||
3122 | */ | ||
3123 | #define WM8996_ADC1R_TO_DSP1TXR 0x0002 /* ADC1R_TO_DSP1TXR */ | ||
3124 | #define WM8996_ADC1R_TO_DSP1TXR_MASK 0x0002 /* ADC1R_TO_DSP1TXR */ | ||
3125 | #define WM8996_ADC1R_TO_DSP1TXR_SHIFT 1 /* ADC1R_TO_DSP1TXR */ | ||
3126 | #define WM8996_ADC1R_TO_DSP1TXR_WIDTH 1 /* ADC1R_TO_DSP1TXR */ | ||
3127 | #define WM8996_DACR_TO_DSP1TXR 0x0001 /* DACR_TO_DSP1TXR */ | ||
3128 | #define WM8996_DACR_TO_DSP1TXR_MASK 0x0001 /* DACR_TO_DSP1TXR */ | ||
3129 | #define WM8996_DACR_TO_DSP1TXR_SHIFT 0 /* DACR_TO_DSP1TXR */ | ||
3130 | #define WM8996_DACR_TO_DSP1TXR_WIDTH 1 /* DACR_TO_DSP1TXR */ | ||
3131 | |||
3132 | /* | ||
3133 | * R1544 (0x608) - DSP2 TX Left Mixer Routing | ||
3134 | */ | ||
3135 | #define WM8996_ADC2L_TO_DSP2TXL 0x0002 /* ADC2L_TO_DSP2TXL */ | ||
3136 | #define WM8996_ADC2L_TO_DSP2TXL_MASK 0x0002 /* ADC2L_TO_DSP2TXL */ | ||
3137 | #define WM8996_ADC2L_TO_DSP2TXL_SHIFT 1 /* ADC2L_TO_DSP2TXL */ | ||
3138 | #define WM8996_ADC2L_TO_DSP2TXL_WIDTH 1 /* ADC2L_TO_DSP2TXL */ | ||
3139 | #define WM8996_DACL_TO_DSP2TXL 0x0001 /* DACL_TO_DSP2TXL */ | ||
3140 | #define WM8996_DACL_TO_DSP2TXL_MASK 0x0001 /* DACL_TO_DSP2TXL */ | ||
3141 | #define WM8996_DACL_TO_DSP2TXL_SHIFT 0 /* DACL_TO_DSP2TXL */ | ||
3142 | #define WM8996_DACL_TO_DSP2TXL_WIDTH 1 /* DACL_TO_DSP2TXL */ | ||
3143 | |||
3144 | /* | ||
3145 | * R1545 (0x609) - DSP2 TX Right Mixer Routing | ||
3146 | */ | ||
3147 | #define WM8996_ADC2R_TO_DSP2TXR 0x0002 /* ADC2R_TO_DSP2TXR */ | ||
3148 | #define WM8996_ADC2R_TO_DSP2TXR_MASK 0x0002 /* ADC2R_TO_DSP2TXR */ | ||
3149 | #define WM8996_ADC2R_TO_DSP2TXR_SHIFT 1 /* ADC2R_TO_DSP2TXR */ | ||
3150 | #define WM8996_ADC2R_TO_DSP2TXR_WIDTH 1 /* ADC2R_TO_DSP2TXR */ | ||
3151 | #define WM8996_DACR_TO_DSP2TXR 0x0001 /* DACR_TO_DSP2TXR */ | ||
3152 | #define WM8996_DACR_TO_DSP2TXR_MASK 0x0001 /* DACR_TO_DSP2TXR */ | ||
3153 | #define WM8996_DACR_TO_DSP2TXR_SHIFT 0 /* DACR_TO_DSP2TXR */ | ||
3154 | #define WM8996_DACR_TO_DSP2TXR_WIDTH 1 /* DACR_TO_DSP2TXR */ | ||
3155 | |||
3156 | /* | ||
3157 | * R1546 (0x60A) - DSP TX Mixer Select | ||
3158 | */ | ||
3159 | #define WM8996_DAC_TO_DSPTX_SRC 0x0001 /* DAC_TO_DSPTX_SRC */ | ||
3160 | #define WM8996_DAC_TO_DSPTX_SRC_MASK 0x0001 /* DAC_TO_DSPTX_SRC */ | ||
3161 | #define WM8996_DAC_TO_DSPTX_SRC_SHIFT 0 /* DAC_TO_DSPTX_SRC */ | ||
3162 | #define WM8996_DAC_TO_DSPTX_SRC_WIDTH 1 /* DAC_TO_DSPTX_SRC */ | ||
3163 | |||
3164 | /* | ||
3165 | * R1552 (0x610) - DAC Softmute | ||
3166 | */ | ||
3167 | #define WM8996_DAC_SOFTMUTEMODE 0x0002 /* DAC_SOFTMUTEMODE */ | ||
3168 | #define WM8996_DAC_SOFTMUTEMODE_MASK 0x0002 /* DAC_SOFTMUTEMODE */ | ||
3169 | #define WM8996_DAC_SOFTMUTEMODE_SHIFT 1 /* DAC_SOFTMUTEMODE */ | ||
3170 | #define WM8996_DAC_SOFTMUTEMODE_WIDTH 1 /* DAC_SOFTMUTEMODE */ | ||
3171 | #define WM8996_DAC_MUTERATE 0x0001 /* DAC_MUTERATE */ | ||
3172 | #define WM8996_DAC_MUTERATE_MASK 0x0001 /* DAC_MUTERATE */ | ||
3173 | #define WM8996_DAC_MUTERATE_SHIFT 0 /* DAC_MUTERATE */ | ||
3174 | #define WM8996_DAC_MUTERATE_WIDTH 1 /* DAC_MUTERATE */ | ||
3175 | |||
3176 | /* | ||
3177 | * R1568 (0x620) - Oversampling | ||
3178 | */ | ||
3179 | #define WM8996_SPK_OSR128 0x0008 /* SPK_OSR128 */ | ||
3180 | #define WM8996_SPK_OSR128_MASK 0x0008 /* SPK_OSR128 */ | ||
3181 | #define WM8996_SPK_OSR128_SHIFT 3 /* SPK_OSR128 */ | ||
3182 | #define WM8996_SPK_OSR128_WIDTH 1 /* SPK_OSR128 */ | ||
3183 | #define WM8996_DMIC_OSR64 0x0004 /* DMIC_OSR64 */ | ||
3184 | #define WM8996_DMIC_OSR64_MASK 0x0004 /* DMIC_OSR64 */ | ||
3185 | #define WM8996_DMIC_OSR64_SHIFT 2 /* DMIC_OSR64 */ | ||
3186 | #define WM8996_DMIC_OSR64_WIDTH 1 /* DMIC_OSR64 */ | ||
3187 | #define WM8996_ADC_OSR128 0x0002 /* ADC_OSR128 */ | ||
3188 | #define WM8996_ADC_OSR128_MASK 0x0002 /* ADC_OSR128 */ | ||
3189 | #define WM8996_ADC_OSR128_SHIFT 1 /* ADC_OSR128 */ | ||
3190 | #define WM8996_ADC_OSR128_WIDTH 1 /* ADC_OSR128 */ | ||
3191 | #define WM8996_DAC_OSR128 0x0001 /* DAC_OSR128 */ | ||
3192 | #define WM8996_DAC_OSR128_MASK 0x0001 /* DAC_OSR128 */ | ||
3193 | #define WM8996_DAC_OSR128_SHIFT 0 /* DAC_OSR128 */ | ||
3194 | #define WM8996_DAC_OSR128_WIDTH 1 /* DAC_OSR128 */ | ||
3195 | |||
3196 | /* | ||
3197 | * R1569 (0x621) - Sidetone | ||
3198 | */ | ||
3199 | #define WM8996_ST_LPF 0x1000 /* ST_LPF */ | ||
3200 | #define WM8996_ST_LPF_MASK 0x1000 /* ST_LPF */ | ||
3201 | #define WM8996_ST_LPF_SHIFT 12 /* ST_LPF */ | ||
3202 | #define WM8996_ST_LPF_WIDTH 1 /* ST_LPF */ | ||
3203 | #define WM8996_ST_HPF_CUT_MASK 0x0380 /* ST_HPF_CUT - [9:7] */ | ||
3204 | #define WM8996_ST_HPF_CUT_SHIFT 7 /* ST_HPF_CUT - [9:7] */ | ||
3205 | #define WM8996_ST_HPF_CUT_WIDTH 3 /* ST_HPF_CUT - [9:7] */ | ||
3206 | #define WM8996_ST_HPF 0x0040 /* ST_HPF */ | ||
3207 | #define WM8996_ST_HPF_MASK 0x0040 /* ST_HPF */ | ||
3208 | #define WM8996_ST_HPF_SHIFT 6 /* ST_HPF */ | ||
3209 | #define WM8996_ST_HPF_WIDTH 1 /* ST_HPF */ | ||
3210 | #define WM8996_STR_SEL 0x0002 /* STR_SEL */ | ||
3211 | #define WM8996_STR_SEL_MASK 0x0002 /* STR_SEL */ | ||
3212 | #define WM8996_STR_SEL_SHIFT 1 /* STR_SEL */ | ||
3213 | #define WM8996_STR_SEL_WIDTH 1 /* STR_SEL */ | ||
3214 | #define WM8996_STL_SEL 0x0001 /* STL_SEL */ | ||
3215 | #define WM8996_STL_SEL_MASK 0x0001 /* STL_SEL */ | ||
3216 | #define WM8996_STL_SEL_SHIFT 0 /* STL_SEL */ | ||
3217 | #define WM8996_STL_SEL_WIDTH 1 /* STL_SEL */ | ||
3218 | |||
3219 | /* | ||
3220 | * R1792 (0x700) - GPIO 1 | ||
3221 | */ | ||
3222 | #define WM8996_GP1_DIR 0x8000 /* GP1_DIR */ | ||
3223 | #define WM8996_GP1_DIR_MASK 0x8000 /* GP1_DIR */ | ||
3224 | #define WM8996_GP1_DIR_SHIFT 15 /* GP1_DIR */ | ||
3225 | #define WM8996_GP1_DIR_WIDTH 1 /* GP1_DIR */ | ||
3226 | #define WM8996_GP1_PU 0x4000 /* GP1_PU */ | ||
3227 | #define WM8996_GP1_PU_MASK 0x4000 /* GP1_PU */ | ||
3228 | #define WM8996_GP1_PU_SHIFT 14 /* GP1_PU */ | ||
3229 | #define WM8996_GP1_PU_WIDTH 1 /* GP1_PU */ | ||
3230 | #define WM8996_GP1_PD 0x2000 /* GP1_PD */ | ||
3231 | #define WM8996_GP1_PD_MASK 0x2000 /* GP1_PD */ | ||
3232 | #define WM8996_GP1_PD_SHIFT 13 /* GP1_PD */ | ||
3233 | #define WM8996_GP1_PD_WIDTH 1 /* GP1_PD */ | ||
3234 | #define WM8996_GP1_POL 0x0400 /* GP1_POL */ | ||
3235 | #define WM8996_GP1_POL_MASK 0x0400 /* GP1_POL */ | ||
3236 | #define WM8996_GP1_POL_SHIFT 10 /* GP1_POL */ | ||
3237 | #define WM8996_GP1_POL_WIDTH 1 /* GP1_POL */ | ||
3238 | #define WM8996_GP1_OP_CFG 0x0200 /* GP1_OP_CFG */ | ||
3239 | #define WM8996_GP1_OP_CFG_MASK 0x0200 /* GP1_OP_CFG */ | ||
3240 | #define WM8996_GP1_OP_CFG_SHIFT 9 /* GP1_OP_CFG */ | ||
3241 | #define WM8996_GP1_OP_CFG_WIDTH 1 /* GP1_OP_CFG */ | ||
3242 | #define WM8996_GP1_DB 0x0100 /* GP1_DB */ | ||
3243 | #define WM8996_GP1_DB_MASK 0x0100 /* GP1_DB */ | ||
3244 | #define WM8996_GP1_DB_SHIFT 8 /* GP1_DB */ | ||
3245 | #define WM8996_GP1_DB_WIDTH 1 /* GP1_DB */ | ||
3246 | #define WM8996_GP1_LVL 0x0040 /* GP1_LVL */ | ||
3247 | #define WM8996_GP1_LVL_MASK 0x0040 /* GP1_LVL */ | ||
3248 | #define WM8996_GP1_LVL_SHIFT 6 /* GP1_LVL */ | ||
3249 | #define WM8996_GP1_LVL_WIDTH 1 /* GP1_LVL */ | ||
3250 | #define WM8996_GP1_FN_MASK 0x000F /* GP1_FN - [3:0] */ | ||
3251 | #define WM8996_GP1_FN_SHIFT 0 /* GP1_FN - [3:0] */ | ||
3252 | #define WM8996_GP1_FN_WIDTH 4 /* GP1_FN - [3:0] */ | ||
3253 | |||
3254 | /* | ||
3255 | * R1793 (0x701) - GPIO 2 | ||
3256 | */ | ||
3257 | #define WM8996_GP2_DIR 0x8000 /* GP2_DIR */ | ||
3258 | #define WM8996_GP2_DIR_MASK 0x8000 /* GP2_DIR */ | ||
3259 | #define WM8996_GP2_DIR_SHIFT 15 /* GP2_DIR */ | ||
3260 | #define WM8996_GP2_DIR_WIDTH 1 /* GP2_DIR */ | ||
3261 | #define WM8996_GP2_PU 0x4000 /* GP2_PU */ | ||
3262 | #define WM8996_GP2_PU_MASK 0x4000 /* GP2_PU */ | ||
3263 | #define WM8996_GP2_PU_SHIFT 14 /* GP2_PU */ | ||
3264 | #define WM8996_GP2_PU_WIDTH 1 /* GP2_PU */ | ||
3265 | #define WM8996_GP2_PD 0x2000 /* GP2_PD */ | ||
3266 | #define WM8996_GP2_PD_MASK 0x2000 /* GP2_PD */ | ||
3267 | #define WM8996_GP2_PD_SHIFT 13 /* GP2_PD */ | ||
3268 | #define WM8996_GP2_PD_WIDTH 1 /* GP2_PD */ | ||
3269 | #define WM8996_GP2_POL 0x0400 /* GP2_POL */ | ||
3270 | #define WM8996_GP2_POL_MASK 0x0400 /* GP2_POL */ | ||
3271 | #define WM8996_GP2_POL_SHIFT 10 /* GP2_POL */ | ||
3272 | #define WM8996_GP2_POL_WIDTH 1 /* GP2_POL */ | ||
3273 | #define WM8996_GP2_OP_CFG 0x0200 /* GP2_OP_CFG */ | ||
3274 | #define WM8996_GP2_OP_CFG_MASK 0x0200 /* GP2_OP_CFG */ | ||
3275 | #define WM8996_GP2_OP_CFG_SHIFT 9 /* GP2_OP_CFG */ | ||
3276 | #define WM8996_GP2_OP_CFG_WIDTH 1 /* GP2_OP_CFG */ | ||
3277 | #define WM8996_GP2_DB 0x0100 /* GP2_DB */ | ||
3278 | #define WM8996_GP2_DB_MASK 0x0100 /* GP2_DB */ | ||
3279 | #define WM8996_GP2_DB_SHIFT 8 /* GP2_DB */ | ||
3280 | #define WM8996_GP2_DB_WIDTH 1 /* GP2_DB */ | ||
3281 | #define WM8996_GP2_LVL 0x0040 /* GP2_LVL */ | ||
3282 | #define WM8996_GP2_LVL_MASK 0x0040 /* GP2_LVL */ | ||
3283 | #define WM8996_GP2_LVL_SHIFT 6 /* GP2_LVL */ | ||
3284 | #define WM8996_GP2_LVL_WIDTH 1 /* GP2_LVL */ | ||
3285 | #define WM8996_GP2_FN_MASK 0x000F /* GP2_FN - [3:0] */ | ||
3286 | #define WM8996_GP2_FN_SHIFT 0 /* GP2_FN - [3:0] */ | ||
3287 | #define WM8996_GP2_FN_WIDTH 4 /* GP2_FN - [3:0] */ | ||
3288 | |||
3289 | /* | ||
3290 | * R1794 (0x702) - GPIO 3 | ||
3291 | */ | ||
3292 | #define WM8996_GP3_DIR 0x8000 /* GP3_DIR */ | ||
3293 | #define WM8996_GP3_DIR_MASK 0x8000 /* GP3_DIR */ | ||
3294 | #define WM8996_GP3_DIR_SHIFT 15 /* GP3_DIR */ | ||
3295 | #define WM8996_GP3_DIR_WIDTH 1 /* GP3_DIR */ | ||
3296 | #define WM8996_GP3_PU 0x4000 /* GP3_PU */ | ||
3297 | #define WM8996_GP3_PU_MASK 0x4000 /* GP3_PU */ | ||
3298 | #define WM8996_GP3_PU_SHIFT 14 /* GP3_PU */ | ||
3299 | #define WM8996_GP3_PU_WIDTH 1 /* GP3_PU */ | ||
3300 | #define WM8996_GP3_PD 0x2000 /* GP3_PD */ | ||
3301 | #define WM8996_GP3_PD_MASK 0x2000 /* GP3_PD */ | ||
3302 | #define WM8996_GP3_PD_SHIFT 13 /* GP3_PD */ | ||
3303 | #define WM8996_GP3_PD_WIDTH 1 /* GP3_PD */ | ||
3304 | #define WM8996_GP3_POL 0x0400 /* GP3_POL */ | ||
3305 | #define WM8996_GP3_POL_MASK 0x0400 /* GP3_POL */ | ||
3306 | #define WM8996_GP3_POL_SHIFT 10 /* GP3_POL */ | ||
3307 | #define WM8996_GP3_POL_WIDTH 1 /* GP3_POL */ | ||
3308 | #define WM8996_GP3_OP_CFG 0x0200 /* GP3_OP_CFG */ | ||
3309 | #define WM8996_GP3_OP_CFG_MASK 0x0200 /* GP3_OP_CFG */ | ||
3310 | #define WM8996_GP3_OP_CFG_SHIFT 9 /* GP3_OP_CFG */ | ||
3311 | #define WM8996_GP3_OP_CFG_WIDTH 1 /* GP3_OP_CFG */ | ||
3312 | #define WM8996_GP3_DB 0x0100 /* GP3_DB */ | ||
3313 | #define WM8996_GP3_DB_MASK 0x0100 /* GP3_DB */ | ||
3314 | #define WM8996_GP3_DB_SHIFT 8 /* GP3_DB */ | ||
3315 | #define WM8996_GP3_DB_WIDTH 1 /* GP3_DB */ | ||
3316 | #define WM8996_GP3_LVL 0x0040 /* GP3_LVL */ | ||
3317 | #define WM8996_GP3_LVL_MASK 0x0040 /* GP3_LVL */ | ||
3318 | #define WM8996_GP3_LVL_SHIFT 6 /* GP3_LVL */ | ||
3319 | #define WM8996_GP3_LVL_WIDTH 1 /* GP3_LVL */ | ||
3320 | #define WM8996_GP3_FN_MASK 0x000F /* GP3_FN - [3:0] */ | ||
3321 | #define WM8996_GP3_FN_SHIFT 0 /* GP3_FN - [3:0] */ | ||
3322 | #define WM8996_GP3_FN_WIDTH 4 /* GP3_FN - [3:0] */ | ||
3323 | |||
3324 | /* | ||
3325 | * R1795 (0x703) - GPIO 4 | ||
3326 | */ | ||
3327 | #define WM8996_GP4_DIR 0x8000 /* GP4_DIR */ | ||
3328 | #define WM8996_GP4_DIR_MASK 0x8000 /* GP4_DIR */ | ||
3329 | #define WM8996_GP4_DIR_SHIFT 15 /* GP4_DIR */ | ||
3330 | #define WM8996_GP4_DIR_WIDTH 1 /* GP4_DIR */ | ||
3331 | #define WM8996_GP4_PU 0x4000 /* GP4_PU */ | ||
3332 | #define WM8996_GP4_PU_MASK 0x4000 /* GP4_PU */ | ||
3333 | #define WM8996_GP4_PU_SHIFT 14 /* GP4_PU */ | ||
3334 | #define WM8996_GP4_PU_WIDTH 1 /* GP4_PU */ | ||
3335 | #define WM8996_GP4_PD 0x2000 /* GP4_PD */ | ||
3336 | #define WM8996_GP4_PD_MASK 0x2000 /* GP4_PD */ | ||
3337 | #define WM8996_GP4_PD_SHIFT 13 /* GP4_PD */ | ||
3338 | #define WM8996_GP4_PD_WIDTH 1 /* GP4_PD */ | ||
3339 | #define WM8996_GP4_POL 0x0400 /* GP4_POL */ | ||
3340 | #define WM8996_GP4_POL_MASK 0x0400 /* GP4_POL */ | ||
3341 | #define WM8996_GP4_POL_SHIFT 10 /* GP4_POL */ | ||
3342 | #define WM8996_GP4_POL_WIDTH 1 /* GP4_POL */ | ||
3343 | #define WM8996_GP4_OP_CFG 0x0200 /* GP4_OP_CFG */ | ||
3344 | #define WM8996_GP4_OP_CFG_MASK 0x0200 /* GP4_OP_CFG */ | ||
3345 | #define WM8996_GP4_OP_CFG_SHIFT 9 /* GP4_OP_CFG */ | ||
3346 | #define WM8996_GP4_OP_CFG_WIDTH 1 /* GP4_OP_CFG */ | ||
3347 | #define WM8996_GP4_DB 0x0100 /* GP4_DB */ | ||
3348 | #define WM8996_GP4_DB_MASK 0x0100 /* GP4_DB */ | ||
3349 | #define WM8996_GP4_DB_SHIFT 8 /* GP4_DB */ | ||
3350 | #define WM8996_GP4_DB_WIDTH 1 /* GP4_DB */ | ||
3351 | #define WM8996_GP4_LVL 0x0040 /* GP4_LVL */ | ||
3352 | #define WM8996_GP4_LVL_MASK 0x0040 /* GP4_LVL */ | ||
3353 | #define WM8996_GP4_LVL_SHIFT 6 /* GP4_LVL */ | ||
3354 | #define WM8996_GP4_LVL_WIDTH 1 /* GP4_LVL */ | ||
3355 | #define WM8996_GP4_FN_MASK 0x000F /* GP4_FN - [3:0] */ | ||
3356 | #define WM8996_GP4_FN_SHIFT 0 /* GP4_FN - [3:0] */ | ||
3357 | #define WM8996_GP4_FN_WIDTH 4 /* GP4_FN - [3:0] */ | ||
3358 | |||
3359 | /* | ||
3360 | * R1796 (0x704) - GPIO 5 | ||
3361 | */ | ||
3362 | #define WM8996_GP5_DIR 0x8000 /* GP5_DIR */ | ||
3363 | #define WM8996_GP5_DIR_MASK 0x8000 /* GP5_DIR */ | ||
3364 | #define WM8996_GP5_DIR_SHIFT 15 /* GP5_DIR */ | ||
3365 | #define WM8996_GP5_DIR_WIDTH 1 /* GP5_DIR */ | ||
3366 | #define WM8996_GP5_PU 0x4000 /* GP5_PU */ | ||
3367 | #define WM8996_GP5_PU_MASK 0x4000 /* GP5_PU */ | ||
3368 | #define WM8996_GP5_PU_SHIFT 14 /* GP5_PU */ | ||
3369 | #define WM8996_GP5_PU_WIDTH 1 /* GP5_PU */ | ||
3370 | #define WM8996_GP5_PD 0x2000 /* GP5_PD */ | ||
3371 | #define WM8996_GP5_PD_MASK 0x2000 /* GP5_PD */ | ||
3372 | #define WM8996_GP5_PD_SHIFT 13 /* GP5_PD */ | ||
3373 | #define WM8996_GP5_PD_WIDTH 1 /* GP5_PD */ | ||
3374 | #define WM8996_GP5_POL 0x0400 /* GP5_POL */ | ||
3375 | #define WM8996_GP5_POL_MASK 0x0400 /* GP5_POL */ | ||
3376 | #define WM8996_GP5_POL_SHIFT 10 /* GP5_POL */ | ||
3377 | #define WM8996_GP5_POL_WIDTH 1 /* GP5_POL */ | ||
3378 | #define WM8996_GP5_OP_CFG 0x0200 /* GP5_OP_CFG */ | ||
3379 | #define WM8996_GP5_OP_CFG_MASK 0x0200 /* GP5_OP_CFG */ | ||
3380 | #define WM8996_GP5_OP_CFG_SHIFT 9 /* GP5_OP_CFG */ | ||
3381 | #define WM8996_GP5_OP_CFG_WIDTH 1 /* GP5_OP_CFG */ | ||
3382 | #define WM8996_GP5_DB 0x0100 /* GP5_DB */ | ||
3383 | #define WM8996_GP5_DB_MASK 0x0100 /* GP5_DB */ | ||
3384 | #define WM8996_GP5_DB_SHIFT 8 /* GP5_DB */ | ||
3385 | #define WM8996_GP5_DB_WIDTH 1 /* GP5_DB */ | ||
3386 | #define WM8996_GP5_LVL 0x0040 /* GP5_LVL */ | ||
3387 | #define WM8996_GP5_LVL_MASK 0x0040 /* GP5_LVL */ | ||
3388 | #define WM8996_GP5_LVL_SHIFT 6 /* GP5_LVL */ | ||
3389 | #define WM8996_GP5_LVL_WIDTH 1 /* GP5_LVL */ | ||
3390 | #define WM8996_GP5_FN_MASK 0x000F /* GP5_FN - [3:0] */ | ||
3391 | #define WM8996_GP5_FN_SHIFT 0 /* GP5_FN - [3:0] */ | ||
3392 | #define WM8996_GP5_FN_WIDTH 4 /* GP5_FN - [3:0] */ | ||
3393 | |||
3394 | /* | ||
3395 | * R1824 (0x720) - Pull Control (1) | ||
3396 | */ | ||
3397 | #define WM8996_DMICDAT2_PD 0x1000 /* DMICDAT2_PD */ | ||
3398 | #define WM8996_DMICDAT2_PD_MASK 0x1000 /* DMICDAT2_PD */ | ||
3399 | #define WM8996_DMICDAT2_PD_SHIFT 12 /* DMICDAT2_PD */ | ||
3400 | #define WM8996_DMICDAT2_PD_WIDTH 1 /* DMICDAT2_PD */ | ||
3401 | #define WM8996_DMICDAT1_PD 0x0400 /* DMICDAT1_PD */ | ||
3402 | #define WM8996_DMICDAT1_PD_MASK 0x0400 /* DMICDAT1_PD */ | ||
3403 | #define WM8996_DMICDAT1_PD_SHIFT 10 /* DMICDAT1_PD */ | ||
3404 | #define WM8996_DMICDAT1_PD_WIDTH 1 /* DMICDAT1_PD */ | ||
3405 | #define WM8996_MCLK2_PU 0x0200 /* MCLK2_PU */ | ||
3406 | #define WM8996_MCLK2_PU_MASK 0x0200 /* MCLK2_PU */ | ||
3407 | #define WM8996_MCLK2_PU_SHIFT 9 /* MCLK2_PU */ | ||
3408 | #define WM8996_MCLK2_PU_WIDTH 1 /* MCLK2_PU */ | ||
3409 | #define WM8996_MCLK2_PD 0x0100 /* MCLK2_PD */ | ||
3410 | #define WM8996_MCLK2_PD_MASK 0x0100 /* MCLK2_PD */ | ||
3411 | #define WM8996_MCLK2_PD_SHIFT 8 /* MCLK2_PD */ | ||
3412 | #define WM8996_MCLK2_PD_WIDTH 1 /* MCLK2_PD */ | ||
3413 | #define WM8996_MCLK1_PU 0x0080 /* MCLK1_PU */ | ||
3414 | #define WM8996_MCLK1_PU_MASK 0x0080 /* MCLK1_PU */ | ||
3415 | #define WM8996_MCLK1_PU_SHIFT 7 /* MCLK1_PU */ | ||
3416 | #define WM8996_MCLK1_PU_WIDTH 1 /* MCLK1_PU */ | ||
3417 | #define WM8996_MCLK1_PD 0x0040 /* MCLK1_PD */ | ||
3418 | #define WM8996_MCLK1_PD_MASK 0x0040 /* MCLK1_PD */ | ||
3419 | #define WM8996_MCLK1_PD_SHIFT 6 /* MCLK1_PD */ | ||
3420 | #define WM8996_MCLK1_PD_WIDTH 1 /* MCLK1_PD */ | ||
3421 | #define WM8996_DACDAT1_PU 0x0020 /* DACDAT1_PU */ | ||
3422 | #define WM8996_DACDAT1_PU_MASK 0x0020 /* DACDAT1_PU */ | ||
3423 | #define WM8996_DACDAT1_PU_SHIFT 5 /* DACDAT1_PU */ | ||
3424 | #define WM8996_DACDAT1_PU_WIDTH 1 /* DACDAT1_PU */ | ||
3425 | #define WM8996_DACDAT1_PD 0x0010 /* DACDAT1_PD */ | ||
3426 | #define WM8996_DACDAT1_PD_MASK 0x0010 /* DACDAT1_PD */ | ||
3427 | #define WM8996_DACDAT1_PD_SHIFT 4 /* DACDAT1_PD */ | ||
3428 | #define WM8996_DACDAT1_PD_WIDTH 1 /* DACDAT1_PD */ | ||
3429 | #define WM8996_DACLRCLK1_PU 0x0008 /* DACLRCLK1_PU */ | ||
3430 | #define WM8996_DACLRCLK1_PU_MASK 0x0008 /* DACLRCLK1_PU */ | ||
3431 | #define WM8996_DACLRCLK1_PU_SHIFT 3 /* DACLRCLK1_PU */ | ||
3432 | #define WM8996_DACLRCLK1_PU_WIDTH 1 /* DACLRCLK1_PU */ | ||
3433 | #define WM8996_DACLRCLK1_PD 0x0004 /* DACLRCLK1_PD */ | ||
3434 | #define WM8996_DACLRCLK1_PD_MASK 0x0004 /* DACLRCLK1_PD */ | ||
3435 | #define WM8996_DACLRCLK1_PD_SHIFT 2 /* DACLRCLK1_PD */ | ||
3436 | #define WM8996_DACLRCLK1_PD_WIDTH 1 /* DACLRCLK1_PD */ | ||
3437 | #define WM8996_BCLK1_PU 0x0002 /* BCLK1_PU */ | ||
3438 | #define WM8996_BCLK1_PU_MASK 0x0002 /* BCLK1_PU */ | ||
3439 | #define WM8996_BCLK1_PU_SHIFT 1 /* BCLK1_PU */ | ||
3440 | #define WM8996_BCLK1_PU_WIDTH 1 /* BCLK1_PU */ | ||
3441 | #define WM8996_BCLK1_PD 0x0001 /* BCLK1_PD */ | ||
3442 | #define WM8996_BCLK1_PD_MASK 0x0001 /* BCLK1_PD */ | ||
3443 | #define WM8996_BCLK1_PD_SHIFT 0 /* BCLK1_PD */ | ||
3444 | #define WM8996_BCLK1_PD_WIDTH 1 /* BCLK1_PD */ | ||
3445 | |||
3446 | /* | ||
3447 | * R1825 (0x721) - Pull Control (2) | ||
3448 | */ | ||
3449 | #define WM8996_LDO1ENA_PD 0x0100 /* LDO1ENA_PD */ | ||
3450 | #define WM8996_LDO1ENA_PD_MASK 0x0100 /* LDO1ENA_PD */ | ||
3451 | #define WM8996_LDO1ENA_PD_SHIFT 8 /* LDO1ENA_PD */ | ||
3452 | #define WM8996_LDO1ENA_PD_WIDTH 1 /* LDO1ENA_PD */ | ||
3453 | #define WM8996_ADDR_PD 0x0040 /* ADDR_PD */ | ||
3454 | #define WM8996_ADDR_PD_MASK 0x0040 /* ADDR_PD */ | ||
3455 | #define WM8996_ADDR_PD_SHIFT 6 /* ADDR_PD */ | ||
3456 | #define WM8996_ADDR_PD_WIDTH 1 /* ADDR_PD */ | ||
3457 | #define WM8996_DACDAT2_PU 0x0020 /* DACDAT2_PU */ | ||
3458 | #define WM8996_DACDAT2_PU_MASK 0x0020 /* DACDAT2_PU */ | ||
3459 | #define WM8996_DACDAT2_PU_SHIFT 5 /* DACDAT2_PU */ | ||
3460 | #define WM8996_DACDAT2_PU_WIDTH 1 /* DACDAT2_PU */ | ||
3461 | #define WM8996_DACDAT2_PD 0x0010 /* DACDAT2_PD */ | ||
3462 | #define WM8996_DACDAT2_PD_MASK 0x0010 /* DACDAT2_PD */ | ||
3463 | #define WM8996_DACDAT2_PD_SHIFT 4 /* DACDAT2_PD */ | ||
3464 | #define WM8996_DACDAT2_PD_WIDTH 1 /* DACDAT2_PD */ | ||
3465 | #define WM8996_DACLRCLK2_PU 0x0008 /* DACLRCLK2_PU */ | ||
3466 | #define WM8996_DACLRCLK2_PU_MASK 0x0008 /* DACLRCLK2_PU */ | ||
3467 | #define WM8996_DACLRCLK2_PU_SHIFT 3 /* DACLRCLK2_PU */ | ||
3468 | #define WM8996_DACLRCLK2_PU_WIDTH 1 /* DACLRCLK2_PU */ | ||
3469 | #define WM8996_DACLRCLK2_PD 0x0004 /* DACLRCLK2_PD */ | ||
3470 | #define WM8996_DACLRCLK2_PD_MASK 0x0004 /* DACLRCLK2_PD */ | ||
3471 | #define WM8996_DACLRCLK2_PD_SHIFT 2 /* DACLRCLK2_PD */ | ||
3472 | #define WM8996_DACLRCLK2_PD_WIDTH 1 /* DACLRCLK2_PD */ | ||
3473 | #define WM8996_BCLK2_PU 0x0002 /* BCLK2_PU */ | ||
3474 | #define WM8996_BCLK2_PU_MASK 0x0002 /* BCLK2_PU */ | ||
3475 | #define WM8996_BCLK2_PU_SHIFT 1 /* BCLK2_PU */ | ||
3476 | #define WM8996_BCLK2_PU_WIDTH 1 /* BCLK2_PU */ | ||
3477 | #define WM8996_BCLK2_PD 0x0001 /* BCLK2_PD */ | ||
3478 | #define WM8996_BCLK2_PD_MASK 0x0001 /* BCLK2_PD */ | ||
3479 | #define WM8996_BCLK2_PD_SHIFT 0 /* BCLK2_PD */ | ||
3480 | #define WM8996_BCLK2_PD_WIDTH 1 /* BCLK2_PD */ | ||
3481 | |||
3482 | /* | ||
3483 | * R1840 (0x730) - Interrupt Status 1 | ||
3484 | */ | ||
3485 | #define WM8996_GP5_EINT 0x0010 /* GP5_EINT */ | ||
3486 | #define WM8996_GP5_EINT_MASK 0x0010 /* GP5_EINT */ | ||
3487 | #define WM8996_GP5_EINT_SHIFT 4 /* GP5_EINT */ | ||
3488 | #define WM8996_GP5_EINT_WIDTH 1 /* GP5_EINT */ | ||
3489 | #define WM8996_GP4_EINT 0x0008 /* GP4_EINT */ | ||
3490 | #define WM8996_GP4_EINT_MASK 0x0008 /* GP4_EINT */ | ||
3491 | #define WM8996_GP4_EINT_SHIFT 3 /* GP4_EINT */ | ||
3492 | #define WM8996_GP4_EINT_WIDTH 1 /* GP4_EINT */ | ||
3493 | #define WM8996_GP3_EINT 0x0004 /* GP3_EINT */ | ||
3494 | #define WM8996_GP3_EINT_MASK 0x0004 /* GP3_EINT */ | ||
3495 | #define WM8996_GP3_EINT_SHIFT 2 /* GP3_EINT */ | ||
3496 | #define WM8996_GP3_EINT_WIDTH 1 /* GP3_EINT */ | ||
3497 | #define WM8996_GP2_EINT 0x0002 /* GP2_EINT */ | ||
3498 | #define WM8996_GP2_EINT_MASK 0x0002 /* GP2_EINT */ | ||
3499 | #define WM8996_GP2_EINT_SHIFT 1 /* GP2_EINT */ | ||
3500 | #define WM8996_GP2_EINT_WIDTH 1 /* GP2_EINT */ | ||
3501 | #define WM8996_GP1_EINT 0x0001 /* GP1_EINT */ | ||
3502 | #define WM8996_GP1_EINT_MASK 0x0001 /* GP1_EINT */ | ||
3503 | #define WM8996_GP1_EINT_SHIFT 0 /* GP1_EINT */ | ||
3504 | #define WM8996_GP1_EINT_WIDTH 1 /* GP1_EINT */ | ||
3505 | |||
3506 | /* | ||
3507 | * R1841 (0x731) - Interrupt Status 2 | ||
3508 | */ | ||
3509 | #define WM8996_DCS_DONE_23_EINT 0x1000 /* DCS_DONE_23_EINT */ | ||
3510 | #define WM8996_DCS_DONE_23_EINT_MASK 0x1000 /* DCS_DONE_23_EINT */ | ||
3511 | #define WM8996_DCS_DONE_23_EINT_SHIFT 12 /* DCS_DONE_23_EINT */ | ||
3512 | #define WM8996_DCS_DONE_23_EINT_WIDTH 1 /* DCS_DONE_23_EINT */ | ||
3513 | #define WM8996_DCS_DONE_01_EINT 0x0800 /* DCS_DONE_01_EINT */ | ||
3514 | #define WM8996_DCS_DONE_01_EINT_MASK 0x0800 /* DCS_DONE_01_EINT */ | ||
3515 | #define WM8996_DCS_DONE_01_EINT_SHIFT 11 /* DCS_DONE_01_EINT */ | ||
3516 | #define WM8996_DCS_DONE_01_EINT_WIDTH 1 /* DCS_DONE_01_EINT */ | ||
3517 | #define WM8996_WSEQ_DONE_EINT 0x0400 /* WSEQ_DONE_EINT */ | ||
3518 | #define WM8996_WSEQ_DONE_EINT_MASK 0x0400 /* WSEQ_DONE_EINT */ | ||
3519 | #define WM8996_WSEQ_DONE_EINT_SHIFT 10 /* WSEQ_DONE_EINT */ | ||
3520 | #define WM8996_WSEQ_DONE_EINT_WIDTH 1 /* WSEQ_DONE_EINT */ | ||
3521 | #define WM8996_FIFOS_ERR_EINT 0x0200 /* FIFOS_ERR_EINT */ | ||
3522 | #define WM8996_FIFOS_ERR_EINT_MASK 0x0200 /* FIFOS_ERR_EINT */ | ||
3523 | #define WM8996_FIFOS_ERR_EINT_SHIFT 9 /* FIFOS_ERR_EINT */ | ||
3524 | #define WM8996_FIFOS_ERR_EINT_WIDTH 1 /* FIFOS_ERR_EINT */ | ||
3525 | #define WM8996_DSP2DRC_SIG_DET_EINT 0x0080 /* DSP2DRC_SIG_DET_EINT */ | ||
3526 | #define WM8996_DSP2DRC_SIG_DET_EINT_MASK 0x0080 /* DSP2DRC_SIG_DET_EINT */ | ||
3527 | #define WM8996_DSP2DRC_SIG_DET_EINT_SHIFT 7 /* DSP2DRC_SIG_DET_EINT */ | ||
3528 | #define WM8996_DSP2DRC_SIG_DET_EINT_WIDTH 1 /* DSP2DRC_SIG_DET_EINT */ | ||
3529 | #define WM8996_DSP1DRC_SIG_DET_EINT 0x0040 /* DSP1DRC_SIG_DET_EINT */ | ||
3530 | #define WM8996_DSP1DRC_SIG_DET_EINT_MASK 0x0040 /* DSP1DRC_SIG_DET_EINT */ | ||
3531 | #define WM8996_DSP1DRC_SIG_DET_EINT_SHIFT 6 /* DSP1DRC_SIG_DET_EINT */ | ||
3532 | #define WM8996_DSP1DRC_SIG_DET_EINT_WIDTH 1 /* DSP1DRC_SIG_DET_EINT */ | ||
3533 | #define WM8996_FLL_SW_CLK_DONE_EINT 0x0008 /* FLL_SW_CLK_DONE_EINT */ | ||
3534 | #define WM8996_FLL_SW_CLK_DONE_EINT_MASK 0x0008 /* FLL_SW_CLK_DONE_EINT */ | ||
3535 | #define WM8996_FLL_SW_CLK_DONE_EINT_SHIFT 3 /* FLL_SW_CLK_DONE_EINT */ | ||
3536 | #define WM8996_FLL_SW_CLK_DONE_EINT_WIDTH 1 /* FLL_SW_CLK_DONE_EINT */ | ||
3537 | #define WM8996_FLL_LOCK_EINT 0x0004 /* FLL_LOCK_EINT */ | ||
3538 | #define WM8996_FLL_LOCK_EINT_MASK 0x0004 /* FLL_LOCK_EINT */ | ||
3539 | #define WM8996_FLL_LOCK_EINT_SHIFT 2 /* FLL_LOCK_EINT */ | ||
3540 | #define WM8996_FLL_LOCK_EINT_WIDTH 1 /* FLL_LOCK_EINT */ | ||
3541 | #define WM8996_HP_DONE_EINT 0x0002 /* HP_DONE_EINT */ | ||
3542 | #define WM8996_HP_DONE_EINT_MASK 0x0002 /* HP_DONE_EINT */ | ||
3543 | #define WM8996_HP_DONE_EINT_SHIFT 1 /* HP_DONE_EINT */ | ||
3544 | #define WM8996_HP_DONE_EINT_WIDTH 1 /* HP_DONE_EINT */ | ||
3545 | #define WM8996_MICD_EINT 0x0001 /* MICD_EINT */ | ||
3546 | #define WM8996_MICD_EINT_MASK 0x0001 /* MICD_EINT */ | ||
3547 | #define WM8996_MICD_EINT_SHIFT 0 /* MICD_EINT */ | ||
3548 | #define WM8996_MICD_EINT_WIDTH 1 /* MICD_EINT */ | ||
3549 | |||
3550 | /* | ||
3551 | * R1842 (0x732) - Interrupt Raw Status 2 | ||
3552 | */ | ||
3553 | #define WM8996_DCS_DONE_23_STS 0x1000 /* DCS_DONE_23_STS */ | ||
3554 | #define WM8996_DCS_DONE_23_STS_MASK 0x1000 /* DCS_DONE_23_STS */ | ||
3555 | #define WM8996_DCS_DONE_23_STS_SHIFT 12 /* DCS_DONE_23_STS */ | ||
3556 | #define WM8996_DCS_DONE_23_STS_WIDTH 1 /* DCS_DONE_23_STS */ | ||
3557 | #define WM8996_DCS_DONE_01_STS 0x0800 /* DCS_DONE_01_STS */ | ||
3558 | #define WM8996_DCS_DONE_01_STS_MASK 0x0800 /* DCS_DONE_01_STS */ | ||
3559 | #define WM8996_DCS_DONE_01_STS_SHIFT 11 /* DCS_DONE_01_STS */ | ||
3560 | #define WM8996_DCS_DONE_01_STS_WIDTH 1 /* DCS_DONE_01_STS */ | ||
3561 | #define WM8996_WSEQ_DONE_STS 0x0400 /* WSEQ_DONE_STS */ | ||
3562 | #define WM8996_WSEQ_DONE_STS_MASK 0x0400 /* WSEQ_DONE_STS */ | ||
3563 | #define WM8996_WSEQ_DONE_STS_SHIFT 10 /* WSEQ_DONE_STS */ | ||
3564 | #define WM8996_WSEQ_DONE_STS_WIDTH 1 /* WSEQ_DONE_STS */ | ||
3565 | #define WM8996_FIFOS_ERR_STS 0x0200 /* FIFOS_ERR_STS */ | ||
3566 | #define WM8996_FIFOS_ERR_STS_MASK 0x0200 /* FIFOS_ERR_STS */ | ||
3567 | #define WM8996_FIFOS_ERR_STS_SHIFT 9 /* FIFOS_ERR_STS */ | ||
3568 | #define WM8996_FIFOS_ERR_STS_WIDTH 1 /* FIFOS_ERR_STS */ | ||
3569 | #define WM8996_DSP2DRC_SIG_DET_STS 0x0080 /* DSP2DRC_SIG_DET_STS */ | ||
3570 | #define WM8996_DSP2DRC_SIG_DET_STS_MASK 0x0080 /* DSP2DRC_SIG_DET_STS */ | ||
3571 | #define WM8996_DSP2DRC_SIG_DET_STS_SHIFT 7 /* DSP2DRC_SIG_DET_STS */ | ||
3572 | #define WM8996_DSP2DRC_SIG_DET_STS_WIDTH 1 /* DSP2DRC_SIG_DET_STS */ | ||
3573 | #define WM8996_DSP1DRC_SIG_DET_STS 0x0040 /* DSP1DRC_SIG_DET_STS */ | ||
3574 | #define WM8996_DSP1DRC_SIG_DET_STS_MASK 0x0040 /* DSP1DRC_SIG_DET_STS */ | ||
3575 | #define WM8996_DSP1DRC_SIG_DET_STS_SHIFT 6 /* DSP1DRC_SIG_DET_STS */ | ||
3576 | #define WM8996_DSP1DRC_SIG_DET_STS_WIDTH 1 /* DSP1DRC_SIG_DET_STS */ | ||
3577 | #define WM8996_FLL_LOCK_STS 0x0004 /* FLL_LOCK_STS */ | ||
3578 | #define WM8996_FLL_LOCK_STS_MASK 0x0004 /* FLL_LOCK_STS */ | ||
3579 | #define WM8996_FLL_LOCK_STS_SHIFT 2 /* FLL_LOCK_STS */ | ||
3580 | #define WM8996_FLL_LOCK_STS_WIDTH 1 /* FLL_LOCK_STS */ | ||
3581 | |||
3582 | /* | ||
3583 | * R1848 (0x738) - Interrupt Status 1 Mask | ||
3584 | */ | ||
3585 | #define WM8996_IM_GP5_EINT 0x0010 /* IM_GP5_EINT */ | ||
3586 | #define WM8996_IM_GP5_EINT_MASK 0x0010 /* IM_GP5_EINT */ | ||
3587 | #define WM8996_IM_GP5_EINT_SHIFT 4 /* IM_GP5_EINT */ | ||
3588 | #define WM8996_IM_GP5_EINT_WIDTH 1 /* IM_GP5_EINT */ | ||
3589 | #define WM8996_IM_GP4_EINT 0x0008 /* IM_GP4_EINT */ | ||
3590 | #define WM8996_IM_GP4_EINT_MASK 0x0008 /* IM_GP4_EINT */ | ||
3591 | #define WM8996_IM_GP4_EINT_SHIFT 3 /* IM_GP4_EINT */ | ||
3592 | #define WM8996_IM_GP4_EINT_WIDTH 1 /* IM_GP4_EINT */ | ||
3593 | #define WM8996_IM_GP3_EINT 0x0004 /* IM_GP3_EINT */ | ||
3594 | #define WM8996_IM_GP3_EINT_MASK 0x0004 /* IM_GP3_EINT */ | ||
3595 | #define WM8996_IM_GP3_EINT_SHIFT 2 /* IM_GP3_EINT */ | ||
3596 | #define WM8996_IM_GP3_EINT_WIDTH 1 /* IM_GP3_EINT */ | ||
3597 | #define WM8996_IM_GP2_EINT 0x0002 /* IM_GP2_EINT */ | ||
3598 | #define WM8996_IM_GP2_EINT_MASK 0x0002 /* IM_GP2_EINT */ | ||
3599 | #define WM8996_IM_GP2_EINT_SHIFT 1 /* IM_GP2_EINT */ | ||
3600 | #define WM8996_IM_GP2_EINT_WIDTH 1 /* IM_GP2_EINT */ | ||
3601 | #define WM8996_IM_GP1_EINT 0x0001 /* IM_GP1_EINT */ | ||
3602 | #define WM8996_IM_GP1_EINT_MASK 0x0001 /* IM_GP1_EINT */ | ||
3603 | #define WM8996_IM_GP1_EINT_SHIFT 0 /* IM_GP1_EINT */ | ||
3604 | #define WM8996_IM_GP1_EINT_WIDTH 1 /* IM_GP1_EINT */ | ||
3605 | |||
3606 | /* | ||
3607 | * R1849 (0x739) - Interrupt Status 2 Mask | ||
3608 | */ | ||
3609 | #define WM8996_IM_DCS_DONE_23_EINT 0x1000 /* IM_DCS_DONE_23_EINT */ | ||
3610 | #define WM8996_IM_DCS_DONE_23_EINT_MASK 0x1000 /* IM_DCS_DONE_23_EINT */ | ||
3611 | #define WM8996_IM_DCS_DONE_23_EINT_SHIFT 12 /* IM_DCS_DONE_23_EINT */ | ||
3612 | #define WM8996_IM_DCS_DONE_23_EINT_WIDTH 1 /* IM_DCS_DONE_23_EINT */ | ||
3613 | #define WM8996_IM_DCS_DONE_01_EINT 0x0800 /* IM_DCS_DONE_01_EINT */ | ||
3614 | #define WM8996_IM_DCS_DONE_01_EINT_MASK 0x0800 /* IM_DCS_DONE_01_EINT */ | ||
3615 | #define WM8996_IM_DCS_DONE_01_EINT_SHIFT 11 /* IM_DCS_DONE_01_EINT */ | ||
3616 | #define WM8996_IM_DCS_DONE_01_EINT_WIDTH 1 /* IM_DCS_DONE_01_EINT */ | ||
3617 | #define WM8996_IM_WSEQ_DONE_EINT 0x0400 /* IM_WSEQ_DONE_EINT */ | ||
3618 | #define WM8996_IM_WSEQ_DONE_EINT_MASK 0x0400 /* IM_WSEQ_DONE_EINT */ | ||
3619 | #define WM8996_IM_WSEQ_DONE_EINT_SHIFT 10 /* IM_WSEQ_DONE_EINT */ | ||
3620 | #define WM8996_IM_WSEQ_DONE_EINT_WIDTH 1 /* IM_WSEQ_DONE_EINT */ | ||
3621 | #define WM8996_IM_FIFOS_ERR_EINT 0x0200 /* IM_FIFOS_ERR_EINT */ | ||
3622 | #define WM8996_IM_FIFOS_ERR_EINT_MASK 0x0200 /* IM_FIFOS_ERR_EINT */ | ||
3623 | #define WM8996_IM_FIFOS_ERR_EINT_SHIFT 9 /* IM_FIFOS_ERR_EINT */ | ||
3624 | #define WM8996_IM_FIFOS_ERR_EINT_WIDTH 1 /* IM_FIFOS_ERR_EINT */ | ||
3625 | #define WM8996_IM_DSP2DRC_SIG_DET_EINT 0x0080 /* IM_DSP2DRC_SIG_DET_EINT */ | ||
3626 | #define WM8996_IM_DSP2DRC_SIG_DET_EINT_MASK 0x0080 /* IM_DSP2DRC_SIG_DET_EINT */ | ||
3627 | #define WM8996_IM_DSP2DRC_SIG_DET_EINT_SHIFT 7 /* IM_DSP2DRC_SIG_DET_EINT */ | ||
3628 | #define WM8996_IM_DSP2DRC_SIG_DET_EINT_WIDTH 1 /* IM_DSP2DRC_SIG_DET_EINT */ | ||
3629 | #define WM8996_IM_DSP1DRC_SIG_DET_EINT 0x0040 /* IM_DSP1DRC_SIG_DET_EINT */ | ||
3630 | #define WM8996_IM_DSP1DRC_SIG_DET_EINT_MASK 0x0040 /* IM_DSP1DRC_SIG_DET_EINT */ | ||
3631 | #define WM8996_IM_DSP1DRC_SIG_DET_EINT_SHIFT 6 /* IM_DSP1DRC_SIG_DET_EINT */ | ||
3632 | #define WM8996_IM_DSP1DRC_SIG_DET_EINT_WIDTH 1 /* IM_DSP1DRC_SIG_DET_EINT */ | ||
3633 | #define WM8996_IM_FLL_SW_CLK_DONE_EINT 0x0008 /* IM_FLL_SW_CLK_DONE_EINT */ | ||
3634 | #define WM8996_IM_FLL_SW_CLK_DONE_EINT_MASK 0x0008 /* IM_FLL_SW_CLK_DONE_EINT */ | ||
3635 | #define WM8996_IM_FLL_SW_CLK_DONE_EINT_SHIFT 3 /* IM_FLL_SW_CLK_DONE_EINT */ | ||
3636 | #define WM8996_IM_FLL_SW_CLK_DONE_EINT_WIDTH 1 /* IM_FLL_SW_CLK_DONE_EINT */ | ||
3637 | #define WM8996_IM_FLL_LOCK_EINT 0x0004 /* IM_FLL_LOCK_EINT */ | ||
3638 | #define WM8996_IM_FLL_LOCK_EINT_MASK 0x0004 /* IM_FLL_LOCK_EINT */ | ||
3639 | #define WM8996_IM_FLL_LOCK_EINT_SHIFT 2 /* IM_FLL_LOCK_EINT */ | ||
3640 | #define WM8996_IM_FLL_LOCK_EINT_WIDTH 1 /* IM_FLL_LOCK_EINT */ | ||
3641 | #define WM8996_IM_HP_DONE_EINT 0x0002 /* IM_HP_DONE_EINT */ | ||
3642 | #define WM8996_IM_HP_DONE_EINT_MASK 0x0002 /* IM_HP_DONE_EINT */ | ||
3643 | #define WM8996_IM_HP_DONE_EINT_SHIFT 1 /* IM_HP_DONE_EINT */ | ||
3644 | #define WM8996_IM_HP_DONE_EINT_WIDTH 1 /* IM_HP_DONE_EINT */ | ||
3645 | #define WM8996_IM_MICD_EINT 0x0001 /* IM_MICD_EINT */ | ||
3646 | #define WM8996_IM_MICD_EINT_MASK 0x0001 /* IM_MICD_EINT */ | ||
3647 | #define WM8996_IM_MICD_EINT_SHIFT 0 /* IM_MICD_EINT */ | ||
3648 | #define WM8996_IM_MICD_EINT_WIDTH 1 /* IM_MICD_EINT */ | ||
3649 | |||
3650 | /* | ||
3651 | * R1856 (0x740) - Interrupt Control | ||
3652 | */ | ||
3653 | #define WM8996_IM_IRQ 0x0001 /* IM_IRQ */ | ||
3654 | #define WM8996_IM_IRQ_MASK 0x0001 /* IM_IRQ */ | ||
3655 | #define WM8996_IM_IRQ_SHIFT 0 /* IM_IRQ */ | ||
3656 | #define WM8996_IM_IRQ_WIDTH 1 /* IM_IRQ */ | ||
3657 | |||
3658 | /* | ||
3659 | * R2048 (0x800) - Left PDM Speaker | ||
3660 | */ | ||
3661 | #define WM8996_SPKL_ENA 0x0010 /* SPKL_ENA */ | ||
3662 | #define WM8996_SPKL_ENA_MASK 0x0010 /* SPKL_ENA */ | ||
3663 | #define WM8996_SPKL_ENA_SHIFT 4 /* SPKL_ENA */ | ||
3664 | #define WM8996_SPKL_ENA_WIDTH 1 /* SPKL_ENA */ | ||
3665 | #define WM8996_SPKL_MUTE 0x0008 /* SPKL_MUTE */ | ||
3666 | #define WM8996_SPKL_MUTE_MASK 0x0008 /* SPKL_MUTE */ | ||
3667 | #define WM8996_SPKL_MUTE_SHIFT 3 /* SPKL_MUTE */ | ||
3668 | #define WM8996_SPKL_MUTE_WIDTH 1 /* SPKL_MUTE */ | ||
3669 | #define WM8996_SPKL_MUTE_ZC 0x0004 /* SPKL_MUTE_ZC */ | ||
3670 | #define WM8996_SPKL_MUTE_ZC_MASK 0x0004 /* SPKL_MUTE_ZC */ | ||
3671 | #define WM8996_SPKL_MUTE_ZC_SHIFT 2 /* SPKL_MUTE_ZC */ | ||
3672 | #define WM8996_SPKL_MUTE_ZC_WIDTH 1 /* SPKL_MUTE_ZC */ | ||
3673 | #define WM8996_SPKL_SRC_MASK 0x0003 /* SPKL_SRC - [1:0] */ | ||
3674 | #define WM8996_SPKL_SRC_SHIFT 0 /* SPKL_SRC - [1:0] */ | ||
3675 | #define WM8996_SPKL_SRC_WIDTH 2 /* SPKL_SRC - [1:0] */ | ||
3676 | |||
3677 | /* | ||
3678 | * R2049 (0x801) - Right PDM Speaker | ||
3679 | */ | ||
3680 | #define WM8996_SPKR_ENA 0x0010 /* SPKR_ENA */ | ||
3681 | #define WM8996_SPKR_ENA_MASK 0x0010 /* SPKR_ENA */ | ||
3682 | #define WM8996_SPKR_ENA_SHIFT 4 /* SPKR_ENA */ | ||
3683 | #define WM8996_SPKR_ENA_WIDTH 1 /* SPKR_ENA */ | ||
3684 | #define WM8996_SPKR_MUTE 0x0008 /* SPKR_MUTE */ | ||
3685 | #define WM8996_SPKR_MUTE_MASK 0x0008 /* SPKR_MUTE */ | ||
3686 | #define WM8996_SPKR_MUTE_SHIFT 3 /* SPKR_MUTE */ | ||
3687 | #define WM8996_SPKR_MUTE_WIDTH 1 /* SPKR_MUTE */ | ||
3688 | #define WM8996_SPKR_MUTE_ZC 0x0004 /* SPKR_MUTE_ZC */ | ||
3689 | #define WM8996_SPKR_MUTE_ZC_MASK 0x0004 /* SPKR_MUTE_ZC */ | ||
3690 | #define WM8996_SPKR_MUTE_ZC_SHIFT 2 /* SPKR_MUTE_ZC */ | ||
3691 | #define WM8996_SPKR_MUTE_ZC_WIDTH 1 /* SPKR_MUTE_ZC */ | ||
3692 | #define WM8996_SPKR_SRC_MASK 0x0003 /* SPKR_SRC - [1:0] */ | ||
3693 | #define WM8996_SPKR_SRC_SHIFT 0 /* SPKR_SRC - [1:0] */ | ||
3694 | #define WM8996_SPKR_SRC_WIDTH 2 /* SPKR_SRC - [1:0] */ | ||
3695 | |||
3696 | /* | ||
3697 | * R2050 (0x802) - PDM Speaker Mute Sequence | ||
3698 | */ | ||
3699 | #define WM8996_SPK_MUTE_ENDIAN 0x0100 /* SPK_MUTE_ENDIAN */ | ||
3700 | #define WM8996_SPK_MUTE_ENDIAN_MASK 0x0100 /* SPK_MUTE_ENDIAN */ | ||
3701 | #define WM8996_SPK_MUTE_ENDIAN_SHIFT 8 /* SPK_MUTE_ENDIAN */ | ||
3702 | #define WM8996_SPK_MUTE_ENDIAN_WIDTH 1 /* SPK_MUTE_ENDIAN */ | ||
3703 | #define WM8996_SPK_MUTE_SEQ1_MASK 0x00FF /* SPK_MUTE_SEQ1 - [7:0] */ | ||
3704 | #define WM8996_SPK_MUTE_SEQ1_SHIFT 0 /* SPK_MUTE_SEQ1 - [7:0] */ | ||
3705 | #define WM8996_SPK_MUTE_SEQ1_WIDTH 8 /* SPK_MUTE_SEQ1 - [7:0] */ | ||
3706 | |||
3707 | /* | ||
3708 | * R2051 (0x803) - PDM Speaker Volume | ||
3709 | */ | ||
3710 | #define WM8996_SPKR_VOL_MASK 0x00F0 /* SPKR_VOL - [7:4] */ | ||
3711 | #define WM8996_SPKR_VOL_SHIFT 4 /* SPKR_VOL - [7:4] */ | ||
3712 | #define WM8996_SPKR_VOL_WIDTH 4 /* SPKR_VOL - [7:4] */ | ||
3713 | #define WM8996_SPKL_VOL_MASK 0x000F /* SPKL_VOL - [3:0] */ | ||
3714 | #define WM8996_SPKL_VOL_SHIFT 0 /* SPKL_VOL - [3:0] */ | ||
3715 | #define WM8996_SPKL_VOL_WIDTH 4 /* SPKL_VOL - [3:0] */ | ||
3716 | |||
3717 | #endif | ||
diff --git a/sound/soc/codecs/wm_hubs.c b/sound/soc/codecs/wm_hubs.c index 4cc2d567f22f..e763c54c55dc 100644 --- a/sound/soc/codecs/wm_hubs.c +++ b/sound/soc/codecs/wm_hubs.c | |||
@@ -440,9 +440,8 @@ static int hp_event(struct snd_soc_dapm_widget *w, | |||
440 | reg |= WM8993_HPOUT1L_DLY | WM8993_HPOUT1R_DLY; | 440 | reg |= WM8993_HPOUT1L_DLY | WM8993_HPOUT1R_DLY; |
441 | snd_soc_write(codec, WM8993_ANALOGUE_HP_0, reg); | 441 | snd_soc_write(codec, WM8993_ANALOGUE_HP_0, reg); |
442 | 442 | ||
443 | /* Smallest supported update interval */ | ||
444 | snd_soc_update_bits(codec, WM8993_DC_SERVO_1, | 443 | snd_soc_update_bits(codec, WM8993_DC_SERVO_1, |
445 | WM8993_DCS_TIMER_PERIOD_01_MASK, 1); | 444 | WM8993_DCS_TIMER_PERIOD_01_MASK, 0); |
446 | 445 | ||
447 | calibrate_dc_servo(codec); | 446 | calibrate_dc_servo(codec); |
448 | 447 | ||
diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig index 54b0e4b7faf7..b99091fc34eb 100644 --- a/sound/soc/samsung/Kconfig +++ b/sound/soc/samsung/Kconfig | |||
@@ -183,7 +183,7 @@ config SND_SOC_SPEYSIDE | |||
183 | tristate "Audio support for Wolfson Speyside" | 183 | tristate "Audio support for Wolfson Speyside" |
184 | depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410 | 184 | depends on SND_SOC_SAMSUNG && MACH_WLF_CRAGG_6410 |
185 | select SND_SAMSUNG_I2S | 185 | select SND_SAMSUNG_I2S |
186 | select SND_SOC_WM8915 | 186 | select SND_SOC_WM8996 |
187 | select SND_SOC_WM9081 | 187 | select SND_SOC_WM9081 |
188 | 188 | ||
189 | config SND_SOC_SPEYSIDE_WM8962 | 189 | config SND_SOC_SPEYSIDE_WM8962 |
diff --git a/sound/soc/samsung/speyside.c b/sound/soc/samsung/speyside.c index d6dee4d02036..590e9274b062 100644 --- a/sound/soc/samsung/speyside.c +++ b/sound/soc/samsung/speyside.c | |||
@@ -14,10 +14,10 @@ | |||
14 | #include <sound/jack.h> | 14 | #include <sound/jack.h> |
15 | #include <linux/gpio.h> | 15 | #include <linux/gpio.h> |
16 | 16 | ||
17 | #include "../codecs/wm8915.h" | 17 | #include "../codecs/wm8996.h" |
18 | #include "../codecs/wm9081.h" | 18 | #include "../codecs/wm9081.h" |
19 | 19 | ||
20 | #define WM8915_HPSEL_GPIO 214 | 20 | #define WM8996_HPSEL_GPIO 214 |
21 | 21 | ||
22 | static int speyside_set_bias_level(struct snd_soc_card *card, | 22 | static int speyside_set_bias_level(struct snd_soc_card *card, |
23 | struct snd_soc_dapm_context *dapm, | 23 | struct snd_soc_dapm_context *dapm, |
@@ -31,12 +31,12 @@ static int speyside_set_bias_level(struct snd_soc_card *card, | |||
31 | 31 | ||
32 | switch (level) { | 32 | switch (level) { |
33 | case SND_SOC_BIAS_STANDBY: | 33 | case SND_SOC_BIAS_STANDBY: |
34 | ret = snd_soc_dai_set_sysclk(codec_dai, WM8915_SYSCLK_MCLK2, | 34 | ret = snd_soc_dai_set_sysclk(codec_dai, WM8996_SYSCLK_MCLK2, |
35 | 32768, SND_SOC_CLOCK_IN); | 35 | 32768, SND_SOC_CLOCK_IN); |
36 | if (ret < 0) | 36 | if (ret < 0) |
37 | return ret; | 37 | return ret; |
38 | 38 | ||
39 | ret = snd_soc_dai_set_pll(codec_dai, WM8915_FLL_MCLK2, | 39 | ret = snd_soc_dai_set_pll(codec_dai, WM8996_FLL_MCLK2, |
40 | 0, 0, 0); | 40 | 0, 0, 0); |
41 | if (ret < 0) { | 41 | if (ret < 0) { |
42 | pr_err("Failed to stop FLL\n"); | 42 | pr_err("Failed to stop FLL\n"); |
@@ -65,7 +65,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card, | |||
65 | case SND_SOC_BIAS_PREPARE: | 65 | case SND_SOC_BIAS_PREPARE: |
66 | if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) { | 66 | if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) { |
67 | ret = snd_soc_dai_set_pll(codec_dai, 0, | 67 | ret = snd_soc_dai_set_pll(codec_dai, 0, |
68 | WM8915_FLL_MCLK2, | 68 | WM8996_FLL_MCLK2, |
69 | 32768, 48000 * 256); | 69 | 32768, 48000 * 256); |
70 | if (ret < 0) { | 70 | if (ret < 0) { |
71 | pr_err("Failed to start FLL\n"); | 71 | pr_err("Failed to start FLL\n"); |
@@ -73,7 +73,7 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card, | |||
73 | } | 73 | } |
74 | 74 | ||
75 | ret = snd_soc_dai_set_sysclk(codec_dai, | 75 | ret = snd_soc_dai_set_sysclk(codec_dai, |
76 | WM8915_SYSCLK_FLL, | 76 | WM8996_SYSCLK_FLL, |
77 | 48000 * 256, | 77 | 48000 * 256, |
78 | SND_SOC_CLOCK_IN); | 78 | SND_SOC_CLOCK_IN); |
79 | if (ret < 0) | 79 | if (ret < 0) |
@@ -149,26 +149,26 @@ static void speyside_set_polarity(struct snd_soc_codec *codec, | |||
149 | int polarity) | 149 | int polarity) |
150 | { | 150 | { |
151 | speyside_jack_polarity = !polarity; | 151 | speyside_jack_polarity = !polarity; |
152 | gpio_direction_output(WM8915_HPSEL_GPIO, speyside_jack_polarity); | 152 | gpio_direction_output(WM8996_HPSEL_GPIO, speyside_jack_polarity); |
153 | 153 | ||
154 | /* Re-run DAPM to make sure we're using the correct mic bias */ | 154 | /* Re-run DAPM to make sure we're using the correct mic bias */ |
155 | snd_soc_dapm_sync(&codec->dapm); | 155 | snd_soc_dapm_sync(&codec->dapm); |
156 | } | 156 | } |
157 | 157 | ||
158 | static int speyside_wm8915_init(struct snd_soc_pcm_runtime *rtd) | 158 | static int speyside_wm8996_init(struct snd_soc_pcm_runtime *rtd) |
159 | { | 159 | { |
160 | struct snd_soc_dai *dai = rtd->codec_dai; | 160 | struct snd_soc_dai *dai = rtd->codec_dai; |
161 | struct snd_soc_codec *codec = rtd->codec; | 161 | struct snd_soc_codec *codec = rtd->codec; |
162 | int ret; | 162 | int ret; |
163 | 163 | ||
164 | ret = snd_soc_dai_set_sysclk(dai, WM8915_SYSCLK_MCLK2, 32768, 0); | 164 | ret = snd_soc_dai_set_sysclk(dai, WM8996_SYSCLK_MCLK2, 32768, 0); |
165 | if (ret < 0) | 165 | if (ret < 0) |
166 | return ret; | 166 | return ret; |
167 | 167 | ||
168 | ret = gpio_request(WM8915_HPSEL_GPIO, "HP_SEL"); | 168 | ret = gpio_request(WM8996_HPSEL_GPIO, "HP_SEL"); |
169 | if (ret != 0) | 169 | if (ret != 0) |
170 | pr_err("Failed to request HP_SEL GPIO: %d\n", ret); | 170 | pr_err("Failed to request HP_SEL GPIO: %d\n", ret); |
171 | gpio_direction_output(WM8915_HPSEL_GPIO, speyside_jack_polarity); | 171 | gpio_direction_output(WM8996_HPSEL_GPIO, speyside_jack_polarity); |
172 | 172 | ||
173 | ret = snd_soc_jack_new(codec, "Headset", | 173 | ret = snd_soc_jack_new(codec, "Headset", |
174 | SND_JACK_HEADSET | SND_JACK_BTN_0, | 174 | SND_JACK_HEADSET | SND_JACK_BTN_0, |
@@ -182,7 +182,7 @@ static int speyside_wm8915_init(struct snd_soc_pcm_runtime *rtd) | |||
182 | if (ret) | 182 | if (ret) |
183 | return ret; | 183 | return ret; |
184 | 184 | ||
185 | wm8915_detect(codec, &speyside_headset, speyside_set_polarity); | 185 | wm8996_detect(codec, &speyside_headset, speyside_set_polarity); |
186 | 186 | ||
187 | return 0; | 187 | return 0; |
188 | } | 188 | } |
@@ -205,16 +205,16 @@ static struct snd_soc_dai_link speyside_dai[] = { | |||
205 | .name = "CPU", | 205 | .name = "CPU", |
206 | .stream_name = "CPU", | 206 | .stream_name = "CPU", |
207 | .cpu_dai_name = "samsung-i2s.0", | 207 | .cpu_dai_name = "samsung-i2s.0", |
208 | .codec_dai_name = "wm8915-aif1", | 208 | .codec_dai_name = "wm8996-aif1", |
209 | .platform_name = "samsung-audio", | 209 | .platform_name = "samsung-audio", |
210 | .codec_name = "wm8915.1-001a", | 210 | .codec_name = "wm8996.1-001a", |
211 | .init = speyside_wm8915_init, | 211 | .init = speyside_wm8996_init, |
212 | .ops = &speyside_ops, | 212 | .ops = &speyside_ops, |
213 | }, | 213 | }, |
214 | { | 214 | { |
215 | .name = "Baseband", | 215 | .name = "Baseband", |
216 | .stream_name = "Baseband", | 216 | .stream_name = "Baseband", |
217 | .cpu_dai_name = "wm8915-aif2", | 217 | .cpu_dai_name = "wm8996-aif2", |
218 | .codec_dai_name = "wm1250-ev1", | 218 | .codec_dai_name = "wm1250-ev1", |
219 | .codec_name = "wm1250-ev1.1-0027", | 219 | .codec_name = "wm1250-ev1.1-0027", |
220 | .ops = &speyside_ops, | 220 | .ops = &speyside_ops, |
diff --git a/sound/usb/caiaq/input.c b/sound/usb/caiaq/input.c index 4432ef7a70a9..a213813487bd 100644 --- a/sound/usb/caiaq/input.c +++ b/sound/usb/caiaq/input.c | |||
@@ -30,7 +30,7 @@ static unsigned short keycode_ak1[] = { KEY_C, KEY_B, KEY_A }; | |||
30 | static unsigned short keycode_rk2[] = { KEY_1, KEY_2, KEY_3, KEY_4, | 30 | static unsigned short keycode_rk2[] = { KEY_1, KEY_2, KEY_3, KEY_4, |
31 | KEY_5, KEY_6, KEY_7 }; | 31 | KEY_5, KEY_6, KEY_7 }; |
32 | static unsigned short keycode_rk3[] = { KEY_1, KEY_2, KEY_3, KEY_4, | 32 | static unsigned short keycode_rk3[] = { KEY_1, KEY_2, KEY_3, KEY_4, |
33 | KEY_5, KEY_6, KEY_7, KEY_5, KEY_6 }; | 33 | KEY_5, KEY_6, KEY_7, KEY_8, KEY_9 }; |
34 | 34 | ||
35 | static unsigned short keycode_kore[] = { | 35 | static unsigned short keycode_kore[] = { |
36 | KEY_FN_F1, /* "menu" */ | 36 | KEY_FN_F1, /* "menu" */ |
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 7c0d21ecd821..7d46e482375d 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c | |||
@@ -352,7 +352,7 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) | |||
352 | continue; | 352 | continue; |
353 | } | 353 | } |
354 | if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8)) || | 354 | if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8)) || |
355 | ((protocol == UAC_VERSION_2) && (fmt->bLength != 6))) { | 355 | ((protocol == UAC_VERSION_2) && (fmt->bLength < 6))) { |
356 | snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n", | 356 | snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n", |
357 | dev->devnum, iface_no, altno); | 357 | dev->devnum, iface_no, altno); |
358 | continue; | 358 | continue; |
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index c22fa76e363a..c04d7c71ac88 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
@@ -1191,6 +1191,11 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void | |||
1191 | 1191 | ||
1192 | if (state->mixer->protocol == UAC_VERSION_1) { | 1192 | if (state->mixer->protocol == UAC_VERSION_1) { |
1193 | csize = hdr->bControlSize; | 1193 | csize = hdr->bControlSize; |
1194 | if (!csize) { | ||
1195 | snd_printdd(KERN_ERR "usbaudio: unit %u: " | ||
1196 | "invalid bControlSize == 0\n", unitid); | ||
1197 | return -EINVAL; | ||
1198 | } | ||
1194 | channels = (hdr->bLength - 7) / csize - 1; | 1199 | channels = (hdr->bLength - 7) / csize - 1; |
1195 | bmaControls = hdr->bmaControls; | 1200 | bmaControls = hdr->bmaControls; |
1196 | } else { | 1201 | } else { |
@@ -1934,15 +1939,13 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) | |||
1934 | struct mixer_build state; | 1939 | struct mixer_build state; |
1935 | int err; | 1940 | int err; |
1936 | const struct usbmix_ctl_map *map; | 1941 | const struct usbmix_ctl_map *map; |
1937 | struct usb_host_interface *hostif; | ||
1938 | void *p; | 1942 | void *p; |
1939 | 1943 | ||
1940 | hostif = mixer->chip->ctrl_intf; | ||
1941 | memset(&state, 0, sizeof(state)); | 1944 | memset(&state, 0, sizeof(state)); |
1942 | state.chip = mixer->chip; | 1945 | state.chip = mixer->chip; |
1943 | state.mixer = mixer; | 1946 | state.mixer = mixer; |
1944 | state.buffer = hostif->extra; | 1947 | state.buffer = mixer->hostif->extra; |
1945 | state.buflen = hostif->extralen; | 1948 | state.buflen = mixer->hostif->extralen; |
1946 | 1949 | ||
1947 | /* check the mapping table */ | 1950 | /* check the mapping table */ |
1948 | for (map = usbmix_ctl_maps; map->id; map++) { | 1951 | for (map = usbmix_ctl_maps; map->id; map++) { |
@@ -1955,7 +1958,8 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) | |||
1955 | } | 1958 | } |
1956 | 1959 | ||
1957 | p = NULL; | 1960 | p = NULL; |
1958 | while ((p = snd_usb_find_csint_desc(hostif->extra, hostif->extralen, p, UAC_OUTPUT_TERMINAL)) != NULL) { | 1961 | while ((p = snd_usb_find_csint_desc(mixer->hostif->extra, mixer->hostif->extralen, |
1962 | p, UAC_OUTPUT_TERMINAL)) != NULL) { | ||
1959 | if (mixer->protocol == UAC_VERSION_1) { | 1963 | if (mixer->protocol == UAC_VERSION_1) { |
1960 | struct uac1_output_terminal_descriptor *desc = p; | 1964 | struct uac1_output_terminal_descriptor *desc = p; |
1961 | 1965 | ||
@@ -2162,17 +2166,15 @@ int snd_usb_mixer_activate(struct usb_mixer_interface *mixer) | |||
2162 | /* create the handler for the optional status interrupt endpoint */ | 2166 | /* create the handler for the optional status interrupt endpoint */ |
2163 | static int snd_usb_mixer_status_create(struct usb_mixer_interface *mixer) | 2167 | static int snd_usb_mixer_status_create(struct usb_mixer_interface *mixer) |
2164 | { | 2168 | { |
2165 | struct usb_host_interface *hostif; | ||
2166 | struct usb_endpoint_descriptor *ep; | 2169 | struct usb_endpoint_descriptor *ep; |
2167 | void *transfer_buffer; | 2170 | void *transfer_buffer; |
2168 | int buffer_length; | 2171 | int buffer_length; |
2169 | unsigned int epnum; | 2172 | unsigned int epnum; |
2170 | 2173 | ||
2171 | hostif = mixer->chip->ctrl_intf; | ||
2172 | /* we need one interrupt input endpoint */ | 2174 | /* we need one interrupt input endpoint */ |
2173 | if (get_iface_desc(hostif)->bNumEndpoints < 1) | 2175 | if (get_iface_desc(mixer->hostif)->bNumEndpoints < 1) |
2174 | return 0; | 2176 | return 0; |
2175 | ep = get_endpoint(hostif, 0); | 2177 | ep = get_endpoint(mixer->hostif, 0); |
2176 | if (!usb_endpoint_dir_in(ep) || !usb_endpoint_xfer_int(ep)) | 2178 | if (!usb_endpoint_dir_in(ep) || !usb_endpoint_xfer_int(ep)) |
2177 | return 0; | 2179 | return 0; |
2178 | 2180 | ||
@@ -2202,7 +2204,6 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, | |||
2202 | }; | 2204 | }; |
2203 | struct usb_mixer_interface *mixer; | 2205 | struct usb_mixer_interface *mixer; |
2204 | struct snd_info_entry *entry; | 2206 | struct snd_info_entry *entry; |
2205 | struct usb_host_interface *host_iface; | ||
2206 | int err; | 2207 | int err; |
2207 | 2208 | ||
2208 | strcpy(chip->card->mixername, "USB Mixer"); | 2209 | strcpy(chip->card->mixername, "USB Mixer"); |
@@ -2219,8 +2220,8 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, | |||
2219 | return -ENOMEM; | 2220 | return -ENOMEM; |
2220 | } | 2221 | } |
2221 | 2222 | ||
2222 | host_iface = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0]; | 2223 | mixer->hostif = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0]; |
2223 | switch (get_iface_desc(host_iface)->bInterfaceProtocol) { | 2224 | switch (get_iface_desc(mixer->hostif)->bInterfaceProtocol) { |
2224 | case UAC_VERSION_1: | 2225 | case UAC_VERSION_1: |
2225 | default: | 2226 | default: |
2226 | mixer->protocol = UAC_VERSION_1; | 2227 | mixer->protocol = UAC_VERSION_1; |
diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h index ae1a14dcfe82..81b2d8a32fb0 100644 --- a/sound/usb/mixer.h +++ b/sound/usb/mixer.h | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | struct usb_mixer_interface { | 4 | struct usb_mixer_interface { |
5 | struct snd_usb_audio *chip; | 5 | struct snd_usb_audio *chip; |
6 | struct usb_host_interface *hostif; | ||
6 | struct list_head list; | 7 | struct list_head list; |
7 | unsigned int ignore_ctl_error; | 8 | unsigned int ignore_ctl_error; |
8 | struct urb *urb; | 9 | struct urb *urb; |
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index dba0b7f11c54..4d4f86552a23 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h | |||
@@ -2417,6 +2417,12 @@ YAMAHA_DEVICE(0x7010, "UB99"), | |||
2417 | .idProduct = 0x1020, | 2417 | .idProduct = 0x1020, |
2418 | }, | 2418 | }, |
2419 | 2419 | ||
2420 | /* KeithMcMillen Stringport */ | ||
2421 | { | ||
2422 | USB_DEVICE(0x1f38, 0x0001), | ||
2423 | .bInterfaceClass = USB_CLASS_AUDIO, | ||
2424 | }, | ||
2425 | |||
2420 | /* Miditech devices */ | 2426 | /* Miditech devices */ |
2421 | { | 2427 | { |
2422 | USB_DEVICE(0x4752, 0x0011), | 2428 | USB_DEVICE(0x4752, 0x0011), |
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 77762c99afbe..81e07d842581 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c | |||
@@ -426,7 +426,7 @@ static int snd_usb_cm106_boot_quirk(struct usb_device *dev) | |||
426 | */ | 426 | */ |
427 | static int snd_usb_cm6206_boot_quirk(struct usb_device *dev) | 427 | static int snd_usb_cm6206_boot_quirk(struct usb_device *dev) |
428 | { | 428 | { |
429 | int err, reg; | 429 | int err = 0, reg; |
430 | int val[] = {0x2004, 0x3000, 0xf800, 0x143f, 0x0000, 0x3000}; | 430 | int val[] = {0x2004, 0x3000, 0xf800, 0x143f, 0x0000, 0x3000}; |
431 | 431 | ||
432 | for (reg = 0; reg < ARRAY_SIZE(val); reg++) { | 432 | for (reg = 0; reg < ARRAY_SIZE(val); reg++) { |